claudish 14.10.2 → 14.11.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.
Files changed (2) hide show
  1. package/dist/index.js +614 -168
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -5491,7 +5491,7 @@ var init_onepassword_config = __esm(() => {
5491
5491
  });
5492
5492
 
5493
5493
  // src/version.ts
5494
- var VERSION = "14.10.2";
5494
+ var VERSION = "14.11.0";
5495
5495
 
5496
5496
  // src/redact.ts
5497
5497
  function isPlaceholder(value) {
@@ -26267,6 +26267,7 @@ var init_antigravity_token = __esm(() => {
26267
26267
  var exports_antigravity_user = {};
26268
26268
  __export(exports_antigravity_user, {
26269
26269
  antigravityHost: () => antigravityHost,
26270
+ antigravityUserAgentFor: () => antigravityUserAgentFor,
26270
26271
  buildAntigravityUserAgent: () => buildAntigravityUserAgent,
26271
26272
  fetchAntigravityAvailableModelsRaw: () => fetchAntigravityAvailableModelsRaw,
26272
26273
  getAntigravityTierDisplayName: () => getAntigravityTierDisplayName,
@@ -26299,6 +26300,9 @@ function antigravityClientVersion() {
26299
26300
  function userAgentFor(version) {
26300
26301
  return `antigravity/cli/${version} (aidev_client; os_type=${process.platform}; arch=${process.arch}; auth_method=consumer)`;
26301
26302
  }
26303
+ function antigravityUserAgentFor(version) {
26304
+ return userAgentFor(version);
26305
+ }
26302
26306
  function buildAntigravityUserAgent() {
26303
26307
  return userAgentFor(antigravityClientVersion());
26304
26308
  }
@@ -90429,6 +90433,10 @@ ${h("SUBCOMMANDS")}
90429
90433
  ${green("claudish subscription models antigravity")} ${yellow("--raw --json")}
90430
90434
  Print the raw Antigravity fetchAvailableModels
90431
90435
  ${dim("body as one JSON line (for models-index)")}
90436
+ ${green("claudish subscription probe antigravity")} ${yellow("--model <id> --request-file <path> --raw --json")}
90437
+ Send the file's Gemini request once through the
90438
+ Antigravity login (generateContent, no retry, model
90439
+ ${dim("id unchanged); print the raw answer as one JSON line")}
90432
90440
  ${green("claudish update")} Check for updates and install the latest version
90433
90441
 
90434
90442
  ${bold("Profiles:")}
@@ -104456,68 +104464,20 @@ var init_keychain_command = __esm(() => {
104456
104464
  VALUE_FLAGS = new Set(["--config", "--from", "--only"]);
104457
104465
  });
104458
104466
 
104459
- // src/subscription-models-command.ts
104460
- var exports_subscription_models_command = {};
104461
- __export(exports_subscription_models_command, {
104462
- EXIT: () => EXIT,
104463
- FAILURE_CODES: () => FAILURE_CODES,
104464
- INTERNAL_ERROR_MESSAGE: () => INTERNAL_ERROR_MESSAGE,
104465
- SECRET_GUARD_MESSAGE: () => SECRET_GUARD_MESSAGE,
104466
- SUBSCRIPTION_MODELS_USAGE: () => SUBSCRIPTION_MODELS_USAGE,
104467
- SUBSCRIPTION_MODEL_LIST_SCHEMA: () => SUBSCRIPTION_MODEL_LIST_SCHEMA,
104468
- defaultSubscriptionModelsDeps: () => defaultSubscriptionModelsDeps,
104469
- exitCodeFor: () => exitCodeFor,
104470
- parseSubscriptionModelsArgs: () => parseSubscriptionModelsArgs,
104471
- reportSubscriptionInternalError: () => reportSubscriptionInternalError,
104472
- runAntigravityRawModelList: () => runAntigravityRawModelList,
104473
- subscriptionModelsCommand: () => subscriptionModelsCommand
104474
- });
104475
- function exitCodeFor(failure) {
104476
- if (failure.class === "internal")
104477
- return failure.code === "usage" ? EXIT.usage : EXIT.internal;
104478
- return EXIT[failure.class];
104479
- }
104480
- function defaultSubscriptionModelsDeps() {
104481
- return {
104482
- platform: () => process.platform,
104483
- readStore: readAntigravityStoreClassified,
104484
- tokenDeps: defaultAntigravityTokenDeps,
104485
- now: () => Date.now(),
104486
- httpTimeoutMs: 30000,
104487
- keychainDeadlineMs: 1e4,
104488
- writeStdout: (line) => new Promise((resolve, reject) => {
104489
- process.stdout.write(line, (err) => err ? reject(err) : resolve());
104490
- }),
104491
- writeStderr: (line) => {
104492
- process.stderr.write(line);
104493
- }
104494
- };
104495
- }
104496
- function parseSubscriptionModelsArgs(argv) {
104497
- const positionals = argv.filter((a) => !a.startsWith("-"));
104498
- const flags = argv.filter((a) => a.startsWith("-"));
104499
- const positionalsOk = positionals.length === 2 && positionals[0] === "models" && positionals[1] === "antigravity";
104500
- const flagsOk = flags.length === 2 && flags.includes("--raw") && flags.includes("--json");
104501
- return positionalsOk && flagsOk ? { ok: true, provider: "antigravity" } : { ok: false };
104467
+ // src/subscription-antigravity-session.ts
104468
+ function newSecrets() {
104469
+ return { values: new Set };
104502
104470
  }
104503
104471
  function addSecret(secrets, value) {
104504
104472
  if (typeof value === "string" && value.length > 0)
104505
104473
  secrets.values.add(value);
104506
104474
  }
104507
- function buildEnvelope(facts, failure, body) {
104508
- return {
104509
- schema: SUBSCRIPTION_MODEL_LIST_SCHEMA,
104510
- ...facts.provider !== undefined ? { provider: facts.provider } : {},
104511
- claudishVersion: VERSION,
104512
- ...facts.fetchedAt !== undefined ? { fetchedAt: facts.fetchedAt } : {},
104513
- ...facts.sourceUrl !== undefined ? { sourceUrl: facts.sourceUrl } : {},
104514
- ...facts.clientVersion !== undefined ? { clientVersion: facts.clientVersion } : {},
104515
- ...facts.clientVersionSource !== undefined ? { clientVersionSource: facts.clientVersionSource } : {},
104516
- tokenRefreshed: facts.tokenRefreshed,
104517
- ...facts.httpStatus !== undefined ? { httpStatus: facts.httpStatus } : {},
104518
- ...failure ? { failure } : {},
104519
- ...body !== undefined ? { body } : {}
104520
- };
104475
+ function containsSecret(secrets, ...texts) {
104476
+ for (const secret of secrets.values) {
104477
+ if (texts.some((text) => text?.includes(secret)))
104478
+ return true;
104479
+ }
104480
+ return false;
104521
104481
  }
104522
104482
  function failureOf2(cls, code, httpStatus) {
104523
104483
  return { class: cls, code, ...httpStatus !== undefined ? { httpStatus } : {} };
@@ -104532,6 +104492,19 @@ function stripUserinfo(url) {
104532
104492
  return url.replace(/^([a-z][a-z0-9+.-]*:\/\/)[^@/]*@/i, "$1");
104533
104493
  }
104534
104494
  }
104495
+ async function raceTimeout(work, ms) {
104496
+ let timer;
104497
+ const timedOut = new Promise((resolve) => {
104498
+ timer = setTimeout(() => resolve(TIMED_OUT), ms);
104499
+ });
104500
+ work.catch(() => {});
104501
+ try {
104502
+ return await Promise.race([work, timedOut]);
104503
+ } finally {
104504
+ if (timer)
104505
+ clearTimeout(timer);
104506
+ }
104507
+ }
104535
104508
  function storeReadFailure(read) {
104536
104509
  switch (read.kind) {
104537
104510
  case "absent":
@@ -104574,29 +104547,171 @@ function loadCodeAssistFailure(err) {
104574
104547
  return failureOf2("mint_failed", "load_code_assist_no_project");
104575
104548
  return failureOf2("network", "load_code_assist_network_error");
104576
104549
  }
104550
+ async function obtainAccessToken(deps, facts, secrets, preRaw) {
104551
+ const base = deps.tokenDeps();
104552
+ let firstRead = true;
104553
+ let refreshCalled = false;
104554
+ let refreshOutcome = null;
104555
+ const laterReads = [];
104556
+ const observed = {
104557
+ ...base,
104558
+ readStore: () => {
104559
+ if (firstRead) {
104560
+ firstRead = false;
104561
+ return preRaw;
104562
+ }
104563
+ const raw = base.readStore();
104564
+ if (raw)
104565
+ laterReads.push(raw);
104566
+ return raw;
104567
+ },
104568
+ runAgyRefresh: () => {
104569
+ refreshCalled = true;
104570
+ facts.tokenRefreshed = true;
104571
+ refreshOutcome = base.runAgyRefresh();
104572
+ return refreshOutcome;
104573
+ }
104574
+ };
104575
+ let accessToken;
104576
+ try {
104577
+ accessToken = await getValidAntigravityAccessToken(observed);
104578
+ } catch {
104579
+ return { ok: false, failure: tokenFailure(refreshCalled, refreshOutcome) };
104580
+ }
104581
+ addSecret(secrets, accessToken);
104582
+ for (const raw of [preRaw, ...laterReads]) {
104583
+ addSecret(secrets, raw);
104584
+ addSecret(secrets, readSharedAntigravityToken({ ...base, readStore: () => raw })?.refresh_token);
104585
+ }
104586
+ return { ok: true, accessToken };
104587
+ }
104588
+ async function establishAntigravitySession(deps, secrets, facts) {
104589
+ if (deps.platform() !== "darwin") {
104590
+ return { ok: false, failure: failureOf2("credential_missing", "platform_unsupported") };
104591
+ }
104592
+ const read = await deps.readStore(deps.keychainDeadlineMs);
104593
+ if (read.kind !== "present")
104594
+ return { ok: false, failure: storeReadFailure(read) };
104595
+ addSecret(secrets, read.raw);
104596
+ const token = await obtainAccessToken(deps, facts, secrets, read.raw);
104597
+ if (!token.ok)
104598
+ return token;
104599
+ const version = resolveAntigravityClientVersion();
104600
+ facts.clientVersion = version.version;
104601
+ facts.clientVersionSource = version.source;
104602
+ let projectId;
104603
+ let tierId;
104604
+ try {
104605
+ const setup = await raceTimeout(setupAntigravityUser(token.accessToken), deps.httpTimeoutMs);
104606
+ if (setup === TIMED_OUT) {
104607
+ return { ok: false, failure: failureOf2("network", "load_code_assist_timeout") };
104608
+ }
104609
+ projectId = setup.projectId;
104610
+ tierId = setup.tierId;
104611
+ } catch (err) {
104612
+ return { ok: false, failure: loadCodeAssistFailure(err) };
104613
+ }
104614
+ addSecret(secrets, projectId);
104615
+ return { ok: true, accessToken: token.accessToken, projectId, tierId };
104616
+ }
104617
+ var SESSION_FAILURE_CODES, TIMED_OUT;
104618
+ var init_subscription_antigravity_session = __esm(() => {
104619
+ init_antigravity_token();
104620
+ init_antigravity_user();
104621
+ SESSION_FAILURE_CODES = {
104622
+ credential_missing: ["platform_unsupported", "keychain_item_absent", "token_unparseable"],
104623
+ keychain_locked: ["keychain_locked", "keychain_read_timeout", "keychain_read_failed"],
104624
+ mint_failed: [
104625
+ "agy_missing",
104626
+ "agy_refresh_failed",
104627
+ "agy_refresh_timeout",
104628
+ "agy_refresh_no_valid_token",
104629
+ "load_code_assist_4xx",
104630
+ "load_code_assist_no_project",
104631
+ "load_code_assist_bad_body"
104632
+ ],
104633
+ network: [
104634
+ "load_code_assist_network_error",
104635
+ "load_code_assist_429",
104636
+ "load_code_assist_5xx",
104637
+ "load_code_assist_timeout"
104638
+ ]
104639
+ };
104640
+ TIMED_OUT = Symbol("timed-out");
104641
+ });
104642
+
104643
+ // src/subscription-models-command.ts
104644
+ var exports_subscription_models_command = {};
104645
+ __export(exports_subscription_models_command, {
104646
+ EXIT: () => EXIT,
104647
+ FAILURE_CODES: () => FAILURE_CODES,
104648
+ INTERNAL_ERROR_MESSAGE: () => INTERNAL_ERROR_MESSAGE,
104649
+ SECRET_GUARD_MESSAGE: () => SECRET_GUARD_MESSAGE,
104650
+ SUBSCRIPTION_MODELS_USAGE: () => SUBSCRIPTION_MODELS_USAGE,
104651
+ SUBSCRIPTION_MODEL_LIST_SCHEMA: () => SUBSCRIPTION_MODEL_LIST_SCHEMA,
104652
+ defaultSubscriptionModelsDeps: () => defaultSubscriptionModelsDeps,
104653
+ exitCodeFor: () => exitCodeFor,
104654
+ parseSubscriptionModelsArgs: () => parseSubscriptionModelsArgs,
104655
+ reportSubscriptionInternalError: () => reportSubscriptionInternalError,
104656
+ runAntigravityRawModelList: () => runAntigravityRawModelList,
104657
+ subscriptionModelsCommand: () => subscriptionModelsCommand
104658
+ });
104659
+ function exitCodeFor(failure) {
104660
+ if (failure.class === "internal")
104661
+ return failure.code === "usage" ? EXIT.usage : EXIT.internal;
104662
+ return EXIT[failure.class];
104663
+ }
104664
+ function defaultSubscriptionModelsDeps() {
104665
+ return {
104666
+ platform: () => process.platform,
104667
+ readStore: readAntigravityStoreClassified,
104668
+ tokenDeps: defaultAntigravityTokenDeps,
104669
+ now: () => Date.now(),
104670
+ httpTimeoutMs: 30000,
104671
+ keychainDeadlineMs: 1e4,
104672
+ writeStdout: (line) => new Promise((resolve, reject) => {
104673
+ process.stdout.write(line, (err) => err ? reject(err) : resolve());
104674
+ }),
104675
+ writeStderr: (line) => {
104676
+ process.stderr.write(line);
104677
+ }
104678
+ };
104679
+ }
104680
+ function parseSubscriptionModelsArgs(argv) {
104681
+ const positionals = argv.filter((a) => !a.startsWith("-"));
104682
+ const flags = argv.filter((a) => a.startsWith("-"));
104683
+ const positionalsOk = positionals.length === 2 && positionals[0] === "models" && positionals[1] === "antigravity";
104684
+ const flagsOk = flags.length === 2 && flags.includes("--raw") && flags.includes("--json");
104685
+ return positionalsOk && flagsOk ? { ok: true, provider: "antigravity" } : { ok: false };
104686
+ }
104687
+ function buildEnvelope(facts, failure, body) {
104688
+ return {
104689
+ schema: SUBSCRIPTION_MODEL_LIST_SCHEMA,
104690
+ ...facts.provider !== undefined ? { provider: facts.provider } : {},
104691
+ claudishVersion: VERSION,
104692
+ ...facts.fetchedAt !== undefined ? { fetchedAt: facts.fetchedAt } : {},
104693
+ ...facts.sourceUrl !== undefined ? { sourceUrl: facts.sourceUrl } : {},
104694
+ ...facts.clientVersion !== undefined ? { clientVersion: facts.clientVersion } : {},
104695
+ ...facts.clientVersionSource !== undefined ? { clientVersionSource: facts.clientVersionSource } : {},
104696
+ tokenRefreshed: facts.tokenRefreshed,
104697
+ ...facts.httpStatus !== undefined ? { httpStatus: facts.httpStatus } : {},
104698
+ ...failure ? { failure } : {},
104699
+ ...body !== undefined ? { body } : {}
104700
+ };
104701
+ }
104702
+ function failureOf3(cls, code, httpStatus) {
104703
+ return failureOf2(cls, code, httpStatus);
104704
+ }
104577
104705
  function listFailure(value, status) {
104578
104706
  const models = value !== null && typeof value === "object" && !Array.isArray(value) ? value.models : undefined;
104579
104707
  if (models === null || typeof models !== "object" || Array.isArray(models)) {
104580
- return failureOf2("list_incomplete", "models_absent", status);
104708
+ return failureOf3("list_incomplete", "models_absent", status);
104581
104709
  }
104582
104710
  if (Object.keys(models).length === 0) {
104583
- return failureOf2("list_incomplete", "models_empty", status);
104711
+ return failureOf3("list_incomplete", "models_empty", status);
104584
104712
  }
104585
104713
  return null;
104586
104714
  }
104587
- async function raceTimeout(work, ms) {
104588
- let timer;
104589
- const timedOut = new Promise((resolve) => {
104590
- timer = setTimeout(() => resolve(TIMED_OUT), ms);
104591
- });
104592
- work.catch(() => {});
104593
- try {
104594
- return await Promise.race([work, timedOut]);
104595
- } finally {
104596
- if (timer)
104597
- clearTimeout(timer);
104598
- }
104599
- }
104600
104715
  function fail(facts, failure) {
104601
104716
  return { envelope: buildEnvelope(facts, failure), exitCode: exitCodeFor(failure) };
104602
104717
  }
@@ -104604,20 +104719,13 @@ function lineOf(envelope) {
104604
104719
  return `${JSON.stringify(envelope)}
104605
104720
  `;
104606
104721
  }
104607
- function containsSecret(secrets, ...texts) {
104608
- for (const secret of secrets.values) {
104609
- if (texts.some((text) => text?.includes(secret)))
104610
- return true;
104611
- }
104612
- return false;
104613
- }
104614
104722
  function safeStderr(deps, line) {
104615
104723
  try {
104616
104724
  deps.writeStderr(line);
104617
104725
  } catch {}
104618
104726
  }
104619
104727
  async function writeInternalFailure(deps, facts, code, stderrLine, secrets) {
104620
- const failure = failureOf2("internal", code);
104728
+ const failure = failureOf3("internal", code);
104621
104729
  safeStderr(deps, `${stderrLine}
104622
104730
  `);
104623
104731
  const line = lineOf(buildEnvelope(facts, failure));
@@ -104639,51 +104747,13 @@ async function reportSubscriptionInternalError(deps) {
104639
104747
  }
104640
104748
  return writeInternalFailure(resolved, { tokenRefreshed: false }, "internal_error", INTERNAL_ERROR_MESSAGE);
104641
104749
  }
104642
- async function obtainAccessToken(deps, facts, secrets, preRaw) {
104643
- const base = deps.tokenDeps();
104644
- let firstRead = true;
104645
- let refreshCalled = false;
104646
- let refreshOutcome = null;
104647
- const laterReads = [];
104648
- const observed = {
104649
- ...base,
104650
- readStore: () => {
104651
- if (firstRead) {
104652
- firstRead = false;
104653
- return preRaw;
104654
- }
104655
- const raw = base.readStore();
104656
- if (raw)
104657
- laterReads.push(raw);
104658
- return raw;
104659
- },
104660
- runAgyRefresh: () => {
104661
- refreshCalled = true;
104662
- facts.tokenRefreshed = true;
104663
- refreshOutcome = base.runAgyRefresh();
104664
- return refreshOutcome;
104665
- }
104666
- };
104667
- let accessToken;
104668
- try {
104669
- accessToken = await getValidAntigravityAccessToken(observed);
104670
- } catch {
104671
- return { ok: false, result: fail(facts, tokenFailure(refreshCalled, refreshOutcome)) };
104672
- }
104673
- addSecret(secrets, accessToken);
104674
- for (const raw of [preRaw, ...laterReads]) {
104675
- addSecret(secrets, raw);
104676
- addSecret(secrets, readSharedAntigravityToken({ ...base, readStore: () => raw })?.refresh_token);
104677
- }
104678
- return { ok: true, accessToken };
104679
- }
104680
104750
  function classifyAvailableModels(facts, raw, timedOut) {
104681
104751
  facts.sourceUrl = stripUserinfo(raw.url);
104682
104752
  facts.clientVersion = raw.clientVersion;
104683
104753
  facts.clientVersionSource = raw.clientVersionSource;
104684
104754
  const networkCode = timedOut ? "fetch_available_models_timeout" : "fetch_available_models_network_error";
104685
104755
  if (raw.kind === "unreachable")
104686
- return fail(facts, failureOf2("network", networkCode));
104756
+ return fail(facts, failureOf3("network", networkCode));
104687
104757
  facts.fetchedAt = raw.fetchedAt;
104688
104758
  facts.httpStatus = raw.status;
104689
104759
  if (raw.status < 200 || raw.status >= 300) {
@@ -104701,39 +104771,20 @@ function classifyAvailableModels(facts, raw, timedOut) {
104701
104771
  };
104702
104772
  }
104703
104773
  case "not-json":
104704
- return fail(facts, failureOf2("list_incomplete", "body_not_json", raw.status));
104774
+ return fail(facts, failureOf3("list_incomplete", "body_not_json", raw.status));
104705
104775
  default:
104706
- return fail(facts, failureOf2("network", networkCode, raw.status));
104776
+ return fail(facts, failureOf3("network", networkCode, raw.status));
104707
104777
  }
104708
104778
  }
104709
104779
  async function determine(deps, secrets, facts) {
104710
- if (deps.platform() !== "darwin") {
104711
- return fail(facts, failureOf2("credential_missing", "platform_unsupported"));
104712
- }
104713
- const read = await deps.readStore(deps.keychainDeadlineMs);
104714
- if (read.kind !== "present")
104715
- return fail(facts, storeReadFailure(read));
104716
- addSecret(secrets, read.raw);
104717
- const token = await obtainAccessToken(deps, facts, secrets, read.raw);
104718
- if (!token.ok)
104719
- return token.result;
104720
- const version = resolveAntigravityClientVersion();
104721
- facts.clientVersion = version.version;
104722
- facts.clientVersionSource = version.source;
104723
- let projectId;
104724
- try {
104725
- const setup = await raceTimeout(setupAntigravityUser(token.accessToken), deps.httpTimeoutMs);
104726
- if (setup === TIMED_OUT)
104727
- return fail(facts, failureOf2("network", "load_code_assist_timeout"));
104728
- projectId = setup.projectId;
104729
- } catch (err) {
104730
- return fail(facts, loadCodeAssistFailure(err));
104731
- }
104732
- addSecret(secrets, projectId);
104780
+ const session = await establishAntigravitySession(deps, secrets, facts);
104781
+ if (!session.ok)
104782
+ return fail(facts, session.failure);
104783
+ const { accessToken, projectId } = session;
104733
104784
  const controller = new AbortController;
104734
104785
  const timer = setTimeout(() => controller.abort(), deps.httpTimeoutMs);
104735
104786
  try {
104736
- const raw = await fetchAntigravityAvailableModelsRaw(token.accessToken, projectId, {
104787
+ const raw = await fetchAntigravityAvailableModelsRaw(accessToken, projectId, {
104737
104788
  signal: controller.signal,
104738
104789
  now: deps.now
104739
104790
  });
@@ -104743,7 +104794,7 @@ async function determine(deps, secrets, facts) {
104743
104794
  }
104744
104795
  }
104745
104796
  async function runAntigravityRawModelList(deps) {
104746
- const secrets = { values: new Set };
104797
+ const secrets = newSecrets();
104747
104798
  const facts = { provider: "antigravity", tokenRefreshed: false };
104748
104799
  let line;
104749
104800
  let exitCode;
@@ -104774,27 +104825,17 @@ async function subscriptionModelsCommand(argv, deps = defaultSubscriptionModelsD
104774
104825
  }
104775
104826
  return runAntigravityRawModelList(deps);
104776
104827
  }
104777
- var SUBSCRIPTION_MODEL_LIST_SCHEMA = "claudish.subscription-model-list.v1", FAILURE_CODES, EXIT, SUBSCRIPTION_MODELS_USAGE = "usage: claudish subscription models antigravity --raw --json", SECRET_GUARD_MESSAGE = "[claudish subscription] refused: output contained a credential value", INTERNAL_ERROR_MESSAGE = "[claudish subscription] internal error", TIMED_OUT;
104828
+ var SUBSCRIPTION_MODEL_LIST_SCHEMA = "claudish.subscription-model-list.v1", FAILURE_CODES, EXIT, SUBSCRIPTION_MODELS_USAGE = "usage: claudish subscription models antigravity --raw --json", SECRET_GUARD_MESSAGE = "[claudish subscription] refused: output contained a credential value", INTERNAL_ERROR_MESSAGE = "[claudish subscription] internal error";
104778
104829
  var init_subscription_models_command = __esm(() => {
104779
104830
  init_antigravity_token();
104780
104831
  init_antigravity_user();
104832
+ init_subscription_antigravity_session();
104781
104833
  FAILURE_CODES = {
104782
- credential_missing: ["platform_unsupported", "keychain_item_absent", "token_unparseable"],
104783
- keychain_locked: ["keychain_locked", "keychain_read_timeout", "keychain_read_failed"],
104784
- mint_failed: [
104785
- "agy_missing",
104786
- "agy_refresh_failed",
104787
- "agy_refresh_timeout",
104788
- "agy_refresh_no_valid_token",
104789
- "load_code_assist_4xx",
104790
- "load_code_assist_no_project",
104791
- "load_code_assist_bad_body"
104792
- ],
104834
+ credential_missing: SESSION_FAILURE_CODES.credential_missing,
104835
+ keychain_locked: SESSION_FAILURE_CODES.keychain_locked,
104836
+ mint_failed: SESSION_FAILURE_CODES.mint_failed,
104793
104837
  network: [
104794
- "load_code_assist_network_error",
104795
- "load_code_assist_429",
104796
- "load_code_assist_5xx",
104797
- "load_code_assist_timeout",
104838
+ ...SESSION_FAILURE_CODES.network,
104798
104839
  "fetch_available_models_network_error",
104799
104840
  "fetch_available_models_timeout"
104800
104841
  ],
@@ -104811,7 +104852,399 @@ var init_subscription_models_command = __esm(() => {
104811
104852
  network: 6,
104812
104853
  list_incomplete: 7
104813
104854
  };
104814
- TIMED_OUT = Symbol("timed-out");
104855
+ });
104856
+
104857
+ // src/subscription-dispatch.ts
104858
+ function isSubscriptionProbeArgv(argv) {
104859
+ for (let i = 0;i < argv.length; i++) {
104860
+ const token = argv[i];
104861
+ if (token === "--model" || token === "--request-file") {
104862
+ if (argv[i + 1] !== undefined && !argv[i + 1].startsWith("-"))
104863
+ i++;
104864
+ } else if (!token.startsWith("-")) {
104865
+ return token === "probe";
104866
+ }
104867
+ }
104868
+ return false;
104869
+ }
104870
+ function probeLoadFailureLine() {
104871
+ return `${JSON.stringify({
104872
+ schema: SUBSCRIPTION_PROBE_SCHEMA,
104873
+ claudishVersion: VERSION,
104874
+ tokenRefreshed: false,
104875
+ failure: { class: "internal", code: "internal_error" }
104876
+ })}
104877
+ `;
104878
+ }
104879
+ var SUBSCRIPTION_PROBE_SCHEMA = "claudish.subscription-probe.v1";
104880
+ var init_subscription_dispatch = () => {};
104881
+
104882
+ // src/subscription-probe-command.ts
104883
+ var exports_subscription_probe_command = {};
104884
+ __export(exports_subscription_probe_command, {
104885
+ MAX_UNESCAPE_ROUNDS: () => MAX_UNESCAPE_ROUNDS,
104886
+ PROBE_BODY_CAP_BYTES: () => PROBE_BODY_CAP_BYTES,
104887
+ PROBE_EXIT: () => PROBE_EXIT,
104888
+ PROBE_FAILURE_CODES: () => PROBE_FAILURE_CODES,
104889
+ PROBE_REQUEST_FILE_CAP_BYTES: () => PROBE_REQUEST_FILE_CAP_BYTES,
104890
+ PROBE_REQUEST_FILE_MESSAGE: () => PROBE_REQUEST_FILE_MESSAGE,
104891
+ REDACTED: () => REDACTED2,
104892
+ SUBSCRIPTION_PROBE_SCHEMA: () => SUBSCRIPTION_PROBE_SCHEMA,
104893
+ SUBSCRIPTION_PROBE_USAGE: () => SUBSCRIPTION_PROBE_USAGE,
104894
+ buildProbeEnvelopeBody: () => buildProbeEnvelopeBody,
104895
+ defaultSubscriptionProbeDeps: () => defaultSubscriptionProbeDeps,
104896
+ isSubscriptionProbeArgv: () => isSubscriptionProbeArgv,
104897
+ jsonUnescapedForms: () => jsonUnescapedForms,
104898
+ parseSubscriptionProbeArgs: () => parseSubscriptionProbeArgs,
104899
+ probeExitCodeFor: () => probeExitCodeFor,
104900
+ redactSecretValues: () => redactSecretValues,
104901
+ reportProbeInternalError: () => reportProbeInternalError,
104902
+ runAntigravityProbe: () => runAntigravityProbe,
104903
+ subscriptionProbeCommand: () => subscriptionProbeCommand
104904
+ });
104905
+ import { randomUUID as randomUUID10 } from "crypto";
104906
+ import { readFile as readFile8, stat as stat2 } from "fs/promises";
104907
+ function probeExitCodeFor(failure) {
104908
+ if (failure.class === "internal") {
104909
+ return CALLER_CODES.includes(failure.code) ? PROBE_EXIT.usage : PROBE_EXIT.internal;
104910
+ }
104911
+ return PROBE_EXIT[failure.class];
104912
+ }
104913
+ async function defaultReadRequestFile(path) {
104914
+ const info = await stat2(path);
104915
+ if (!info.isFile())
104916
+ throw new Error("not a file");
104917
+ if (info.size > PROBE_REQUEST_FILE_CAP_BYTES)
104918
+ return null;
104919
+ return readFile8(path, "utf8");
104920
+ }
104921
+ function defaultSubscriptionProbeDeps() {
104922
+ return {
104923
+ platform: () => process.platform,
104924
+ readStore: readAntigravityStoreClassified,
104925
+ tokenDeps: defaultAntigravityTokenDeps,
104926
+ now: () => Date.now(),
104927
+ httpTimeoutMs: 30000,
104928
+ keychainDeadlineMs: 1e4,
104929
+ requestTimeoutMs: 300000,
104930
+ readRequestFile: defaultReadRequestFile,
104931
+ writeStdout: (line) => new Promise((resolve, reject) => {
104932
+ process.stdout.write(line, (err) => err ? reject(err) : resolve());
104933
+ }),
104934
+ writeStderr: (line) => {
104935
+ process.stderr.write(line);
104936
+ }
104937
+ };
104938
+ }
104939
+ function parseSubscriptionProbeArgs(argv) {
104940
+ const positionals = [];
104941
+ const values = new Map;
104942
+ const switches = new Set;
104943
+ for (let i = 0;i < argv.length; i++) {
104944
+ const token = argv[i];
104945
+ if (token === "--model" || token === "--request-file") {
104946
+ const value = argv[i + 1];
104947
+ if (values.has(token) || value === undefined || value === "" || value.startsWith("-")) {
104948
+ return { ok: false };
104949
+ }
104950
+ values.set(token, value);
104951
+ i++;
104952
+ } else if (token === "--raw" || token === "--json") {
104953
+ if (switches.has(token))
104954
+ return { ok: false };
104955
+ switches.add(token);
104956
+ } else if (token.startsWith("-")) {
104957
+ return { ok: false };
104958
+ } else {
104959
+ positionals.push(token);
104960
+ }
104961
+ }
104962
+ const model = values.get("--model");
104963
+ const requestFile = values.get("--request-file");
104964
+ if (positionals.length !== 2 || positionals[0] !== "probe" || positionals[1] !== "antigravity" || switches.size !== 2 || model === undefined || requestFile === undefined) {
104965
+ return { ok: false };
104966
+ }
104967
+ return { ok: true, provider: "antigravity", model, requestFile };
104968
+ }
104969
+ function failureOf4(cls, code, httpStatus) {
104970
+ return failureOf2(cls, code, httpStatus);
104971
+ }
104972
+ function buildEnvelope2(facts, failure, body) {
104973
+ return {
104974
+ schema: SUBSCRIPTION_PROBE_SCHEMA,
104975
+ ...facts.provider !== undefined ? { provider: facts.provider } : {},
104976
+ claudishVersion: VERSION,
104977
+ ...facts.model !== undefined ? { model: facts.model } : {},
104978
+ ...facts.fetchedAt !== undefined ? { fetchedAt: facts.fetchedAt } : {},
104979
+ ...facts.sourceUrl !== undefined ? { sourceUrl: facts.sourceUrl } : {},
104980
+ ...facts.clientVersion !== undefined ? { clientVersion: facts.clientVersion } : {},
104981
+ ...facts.clientVersionSource !== undefined ? { clientVersionSource: facts.clientVersionSource } : {},
104982
+ tokenRefreshed: facts.tokenRefreshed,
104983
+ ...facts.httpStatus !== undefined ? { httpStatus: facts.httpStatus } : {},
104984
+ ...failure ? { failure } : {},
104985
+ ...body ? { bodyRedacted: body.redacted, body: body.text } : {}
104986
+ };
104987
+ }
104988
+ function fail2(facts, failure) {
104989
+ return { envelope: buildEnvelope2(facts, failure), exitCode: probeExitCodeFor(failure) };
104990
+ }
104991
+ function lineOf2(envelope) {
104992
+ return `${JSON.stringify(envelope)}
104993
+ `;
104994
+ }
104995
+ function safeStderr2(deps, line) {
104996
+ try {
104997
+ deps.writeStderr(line);
104998
+ } catch {}
104999
+ }
105000
+ async function writeInternalFailure2(deps, facts, code, stderrLine, secrets) {
105001
+ const failure = failureOf4("internal", code);
105002
+ safeStderr2(deps, `${stderrLine}
105003
+ `);
105004
+ let line = lineOf2(buildEnvelope2(facts, failure));
105005
+ if (secrets && containsSecret(secrets, line)) {
105006
+ line = lineOf2(buildEnvelope2({ tokenRefreshed: facts.tokenRefreshed }, failure));
105007
+ }
105008
+ try {
105009
+ await deps.writeStdout(line);
105010
+ } catch {}
105011
+ return probeExitCodeFor(failure);
105012
+ }
105013
+ function redactSecretValues(text, secrets) {
105014
+ let out = text;
105015
+ const values = [...secrets.values].sort((a, b) => b.length - a.length);
105016
+ for (const value of values) {
105017
+ for (const form of new Set([value, value.replaceAll("/", "\\/")])) {
105018
+ if (out.includes(form))
105019
+ out = out.replaceAll(form, REDACTED2);
105020
+ }
105021
+ }
105022
+ return { text: out, redacted: out !== text };
105023
+ }
105024
+ function jsonUnescapedForms(text) {
105025
+ const forms = [];
105026
+ if (text === undefined)
105027
+ return { forms, complete: true };
105028
+ let current = text;
105029
+ for (let round = 0;round < MAX_UNESCAPE_ROUNDS; round++) {
105030
+ const next = current.replace(JSON_ESCAPE, (_match, hex, letter) => hex !== undefined ? String.fromCharCode(Number.parseInt(hex, 16)) : SIMPLE_ESCAPES[letter]);
105031
+ if (next === current)
105032
+ return { forms, complete: true };
105033
+ forms.push(next);
105034
+ current = next;
105035
+ }
105036
+ return { forms, complete: false };
105037
+ }
105038
+ async function readRequest(deps, path) {
105039
+ let text;
105040
+ try {
105041
+ text = await deps.readRequestFile(path);
105042
+ } catch {
105043
+ return { ok: false, code: "request_file_unreadable" };
105044
+ }
105045
+ if (text === null)
105046
+ return { ok: false, code: "request_file_invalid" };
105047
+ let value;
105048
+ try {
105049
+ value = JSON.parse(text);
105050
+ } catch {
105051
+ return { ok: false, code: "request_file_invalid" };
105052
+ }
105053
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
105054
+ return { ok: false, code: "request_file_invalid" };
105055
+ }
105056
+ return { ok: true, text };
105057
+ }
105058
+ function buildProbeEnvelopeBody(model, projectId, tierId, requestText, userPromptId = randomUUID10()) {
105059
+ const head = JSON.stringify({ model, project: projectId, user_prompt_id: userPromptId });
105060
+ const credits = tierId && tierId !== "free-tier" ? `,"enabled_credit_types":${JSON.stringify(["GOOGLE_ONE_AI"])}` : "";
105061
+ return `${head.slice(0, -1)},"request":${requestText}${credits}}`;
105062
+ }
105063
+ function createActivityRequestId3() {
105064
+ return Math.random().toString(36).substring(7);
105065
+ }
105066
+ async function readCapped(res, cap) {
105067
+ if (!res.body)
105068
+ return "";
105069
+ const reader = res.body.getReader();
105070
+ const chunks = [];
105071
+ let size = 0;
105072
+ for (;; ) {
105073
+ const { done, value } = await reader.read();
105074
+ if (done)
105075
+ break;
105076
+ size += value.byteLength;
105077
+ if (size > cap) {
105078
+ await reader.cancel().catch(() => {});
105079
+ return null;
105080
+ }
105081
+ chunks.push(value);
105082
+ }
105083
+ return Buffer.concat(chunks).toString("utf8");
105084
+ }
105085
+ async function determine2(deps, secrets, facts, args) {
105086
+ const request = await readRequest(deps, args.requestFile);
105087
+ if (!request.ok)
105088
+ return fail2(facts, failureOf4("internal", request.code));
105089
+ const session = await establishAntigravitySession(deps, secrets, facts);
105090
+ if (!session.ok)
105091
+ return fail2(facts, session.failure);
105092
+ const url = `${antigravityHost()}/v1internal:generateContent`;
105093
+ const version = resolveAntigravityClientVersion();
105094
+ facts.sourceUrl = stripUserinfo(url);
105095
+ facts.clientVersion = version.version;
105096
+ facts.clientVersionSource = version.source;
105097
+ const controller = new AbortController;
105098
+ const timer = setTimeout(() => controller.abort(), deps.requestTimeoutMs);
105099
+ const networkFailure = () => failureOf4("network", controller.signal.aborted ? "generate_content_timeout" : "generate_content_network_error", facts.httpStatus);
105100
+ try {
105101
+ let res;
105102
+ try {
105103
+ res = await fetch(url, {
105104
+ method: "POST",
105105
+ headers: {
105106
+ Authorization: `Bearer ${session.accessToken}`,
105107
+ "Content-Type": "application/json",
105108
+ "User-Agent": antigravityUserAgentFor(version.version),
105109
+ "x-activity-request-id": createActivityRequestId3()
105110
+ },
105111
+ body: buildProbeEnvelopeBody(args.model, session.projectId, session.tierId, request.text),
105112
+ signal: controller.signal,
105113
+ redirect: "manual"
105114
+ });
105115
+ } catch {
105116
+ return fail2(facts, networkFailure());
105117
+ }
105118
+ facts.fetchedAt = new Date(deps.now()).toISOString();
105119
+ facts.httpStatus = res.status;
105120
+ let text;
105121
+ try {
105122
+ text = await readCapped(res, PROBE_BODY_CAP_BYTES);
105123
+ } catch {
105124
+ return fail2(facts, networkFailure());
105125
+ }
105126
+ if (text === null)
105127
+ return fail2(facts, failureOf4("list_incomplete", "body_too_large", res.status));
105128
+ if (res.ok) {
105129
+ try {
105130
+ JSON.parse(text);
105131
+ } catch {
105132
+ return fail2(facts, failureOf4("list_incomplete", "body_not_json", res.status));
105133
+ }
105134
+ }
105135
+ const body = redactSecretValues(text, secrets);
105136
+ const unescaped = jsonUnescapedForms(body.text);
105137
+ if (!unescaped.complete) {
105138
+ return fail2(facts, failureOf4("list_incomplete", "body_unverifiable", res.status));
105139
+ }
105140
+ return {
105141
+ envelope: buildEnvelope2(facts, undefined, body),
105142
+ exitCode: PROBE_EXIT.ok,
105143
+ bodyText: body.text,
105144
+ bodyForms: unescaped.forms
105145
+ };
105146
+ } finally {
105147
+ clearTimeout(timer);
105148
+ }
105149
+ }
105150
+ async function runAntigravityProbe(deps, args) {
105151
+ const secrets = newSecrets();
105152
+ const facts = { provider: "antigravity", model: args.model, tokenRefreshed: false };
105153
+ let result;
105154
+ try {
105155
+ result = await determine2(deps, secrets, facts, args);
105156
+ } catch {
105157
+ return writeInternalFailure2(deps, { provider: facts.provider, model: facts.model, tokenRefreshed: facts.tokenRefreshed }, "internal_error", INTERNAL_ERROR_MESSAGE2, secrets);
105158
+ }
105159
+ if (result.envelope.failure?.code === "request_file_unreadable" || result.envelope.failure?.code === "request_file_invalid") {
105160
+ safeStderr2(deps, `${PROBE_REQUEST_FILE_MESSAGE}
105161
+ `);
105162
+ }
105163
+ const line = lineOf2(result.envelope);
105164
+ if (containsSecret(secrets, line, result.bodyText, ...result.bodyForms ?? [])) {
105165
+ return writeInternalFailure2(deps, facts, "secret_guard", SECRET_GUARD_MESSAGE2, secrets);
105166
+ }
105167
+ try {
105168
+ await deps.writeStdout(line);
105169
+ } catch {
105170
+ safeStderr2(deps, `${INTERNAL_ERROR_MESSAGE2}
105171
+ `);
105172
+ return PROBE_EXIT.internal;
105173
+ }
105174
+ return result.exitCode;
105175
+ }
105176
+ async function reportProbeInternalError(deps) {
105177
+ let resolved;
105178
+ try {
105179
+ resolved = deps ?? defaultSubscriptionProbeDeps();
105180
+ } catch {
105181
+ process.stderr.write(`${INTERNAL_ERROR_MESSAGE2}
105182
+ `);
105183
+ return PROBE_EXIT.internal;
105184
+ }
105185
+ return writeInternalFailure2(resolved, { tokenRefreshed: false }, "internal_error", INTERNAL_ERROR_MESSAGE2);
105186
+ }
105187
+ async function subscriptionProbeCommand(argv, deps = defaultSubscriptionProbeDeps()) {
105188
+ const args = parseSubscriptionProbeArgs(argv);
105189
+ if (!args.ok) {
105190
+ return writeInternalFailure2(deps, { tokenRefreshed: false }, "usage", SUBSCRIPTION_PROBE_USAGE);
105191
+ }
105192
+ return runAntigravityProbe(deps, args);
105193
+ }
105194
+ var PROBE_FAILURE_CODES, PROBE_EXIT, CALLER_CODES, PROBE_BODY_CAP_BYTES, PROBE_REQUEST_FILE_CAP_BYTES, REDACTED2 = "[REDACTED]", SUBSCRIPTION_PROBE_USAGE = "usage: claudish subscription probe antigravity --model <wire-model-id> --request-file <path> --raw --json", PROBE_REQUEST_FILE_MESSAGE = "[claudish subscription] the request file must hold one JSON object (the inner Gemini request)", SECRET_GUARD_MESSAGE2 = "[claudish subscription] refused: output contained a credential value", INTERNAL_ERROR_MESSAGE2 = "[claudish subscription] internal error", JSON_ESCAPE, SIMPLE_ESCAPES, MAX_UNESCAPE_ROUNDS = 64;
105195
+ var init_subscription_probe_command = __esm(() => {
105196
+ init_antigravity_token();
105197
+ init_antigravity_user();
105198
+ init_subscription_antigravity_session();
105199
+ init_subscription_dispatch();
105200
+ init_subscription_dispatch();
105201
+ PROBE_FAILURE_CODES = {
105202
+ credential_missing: SESSION_FAILURE_CODES.credential_missing,
105203
+ keychain_locked: SESSION_FAILURE_CODES.keychain_locked,
105204
+ mint_failed: SESSION_FAILURE_CODES.mint_failed,
105205
+ network: [
105206
+ ...SESSION_FAILURE_CODES.network,
105207
+ "generate_content_network_error",
105208
+ "generate_content_timeout"
105209
+ ],
105210
+ list_incomplete: ["body_too_large", "body_not_json", "body_unverifiable"],
105211
+ internal: [
105212
+ "usage",
105213
+ "request_file_unreadable",
105214
+ "request_file_invalid",
105215
+ "secret_guard",
105216
+ "internal_error"
105217
+ ]
105218
+ };
105219
+ PROBE_EXIT = {
105220
+ ok: 0,
105221
+ internal: 1,
105222
+ usage: 2,
105223
+ credential_missing: 3,
105224
+ keychain_locked: 4,
105225
+ mint_failed: 5,
105226
+ network: 6,
105227
+ list_incomplete: 7
105228
+ };
105229
+ CALLER_CODES = [
105230
+ "usage",
105231
+ "request_file_unreadable",
105232
+ "request_file_invalid"
105233
+ ];
105234
+ PROBE_BODY_CAP_BYTES = 512 * 1024;
105235
+ PROBE_REQUEST_FILE_CAP_BYTES = 8 * 1024 * 1024;
105236
+ JSON_ESCAPE = /\\(?:u([0-9a-fA-F]{4})|(["\\/bfnrt]))/g;
105237
+ SIMPLE_ESCAPES = {
105238
+ '"': '"',
105239
+ "\\": "\\",
105240
+ "/": "/",
105241
+ b: "\b",
105242
+ f: "\f",
105243
+ n: `
105244
+ `,
105245
+ r: "\r",
105246
+ t: "\t"
105247
+ };
104815
105248
  });
104816
105249
 
104817
105250
  // src/account-forecast-render.ts
@@ -115079,7 +115512,7 @@ var init_terminal_isolation = __esm(() => {
115079
115512
 
115080
115513
  // src/claude-runner.ts
115081
115514
  import { spawn as spawn4, spawnSync as spawnSync4 } from "child_process";
115082
- import { randomUUID as randomUUID10 } from "crypto";
115515
+ import { randomUUID as randomUUID11 } from "crypto";
115083
115516
  import {
115084
115517
  chmodSync as chmodSync5,
115085
115518
  closeSync as closeSync14,
@@ -116013,7 +116446,7 @@ Or set CLAUDE_PATH to your custom installation:`);
116013
116446
  const sessionFlags = sessionFlagsOf(config.claudeArgs);
116014
116447
  let driverLaunch = null;
116015
116448
  if (surfaces.driver) {
116016
- const minted = sessionFlags.sessionId || sessionFlags.resumes ? null : randomUUID10();
116449
+ const minted = sessionFlags.sessionId || sessionFlags.resumes ? null : randomUUID11();
116017
116450
  const turnDir = mkdtempSync4(join63(tmpdir3(), "claudish-turns-"));
116018
116451
  chmodSync5(turnDir, 448);
116019
116452
  claudeArgs.unshift(...driverLeadingArgs({ mintedSessionId: minted, turnDir }));
@@ -119200,12 +119633,25 @@ if (isMcpMode) {
119200
119633
  }));
119201
119634
  } else if (isSubscriptionCommand) {
119202
119635
  const subscriptionArgIndex = args.indexOf("subscription");
119636
+ const subscriptionArgv = args.slice(subscriptionArgIndex + 1);
119203
119637
  const subscriptionModule = () => Promise.resolve().then(() => (init_subscription_models_command(), exports_subscription_models_command));
119204
- subscriptionModule().then((m) => m.subscriptionModelsCommand(args.slice(subscriptionArgIndex + 1))).catch(() => subscriptionModule().then((m) => m.reportSubscriptionInternalError()).catch(() => {
119638
+ const probeModule = () => Promise.resolve().then(() => (init_subscription_probe_command(), exports_subscription_probe_command));
119639
+ const writeLine = (line, code) => new Promise((resolve) => {
119640
+ process.stdout.write(line, () => resolve(code));
119641
+ });
119642
+ Promise.resolve().then(() => (init_subscription_dispatch(), {})).then((dispatch) => {
119643
+ const probe = isSubscriptionProbeArgv(subscriptionArgv);
119644
+ const run = probe ? probeModule().then((m) => m.subscriptionProbeCommand(subscriptionArgv)) : subscriptionModule().then((m) => m.subscriptionModelsCommand(subscriptionArgv));
119645
+ return run.catch(() => probe ? probeModule().then((m) => m.reportProbeInternalError()).catch(() => {
119646
+ process.stderr.write(`[claudish subscription] internal error
119647
+ `);
119648
+ return writeLine(probeLoadFailureLine(), 1);
119649
+ }) : subscriptionModule().then((m) => m.reportSubscriptionInternalError()));
119650
+ }).catch(() => {
119205
119651
  process.stderr.write(`[claudish subscription] internal error
119206
119652
  `);
119207
119653
  return 1;
119208
- })).then((code) => process.exit(code));
119654
+ }).then((code) => process.exit(code));
119209
119655
  } else if (isAccountCommand) {
119210
119656
  const accountArgIndex = args.indexOf("account");
119211
119657
  Promise.resolve().then(() => (init_account_command(), {})).then((m) => accountCommand(args.slice(accountArgIndex + 1)).catch((e) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudish",
3
- "version": "14.10.2",
3
+ "version": "14.11.0",
4
4
  "description": "Run Claude Code with any model - OpenRouter, Ollama, LM Studio & local models",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -71,10 +71,10 @@
71
71
  "ai"
72
72
  ],
73
73
  "optionalDependencies": {
74
- "@claudish/magmux-darwin-arm64": "14.10.2",
75
- "@claudish/magmux-darwin-x64": "14.10.2",
76
- "@claudish/magmux-linux-arm64": "14.10.2",
77
- "@claudish/magmux-linux-x64": "14.10.2"
74
+ "@claudish/magmux-darwin-arm64": "14.11.0",
75
+ "@claudish/magmux-darwin-x64": "14.11.0",
76
+ "@claudish/magmux-linux-arm64": "14.11.0",
77
+ "@claudish/magmux-linux-x64": "14.11.0"
78
78
  },
79
79
  "author": "Jack Rudenko <i@madappgang.com>",
80
80
  "license": "MIT",