@pellux/goodvibes-agent 1.0.27 → 1.0.29

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,18 @@
2
2
 
3
3
  Product-facing release notes for GoodVibes Agent.
4
4
 
5
+ ## 1.0.29 - 2026-06-03
6
+
7
+ - Add preferred model-route metadata to every built-in slash command policy so command inspection always tells the model which Agent-owned route to use.
8
+ - Add preferred route metadata to every supported top-level CLI mirror, including current-conversation handling for non-interactive run mirrors.
9
+ - Refresh 1.0.x package docs and focused harness coverage for exhaustive command and CLI preferred-route metadata.
10
+
11
+ ## 1.0.28 - 2026-06-03
12
+
13
+ - Expose modelExecution metadata for every Agent workspace editor action, including local-registry, command-backed, direct local-create, profile, and prompt-returning editor flows.
14
+ - Return editor execution-route metadata in workspace action handoffs so the model can complete forms without guessing the bridge.
15
+ - Refresh 1.0.x package docs and focused harness coverage for workspace editor execution parity.
16
+
5
17
  ## 1.0.27 - 2026-06-03
6
18
 
7
19
  - Classify every built-in slash command with concrete model-visible effect and boundary policy metadata instead of generic unknown policy fallback.
package/README.md CHANGED
@@ -7,7 +7,7 @@ GoodVibes Agent is the personal operator assistant TUI for GoodVibes. It is buil
7
7
 
8
8
  The Agent product connects to a GoodVibes host owned outside this package. It does not install, start, stop, restart, or own that host.
9
9
 
10
- Most work happens in the interactive TUI. The installed CLI exists to launch that TUI and provide scriptable mirrors for workflows that are already reachable from the workspace. The main Agent model can inspect the same harness surface through Agent-owned tools: workspace actions and single-action lookup, built-in panels and single-panel lookup, modal/overlay/picker UI surfaces and single-surface lookup, named operator surfaces, top-level CLI mirrors and single-mirror lookup, fixed shortcuts, configurable keybindings, single-keybinding lookup, shell-safe keybinding execution, slash commands, single-command lookup with policy metadata, settings and single-setting lookup, model tools and individual model tool schemas, local registries, connected-host capability boundaries, and live connected-host readiness are all discoverable from the conversation without exposing connected-host lifecycle control.
10
+ Most work happens in the interactive TUI. The installed CLI exists to launch that TUI and provide scriptable mirrors for workflows that are already reachable from the workspace. The main Agent model can inspect the same harness surface through Agent-owned tools: workspace actions and single-action lookup, built-in panels and single-panel lookup, modal/overlay/picker UI surfaces and single-surface lookup, named operator surfaces, top-level CLI mirrors and single-mirror lookup with preferred model routes, fixed shortcuts, configurable keybindings, single-keybinding lookup, shell-safe keybinding execution, slash commands, single-command lookup with effect, boundary, and preferred-route policy metadata, settings and single-setting lookup, model tools and individual model tool schemas, local registries, connected-host capability boundaries, and live connected-host readiness are all discoverable from the conversation without exposing connected-host lifecycle control.
11
11
 
12
12
  ## Install
13
13
 
@@ -66,7 +66,7 @@ Use the workspace as the primary product surface:
66
66
 
67
67
  Inside the Agent workspace, press `/` to search every workspace action by name, category, command, or detail. This is the primary discovery path for product actions; slash commands and CLI subcommands remain power-user/scriptable mirrors.
68
68
 
69
- The model has the same harness map through `agent_harness`: it can list Agent workspace actions, inspect or run one workspace action by `actionId`, `command`, `target`, or `query`, list built-in panels and inspect one panel by `panelId`, `target`, or `query`, inspect modal/overlay/picker UI surfaces by `surfaceId`, `target`, or `query`, list top-level CLI mirrors and inspect one mirror by `cliCommand`, `command`, `commandName`, `target`, or `query`, inspect fixed shortcuts and configurable keybindings by `actionId`, `target`, `key`, or `query`, run shell-safe keybinding equivalents with confirmation, list slash commands, inspect or run one slash command by `command`, `commandName`, `target`, or `query` with parsed arguments and concrete built-in effect/boundary policy metadata, inspect model tool definitions or one model tool schema, inspect or change Agent settings by `key`, `target`, or `query` with confirmation, and report connected-host capability and live readiness posture. CLI mirror modes are read-only catalog and parser inspection; inside the main conversation, the model uses the returned preferred model tool, workspace action, setting mode, or confirmed slash-command mirror instead of launching hidden nested CLI processes. Panel modes expose catalog/open state and route visible panel/workspace changes through the current Agent shell bridge with confirmation. UI surface modes expose help, shortcuts, command browser, conversation search, prompt-history search, slash-command mode, file picker, block actions, context, runtime activity, live process output, bookmarks, model/provider/reasoning-effort pickers, TTS provider/voice pickers, session/profile pickers, the panel-picker compatibility route, security/knowledge/subscription operator surfaces, settings, MCP workspace, onboarding, and Agent workspace entrypoints; `open_ui_surface` is confirmation-gated and only performs visible shell navigation. Shortcut modes expose fixed runtime/editor controls plus the live resolved keybinding table; each keybinding descriptor reports its model operation route, `run_keybinding` executes only supported shell-safe equivalents with confirmation, and prompt-editor-only or terminal-selection shortcuts remain explicit direct user interaction. `set_keybinding` and `reset_keybinding` write the same `keybindings.json` file the user edits and require confirmation. Workspace action discovery can inline editor field schemas with `includeParameters:true`; single-action lookup and execution use the same user-facing search fields, return or preserve lookup metadata where the action result carries descriptors, and refuse ambiguous run requests with candidates; CLI mirror, panel, UI surface, keybinding, slash-command, model tool, setting, and connected-host capability lookup use their catalog search fields and refuse ambiguous route, schema, capability, or mutation requests with candidates; confirmed slash-command execution uses the same slash-command lookup and refuses ambiguous requests before any handler runs; profile editors use the current starter-template inventory, and routine schedule editors can prefill a selected local routine from `recordId`. Selection-based local workspace actions accept a local `recordId` so the model can use the same note promotion and local registry flows as the TUI. Direct local create editors for memory, notes, personas, skills, and routines can execute from submitted fields through `run_workspace_action` and `agent_local_registry` with confirmation. The `connected_host` report includes route families, allowed capabilities, blocked lifecycle/non-Agent surfaces, and availability for the first-class Agent tools; `connected_host_capability` inspects one allowed or blocked capability by id, target, or query with its route families and boundary. The `connected_host_status` report performs a read-only live check of the connected-host status route and the isolated Agent Knowledge status route, reports SDK compatibility, token posture, endpoint bindings, route readiness, and actionable findings, and still refuses connected-host lifecycle control. The model uses those first-class tools for product workflows where they exist, such as Agent Knowledge, local memory/notes/personas/skills/routines, channel sends, notifications, reminders, media generation, work plans, and connected-host operator actions.
69
+ The model has the same harness map through `agent_harness`: it can list Agent workspace actions, inspect or run one workspace action by `actionId`, `command`, `target`, or `query`, list built-in panels and inspect one panel by `panelId`, `target`, or `query`, inspect modal/overlay/picker UI surfaces by `surfaceId`, `target`, or `query`, list top-level CLI mirrors and inspect one mirror by `cliCommand`, `command`, `commandName`, `target`, or `query`, inspect fixed shortcuts and configurable keybindings by `actionId`, `target`, `key`, or `query`, run shell-safe keybinding equivalents with confirmation, list slash commands, inspect or run one slash command by `command`, `commandName`, `target`, or `query` with parsed arguments and concrete built-in effect, boundary, and preferred-route policy metadata, inspect model tool definitions or one model tool schema, inspect or change Agent settings by `key`, `target`, or `query` with confirmation, and report connected-host capability and live readiness posture. CLI mirror modes are read-only catalog and parser inspection, and every supported top-level mirror reports the preferred in-process model route or current-conversation route; inside the main conversation, the model uses that returned route instead of launching hidden nested CLI processes. Panel modes expose catalog/open state and route visible panel/workspace changes through the current Agent shell bridge with confirmation. UI surface modes expose help, shortcuts, command browser, conversation search, prompt-history search, slash-command mode, file picker, block actions, context, runtime activity, live process output, bookmarks, model/provider/reasoning-effort pickers, TTS provider/voice pickers, session/profile pickers, the panel-picker compatibility route, security/knowledge/subscription operator surfaces, settings, MCP workspace, onboarding, and Agent workspace entrypoints; `open_ui_surface` is confirmation-gated and only performs visible shell navigation. Shortcut modes expose fixed runtime/editor controls plus the live resolved keybinding table; each keybinding descriptor reports its model operation route, `run_keybinding` executes only supported shell-safe equivalents with confirmation, and prompt-editor-only or terminal-selection shortcuts remain explicit direct user interaction. `set_keybinding` and `reset_keybinding` write the same `keybindings.json` file the user edits and require confirmation. Workspace action discovery can inline editor field schemas with `includeParameters:true`; every editor action descriptor reports `modelExecution` route metadata for local-registry, slash-command, direct local-create, prompt-returning, or first-class-tool execution; single-action lookup and execution use the same user-facing search fields, return or preserve lookup metadata where the action result carries descriptors, and refuse ambiguous run requests with candidates; CLI mirror, panel, UI surface, keybinding, slash-command, model tool, setting, and connected-host capability lookup use their catalog search fields and refuse ambiguous route, schema, capability, or mutation requests with candidates; confirmed slash-command execution uses the same slash-command lookup and refuses ambiguous requests before any handler runs; profile editors use the current starter-template inventory, and routine schedule editors can prefill a selected local routine from `recordId`. Selection-based local workspace actions accept a local `recordId` so the model can use the same note promotion and local registry flows as the TUI. Direct local create editors for memory, notes, personas, skills, and routines can execute from submitted fields through `run_workspace_action` and `agent_local_registry` with confirmation. Command-backed editor actions execute through the shared slash-command registry with confirmation, while web research/fetch editor actions return the main-conversation prompt for the model to use directly. The `connected_host` report includes route families, allowed capabilities, blocked lifecycle/non-Agent surfaces, and availability for the first-class Agent tools; `connected_host_capability` inspects one allowed or blocked capability by id, target, or query with its route families and boundary. The `connected_host_status` report performs a read-only live check of the connected-host status route and the isolated Agent Knowledge status route, reports SDK compatibility, token posture, endpoint bindings, route readiness, and actionable findings, and still refuses connected-host lifecycle control. The model uses those first-class tools for product workflows where they exist, such as Agent Knowledge, local memory/notes/personas/skills/routines, channel sends, notifications, reminders, media generation, work plans, and connected-host operator actions.
70
70
 
71
71
  The setup workspace surfaces discovered Agent-local persona, skill, and routine markdown files so day-one setup can import useful behavior instead of starting from blank records. It can also create one initial scratchpad note, local persona, skill, and routine directly during first-run setup; those records stay in Agent-local registries and never write to default knowledge or non-Agent segments.
72
72
 
@@ -816566,7 +816566,7 @@ var createStyledCell = (char, overrides = {}) => ({
816566
816566
  // src/version.ts
816567
816567
  import { readFileSync } from "fs";
816568
816568
  import { join } from "path";
816569
- var _version = "1.0.27";
816569
+ var _version = "1.0.29";
816570
816570
  var _sdkVersion = "0.33.35";
816571
816571
  try {
816572
816572
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
@@ -847775,13 +847775,13 @@ init_state3();
847775
847775
 
847776
847776
  // src/input/commands/recall-shared.ts
847777
847777
  var VALID_CLASSES = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
847778
- var VALID_SCOPES2 = ["session", "project", "team"];
847778
+ var VALID_SCOPES = ["session", "project", "team"];
847779
847779
  var VALID_REVIEW_STATES = ["fresh", "reviewed", "stale", "contradicted"];
847780
847780
  function isValidClass(s4) {
847781
847781
  return VALID_CLASSES.includes(s4);
847782
847782
  }
847783
847783
  function isValidScope(s4) {
847784
- return VALID_SCOPES2.includes(s4);
847784
+ return VALID_SCOPES.includes(s4);
847785
847785
  }
847786
847786
  function isValidReviewState(s4) {
847787
847787
  return VALID_REVIEW_STATES.includes(s4);
@@ -847824,7 +847824,7 @@ function handleRecallSearch(args2, context) {
847824
847824
  if (isValidScope(scope))
847825
847825
  filter.scope = scope;
847826
847826
  else {
847827
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
847827
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
847828
847828
  return;
847829
847829
  }
847830
847830
  }
@@ -847999,7 +847999,7 @@ function handleRecallList(args2, context) {
847999
847999
  if (scopeIdx !== -1 && args2[scopeIdx + 1]) {
848000
848000
  const scope = args2[scopeIdx + 1];
848001
848001
  if (!isValidScope(scope)) {
848002
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848002
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
848003
848003
  return;
848004
848004
  }
848005
848005
  filter.scope = scope;
@@ -848049,7 +848049,7 @@ async function handleRecallAdd(args2, context) {
848049
848049
  const tags = tagsRaw ? tagsRaw.split(",").map((token) => token.trim()).filter(Boolean) : [];
848050
848050
  const scope = scopeRaw && isValidScope(scopeRaw) ? scopeRaw : "project";
848051
848051
  if (scopeRaw && !isValidScope(scopeRaw)) {
848052
- context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848052
+ context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES.join(", ")}.`);
848053
848053
  return;
848054
848054
  }
848055
848055
  const provenance = [];
@@ -848183,7 +848183,7 @@ function handleRecallExport(args2, context) {
848183
848183
  if (scopeIdx !== -1 && commandArgs[scopeIdx + 1]) {
848184
848184
  const scope = commandArgs[scopeIdx + 1];
848185
848185
  if (!isValidScope(scope)) {
848186
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848186
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
848187
848187
  return;
848188
848188
  }
848189
848189
  filter.scope = scope;
@@ -848262,7 +848262,7 @@ function handleRecallHandoffExport(args2, context) {
848262
848262
  const scopeIdx = commandArgs.indexOf("--scope");
848263
848263
  const scopeRaw = scopeIdx !== -1 ? commandArgs[scopeIdx + 1] : "team";
848264
848264
  if (!scopeRaw || !isValidScope(scopeRaw)) {
848265
- context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848265
+ context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES.join(", ")}.`);
848266
848266
  return;
848267
848267
  }
848268
848268
  const bundle = memory.exportBundle({ scope: scopeRaw });
@@ -848378,7 +848378,7 @@ function handleRecallPromote(args2, context) {
848378
848378
  const id = parsed.rest[0];
848379
848379
  const scope = parsed.rest[1];
848380
848380
  if (!id || !scope || !isValidScope(scope)) {
848381
- context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES2.join("|")}> --yes`);
848381
+ context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES.join("|")}> --yes`);
848382
848382
  return;
848383
848383
  }
848384
848384
  if (!parsed.yes) {
@@ -862311,7 +862311,7 @@ import { mkdirSync as mkdirSync64, readFileSync as readFileSync86, writeFileSync
862311
862311
  import { dirname as dirname63, resolve as resolve39 } from "path";
862312
862312
  init_state3();
862313
862313
  var VALID_CLASSES2 = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
862314
- var VALID_SCOPES4 = ["session", "project", "team"];
862314
+ var VALID_SCOPES3 = ["session", "project", "team"];
862315
862315
  var VALID_REVIEW_STATES3 = ["fresh", "reviewed", "stale", "contradicted"];
862316
862316
  var VALID_PROVENANCE_KINDS = ["session", "turn", "task", "event", "file"];
862317
862317
  var VALUE_OPTIONS = new Set([
@@ -862411,7 +862411,7 @@ function isMemoryClass2(value) {
862411
862411
  return VALID_CLASSES2.includes(value);
862412
862412
  }
862413
862413
  function isMemoryScope2(value) {
862414
- return VALID_SCOPES4.includes(value);
862414
+ return VALID_SCOPES3.includes(value);
862415
862415
  }
862416
862416
  function isReviewState(value) {
862417
862417
  return VALID_REVIEW_STATES3.includes(value);
@@ -862426,7 +862426,7 @@ function requireClass(value) {
862426
862426
  }
862427
862427
  function requireScope(value) {
862428
862428
  if (!value || !isMemoryScope2(value))
862429
- throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES4.join(", ")}`);
862429
+ throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES3.join(", ")}`);
862430
862430
  return value;
862431
862431
  }
862432
862432
  function optionalScope(value) {
@@ -879576,6 +879576,7 @@ function describeCommandPolicy(commandName) {
879576
879576
  return {
879577
879577
  effect: "delegated-work",
879578
879578
  confirmation,
879579
+ preferredModelTool: "agent_harness workspace_actions/workspace_action/run_workspace_action",
879579
879580
  boundary: "Delegation is explicit user-directed work only; no hidden background review or separate Agent job should be created implicitly."
879580
879581
  };
879581
879582
  }
@@ -879583,6 +879584,7 @@ function describeCommandPolicy(commandName) {
879583
879584
  return {
879584
879585
  effect: "session-lifecycle",
879585
879586
  confirmation,
879587
+ preferredModelTool: "agent_harness commands/command/run_command",
879586
879588
  boundary: "Session and conversation commands operate on the visible harness session lifecycle."
879587
879589
  };
879588
879590
  }
@@ -879590,6 +879592,7 @@ function describeCommandPolicy(commandName) {
879590
879592
  return {
879591
879593
  effect: "local-state",
879592
879594
  confirmation,
879595
+ preferredModelTool: "agent_harness workspace_actions/workspace_action/run_workspace_action or agent_harness run_command",
879593
879596
  boundary: "Conversation export writes a local workspace file and requires an explicit output intent."
879594
879597
  };
879595
879598
  }
@@ -879597,7 +879600,7 @@ function describeCommandPolicy(commandName) {
879597
879600
  return {
879598
879601
  effect: "ui-navigation",
879599
879602
  confirmation,
879600
- preferredModelTool: root === "bookmarks" ? "agent_harness open_ui_surface" : undefined,
879603
+ preferredModelTool: root === "bookmarks" ? "agent_harness open_ui_surface" : "agent_harness run_command",
879601
879604
  boundary: "Conversation display navigation mutates only the visible transcript view or scroll position."
879602
879605
  };
879603
879606
  }
@@ -879673,6 +879676,7 @@ function describeCliCommandPolicy(commandName) {
879673
879676
  return {
879674
879677
  effect: "mixed",
879675
879678
  confirmation,
879679
+ preferredModelTool: "current Agent conversation response; do not invoke hidden nested CLI run",
879676
879680
  boundary: "The CLI run command starts a non-interactive Agent turn from a process entrypoint. Do not create hidden nested turns from agent_harness; answer the user directly in the current conversation."
879677
879681
  };
879678
879682
  }
@@ -879704,6 +879708,7 @@ function describeCliCommandPolicy(commandName) {
879704
879708
  return {
879705
879709
  effect: "delegated-work",
879706
879710
  confirmation,
879711
+ preferredModelTool: "agent_harness workspace_actions/workspace_action/run_workspace_action",
879707
879712
  boundary: "Delegation is explicit user-directed work only; no hidden background review or separate Agent job should be created implicitly."
879708
879713
  };
879709
879714
  }
@@ -879711,6 +879716,7 @@ function describeCliCommandPolicy(commandName) {
879711
879716
  return {
879712
879717
  effect: root === "pair" ? "external-network" : "mixed",
879713
879718
  confirmation,
879719
+ preferredModelTool: root === "pair" ? "agent_harness workspace_actions/workspace_action/run_workspace_action" : "agent_harness settings/get_setting/set_setting/reset_setting or workspace_actions",
879714
879720
  boundary: "Provider subscription, secret, and pairing flows can expose credentials or external account state. Use only explicit user-directed flows and prefer secret refs over raw values."
879715
879721
  };
879716
879722
  }
@@ -882594,6 +882600,75 @@ async function openHarnessUiSurface(context, args2) {
882594
882600
  };
882595
882601
  }
882596
882602
 
882603
+ // src/tools/agent-harness-workspace-editor-execution.ts
882604
+ function localEditorDomain(editorKind) {
882605
+ if (editorKind === "memory" || editorKind === "note" || editorKind === "persona" || editorKind === "skill" || editorKind === "routine")
882606
+ return editorKind;
882607
+ return null;
882608
+ }
882609
+ function localEditorSupportedActions(editorKind) {
882610
+ if (editorKind === "memory")
882611
+ return ["list", "search", "get", "review", "stale", "delete"];
882612
+ if (editorKind === "note")
882613
+ return ["list", "search", "get", "review", "stale", "delete"];
882614
+ if (editorKind === "persona")
882615
+ return ["list", "search", "get", "use", "clear_active", "review", "stale", "delete"];
882616
+ if (editorKind === "skill")
882617
+ return ["list", "search", "get", "enable", "disable", "review", "stale", "delete"];
882618
+ return ["list", "search", "get", "enable", "disable", "start", "review", "stale", "delete"];
882619
+ }
882620
+ function describeWorkspaceEditorModelExecution(editorKind) {
882621
+ const localDomain = localEditorDomain(editorKind);
882622
+ if (localDomain) {
882623
+ return {
882624
+ route: "agent_local_registry",
882625
+ tool: "agent_local_registry",
882626
+ domain: localDomain,
882627
+ action: "create_or_update_from_fields",
882628
+ confirmation: "required",
882629
+ supportedActions: localEditorSupportedActions(localDomain),
882630
+ note: "run_workspace_action validates the editor fields and dispatches through the Agent-local registry without writing default knowledge or non-Agent segments."
882631
+ };
882632
+ }
882633
+ if (editorKind === "learned-behavior") {
882634
+ return {
882635
+ route: "direct-agent-local-create",
882636
+ action: "create_learned_behavior",
882637
+ confirmation: "required",
882638
+ note: "run_workspace_action creates a local skill, routine, or persona from the submitted learned-behavior fields."
882639
+ };
882640
+ }
882641
+ if (editorKind === "profile") {
882642
+ return {
882643
+ route: "slash-command-dispatch",
882644
+ command: "/agent-profile create <name> [--template <template>] --yes",
882645
+ dispatcher: "run_command",
882646
+ confirmation: "required",
882647
+ note: "run_workspace_action builds the matching profile creation slash command from the submitted fields."
882648
+ };
882649
+ }
882650
+ if (editorKind === "web-research" || editorKind === "web-fetch") {
882651
+ return {
882652
+ route: "main-conversation-prompt",
882653
+ result: "prompt",
882654
+ confirmation: "not-required",
882655
+ note: "run_workspace_action returns the main-conversation prompt produced by this editor; use that prompt as the conversation task instead of creating a hidden nested turn."
882656
+ };
882657
+ }
882658
+ if (isAgentWorkspaceCommandEditorKind(editorKind)) {
882659
+ return {
882660
+ route: "slash-command-dispatch",
882661
+ dispatcher: "run_command",
882662
+ confirmation: "required",
882663
+ note: "run_workspace_action builds the same slash-command submission as the TUI form from submitted fields, then executes it through the shared command registry."
882664
+ };
882665
+ }
882666
+ return {
882667
+ route: "model-tool-or-editor-schema",
882668
+ note: "Use the returned editor schema, command field, or first-class Agent model tool when available."
882669
+ };
882670
+ }
882671
+
882597
882672
  // src/tools/agent-harness-tool.ts
882598
882673
  function isMode(value) {
882599
882674
  return typeof value === "string" && AGENT_HARNESS_MODES.includes(value);
@@ -882709,28 +882784,11 @@ function describeWorkspaceAction(category, action2, options = {}) {
882709
882784
  ...action2.kind === "local-selection" || action2.kind === "local-operation" ? {
882710
882785
  modelExecution: describeLocalWorkspaceModelExecution(action2)
882711
882786
  } : {},
882712
- ...action2.kind === "editor" && action2.editorKind && !isAgentWorkspaceCommandEditorKind(action2.editorKind) ? {
882713
- modelExecution: localEditorModelExecution(action2.editorKind)
882787
+ ...action2.kind === "editor" && action2.editorKind ? {
882788
+ modelExecution: describeWorkspaceEditorModelExecution(action2.editorKind)
882714
882789
  } : {}
882715
882790
  };
882716
882791
  }
882717
- function localEditorModelExecution(editorKind) {
882718
- if (editorKind === "memory")
882719
- return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"memory"; agent_local_registry also supports list/search/get/review/stale/delete.';
882720
- if (editorKind === "note")
882721
- return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"note"; agent_local_registry also supports list/search/get/review/stale/delete.';
882722
- if (editorKind === "persona")
882723
- return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"persona"; agent_local_registry also supports list/search/get/use/clear_active/review/stale/delete.';
882724
- if (editorKind === "skill")
882725
- return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"skill"; agent_local_registry also supports list/search/get/enable/disable/review/stale/delete.';
882726
- if (editorKind === "routine")
882727
- return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"routine"; agent_local_registry also supports list/search/get/enable/disable/start/review/stale/delete.';
882728
- if (editorKind === "learned-behavior")
882729
- return "run_workspace_action can create the learned behavior from fields.";
882730
- if (editorKind === "profile")
882731
- return "run_workspace_action dispatches the matching /agent-profile create command.";
882732
- return "Use the command field, editor schema, or a first-class Agent model tool when available.";
882733
- }
882734
882792
  function listWorkspaceActions(deps, args2) {
882735
882793
  const query2 = readString58(args2.query);
882736
882794
  const categoryId = readString58(args2.categoryId || args2.category);
@@ -882853,7 +882911,8 @@ async function runWorkspaceEditorAction(deps, action2, editor, args2) {
882853
882911
  status: "missing_required_fields",
882854
882912
  missing,
882855
882913
  action: action2.id,
882856
- editor: describeWorkspaceEditor(editor)
882914
+ editor: describeWorkspaceEditor(editor),
882915
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind)
882857
882916
  });
882858
882917
  }
882859
882918
  if (editor.kind === "learned-behavior") {
@@ -882906,7 +882965,7 @@ async function runWorkspaceEditorAction(deps, action2, editor, args2) {
882906
882965
  status: "model_tool_required",
882907
882966
  action: action2.id,
882908
882967
  editor: describeWorkspaceEditor(editor),
882909
- modelExecution: localEditorModelExecution(editor.kind)
882968
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind)
882910
882969
  });
882911
882970
  }
882912
882971
  const submission = buildAgentWorkspaceCommandEditorSubmission(editor, fieldReader2(editor, fields), true, true);
@@ -882915,6 +882974,7 @@ async function runWorkspaceEditorAction(deps, action2, editor, args2) {
882915
882974
  status: submission.status,
882916
882975
  action: action2.id,
882917
882976
  editor: describeWorkspaceEditor(submission.editor),
882977
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind),
882918
882978
  actionResult: submission.actionResult ?? null
882919
882979
  });
882920
882980
  }
@@ -882924,6 +882984,7 @@ async function runWorkspaceEditorAction(deps, action2, editor, args2) {
882924
882984
  action: action2.id,
882925
882985
  prompt: submission.prompt,
882926
882986
  actionResult: submission.actionResult,
882987
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind),
882927
882988
  note: "This workspace action submits a normal main-conversation prompt in the TUI. In model-tool context, use the returned prompt as the conversation task instead of creating a hidden nested turn."
882928
882989
  });
882929
882990
  }
@@ -883026,7 +883087,7 @@ function createAgentHarnessTool(deps) {
883026
883087
  uiSurfaces: 'Use mode:"ui_surfaces" to list and mode:"ui_surface" with surfaceId, target, or query to inspect modal/overlay/picker/workspace surfaces; use mode:"open_ui_surface" with confirm:true plus explicitUserRequest to route visible UI navigation.',
883027
883088
  shortcuts: 'Use mode:"shortcuts" to inspect fixed shortcuts plus configurable keybindings. Use mode:"keybinding" with actionId, target, key, or query; use mode:"run_keybinding" for confirmation-gated shell-safe shortcut equivalents; use mode:"set_keybinding" and mode:"reset_keybinding" with confirm:true plus explicitUserRequest to edit the same config file the user edits.',
883028
883089
  slashCommands: 'Use mode:"commands" to list slash commands and mode:"command" with command, commandName, target, or query to inspect one command; use mode:"run_command" with the same lookup fields plus confirm:true and explicitUserRequest to execute one uniquely resolved command.',
883029
- workspace: 'Use mode:"workspace_actions" to list, mode:"workspace_action" with actionId, command, target, or query for one action and editor schema, and mode:"run_workspace_action" with the same lookup fields plus confirmation for executable actions; set includeParameters:true on workspace_actions to inline editor schemas.',
883090
+ workspace: 'Use mode:"workspace_actions" to list, mode:"workspace_action" with actionId, command, target, or query for one action, editor schema, and modelExecution route metadata, and mode:"run_workspace_action" with the same lookup fields plus confirmation for executable actions; set includeParameters:true on workspace_actions to inline editor schemas.',
883030
883091
  settings: 'Use mode:"settings" to list and mode:"get_setting" with key, target, or query for one setting. Use mode:"set_setting" or mode:"reset_setting" with key, target, or query plus confirm:true and explicitUserRequest.',
883031
883092
  tools: 'Use mode:"tools" to list first-class model tools, or mode:"tool" with toolName, target, or query to inspect one schema.',
883032
883093
  connectedHost: 'Use mode:"connected_host" for the connected-host capability map and blocked boundaries. Use mode:"connected_host_capability" with capabilityId, target, or query for one allowed or blocked capability.',
package/docs/README.md CHANGED
@@ -22,7 +22,7 @@ Important baseline constraints:
22
22
  - Agent depends on `@pellux/goodvibes-sdk@0.33.35`.
23
23
  - Agent connects to a GoodVibes host owned outside this product.
24
24
  - Agent does not start, stop, restart, install, uninstall, or own the connected GoodVibes host.
25
- - User-facing Agent workspace actions, single workspace-action lookup/execution, built-in panels and single-panel lookup, modal/overlay/picker UI surfaces and single-surface lookup, named operator surfaces, top-level CLI mirrors and single-mirror lookup, fixed shortcuts, configurable keybindings, single-keybinding lookup, shell-safe keybinding execution, slash commands, single-command lookup with policy metadata, model tools and individual model tool schemas, settings and single-setting lookup, local registries, connected-host capability boundaries, single connected-host capability inspection, and live connected-host readiness are model-visible through Agent-owned tools. Visible UI routing includes the command browser, reasoning-effort picker, live process output, runtime activity, settings, workspaces, and pickers the user can open. Local memory, note, persona, skill, and routine create editors can also run through confirmed workspace actions. Mutations, visible UI routing, and keybinding execution remain explicit and confirmation-gated; prompt-editor-only shortcuts stay direct user interaction; and ambiguous lookup matches are refused with candidates instead of guessed.
25
+ - User-facing Agent workspace actions, single workspace-action lookup/execution, built-in panels and single-panel lookup, modal/overlay/picker UI surfaces and single-surface lookup, named operator surfaces, top-level CLI mirrors and single-mirror lookup with preferred model routes, fixed shortcuts, configurable keybindings, single-keybinding lookup, shell-safe keybinding execution, slash commands, single-command lookup with effect, boundary, and preferred-route policy metadata, model tools and individual model tool schemas, settings and single-setting lookup, local registries, connected-host capability boundaries, single connected-host capability inspection, and live connected-host readiness are model-visible through Agent-owned tools. Visible UI routing includes the command browser, reasoning-effort picker, live process output, runtime activity, settings, workspaces, and pickers the user can open. Every workspace editor descriptor reports model-execution route metadata, and local memory, note, persona, skill, and routine create editors can also run through confirmed workspace actions. Mutations, visible UI routing, and keybinding execution remain explicit and confirmation-gated; prompt-editor-only shortcuts stay direct user interaction; and ambiguous lookup matches are refused with candidates instead of guessed.
26
26
  - Agent Knowledge uses only `/api/goodvibes-agent/knowledge/*`; there is no default knowledge or non-Agent product fallback.
27
27
  - Agent supports isolated Agent homes with `GOODVIBES_AGENT_HOME=<path>` and named profile homes with `goodvibes-agent profiles create <name> --template <starter> --yes` plus `--agent-profile <name>`.
28
28
  - Agent supports connected-host URL overrides with `--runtime-url http://host:port` or `GOODVIBES_AGENT_RUNTIME_URL=http://host:port`; these only change the Agent connection target.
@@ -44,7 +44,7 @@ After setup has been applied once, the TUI opens directly into the Agent operato
44
44
 
45
45
  Press `/` inside the Agent workspace to search every workspace action by name, category, command, or detail. Use that finder before reaching for shell commands; CLI subcommands are scriptable mirrors of these TUI workflows.
46
46
 
47
- The model can inspect and use the same harness surface through Agent-owned tools. `agent_harness` exposes workspace action discovery, single workspace-action inspection and execution by action id, command, or lookup text, built-in panel discovery/routing by panel id or lookup text, modal/overlay/picker UI surface discovery/routing by surface id or lookup text, top-level CLI mirror discovery and single-mirror lookup by command string, command token, or lookup text, fixed shortcut and configurable keybinding discovery, keybinding inspection/mutation by action id or lookup text, confirmation-gated shell-safe keybinding execution, slash-command discovery, single slash-command inspection by typed command or lookup text, concrete built-in command effect/boundary policy metadata, single slash-command execution by typed command or lookup text with confirmation, model tool discovery and single-tool schema inspection, settings inspection/mutation by key or lookup text, connected-host capability inventory, single connected-host capability inspection, and live connected-host readiness posture. CLI mirror modes are read-only catalog/parser inspection and point the model to the matching in-process tool, workspace action, setting mode, or slash-command mirror. Panel modes expose catalog/open state and route visible panel/workspace changes through the current Agent shell bridge with confirmation. UI surface modes expose help, shortcuts, command browser, conversation search, prompt-history search, slash-command mode, file picker, block actions, context, runtime activity, live process output, bookmarks, model/provider/reasoning-effort pickers, TTS provider/voice pickers, session/profile pickers, the panel-picker compatibility route, security/knowledge/subscription operator surfaces, settings, MCP workspace, onboarding, and Agent workspace entrypoints; `open_ui_surface` is confirmation-gated and only performs visible shell navigation. Shortcut modes expose the fixed runtime/editor shortcuts and the live keybindings table; keybinding descriptors include a model operation route, `run_keybinding` executes supported shell-safe equivalents only with confirmation, prompt-editor-only or terminal-selection shortcuts remain direct user interaction, and confirmed keybinding edits write the same `keybindings.json` file the user edits and reload the runtime manager. Workspace action discovery can include editor field schemas with `includeParameters:true`, including starter-template defaults for profile creation and selected-routine defaults for routine schedule promotion when `recordId` is supplied; single-action lookup and execution use the same user-facing search fields, return lookup metadata where the action result carries descriptors, and refuse ambiguous run requests with candidates. Single-CLI-mirror, single-panel, single-surface, single-keybinding, single-slash-command, single-tool, single-setting, and single-connected-host-capability lookup use their catalog search fields, return lookup metadata where the result carries it, and refuse ambiguous route, schema, capability, or mutation requests with candidates; confirmed slash-command execution uses the same slash-command lookup and refuses ambiguous requests before any handler runs. Selection-based local workspace actions accept a local `recordId`, so the model can use the same note promotion and local registry flows as the TUI. Direct local create editors for memory, notes, personas, skills, and routines can execute from submitted fields through `run_workspace_action` and `agent_local_registry` with confirmation. First-class model tools cover the main product workflows directly: Agent Knowledge, Agent Knowledge ingest, Agent-local memory/notes/personas/skills/routines, operator actions, notifications, channel sends, reminders, generated media, and work plans.
47
+ The model can inspect and use the same harness surface through Agent-owned tools. `agent_harness` exposes workspace action discovery, single workspace-action inspection and execution by action id, command, or lookup text, built-in panel discovery/routing by panel id or lookup text, modal/overlay/picker UI surface discovery/routing by surface id or lookup text, top-level CLI mirror discovery and single-mirror lookup by command string, command token, or lookup text, fixed shortcut and configurable keybinding discovery, keybinding inspection/mutation by action id or lookup text, confirmation-gated shell-safe keybinding execution, slash-command discovery, single slash-command inspection by typed command or lookup text, concrete built-in command effect, boundary, and preferred-route policy metadata, single slash-command execution by typed command or lookup text with confirmation, model tool discovery and single-tool schema inspection, settings inspection/mutation by key or lookup text, connected-host capability inventory, single connected-host capability inspection, and live connected-host readiness posture. CLI mirror modes are read-only catalog/parser inspection and point the model to the matching in-process tool, workspace action, setting mode, slash-command mirror, or current-conversation response route. Panel modes expose catalog/open state and route visible panel/workspace changes through the current Agent shell bridge with confirmation. UI surface modes expose help, shortcuts, command browser, conversation search, prompt-history search, slash-command mode, file picker, block actions, context, runtime activity, live process output, bookmarks, model/provider/reasoning-effort pickers, TTS provider/voice pickers, session/profile pickers, the panel-picker compatibility route, security/knowledge/subscription operator surfaces, settings, MCP workspace, onboarding, and Agent workspace entrypoints; `open_ui_surface` is confirmation-gated and only performs visible shell navigation. Shortcut modes expose the fixed runtime/editor shortcuts and the live keybindings table; keybinding descriptors include a model operation route, `run_keybinding` executes supported shell-safe equivalents only with confirmation, prompt-editor-only or terminal-selection shortcuts remain direct user interaction, and confirmed keybinding edits write the same `keybindings.json` file the user edits and reload the runtime manager. Workspace action discovery can include editor field schemas with `includeParameters:true`, including starter-template defaults for profile creation and selected-routine defaults for routine schedule promotion when `recordId` is supplied; every editor descriptor reports `modelExecution` route metadata, and single-action lookup and execution use the same user-facing search fields, return lookup metadata where the action result carries descriptors, and refuse ambiguous run requests with candidates. Single-CLI-mirror, single-panel, single-surface, single-keybinding, single-slash-command, single-tool, single-setting, and single-connected-host-capability lookup use their catalog search fields, return lookup metadata where the result carries it, and refuse ambiguous route, schema, capability, or mutation requests with candidates; confirmed slash-command execution uses the same slash-command lookup and refuses ambiguous requests before any handler runs. Selection-based local workspace actions accept a local `recordId`, so the model can use the same note promotion and local registry flows as the TUI. Direct local create editors for memory, notes, personas, skills, and routines can execute from submitted fields through `run_workspace_action` and `agent_local_registry` with confirmation. Command-backed editor forms execute through the shared slash-command registry with confirmation, and web research/fetch forms return the main-conversation prompt for the model to use directly. First-class model tools cover the main product workflows directly: Agent Knowledge, Agent Knowledge ingest, Agent-local memory/notes/personas/skills/routines, operator actions, notifications, channel sends, reminders, generated media, and work plans.
48
48
 
49
49
  Use the Artifacts area for concrete files and generated output: attach images to prompts, export conversations or saved sessions, ingest local source files and URL lists into Agent Knowledge, import bookmarks or browser history, inspect source records, and generate media artifacts from confirmed prompts.
50
50
 
@@ -50,11 +50,11 @@ The main Agent model has an Agent-owned harness bridge rather than generic SDK s
50
50
  - `agent_work_plan`: keep the visible Agent-local work plan current from the conversation.
51
51
  - `agent_channel_send`, `agent_notify`, `agent_reminder_schedule`, and `agent_media_generate`: perform confirmed external delivery, notification, reminder, or media actions when the user explicitly asks.
52
52
 
53
- `agent_harness` discovery modes are read-only. `summary` reports the model access map; `panels` lists the built-in panel catalog, and `panel` resolves one panel by `panelId`, `target`, or `query` with current open/focused state plus its matching Agent workspace route; `ui_surfaces` lists modal, overlay, picker, and workspace entrypoints, and `ui_surface` resolves one by `surfaceId`, `target`, or `query` with shell-opener availability and preferred model routes; `cli_commands` lists top-level package CLI mirror metadata, and `cli_command` resolves one mirror by `cliCommand`, `command`, `commandName`, `target`, or `query`, returning parser output for concrete invocations, blocked command tokens, lookup metadata, and preferred in-process model routes; `shortcuts` returns fixed runtime/editor shortcuts plus configurable keybindings; `keybindings` lists the live resolved keybinding table, and `keybinding`, `run_keybinding`, `set_keybinding`, and `reset_keybinding` resolve one action by `actionId`, `target`, `key`, or `query` with default bindings, custom state, config path, lookup metadata, and model-operation route metadata; `commands` lists slash-command descriptions; `command` returns one slash-command detail by `command`, `commandName`, `target`, or `query`, including parsed arguments plus concrete built-in effect/confirmation/preferred-tool/boundary policy metadata, and refuses ambiguous command lookup with candidate commands; `run_command` executes one confirmed slash command using the same `command`, `commandName`, `target`, or `query` resolver and refuses ambiguous command lookup before any handler runs; `workspace_actions` lists Agent workspace actions and can inline editor field schemas with `includeParameters:true`; `workspace_action` and `run_workspace_action` resolve one action by `actionId`, `command`, `target`, or `query`, using the same user-facing action-search fields; inspection returns lookup metadata plus editor schema, and execution refuses ambiguous requests with candidate actions before any effect; `tools` lists model tool definitions and can inline JSON schemas with `includeParameters:true`; `tool` returns one model tool schema by `toolName`, `target`, or `query` and refuses ambiguous schema lookup with candidate tools; `settings` returns setting descriptors plus setting policy; `get_setting`, `set_setting`, and `reset_setting` resolve one setting by `key`, `target`, or `query`, return lookup metadata on success, and refuse ambiguous matches with candidate settings; `connected_host` returns the connected-host route families, allowed capabilities, blocked capabilities, and first-class tool availability; `connected_host_capability` returns one allowed or blocked connected-host capability by `capabilityId`, `target`, or `query` with related route families and boundary text and refuses ambiguous capability lookup with candidates; and `connected_host_status` performs a live read-only check of the connected-host status and Agent Knowledge status routes and reports endpoint bindings, token posture, SDK compatibility, route readiness, and findings without printing token values.
53
+ `agent_harness` discovery modes are read-only. `summary` reports the model access map; `panels` lists the built-in panel catalog, and `panel` resolves one panel by `panelId`, `target`, or `query` with current open/focused state plus its matching Agent workspace route; `ui_surfaces` lists modal, overlay, picker, and workspace entrypoints, and `ui_surface` resolves one by `surfaceId`, `target`, or `query` with shell-opener availability and preferred model routes; `cli_commands` lists top-level package CLI mirror metadata, and `cli_command` resolves one mirror by `cliCommand`, `command`, `commandName`, `target`, or `query`, returning parser output for concrete invocations, blocked command tokens, lookup metadata, and preferred in-process model or current-conversation routes; `shortcuts` returns fixed runtime/editor shortcuts plus configurable keybindings; `keybindings` lists the live resolved keybinding table, and `keybinding`, `run_keybinding`, `set_keybinding`, and `reset_keybinding` resolve one action by `actionId`, `target`, `key`, or `query` with default bindings, custom state, config path, lookup metadata, and model-operation route metadata; `commands` lists slash-command descriptions; `command` returns one slash-command detail by `command`, `commandName`, `target`, or `query`, including parsed arguments plus concrete built-in effect/confirmation/preferred-tool/boundary policy metadata for every registered command root, and refuses ambiguous command lookup with candidate commands; `run_command` executes one confirmed slash command using the same `command`, `commandName`, `target`, or `query` resolver and refuses ambiguous command lookup before any handler runs; `workspace_actions` lists Agent workspace actions and can inline editor field schemas with `includeParameters:true`; `workspace_action` and `run_workspace_action` resolve one action by `actionId`, `command`, `target`, or `query`, using the same user-facing action-search fields; inspection returns lookup metadata plus editor schema and `modelExecution` route metadata for every editor action, and execution refuses ambiguous requests with candidate actions before any effect; `tools` lists model tool definitions and can inline JSON schemas with `includeParameters:true`; `tool` returns one model tool schema by `toolName`, `target`, or `query` and refuses ambiguous schema lookup with candidate tools; `settings` returns setting descriptors plus setting policy; `get_setting`, `set_setting`, and `reset_setting` resolve one setting by `key`, `target`, or `query`, return lookup metadata on success, and refuse ambiguous matches with candidate settings; `connected_host` returns the connected-host route families, allowed capabilities, blocked capabilities, and first-class tool availability; `connected_host_capability` returns one allowed or blocked connected-host capability by `capabilityId`, `target`, or `query` with related route families and boundary text and refuses ambiguous capability lookup with candidates; and `connected_host_status` performs a live read-only check of the connected-host status and Agent Knowledge status routes and reports endpoint bindings, token posture, SDK compatibility, route readiness, and findings without printing token values.
54
54
 
55
55
  `open_ui_surface` is a confirmation-gated visible navigation mode for the same shell surfaces the user can open: Agent workspace, settings, MCP workspace, model/provider/reasoning-effort pickers, TTS provider/voice pickers, session/profile pickers, the panel-picker compatibility route, security/knowledge/subscription operator surfaces, conversation search, prompt-history search, slash-command mode, command browser, file picker, block actions, bookmarks, context inspector, runtime activity monitor, live process output, help, shortcuts, and onboarding. It does not perform hidden operations; use first-class model tools, settings modes, workspace actions, or confirmed slash-command mirrors for actual state changes. Ambiguous UI surface lookup text is refused with candidate surfaces instead of routed.
56
56
 
57
- `cli_command` is a read-only inspection mode. Concrete CLI strings are parsed with redacted config overrides; descriptive lookup text searches the same `cli_commands` catalog and returns one match or candidate mirrors when broad.
57
+ `cli_command` is a read-only inspection mode. Concrete CLI strings are parsed with redacted config overrides; descriptive lookup text searches the same `cli_commands` catalog and returns one match or candidate mirrors when broad. Supported top-level CLI mirrors report `preferredModelTool`, including current-conversation handling for non-interactive run mirrors that must not create hidden nested turns.
58
58
 
59
59
  `run_keybinding`, `set_keybinding`, and `reset_keybinding` are confirmation-gated control modes. `run_keybinding` executes only keybinding actions with a faithful current-shell route, such as cancel generation, clear screen, open/focus/dismiss visible panel workspace routes, open conversation or prompt-history search, paste through the existing clipboard handler, or open the visible block-action surface. Prompt-editor-only controls, terminal text selection, category cycling, and reserved shortcuts stay visible in descriptors but return unsupported/direct-interaction metadata instead of pretending a hidden model operation exists. `set_keybinding` and `reset_keybinding` write the same Agent `keybindings.json` file exposed by `/keybindings`, reload the runtime keybinding manager, and leave fixed runtime/editor shortcuts read-only. Ambiguous keybinding lookup text is refused with candidate actions instead of guessed.
60
60
 
@@ -64,7 +64,7 @@ CLI mirror modes are catalog and parser inspection only. When the user asks the
64
64
 
65
65
  Setting writes, setting resets, supported keybinding actions, keybinding writes/resets, UI surface routing, slash-command invocation, workspace-action invocation, local record deletion, channel sends, notifications, reminders, media generation, and connected-host operator mutations require explicit user request and confirmation. Secret-backed settings are stored through the secret manager, and connected-host lifecycle/listener settings remain read-only in Agent.
66
66
 
67
- Selection-based local workspace actions use the same bridge. `agent_harness` reports the required model tool for each local action; for actions that depend on the TUI selection, call `run_workspace_action` with the selected local `recordId` plus an `actionId`, `command`, `target`, or `query` that resolves to one action. Direct local create editors for memory, notes, personas, skills, and routines can execute from submitted `fields` through `run_workspace_action`; the harness validates required fields, requires `confirm:true` and `explicitUserRequest`, and dispatches through `agent_local_registry`. Note promotion actions can prefill and create memory, personas, skills, routines, or isolated Agent Knowledge URL ingests through the matching first-class model tool. Profile creation schemas include the current runtime starter-template inventory, and routine schedule schemas prefill the selected routine when `recordId` or a `routineId` field matches a local routine.
67
+ Selection-based local workspace actions use the same bridge. `agent_harness` reports the required model tool for each local action; for actions that depend on the TUI selection, call `run_workspace_action` with the selected local `recordId` plus an `actionId`, `command`, `target`, or `query` that resolves to one action. Direct local create editors for memory, notes, personas, skills, and routines can execute from submitted `fields` through `run_workspace_action`; the harness validates required fields, requires `confirm:true` and `explicitUserRequest`, and dispatches through `agent_local_registry`. Command-backed editor forms report their shared slash-command dispatch route, direct learned-behavior/profile forms report their local or command bridge, and web research/fetch forms report that execution returns a main-conversation prompt instead of starting hidden nested work. Note promotion actions can prefill and create memory, personas, skills, routines, or isolated Agent Knowledge URL ingests through the matching first-class model tool. Profile creation schemas include the current runtime starter-template inventory, and routine schedule schemas prefill the selected routine when `recordId` or a `routineId` field matches a local routine.
68
68
 
69
69
  Use first-class Agent tools before falling back to slash-command mirrors. Slash-command execution is for harness parity and scriptable mirrors, not for bypassing Agent product boundaries.
70
70
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-agent",
3
- "version": "1.0.27",
3
+ "version": "1.0.29",
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",
@@ -222,6 +222,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
222
222
  return {
223
223
  effect: 'delegated-work',
224
224
  confirmation,
225
+ preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action',
225
226
  boundary: 'Delegation is explicit user-directed work only; no hidden background review or separate Agent job should be created implicitly.',
226
227
  };
227
228
  }
@@ -244,6 +245,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
244
245
  return {
245
246
  effect: 'session-lifecycle',
246
247
  confirmation,
248
+ preferredModelTool: 'agent_harness commands/command/run_command',
247
249
  boundary: 'Session and conversation commands operate on the visible harness session lifecycle.',
248
250
  };
249
251
  }
@@ -251,6 +253,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
251
253
  return {
252
254
  effect: 'local-state',
253
255
  confirmation,
256
+ preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action or agent_harness run_command',
254
257
  boundary: 'Conversation export writes a local workspace file and requires an explicit output intent.',
255
258
  };
256
259
  }
@@ -258,7 +261,7 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
258
261
  return {
259
262
  effect: 'ui-navigation',
260
263
  confirmation,
261
- preferredModelTool: root === 'bookmarks' ? 'agent_harness open_ui_surface' : undefined,
264
+ preferredModelTool: root === 'bookmarks' ? 'agent_harness open_ui_surface' : 'agent_harness run_command',
262
265
  boundary: 'Conversation display navigation mutates only the visible transcript view or scroll position.',
263
266
  };
264
267
  }
@@ -335,6 +338,7 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
335
338
  return {
336
339
  effect: 'mixed',
337
340
  confirmation,
341
+ preferredModelTool: 'current Agent conversation response; do not invoke hidden nested CLI run',
338
342
  boundary: 'The CLI run command starts a non-interactive Agent turn from a process entrypoint. Do not create hidden nested turns from agent_harness; answer the user directly in the current conversation.',
339
343
  };
340
344
  }
@@ -366,6 +370,7 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
366
370
  return {
367
371
  effect: 'delegated-work',
368
372
  confirmation,
373
+ preferredModelTool: 'agent_harness workspace_actions/workspace_action/run_workspace_action',
369
374
  boundary: 'Delegation is explicit user-directed work only; no hidden background review or separate Agent job should be created implicitly.',
370
375
  };
371
376
  }
@@ -373,6 +378,7 @@ export function describeCliCommandPolicy(commandName: string): CommandExecutionP
373
378
  return {
374
379
  effect: root === 'pair' ? 'external-network' : 'mixed',
375
380
  confirmation,
381
+ preferredModelTool: root === 'pair' ? 'agent_harness workspace_actions/workspace_action/run_workspace_action' : 'agent_harness settings/get_setting/set_setting/reset_setting or workspace_actions',
376
382
  boundary: 'Provider subscription, secret, and pairing flows can expose credentials or external account state. Use only explicit user-directed flows and prefer secret refs over raw values.',
377
383
  };
378
384
  }
@@ -25,6 +25,7 @@ import { describeLocalWorkspaceModelExecution, runLocalWorkspaceAction, runLocal
25
25
  import { describeHarnessModelTool, listHarnessModelTools } from './agent-harness-model-tool-catalog.ts';
26
26
  import { AGENT_HARNESS_MODES, AGENT_HARNESS_PARAMETER_PROPERTIES } from './agent-harness-tool-schema.ts';
27
27
  import { describeHarnessUiSurface, listHarnessUiSurfaces, openHarnessUiSurface, totalHarnessUiSurfaces } from './agent-harness-ui-surface-metadata.ts';
28
+ import { describeWorkspaceEditorModelExecution } from './agent-harness-workspace-editor-execution.ts';
28
29
  import {
29
30
  connectedHostSummary,
30
31
  describeConnectedHostCapability,
@@ -235,23 +236,12 @@ function describeWorkspaceAction(
235
236
  ...(action.kind === 'local-selection' || action.kind === 'local-operation' ? {
236
237
  modelExecution: describeLocalWorkspaceModelExecution(action),
237
238
  } : {}),
238
- ...(action.kind === 'editor' && action.editorKind && !isAgentWorkspaceCommandEditorKind(action.editorKind) ? {
239
- modelExecution: localEditorModelExecution(action.editorKind),
239
+ ...(action.kind === 'editor' && action.editorKind ? {
240
+ modelExecution: describeWorkspaceEditorModelExecution(action.editorKind),
240
241
  } : {}),
241
242
  };
242
243
  }
243
244
 
244
- function localEditorModelExecution(editorKind: AgentWorkspaceEditorKind): string {
245
- if (editorKind === 'memory') return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"memory"; agent_local_registry also supports list/search/get/review/stale/delete.';
246
- if (editorKind === 'note') return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"note"; agent_local_registry also supports list/search/get/review/stale/delete.';
247
- if (editorKind === 'persona') return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"persona"; agent_local_registry also supports list/search/get/use/clear_active/review/stale/delete.';
248
- if (editorKind === 'skill') return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"skill"; agent_local_registry also supports list/search/get/enable/disable/review/stale/delete.';
249
- if (editorKind === 'routine') return 'run_workspace_action can execute this editor from fields through agent_local_registry domain:"routine"; agent_local_registry also supports list/search/get/enable/disable/start/review/stale/delete.';
250
- if (editorKind === 'learned-behavior') return 'run_workspace_action can create the learned behavior from fields.';
251
- if (editorKind === 'profile') return 'run_workspace_action dispatches the matching /agent-profile create command.';
252
- return 'Use the command field, editor schema, or a first-class Agent model tool when available.';
253
- }
254
-
255
245
  function listWorkspaceActions(deps: AgentHarnessToolDeps, args: AgentHarnessToolArgs): readonly Record<string, unknown>[] {
256
246
  const query = readString(args.query);
257
247
  const categoryId = readString(args.categoryId || args.category);
@@ -387,6 +377,7 @@ async function runWorkspaceEditorAction(
387
377
  missing,
388
378
  action: action.id,
389
379
  editor: describeWorkspaceEditor(editor),
380
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind),
390
381
  });
391
382
  }
392
383
 
@@ -445,7 +436,7 @@ async function runWorkspaceEditorAction(
445
436
  status: 'model_tool_required',
446
437
  action: action.id,
447
438
  editor: describeWorkspaceEditor(editor),
448
- modelExecution: localEditorModelExecution(editor.kind),
439
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind),
449
440
  });
450
441
  }
451
442
 
@@ -460,6 +451,7 @@ async function runWorkspaceEditorAction(
460
451
  status: submission.status,
461
452
  action: action.id,
462
453
  editor: describeWorkspaceEditor(submission.editor),
454
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind),
463
455
  actionResult: submission.actionResult ?? null,
464
456
  });
465
457
  }
@@ -469,6 +461,7 @@ async function runWorkspaceEditorAction(
469
461
  action: action.id,
470
462
  prompt: submission.prompt,
471
463
  actionResult: submission.actionResult,
464
+ modelExecution: describeWorkspaceEditorModelExecution(editor.kind),
472
465
  note: 'This workspace action submits a normal main-conversation prompt in the TUI. In model-tool context, use the returned prompt as the conversation task instead of creating a hidden nested turn.',
473
466
  });
474
467
  }
@@ -573,7 +566,7 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
573
566
  uiSurfaces: 'Use mode:"ui_surfaces" to list and mode:"ui_surface" with surfaceId, target, or query to inspect modal/overlay/picker/workspace surfaces; use mode:"open_ui_surface" with confirm:true plus explicitUserRequest to route visible UI navigation.',
574
567
  shortcuts: 'Use mode:"shortcuts" to inspect fixed shortcuts plus configurable keybindings. Use mode:"keybinding" with actionId, target, key, or query; use mode:"run_keybinding" for confirmation-gated shell-safe shortcut equivalents; use mode:"set_keybinding" and mode:"reset_keybinding" with confirm:true plus explicitUserRequest to edit the same config file the user edits.',
575
568
  slashCommands: 'Use mode:"commands" to list slash commands and mode:"command" with command, commandName, target, or query to inspect one command; use mode:"run_command" with the same lookup fields plus confirm:true and explicitUserRequest to execute one uniquely resolved command.',
576
- workspace: 'Use mode:"workspace_actions" to list, mode:"workspace_action" with actionId, command, target, or query for one action and editor schema, and mode:"run_workspace_action" with the same lookup fields plus confirmation for executable actions; set includeParameters:true on workspace_actions to inline editor schemas.',
569
+ workspace: 'Use mode:"workspace_actions" to list, mode:"workspace_action" with actionId, command, target, or query for one action, editor schema, and modelExecution route metadata, and mode:"run_workspace_action" with the same lookup fields plus confirmation for executable actions; set includeParameters:true on workspace_actions to inline editor schemas.',
577
570
  settings: 'Use mode:"settings" to list and mode:"get_setting" with key, target, or query for one setting. Use mode:"set_setting" or mode:"reset_setting" with key, target, or query plus confirm:true and explicitUserRequest.',
578
571
  tools: 'Use mode:"tools" to list first-class model tools, or mode:"tool" with toolName, target, or query to inspect one schema.',
579
572
  connectedHost: 'Use mode:"connected_host" for the connected-host capability map and blocked boundaries. Use mode:"connected_host_capability" with capabilityId, target, or query for one allowed or blocked capability.',
@@ -0,0 +1,75 @@
1
+ import { isAgentWorkspaceCommandEditorKind } from '../input/agent-workspace-command-editor.ts';
2
+ import type { AgentWorkspaceEditorKind } from '../input/agent-workspace-types.ts';
3
+
4
+ type LocalEditorDomain = 'memory' | 'note' | 'persona' | 'skill' | 'routine';
5
+
6
+ function localEditorDomain(editorKind: AgentWorkspaceEditorKind): LocalEditorDomain | null {
7
+ if (
8
+ editorKind === 'memory'
9
+ || editorKind === 'note'
10
+ || editorKind === 'persona'
11
+ || editorKind === 'skill'
12
+ || editorKind === 'routine'
13
+ ) return editorKind;
14
+ return null;
15
+ }
16
+
17
+ function localEditorSupportedActions(editorKind: LocalEditorDomain): readonly string[] {
18
+ if (editorKind === 'memory') return ['list', 'search', 'get', 'review', 'stale', 'delete'];
19
+ if (editorKind === 'note') return ['list', 'search', 'get', 'review', 'stale', 'delete'];
20
+ if (editorKind === 'persona') return ['list', 'search', 'get', 'use', 'clear_active', 'review', 'stale', 'delete'];
21
+ if (editorKind === 'skill') return ['list', 'search', 'get', 'enable', 'disable', 'review', 'stale', 'delete'];
22
+ return ['list', 'search', 'get', 'enable', 'disable', 'start', 'review', 'stale', 'delete'];
23
+ }
24
+
25
+ export function describeWorkspaceEditorModelExecution(editorKind: AgentWorkspaceEditorKind): Record<string, unknown> {
26
+ const localDomain = localEditorDomain(editorKind);
27
+ if (localDomain) {
28
+ return {
29
+ route: 'agent_local_registry',
30
+ tool: 'agent_local_registry',
31
+ domain: localDomain,
32
+ action: 'create_or_update_from_fields',
33
+ confirmation: 'required',
34
+ supportedActions: localEditorSupportedActions(localDomain),
35
+ note: 'run_workspace_action validates the editor fields and dispatches through the Agent-local registry without writing default knowledge or non-Agent segments.',
36
+ };
37
+ }
38
+ if (editorKind === 'learned-behavior') {
39
+ return {
40
+ route: 'direct-agent-local-create',
41
+ action: 'create_learned_behavior',
42
+ confirmation: 'required',
43
+ note: 'run_workspace_action creates a local skill, routine, or persona from the submitted learned-behavior fields.',
44
+ };
45
+ }
46
+ if (editorKind === 'profile') {
47
+ return {
48
+ route: 'slash-command-dispatch',
49
+ command: '/agent-profile create <name> [--template <template>] --yes',
50
+ dispatcher: 'run_command',
51
+ confirmation: 'required',
52
+ note: 'run_workspace_action builds the matching profile creation slash command from the submitted fields.',
53
+ };
54
+ }
55
+ if (editorKind === 'web-research' || editorKind === 'web-fetch') {
56
+ return {
57
+ route: 'main-conversation-prompt',
58
+ result: 'prompt',
59
+ confirmation: 'not-required',
60
+ note: 'run_workspace_action returns the main-conversation prompt produced by this editor; use that prompt as the conversation task instead of creating a hidden nested turn.',
61
+ };
62
+ }
63
+ if (isAgentWorkspaceCommandEditorKind(editorKind)) {
64
+ return {
65
+ route: 'slash-command-dispatch',
66
+ dispatcher: 'run_command',
67
+ confirmation: 'required',
68
+ note: 'run_workspace_action builds the same slash-command submission as the TUI form from submitted fields, then executes it through the shared command registry.',
69
+ };
70
+ }
71
+ return {
72
+ route: 'model-tool-or-editor-schema',
73
+ note: 'Use the returned editor schema, command field, or first-class Agent model tool when available.',
74
+ };
75
+ }
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.0.27';
9
+ let _version = '1.0.29';
10
10
  let _sdkVersion = '0.33.35';
11
11
  try {
12
12
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {