ur-agent 1.32.0 → 1.34.0

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
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.34.0
4
+
5
+ - Restore the 1.30.3 subscription approach: Codex CLI, Claude Code, Gemini CLI
6
+ and Antigravity are first-class in `/model` again — shown by default and
7
+ usable directly (no `UR_ENABLE_EXTERNAL_APP_PROVIDERS` opt-in and no runtime
8
+ block). They dispatch through the official CLI; log in with
9
+ `ur auth <provider>`. The internal generic `subscription` placeholder is
10
+ hidden from listings.
11
+ - API and local/server providers are unchanged: live model discovery from each
12
+ provider's `/models` endpoint and in-app masked API-key entry.
13
+
14
+ ## 1.33.0
15
+
16
+ - Add API keys from inside UR while it is running: in `/model`, selecting an
17
+ API provider (OpenAI, Anthropic, Gemini, OpenRouter) that isn't connected now
18
+ shows a masked key-entry step. The key is stored in the OS keychain, then the
19
+ provider's models load live and you choose one — all without leaving the
20
+ session or setting an environment variable.
21
+ - Subscription login is unchanged: use `ur auth <provider>` (Codex, Claude,
22
+ Gemini, Antigravity).
23
+
3
24
  ## 1.32.0
4
25
 
5
26
  - `/model` now shows the subscription providers (Codex CLI, Claude Code, Gemini
package/README.md CHANGED
@@ -157,12 +157,14 @@ environment variables. API, local, and OpenAI-compatible server providers are
157
157
  UR-native runtimes and behave like Ollama: UR owns the conversation loop, tool
158
158
  loop, errors, and output.
159
159
 
160
- The default provider list includes a generic `subscription` access entry so the
161
- access type is visible, but this build does not invent subscription models or
162
- route through provider apps. If no independent subscription runtime is
163
- configured, that entry is marked unavailable. Subscription CLI integrations are
164
- external app bridges; they are diagnostics/opt-in only and are disabled for
165
- normal runtime selection unless `UR_ENABLE_EXTERNAL_APP_PROVIDERS=1` is set.
160
+ The provider list shows the subscription CLIs (Codex CLI, Claude Code, Gemini
161
+ CLI, Antigravity) alongside the API and local/server providers, and they are
162
+ first-class: pick one in `/model` and it dispatches through the official CLI.
163
+ These are external app bridges they run the vendor's own CLI using your
164
+ subscription so you log in with `ur auth <provider>` (e.g. `ur auth chatgpt`,
165
+ `ur auth claude`). UR does not invent subscription models; each subscription
166
+ shows its curated model list. The generic `subscription` entry is an internal
167
+ placeholder and is hidden from the list.
166
168
 
167
169
  ```sh
168
170
  ur provider list
@@ -235,9 +237,9 @@ identity line in the system prompt reflects it too:
235
237
  OpenRouter on its OpenAI-compatible chat endpoint.
236
238
  - **Local/server** providers call the configured endpoint (`/v1/chat/completions`
237
239
  for LM Studio/llama.cpp/vLLM; the native API for Ollama).
238
- - **External app bridges** for subscription CLIs are disabled by default because
239
- they delegate the turn to another agent app. Opt in with
240
- `UR_ENABLE_EXTERNAL_APP_PROVIDERS=1` only when that behavior is intentional.
240
+ - **Subscription CLIs** (Codex, Claude Code, Gemini, Antigravity) are external
241
+ app bridges: selecting one dispatches the turn through the vendor's official
242
+ CLI using your subscription. Log in with `ur auth <provider>`.
241
243
  - **Subscription** access does not list fake models. If no independent
242
244
  subscription backend is configured, `/model` marks it unavailable and asks you
243
245
  to choose a connected local, server, or API provider.
package/dist/cli.js CHANGED
@@ -51818,24 +51818,16 @@ function getProviderRuntimeBlockReason(providerId, env4 = process.env, settings
51818
51818
  if (!provider) {
51819
51819
  return `Unknown provider "${providerId}". Run: ur provider list`;
51820
51820
  }
51821
- const definition = getProviderDefinition(provider);
51822
51821
  if (provider === "subscription") {
51823
- return `Provider "subscription" represents subscription login, but no independent subscription runtime is configured. UR will not fake subscription models or call provider apps by default. Choose a local, server, or API provider with /model.`;
51824
- }
51825
- if (definition.runtimeKind !== "external-app") {
51826
- return null;
51827
- }
51828
- if (isExternalBridgeEnabled(provider, env4, settings)) {
51829
- return null;
51822
+ return `Provider "subscription" is an internal placeholder. Choose a specific subscription (codex-cli, claude-code-cli, gemini-cli, antigravity-cli) or an API/local/server provider with /model.`;
51830
51823
  }
51831
- return `Provider "${provider}" uses an external app bridge (${definition.displayName}). Connect it once with \`ur connect ${provider}\` (or set UR_ENABLE_EXTERNAL_APP_PROVIDERS=1) to enable it. Otherwise choose an API/local/server provider such as openai-api, anthropic-api, gemini-api, openrouter, ollama, lmstudio, llama.cpp, or vllm.`;
51824
+ return null;
51832
51825
  }
51833
51826
  function isProviderRuntimeSelectable(providerId, env4 = process.env) {
51834
51827
  return getProviderRuntimeBlockReason(providerId, env4) === null;
51835
51828
  }
51836
- function listProviders(options = {}) {
51837
- const includeExternal = options.includeExternalAppBridges ?? externalAppProviderBridgeEnabled(options.env ?? process.env);
51838
- return PROVIDER_IDS.map((id) => PROVIDERS[id]).filter((provider) => includeExternal || provider.runtimeKind !== "external-app");
51829
+ function listProviders(_options = {}) {
51830
+ return PROVIDER_IDS.map((id) => PROVIDERS[id]).filter((provider) => provider.id !== "subscription");
51839
51831
  }
51840
51832
  function hasSecretLikeValue(value) {
51841
51833
  const trimmed = value.trim();
@@ -69518,7 +69510,7 @@ var init_auth = __esm(() => {
69518
69510
 
69519
69511
  // src/utils/userAgent.ts
69520
69512
  function getURCodeUserAgent() {
69521
- return `ur/${"1.32.0"}`;
69513
+ return `ur/${"1.34.0"}`;
69522
69514
  }
69523
69515
 
69524
69516
  // src/utils/workloadContext.ts
@@ -69540,7 +69532,7 @@ function getUserAgent() {
69540
69532
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
69541
69533
  const workload = getWorkload();
69542
69534
  const workloadSuffix = workload ? `, workload/${workload}` : "";
69543
- return `ur-cli/${"1.32.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
69535
+ return `ur-cli/${"1.34.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
69544
69536
  }
69545
69537
  function getMCPUserAgent() {
69546
69538
  const parts = [];
@@ -69554,7 +69546,7 @@ function getMCPUserAgent() {
69554
69546
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
69555
69547
  }
69556
69548
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
69557
- return `ur/${"1.32.0"}${suffix}`;
69549
+ return `ur/${"1.34.0"}${suffix}`;
69558
69550
  }
69559
69551
  function getWebFetchUserAgent() {
69560
69552
  return `UR-User (${getURCodeUserAgent()})`;
@@ -69692,7 +69684,7 @@ var init_user = __esm(() => {
69692
69684
  deviceId,
69693
69685
  sessionId: getSessionId(),
69694
69686
  email: getEmail(),
69695
- appVersion: "1.32.0",
69687
+ appVersion: "1.34.0",
69696
69688
  platform: getHostPlatformForAnalytics(),
69697
69689
  organizationUuid,
69698
69690
  accountUuid,
@@ -76209,7 +76201,7 @@ var init_metadata = __esm(() => {
76209
76201
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
76210
76202
  WHITESPACE_REGEX = /\s+/;
76211
76203
  getVersionBase = memoize_default(() => {
76212
- const match = "1.32.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
76204
+ const match = "1.34.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
76213
76205
  return match ? match[0] : undefined;
76214
76206
  });
76215
76207
  buildEnvContext = memoize_default(async () => {
@@ -76249,7 +76241,7 @@ var init_metadata = __esm(() => {
76249
76241
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
76250
76242
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
76251
76243
  isURAiAuth: isURAISubscriber2(),
76252
- version: "1.32.0",
76244
+ version: "1.34.0",
76253
76245
  versionBase: getVersionBase(),
76254
76246
  buildTime: "",
76255
76247
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -76919,7 +76911,7 @@ function initialize1PEventLogging() {
76919
76911
  const platform2 = getPlatform();
76920
76912
  const attributes = {
76921
76913
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
76922
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.32.0"
76914
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.34.0"
76923
76915
  };
76924
76916
  if (platform2 === "wsl") {
76925
76917
  const wslVersion = getWslVersion();
@@ -76946,7 +76938,7 @@ function initialize1PEventLogging() {
76946
76938
  })
76947
76939
  ]
76948
76940
  });
76949
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.32.0");
76941
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.34.0");
76950
76942
  }
76951
76943
  async function reinitialize1PEventLoggingIfConfigChanged() {
76952
76944
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -82243,7 +82235,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
82243
82235
  function formatA2AAgentCard(options = {}, pretty = true) {
82244
82236
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
82245
82237
  }
82246
- var urVersion = "1.32.0", coverage, priorityRoadmap;
82238
+ var urVersion = "1.34.0", coverage, priorityRoadmap;
82247
82239
  var init_trends = __esm(() => {
82248
82240
  coverage = [
82249
82241
  {
@@ -84236,7 +84228,7 @@ function getAttributionHeader(fingerprint) {
84236
84228
  if (!isAttributionHeaderEnabled()) {
84237
84229
  return "";
84238
84230
  }
84239
- const version2 = `${"1.32.0"}.${fingerprint}`;
84231
+ const version2 = `${"1.34.0"}.${fingerprint}`;
84240
84232
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
84241
84233
  const cch = "";
84242
84234
  const workload = getWorkload();
@@ -191890,7 +191882,7 @@ function getTelemetryAttributes() {
191890
191882
  attributes["session.id"] = sessionId;
191891
191883
  }
191892
191884
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
191893
- attributes["app.version"] = "1.32.0";
191885
+ attributes["app.version"] = "1.34.0";
191894
191886
  }
191895
191887
  const oauthAccount = getOauthAccountInfo();
191896
191888
  if (oauthAccount) {
@@ -227275,7 +227267,7 @@ function getInstallationEnv() {
227275
227267
  return;
227276
227268
  }
227277
227269
  function getURCodeVersion() {
227278
- return "1.32.0";
227270
+ return "1.34.0";
227279
227271
  }
227280
227272
  async function getInstalledVSCodeExtensionVersion(command) {
227281
227273
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -230114,7 +230106,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
230114
230106
  const client2 = new Client({
230115
230107
  name: "ur",
230116
230108
  title: "UR",
230117
- version: "1.32.0",
230109
+ version: "1.34.0",
230118
230110
  description: "UR-AGENT autonomous engineering workflow engine",
230119
230111
  websiteUrl: PRODUCT_URL
230120
230112
  }, {
@@ -230468,7 +230460,7 @@ var init_client5 = __esm(() => {
230468
230460
  const client2 = new Client({
230469
230461
  name: "ur",
230470
230462
  title: "UR",
230471
- version: "1.32.0",
230463
+ version: "1.34.0",
230472
230464
  description: "UR-AGENT autonomous engineering workflow engine",
230473
230465
  websiteUrl: PRODUCT_URL
230474
230466
  }, {
@@ -240282,9 +240274,9 @@ async function assertMinVersion() {
240282
240274
  if (false) {}
240283
240275
  try {
240284
240276
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
240285
- if (versionConfig.minVersion && lt("1.32.0", versionConfig.minVersion)) {
240277
+ if (versionConfig.minVersion && lt("1.34.0", versionConfig.minVersion)) {
240286
240278
  console.error(`
240287
- It looks like your version of UR (${"1.32.0"}) needs an update.
240279
+ It looks like your version of UR (${"1.34.0"}) needs an update.
240288
240280
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
240289
240281
 
240290
240282
  To update, please run:
@@ -240500,7 +240492,7 @@ async function installGlobalPackage(specificVersion) {
240500
240492
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
240501
240493
  logEvent("tengu_auto_updater_lock_contention", {
240502
240494
  pid: process.pid,
240503
- currentVersion: "1.32.0"
240495
+ currentVersion: "1.34.0"
240504
240496
  });
240505
240497
  return "in_progress";
240506
240498
  }
@@ -240509,7 +240501,7 @@ async function installGlobalPackage(specificVersion) {
240509
240501
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
240510
240502
  logError2(new Error("Windows NPM detected in WSL environment"));
240511
240503
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
240512
- currentVersion: "1.32.0"
240504
+ currentVersion: "1.34.0"
240513
240505
  });
240514
240506
  console.error(`
240515
240507
  Error: Windows NPM detected in WSL
@@ -241044,7 +241036,7 @@ function detectLinuxGlobPatternWarnings() {
241044
241036
  }
241045
241037
  async function getDoctorDiagnostic() {
241046
241038
  const installationType = await getCurrentInstallationType();
241047
- const version2 = typeof MACRO !== "undefined" ? "1.32.0" : "unknown";
241039
+ const version2 = typeof MACRO !== "undefined" ? "1.34.0" : "unknown";
241048
241040
  const installationPath = await getInstallationPath();
241049
241041
  const invokedBinary = getInvokedBinary();
241050
241042
  const multipleInstallations = await detectMultipleInstallations();
@@ -241979,8 +241971,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
241979
241971
  const maxVersion = await getMaxVersion();
241980
241972
  if (maxVersion && gt(version2, maxVersion)) {
241981
241973
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
241982
- if (gte("1.32.0", maxVersion)) {
241983
- logForDebugging(`Native installer: current version ${"1.32.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
241974
+ if (gte("1.34.0", maxVersion)) {
241975
+ logForDebugging(`Native installer: current version ${"1.34.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
241984
241976
  logEvent("tengu_native_update_skipped_max_version", {
241985
241977
  latency_ms: Date.now() - startTime,
241986
241978
  max_version: maxVersion,
@@ -241991,7 +241983,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
241991
241983
  version2 = maxVersion;
241992
241984
  }
241993
241985
  }
241994
- if (!forceReinstall && version2 === "1.32.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
241986
+ if (!forceReinstall && version2 === "1.34.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
241995
241987
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
241996
241988
  logEvent("tengu_native_update_complete", {
241997
241989
  latency_ms: Date.now() - startTime,
@@ -338895,7 +338887,7 @@ function Feedback({
338895
338887
  platform: env2.platform,
338896
338888
  gitRepo: envInfo.isGit,
338897
338889
  terminal: env2.terminal,
338898
- version: "1.32.0",
338890
+ version: "1.34.0",
338899
338891
  transcript: normalizeMessagesForAPI(messages),
338900
338892
  errors: sanitizedErrors,
338901
338893
  lastApiRequest: getLastAPIRequest(),
@@ -339087,7 +339079,7 @@ function Feedback({
339087
339079
  ", ",
339088
339080
  env2.terminal,
339089
339081
  ", v",
339090
- "1.32.0"
339082
+ "1.34.0"
339091
339083
  ]
339092
339084
  }, undefined, true, undefined, this)
339093
339085
  ]
@@ -339193,7 +339185,7 @@ ${sanitizedDescription}
339193
339185
  ` + `**Environment Info**
339194
339186
  ` + `- Platform: ${env2.platform}
339195
339187
  ` + `- Terminal: ${env2.terminal}
339196
- ` + `- Version: ${"1.32.0"}
339188
+ ` + `- Version: ${"1.34.0"}
339197
339189
  ` + `- Feedback ID: ${feedbackId}
339198
339190
  ` + `
339199
339191
  **Errors**
@@ -342304,7 +342296,7 @@ function buildPrimarySection() {
342304
342296
  }, undefined, false, undefined, this);
342305
342297
  return [{
342306
342298
  label: "Version",
342307
- value: "1.32.0"
342299
+ value: "1.34.0"
342308
342300
  }, {
342309
342301
  label: "Session name",
342310
342302
  value: nameValue
@@ -345604,7 +345596,7 @@ function Config({
345604
345596
  }
345605
345597
  }, undefined, false, undefined, this)
345606
345598
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime177.jsxDEV(ChannelDowngradeDialog, {
345607
- currentVersion: "1.32.0",
345599
+ currentVersion: "1.34.0",
345608
345600
  onChoice: (choice) => {
345609
345601
  setShowSubmenu(null);
345610
345602
  setTabsHidden(false);
@@ -345616,7 +345608,7 @@ function Config({
345616
345608
  autoUpdatesChannel: "stable"
345617
345609
  };
345618
345610
  if (choice === "stay") {
345619
- newSettings.minimumVersion = "1.32.0";
345611
+ newSettings.minimumVersion = "1.34.0";
345620
345612
  }
345621
345613
  updateSettingsForSource("userSettings", newSettings);
345622
345614
  setSettingsData((prev_27) => ({
@@ -353686,7 +353678,7 @@ function HelpV2(t0) {
353686
353678
  let t6;
353687
353679
  if ($3[31] !== tabs) {
353688
353680
  t6 = /* @__PURE__ */ jsx_dev_runtime204.jsxDEV(Tabs, {
353689
- title: `UR v${"1.32.0"}`,
353681
+ title: `UR v${"1.34.0"}`,
353690
353682
  color: "professionalBlue",
353691
353683
  defaultTab: "general",
353692
353684
  children: tabs
@@ -354432,7 +354424,7 @@ function buildToolUseContext(tools, readFileStateCache) {
354432
354424
  async function handleInitialize(options2) {
354433
354425
  return {
354434
354426
  name: "ur-agent",
354435
- version: "1.32.0",
354427
+ version: "1.34.0",
354436
354428
  protocolVersion: "0.1.0",
354437
354429
  workspaceRoot: options2.cwd,
354438
354430
  capabilities: {
@@ -374556,7 +374548,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
374556
374548
  return [];
374557
374549
  }
374558
374550
  }
374559
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.32.0") {
374551
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.34.0") {
374560
374552
  if (process.env.USER_TYPE === "ant") {
374561
374553
  const changelog = "";
374562
374554
  if (changelog) {
@@ -374583,7 +374575,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.32.0")
374583
374575
  releaseNotes
374584
374576
  };
374585
374577
  }
374586
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.32.0") {
374578
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.34.0") {
374587
374579
  if (process.env.USER_TYPE === "ant") {
374588
374580
  const changelog = "";
374589
374581
  if (changelog) {
@@ -375753,7 +375745,7 @@ function getRecentActivitySync() {
375753
375745
  return cachedActivity;
375754
375746
  }
375755
375747
  function getLogoDisplayData() {
375756
- const version2 = process.env.DEMO_VERSION ?? "1.32.0";
375748
+ const version2 = process.env.DEMO_VERSION ?? "1.34.0";
375757
375749
  const serverUrl = getDirectConnectServerUrl();
375758
375750
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd2());
375759
375751
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -376542,7 +376534,7 @@ function LogoV2() {
376542
376534
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
376543
376535
  t2 = () => {
376544
376536
  const currentConfig = getGlobalConfig();
376545
- if (currentConfig.lastReleaseNotesSeen === "1.32.0") {
376537
+ if (currentConfig.lastReleaseNotesSeen === "1.34.0") {
376546
376538
  return;
376547
376539
  }
376548
376540
  saveGlobalConfig(_temp326);
@@ -377227,12 +377219,12 @@ function LogoV2() {
377227
377219
  return t41;
377228
377220
  }
377229
377221
  function _temp326(current) {
377230
- if (current.lastReleaseNotesSeen === "1.32.0") {
377222
+ if (current.lastReleaseNotesSeen === "1.34.0") {
377231
377223
  return current;
377232
377224
  }
377233
377225
  return {
377234
377226
  ...current,
377235
- lastReleaseNotesSeen: "1.32.0"
377227
+ lastReleaseNotesSeen: "1.34.0"
377236
377228
  };
377237
377229
  }
377238
377230
  function _temp243(s_0) {
@@ -593128,7 +593120,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
593128
593120
  smapsRollup,
593129
593121
  platform: process.platform,
593130
593122
  nodeVersion: process.version,
593131
- ccVersion: "1.32.0"
593123
+ ccVersion: "1.34.0"
593132
593124
  };
593133
593125
  }
593134
593126
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -593714,7 +593706,7 @@ var init_bridge_kick = __esm(() => {
593714
593706
  var call137 = async () => {
593715
593707
  return {
593716
593708
  type: "text",
593717
- value: "1.32.0"
593709
+ value: "1.34.0"
593718
593710
  };
593719
593711
  }, version2, version_default;
593720
593712
  var init_version = __esm(() => {
@@ -596594,6 +596586,9 @@ function ProviderFirstModelPicker({
596594
596586
  const [modelSource, setModelSource] = import_react188.useState("static");
596595
596587
  const [modelWarning, setModelWarning] = import_react188.useState(null);
596596
596588
  const [providerWarning, setProviderWarning] = import_react188.useState(null);
596589
+ const [connectingProvider, setConnectingProvider] = import_react188.useState(null);
596590
+ const [apiKeyInput, setApiKeyInput] = import_react188.useState("");
596591
+ const [connectError, setConnectError] = import_react188.useState(null);
596597
596592
  const effortValue = useAppState(selectEffortValue2);
596598
596593
  const [effort] = import_react188.useState(effortValue !== undefined ? convertEffortValueToLevel(effortValue) : undefined);
596599
596594
  const appThinkingEnabled = useAppState(selectThinkingEnabled2);
@@ -596679,6 +596674,17 @@ function ProviderFirstModelPicker({
596679
596674
  return;
596680
596675
  }
596681
596676
  if (provider.status !== "connected") {
596677
+ if (provider.credentialType === "api-key") {
596678
+ setConnectingProvider(provider);
596679
+ setApiKeyInput("");
596680
+ setConnectError(null);
596681
+ setStep("connect");
596682
+ return;
596683
+ }
596684
+ if (provider.provider.accessType === "subscription") {
596685
+ setProviderWarning(`${provider.label} is not logged in. Sign in with \`ur auth ${authAliasForProvider(provider.value)}\` (uses your own subscription), then reselect.`);
596686
+ return;
596687
+ }
596682
596688
  setProviderWarning(`Provider "${provider.value}" is ${provider.status}: ${provider.statusLabel}. Run \`ur provider doctor ${provider.value}\`, or choose a connected API/local/server provider.`);
596683
596689
  return;
596684
596690
  }
@@ -596755,6 +596761,105 @@ function ProviderFirstModelPicker({
596755
596761
  setModelOptions([]);
596756
596762
  setModelWarning(null);
596757
596763
  }
596764
+ function handleKeySubmit() {
596765
+ if (!connectingProvider)
596766
+ return;
596767
+ const key = apiKeyInput.trim();
596768
+ if (!key) {
596769
+ setConnectError("Enter your API key (or press Esc to go back).");
596770
+ return;
596771
+ }
596772
+ const saved = setProviderApiKey(connectingProvider.value, key);
596773
+ if (!saved.ok) {
596774
+ setConnectError(saved.message);
596775
+ return;
596776
+ }
596777
+ setApiKeyInput("");
596778
+ setConnectError(null);
596779
+ setSelectedProvider(connectingProvider);
596780
+ setStep("model");
596781
+ }
596782
+ function handleKeyCancel() {
596783
+ setApiKeyInput("");
596784
+ setConnectingProvider(null);
596785
+ setConnectError(null);
596786
+ setStep("provider");
596787
+ }
596788
+ if (step === "connect" && connectingProvider) {
596789
+ const envKey = connectingProvider.provider.envKey;
596790
+ const content2 = /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596791
+ flexDirection: "column",
596792
+ children: [
596793
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596794
+ marginBottom: 1,
596795
+ flexDirection: "column",
596796
+ children: [
596797
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596798
+ color: "remember",
596799
+ bold: true,
596800
+ children: [
596801
+ "Connect ",
596802
+ connectingProvider.label
596803
+ ]
596804
+ }, undefined, true, undefined, this),
596805
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596806
+ dimColor: true,
596807
+ children: "Paste your API key to use your own account. It is stored securely in your OS keychain and reused automatically \u2014 you only do this once."
596808
+ }, undefined, false, undefined, this),
596809
+ envKey && /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596810
+ dimColor: true,
596811
+ color: "subtle",
596812
+ children: [
596813
+ "Equivalent to setting ",
596814
+ envKey,
596815
+ ". Get a key from the provider's dashboard."
596816
+ ]
596817
+ }, undefined, true, undefined, this)
596818
+ ]
596819
+ }, undefined, true, undefined, this),
596820
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596821
+ children: [
596822
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596823
+ children: "API key: "
596824
+ }, undefined, false, undefined, this),
596825
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(TextInput, {
596826
+ value: apiKeyInput,
596827
+ onChange: setApiKeyInput,
596828
+ onSubmit: handleKeySubmit,
596829
+ mask: "*",
596830
+ placeholder: "paste key, then Enter"
596831
+ }, undefined, false, undefined, this)
596832
+ ]
596833
+ }, undefined, true, undefined, this),
596834
+ connectError && /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596835
+ marginTop: 1,
596836
+ children: /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596837
+ color: "error",
596838
+ children: connectError
596839
+ }, undefined, false, undefined, this)
596840
+ }, undefined, false, undefined, this),
596841
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596842
+ marginTop: 1,
596843
+ children: /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(Byline, {
596844
+ children: [
596845
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(KeyboardShortcutHint, {
596846
+ shortcut: "Enter",
596847
+ action: "store key & load models"
596848
+ }, undefined, false, undefined, this),
596849
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(KeyboardShortcutHint, {
596850
+ shortcut: "Esc",
596851
+ action: "back"
596852
+ }, undefined, false, undefined, this)
596853
+ ]
596854
+ }, undefined, true, undefined, this)
596855
+ }, undefined, false, undefined, this)
596856
+ ]
596857
+ }, undefined, true, undefined, this);
596858
+ return isStandaloneCommand ? /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(Pane, {
596859
+ color: "permission",
596860
+ children: content2
596861
+ }, undefined, false, undefined, this) : content2;
596862
+ }
596758
596863
  if (step === "provider") {
596759
596864
  const content2 = /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596760
596865
  flexDirection: "column",
@@ -597056,12 +597161,14 @@ var import_react188, jsx_dev_runtime346, selectCurrentProvider = (s) => s.provid
597056
597161
  var init_ProviderFirstModelPicker = __esm(() => {
597057
597162
  init_analytics();
597058
597163
  init_providerRegistry();
597164
+ init_providerCredentials();
597059
597165
  init_AppState();
597060
597166
  init_settings2();
597061
597167
  init_ink2();
597062
597168
  init_AppState();
597063
597169
  init_ConfigurableShortcutHint();
597064
597170
  init_CustomSelect();
597171
+ init_TextInput();
597065
597172
  init_Byline();
597066
597173
  init_KeyboardShortcutHint();
597067
597174
  init_Pane();
@@ -603669,7 +603776,7 @@ function generateHtmlReport(data, insights) {
603669
603776
  </html>`;
603670
603777
  }
603671
603778
  function buildExportData(data, insights, facets, remoteStats) {
603672
- const version3 = typeof MACRO !== "undefined" ? "1.32.0" : "unknown";
603779
+ const version3 = typeof MACRO !== "undefined" ? "1.34.0" : "unknown";
603673
603780
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
603674
603781
  const facets_summary = {
603675
603782
  total: facets.size,
@@ -607949,7 +608056,7 @@ var init_sessionStorage = __esm(() => {
607949
608056
  init_settings2();
607950
608057
  init_slowOperations();
607951
608058
  init_uuid();
607952
- VERSION5 = typeof MACRO !== "undefined" ? "1.32.0" : "unknown";
608059
+ VERSION5 = typeof MACRO !== "undefined" ? "1.34.0" : "unknown";
607953
608060
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
607954
608061
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
607955
608062
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -609154,7 +609261,7 @@ var init_filesystem = __esm(() => {
609154
609261
  });
609155
609262
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
609156
609263
  const nonce = randomBytes18(16).toString("hex");
609157
- return join200(getURTempDir(), "bundled-skills", "1.32.0", nonce);
609264
+ return join200(getURTempDir(), "bundled-skills", "1.34.0", nonce);
609158
609265
  });
609159
609266
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
609160
609267
  });
@@ -615443,7 +615550,7 @@ function computeFingerprint(messageText2, version3) {
615443
615550
  }
615444
615551
  function computeFingerprintFromMessages(messages) {
615445
615552
  const firstMessageText = extractFirstMessageText(messages);
615446
- return computeFingerprint(firstMessageText, "1.32.0");
615553
+ return computeFingerprint(firstMessageText, "1.34.0");
615447
615554
  }
615448
615555
  var FINGERPRINT_SALT = "59cf53e54c78";
615449
615556
  var init_fingerprint = () => {};
@@ -617310,7 +617417,7 @@ async function sideQuery(opts) {
617310
617417
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
617311
617418
  }
617312
617419
  const messageText2 = extractFirstUserMessageText(messages);
617313
- const fingerprint = computeFingerprint(messageText2, "1.32.0");
617420
+ const fingerprint = computeFingerprint(messageText2, "1.34.0");
617314
617421
  const attributionHeader = getAttributionHeader(fingerprint);
617315
617422
  const systemBlocks = [
617316
617423
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -622047,7 +622154,7 @@ function buildSystemInitMessage(inputs) {
622047
622154
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
622048
622155
  apiKeySource: getURHQApiKeyWithSource().source,
622049
622156
  betas: getSdkBetas(),
622050
- ur_version: "1.32.0",
622157
+ ur_version: "1.34.0",
622051
622158
  output_style: outputStyle2,
622052
622159
  agents: inputs.agents.map((agent) => agent.agentType),
622053
622160
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -636675,7 +636782,7 @@ var init_useVoiceEnabled = __esm(() => {
636675
636782
  function getSemverPart(version3) {
636676
636783
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
636677
636784
  }
636678
- function useUpdateNotification(updatedVersion, initialVersion = "1.32.0") {
636785
+ function useUpdateNotification(updatedVersion, initialVersion = "1.34.0") {
636679
636786
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react226.useState(() => getSemverPart(initialVersion));
636680
636787
  if (!updatedVersion) {
636681
636788
  return null;
@@ -636724,7 +636831,7 @@ function AutoUpdater({
636724
636831
  return;
636725
636832
  }
636726
636833
  if (false) {}
636727
- const currentVersion = "1.32.0";
636834
+ const currentVersion = "1.34.0";
636728
636835
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
636729
636836
  let latestVersion = await getLatestVersion(channel);
636730
636837
  const isDisabled = isAutoUpdaterDisabled();
@@ -636953,12 +637060,12 @@ function NativeAutoUpdater({
636953
637060
  logEvent("tengu_native_auto_updater_start", {});
636954
637061
  try {
636955
637062
  const maxVersion = await getMaxVersion();
636956
- if (maxVersion && gt("1.32.0", maxVersion)) {
637063
+ if (maxVersion && gt("1.34.0", maxVersion)) {
636957
637064
  const msg = await getMaxVersionMessage();
636958
637065
  setMaxVersionIssue(msg ?? "affects your version");
636959
637066
  }
636960
637067
  const result = await installLatest(channel);
636961
- const currentVersion = "1.32.0";
637068
+ const currentVersion = "1.34.0";
636962
637069
  const latencyMs = Date.now() - startTime;
636963
637070
  if (result.lockFailed) {
636964
637071
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -637095,17 +637202,17 @@ function PackageManagerAutoUpdater(t0) {
637095
637202
  const maxVersion = await getMaxVersion();
637096
637203
  if (maxVersion && latest && gt(latest, maxVersion)) {
637097
637204
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
637098
- if (gte("1.32.0", maxVersion)) {
637099
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.32.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
637205
+ if (gte("1.34.0", maxVersion)) {
637206
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.34.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
637100
637207
  setUpdateAvailable(false);
637101
637208
  return;
637102
637209
  }
637103
637210
  latest = maxVersion;
637104
637211
  }
637105
- const hasUpdate = latest && !gte("1.32.0", latest) && !shouldSkipVersion(latest);
637212
+ const hasUpdate = latest && !gte("1.34.0", latest) && !shouldSkipVersion(latest);
637106
637213
  setUpdateAvailable(!!hasUpdate);
637107
637214
  if (hasUpdate) {
637108
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.32.0"} -> ${latest}`);
637215
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.34.0"} -> ${latest}`);
637109
637216
  }
637110
637217
  };
637111
637218
  $3[0] = t1;
@@ -637139,7 +637246,7 @@ function PackageManagerAutoUpdater(t0) {
637139
637246
  wrap: "truncate",
637140
637247
  children: [
637141
637248
  "currentVersion: ",
637142
- "1.32.0"
637249
+ "1.34.0"
637143
637250
  ]
637144
637251
  }, undefined, true, undefined, this);
637145
637252
  $3[3] = verbose;
@@ -649590,7 +649697,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
649590
649697
  project_dir: getOriginalCwd(),
649591
649698
  added_dirs: addedDirs
649592
649699
  },
649593
- version: "1.32.0",
649700
+ version: "1.34.0",
649594
649701
  output_style: {
649595
649702
  name: outputStyleName
649596
649703
  },
@@ -649673,7 +649780,7 @@ function StatusLineInner({
649673
649780
  const taskValues = Object.values(tasks2);
649674
649781
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
649675
649782
  const defaultStatusLineText = buildDefaultStatusBar({
649676
- version: "1.32.0",
649783
+ version: "1.34.0",
649677
649784
  providerLabel: providerRuntime.providerLabel,
649678
649785
  authMode: providerRuntime.authLabel,
649679
649786
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -661161,7 +661268,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
661161
661268
  } catch {}
661162
661269
  const data = {
661163
661270
  trigger: trigger2,
661164
- version: "1.32.0",
661271
+ version: "1.34.0",
661165
661272
  platform: process.platform,
661166
661273
  transcript,
661167
661274
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -673045,7 +673152,7 @@ function WelcomeV2() {
673045
673152
  dimColor: true,
673046
673153
  children: [
673047
673154
  "v",
673048
- "1.32.0"
673155
+ "1.34.0"
673049
673156
  ]
673050
673157
  }, undefined, true, undefined, this)
673051
673158
  ]
@@ -674305,7 +674412,7 @@ function completeOnboarding() {
674305
674412
  saveGlobalConfig((current) => ({
674306
674413
  ...current,
674307
674414
  hasCompletedOnboarding: true,
674308
- lastOnboardingVersion: "1.32.0"
674415
+ lastOnboardingVersion: "1.34.0"
674309
674416
  }));
674310
674417
  }
674311
674418
  function showDialog(root2, renderer) {
@@ -679342,7 +679449,7 @@ function appendToLog(path24, message) {
679342
679449
  cwd: getFsImplementation().cwd(),
679343
679450
  userType: process.env.USER_TYPE,
679344
679451
  sessionId: getSessionId(),
679345
- version: "1.32.0"
679452
+ version: "1.34.0"
679346
679453
  };
679347
679454
  getLogWriter(path24).write(messageWithTimestamp);
679348
679455
  }
@@ -683436,8 +683543,8 @@ async function getEnvLessBridgeConfig() {
683436
683543
  }
683437
683544
  async function checkEnvLessBridgeMinVersion() {
683438
683545
  const cfg = await getEnvLessBridgeConfig();
683439
- if (cfg.min_version && lt("1.32.0", cfg.min_version)) {
683440
- return `Your version of UR (${"1.32.0"}) is too old for Remote Control.
683546
+ if (cfg.min_version && lt("1.34.0", cfg.min_version)) {
683547
+ return `Your version of UR (${"1.34.0"}) is too old for Remote Control.
683441
683548
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
683442
683549
  }
683443
683550
  return null;
@@ -683911,7 +684018,7 @@ async function initBridgeCore(params) {
683911
684018
  const rawApi = createBridgeApiClient({
683912
684019
  baseUrl,
683913
684020
  getAccessToken,
683914
- runnerVersion: "1.32.0",
684021
+ runnerVersion: "1.34.0",
683915
684022
  onDebug: logForDebugging,
683916
684023
  onAuth401,
683917
684024
  getTrustedDeviceToken
@@ -689593,7 +689700,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
689593
689700
  setCwd(cwd3);
689594
689701
  const server2 = new Server({
689595
689702
  name: "ur/tengu",
689596
- version: "1.32.0"
689703
+ version: "1.34.0"
689597
689704
  }, {
689598
689705
  capabilities: {
689599
689706
  tools: {}
@@ -691570,7 +691677,7 @@ async function update() {
691570
691677
  logEvent("tengu_update_check", {});
691571
691678
  const diagnostic = await getDoctorDiagnostic();
691572
691679
  const result = await checkUpgradeStatus({
691573
- currentVersion: "1.32.0",
691680
+ currentVersion: "1.34.0",
691574
691681
  packageName: UR_AGENT_PACKAGE_NAME,
691575
691682
  installationType: diagnostic.installationType,
691576
691683
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -692816,7 +692923,7 @@ ${customInstructions}` : customInstructions;
692816
692923
  }
692817
692924
  }
692818
692925
  logForDiagnosticsNoPII("info", "started", {
692819
- version: "1.32.0",
692926
+ version: "1.34.0",
692820
692927
  is_native_binary: isInBundledMode()
692821
692928
  });
692822
692929
  registerCleanup(async () => {
@@ -693602,7 +693709,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
693602
693709
  pendingHookMessages
693603
693710
  }, renderAndRun);
693604
693711
  }
693605
- }).version("1.32.0 (UR-AGENT)", "-v, --version", "Output the version number");
693712
+ }).version("1.34.0 (UR-AGENT)", "-v, --version", "Output the version number");
693606
693713
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
693607
693714
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
693608
693715
  if (canUserConfigureAdvisor()) {
@@ -694485,7 +694592,7 @@ if (false) {}
694485
694592
  async function main2() {
694486
694593
  const args = process.argv.slice(2);
694487
694594
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
694488
- console.log(`${"1.32.0"} (UR-AGENT)`);
694595
+ console.log(`${"1.34.0"} (UR-AGENT)`);
694489
694596
  return;
694490
694597
  }
694491
694598
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
package/docs/providers.md CHANGED
@@ -166,7 +166,7 @@ ur config set provider anthropic-api
166
166
  | API providers (openai-api, anthropic-api, gemini-api, openrouter) | Live discovery from the provider's `/models` endpoint using your connected key (curated fallback until connected) | live |
167
167
  | Local/server providers (ollama, lmstudio, llama.cpp, vllm) | Dynamic discovery from the selected provider endpoint | live |
168
168
  | OpenAI-compatible | Dynamic discovery from configured endpoint | live |
169
- | Subscription CLIs (codex-cli, claude-code-cli, gemini-cli, antigravity-cli) | Curated list (the official CLIs expose no models API); shown in `/model`, enabled once you `ur connect` them | static |
169
+ | Subscription CLIs (codex-cli, claude-code-cli, gemini-cli, antigravity-cli) | Curated list (the official CLIs expose no models API); first-class in `/model`, dispatched via the official CLI. Log in with `ur auth <provider>` | static |
170
170
 
171
171
  ### API vs Subscription distinction
172
172
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ur-agent",
3
- "version": "1.32.0",
3
+ "version": "1.34.0",
4
4
  "description": "UR-AGENT — autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",