lingo.dev 0.96.0 → 0.97.1

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/build/cli.mjs CHANGED
@@ -29,7 +29,8 @@ function getSettings(explicitApiKey) {
29
29
  llm: {
30
30
  openaiApiKey: env.OPENAI_API_KEY || systemFile.llm?.openaiApiKey,
31
31
  anthropicApiKey: env.ANTHROPIC_API_KEY || systemFile.llm?.anthropicApiKey,
32
- groqApiKey: env.GROQ_API_KEY || systemFile.llm?.groqApiKey
32
+ groqApiKey: env.GROQ_API_KEY || systemFile.llm?.groqApiKey,
33
+ googleApiKey: env.GOOGLE_API_KEY || systemFile.llm?.googleApiKey
33
34
  }
34
35
  };
35
36
  }
@@ -57,7 +58,8 @@ var SettingsSchema = Z.object({
57
58
  llm: Z.object({
58
59
  openaiApiKey: Z.string().optional(),
59
60
  anthropicApiKey: Z.string().optional(),
60
- groqApiKey: Z.string().optional()
61
+ groqApiKey: Z.string().optional(),
62
+ googleApiKey: Z.string().optional()
61
63
  })
62
64
  });
63
65
  var SETTINGS_KEYS = flattenZodObject(
@@ -80,7 +82,8 @@ function _loadEnv() {
80
82
  LINGODOTDEV_WEB_URL: Z.string().optional(),
81
83
  OPENAI_API_KEY: Z.string().optional(),
82
84
  ANTHROPIC_API_KEY: Z.string().optional(),
83
- GROQ_API_KEY: Z.string().optional()
85
+ GROQ_API_KEY: Z.string().optional(),
86
+ GOOGLE_API_KEY: Z.string().optional()
84
87
  }).passthrough().parse(process.env);
85
88
  }
86
89
  function _loadSystemFile() {
@@ -96,7 +99,8 @@ function _loadSystemFile() {
96
99
  llm: Z.object({
97
100
  openaiApiKey: Z.string().optional(),
98
101
  anthropicApiKey: Z.string().optional(),
99
- groqApiKey: Z.string().optional()
102
+ groqApiKey: Z.string().optional(),
103
+ googleApiKey: Z.string().optional()
100
104
  }).optional()
101
105
  }).passthrough().parse(data);
102
106
  }
@@ -153,6 +157,12 @@ function _envVarsInfo() {
153
157
  `\u2139\uFE0F Using GROQ_API_KEY env var instead of key from user config`
154
158
  );
155
159
  }
160
+ if (env.GOOGLE_API_KEY && systemFile.llm?.googleApiKey) {
161
+ console.info(
162
+ "\x1B[36m%s\x1B[0m",
163
+ `\u2139\uFE0F Using GOOGLE_API_KEY env var instead of key from user config`
164
+ );
165
+ }
156
166
  if (env.LINGODOTDEV_API_URL) {
157
167
  console.info(
158
168
  "\x1B[36m%s\x1B[0m",
@@ -4479,6 +4489,7 @@ function countWordsInRecord(payload) {
4479
4489
  // src/cli/processor/index.ts
4480
4490
  import { createOpenAI } from "@ai-sdk/openai";
4481
4491
  import { createAnthropic } from "@ai-sdk/anthropic";
4492
+ import { createGoogleGenerativeAI } from "@ai-sdk/google";
4482
4493
  function createProcessor(provider, params) {
4483
4494
  if (!provider) {
4484
4495
  const result = createLingoLocalizer(params);
@@ -4528,6 +4539,15 @@ function getPureModelProvider(provider) {
4528
4539
  return createAnthropic({
4529
4540
  apiKey: process.env.ANTHROPIC_API_KEY
4530
4541
  })(provider.model);
4542
+ case "google":
4543
+ if (!process.env.GOOGLE_API_KEY) {
4544
+ throw new Error(
4545
+ createMissingKeyErrorMessage("Google", "GOOGLE_API_KEY")
4546
+ );
4547
+ }
4548
+ return createGoogleGenerativeAI({
4549
+ apiKey: process.env.GOOGLE_API_KEY
4550
+ })(provider.model);
4531
4551
  default:
4532
4552
  throw new Error(createUnsupportedProviderErrorMessage(provider?.id));
4533
4553
  }
@@ -5623,6 +5643,7 @@ function createLingoDotDevLocalizer(explicitApiKey) {
5623
5643
 
5624
5644
  // src/cli/localizer/explicit.ts
5625
5645
  import { createAnthropic as createAnthropic2 } from "@ai-sdk/anthropic";
5646
+ import { createGoogleGenerativeAI as createGoogleGenerativeAI2 } from "@ai-sdk/google";
5626
5647
  import { createOpenAI as createOpenAI2 } from "@ai-sdk/openai";
5627
5648
  import chalk9 from "chalk";
5628
5649
  import dedent6 from "dedent";
@@ -5634,11 +5655,11 @@ function createExplicitLocalizer(provider) {
5634
5655
  throw new Error(
5635
5656
  dedent6`
5636
5657
  You're trying to use unsupported provider: ${chalk9.dim(provider.id)}.
5637
-
5658
+
5638
5659
  To fix this issue:
5639
5660
  1. Switch to one of the supported providers, or
5640
5661
  2. Remove the ${chalk9.italic("provider")} node from your i18n.json configuration to switch to ${chalk9.hex(colors.green)("Lingo.dev")}
5641
-
5662
+
5642
5663
  ${chalk9.hex(colors.blue)("Docs: https://lingo.dev/go/docs")}
5643
5664
  `
5644
5665
  );
@@ -5658,6 +5679,14 @@ function createExplicitLocalizer(provider) {
5658
5679
  apiKeyName: "ANTHROPIC_API_KEY",
5659
5680
  baseUrl: provider.baseUrl
5660
5681
  });
5682
+ case "google":
5683
+ return createAiSdkLocalizer({
5684
+ factory: (params) => createGoogleGenerativeAI2(params).languageModel(provider.model),
5685
+ id: provider.id,
5686
+ prompt: provider.prompt,
5687
+ apiKeyName: "GOOGLE_API_KEY",
5688
+ baseUrl: provider.baseUrl
5689
+ });
5661
5690
  }
5662
5691
  }
5663
5692
  function createAiSdkLocalizer(params) {
@@ -5933,7 +5962,8 @@ async function plan(input2) {
5933
5962
  bucketPathPattern: bucketPath.pathPattern,
5934
5963
  injectLocale: bucket.injectLocale || [],
5935
5964
  lockedKeys: bucket.lockedKeys || [],
5936
- lockedPatterns: bucket.lockedPatterns || []
5965
+ lockedPatterns: bucket.lockedPatterns || [],
5966
+ onlyKeys: input2.flags.key || []
5937
5967
  });
5938
5968
  }
5939
5969
  }
@@ -6084,6 +6114,8 @@ function createWorkerTask(args) {
6084
6114
  });
6085
6115
  const processableData = _32.chain(sourceData).entries().filter(
6086
6116
  ([key, value]) => delta.added.includes(key) || delta.updated.includes(key) || !!args.ctx.flags.force
6117
+ ).filter(
6118
+ ([key]) => !assignedTask.onlyKeys.length || assignedTask.onlyKeys.includes(key)
6087
6119
  ).fromPairs().value();
6088
6120
  if (!Object.keys(processableData).length) {
6089
6121
  return { status: "skipped" };
@@ -6168,9 +6200,6 @@ var flagsSchema2 = z2.object({
6168
6200
  targetLocale: z2.array(z2.string()).optional()
6169
6201
  });
6170
6202
 
6171
- // src/cli/cmd/run/index.ts
6172
- import chalk13 from "chalk";
6173
-
6174
6203
  // src/cli/cmd/run/_utils.ts
6175
6204
  async function determineAuthId(ctx) {
6176
6205
  const isByokMode = !!ctx.config?.provider;
@@ -6189,34 +6218,11 @@ async function determineAuthId(ctx) {
6189
6218
  // src/cli/cmd/run/index.ts
6190
6219
  var run_default = new Command16().command("run").description("Run Lingo.dev localization engine").helpOption("-h, --help", "Show help").option(
6191
6220
  "--source-locale <source-locale>",
6192
- "Locale to use as source locale. Defaults to i18n.json locale.source",
6193
- (val, prev) => {
6194
- if (!val) return prev;
6195
- if (!process.argv.includes("--target-locale")) {
6196
- console.error(
6197
- `
6198
- \u274C ${chalk13.red("Error")}: --source-locale must be used together with --target-locale
6199
- `
6200
- );
6201
- process.exit(1);
6202
- }
6203
- return val;
6204
- }
6221
+ "Locale to use as source locale. Defaults to i18n.json locale.source"
6205
6222
  ).option(
6206
6223
  "--target-locale <target-locale>",
6207
6224
  "Locale to use as target locale. Defaults to i18n.json locale.targets",
6208
- (val, prev) => {
6209
- if (!val) return prev;
6210
- if (!process.argv.includes("--source-locale")) {
6211
- console.error(
6212
- `
6213
- \u274C ${chalk13.red("Error")}: --target-locale must be used together with --source-locale
6214
- `
6215
- );
6216
- process.exit(1);
6217
- }
6218
- return prev ? [...prev, val] : [val];
6219
- }
6225
+ (val, prev) => prev ? [...prev, val] : [val]
6220
6226
  ).option(
6221
6227
  "--bucket <bucket>",
6222
6228
  "Bucket to process",
@@ -6998,7 +7004,7 @@ import { bucketTypeSchema as bucketTypeSchema4, localeCodeSchema as localeCodeSc
6998
7004
  import { Command as Command18 } from "interactive-commander";
6999
7005
  import Z11 from "zod";
7000
7006
  import Ora10 from "ora";
7001
- import chalk14 from "chalk";
7007
+ import chalk13 from "chalk";
7002
7008
  import Table from "cli-table3";
7003
7009
  var status_default = new Command18().command("status").description("Show the status of the localization process").helpOption("-h, --help", "Show help").option("--locale <locale>", "Locale to process", (val, prev) => prev ? [...prev, val] : [val]).option("--bucket <bucket>", "Bucket to process", (val, prev) => prev ? [...prev, val] : [val]).option(
7004
7010
  "--file [files...]",
@@ -7141,7 +7147,7 @@ var status_default = new Command18().command("status").description("Show the sta
7141
7147
  languageStats[targetLocale].words += sourceWordCount;
7142
7148
  totalWordCount.set(targetLocale, (totalWordCount.get(targetLocale) || 0) + sourceWordCount);
7143
7149
  bucketOra.succeed(
7144
- `[${sourceLocale} -> ${targetLocale}] ${chalk14.red(`0% complete`)} (0/${sourceKeys.length} keys) - file not found`
7150
+ `[${sourceLocale} -> ${targetLocale}] ${chalk13.red(`0% complete`)} (0/${sourceKeys.length} keys) - file not found`
7145
7151
  );
7146
7152
  continue;
7147
7153
  }
@@ -7177,20 +7183,20 @@ var status_default = new Command18().command("status").description("Show the sta
7177
7183
  const completionPercent = (completeKeys.length / totalKeysInFile * 100).toFixed(1);
7178
7184
  if (missingKeys.length === 0 && updatedKeys.length === 0) {
7179
7185
  bucketOra.succeed(
7180
- `[${sourceLocale} -> ${targetLocale}] ${chalk14.green(`100% complete`)} (${completeKeys.length}/${totalKeysInFile} keys)`
7186
+ `[${sourceLocale} -> ${targetLocale}] ${chalk13.green(`100% complete`)} (${completeKeys.length}/${totalKeysInFile} keys)`
7181
7187
  );
7182
7188
  } else {
7183
- const message = `[${sourceLocale} -> ${targetLocale}] ${parseFloat(completionPercent) > 50 ? chalk14.yellow(`${completionPercent}% complete`) : chalk14.red(`${completionPercent}% complete`)} (${completeKeys.length}/${totalKeysInFile} keys)`;
7189
+ const message = `[${sourceLocale} -> ${targetLocale}] ${parseFloat(completionPercent) > 50 ? chalk13.yellow(`${completionPercent}% complete`) : chalk13.red(`${completionPercent}% complete`)} (${completeKeys.length}/${totalKeysInFile} keys)`;
7184
7190
  bucketOra.succeed(message);
7185
7191
  if (flags.verbose) {
7186
7192
  if (missingKeys.length > 0) {
7187
- console.log(` ${chalk14.red(`Missing:`)} ${missingKeys.length} keys, ~${wordsToTranslate} words`);
7193
+ console.log(` ${chalk13.red(`Missing:`)} ${missingKeys.length} keys, ~${wordsToTranslate} words`);
7188
7194
  console.log(
7189
- ` ${chalk14.dim(`Example missing: ${missingKeys.slice(0, 2).join(", ")}${missingKeys.length > 2 ? "..." : ""}`)}`
7195
+ ` ${chalk13.dim(`Example missing: ${missingKeys.slice(0, 2).join(", ")}${missingKeys.length > 2 ? "..." : ""}`)}`
7190
7196
  );
7191
7197
  }
7192
7198
  if (updatedKeys.length > 0) {
7193
- console.log(` ${chalk14.yellow(`Updated:`)} ${updatedKeys.length} keys that changed in source`);
7199
+ console.log(` ${chalk13.yellow(`Updated:`)} ${updatedKeys.length} keys that changed in source`);
7194
7200
  }
7195
7201
  }
7196
7202
  }
@@ -7205,16 +7211,16 @@ var status_default = new Command18().command("status").description("Show the sta
7205
7211
  }, 0);
7206
7212
  const totalCompletedKeys = totalSourceKeyCount - totalKeysNeedingTranslation / targetLocales.length;
7207
7213
  console.log();
7208
- ora.succeed(chalk14.green(`Localization status completed.`));
7209
- console.log(chalk14.bold.cyan(`
7214
+ ora.succeed(chalk13.green(`Localization status completed.`));
7215
+ console.log(chalk13.bold.cyan(`
7210
7216
  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557`));
7211
- console.log(chalk14.bold.cyan(`\u2551 LOCALIZATION STATUS REPORT \u2551`));
7212
- console.log(chalk14.bold.cyan(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D`));
7213
- console.log(chalk14.bold(`
7217
+ console.log(chalk13.bold.cyan(`\u2551 LOCALIZATION STATUS REPORT \u2551`));
7218
+ console.log(chalk13.bold.cyan(`\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D`));
7219
+ console.log(chalk13.bold(`
7214
7220
  \u{1F4DD} SOURCE CONTENT:`));
7215
- console.log(`\u2022 Source language: ${chalk14.green(i18nConfig.locale.source)}`);
7216
- console.log(`\u2022 Source keys: ${chalk14.yellow(totalSourceKeyCount.toString())} keys across all files`);
7217
- console.log(chalk14.bold(`
7221
+ console.log(`\u2022 Source language: ${chalk13.green(i18nConfig.locale.source)}`);
7222
+ console.log(`\u2022 Source keys: ${chalk13.yellow(totalSourceKeyCount.toString())} keys across all files`);
7223
+ console.log(chalk13.bold(`
7218
7224
  \u{1F310} LANGUAGE BY LANGUAGE BREAKDOWN:`));
7219
7225
  const table = new Table({
7220
7226
  head: ["Language", "Status", "Complete", "Missing", "Updated", "Total Keys", "Words to Translate"],
@@ -7236,19 +7242,19 @@ var status_default = new Command18().command("status").description("Show the sta
7236
7242
  let statusColor;
7237
7243
  if (stats.missing === totalSourceKeyCount) {
7238
7244
  statusText = "\u{1F534} Not started";
7239
- statusColor = chalk14.red;
7245
+ statusColor = chalk13.red;
7240
7246
  } else if (stats.missing === 0 && stats.updated === 0) {
7241
7247
  statusText = "\u2705 Complete";
7242
- statusColor = chalk14.green;
7248
+ statusColor = chalk13.green;
7243
7249
  } else if (parseFloat(percentComplete) > 80) {
7244
7250
  statusText = "\u{1F7E1} Almost done";
7245
- statusColor = chalk14.yellow;
7251
+ statusColor = chalk13.yellow;
7246
7252
  } else if (parseFloat(percentComplete) > 0) {
7247
7253
  statusText = "\u{1F7E0} In progress";
7248
- statusColor = chalk14.yellow;
7254
+ statusColor = chalk13.yellow;
7249
7255
  } else {
7250
7256
  statusText = "\u{1F534} Not started";
7251
- statusColor = chalk14.red;
7257
+ statusColor = chalk13.red;
7252
7258
  }
7253
7259
  const words = totalWordCount.get(locale) || 0;
7254
7260
  totalWordsToTranslate += words;
@@ -7256,17 +7262,17 @@ var status_default = new Command18().command("status").description("Show the sta
7256
7262
  locale,
7257
7263
  statusColor(statusText),
7258
7264
  `${stats.complete}/${totalSourceKeyCount} (${percentComplete}%)`,
7259
- stats.missing > 0 ? chalk14.red(stats.missing.toString()) : "0",
7260
- stats.updated > 0 ? chalk14.yellow(stats.updated.toString()) : "0",
7261
- totalNeeded > 0 ? chalk14.magenta(totalNeeded.toString()) : "0",
7265
+ stats.missing > 0 ? chalk13.red(stats.missing.toString()) : "0",
7266
+ stats.updated > 0 ? chalk13.yellow(stats.updated.toString()) : "0",
7267
+ totalNeeded > 0 ? chalk13.magenta(totalNeeded.toString()) : "0",
7262
7268
  words > 0 ? `~${words.toLocaleString()}` : "0"
7263
7269
  ]);
7264
7270
  }
7265
7271
  console.log(table.toString());
7266
- console.log(chalk14.bold(`
7272
+ console.log(chalk13.bold(`
7267
7273
  \u{1F4CA} USAGE ESTIMATE:`));
7268
7274
  console.log(
7269
- `\u2022 WORDS TO BE CONSUMED: ~${chalk14.yellow.bold(totalWordsToTranslate.toLocaleString())} words across all languages`
7275
+ `\u2022 WORDS TO BE CONSUMED: ~${chalk13.yellow.bold(totalWordsToTranslate.toLocaleString())} words across all languages`
7270
7276
  );
7271
7277
  console.log(` (Words are counted from source language for keys that need translation in target languages)`);
7272
7278
  if (targetLocales.length > 1) {
@@ -7278,11 +7284,11 @@ var status_default = new Command18().command("status").description("Show the sta
7278
7284
  }
7279
7285
  }
7280
7286
  if (flags.confirm && Object.keys(fileStats).length > 0) {
7281
- console.log(chalk14.bold(`
7287
+ console.log(chalk13.bold(`
7282
7288
  \u{1F4D1} BREAKDOWN BY FILE:`));
7283
7289
  Object.entries(fileStats).sort((a, b) => b[1].wordCount - a[1].wordCount).forEach(([path16, stats]) => {
7284
7290
  if (stats.sourceKeys === 0) return;
7285
- console.log(chalk14.bold(`
7291
+ console.log(chalk13.bold(`
7286
7292
  \u2022 ${path16}:`));
7287
7293
  console.log(` ${stats.sourceKeys} source keys, ~${stats.wordCount.toLocaleString()} source words`);
7288
7294
  const fileTable = new Table({
@@ -7300,13 +7306,13 @@ var status_default = new Command18().command("status").description("Show the sta
7300
7306
  const total = stats.sourceKeys;
7301
7307
  const completion = (complete / total * 100).toFixed(1);
7302
7308
  let status = "\u2705 Complete";
7303
- let statusColor = chalk14.green;
7309
+ let statusColor = chalk13.green;
7304
7310
  if (langStats.missing === total) {
7305
7311
  status = "\u274C Not started";
7306
- statusColor = chalk14.red;
7312
+ statusColor = chalk13.red;
7307
7313
  } else if (langStats.missing > 0 || langStats.updated > 0) {
7308
7314
  status = `\u26A0\uFE0F ${completion}% complete`;
7309
- statusColor = chalk14.yellow;
7315
+ statusColor = chalk13.yellow;
7310
7316
  }
7311
7317
  let details = "";
7312
7318
  if (langStats.missing > 0 || langStats.updated > 0) {
@@ -7326,16 +7332,16 @@ var status_default = new Command18().command("status").description("Show the sta
7326
7332
  (locale) => languageStats[locale].missing === 0 && languageStats[locale].updated === 0
7327
7333
  );
7328
7334
  const missingLanguages = targetLocales.filter((locale) => languageStats[locale].complete === 0);
7329
- console.log(chalk14.bold.green(`
7335
+ console.log(chalk13.bold.green(`
7330
7336
  \u{1F4A1} OPTIMIZATION TIPS:`));
7331
7337
  if (missingLanguages.length > 0) {
7332
7338
  console.log(
7333
- `\u2022 ${chalk14.yellow(missingLanguages.join(", "))} ${missingLanguages.length === 1 ? "has" : "have"} no translations yet`
7339
+ `\u2022 ${chalk13.yellow(missingLanguages.join(", "))} ${missingLanguages.length === 1 ? "has" : "have"} no translations yet`
7334
7340
  );
7335
7341
  }
7336
7342
  if (completeLanguages.length > 0) {
7337
7343
  console.log(
7338
- `\u2022 ${chalk14.green(completeLanguages.join(", "))} ${completeLanguages.length === 1 ? "is" : "are"} completely translated`
7344
+ `\u2022 ${chalk13.green(completeLanguages.join(", "))} ${completeLanguages.length === 1 ? "is" : "are"} completely translated`
7339
7345
  );
7340
7346
  }
7341
7347
  if (targetLocales.length > 1) {
@@ -7414,7 +7420,7 @@ function validateParams2(i18nConfig, flags) {
7414
7420
  import { Command as Command19 } from "interactive-commander";
7415
7421
  import * as cp from "node:child_process";
7416
7422
  import figlet2 from "figlet";
7417
- import chalk15 from "chalk";
7423
+ import chalk14 from "chalk";
7418
7424
  import { vice as vice2 } from "gradient-string";
7419
7425
  var colors2 = {
7420
7426
  orange: "#ff6600",
@@ -7428,7 +7434,7 @@ var may_the_fourth_default = new Command19().command("may-the-fourth").descripti
7428
7434
  await renderClear2();
7429
7435
  await renderBanner2();
7430
7436
  await renderSpacer2();
7431
- console.log(chalk15.hex(colors2.yellow)("Loading the Star Wars movie..."));
7437
+ console.log(chalk14.hex(colors2.yellow)("Loading the Star Wars movie..."));
7432
7438
  await renderSpacer2();
7433
7439
  await new Promise((resolve, reject) => {
7434
7440
  const ssh = cp.spawn("ssh", ["starwarstel.net"], {
@@ -7447,10 +7453,10 @@ var may_the_fourth_default = new Command19().command("may-the-fourth").descripti
7447
7453
  });
7448
7454
  await renderSpacer2();
7449
7455
  console.log(
7450
- `${chalk15.hex(colors2.green)("We hope you enjoyed it! :)")} ${chalk15.hex(colors2.blue)("May the Fourth be with you! \u{1F680}")}`
7456
+ `${chalk14.hex(colors2.green)("We hope you enjoyed it! :)")} ${chalk14.hex(colors2.blue)("May the Fourth be with you! \u{1F680}")}`
7451
7457
  );
7452
7458
  await renderSpacer2();
7453
- console.log(chalk15.dim(`---`));
7459
+ console.log(chalk14.dim(`---`));
7454
7460
  await renderSpacer2();
7455
7461
  await renderHero2();
7456
7462
  });
@@ -7473,19 +7479,19 @@ async function renderBanner2() {
7473
7479
  }
7474
7480
  async function renderHero2() {
7475
7481
  console.log(
7476
- `\u26A1\uFE0F ${chalk15.hex(colors2.green)("Lingo.dev")} - open-source, AI-powered i18n CLI for web & mobile localization.`
7482
+ `\u26A1\uFE0F ${chalk14.hex(colors2.green)("Lingo.dev")} - open-source, AI-powered i18n CLI for web & mobile localization.`
7477
7483
  );
7478
7484
  console.log(" ");
7479
7485
  console.log(
7480
- chalk15.hex(colors2.blue)("\u2B50 GitHub Repo: https://lingo.dev/go/gh")
7486
+ chalk14.hex(colors2.blue)("\u2B50 GitHub Repo: https://lingo.dev/go/gh")
7481
7487
  );
7482
- console.log(chalk15.hex(colors2.blue)("\u{1F4AC} 24/7 Support: hi@lingo.dev"));
7488
+ console.log(chalk14.hex(colors2.blue)("\u{1F4AC} 24/7 Support: hi@lingo.dev"));
7483
7489
  }
7484
7490
 
7485
7491
  // package.json
7486
7492
  var package_default = {
7487
7493
  name: "lingo.dev",
7488
- version: "0.96.0",
7494
+ version: "0.97.1",
7489
7495
  description: "Lingo.dev CLI",
7490
7496
  private: false,
7491
7497
  publishConfig: {
@@ -7598,6 +7604,7 @@ var package_default = {
7598
7604
  license: "Apache-2.0",
7599
7605
  dependencies: {
7600
7606
  "@ai-sdk/anthropic": "^1.2.11",
7607
+ "@ai-sdk/google": "^1.2.19",
7601
7608
  "@ai-sdk/openai": "^1.3.22",
7602
7609
  "@babel/generator": "^7.27.1",
7603
7610
  "@babel/parser": "^7.27.1",
@@ -7607,10 +7614,10 @@ var package_default = {
7607
7614
  "@gitbeaker/rest": "^39.34.3",
7608
7615
  "@inkjs/ui": "^2.0.0",
7609
7616
  "@inquirer/prompts": "^7.4.1",
7617
+ "@lingo.dev/_compiler": "workspace:*",
7618
+ "@lingo.dev/_react": "workspace:*",
7610
7619
  "@lingo.dev/_sdk": "workspace:*",
7611
7620
  "@lingo.dev/_spec": "workspace:*",
7612
- "@lingo.dev/_react": "workspace:*",
7613
- "@lingo.dev/_compiler": "workspace:*",
7614
7621
  "@modelcontextprotocol/sdk": "^1.5.0",
7615
7622
  "@paralleldrive/cuid2": "^2.2.2",
7616
7623
  ai: "^4.3.15",