getkova 2.0.0-beta.12 → 2.0.0-beta.14

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.
Files changed (65) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/.buildstamp +1 -1
  3. package/dist/{agents-Cv83FJ1s.js → agents-DYNROeFN.js} +1 -1
  4. package/dist/agents.commands.add-B9Q3n3bY.js +2 -0
  5. package/dist/{agents.commands.add-BX7k8wxL.js → agents.commands.add-BRpMqrRJ.js} +1 -1
  6. package/dist/{auth-choice-CIJsNMvx.js → auth-choice-DXcFxAUc.js} +1 -1
  7. package/dist/{auth-choice-CDyVAWSE.js → auth-choice-a7YBkCqd.js} +1 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/cli/run-main.js +4 -4
  10. package/dist/cli-startup-metadata.json +2 -2
  11. package/dist/{command-registry-C3twXmHO.js → command-registry-C_TGmiBn.js} +2 -2
  12. package/dist/{command-registry-DXpUM0mS.js → command-registry-Cypidkbo.js} +2 -2
  13. package/dist/{command-registry-core-CK3mLwYG.js → command-registry-core-PRh_gI53.js} +7 -7
  14. package/dist/{completion-cli-DFyAWfKa.js → completion-cli-nnYwutod.js} +2 -2
  15. package/dist/{config-cli-CPvKZuLF.js → config-cli-BRzInOE-.js} +1 -1
  16. package/dist/{configure-Bj4aMJwt.js → configure-Bwh6JA7D.js} +3 -3
  17. package/dist/configure-dZ-eQGYy.js +3 -0
  18. package/dist/{configure.commands-BifddrNd.js → configure.commands-CdaC_G18.js} +1 -1
  19. package/dist/{configure.wizard-BTU9REdR.js → configure.wizard-7rSbwDP4.js} +2 -2
  20. package/dist/{embedded-backend-iIZcnNwu.js → embedded-backend-CG-3uD3y.js} +34 -0
  21. package/dist/extensions/google/gemini-cli-provider.js +9 -0
  22. package/dist/extensions/google/oauth.credentials.js +16 -2
  23. package/dist/extensions/google/setup-api.js +34 -0
  24. package/dist/{gateway-chat-BPHJjxyp.js → gateway-chat-DtgJnrdN.js} +9 -0
  25. package/dist/{gateway-cli-BOTl6I3Z.js → gateway-cli-DR7qgn-2.js} +1 -1
  26. package/dist/{local-process-backend-DnkwOXbk.js → local-process-backend-DesX8olb.js} +9 -0
  27. package/dist/{model-picker-BnozRp4j.js → model-picker-CHxCmOg1.js} +1 -1
  28. package/dist/{model-picker-B4diByz_.js → model-picker-DrZ_xnKM.js} +11 -5
  29. package/dist/{model-picker.runtime-fxBzzLJi.js → model-picker.runtime-DPqk-fCR.js} +1 -1
  30. package/dist/model-picker.runtime.js +1 -1
  31. package/dist/{onboard-CB6m87Xq.js → onboard-ocgQYlzg.js} +1 -1
  32. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  33. package/dist/postinstall-inventory.json +44 -44
  34. package/dist/{program-DzyIksvz.js → program-Bc7KZvE4.js} +1 -1
  35. package/dist/{provider-auth-choice-CJsn-TeW.js → provider-auth-choice-DyZRp0As.js} +48 -21
  36. package/dist/{register.agent-BNTd3T0R.js → register.agent-CJfTiudH.js} +1 -1
  37. package/dist/{register.configure-JcB2446f.js → register.configure-vDVpx5uw.js} +3 -3
  38. package/dist/{register.onboard-43O1JC9t.js → register.onboard--sMAi8Cp.js} +1 -1
  39. package/dist/{register.settings-DtxLM-rq.js → register.settings-CZ6DFi7g.js} +2 -2
  40. package/dist/{register.setup-CXZ8SKnr.js → register.setup-D4xcgVdJ.js} +1 -1
  41. package/dist/{register.subclis-uuK2Pi04.js → register.subclis-CKoT2KT7.js} +2 -2
  42. package/dist/register.subclis-CTWWaDXm.js +3 -0
  43. package/dist/{register.subclis-core-BDQSG-W8.js → register.subclis-core-CbgJhZNs.js} +2 -2
  44. package/dist/{route-DMOrB5iD.js → route-VOBcZksS.js} +2 -2
  45. package/dist/{server-Br0mq7JG.js → server-BCJX8JcM.js} +1 -1
  46. package/dist/{server-methods-DuP3oYhB.js → server-methods-B5WxzaKk.js} +1 -1
  47. package/dist/{server-plugin-bootstrap-CiVVIETK.js → server-plugin-bootstrap-COnx2RCN.js} +1 -1
  48. package/dist/{server-plugins-BAddURDP.js → server-plugins-BVrJNao2.js} +1 -1
  49. package/dist/{server-startup-plugins-Co5FKb8_.js → server-startup-plugins-C462Zlj_.js} +1 -1
  50. package/dist/{server-startup-plugins-temwFEKa.js → server-startup-plugins-CE_Z3k8p.js} +1 -1
  51. package/dist/{server.impl-CWn8I1GH.js → server.impl-Czsabr3q.js} +6 -6
  52. package/dist/{setup-D876f1H_.js → setup-CAwtzquZ.js} +2 -2
  53. package/dist/setup-D7vQE9tM.js +2 -0
  54. package/dist/tui/local-backend-child.js +4 -1
  55. package/dist/{tui-DrUuVnxI.js → tui-Bu0hhKqj.js} +3266 -75
  56. package/dist/{tui-cli-Cqen9mHS.js → tui-cli-DVPuJZko.js} +1 -1
  57. package/docs/pi.md +2 -2
  58. package/docs/plan/terminal-control-parity.md +31 -23
  59. package/docs/tools/slash-commands.md +4 -3
  60. package/docs/web/tui.md +23 -5
  61. package/package.json +4 -3
  62. package/dist/agents.commands.add-CYLGi0PU.js +0 -2
  63. package/dist/configure-BcFwkumq.js +0 -3
  64. package/dist/register.subclis-BXWExNcW.js +0 -3
  65. package/dist/setup-BuExDK_Q.js +0 -2
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 2.0.0
4
4
 
5
5
  ### Changes
6
6
 
package/dist/.buildstamp CHANGED
@@ -1 +1 @@
1
- {"builtAt":1780122910710,"head":"5591e2dea711825bb1b1fea0c1085d4d83deb2cd"}
1
+ {"builtAt":1782057648984,"head":"a843513ebfb01ccf692033c9c6af8495d8537d38"}
@@ -2,7 +2,7 @@ import "./agent-scope-C-t9kKAb.js";
2
2
  import "./agents.binding-format-DxCQ5ArM.js";
3
3
  import "./agents.bindings-_X4Drlvv.js";
4
4
  import "./agents.config-CJItzAqZ.js";
5
- import "./agents.commands.add-BX7k8wxL.js";
5
+ import "./agents.commands.add-BRpMqrRJ.js";
6
6
  import "./agents.commands.bind-C5KjF3eq.js";
7
7
  import "./agents.commands.delete-CDfYoMn0.js";
8
8
  import "./agents.commands.identity-86zC4KMC.js";
@@ -0,0 +1,2 @@
1
+ import { t as agentsAddCommand } from "./agents.commands.add-BRpMqrRJ.js";
2
+ export { agentsAddCommand };
@@ -13,7 +13,7 @@ import { i as requireValidConfigFileSnapshot, t as createQuietRuntime } from "./
13
13
  import { t as commitConfigWithPendingPluginInstalls } from "./plugins-install-record-commit-CicWK8KE.js";
14
14
  import { i as ensureWorkspaceAndSessions } from "./onboard-helpers-DIlStw-1.js";
15
15
  import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-C16qBzUa.js";
16
- import { n as applyAuthChoice, t as warnIfModelConfigLooksOff } from "./auth-choice-CDyVAWSE.js";
16
+ import { n as applyAuthChoice, t as warnIfModelConfigLooksOff } from "./auth-choice-a7YBkCqd.js";
17
17
  import { i as setupChannels } from "./onboard-channels-DB3aztL8.js";
18
18
  import { t as describeBinding } from "./agents.binding-format-DxCQ5ArM.js";
19
19
  import { n as buildChannelBindings, r as parseBindingSpecs, t as applyAgentBindings } from "./agents.bindings-_X4Drlvv.js";
@@ -1,3 +1,3 @@
1
- import { n as applyAuthChoice, t as warnIfModelConfigLooksOff } from "./auth-choice-CDyVAWSE.js";
1
+ import { n as applyAuthChoice, t as warnIfModelConfigLooksOff } from "./auth-choice-a7YBkCqd.js";
2
2
  import { t as resolvePreferredProviderForAuthChoice } from "./provider-auth-choice-preference-WGHU31vl.js";
3
3
  export { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff };
@@ -6,7 +6,7 @@ import { A as openAIProviderUsesCodexRuntimeByDefault, O as isOpenAIProvider, k
6
6
  import "./auth-profiles-DhmtgSMo.js";
7
7
  import { n as listProfilesForProvider } from "./profile-list-DrVTJ0hW.js";
8
8
  import { o as hasUsableCustomProviderApiKey } from "./model-auth-C0G938TT.js";
9
- import { t as applyAuthChoiceLoadedPluginProvider } from "./provider-auth-choice-CJsn-TeW.js";
9
+ import { t as applyAuthChoiceLoadedPluginProvider } from "./provider-auth-choice-DyZRp0As.js";
10
10
  import { t as buildProviderAuthRecoveryHint } from "./provider-auth-guidance-C960b5fp.js";
11
11
  import "./provider-auth-choice-preference-WGHU31vl.js";
12
12
  //#region src/commands/auth-choice.apply.ts
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.0-beta.12",
3
- "commit": "5591e2dea711825bb1b1fea0c1085d4d83deb2cd",
4
- "builtAt": "2026-05-30T06:35:21.780Z"
2
+ "version": "2.0.0-beta.14",
3
+ "commit": "a843513ebfb01ccf692033c9c6af8495d8537d38",
4
+ "builtAt": "2026-06-21T16:01:00.867Z"
5
5
  }
@@ -146,7 +146,7 @@ async function runCli(argv = process$1.argv) {
146
146
  });
147
147
  await ensureCliEnvProxyDispatcher();
148
148
  maybeWarnAboutDebugProxyCoverage();
149
- const { tryRouteCli } = await import("../route-DMOrB5iD.js");
149
+ const { tryRouteCli } = await import("../route-VOBcZksS.js");
150
150
  if (await tryRouteCli(normalizedArgv)) return;
151
151
  const { createCliProgress } = await import("../progress-B3Q7T_pQ.js");
152
152
  const startupProgress = createCliProgress({
@@ -165,7 +165,7 @@ async function runCli(argv = process$1.argv) {
165
165
  const { enableConsoleCapture } = await import("../logging-BxhrU5os.js");
166
166
  enableConsoleCapture();
167
167
  const [{ buildProgram }, { formatUncaughtError }, { runFatalErrorHooks }, { installUnhandledRejectionHandler, isUncaughtExceptionHandled }, { restoreTerminalState }] = await Promise.all([
168
- import("../program-DzyIksvz.js"),
168
+ import("../program-Bc7KZvE4.js"),
169
169
  import("../infra/errors.js"),
170
170
  import("../fatal-error-hooks-DxqbkWSf.js"),
171
171
  import("../unhandled-rejections-DkKpNtEB.js"),
@@ -189,10 +189,10 @@ async function runCli(argv = process$1.argv) {
189
189
  const { getProgramContext } = await import("../program-context-DUQAJvOZ.js");
190
190
  const ctx = getProgramContext(program);
191
191
  if (ctx) {
192
- const { registerCoreCliByName } = await import("../command-registry-C3twXmHO.js");
192
+ const { registerCoreCliByName } = await import("../command-registry-C_TGmiBn.js");
193
193
  await registerCoreCliByName(program, ctx, primary, parseArgv);
194
194
  }
195
- const { registerSubCliByName } = await import("../register.subclis-BXWExNcW.js");
195
+ const { registerSubCliByName } = await import("../register.subclis-CTWWaDXm.js");
196
196
  await registerSubCliByName(program, primary);
197
197
  }
198
198
  if (!shouldSkipPluginCommandRegistration({
@@ -28,6 +28,6 @@
28
28
  "channelCatalogSignature": "88a500e5ec8ce62ed2fc40777a392f883db42c4f",
29
29
  "rootHelpBundleSignature": "fa590c69572a5300492b1e0473437a7497777610",
30
30
  "browserHelpSourceSignature": "6da32b19fce13bdcc3be8ba59163ea42f91cde83",
31
- "browserHelpText": "\nKova 2.0.0-beta.12 (5591e2d) · terminal agent ready\n\nUsage: kova browser [options] [command]\n\nManage Kova's dedicated browser (Chrome/Chromium)\n\nOptions:\n --browser-profile <name> Browser profile name (default from config)\n --expect-final Wait for final response (agent) (default: false)\n -h, --help Display help for command\n --json Output machine-readable JSON (default: false)\n --timeout <ms> Timeout in ms (default: \"30000\")\n --token <token> Gateway token (if required)\n --url <url> Gateway WebSocket URL (defaults to\n gateway.remote.url when configured)\n\nCommands:\n click Click an element by ref from snapshot\n click-coords Click viewport coordinates\n close Close a tab (target id optional)\n console Get recent console messages\n cookies Read/write cookies\n create-profile Create a new browser profile\n delete-profile Delete a browser profile\n dialog Arm the next modal dialog (alert/confirm/prompt)\n doctor Check browser plugin readiness\n download Click a ref and save the resulting download\n drag Drag from one ref to another\n errors Get recent page errors\n evaluate Evaluate a function against the page or a ref\n fill Fill a form with JSON field descriptors\n focus Focus a tab by target id, tab id, label, or unique\n target id prefix\n highlight Highlight an element by ref\n hover Hover an element by ai ref\n navigate Navigate the current tab to a URL\n open Open a URL in a new tab\n pdf Save page as PDF\n press Press a key\n profiles List all browser profiles\n requests Get recent network requests (best-effort)\n reset-profile Reset browser profile (moves it to Trash)\n resize Resize the viewport\n responsebody Wait for a network response and return its body\n screenshot Capture a screenshot (MEDIA:<path>)\n scrollintoview Scroll an element into view by ref from snapshot\n select Select option(s) in a select element\n set Browser environment settings\n snapshot Capture a snapshot (default: ai; aria is the\n accessibility tree)\n start Start the browser (no-op if already running)\n status Show browser status\n stop Stop the browser (best-effort)\n storage Read/write localStorage/sessionStorage\n tab Tab shortcuts (index-based)\n tabs List open tabs\n trace Record a Playwright trace\n type Type into an element by ref from snapshot\n upload Arm file upload for the next file chooser\n wait Wait for time, selector, URL, load state, or JS\n conditions\n waitfordownload Wait for the next download (and save it)\n\nExamples:\n kova browser status\n kova browser start\n kova browser start --headless\n kova browser stop\n kova browser tabs\n kova browser open https://example.com\n kova browser focus abcd1234\n kova browser close abcd1234\n kova browser screenshot\n kova browser screenshot --full-page\n kova browser screenshot --ref 12\n kova browser snapshot\n kova browser snapshot --format aria --limit 200\n kova browser snapshot --efficient\n kova browser snapshot --labels\n kova browser navigate https://example.com\n kova browser resize 1280 720\n kova browser click 12 --double\n kova browser click-coords 120 340\n kova browser type 23 \"hello\" --submit\n kova browser press Enter\n kova browser hover 44\n kova browser drag 10 11\n kova browser select 9 OptionA OptionB\n kova browser upload /tmp/kova/uploads/file.pdf\n kova browser fill --fields '[{\"ref\":\"1\",\"value\":\"Ada\"}]'\n kova browser dialog --accept\n kova browser wait --text \"Done\"\n kova browser evaluate --fn '(el) => el.textContent' --ref 7\n kova browser console --level error\n kova browser pdf\n\nDocs: https://docs.neuralstudio.in/cli/browser\n\n",
32
- "rootHelpText": "\nKova 2.0.0-beta.12 (5591e2d) · terminal agent ready\n\nUsage: kova [options] [command]\n\nOptions:\n --container <name> Run the CLI inside a running Podman/Docker container\n named <name> (default: env KOVA_CONTAINER)\n --dev Dev profile: isolate state under ~/.kova-dev, default\n gateway port 19001, and shift derived ports\n (browser/canvas)\n -h, --help Display help for command\n --log-level <level> Global log level override for file + console\n (silent|fatal|error|warn|info|debug|trace)\n --no-color Disable ANSI colors\n --profile <name> Use a named profile (isolates\n KOVA_STATE_DIR/KOVA_CONFIG_PATH under ~/.kova-<name>)\n -V, --version output the version number\n\nCommands:\n Hint: commands suffixed with * have subcommands. Run <command> --help for details.\n acp * Agent Control Protocol tools\n agent Run one agent turn via the Gateway\n agents * Manage isolated agents (workspaces, auth, routing)\n approvals * Manage exec approvals (gateway or node host)\n backup * Create and verify local backup archives for Kova state\n capability * Run provider-backed inference commands (fallback alias:\n infer)\n channels * Manage connected chat channels (Telegram, Discord, etc.)\n completion Generate shell completion script\n config * Non-interactive config helpers\n (get/set/unset/file/validate). Default: starts guided\n setup.\n configure Interactive configuration for credentials, channels,\n gateway, and agent defaults\n cron * Manage cron jobs via the Gateway scheduler\n devices * Device pairing + token management\n directory * Lookup contact and group IDs (self, peers, groups) for\n supported chat channels\n dns * DNS helpers for wide-area discovery (Tailscale + CoreDNS)\n docs Search the live Kova docs\n doctor Health checks + quick fixes for the gateway and channels\n exec-policy * Show or synchronize requested exec policy with host\n approvals\n gateway * Run, inspect, and query the WebSocket Gateway\n goals * Manage durable terminal goals backed by TaskFlow\n health Fetch health from the running gateway\n help Display help for command\n hooks * Manage internal agent hooks\n infer * Run provider-backed inference commands\n logs Tail gateway file logs via RPC\n mcp * Manage Kova MCP config and channel bridge\n memory Search, inspect, and reindex memory files\n message * Send, read, and manage messages\n migrate * Import state from another agent system\n models * Discover, scan, and configure models\n node * Run and manage the headless node host service\n nodes * Manage gateway-owned node pairing and node commands\n onboard Interactive onboarding for terminal chat, workspace, and\n skills\n pairing * Secure DM pairing (approve inbound requests)\n permissions Show terminal tool, exec, sandbox, and plugin permissions\n persona * Inspect and edit the current agent persona\n plugins * Manage Kova plugins\n proxy * Run the Kova debug proxy and inspect captured traffic\n qr Generate mobile pairing QR/setup code\n reset Reset local config/state (keeps the CLI installed)\n sandbox * Manage sandbox containers for agent isolation\n secrets * Secrets runtime reload controls\n security * Security tools and local config audits\n sessions * List stored conversation sessions\n settings Open the terminal settings console\n setup Initialize local config and agent workspace\n skills * List and inspect available skills\n status Show terminal readiness, Gateway health, and recent\n sessions\n system * System events, Pulse, and presence\n tasks * Inspect durable background task state\n uninstall Uninstall the gateway service + local data (CLI remains)\n update * Update Kova and inspect update channel status\n webhooks * Webhook helpers and integrations\n\nExamples:\n kova models --help\n Show detailed help for the models command.\n kova channels login --verbose\n Link personal WhatsApp Web and show QR + connection logs.\n kova message send --target +15555550123 --message \"Hi\" --json\n Send via your web session and print JSON result.\n kova gateway --port 18789\n Run the WebSocket Gateway locally.\n kova --dev gateway\n Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001.\n kova gateway --force\n Kill anything bound to the default gateway port, then start it.\n kova gateway ...\n Gateway control via WebSocket.\n kova agent --to +15555550123 --message \"Run summary\" --deliver\n Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.\n kova message send --channel telegram --target @mychat --message \"Hi\"\n Send via your Telegram bot.\n\nDocs: https://docs.neuralstudio.in/cli\n\n"
31
+ "browserHelpText": "\nKova 2.0.0-beta.14 (a843513) · terminal agent ready\n\nUsage: kova browser [options] [command]\n\nManage Kova's dedicated browser (Chrome/Chromium)\n\nOptions:\n --browser-profile <name> Browser profile name (default from config)\n --expect-final Wait for final response (agent) (default: false)\n -h, --help Display help for command\n --json Output machine-readable JSON (default: false)\n --timeout <ms> Timeout in ms (default: \"30000\")\n --token <token> Gateway token (if required)\n --url <url> Gateway WebSocket URL (defaults to\n gateway.remote.url when configured)\n\nCommands:\n click Click an element by ref from snapshot\n click-coords Click viewport coordinates\n close Close a tab (target id optional)\n console Get recent console messages\n cookies Read/write cookies\n create-profile Create a new browser profile\n delete-profile Delete a browser profile\n dialog Arm the next modal dialog (alert/confirm/prompt)\n doctor Check browser plugin readiness\n download Click a ref and save the resulting download\n drag Drag from one ref to another\n errors Get recent page errors\n evaluate Evaluate a function against the page or a ref\n fill Fill a form with JSON field descriptors\n focus Focus a tab by target id, tab id, label, or unique\n target id prefix\n highlight Highlight an element by ref\n hover Hover an element by ai ref\n navigate Navigate the current tab to a URL\n open Open a URL in a new tab\n pdf Save page as PDF\n press Press a key\n profiles List all browser profiles\n requests Get recent network requests (best-effort)\n reset-profile Reset browser profile (moves it to Trash)\n resize Resize the viewport\n responsebody Wait for a network response and return its body\n screenshot Capture a screenshot (MEDIA:<path>)\n scrollintoview Scroll an element into view by ref from snapshot\n select Select option(s) in a select element\n set Browser environment settings\n snapshot Capture a snapshot (default: ai; aria is the\n accessibility tree)\n start Start the browser (no-op if already running)\n status Show browser status\n stop Stop the browser (best-effort)\n storage Read/write localStorage/sessionStorage\n tab Tab shortcuts (index-based)\n tabs List open tabs\n trace Record a Playwright trace\n type Type into an element by ref from snapshot\n upload Arm file upload for the next file chooser\n wait Wait for time, selector, URL, load state, or JS\n conditions\n waitfordownload Wait for the next download (and save it)\n\nExamples:\n kova browser status\n kova browser start\n kova browser start --headless\n kova browser stop\n kova browser tabs\n kova browser open https://example.com\n kova browser focus abcd1234\n kova browser close abcd1234\n kova browser screenshot\n kova browser screenshot --full-page\n kova browser screenshot --ref 12\n kova browser snapshot\n kova browser snapshot --format aria --limit 200\n kova browser snapshot --efficient\n kova browser snapshot --labels\n kova browser navigate https://example.com\n kova browser resize 1280 720\n kova browser click 12 --double\n kova browser click-coords 120 340\n kova browser type 23 \"hello\" --submit\n kova browser press Enter\n kova browser hover 44\n kova browser drag 10 11\n kova browser select 9 OptionA OptionB\n kova browser upload /tmp/kova/uploads/file.pdf\n kova browser fill --fields '[{\"ref\":\"1\",\"value\":\"Ada\"}]'\n kova browser dialog --accept\n kova browser wait --text \"Done\"\n kova browser evaluate --fn '(el) => el.textContent' --ref 7\n kova browser console --level error\n kova browser pdf\n\nDocs: https://docs.neuralstudio.in/cli/browser\n\n",
32
+ "rootHelpText": "\nKova 2.0.0-beta.14 (a843513) · terminal agent ready\n\nUsage: kova [options] [command]\n\nOptions:\n --container <name> Run the CLI inside a running Podman/Docker container\n named <name> (default: env KOVA_CONTAINER)\n --dev Dev profile: isolate state under ~/.kova-dev, default\n gateway port 19001, and shift derived ports\n (browser/canvas)\n -h, --help Display help for command\n --log-level <level> Global log level override for file + console\n (silent|fatal|error|warn|info|debug|trace)\n --no-color Disable ANSI colors\n --profile <name> Use a named profile (isolates\n KOVA_STATE_DIR/KOVA_CONFIG_PATH under ~/.kova-<name>)\n -V, --version output the version number\n\nCommands:\n Hint: commands suffixed with * have subcommands. Run <command> --help for details.\n acp * Agent Control Protocol tools\n agent Run one agent turn via the Gateway\n agents * Manage isolated agents (workspaces, auth, routing)\n approvals * Manage exec approvals (gateway or node host)\n backup * Create and verify local backup archives for Kova state\n capability * Run provider-backed inference commands (fallback alias:\n infer)\n channels * Manage connected chat channels (Telegram, Discord, etc.)\n completion Generate shell completion script\n config * Non-interactive config helpers\n (get/set/unset/file/validate). Default: starts guided\n setup.\n configure Interactive configuration for credentials, channels,\n gateway, and agent defaults\n cron * Manage cron jobs via the Gateway scheduler\n devices * Device pairing + token management\n directory * Lookup contact and group IDs (self, peers, groups) for\n supported chat channels\n dns * DNS helpers for wide-area discovery (Tailscale + CoreDNS)\n docs Search the live Kova docs\n doctor Health checks + quick fixes for the gateway and channels\n exec-policy * Show or synchronize requested exec policy with host\n approvals\n gateway * Run, inspect, and query the WebSocket Gateway\n goals * Manage durable terminal goals backed by TaskFlow\n health Fetch health from the running gateway\n help Display help for command\n hooks * Manage internal agent hooks\n infer * Run provider-backed inference commands\n logs Tail gateway file logs via RPC\n mcp * Manage Kova MCP config and channel bridge\n memory Search, inspect, and reindex memory files\n message * Send, read, and manage messages\n migrate * Import state from another agent system\n models * Discover, scan, and configure models\n node * Run and manage the headless node host service\n nodes * Manage gateway-owned node pairing and node commands\n onboard Interactive onboarding for terminal chat, workspace, and\n skills\n pairing * Secure DM pairing (approve inbound requests)\n permissions Show terminal tool, exec, sandbox, and plugin permissions\n persona * Inspect and edit the current agent persona\n plugins * Manage Kova plugins\n proxy * Run the Kova debug proxy and inspect captured traffic\n qr Generate mobile pairing QR/setup code\n reset Reset local config/state (keeps the CLI installed)\n sandbox * Manage sandbox containers for agent isolation\n secrets * Secrets runtime reload controls\n security * Security tools and local config audits\n sessions * List stored conversation sessions\n settings Open the terminal settings console\n setup Initialize local config and agent workspace\n skills * List and inspect available skills\n status Show terminal readiness, Gateway health, and recent\n sessions\n system * System events, Pulse, and presence\n tasks * Inspect durable background task state\n uninstall Uninstall the gateway service + local data (CLI remains)\n update * Update Kova and inspect update channel status\n webhooks * Webhook helpers and integrations\n\nExamples:\n kova models --help\n Show detailed help for the models command.\n kova channels login --verbose\n Link personal WhatsApp Web and show QR + connection logs.\n kova message send --target +15555550123 --message \"Hi\" --json\n Send via your web session and print JSON result.\n kova gateway --port 18789\n Run the WebSocket Gateway locally.\n kova --dev gateway\n Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001.\n kova gateway --force\n Kill anything bound to the default gateway port, then start it.\n kova gateway ...\n Gateway control via WebSocket.\n kova agent --to +15555550123 --message \"Run summary\" --deliver\n Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.\n kova message send --channel telegram --target @mychat --message \"Hi\"\n Send via your Telegram bot.\n\nDocs: https://docs.neuralstudio.in/cli\n\n"
33
33
  }
@@ -1,4 +1,4 @@
1
1
  import "./argv-DsGX2kMJ.js";
2
- import { n as registerCoreCliByName } from "./command-registry-core-CK3mLwYG.js";
3
- import "./command-registry-DXpUM0mS.js";
2
+ import { n as registerCoreCliByName } from "./command-registry-core-PRh_gI53.js";
3
+ import "./command-registry-Cypidkbo.js";
4
4
  export { registerCoreCliByName };
@@ -1,5 +1,5 @@
1
- import { r as registerCoreCliCommands } from "./command-registry-core-CK3mLwYG.js";
2
- import { n as registerSubCliCommands } from "./register.subclis-uuK2Pi04.js";
1
+ import { r as registerCoreCliCommands } from "./command-registry-core-PRh_gI53.js";
2
+ import { n as registerSubCliCommands } from "./register.subclis-CKoT2KT7.js";
3
3
  //#region src/cli/program/command-registry.ts
4
4
  function registerProgramCommands(program, ctx, argv = process.argv) {
5
5
  registerCoreCliCommands(program, ctx, argv);
@@ -2,7 +2,7 @@ import { _ as getCoreCliCommandDescriptors, v as getCoreCliCommandNames$1 } from
2
2
  import { t as resolveCliArgvInvocation } from "./argv-invocation-DWwdVlIB.js";
3
3
  import { n as shouldRegisterPrimaryCommandOnly } from "./command-registration-policy-BfUsVmz7.js";
4
4
  import { i as registerCommandGroups, r as registerCommandGroupByName } from "./register-command-groups-6fuXByLA.js";
5
- import { a as defineImportedCommandGroupSpec, i as buildCommandGroupEntries, o as defineImportedProgramCommandGroupSpecs } from "./register.subclis-core-BDQSG-W8.js";
5
+ import { a as defineImportedCommandGroupSpec, i as buildCommandGroupEntries, o as defineImportedProgramCommandGroupSpecs } from "./register.subclis-core-CbgJhZNs.js";
6
6
  //#region src/cli/program/command-registry-core.ts
7
7
  function withProgramOnlySpecs(specs) {
8
8
  return specs.map((spec) => ({
@@ -16,27 +16,27 @@ const coreEntrySpecs = [
16
16
  ...withProgramOnlySpecs(defineImportedProgramCommandGroupSpecs([
17
17
  {
18
18
  commandNames: ["setup"],
19
- loadModule: () => import("./register.setup-CXZ8SKnr.js"),
19
+ loadModule: () => import("./register.setup-D4xcgVdJ.js"),
20
20
  exportName: "registerSetupCommand"
21
21
  },
22
22
  {
23
23
  commandNames: ["onboard"],
24
- loadModule: () => import("./register.onboard-43O1JC9t.js"),
24
+ loadModule: () => import("./register.onboard--sMAi8Cp.js"),
25
25
  exportName: "registerOnboardCommand"
26
26
  },
27
27
  {
28
28
  commandNames: ["configure"],
29
- loadModule: () => import("./register.configure-JcB2446f.js"),
29
+ loadModule: () => import("./register.configure-vDVpx5uw.js"),
30
30
  exportName: "registerConfigureCommand"
31
31
  },
32
32
  {
33
33
  commandNames: ["settings"],
34
- loadModule: () => import("./register.settings-DtxLM-rq.js"),
34
+ loadModule: () => import("./register.settings-CZ6DFi7g.js"),
35
35
  exportName: "registerSettingsCommand"
36
36
  },
37
37
  {
38
38
  commandNames: ["config"],
39
- loadModule: () => import("./config-cli-CPvKZuLF.js"),
39
+ loadModule: () => import("./config-cli-BRzInOE-.js"),
40
40
  exportName: "registerConfigCli"
41
41
  },
42
42
  {
@@ -67,7 +67,7 @@ const coreEntrySpecs = [
67
67
  loadModule: () => import("./mcp-cli-DAILFimD.js"),
68
68
  exportName: "registerMcpCli"
69
69
  }])),
70
- defineImportedCommandGroupSpec(["agent", "agents"], () => import("./register.agent-BNTd3T0R.js"), (mod, { program, ctx }) => {
70
+ defineImportedCommandGroupSpec(["agent", "agents"], () => import("./register.agent-CJfTiudH.js"), (mod, { program, ctx }) => {
71
71
  mod.registerAgentCommands(program, { agentChannelOptions: ctx.agentChannelOptions });
72
72
  }),
73
73
  ...withProgramOnlySpecs(defineImportedProgramCommandGroupSpecs([{
@@ -2,8 +2,8 @@ import { t as formatDocsLink } from "./links-m69AEvat.js";
2
2
  import { r as theme } from "./theme-C-A7UKu3.js";
3
3
  import { a as routeLogsToStderr } from "./console-CCvROk7Y.js";
4
4
  import { c as resolveShellFromEnv, i as installCompletion, o as isCompletionShell, s as resolveCompletionCachePath, t as COMPLETION_SHELLS } from "./completion-runtime-PZ8sMcyB.js";
5
- import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-core-BDQSG-W8.js";
6
- import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-core-CK3mLwYG.js";
5
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-core-CbgJhZNs.js";
6
+ import { n as registerCoreCliByName, t as getCoreCliCommandNames } from "./command-registry-core-PRh_gI53.js";
7
7
  import { t as getProgramContext } from "./program-context-CjdKg_V9.js";
8
8
  import path from "node:path";
9
9
  import fs from "node:fs/promises";
@@ -1075,7 +1075,7 @@ async function runConfigValidate(opts = {}) {
1075
1075
  }
1076
1076
  function registerConfigCli(program) {
1077
1077
  const cmd = program.command("config").description("Non-interactive config helpers (get/set/unset/file/schema/validate). Run without subcommand for guided setup.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.neuralstudio.in/cli/config")}\n`).option("--section <section>", "Configuration sections for guided setup (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
1078
- const { configureCommandFromSectionsArg } = await import("./configure-Bj4aMJwt.js");
1078
+ const { configureCommandFromSectionsArg } = await import("./configure-Bwh6JA7D.js");
1079
1079
  await configureCommandFromSectionsArg(opts.section, defaultRuntime);
1080
1080
  });
1081
1081
  cmd.command("get").description("Get a config value by dot path").argument("<path>", "Config path (dot or bracket notation)").option("--json", "Output JSON", false).action(async (path, opts) => {
@@ -1,4 +1,4 @@
1
- import "./configure.wizard-BTU9REdR.js";
2
- import { n as configureCommandFromSectionsArg } from "./configure.commands-BifddrNd.js";
3
- import "./configure-BcFwkumq.js";
1
+ import "./configure.wizard-7rSbwDP4.js";
2
+ import { n as configureCommandFromSectionsArg } from "./configure.commands-CdaC_G18.js";
3
+ import "./configure-dZ-eQGYy.js";
4
4
  export { configureCommandFromSectionsArg };
@@ -0,0 +1,3 @@
1
+ import "./configure.wizard-7rSbwDP4.js";
2
+ import "./configure.commands-CdaC_G18.js";
3
+ export {};
@@ -1,5 +1,5 @@
1
1
  import { n as defaultRuntime } from "./runtime-BqmjkjMH.js";
2
- import { i as parseConfigureWizardSections, r as CONFIGURE_WIZARD_SECTIONS, t as runConfigureWizard } from "./configure.wizard-BTU9REdR.js";
2
+ import { i as parseConfigureWizardSections, r as CONFIGURE_WIZARD_SECTIONS, t as runConfigureWizard } from "./configure.wizard-7rSbwDP4.js";
3
3
  //#region src/commands/configure.commands.ts
4
4
  async function configureCommand(runtime = defaultRuntime) {
5
5
  await runConfigureWizard({ command: "configure" }, runtime);
@@ -39,9 +39,9 @@ import { _ as waitForGatewayReachable, f as probeGatewayReachable, g as validate
39
39
  import { t as resolveSetupSecretInputString } from "./setup.secret-input-L_VnuW_Z.js";
40
40
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-B89QO1cO.js";
41
41
  import { t as promptAuthChoiceGrouped } from "./auth-choice-prompt-C16qBzUa.js";
42
- import { n as applyAuthChoice } from "./auth-choice-CDyVAWSE.js";
42
+ import { n as applyAuthChoice } from "./auth-choice-a7YBkCqd.js";
43
43
  import { t as resolvePreferredProviderForAuthChoice } from "./provider-auth-choice-preference-WGHU31vl.js";
44
- import { i as promptModelAllowlist, n as applyModelFallbacksFromSelection, r as promptDefaultModel, t as applyModelAllowlist } from "./model-picker-B4diByz_.js";
44
+ import { i as promptModelAllowlist, n as applyModelFallbacksFromSelection, r as promptDefaultModel, t as applyModelAllowlist } from "./model-picker-DrZ_xnKM.js";
45
45
  import { t as promptCustomApiConfig } from "./onboard-custom-COTjvU9k.js";
46
46
  import { i as TAILSCALE_MISSING_BIN_NOTE_LINES, n as TAILSCALE_DOCS_LINES, r as TAILSCALE_EXPOSURE_OPTIONS, t as validateIPv4AddressInput } from "./ipv4-DmKDA_a_.js";
47
47
  import { n as formatHealthCheckFailure } from "./health-format-CKiNFFFt.js";
@@ -544,6 +544,40 @@ var EmbeddedTuiBackend = class {
544
544
  const installRecords = await loadInstalledPluginIndexInstallRecords();
545
545
  return createPluginsStatusResult(getRuntimeConfig(), { installRecords });
546
546
  }
547
+ async setPluginEnabled(opts) {
548
+ return await this.invokePluginHandler("plugins.setEnabled", opts);
549
+ }
550
+ async installPlugin(opts) {
551
+ return await this.invokePluginHandler("plugins.install", opts);
552
+ }
553
+ async uninstallPlugin(opts) {
554
+ return await this.invokePluginHandler("plugins.uninstall", opts);
555
+ }
556
+ async invokePluginHandler(method, params) {
557
+ const [{ getRuntimeConfig }, { pluginsHandlers }] = await Promise.all([getConfigModule(), import("./plugins-B7qchJSp.js")]);
558
+ const handler = pluginsHandlers[method];
559
+ return await new Promise((resolve, reject) => {
560
+ Promise.resolve(handler({
561
+ req: {
562
+ type: "req",
563
+ id: `tui-${method}`,
564
+ method,
565
+ params
566
+ },
567
+ params,
568
+ client: null,
569
+ isWebchatConnect: () => false,
570
+ context: { getRuntimeConfig },
571
+ respond: (ok, payload, error) => {
572
+ if (ok) {
573
+ resolve(payload);
574
+ return;
575
+ }
576
+ reject(new Error(error?.message ?? `${method} failed`));
577
+ }
578
+ })).catch(reject);
579
+ });
580
+ }
547
581
  async listTools(opts) {
548
582
  const [{ getRuntimeConfig }, { buildToolsCatalogResult }] = await Promise.all([getConfigModule(), import("./tools-catalog-Brc0IqmR.js")]);
549
583
  return buildToolsCatalogResult({
@@ -14,6 +14,7 @@ const ENV_VARS = [
14
14
  "GEMINI_CLI_OAUTH_CLIENT_ID",
15
15
  "GEMINI_CLI_OAUTH_CLIENT_SECRET"
16
16
  ];
17
+ const PROVIDER_AUTH_UNAVAILABLE_ERROR_CODE = "KOVA_PROVIDER_AUTH_UNAVAILABLE";
17
18
  const GOOGLE_GEMINI_CLI_PROVIDER_HOOKS = {
18
19
  ...GOOGLE_GEMINI_PROVIDER_HOOKS,
19
20
  ...buildProviderToolCompatFamilyHooks("gemini")
@@ -34,6 +35,14 @@ function buildGoogleGeminiCliProvider() {
34
35
  hint: "PKCE + localhost callback",
35
36
  kind: "oauth",
36
37
  run: async (ctx) => {
38
+ const { resolveOAuthClientConfigPreflight } = await import("./oauth.credentials.js");
39
+ const preflight = resolveOAuthClientConfigPreflight();
40
+ if (!preflight.ok) {
41
+ await ctx.prompter.note([preflight.message, "Install the CLI or set the OAuth client env vars, then run onboarding again."].join("\n"), "Gemini CLI OAuth unavailable");
42
+ const error = new Error(preflight.message);
43
+ error.code = PROVIDER_AUTH_UNAVAILABLE_ERROR_CODE;
44
+ throw error;
45
+ }
37
46
  await ctx.prompter.note([
38
47
  "This is an unofficial integration and is not endorsed by Google.",
39
48
  "Some users have reported account restrictions or suspensions after using third-party Gemini CLI and Antigravity OAuth clients.",
@@ -17,6 +17,7 @@ function resolveEnv(keys) {
17
17
  }
18
18
  }
19
19
  let cachedGeminiCliCredentials = null;
20
+ const GEMINI_CLI_OAUTH_MISSING_MESSAGE = "Gemini CLI not found. Install it first with `npm install -g @google/gemini-cli`, or set GEMINI_CLI_OAUTH_CLIENT_ID. On macOS with Homebrew, `brew install gemini-cli` also works.";
20
21
  function clearCredentialsCache() {
21
22
  cachedGeminiCliCredentials = null;
22
23
  }
@@ -158,7 +159,20 @@ function resolveOAuthClientConfig() {
158
159
  };
159
160
  const extracted = extractGeminiCliCredentials();
160
161
  if (extracted) return extracted;
161
- throw new Error("Gemini CLI not found. Install it first: brew install gemini-cli (or npm install -g @google/gemini-cli), or set GEMINI_CLI_OAUTH_CLIENT_ID.");
162
+ throw new Error(GEMINI_CLI_OAUTH_MISSING_MESSAGE);
163
+ }
164
+ function resolveOAuthClientConfigPreflight() {
165
+ try {
166
+ return {
167
+ ok: true,
168
+ config: resolveOAuthClientConfig()
169
+ };
170
+ } catch (error) {
171
+ return {
172
+ ok: false,
173
+ message: error instanceof Error ? error.message : GEMINI_CLI_OAUTH_MISSING_MESSAGE
174
+ };
175
+ }
162
176
  }
163
177
  //#endregion
164
- export { clearCredentialsCache, extractGeminiCliCredentials, resolveOAuthClientConfig, setOAuthCredentialsFsForTest };
178
+ export { clearCredentialsCache, extractGeminiCliCredentials, resolveOAuthClientConfig, resolveOAuthClientConfigPreflight, setOAuthCredentialsFsForTest };
@@ -1,12 +1,46 @@
1
1
  import { buildGoogleGeminiCliBackend } from "./cli-backend.js";
2
+ import { buildGoogleGeminiCliProvider } from "./gemini-cli-provider.js";
3
+ import { GOOGLE_GEMINI_DEFAULT_MODEL, applyGoogleGeminiModelDefault } from "./onboard.js";
2
4
  import { definePluginEntry } from "getkova/plugin-sdk/plugin-entry";
5
+ import { createProviderApiKeyAuthMethod } from "getkova/plugin-sdk/provider-auth-api-key";
3
6
  //#region extensions/google/setup-api.ts
7
+ function buildGoogleSetupProvider() {
8
+ return {
9
+ id: "google",
10
+ label: "Google AI Studio",
11
+ docsPath: "/providers/models",
12
+ hookAliases: ["google-antigravity", "google-vertex"],
13
+ envVars: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
14
+ auth: [createProviderApiKeyAuthMethod({
15
+ providerId: "google",
16
+ methodId: "api-key",
17
+ label: "Google Gemini API key",
18
+ hint: "AI Studio / Gemini API key",
19
+ optionKey: "geminiApiKey",
20
+ flagName: "--gemini-api-key",
21
+ envVar: "GEMINI_API_KEY",
22
+ promptMessage: "Enter Gemini API key",
23
+ defaultModel: GOOGLE_GEMINI_DEFAULT_MODEL,
24
+ expectedProviders: ["google"],
25
+ applyConfig: (cfg) => applyGoogleGeminiModelDefault(cfg).next,
26
+ wizard: {
27
+ choiceId: "gemini-api-key",
28
+ choiceLabel: "Google Gemini API key",
29
+ groupId: "google",
30
+ groupLabel: "Google",
31
+ groupHint: "Gemini API key + OAuth"
32
+ }
33
+ })]
34
+ };
35
+ }
4
36
  var setup_api_default = definePluginEntry({
5
37
  id: "google",
6
38
  name: "Google Setup",
7
39
  description: "Lightweight Google setup hooks",
8
40
  register(api) {
9
41
  api.registerCliBackend(buildGoogleGeminiCliBackend());
42
+ api.registerProvider(buildGoogleSetupProvider());
43
+ api.registerProvider(buildGoogleGeminiCliProvider());
10
44
  }
11
45
  });
12
46
  //#endregion
@@ -165,6 +165,15 @@ var GatewayChatClient = class GatewayChatClient {
165
165
  async listPlugins() {
166
166
  return await this.client.request("plugins.status", {});
167
167
  }
168
+ async setPluginEnabled(opts) {
169
+ return await this.client.request("plugins.setEnabled", opts);
170
+ }
171
+ async installPlugin(opts) {
172
+ return await this.client.request("plugins.install", opts);
173
+ }
174
+ async uninstallPlugin(opts) {
175
+ return await this.client.request("plugins.uninstall", opts);
176
+ }
168
177
  async listTools(opts) {
169
178
  return await this.client.request("tools.catalog", {
170
179
  agentId: opts.agentId,
@@ -855,7 +855,7 @@ async function runGatewayCommand$1(opts) {
855
855
  const { startGatewayServer } = await startupTrace.measure("cli.server-import", () => withProgress({
856
856
  label: "Loading Kova runtime modules…",
857
857
  indeterminate: true
858
- }, async () => import("./server-Br0mq7JG.js")));
858
+ }, async () => import("./server-BCJX8JcM.js")));
859
859
  setConsoleTimestampPrefix(true);
860
860
  if (devMode) await startupTrace.measure("cli.dev-config", () => ensureDevGatewayConfig({ reset: Boolean(opts.reset) }));
861
861
  gatewayLog.info("config: loading runtime profile");
@@ -135,6 +135,15 @@ var LocalProcessTuiBackend = class {
135
135
  async listPlugins() {
136
136
  return await this.request("listPlugins", {});
137
137
  }
138
+ async setPluginEnabled(opts) {
139
+ return await this.request("setPluginEnabled", opts);
140
+ }
141
+ async installPlugin(opts) {
142
+ return await this.request("installPlugin", opts);
143
+ }
144
+ async uninstallPlugin(opts) {
145
+ return await this.request("uninstallPlugin", opts);
146
+ }
138
147
  async listTools(opts) {
139
148
  return await this.request("listTools", opts);
140
149
  }
@@ -1,3 +1,3 @@
1
1
  import { t as applyPrimaryModel } from "./provider-model-primary-DYPCWuF-.js";
2
- import { i as promptModelAllowlist, n as applyModelFallbacksFromSelection, r as promptDefaultModel, t as applyModelAllowlist } from "./model-picker-B4diByz_.js";
2
+ import { i as promptModelAllowlist, n as applyModelFallbacksFromSelection, r as promptDefaultModel, t as applyModelAllowlist } from "./model-picker-DrZ_xnKM.js";
3
3
  export { applyModelAllowlist, applyModelFallbacksFromSelection, applyPrimaryModel, promptDefaultModel, promptModelAllowlist };
@@ -19,9 +19,10 @@ import { t as loadStaticManifestCatalogRowsForList } from "./list.manifest-catal
19
19
  const KEEP_VALUE = "__keep__";
20
20
  const MANUAL_VALUE = "__manual__";
21
21
  const BROWSE_VALUE = "__browse__";
22
+ const REFRESH_VALUE = "__refresh__";
22
23
  const PROVIDER_FILTER_THRESHOLD = 30;
23
24
  async function loadModelPickerRuntime() {
24
- return import("./model-picker.runtime-fxBzzLJi.js");
25
+ return import("./model-picker.runtime-DPqk-fCR.js");
25
26
  }
26
27
  const loadResolvedModelPickerRuntime = createLazyRuntimeSurface(loadModelPickerRuntime, ({ modelPickerRuntime }) => modelPickerRuntime);
27
28
  function hasAuthForProvider(provider, cfg, store) {
@@ -409,8 +410,13 @@ async function promptDefaultModel(params) {
409
410
  });
410
411
  options.push({
411
412
  value: BROWSE_VALUE,
412
- label: "Browse all models",
413
- hint: "loads provider catalogs"
413
+ label: preferredProvider ? "Browse provider models" : "Browse all models",
414
+ hint: preferredProvider ? "fast local catalog" : "loads model catalogs"
415
+ });
416
+ if (preferredProvider) options.push({
417
+ value: REFRESH_VALUE,
418
+ label: "Refresh all provider catalogs",
419
+ hint: "slower; loads every provider"
414
420
  });
415
421
  const selection = await params.prompter.select({
416
422
  message: params.message ?? "Default model",
@@ -424,8 +430,8 @@ async function promptDefaultModel(params) {
424
430
  allowBlank: false,
425
431
  initialValue: configuredRaw || resolvedKey || void 0
426
432
  });
427
- if (selection !== BROWSE_VALUE) return { model: selection };
428
- forceDynamicCatalog = true;
433
+ if (selection === REFRESH_VALUE) forceDynamicCatalog = true;
434
+ else if (selection !== BROWSE_VALUE) return { model: selection };
429
435
  }
430
436
  if (!loadCatalog) {
431
437
  const options = [];
@@ -2,7 +2,7 @@ import { c as normalizeOptionalString } from "./string-coerce-Bje8XVt9.js";
2
2
  import { n as resolvePluginProviders } from "./providers.runtime-B5oxcgx4.js";
3
3
  import { n as resolveProviderPluginChoice, r as runProviderModelSelectedHook, t as resolveProviderModelPickerEntries } from "./provider-wizard-BkNjhNNr.js";
4
4
  import { t as sortFlowContributionsByLabel } from "./types-2PHKHlv0.js";
5
- import { n as runProviderPluginAuthMethod } from "./provider-auth-choice-CJsn-TeW.js";
5
+ import { n as runProviderPluginAuthMethod } from "./provider-auth-choice-DyZRp0As.js";
6
6
  //#region src/flows/provider-flow.runtime.ts
7
7
  function resolveProviderDocsById(params) {
8
8
  if (!params?.providerRefs?.length) return /* @__PURE__ */ new Map();
@@ -1 +1 @@
1
- export * from "./model-picker.runtime-fxBzzLJi.js";
1
+ export * from "./model-picker.runtime-DPqk-fCR.js";
@@ -20,7 +20,7 @@ import { t as createClackPrompter } from "./clack-prompter-Big8z_Xz.js";
20
20
  import { n as logConfigUpdated } from "./logging-DEJSBorQ.js";
21
21
  import { _ as waitForGatewayReachable, c as handleReset, i as ensureWorkspaceAndSessions, m as resolveOnboardWorkspaceDefault, n as LEGACY_DEFAULT_WORKSPACE, r as applyWizardMetadata, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput, v as resolveGatewayHttpLinks } from "./onboard-helpers-DIlStw-1.js";
22
22
  import { i as resolveDeprecatedAuthChoiceReplacement, n as isDeprecatedAuthChoice, r as normalizeLegacyOnboardAuthChoice, t as formatDeprecatedNonInteractiveAuthChoiceError } from "./auth-choice-legacy-DrT593ag.js";
23
- import { t as runSetupWizard } from "./setup-D876f1H_.js";
23
+ import { t as runSetupWizard } from "./setup-CAwtzquZ.js";
24
24
  import { i as applySkipBootstrapConfig, r as applyLocalSetupWorkspaceConfig } from "./onboard-config-CN_mESs0.js";
25
25
  //#region src/commands/onboard-interactive.ts
26
26
  async function runInteractiveSetup(opts, runtime = defaultRuntime) {
@@ -1 +1 @@
1
- 2026-05-30T06:35:20.959Z
1
+ 2026-06-21T16:01:00.057Z