@verboo/code 0.13.1 → 0.13.3

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 (2) hide show
  1. package/dist/cli.mjs +237 -108
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -136620,7 +136620,10 @@ async function fetchVerbooModels(accessToken, opts = {}) {
136620
136620
  logForDebugging(msg);
136621
136621
  process.stderr.write(msg + `
136622
136622
  `);
136623
- return cache2?.models ?? [];
136623
+ if (cache2 && cache2.models.length > 0) {
136624
+ return cache2.models;
136625
+ }
136626
+ throw error41;
136624
136627
  } finally {
136625
136628
  inflight = null;
136626
136629
  }
@@ -140168,6 +140171,9 @@ function getAuthTokenSource() {
140168
140171
  }
140169
140172
  return { source: "none", hasToken: false };
140170
140173
  }
140174
+ if (isVerbooMode() && getStoredVerbooOAuthTokens()) {
140175
+ return { source: "claude.ai", hasToken: true };
140176
+ }
140171
140177
  if (process.env.ANTHROPIC_AUTH_TOKEN && !isManagedOAuthContext()) {
140172
140178
  return { source: "ANTHROPIC_AUTH_TOKEN", hasToken: true };
140173
140179
  }
@@ -140789,6 +140795,24 @@ function saveOAuthTokensIfNeeded(tokens) {
140789
140795
  return { success: false, warning: "Failed to save OAuth tokens" };
140790
140796
  }
140791
140797
  }
140798
+ function getStoredVerbooOAuthTokens() {
140799
+ try {
140800
+ const oauthData = getSecureStorage().read()?.verbooOauth;
140801
+ return oauthData?.accessToken ? oauthData : null;
140802
+ } catch (error41) {
140803
+ logError2(error41);
140804
+ return null;
140805
+ }
140806
+ }
140807
+ async function getStoredVerbooOAuthTokensAsync() {
140808
+ try {
140809
+ const oauthData = (await getSecureStorage().readAsync())?.verbooOauth;
140810
+ return oauthData?.accessToken ? oauthData : null;
140811
+ } catch (error41) {
140812
+ logError2(error41);
140813
+ return null;
140814
+ }
140815
+ }
140792
140816
  function clearOAuthTokenCache() {
140793
140817
  getClaudeAIOAuthTokens.cache?.clear?.();
140794
140818
  clearKeychainCache();
@@ -140829,21 +140853,15 @@ async function handleOAuth401ErrorImpl(failedAccessToken) {
140829
140853
  async function getClaudeAIOAuthTokensAsync() {
140830
140854
  if (isBareMode())
140831
140855
  return null;
140856
+ if (isVerbooMode()) {
140857
+ const storedTokens = await getStoredVerbooOAuthTokensAsync();
140858
+ if (storedTokens)
140859
+ return storedTokens;
140860
+ }
140832
140861
  if (process.env.CLAUDE_CODE_OAUTH_TOKEN || getOAuthTokenFromFileDescriptor()) {
140833
140862
  return getClaudeAIOAuthTokens();
140834
140863
  }
140835
- try {
140836
- const secureStorage = getSecureStorage();
140837
- const storageData = await secureStorage.readAsync();
140838
- const oauthData = storageData?.verbooOauth;
140839
- if (!oauthData?.accessToken) {
140840
- return null;
140841
- }
140842
- return oauthData;
140843
- } catch (error41) {
140844
- logError2(error41);
140845
- return null;
140846
- }
140864
+ return getStoredVerbooOAuthTokensAsync();
140847
140865
  }
140848
140866
  function checkAndRefreshOAuthTokenIfNeeded(retryCount = 0, force = false) {
140849
140867
  if (retryCount === 0 && !force) {
@@ -141248,6 +141266,11 @@ var init_auth = __esm(() => {
141248
141266
  getClaudeAIOAuthTokens = memoize_default(() => {
141249
141267
  if (isBareMode())
141250
141268
  return null;
141269
+ if (isVerbooMode()) {
141270
+ const storedTokens = getStoredVerbooOAuthTokens();
141271
+ if (storedTokens)
141272
+ return storedTokens;
141273
+ }
141251
141274
  if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {
141252
141275
  return {
141253
141276
  accessToken: process.env.CLAUDE_CODE_OAUTH_TOKEN,
@@ -141269,18 +141292,7 @@ var init_auth = __esm(() => {
141269
141292
  rateLimitTier: null
141270
141293
  };
141271
141294
  }
141272
- try {
141273
- const secureStorage = getSecureStorage();
141274
- const storageData = secureStorage.read();
141275
- const oauthData = storageData?.verbooOauth;
141276
- if (!oauthData?.accessToken) {
141277
- return null;
141278
- }
141279
- return oauthData;
141280
- } catch (error41) {
141281
- logError2(error41);
141282
- return null;
141283
- }
141295
+ return getStoredVerbooOAuthTokens();
141284
141296
  });
141285
141297
  pending401Handlers = new Map;
141286
141298
  GcpCredentialsTimeoutError = class GcpCredentialsTimeoutError extends Error {
@@ -169747,7 +169759,7 @@ function getClaudeCodeUserAgent() {
169747
169759
  return `claude-code/${"99.0.0"}`;
169748
169760
  }
169749
169761
  function getVerbooCodeUserAgent() {
169750
- const version2 = typeof MACRO !== "undefined" ? "0.13.1" : "unknown";
169762
+ const version2 = typeof MACRO !== "undefined" ? "0.13.3" : "unknown";
169751
169763
  return `verboo-code/${version2}`;
169752
169764
  }
169753
169765
 
@@ -173798,8 +173810,9 @@ class OpenAIShimMessages {
173798
173810
  processEnv: process.env
173799
173811
  });
173800
173812
  const getApiKey = () => this.providerOverride?.getApiKey?.() ?? this.providerOverride?.apiKey ?? routeCredential ?? process.env.OPENAI_API_KEY ?? "";
173801
- const configuredAuthHeaderValue = process.env.OPENAI_AUTH_HEADER_VALUE?.trim();
173802
- const customAuthHeader = process.env.OPENAI_AUTH_HEADER?.trim();
173813
+ const usesVerbooRouter = isVerbooRouterUrl(request.baseUrl);
173814
+ const configuredAuthHeaderValue = usesVerbooRouter ? undefined : process.env.OPENAI_AUTH_HEADER_VALUE?.trim();
173815
+ const customAuthHeader = usesVerbooRouter ? undefined : process.env.OPENAI_AUTH_HEADER?.trim();
173803
173816
  const hasCustomAuthHeader = Boolean(customAuthHeader && /^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/.test(customAuthHeader));
173804
173817
  const applyAuthHeader = () => {
173805
173818
  const apiKey = getApiKey();
@@ -294181,9 +294194,6 @@ var init_verbooCheckout = __esm(() => {
294181
294194
  });
294182
294195
 
294183
294196
  // src/services/api/verbooMarketplace.ts
294184
- function clearMarketplaceCache() {
294185
- cache3 = null;
294186
- }
294187
294197
  async function fetchMarketplaceGroups(opts = {}) {
294188
294198
  if (!opts.force && cache3 && Date.now() - cache3.fetchedAt < CACHE_TTL_MS2) {
294189
294199
  return cache3.groups;
@@ -294191,19 +294201,26 @@ async function fetchMarketplaceGroups(opts = {}) {
294191
294201
  const endpoint = `${VERBOO_API_BASE_URL}/api/marketplace`;
294192
294202
  try {
294193
294203
  const response = await axios_default.get(endpoint, {
294194
- timeout: 1e4
294204
+ timeout: 1e4,
294205
+ signal: opts.signal
294195
294206
  });
294196
294207
  const groups = response.data?.data ?? [];
294197
294208
  cache3 = { fetchedAt: Date.now(), groups };
294198
294209
  logForDebugging(`[Marketplace] Fetched ${groups.length} groups from ${endpoint}`);
294199
294210
  return groups;
294200
294211
  } catch (error42) {
294212
+ if (opts.signal?.aborted || axios_default.isCancel(error42)) {
294213
+ throw error42;
294214
+ }
294201
294215
  logError2(error42);
294202
294216
  const msg = `[Marketplace] Erro ao buscar planos: ${error42.message ?? String(error42)}`;
294203
294217
  logForDebugging(msg);
294204
294218
  process.stderr.write(msg + `
294205
294219
  `);
294206
- return cache3?.groups ?? [];
294220
+ if (cache3 && cache3.groups.length > 0) {
294221
+ return cache3.groups;
294222
+ }
294223
+ throw error42;
294207
294224
  }
294208
294225
  }
294209
294226
  var CACHE_TTL_MS2, cache3 = null;
@@ -294501,16 +294518,46 @@ function PurchaseFlowView({
294501
294518
  const [focusIndex, setFocusIndex] = import_react62.useState(0);
294502
294519
  const [errorMsg, setErrorMsg] = import_react62.useState(null);
294503
294520
  const [wooviPayment, setWooviPayment] = import_react62.useState(null);
294521
+ const plansRequestRef = import_react62.default.useRef(null);
294522
+ const cancelPlansLoading = import_react62.useCallback(() => {
294523
+ plansRequestRef.current?.abort();
294524
+ plansRequestRef.current = null;
294525
+ setStep("splash");
294526
+ }, []);
294527
+ import_react62.default.useEffect(() => () => {
294528
+ plansRequestRef.current?.abort();
294529
+ }, []);
294504
294530
  const fetchPlans = import_react62.useCallback(async () => {
294531
+ plansRequestRef.current?.abort();
294532
+ const controller = new AbortController;
294533
+ plansRequestRef.current = controller;
294534
+ setErrorMsg(null);
294505
294535
  setStep("loading-plans");
294506
- clearMarketplaceCache();
294507
- const groups = await fetchMarketplaceGroups({ force: true });
294508
- if (groups.length === 0) {
294509
- setStep("splash");
294510
- } else {
294536
+ try {
294537
+ const groups = await fetchMarketplaceGroups({
294538
+ force: true,
294539
+ signal: controller.signal
294540
+ });
294541
+ if (plansRequestRef.current !== controller)
294542
+ return;
294543
+ if (groups.length === 0) {
294544
+ setErrorMsg("Nenhum plano está disponível no momento. Tente novamente mais tarde.");
294545
+ setStep("error");
294546
+ return;
294547
+ }
294511
294548
  setPlans(groups);
294512
294549
  setFocusIndex(0);
294513
294550
  setStep("plans");
294551
+ } catch (error42) {
294552
+ if (controller.signal.aborted || plansRequestRef.current !== controller) {
294553
+ return;
294554
+ }
294555
+ setErrorMsg(`Não foi possível carregar os planos: ${errorMessage(error42)}`);
294556
+ setStep("error");
294557
+ } finally {
294558
+ if (plansRequestRef.current === controller) {
294559
+ plansRequestRef.current = null;
294560
+ }
294514
294561
  }
294515
294562
  }, []);
294516
294563
  const startStripePolling = import_react62.useCallback(async () => {
@@ -294524,7 +294571,11 @@ function PurchaseFlowView({
294524
294571
  setTimeout(() => onDone(true), 1500);
294525
294572
  return;
294526
294573
  }
294527
- } catch {}
294574
+ } catch (error42) {
294575
+ setErrorMsg(`Não foi possível verificar a liberação dos modelos: ${errorMessage(error42)}`);
294576
+ setStep("error");
294577
+ return;
294578
+ }
294528
294579
  }
294529
294580
  setErrorMsg("O pagamento ainda não foi confirmado. Verifique o checkout e tente novamente.");
294530
294581
  setStep("error");
@@ -294567,16 +294618,26 @@ function PurchaseFlowView({
294567
294618
  }
294568
294619
  };
294569
294620
  const handleWooviConfirmed = import_react62.useCallback(async () => {
294570
- const models = await fetchVerbooModels(accessToken, { force: true });
294571
- if (models.length === 0) {
294572
- setErrorMsg("Pagamento confirmado, mas os modelos ainda não foram liberados. Aguarde alguns segundos e execute o Verboo novamente.");
294621
+ try {
294622
+ const models = await fetchVerbooModels(accessToken, { force: true });
294623
+ if (models.length === 0) {
294624
+ setErrorMsg("Pagamento confirmado, mas os modelos ainda não foram liberados. Aguarde alguns segundos e execute o Verboo novamente.");
294625
+ setStep("error");
294626
+ return;
294627
+ }
294628
+ setStep("success");
294629
+ setTimeout(() => onDone(true), 1500);
294630
+ } catch (error42) {
294631
+ setErrorMsg(`Pagamento confirmado, mas não foi possível verificar os modelos: ${errorMessage(error42)}`);
294573
294632
  setStep("error");
294574
- return;
294575
294633
  }
294576
- setStep("success");
294577
- setTimeout(() => onDone(true), 1500);
294578
294634
  }, [accessToken, onDone]);
294579
294635
  use_input_default((_input, key) => {
294636
+ if (step === "loading-plans") {
294637
+ if (key.escape)
294638
+ cancelPlansLoading();
294639
+ return;
294640
+ }
294580
294641
  if (step !== "plans" || plans.length === 0)
294581
294642
  return;
294582
294643
  if (key.leftArrow)
@@ -294595,7 +294656,7 @@ function PurchaseFlowView({
294595
294656
  }
294596
294657
  } else if (key.escape)
294597
294658
  setStep("splash");
294598
- }, { isActive: step === "plans" });
294659
+ }, { isActive: step === "plans" || step === "loading-plans" });
294599
294660
  switch (step) {
294600
294661
  case "splash":
294601
294662
  return /* @__PURE__ */ jsx_runtime71.jsxs(ThemedBox_default, {
@@ -294627,7 +294688,11 @@ function PurchaseFlowView({
294627
294688
  /* @__PURE__ */ jsx_runtime71.jsx(ThemedText, {
294628
294689
  children: "Buscando planos disponíveis…"
294629
294690
  }),
294630
- /* @__PURE__ */ jsx_runtime71.jsx(Spinner, {})
294691
+ /* @__PURE__ */ jsx_runtime71.jsx(Spinner, {}),
294692
+ /* @__PURE__ */ jsx_runtime71.jsx(ThemedText, {
294693
+ dimColor: true,
294694
+ children: "Esc para cancelar"
294695
+ })
294631
294696
  ]
294632
294697
  });
294633
294698
  case "plans": {
@@ -294861,7 +294926,7 @@ function PurchaseFlowView({
294861
294926
  }),
294862
294927
  /* @__PURE__ */ jsx_runtime71.jsx(Select, {
294863
294928
  options: [
294864
- { label: "Ver planos", value: "retry" },
294929
+ { label: "Tentar novamente", value: "retry" },
294865
294930
  { label: "Fechar", value: "fechar" }
294866
294931
  ],
294867
294932
  onChange: (value) => {
@@ -294897,6 +294962,7 @@ var init_purchaseFlow = __esm(() => {
294897
294962
  init_TextInput();
294898
294963
  init_ink2();
294899
294964
  init_browser();
294965
+ init_errors();
294900
294966
  init_verbooModels();
294901
294967
  init_verbooCheckout();
294902
294968
  init_verbooMarketplace();
@@ -298595,6 +298661,11 @@ ${sslHint ? sslHint + `
298595
298661
  `);
298596
298662
  process.exit(0);
298597
298663
  }
298664
+ if (preflight.kind === "degraded") {
298665
+ process.stderr.write(getVerbooModelsUnavailableMessage(preflight.reason) + `
298666
+ `);
298667
+ process.exit(1);
298668
+ }
298598
298669
  }
298599
298670
  const result = await runOAuthLoginFlow({
298600
298671
  email: email3,
@@ -298605,7 +298676,12 @@ ${sslHint ? sslHint + `
298605
298676
  if (isVerbooMode()) {
298606
298677
  await installVerbooOAuthTokens(result);
298607
298678
  const models = await checkVerbooModels(result.accessToken);
298608
- if (models.length === 0) {
298679
+ if (models.kind === "unavailable") {
298680
+ process.stderr.write(getVerbooModelsUnavailableMessage(models.reason) + `
298681
+ `);
298682
+ process.exit(1);
298683
+ }
298684
+ if (models.kind === "empty") {
298609
298685
  const ok = await showNoModelsFlow(result.accessToken);
298610
298686
  if (!ok)
298611
298687
  process.exit(1);
@@ -299076,6 +299152,7 @@ __export(exports_verbooStartupAuth, {
299076
299152
  markVerbooSessionValidated: () => markVerbooSessionValidated,
299077
299153
  isVerbooSessionValidated: () => isVerbooSessionValidated,
299078
299154
  installVerbooOAuthTokens: () => installVerbooOAuthTokens,
299155
+ getVerbooModelsUnavailableMessage: () => getVerbooModelsUnavailableMessage,
299079
299156
  getNoVerbooModelsMessage: () => getNoVerbooModelsMessage2,
299080
299157
  ensureVerbooAuthenticated: () => ensureVerbooAuthenticated,
299081
299158
  checkVerbooModels: () => checkVerbooModels
@@ -299161,24 +299238,42 @@ async function validateVerbooSession() {
299161
299238
  return { kind: "degraded", reason: result.reason };
299162
299239
  }
299163
299240
  async function checkVerbooModels(accessToken) {
299164
- return fetchVerbooModels(accessToken, { force: true }).catch((err2) => {
299165
- process.stderr.write(`[Verboo] Falha ao carregar modelos: ${err2.message ?? String(err2)}
299166
- `);
299167
- return [];
299168
- });
299241
+ try {
299242
+ const models = await fetchVerbooModels(accessToken, { force: true });
299243
+ if (models.length > 0) {
299244
+ return { kind: "available", models };
299245
+ }
299246
+ return { kind: "empty", models: [] };
299247
+ } catch (err2) {
299248
+ return {
299249
+ kind: "unavailable",
299250
+ reason: errorMessage(err2),
299251
+ models: []
299252
+ };
299253
+ }
299254
+ }
299255
+ function getVerbooModelsUnavailableMessage(reason) {
299256
+ return `Não foi possível verificar os modelos do Verboo: ${reason}.
299257
+ ` + "Sua sessão local foi preservada. Tente novamente em alguns instantes.";
299169
299258
  }
299170
299259
  async function loadAndCheckModels(accessToken) {
299171
- const models = await checkVerbooModels(accessToken);
299172
- if (models.length > 0)
299260
+ const result = await checkVerbooModels(accessToken);
299261
+ if (result.kind === "available")
299173
299262
  return;
299263
+ if (result.kind === "unavailable") {
299264
+ throw new Error(getVerbooModelsUnavailableMessage(result.reason));
299265
+ }
299174
299266
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
299175
299267
  throw new Error("Nenhum modelo disponível nesta conta. Execute `verboo /login` em um terminal interativo para escolher um plano.");
299176
299268
  }
299177
299269
  const ok = await showNoModelsFlow(accessToken);
299178
299270
  if (ok) {
299179
299271
  const refreshed = await checkVerbooModels(accessToken);
299180
- if (refreshed.length > 0)
299272
+ if (refreshed.kind === "available")
299181
299273
  return;
299274
+ if (refreshed.kind === "unavailable") {
299275
+ throw new Error(getVerbooModelsUnavailableMessage(refreshed.reason));
299276
+ }
299182
299277
  }
299183
299278
  process.stdout.write(`
299184
299279
  Para trocar de conta, execute: verboo logout
@@ -299219,13 +299314,16 @@ async function preflightVerbooLogin() {
299219
299314
  return { kind: "degraded", reason: session.reason };
299220
299315
  }
299221
299316
  const models = await checkVerbooModels(session.tokens.accessToken);
299222
- if (models.length === 0) {
299317
+ if (models.kind === "unavailable") {
299318
+ return { kind: "degraded", reason: models.reason };
299319
+ }
299320
+ if (models.kind === "empty") {
299223
299321
  return { kind: "needs-oauth", reason: "no-models" };
299224
299322
  }
299225
299323
  return {
299226
299324
  kind: "ready",
299227
299325
  tokens: session.tokens,
299228
- models,
299326
+ models: models.models,
299229
299327
  refreshed: session.refreshed
299230
299328
  };
299231
299329
  }
@@ -299235,8 +299333,8 @@ async function ensureVerbooAuthenticated(opts = {}) {
299235
299333
  clearVerbooModelsCache();
299236
299334
  const session = await validateVerbooSession();
299237
299335
  if (session.kind === "ok") {
299238
- validated = true;
299239
299336
  await loadAndCheckModels(session.tokens.accessToken);
299337
+ validated = true;
299240
299338
  await showPastDueNotice(session.tokens.accessToken);
299241
299339
  return;
299242
299340
  }
@@ -299245,10 +299343,10 @@ async function ensureVerbooAuthenticated(opts = {}) {
299245
299343
  logForDebugging(degradedMsg);
299246
299344
  process.stderr.write(degradedMsg + `
299247
299345
  `);
299248
- validated = true;
299249
299346
  const stored = await getClaudeAIOAuthTokensAsync();
299250
299347
  if (stored?.accessToken) {
299251
299348
  await loadAndCheckModels(stored.accessToken);
299349
+ validated = true;
299252
299350
  }
299253
299351
  return;
299254
299352
  }
@@ -299272,14 +299370,17 @@ ${url3}
299272
299370
  onAuthUrl
299273
299371
  });
299274
299372
  await installVerbooOAuthTokens(tokens);
299275
- await validateVerbooSession();
299373
+ const confirmedSession = await validateVerbooSession();
299374
+ if (confirmedSession.kind === "unauthenticated") {
299375
+ throw new Error("A sessão recém-autenticada foi rejeitada pelo Verboo. Feche variáveis de credencial herdadas do terminal e tente `verboo /login` novamente.");
299376
+ }
299276
299377
  process.stdout.write(`
299277
299378
  ✓ Autenticação concluída.
299278
299379
 
299279
299380
  `);
299280
299381
  saveGlobalConfig((current) => current.hasCompletedOnboarding ? current : { ...current, hasCompletedOnboarding: true });
299382
+ await loadAndCheckModels(confirmedSession.kind === "ok" ? confirmedSession.tokens.accessToken : tokens.accessToken);
299281
299383
  validated = true;
299282
- await loadAndCheckModels(tokens.accessToken);
299283
299384
  }
299284
299385
  var validated = false;
299285
299386
  var init_verbooStartupAuth = __esm(() => {
@@ -303711,20 +303812,32 @@ async function call2(onDone, context) {
303711
303812
  onDone(result.message, { display: "system" });
303712
303813
  return;
303713
303814
  }
303815
+ if (result.type === "unavailable") {
303816
+ onDone(getVerbooModelsUnavailableMessage(result.reason), {
303817
+ display: "system"
303818
+ });
303819
+ return;
303820
+ }
303714
303821
  const authChanged = result.type !== "ready" || result.refreshed;
303715
303822
  if (!authChanged) {
303716
303823
  if (isVerbooMode()) {
303717
303824
  markVerbooSessionValidated();
303718
303825
  const storedTokens = await getClaudeAIOAuthTokensAsync();
303719
303826
  if (storedTokens?.accessToken) {
303720
- const models = await checkVerbooModels(storedTokens.accessToken);
303721
- const [firstModel] = models;
303827
+ const modelsResult = await checkVerbooModels(storedTokens.accessToken);
303828
+ const [firstModel] = modelsResult.models;
303722
303829
  if (firstModel) {
303723
303830
  context.setAppState((prev) => ({
303724
303831
  ...prev,
303725
303832
  mainLoopModelOverride: firstModel.id
303726
303833
  }));
303727
303834
  }
303835
+ if (modelsResult.kind === "unavailable") {
303836
+ onDone(getVerbooModelsUnavailableMessage(modelsResult.reason), {
303837
+ display: "system"
303838
+ });
303839
+ return;
303840
+ }
303728
303841
  }
303729
303842
  }
303730
303843
  onDone("Sessão já está válida.");
@@ -303754,12 +303867,16 @@ async function call2(onDone, context) {
303754
303867
  markVerbooSessionValidated();
303755
303868
  const storedTokens = await getClaudeAIOAuthTokensAsync();
303756
303869
  if (storedTokens?.accessToken) {
303757
- const models = await checkVerbooModels(storedTokens.accessToken);
303758
- if (models.length === 0) {
303870
+ const modelsResult = await checkVerbooModels(storedTokens.accessToken);
303871
+ if (modelsResult.kind === "unavailable") {
303872
+ onDone(`Login concluído. ${getVerbooModelsUnavailableMessage(modelsResult.reason)}`, { display: "system" });
303873
+ return;
303874
+ }
303875
+ if (modelsResult.kind === "empty") {
303759
303876
  onDone(getNoVerbooModelsMessage2().trim(), { display: "system" });
303760
303877
  return;
303761
303878
  }
303762
- const [firstModel] = models;
303879
+ const [firstModel] = modelsResult.models;
303763
303880
  context.setAppState((prev) => ({
303764
303881
  ...prev,
303765
303882
  mainLoopModelOverride: firstModel.id
@@ -303785,6 +303902,10 @@ function Login(props) {
303785
303902
  props.onDone({ type: "ready", refreshed: result.refreshed }, mainLoopModel);
303786
303903
  return;
303787
303904
  }
303905
+ if (result.kind === "degraded") {
303906
+ props.onDone({ type: "unavailable", reason: result.reason }, mainLoopModel);
303907
+ return;
303908
+ }
303788
303909
  setPreflightDone(true);
303789
303910
  }).catch(() => {
303790
303911
  if (!cancelled)
@@ -303803,8 +303924,12 @@ function Login(props) {
303803
303924
  markVerbooSessionValidated();
303804
303925
  const storedTokens = await getClaudeAIOAuthTokensAsync();
303805
303926
  if (storedTokens?.accessToken) {
303806
- const models = await checkVerbooModels(storedTokens.accessToken);
303807
- if (models.length === 0) {
303927
+ const modelsResult = await checkVerbooModels(storedTokens.accessToken);
303928
+ if (modelsResult.kind === "unavailable") {
303929
+ props.onDone({ type: "unavailable", reason: modelsResult.reason }, mainLoopModel);
303930
+ return;
303931
+ }
303932
+ if (modelsResult.kind === "empty") {
303808
303933
  setPostLoginToken(storedTokens.accessToken);
303809
303934
  return;
303810
303935
  }
@@ -303814,8 +303939,12 @@ function Login(props) {
303814
303939
  }, [mainLoopModel, props]);
303815
303940
  const handlePurchaseDone = React31.useCallback(async (success2) => {
303816
303941
  if (success2 && postLoginToken) {
303817
- const models = await checkVerbooModels(postLoginToken);
303818
- if (models.length > 0) {
303942
+ const modelsResult = await checkVerbooModels(postLoginToken);
303943
+ if (modelsResult.kind === "unavailable") {
303944
+ props.onDone({ type: "unavailable", reason: modelsResult.reason }, mainLoopModel);
303945
+ return;
303946
+ }
303947
+ if (modelsResult.kind === "available") {
303819
303948
  props.onDone({ type: "ready", refreshed: true }, mainLoopModel);
303820
303949
  return;
303821
303950
  }
@@ -393857,7 +393986,7 @@ function getAnthropicEnvMetadata() {
393857
393986
  function getBuildAgeMinutes() {
393858
393987
  if (false)
393859
393988
  ;
393860
- const buildTime = new Date("2026-07-14T19:32:10.376Z").getTime();
393989
+ const buildTime = new Date("2026-07-15T02:08:38.282Z").getTime();
393861
393990
  if (isNaN(buildTime))
393862
393991
  return;
393863
393992
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -422112,7 +422241,7 @@ function buildPrimarySection() {
422112
422241
  });
422113
422242
  return [{
422114
422243
  label: "Version",
422115
- value: "0.13.1"
422244
+ value: "0.13.3"
422116
422245
  }, {
422117
422246
  label: "Session name",
422118
422247
  value: nameValue
@@ -435041,7 +435170,7 @@ function getReleaseTagUrl(version2 = publicBuildVersion) {
435041
435170
  return `${VERBOO_RELEASES_URL}/tag/v${normalizePublicVersion(version2)}`;
435042
435171
  }
435043
435172
  function getPublicBuildVersion() {
435044
- return "0.13.1";
435173
+ return "0.13.3";
435045
435174
  }
435046
435175
  var import_semver10, VERBOO_RELEASES_URL = "https://github.com/verbeux-ai/code/releases", fallbackBuildVersion, publicBuildVersion;
435047
435176
  var init_version = __esm(() => {
@@ -486300,7 +486429,7 @@ var init_bridge_kick = __esm(() => {
486300
486429
  var call63 = async () => {
486301
486430
  return {
486302
486431
  type: "text",
486303
- value: `${"99.0.0"} (built ${"2026-07-14T19:32:10.376Z"})`
486432
+ value: `${"99.0.0"} (built ${"2026-07-15T02:08:38.282Z"})`
486304
486433
  };
486305
486434
  }, version2, version_default;
486306
486435
  var init_version2 = __esm(() => {
@@ -519373,7 +519502,7 @@ function printStartupScreen(modelOverride) {
519373
519502
  const home = process.env.HOME || process.env.USERPROFILE || "";
519374
519503
  const cwd2 = process.cwd();
519375
519504
  const displayCwd = home && cwd2.startsWith(home) ? `~${cwd2.slice(home.length)}` : cwd2;
519376
- const version3 = "0.13.1";
519505
+ const version3 = "0.13.3";
519377
519506
  const bold2 = `${ESC4}1m`;
519378
519507
  const PURPLE = rgb3(...ACCENT);
519379
519508
  const SOFT = rgb3(...CREAM);
@@ -537665,7 +537794,7 @@ var init_routerRateLimitHook = __esm(() => {
537665
537794
  function getSemverPart(version3) {
537666
537795
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
537667
537796
  }
537668
- function useUpdateNotification(updatedVersion, initialVersion = "0.13.1") {
537797
+ function useUpdateNotification(updatedVersion, initialVersion = "0.13.3") {
537669
537798
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
537670
537799
  const [pendingNotification2, setPendingNotification] = import_react225.useState(null);
537671
537800
  if (updatedVersion) {
@@ -537705,7 +537834,7 @@ function AutoUpdater({
537705
537834
  return;
537706
537835
  }
537707
537836
  if (false) {}
537708
- const currentVersion = "0.13.1";
537837
+ const currentVersion = "0.13.3";
537709
537838
  const channel2 = getInitialSettings()?.autoUpdatesChannel ?? "latest";
537710
537839
  let latestVersion = await getLatestVersion(channel2);
537711
537840
  const isDisabled = isAutoUpdaterDisabled();
@@ -538058,17 +538187,17 @@ function PackageManagerAutoUpdater(t0) {
538058
538187
  const maxVersion = await getMaxVersion();
538059
538188
  if (maxVersion && latest && gt(latest, maxVersion)) {
538060
538189
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
538061
- if (gte("0.13.1", maxVersion)) {
538062
- logForDebugging(`PackageManagerAutoUpdater: current version ${"0.13.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
538190
+ if (gte("0.13.3", maxVersion)) {
538191
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"0.13.3"} is already at or above maxVersion ${maxVersion}, skipping update`);
538063
538192
  setUpdateAvailable(false);
538064
538193
  return;
538065
538194
  }
538066
538195
  latest = maxVersion;
538067
538196
  }
538068
- const hasUpdate = latest && !gte("0.13.1", latest) && !shouldSkipVersion(latest);
538197
+ const hasUpdate = latest && !gte("0.13.3", latest) && !shouldSkipVersion(latest);
538069
538198
  setUpdateAvailable(!!hasUpdate);
538070
538199
  if (hasUpdate) {
538071
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"0.13.1"} -> ${latest}`);
538200
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"0.13.3"} -> ${latest}`);
538072
538201
  }
538073
538202
  };
538074
538203
  $2[0] = t1;
@@ -538102,7 +538231,7 @@ function PackageManagerAutoUpdater(t0) {
538102
538231
  wrap: "truncate",
538103
538232
  children: [
538104
538233
  "currentVersion: ",
538105
- "0.13.1"
538234
+ "0.13.3"
538106
538235
  ]
538107
538236
  });
538108
538237
  $2[3] = verbose;
@@ -554053,10 +554182,10 @@ async function autoUpdateCliInBackground() {
554053
554182
  return;
554054
554183
  const channel2 = getInitialSettings()?.autoUpdatesChannel ?? "latest";
554055
554184
  const latest = await getLatestVersion(channel2);
554056
- if (!latest || gte("0.13.1", latest))
554185
+ if (!latest || gte("0.13.3", latest))
554057
554186
  return;
554058
554187
  writeToStdout(`
554059
- Nova versão disponível: ${latest} (atual: ${"0.13.1"})
554188
+ Nova versão disponível: ${latest} (atual: ${"0.13.3"})
554060
554189
  `);
554061
554190
  writeToStdout(`Atualizando automaticamente...
554062
554191
  `);
@@ -571750,7 +571879,7 @@ function WelcomeV2() {
571750
571879
  dimColor: true,
571751
571880
  children: [
571752
571881
  "v",
571753
- "0.13.1",
571882
+ "0.13.3",
571754
571883
  " "
571755
571884
  ]
571756
571885
  })
@@ -571937,7 +572066,7 @@ function WelcomeV2() {
571937
572066
  dimColor: true,
571938
572067
  children: [
571939
572068
  "v",
571940
- "0.13.1",
572069
+ "0.13.3",
571941
572070
  " "
571942
572071
  ]
571943
572072
  })
@@ -572153,7 +572282,7 @@ function AppleTerminalWelcomeV2(t0) {
572153
572282
  dimColor: true,
572154
572283
  children: [
572155
572284
  "v",
572156
- "0.13.1",
572285
+ "0.13.3",
572157
572286
  " "
572158
572287
  ]
572159
572288
  });
@@ -572362,7 +572491,7 @@ function AppleTerminalWelcomeV2(t0) {
572362
572491
  dimColor: true,
572363
572492
  children: [
572364
572493
  "v",
572365
- "0.13.1",
572494
+ "0.13.3",
572366
572495
  " "
572367
572496
  ]
572368
572497
  });
@@ -589764,7 +589893,7 @@ __export(exports_update, {
589764
589893
  });
589765
589894
  async function update() {
589766
589895
  logEvent("tengu_update_check", {});
589767
- writeToStdout(`Current version: ${"0.13.1"}
589896
+ writeToStdout(`Current version: ${"0.13.3"}
589768
589897
  `);
589769
589898
  const channel2 = getInitialSettings()?.autoUpdatesChannel ?? "latest";
589770
589899
  writeToStdout(`Checking for updates to ${channel2} version...
@@ -589849,8 +589978,8 @@ async function update() {
589849
589978
  writeToStdout(`Verboo Code is managed by Homebrew.
589850
589979
  `);
589851
589980
  const latest = await getLatestVersion(channel2);
589852
- if (latest && !gte("0.13.1", latest)) {
589853
- writeToStdout(`Update available: ${"0.13.1"} → ${latest}
589981
+ if (latest && !gte("0.13.3", latest)) {
589982
+ writeToStdout(`Update available: ${"0.13.3"} → ${latest}
589854
589983
  `);
589855
589984
  writeToStdout(`
589856
589985
  `);
@@ -589866,8 +589995,8 @@ async function update() {
589866
589995
  writeToStdout(`Verboo Code is managed by winget.
589867
589996
  `);
589868
589997
  const latest = await getLatestVersion(channel2);
589869
- if (latest && !gte("0.13.1", latest)) {
589870
- writeToStdout(`Update available: ${"0.13.1"} → ${latest}
589998
+ if (latest && !gte("0.13.3", latest)) {
589999
+ writeToStdout(`Update available: ${"0.13.3"} → ${latest}
589871
590000
  `);
589872
590001
  writeToStdout(`
589873
590002
  `);
@@ -589883,8 +590012,8 @@ async function update() {
589883
590012
  writeToStdout(`Verboo Code is managed by apk.
589884
590013
  `);
589885
590014
  const latest = await getLatestVersion(channel2);
589886
- if (latest && !gte("0.13.1", latest)) {
589887
- writeToStdout(`Update available: ${"0.13.1"} → ${latest}
590015
+ if (latest && !gte("0.13.3", latest)) {
590016
+ writeToStdout(`Update available: ${"0.13.3"} → ${latest}
589888
590017
  `);
589889
590018
  writeToStdout(`
589890
590019
  `);
@@ -589937,11 +590066,11 @@ async function update() {
589937
590066
  `);
589938
590067
  await gracefulShutdown(1);
589939
590068
  }
589940
- if (result.latestVersion === "0.13.1") {
589941
- writeToStdout(source_default.green(`Verboo Code is up to date (${"0.13.1"})`) + `
590069
+ if (result.latestVersion === "0.13.3") {
590070
+ writeToStdout(source_default.green(`Verboo Code is up to date (${"0.13.3"})`) + `
589942
590071
  `);
589943
590072
  } else {
589944
- writeToStdout(source_default.green(`Successfully updated from ${"0.13.1"} to version ${result.latestVersion}`) + `
590073
+ writeToStdout(source_default.green(`Successfully updated from ${"0.13.3"} to version ${result.latestVersion}`) + `
589945
590074
  `);
589946
590075
  await regenerateCompletionCache();
589947
590076
  }
@@ -590001,12 +590130,12 @@ async function update() {
590001
590130
  `);
590002
590131
  await gracefulShutdown(1);
590003
590132
  }
590004
- if (latestVersion === "0.13.1") {
590005
- writeToStdout(source_default.green(`Verboo Code is up to date (${"0.13.1"})`) + `
590133
+ if (latestVersion === "0.13.3") {
590134
+ writeToStdout(source_default.green(`Verboo Code is up to date (${"0.13.3"})`) + `
590006
590135
  `);
590007
590136
  await gracefulShutdown(0);
590008
590137
  }
590009
- writeToStdout(`New version available: ${latestVersion} (current: ${"0.13.1"})
590138
+ writeToStdout(`New version available: ${latestVersion} (current: ${"0.13.3"})
590010
590139
  `);
590011
590140
  writeToStdout(`Installing update...
590012
590141
  `);
@@ -590051,7 +590180,7 @@ async function update() {
590051
590180
  logForDebugging(`update: Installation status: ${status2}`);
590052
590181
  switch (status2) {
590053
590182
  case "success":
590054
- writeToStdout(source_default.green(`Successfully updated from ${"0.13.1"} to version ${latestVersion}`) + `
590183
+ writeToStdout(source_default.green(`Successfully updated from ${"0.13.3"} to version ${latestVersion}`) + `
590055
590184
  `);
590056
590185
  await regenerateCompletionCache();
590057
590186
  break;
@@ -591306,7 +591435,7 @@ ${customInstructions}` : customInstructions;
591306
591435
  is_native_binary: isInBundledMode()
591307
591436
  });
591308
591437
  logMemoryDiagnostics("start", {
591309
- version: "0.13.1",
591438
+ version: "0.13.3",
591310
591439
  debug: debug2,
591311
591440
  debugToStderr,
591312
591441
  print: print ?? false,
@@ -592117,7 +592246,7 @@ Usage: verboo --remote "your task description"`, () => gracefulShutdown(1));
592117
592246
  pendingHookMessages
592118
592247
  }, renderAndRun);
592119
592248
  }
592120
- }).version(`0.13.1 (${cliDesc})`, "-v, --version", "Output the version number");
592249
+ }).version(`0.13.3 (${cliDesc})`, "-v, --version", "Output the version number");
592121
592250
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
592122
592251
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
592123
592252
  if (canUserConfigureAdvisor()) {
@@ -592692,7 +592821,7 @@ if (false) {}
592692
592821
  async function main2() {
592693
592822
  const args = process.argv.slice(2);
592694
592823
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
592695
- console.log(`${"0.13.1"} (Verboo Code)`);
592824
+ console.log(`${"0.13.3"} (Verboo Code)`);
592696
592825
  return;
592697
592826
  }
592698
592827
  if (!IS_VERBOO_CLI && args.includes("--provider")) {
@@ -592866,4 +592995,4 @@ async function main2() {
592866
592995
  }
592867
592996
  main2();
592868
592997
 
592869
- //# debugId=D352A9BC9A72F93D64756E2164756E21
592998
+ //# debugId=9B94BFBFDE46F31464756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verboo/code",
3
- "version": "0.13.1",
3
+ "version": "0.13.3",
4
4
  "description": "Verboo Code — coding agent for the Verboo platform",
5
5
  "type": "module",
6
6
  "bin": {