@protolabsai/proto 0.26.3 → 0.26.5

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 (3) hide show
  1. package/cli.js +301 -251
  2. package/locales/en.js +216 -192
  3. package/package.json +2 -2
package/cli.js CHANGED
@@ -35181,6 +35181,9 @@ var init_retry = __esm({
35181
35181
  });
35182
35182
 
35183
35183
  // packages/core/dist/src/utils/partUtils.js
35184
+ function isInternalPart(part) {
35185
+ return typeof part === "object" && part !== null && part.protoInternal === true;
35186
+ }
35184
35187
  function partToString(value, options2) {
35185
35188
  if (!value) {
35186
35189
  return "";
@@ -35224,7 +35227,7 @@ function getResponseText(response) {
35224
35227
  if (response.candidates && response.candidates.length > 0) {
35225
35228
  const candidate = response.candidates[0];
35226
35229
  if (candidate.content && candidate.content.parts && candidate.content.parts.length > 0) {
35227
- return candidate.content.parts.filter((part) => part.text && !part.thought).map((part) => part.text).join("");
35230
+ return candidate.content.parts.filter((part) => part.text && !part.thought && !isInternalPart(part)).map((part) => part.text).join("");
35228
35231
  }
35229
35232
  }
35230
35233
  return null;
@@ -35273,6 +35276,7 @@ var init_partUtils = __esm({
35273
35276
  "packages/core/dist/src/utils/partUtils.js"() {
35274
35277
  "use strict";
35275
35278
  init_esbuild_shims();
35279
+ __name(isInternalPart, "isInternalPart");
35276
35280
  __name(partToString, "partToString");
35277
35281
  __name(getResponseText, "getResponseText");
35278
35282
  __name(flatMapTextParts, "flatMapTextParts");
@@ -144459,8 +144463,8 @@ ${result.llmContent}`;
144459
144463
  return "Limit must be a positive number";
144460
144464
  }
144461
144465
  const fileService = this.config.getFileService();
144462
- if (fileService.shouldQwenIgnoreFile(params.file_path)) {
144463
- return `File path '${filePath}' is ignored by .qwenignore pattern(s).`;
144466
+ if (fileService.shouldProtoIgnoreFile(params.file_path)) {
144467
+ return `File path '${filePath}' is ignored by .protoignore pattern(s).`;
144464
144468
  }
144465
144469
  return null;
144466
144470
  }
@@ -147854,7 +147858,8 @@ var init_converter = __esm({
147854
147858
  continue;
147855
147859
  if (toolCall.malformed) {
147856
147860
  parts2.push({
147857
- text: `[tool_call dropped: upstream streamed malformed JSON arguments for \`${toolCall.name}\`. Retry the call with properly-formed arguments.]`
147861
+ text: `[tool_call dropped: upstream streamed malformed JSON arguments for \`${toolCall.name}\`. Retry the call with properly-formed arguments.]`,
147862
+ protoInternal: true
147858
147863
  });
147859
147864
  continue;
147860
147865
  }
@@ -171109,7 +171114,7 @@ __export(geminiContentGenerator_exports, {
171109
171114
  createGeminiContentGenerator: () => createGeminiContentGenerator
171110
171115
  });
171111
171116
  function createGeminiContentGenerator(config2, gcConfig) {
171112
- const version2 = "0.26.3";
171117
+ const version2 = "0.26.5";
171113
171118
  const userAgent2 = config2.userAgent || `QwenCode/${version2} (${process.platform}; ${process.arch})`;
171114
171119
  const baseHeaders = {
171115
171120
  "User-Agent": userAgent2
@@ -173735,7 +173740,7 @@ function getThoughtText(response) {
173735
173740
  if (response.candidates && response.candidates.length > 0) {
173736
173741
  const candidate = response.candidates[0];
173737
173742
  if (candidate.content && candidate.content.parts && candidate.content.parts.length > 0) {
173738
- return candidate.content.parts.filter((part) => part.thought).map((part) => part.text ?? "").join("");
173743
+ return candidate.content.parts.filter((part) => part.thought && !isInternalPart(part)).map((part) => part.text ?? "").join("");
173739
173744
  }
173740
173745
  }
173741
173746
  return null;
@@ -173745,6 +173750,7 @@ var init_thoughtUtils = __esm({
173745
173750
  "packages/core/dist/src/utils/thoughtUtils.js"() {
173746
173751
  "use strict";
173747
173752
  init_esbuild_shims();
173753
+ init_partUtils();
173748
173754
  START_DELIMITER = "**";
173749
173755
  END_DELIMITER = "**";
173750
173756
  __name(parseThought, "parseThought");
@@ -189505,11 +189511,11 @@ var init_constants4 = __esm({
189505
189511
  init_esbuild_shims();
189506
189512
  DEFAULT_MEMORY_FILE_FILTERING_OPTIONS = {
189507
189513
  respectGitIgnore: false,
189508
- respectQwenIgnore: true
189514
+ respectProtoIgnore: true
189509
189515
  };
189510
189516
  DEFAULT_FILE_FILTERING_OPTIONS = {
189511
189517
  respectGitIgnore: true,
189512
- respectQwenIgnore: true
189518
+ respectProtoIgnore: true
189513
189519
  };
189514
189520
  }
189515
189521
  });
@@ -189566,7 +189572,7 @@ async function readFullStructure(rootPath, options2) {
189566
189572
  const fileName = entry.name;
189567
189573
  const filePath = path29.join(currentPath, fileName);
189568
189574
  if (options2.fileService) {
189569
- const shouldIgnore = options2.fileFilteringOptions.respectGitIgnore && options2.fileService.shouldGitIgnoreFile(filePath) || options2.fileFilteringOptions.respectQwenIgnore && options2.fileService.shouldQwenIgnoreFile(filePath);
189575
+ const shouldIgnore = options2.fileFilteringOptions.respectGitIgnore && options2.fileService.shouldGitIgnoreFile(filePath) || options2.fileFilteringOptions.respectProtoIgnore && options2.fileService.shouldProtoIgnoreFile(filePath);
189570
189576
  if (shouldIgnore) {
189571
189577
  continue;
189572
189578
  }
@@ -189590,7 +189596,7 @@ async function readFullStructure(rootPath, options2) {
189590
189596
  const subFolderPath = path29.join(currentPath, subFolderName);
189591
189597
  let isIgnored = false;
189592
189598
  if (options2.fileService) {
189593
- isIgnored = options2.fileFilteringOptions.respectGitIgnore && options2.fileService.shouldGitIgnoreFile(subFolderPath) || options2.fileFilteringOptions.respectQwenIgnore && options2.fileService.shouldQwenIgnoreFile(subFolderPath);
189599
+ isIgnored = options2.fileFilteringOptions.respectGitIgnore && options2.fileService.shouldGitIgnoreFile(subFolderPath) || options2.fileFilteringOptions.respectProtoIgnore && options2.fileService.shouldProtoIgnoreFile(subFolderPath);
189594
189600
  }
189595
189601
  if (options2.ignoredFolders.has(subFolderName) || isIgnored) {
189596
189602
  const ignoredSubFolder = {
@@ -199629,18 +199635,18 @@ var init_gitIgnoreParser = __esm({
199629
199635
  }
199630
199636
  });
199631
199637
 
199632
- // packages/core/dist/src/utils/qwenIgnoreParser.js
199638
+ // packages/core/dist/src/utils/protoIgnoreParser.js
199633
199639
  import * as fs32 from "node:fs";
199634
199640
  import * as path35 from "node:path";
199635
- var import_ignore2, QwenIgnoreParser;
199636
- var init_qwenIgnoreParser = __esm({
199637
- "packages/core/dist/src/utils/qwenIgnoreParser.js"() {
199641
+ var import_ignore2, ProtoIgnoreParser;
199642
+ var init_protoIgnoreParser = __esm({
199643
+ "packages/core/dist/src/utils/protoIgnoreParser.js"() {
199638
199644
  "use strict";
199639
199645
  init_esbuild_shims();
199640
199646
  import_ignore2 = __toESM(require_ignore(), 1);
199641
- QwenIgnoreParser = class {
199647
+ ProtoIgnoreParser = class {
199642
199648
  static {
199643
- __name(this, "QwenIgnoreParser");
199649
+ __name(this, "ProtoIgnoreParser");
199644
199650
  }
199645
199651
  projectRoot;
199646
199652
  patterns = [];
@@ -199650,14 +199656,23 @@ var init_qwenIgnoreParser = __esm({
199650
199656
  this.loadPatterns();
199651
199657
  }
199652
199658
  loadPatterns() {
199653
- const patternsFilePath = path35.join(this.projectRoot, ".qwenignore");
199654
- let content;
199655
- try {
199656
- content = fs32.readFileSync(patternsFilePath, "utf-8");
199657
- } catch (_error) {
199659
+ const sources = [".claudeignore", ".protoignore"];
199660
+ const merged = [];
199661
+ for (const filename of sources) {
199662
+ const patternsFilePath = path35.join(this.projectRoot, filename);
199663
+ let content;
199664
+ try {
199665
+ content = fs32.readFileSync(patternsFilePath, "utf-8");
199666
+ } catch (_error) {
199667
+ continue;
199668
+ }
199669
+ const lines = (content ?? "").split("\n").map((p2) => p2.trim()).filter((p2) => p2 !== "" && !p2.startsWith("#"));
199670
+ merged.push(...lines);
199671
+ }
199672
+ if (merged.length === 0) {
199658
199673
  return;
199659
199674
  }
199660
- this.patterns = (content ?? "").split("\n").map((p2) => p2.trim()).filter((p2) => p2 !== "" && !p2.startsWith("#"));
199675
+ this.patterns = merged;
199661
199676
  this.ig.add(this.patterns);
199662
199677
  }
199663
199678
  isIgnored(filePath) {
@@ -199696,34 +199711,34 @@ var init_fileDiscoveryService = __esm({
199696
199711
  "use strict";
199697
199712
  init_esbuild_shims();
199698
199713
  init_gitIgnoreParser();
199699
- init_qwenIgnoreParser();
199714
+ init_protoIgnoreParser();
199700
199715
  init_gitUtils();
199701
199716
  FileDiscoveryService = class {
199702
199717
  static {
199703
199718
  __name(this, "FileDiscoveryService");
199704
199719
  }
199705
199720
  gitIgnoreFilter = null;
199706
- qwenIgnoreFilter = null;
199721
+ protoIgnoreFilter = null;
199707
199722
  projectRoot;
199708
199723
  constructor(projectRoot) {
199709
199724
  this.projectRoot = path36.resolve(projectRoot);
199710
199725
  if (isGitRepository(this.projectRoot)) {
199711
199726
  this.gitIgnoreFilter = new GitIgnoreParser(this.projectRoot);
199712
199727
  }
199713
- this.qwenIgnoreFilter = new QwenIgnoreParser(this.projectRoot);
199728
+ this.protoIgnoreFilter = new ProtoIgnoreParser(this.projectRoot);
199714
199729
  }
199715
199730
  /**
199716
199731
  * Filters a list of file paths based on git ignore rules
199717
199732
  */
199718
199733
  filterFiles(filePaths, options2 = {
199719
199734
  respectGitIgnore: true,
199720
- respectQwenIgnore: true
199735
+ respectProtoIgnore: true
199721
199736
  }) {
199722
199737
  return filePaths.filter((filePath) => {
199723
199738
  if (options2.respectGitIgnore && this.shouldGitIgnoreFile(filePath)) {
199724
199739
  return false;
199725
199740
  }
199726
- if (options2.respectQwenIgnore && this.shouldQwenIgnoreFile(filePath)) {
199741
+ if (options2.respectProtoIgnore && this.shouldProtoIgnoreFile(filePath)) {
199727
199742
  return false;
199728
199743
  }
199729
199744
  return true;
@@ -199735,18 +199750,18 @@ var init_fileDiscoveryService = __esm({
199735
199750
  */
199736
199751
  filterFilesWithReport(filePaths, opts = {
199737
199752
  respectGitIgnore: true,
199738
- respectQwenIgnore: true
199753
+ respectProtoIgnore: true
199739
199754
  }) {
199740
199755
  const filteredPaths = [];
199741
199756
  let gitIgnoredCount = 0;
199742
- let qwenIgnoredCount = 0;
199757
+ let protoIgnoredCount = 0;
199743
199758
  for (const filePath of filePaths) {
199744
199759
  if (opts.respectGitIgnore && this.shouldGitIgnoreFile(filePath)) {
199745
199760
  gitIgnoredCount++;
199746
199761
  continue;
199747
199762
  }
199748
- if (opts.respectQwenIgnore && this.shouldQwenIgnoreFile(filePath)) {
199749
- qwenIgnoredCount++;
199763
+ if (opts.respectProtoIgnore && this.shouldProtoIgnoreFile(filePath)) {
199764
+ protoIgnoredCount++;
199750
199765
  continue;
199751
199766
  }
199752
199767
  filteredPaths.push(filePath);
@@ -199754,7 +199769,7 @@ var init_fileDiscoveryService = __esm({
199754
199769
  return {
199755
199770
  filteredPaths,
199756
199771
  gitIgnoredCount,
199757
- qwenIgnoredCount
199772
+ protoIgnoredCount
199758
199773
  };
199759
199774
  }
199760
199775
  /**
@@ -199767,11 +199782,11 @@ var init_fileDiscoveryService = __esm({
199767
199782
  return false;
199768
199783
  }
199769
199784
  /**
199770
- * Checks if a single file should be qwen-ignored
199785
+ * Checks if a single file should be proto-ignored
199771
199786
  */
199772
- shouldQwenIgnoreFile(filePath) {
199773
- if (this.qwenIgnoreFilter) {
199774
- return this.qwenIgnoreFilter.isIgnored(filePath);
199787
+ shouldProtoIgnoreFile(filePath) {
199788
+ if (this.protoIgnoreFilter) {
199789
+ return this.protoIgnoreFilter.isIgnored(filePath);
199775
199790
  }
199776
199791
  return false;
199777
199792
  }
@@ -199779,20 +199794,20 @@ var init_fileDiscoveryService = __esm({
199779
199794
  * Unified method to check if a file should be ignored based on filtering options
199780
199795
  */
199781
199796
  shouldIgnoreFile(filePath, options2 = {}) {
199782
- const { respectGitIgnore = true, respectQwenIgnore = true } = options2;
199797
+ const { respectGitIgnore = true, respectProtoIgnore = true } = options2;
199783
199798
  if (respectGitIgnore && this.shouldGitIgnoreFile(filePath)) {
199784
199799
  return true;
199785
199800
  }
199786
- if (respectQwenIgnore && this.shouldQwenIgnoreFile(filePath)) {
199801
+ if (respectProtoIgnore && this.shouldProtoIgnoreFile(filePath)) {
199787
199802
  return true;
199788
199803
  }
199789
199804
  return false;
199790
199805
  }
199791
199806
  /**
199792
- * Returns loaded patterns from .qwenignore
199807
+ * Returns loaded patterns from .protoignore
199793
199808
  */
199794
- getQwenIgnorePatterns() {
199795
- return this.qwenIgnoreFilter?.getPatterns() ?? [];
199809
+ getProtoIgnorePatterns() {
199810
+ return this.protoIgnoreFilter?.getPatterns() ?? [];
199796
199811
  }
199797
199812
  };
199798
199813
  }
@@ -232721,7 +232736,7 @@ ${fileListDescription}`;
232721
232736
  const options2 = this.config.getFileFilteringOptions?.();
232722
232737
  return {
232723
232738
  respectGitIgnore: options2?.respectGitIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectGitIgnore,
232724
- respectQwenIgnore: options2?.respectQwenIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectQwenIgnore
232739
+ respectProtoIgnore: options2?.respectProtoIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectProtoIgnore
232725
232740
  };
232726
232741
  }
232727
232742
  };
@@ -233317,9 +233332,9 @@ var init_ls = __esm({
233317
233332
  }
233318
233333
  const relativePaths = files.map((file2) => path48.relative(this.config.getTargetDir(), path48.join(this.params.path, file2)));
233319
233334
  const fileDiscovery = this.config.getFileService();
233320
- const { filteredPaths, gitIgnoredCount, qwenIgnoredCount } = fileDiscovery.filterFilesWithReport(relativePaths, {
233335
+ const { filteredPaths, gitIgnoredCount, protoIgnoredCount } = fileDiscovery.filterFilesWithReport(relativePaths, {
233321
233336
  respectGitIgnore: this.params.file_filtering_options?.respect_git_ignore ?? this.config.getFileFilteringOptions().respectGitIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectGitIgnore,
233322
- respectQwenIgnore: this.params.file_filtering_options?.respect_qwen_ignore ?? this.config.getFileFilteringOptions().respectQwenIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectQwenIgnore
233337
+ respectProtoIgnore: this.params.file_filtering_options?.respect_qwen_ignore ?? this.config.getFileFilteringOptions().respectProtoIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectProtoIgnore
233323
233338
  });
233324
233339
  const entries = [];
233325
233340
  for (const relativePath of filteredPaths) {
@@ -233367,8 +233382,8 @@ ${directoryContent}`;
233367
233382
  if (gitIgnoredCount > 0) {
233368
233383
  ignoredMessages.push(`${gitIgnoredCount} git-ignored`);
233369
233384
  }
233370
- if (qwenIgnoredCount > 0) {
233371
- ignoredMessages.push(`${qwenIgnoredCount} qwen-ignored`);
233385
+ if (protoIgnoredCount > 0) {
233386
+ ignoredMessages.push(`${protoIgnoredCount} proto-ignored`);
233372
233387
  }
233373
233388
  if (ignoredMessages.length > 0) {
233374
233389
  resultMessage += `
@@ -233413,7 +233428,7 @@ ${directoryContent}`;
233413
233428
  type: "array"
233414
233429
  },
233415
233430
  file_filtering_options: {
233416
- description: "Optional: Whether to respect ignore patterns from .gitignore or .qwenignore",
233431
+ description: "Optional: Whether to respect ignore patterns from .gitignore or .protoignore",
233417
233432
  type: "object",
233418
233433
  properties: {
233419
233434
  respect_git_ignore: {
@@ -233421,7 +233436,7 @@ ${directoryContent}`;
233421
233436
  type: "boolean"
233422
233437
  },
233423
233438
  respect_qwen_ignore: {
233424
- description: "Optional: Whether to respect .qwenignore patterns when listing files. Defaults to true.",
233439
+ description: "Optional: Whether to respect .protoignore patterns when listing files. Defaults to true.",
233425
233440
  type: "boolean"
233426
233441
  }
233427
233442
  }
@@ -233777,14 +233792,14 @@ var init_ripGrep = __esm({
233777
233792
  if (!filteringOptions.respectGitIgnore) {
233778
233793
  rgArgs.push("--no-ignore-vcs");
233779
233794
  }
233780
- if (filteringOptions.respectQwenIgnore) {
233795
+ if (filteringOptions.respectProtoIgnore) {
233781
233796
  const seenIgnoreFiles = /* @__PURE__ */ new Set();
233782
233797
  for (const searchPath of paths) {
233783
233798
  const dir = fs42.existsSync(searchPath) && fs42.statSync(searchPath).isDirectory() ? searchPath : path50.dirname(searchPath);
233784
- const qwenIgnorePath = path50.join(dir, ".qwenignore");
233785
- if (!seenIgnoreFiles.has(qwenIgnorePath) && fs42.existsSync(qwenIgnorePath)) {
233786
- rgArgs.push("--ignore-file", qwenIgnorePath);
233787
- seenIgnoreFiles.add(qwenIgnorePath);
233799
+ const protoIgnorePath = path50.join(dir, ".protoignore");
233800
+ if (!seenIgnoreFiles.has(protoIgnorePath) && fs42.existsSync(protoIgnorePath)) {
233801
+ rgArgs.push("--ignore-file", protoIgnorePath);
233802
+ seenIgnoreFiles.add(protoIgnorePath);
233788
233803
  }
233789
233804
  }
233790
233805
  }
@@ -233803,7 +233818,7 @@ var init_ripGrep = __esm({
233803
233818
  const options2 = this.config.getFileFilteringOptions?.();
233804
233819
  return {
233805
233820
  respectGitIgnore: options2?.respectGitIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectGitIgnore,
233806
- respectQwenIgnore: options2?.respectQwenIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectQwenIgnore
233821
+ respectProtoIgnore: options2?.respectProtoIgnore ?? DEFAULT_FILE_FILTERING_OPTIONS.respectProtoIgnore
233807
233822
  };
233808
233823
  }
233809
233824
  /**
@@ -275883,7 +275898,7 @@ var init_config3 = __esm({
275883
275898
  this.outputLanguageFilePath = params.outputLanguageFilePath;
275884
275899
  this.fileFiltering = {
275885
275900
  respectGitIgnore: params.fileFiltering?.respectGitIgnore ?? true,
275886
- respectQwenIgnore: params.fileFiltering?.respectQwenIgnore ?? true,
275901
+ respectProtoIgnore: params.fileFiltering?.respectProtoIgnore ?? true,
275887
275902
  enableRecursiveFileSearch: params.fileFiltering?.enableRecursiveFileSearch ?? true,
275888
275903
  enableFuzzySearch: params.fileFiltering?.enableFuzzySearch ?? true
275889
275904
  };
@@ -276631,13 +276646,13 @@ var init_config3 = __esm({
276631
276646
  getFileFilteringRespectGitIgnore() {
276632
276647
  return this.fileFiltering.respectGitIgnore;
276633
276648
  }
276634
- getFileFilteringRespectQwenIgnore() {
276635
- return this.fileFiltering.respectQwenIgnore;
276649
+ getFileFilteringRespectProtoIgnore() {
276650
+ return this.fileFiltering.respectProtoIgnore;
276636
276651
  }
276637
276652
  getFileFilteringOptions() {
276638
276653
  return {
276639
276654
  respectGitIgnore: this.fileFiltering.respectGitIgnore,
276640
- respectQwenIgnore: this.fileFiltering.respectQwenIgnore
276655
+ respectProtoIgnore: this.fileFiltering.respectProtoIgnore
276641
276656
  };
276642
276657
  }
276643
276658
  /**
@@ -286370,9 +286385,9 @@ function loadIgnoreRules(options2) {
286370
286385
  }
286371
286386
  }
286372
286387
  if (options2.useQwenignore) {
286373
- const qwenignorePath = path97.join(options2.projectRoot, ".qwenignore");
286374
- if (fs87.existsSync(qwenignorePath)) {
286375
- ignorer.add(fs87.readFileSync(qwenignorePath, "utf8"));
286388
+ const protoignorePath = path97.join(options2.projectRoot, ".protoignore");
286389
+ if (fs87.existsSync(protoignorePath)) {
286390
+ ignorer.add(fs87.readFileSync(protoignorePath, "utf8"));
286376
286391
  }
286377
286392
  }
286378
286393
  const ignoreDirs = [".git", ...options2.ignoreDirs];
@@ -288671,7 +288686,7 @@ async function readPathFromWorkspace(pathStr, config2) {
288671
288686
  const relativeFiles = files.map((p2) => path100.relative(config2.getTargetDir(), p2));
288672
288687
  const filteredFiles = fileService.filterFiles(relativeFiles, {
288673
288688
  respectGitIgnore: true,
288674
- respectQwenIgnore: true
288689
+ respectProtoIgnore: true
288675
288690
  });
288676
288691
  const finalFiles = filteredFiles.map((p2) => path100.resolve(config2.getTargetDir(), p2));
288677
288692
  for (const filePath of finalFiles) {
@@ -288688,7 +288703,7 @@ async function readPathFromWorkspace(pathStr, config2) {
288688
288703
  const relativePath = path100.relative(config2.getTargetDir(), absolutePath);
288689
288704
  const filtered = fileService.filterFiles([relativePath], {
288690
288705
  respectGitIgnore: true,
288691
- respectQwenIgnore: true
288706
+ respectProtoIgnore: true
288692
288707
  });
288693
288708
  if (filtered.length === 0) {
288694
288709
  return [];
@@ -289864,6 +289879,7 @@ __export(dist_exports, {
289864
289879
  isExtractionInProgress: () => isExtractionInProgress,
289865
289880
  isGenericQuotaExceededError: () => isGenericQuotaExceededError,
289866
289881
  isGitRepository: () => isGitRepository,
289882
+ isInternalPart: () => isInternalPart,
289867
289883
  isInvalidArgumentError: () => isInvalidArgumentError,
289868
289884
  isNodeError: () => isNodeError,
289869
289885
  isPathWithinRoot: () => isPathWithinRoot,
@@ -328820,7 +328836,7 @@ var init_en3 = __esm({
328820
328836
  // ============================================================================
328821
328837
  // Commands - General
328822
328838
  // ============================================================================
328823
- "Analyzes the project and creates a tailored QWEN.md file.": "Analyzes the project and creates a tailored QWEN.md file.",
328839
+ "Analyzes the project and creates a tailored PROTO.md file.": "Analyzes the project and creates a tailored PROTO.md file.",
328824
328840
  "List available proto tools. Usage: /tools [desc]": "List available proto tools. Usage: /tools [desc]",
328825
328841
  "List available skills.": "List available skills.",
328826
328842
  "Available proto CLI tools:": "Available proto CLI tools:",
@@ -328894,8 +328910,8 @@ var init_en3 = __esm({
328894
328910
  // ============================================================================
328895
328911
  // Agents - Creation Wizard
328896
328912
  // ============================================================================
328897
- "Project Level (.qwen/agents/)": "Project Level (.qwen/agents/)",
328898
- "User Level (~/.qwen/agents/)": "User Level (~/.qwen/agents/)",
328913
+ "Project Level (.proto/agents/)": "Project Level (.proto/agents/)",
328914
+ "User Level (~/.proto/agents/)": "User Level (~/.proto/agents/)",
328899
328915
  "\u2705 Subagent Created Successfully!": "\u2705 Subagent Created Successfully!",
328900
328916
  'Subagent "{{name}}" has been saved to {{level}} level.': 'Subagent "{{name}}" has been saved to {{level}} level.',
328901
328917
  "Name: ": "Name: ",
@@ -329041,7 +329057,7 @@ var init_en3 = __esm({
329041
329057
  "Custom Witty Phrases": "Custom Witty Phrases",
329042
329058
  "Show Welcome Back Dialog": "Show Welcome Back Dialog",
329043
329059
  "Enable User Feedback": "Enable User Feedback",
329044
- "How is Qwen doing this session? (optional)": "How is Qwen doing this session? (optional)",
329060
+ "How is Proto doing this session? (optional)": "How is Proto doing this session? (optional)",
329045
329061
  Bad: "Bad",
329046
329062
  Fine: "Fine",
329047
329063
  Good: "Good",
@@ -329063,7 +329079,7 @@ var init_en3 = __esm({
329063
329079
  "Memory Discovery Max Dirs": "Memory Discovery Max Dirs",
329064
329080
  "Load Memory From Include Directories": "Load Memory From Include Directories",
329065
329081
  "Respect .gitignore": "Respect .gitignore",
329066
- "Respect .qwenignore": "Respect .qwenignore",
329082
+ "Respect .protoignore": "Respect .protoignore",
329067
329083
  "Enable Recursive File Search": "Enable Recursive File Search",
329068
329084
  "Disable Fuzzy Search": "Disable Fuzzy Search",
329069
329085
  "Interactive Shell (PTY)": "Interactive Shell (PTY)",
@@ -329132,7 +329148,7 @@ var init_en3 = __esm({
329132
329148
  local: "local",
329133
329149
  remote: "remote",
329134
329150
  "This extension will add the following commands: {{commands}}.": "This extension will add the following commands: {{commands}}.",
329135
- "This extension will append info to your QWEN.md context using {{fileName}}": "This extension will append info to your QWEN.md context using {{fileName}}",
329151
+ "This extension will append info to your PROTO.md context using {{fileName}}": "This extension will append info to your PROTO.md context using {{fileName}}",
329136
329152
  "This extension will exclude the following core tools: {{tools}}": "This extension will exclude the following core tools: {{tools}}",
329137
329153
  "This extension will install the following skills:": "This extension will install the following skills:",
329138
329154
  "This extension will install the following subagents:": "This extension will install the following subagents:",
@@ -329255,7 +329271,7 @@ var init_en3 = __esm({
329255
329271
  "Exit codes:": "Exit codes:",
329256
329272
  "Configured hooks:": "Configured hooks:",
329257
329273
  "No hooks configured for this event.": "No hooks configured for this event.",
329258
- "To add hooks, edit settings.json directly or ask Qwen.": "To add hooks, edit settings.json directly or ask Qwen.",
329274
+ "To add hooks, edit settings.json directly or ask Proto.": "To add hooks, edit settings.json directly or ask Proto.",
329259
329275
  "Enter to select \xB7 Esc to go back": "Enter to select \xB7 Esc to go back",
329260
329276
  // Hooks - Config Detail Step
329261
329277
  "Hook details": "Hook details",
@@ -329263,7 +329279,7 @@ var init_en3 = __esm({
329263
329279
  "Extension:": "Extension:",
329264
329280
  "Desc:": "Desc:",
329265
329281
  "No hook config selected": "No hook config selected",
329266
- "To modify or remove this hook, edit settings.json directly or ask Qwen to help.": "To modify or remove this hook, edit settings.json directly or ask Qwen to help.",
329282
+ "To modify or remove this hook, edit settings.json directly or ask Proto to help.": "To modify or remove this hook, edit settings.json directly or ask Proto to help.",
329267
329283
  // Hooks - Disabled Step
329268
329284
  "Hook Configuration - Disabled": "Hook Configuration - Disabled",
329269
329285
  "All hooks are currently disabled. You have {{count}} that are not running.": "All hooks are currently disabled. You have {{count}} that are not running.",
@@ -329273,7 +329289,7 @@ var init_en3 = __esm({
329273
329289
  "No hook commands will execute": "No hook commands will execute",
329274
329290
  "StatusLine will not be displayed": "StatusLine will not be displayed",
329275
329291
  "Tool operations will proceed without hook validation": "Tool operations will proceed without hook validation",
329276
- 'To re-enable hooks, remove "disableAllHooks" from settings.json or ask Qwen Code.': 'To re-enable hooks, remove "disableAllHooks" from settings.json or ask Qwen Code.',
329292
+ 'To re-enable hooks, remove "disableAllHooks" from settings.json or ask Proto Code.': 'To re-enable hooks, remove "disableAllHooks" from settings.json or ask Proto Code.',
329277
329293
  // Hooks - Source
329278
329294
  Project: "Project",
329279
329295
  User: "User",
@@ -329319,7 +329335,7 @@ var init_en3 = __esm({
329319
329335
  "show stderr to model immediately": "show stderr to model immediately",
329320
329336
  "show stderr to user only but continue with tool call": "show stderr to user only but continue with tool call",
329321
329337
  "block processing, erase original prompt, and show stderr to user only": "block processing, erase original prompt, and show stderr to user only",
329322
- "stdout shown to Qwen": "stdout shown to Qwen",
329338
+ "stdout shown to Proto": "stdout shown to Proto",
329323
329339
  "show stderr to user only (blocking errors ignored)": "show stderr to user only (blocking errors ignored)",
329324
329340
  "command completes successfully": "command completes successfully",
329325
329341
  "stdout shown to subagent": "stdout shown to subagent",
@@ -329499,7 +329515,7 @@ var init_en3 = __esm({
329499
329515
  server: "server",
329500
329516
  servers: "servers",
329501
329517
  "Add MCP servers to your settings to get started.": "Add MCP servers to your settings to get started.",
329502
- "Run qwen --debug to see error logs": "Run qwen --debug to see error logs",
329518
+ "Run proto --debug to see error logs": "Run proto --debug to see error logs",
329503
329519
  // MCP OAuth Authentication
329504
329520
  "OAuth Authentication": "OAuth Authentication",
329505
329521
  "Press Enter to start authentication, Esc to go back": "Press Enter to start authentication, Esc to go back",
@@ -329567,7 +329583,7 @@ var init_en3 = __esm({
329567
329583
  // ============================================================================
329568
329584
  // Commands - Summary
329569
329585
  // ============================================================================
329570
- "Generate a project summary and save it to .qwen/PROJECT_SUMMARY.md": "Generate a project summary and save it to .qwen/PROJECT_SUMMARY.md",
329586
+ "Generate a project summary and save it to .proto/PROJECT_SUMMARY.md": "Generate a project summary and save it to .proto/PROJECT_SUMMARY.md",
329571
329587
  "No chat client available to generate summary.": "No chat client available to generate summary.",
329572
329588
  "Already generating summary, wait for previous request to complete": "Already generating summary, wait for previous request to complete",
329573
329589
  "No conversation found to summarize.": "No conversation found to summarize.",
@@ -329608,7 +329624,7 @@ var init_en3 = __esm({
329608
329624
  "Please provide at least one path to add.": "Please provide at least one path to add.",
329609
329625
  "The /directory add command is not supported in restrictive sandbox profiles. Please use --include-directories when starting the session instead.": "The /directory add command is not supported in restrictive sandbox profiles. Please use --include-directories when starting the session instead.",
329610
329626
  "Error adding '{{path}}': {{error}}": "Error adding '{{path}}': {{error}}",
329611
- "Successfully added QWEN.md files from the following directories if there are:\n- {{directories}}": "Successfully added QWEN.md files from the following directories if there are:\n- {{directories}}",
329627
+ "Successfully added PROTO.md files from the following directories if there are:\n- {{directories}}": "Successfully added PROTO.md files from the following directories if there are:\n- {{directories}}",
329612
329628
  "Error refreshing memory: {{error}}": "Error refreshing memory: {{error}}",
329613
329629
  "Successfully added directories:\n- {{directories}}": "Successfully added directories:\n- {{directories}}",
329614
329630
  "Current workspace directories:\n{{directories}}": "Current workspace directories:\n{{directories}}",
@@ -329680,8 +329696,8 @@ var init_en3 = __esm({
329680
329696
  "OpenAI API key is required to use OpenAI authentication.": "OpenAI API key is required to use OpenAI authentication.",
329681
329697
  "You must select an auth method to proceed. Press Ctrl+C again to exit.": "You must select an auth method to proceed. Press Ctrl+C again to exit.",
329682
329698
  "Terms of Services and Privacy Notice": "Terms of Services and Privacy Notice",
329683
- "Qwen OAuth": "Qwen OAuth",
329684
- "Free \xB7 Up to 1,000 requests/day \xB7 Qwen latest models": "Free \xB7 Up to 1,000 requests/day \xB7 Qwen latest models",
329699
+ "Proto OAuth": "Proto OAuth",
329700
+ "Free \xB7 Up to 1,000 requests/day \xB7 Proto latest models": "Free \xB7 Up to 1,000 requests/day \xB7 Proto latest models",
329685
329701
  "Login with QwenChat account to use daily free quota.": "Login with QwenChat account to use daily free quota.",
329686
329702
  "Paid \xB7 Up to 6,000 requests/5 hrs \xB7 All Alibaba Cloud Coding Plan Models": "Paid \xB7 Up to 6,000 requests/5 hrs \xB7 All Alibaba Cloud Coding Plan Models",
329687
329703
  "Alibaba Cloud Coding Plan": "Alibaba Cloud Coding Plan",
@@ -329691,20 +329707,20 @@ var init_en3 = __esm({
329691
329707
  OpenAI: "OpenAI",
329692
329708
  "Failed to login. Message: {{message}}": "Failed to login. Message: {{message}}",
329693
329709
  "Authentication is enforced to be {{enforcedType}}, but you are currently using {{currentType}}.": "Authentication is enforced to be {{enforcedType}}, but you are currently using {{currentType}}.",
329694
- "Qwen OAuth authentication timed out. Please try again.": "Qwen OAuth authentication timed out. Please try again.",
329695
- "Qwen OAuth authentication cancelled.": "Qwen OAuth authentication cancelled.",
329696
- "Qwen OAuth Authentication": "Qwen OAuth Authentication",
329710
+ "Proto OAuth authentication timed out. Please try again.": "Proto OAuth authentication timed out. Please try again.",
329711
+ "Proto OAuth authentication cancelled.": "Proto OAuth authentication cancelled.",
329712
+ "Proto OAuth Authentication": "Proto OAuth Authentication",
329697
329713
  "Please visit this URL to authorize:": "Please visit this URL to authorize:",
329698
329714
  "Or scan the QR code below:": "Or scan the QR code below:",
329699
329715
  "Waiting for authorization": "Waiting for authorization",
329700
329716
  "Time remaining:": "Time remaining:",
329701
329717
  "(Press ESC or CTRL+C to cancel)": "(Press ESC or CTRL+C to cancel)",
329702
- "Qwen OAuth Authentication Timeout": "Qwen OAuth Authentication Timeout",
329718
+ "Proto OAuth Authentication Timeout": "Proto OAuth Authentication Timeout",
329703
329719
  "OAuth token expired (over {{seconds}} seconds). Please select authentication method again.": "OAuth token expired (over {{seconds}} seconds). Please select authentication method again.",
329704
329720
  "Press any key to return to authentication type selection.": "Press any key to return to authentication type selection.",
329705
- "Waiting for Qwen OAuth authentication...": "Waiting for Qwen OAuth authentication...",
329706
- "Note: Your existing API key in settings.json will not be cleared when using Qwen OAuth. You can switch back to OpenAI authentication later if needed.": "Note: Your existing API key in settings.json will not be cleared when using Qwen OAuth. You can switch back to OpenAI authentication later if needed.",
329707
- "Note: Your existing API key will not be cleared when using Qwen OAuth.": "Note: Your existing API key will not be cleared when using Qwen OAuth.",
329721
+ "Waiting for Proto OAuth authentication...": "Waiting for Proto OAuth authentication...",
329722
+ "Note: Your existing API key in settings.json will not be cleared when using Proto OAuth. You can switch back to OpenAI authentication later if needed.": "Note: Your existing API key in settings.json will not be cleared when using Proto OAuth. You can switch back to OpenAI authentication later if needed.",
329723
+ "Note: Your existing API key will not be cleared when using Proto OAuth.": "Note: Your existing API key will not be cleared when using Proto OAuth.",
329708
329724
  "Authentication timed out. Please try again.": "Authentication timed out. Please try again.",
329709
329725
  "Waiting for auth... (Press ESC or CTRL+C to cancel)": "Waiting for auth... (Press ESC or CTRL+C to cancel)",
329710
329726
  "Missing API key for OpenAI-compatible auth. Set settings.security.auth.apiKey, or set the {{envKeyHint}} environment variable.": "Missing API key for OpenAI-compatible auth. Set settings.security.auth.apiKey, or set the {{envKeyHint}} environment variable.",
@@ -329748,8 +329764,8 @@ var init_en3 = __esm({
329748
329764
  none: "none",
329749
329765
  unknown: "unknown",
329750
329766
  "Failed to switch model to '{{modelId}}'.\n\n{{error}}": "Failed to switch model to '{{modelId}}'.\n\n{{error}}",
329751
- "Qwen 3.5 Plus \u2014 efficient hybrid model with leading coding performance": "Qwen 3.5 Plus \u2014 efficient hybrid model with leading coding performance",
329752
- "The latest Qwen Vision model from Alibaba Cloud ModelStudio (version: qwen3-vl-plus-2025-09-23)": "The latest Qwen Vision model from Alibaba Cloud ModelStudio (version: qwen3-vl-plus-2025-09-23)",
329767
+ "Proto 3.5 Plus \u2014 efficient hybrid model with leading coding performance": "Proto 3.5 Plus \u2014 efficient hybrid model with leading coding performance",
329768
+ "The latest Proto Vision model from Alibaba Cloud ModelStudio (version: qwen3-vl-plus-2025-09-23)": "The latest Proto Vision model from Alibaba Cloud ModelStudio (version: qwen3-vl-plus-2025-09-23)",
329753
329769
  // ============================================================================
329754
329770
  // Dialogs - Permissions
329755
329771
  // ============================================================================
@@ -329769,11 +329785,11 @@ var init_en3 = __esm({
329769
329785
  "From project settings": "From project settings",
329770
329786
  "From session": "From session",
329771
329787
  "Project settings (local)": "Project settings (local)",
329772
- "Saved in .qwen/settings.local.json": "Saved in .qwen/settings.local.json",
329788
+ "Saved in .proto/settings.local.json": "Saved in .proto/settings.local.json",
329773
329789
  "Project settings": "Project settings",
329774
- "Checked in at .qwen/settings.json": "Checked in at .qwen/settings.json",
329790
+ "Checked in at .proto/settings.json": "Checked in at .proto/settings.json",
329775
329791
  "User settings": "User settings",
329776
- "Saved in at ~/.qwen/settings.json": "Saved in at ~/.qwen/settings.json",
329792
+ "Saved in at ~/.proto/settings.json": "Saved in at ~/.proto/settings.json",
329777
329793
  "Add a new rule\u2026": "Add a new rule\u2026",
329778
329794
  "Add {{type}} permission rule": "Add {{type}} permission rule",
329779
329795
  "Permission rules are a tool name, optionally followed by a specifier in parentheses.": "Permission rules are a tool name, optionally followed by a specifier in parentheses.",
@@ -329867,7 +329883,7 @@ var init_en3 = __esm({
329867
329883
  "Switch auth type quickly with /auth.": "Switch auth type quickly with /auth.",
329868
329884
  "You can run any shell commands from proto using ! (e.g. !ls).": "You can run any shell commands from proto using ! (e.g. !ls).",
329869
329885
  "Type / to open the command popup; Tab autocompletes slash commands and saved prompts.": "Type / to open the command popup; Tab autocompletes slash commands and saved prompts.",
329870
- "You can resume a previous conversation by running qwen --continue or qwen --resume.": "You can resume a previous conversation by running qwen --continue or qwen --resume.",
329886
+ "You can resume a previous conversation by running proto --continue or proto --resume.": "You can resume a previous conversation by running proto --continue or proto --resume.",
329871
329887
  "You can switch permission mode quickly with Shift+Tab or /approval-mode.": "You can switch permission mode quickly with Shift+Tab or /approval-mode.",
329872
329888
  "You can switch permission mode quickly with Tab or /approval-mode.": "You can switch permission mode quickly with Tab or /approval-mode.",
329873
329889
  "Try /insight to generate personalized insights from your chat history.": "Try /insight to generate personalized insights from your chat history.",
@@ -329941,133 +329957,156 @@ var init_en3 = __esm({
329941
329957
  // Loading Phrases
329942
329958
  // ============================================================================
329943
329959
  WITTY_LOADING_PHRASES: [
329944
- "I'm Feeling Lucky",
329945
- "Shipping awesomeness... ",
329946
- "Painting the serifs back on...",
329947
- "Navigating the slime mold...",
329948
- "Consulting the digital spirits...",
329949
- "Reticulating splines...",
329950
- "Warming up the AI hamsters...",
329951
- "Asking the magic conch shell...",
329952
- "Generating witty retort...",
329953
- "Polishing the algorithms...",
329954
- "Don't rush perfection (or my code)...",
329955
- "Brewing fresh bytes...",
329956
- "Counting electrons...",
329957
- "Engaging cognitive processors...",
329958
- "Checking for syntax errors in the universe...",
329959
- "One moment, optimizing humor...",
329960
- "Shuffling punchlines...",
329961
- "Untangling neural nets...",
329962
- "Compiling brilliance...",
329963
- "Loading wit.exe...",
329964
- "Summoning the cloud of wisdom...",
329965
- "Preparing a witty response...",
329966
- "Just a sec, I'm debugging reality...",
329967
- "Confuzzling the options...",
329968
- "Tuning the cosmic frequencies...",
329969
- "Crafting a response worthy of your patience...",
329970
- "Compiling the 1s and 0s...",
329971
- "Resolving dependencies... and existential crises...",
329972
- "Defragmenting memories... both RAM and personal...",
329973
- "Rebooting the humor module...",
329974
- "Caching the essentials (mostly cat memes)...",
329975
- "Optimizing for ludicrous speed",
329976
- "Swapping bits... don't tell the bytes...",
329977
- "Garbage collecting... be right back...",
329978
- "Assembling the interwebs...",
329979
- "Converting coffee into code...",
329980
- "Updating the syntax for reality...",
329981
- "Rewiring the synapses...",
329982
- "Looking for a misplaced semicolon...",
329983
- "Greasin' the cogs of the machine...",
329984
- "Pre-heating the servers...",
329985
- "Calibrating the flux capacitor...",
329986
- "Engaging the improbability drive...",
329987
- "Channeling the Force...",
329988
- "Aligning the stars for optimal response...",
329989
- "So say we all...",
329990
- "Loading the next great idea...",
329991
- "Just a moment, I'm in the zone...",
329992
- "Preparing to dazzle you with brilliance...",
329993
- "Just a tick, I'm polishing my wit...",
329994
- "Hold tight, I'm crafting a masterpiece...",
329995
- "Just a jiffy, I'm debugging the universe...",
329996
- "Just a moment, I'm aligning the pixels...",
329997
- "Just a sec, I'm optimizing the humor...",
329998
- "Just a moment, I'm tuning the algorithms...",
329999
- "Warp speed engaged...",
330000
- "Mining for more Dilithium crystals...",
330001
- "Don't panic...",
330002
- "Following the white rabbit...",
330003
- "The truth is in here... somewhere...",
330004
- "Blowing on the cartridge...",
330005
- "Loading... Do a barrel roll!",
330006
- "Waiting for the respawn...",
330007
- "Finishing the Kessel Run in less than 12 parsecs...",
330008
- "The cake is not a lie, it's just still loading...",
330009
- "Fiddling with the character creation screen...",
330010
- "Just a moment, I'm finding the right meme...",
330011
- "Pressing 'A' to continue...",
330012
- "Herding digital cats...",
330013
- "Polishing the pixels...",
330014
- "Finding a suitable loading screen pun...",
330015
- "Distracting you with this witty phrase...",
330016
- "Almost there... probably...",
330017
- "Our hamsters are working as fast as they can...",
330018
- "Giving Cloudy a pat on the head...",
330019
- "Petting the cat...",
330020
- "Rickrolling my boss...",
330021
- "Never gonna give you up, never gonna let you down...",
330022
- "Slapping the bass...",
330023
- "Tasting the snozberries...",
330024
- "I'm going the distance, I'm going for speed...",
330025
- "Is this the real life? Is this just fantasy?...",
330026
- "I've got a good feeling about this...",
330027
- "Poking the bear...",
330028
- "Doing research on the latest memes...",
330029
- "Figuring out how to make this more witty...",
330030
- "Hmmm... let me think...",
330031
- "What do you call a fish with no eyes? A fsh...",
330032
- "Why did the computer go to therapy? It had too many bytes...",
330033
- "Why don't programmers like nature? It has too many bugs...",
330034
- "Why do programmers prefer dark mode? Because light attracts bugs...",
330035
- "Why did the developer go broke? Because they used up all their cache...",
330036
- "What can you do with a broken pencil? Nothing, it's pointless...",
330037
- "Applying percussive maintenance...",
330038
- "Searching for the correct USB orientation...",
330039
- "Ensuring the magic smoke stays inside the wires...",
330040
- "Trying to exit Vim...",
330041
- "Spinning up the hamster wheel...",
330042
- "That's not a bug, it's an undocumented feature...",
330043
- "Engage.",
330044
- "I'll be back... with an answer.",
330045
- "My other process is a TARDIS...",
330046
- "Communing with the machine spirit...",
330047
- "Letting the thoughts marinate...",
330048
- "Just remembered where I put my keys...",
330049
- "Pondering the orb...",
330050
- "I've seen things you people wouldn't believe... like a user who reads loading messages.",
330051
- "Initiating thoughtful gaze...",
330052
- "What's a computer's favorite snack? Microchips.",
330053
- "Why do Java developers wear glasses? Because they don't C#.",
330054
- "Charging the laser... pew pew!",
330055
- "Dividing by zero... just kidding!",
330056
- "Looking for an adult superviso... I mean, processing.",
330057
- "Making it go beep boop.",
330058
- "Buffering... because even AIs need a moment.",
330059
- "Entangling quantum particles for a faster response...",
330060
- "Polishing the chrome... on the algorithms.",
330061
- "Are you not entertained? (Working on it!)",
330062
- "Summoning the code gremlins... to help, of course.",
330063
- "Just waiting for the dial-up tone to finish...",
330064
- "Recalibrating the humor-o-meter.",
330065
- "My other loading screen is even funnier.",
330066
- "Pretty sure there's a cat walking on the keyboard somewhere...",
330067
- "Enhancing... Enhancing... Still loading.",
330068
- "It's not a bug, it's a feature... of this loading screen.",
330069
- "Have you tried turning it off and on again? (The loading screen, not me.)",
330070
- "Constructing additional pylons..."
329960
+ "The server is checking its reflection",
329961
+ "Waiting for the database to finish its thought",
329962
+ "The code is looking for its other sock",
329963
+ "The API went to the bathroom",
329964
+ "The server is pretending to be asleep",
329965
+ "Asking the cache if it's lying",
329966
+ "The function is stalling for time",
329967
+ "The database is avoiding eye contact",
329968
+ "Waiting for the loop to get to the point",
329969
+ "The server is checking its phone",
329970
+ "The code is second-guessing everything",
329971
+ "The API is making excuses",
329972
+ "The server forgot what it was doing",
329973
+ "The function is clearing its throat",
329974
+ "Waiting for the process to stop rambling",
329975
+ "The database is choosing its words carefully",
329976
+ "The server is pretending to be busy",
329977
+ "The code is checking if you're still watching",
329978
+ "The API is running late, as usual",
329979
+ "The server is looking for a pen that works",
329980
+ "The function is trying to remember where it left off",
329981
+ "The database is having an existential moment",
329982
+ "Waiting for the code to get its story straight",
329983
+ "The server is looking for its glasses",
329984
+ "The API is stuck on hold",
329985
+ "The function is checking the weather first",
329986
+ "The database is reorganizing before it can start",
329987
+ "The server is waiting for someone else to go first",
329988
+ "The code is making sure it locked the door",
329989
+ "The API is just... one more minute",
329990
+ "Asking the server if it's mad at me",
329991
+ "Waiting for the database to finish its cigarette",
329992
+ "The pixels are discussing amongst themselves",
329993
+ "Giving the code a minute to collect its thoughts",
329994
+ "Letting the algorithm finish chewing",
329995
+ "The server is finding its reading glasses",
329996
+ "Asking the cache what it remembers",
329997
+ "The API is looking for its car keys",
329998
+ "Waiting for the function to get off the phone",
329999
+ "The data is stuck in traffic",
330000
+ "Checking if the server left a note",
330001
+ "The code is rereading the same paragraph",
330002
+ "Asking the database to repeat itself",
330003
+ "The server is deciding what to wear",
330004
+ "Waiting for the loop to get the point",
330005
+ "The request got distracted",
330006
+ "The server is pretending it didn't hear you",
330007
+ "Checking the back of the warehouse",
330008
+ "The code is having second thoughts",
330009
+ "Waiting for the process to finish its story",
330010
+ "The API went to get milk",
330011
+ "The server is double-checking its work",
330012
+ "Loading the thing behind the thing",
330013
+ "The database is reorganizing its junk drawer",
330014
+ "Asking the cache if it's sure",
330015
+ "The code is trying to remember your name",
330016
+ "Waiting for the server to put its pants on",
330017
+ "The function is gathering evidence",
330018
+ "The API is reading the instructions",
330019
+ "The server is looking for the light switch",
330020
+ "The server is rewinding the VHS tape",
330021
+ "Waiting for the modem to finish screaming",
330022
+ "The database is paging someone",
330023
+ "Blowing on the cartridge and trying again",
330024
+ "The API is waiting for dial-up to connect",
330025
+ "The server left its Tamagotchi at home",
330026
+ "Checking if the cord is plugged into the phone jack",
330027
+ "The code is recording over someone's wedding",
330028
+ "Waiting for the CD to stop skipping",
330029
+ "The function burned itself onto a CD-R",
330030
+ "The database is fast-forwarding through the commercials",
330031
+ "The server is adjusting the rabbit ears",
330032
+ "The API is stuck in the credits",
330033
+ "Tracking down which disc the file is on",
330034
+ "The code is in a chat room somewhere",
330035
+ "The server is setting the VCR timer",
330036
+ "Waiting for the floppy disk to stop grinding",
330037
+ "The database is selecting its AIM away message",
330038
+ "The function is asking Jeeves",
330039
+ "The server is reading the liner notes",
330040
+ "The API pressed B too many times",
330041
+ "The code is trying to remember its ICQ number",
330042
+ "Waiting for the answering machine to beep",
330043
+ "The database is untangling its landline cord",
330044
+ "The server is loading the next track",
330045
+ "The function is stuck in a Portal of Time",
330046
+ "The API is checking its pager",
330047
+ "The code is looking for the right jewel case",
330048
+ "The server is making a mix tape first",
330049
+ "Waiting for Y2K to sort itself out",
330050
+ "The server will be back",
330051
+ "Show me the data",
330052
+ "The code can't handle the truth",
330053
+ "The API is in the pipe, five by five",
330054
+ "You're gonna need a bigger server",
330055
+ "The function has a bad feeling about this",
330056
+ "The database doesn't remember asking you a damn thing",
330057
+ "Waiting for the server to say hello to my little friend",
330058
+ "The code is going to make you an offer you can't refuse",
330059
+ "The API is too old for this shit",
330060
+ "The server is walking here",
330061
+ "The function is on a mission from God",
330062
+ "Just when the code thought it was out",
330063
+ "The database can do this all day",
330064
+ "The server is in a world of pain",
330065
+ "The API sleeps with the fishes",
330066
+ "The code is Keyser S\xF6ze",
330067
+ "Waiting for the function to get busy living",
330068
+ "The database is not a smart man, but it knows what love is",
330069
+ "The server sees dead processes",
330070
+ "The API is going to need you to go ahead and come in on Saturday",
330071
+ "The code is on a boat",
330072
+ "The function is shocked, shocked",
330073
+ "The database is making fetch happen",
330074
+ "The server is so fetch",
330075
+ "The API is streets ahead",
330076
+ "The code is the one who knocks",
330077
+ "Waiting for the function to phone home",
330078
+ "The database is big, it's heavy, it's wood",
330079
+ "The server forgot about Dre",
330080
+ "The server is never gonna give you up",
330081
+ "The API is living on a prayer",
330082
+ "The code wants to know what love is",
330083
+ "The database is walking on sunshine",
330084
+ "The function is a Material Girl",
330085
+ "The server just called to say I love you",
330086
+ "The API is waiting for tonight",
330087
+ "The code is gonna party like it's 1999",
330088
+ "The database hit me baby one more time",
330089
+ "The server says bye bye bye",
330090
+ "The function is too sexy for this code",
330091
+ "The API is thinking about you and me and you and me",
330092
+ "The code is trapped under ice cream",
330093
+ "The database is turning Japanese",
330094
+ "The server is walking like an Egyptian",
330095
+ "The function is addicted to love",
330096
+ "The API wants you to know what it's like",
330097
+ "The code is running down a dream",
330098
+ "The database is living la vida loca",
330099
+ "The server is smooth like butter",
330100
+ "The function believes it can fly",
330101
+ "The API is gonna be the one that saves you",
330102
+ "The code is not your stepping stone",
330103
+ "The database is hungry like the wolf",
330104
+ "The server is livin' on the edge",
330105
+ "The function can't feel its face",
330106
+ "The API doesn't want no scrubs",
330107
+ "The code is floating down the Liffey",
330108
+ "The database is losing its religion",
330109
+ "The server is under pressure"
330071
330110
  ],
330072
330111
  // ============================================================================
330073
330112
  // Extension Settings Input
@@ -330190,16 +330229,16 @@ var init_en3 = __esm({
330190
330229
  // ============================================================================
330191
330230
  // Commands - Auth
330192
330231
  // ============================================================================
330193
- "Configure Qwen authentication information with Qwen-OAuth or Alibaba Cloud Coding Plan": "Configure Qwen authentication information with Qwen-OAuth or Alibaba Cloud Coding Plan",
330194
- "Authenticate using Qwen OAuth": "Authenticate using Qwen OAuth",
330232
+ "Configure Proto authentication information with Proto-OAuth or Alibaba Cloud Coding Plan": "Configure Proto authentication information with Proto-OAuth or Alibaba Cloud Coding Plan",
330233
+ "Authenticate using Proto OAuth": "Authenticate using Proto OAuth",
330195
330234
  "Authenticate using Alibaba Cloud Coding Plan": "Authenticate using Alibaba Cloud Coding Plan",
330196
330235
  "Region for Coding Plan (china/global)": "Region for Coding Plan (china/global)",
330197
330236
  "API key for Coding Plan": "API key for Coding Plan",
330198
330237
  "Show current authentication status": "Show current authentication status",
330199
330238
  "Authentication completed successfully.": "Authentication completed successfully.",
330200
- "Starting Qwen OAuth authentication...": "Starting Qwen OAuth authentication...",
330201
- "Successfully authenticated with Qwen OAuth.": "Successfully authenticated with Qwen OAuth.",
330202
- "Failed to authenticate with Qwen OAuth: {{error}}": "Failed to authenticate with Qwen OAuth: {{error}}",
330239
+ "Starting Proto OAuth authentication...": "Starting Proto OAuth authentication...",
330240
+ "Successfully authenticated with Proto OAuth.": "Successfully authenticated with Proto OAuth.",
330241
+ "Failed to authenticate with Proto OAuth: {{error}}": "Failed to authenticate with Proto OAuth: {{error}}",
330203
330242
  "Processing Alibaba Cloud Coding Plan authentication...": "Processing Alibaba Cloud Coding Plan authentication...",
330204
330243
  "Successfully authenticated with Alibaba Cloud Coding Plan.": "Successfully authenticated with Alibaba Cloud Coding Plan.",
330205
330244
  "Failed to authenticate with Coding Plan: {{error}}": "Failed to authenticate with Coding Plan: {{error}}",
@@ -330213,14 +330252,14 @@ var init_en3 = __esm({
330213
330252
  "\n=== Authentication Status ===\n": "\n=== Authentication Status ===\n",
330214
330253
  "\u26A0\uFE0F No authentication method configured.\n": "\u26A0\uFE0F No authentication method configured.\n",
330215
330254
  "Run one of the following commands to get started:\n": "Run one of the following commands to get started:\n",
330216
- " qwen auth qwen-oauth - Authenticate with Qwen OAuth (free tier)": " qwen auth qwen-oauth - Authenticate with Qwen OAuth (free tier)",
330217
- " qwen auth coding-plan - Authenticate with Alibaba Cloud Coding Plan\n": " qwen auth coding-plan - Authenticate with Alibaba Cloud Coding Plan\n",
330255
+ " proto auth proto-oauth - Authenticate with Proto OAuth (free tier)": " proto auth proto-oauth - Authenticate with Proto OAuth (free tier)",
330256
+ " proto auth coding-plan - Authenticate with Alibaba Cloud Coding Plan\n": " proto auth coding-plan - Authenticate with Alibaba Cloud Coding Plan\n",
330218
330257
  "Or simply run:": "Or simply run:",
330219
- " qwen auth - Interactive authentication setup\n": " qwen auth - Interactive authentication setup\n",
330220
- "\u2713 Authentication Method: Qwen OAuth": "\u2713 Authentication Method: Qwen OAuth",
330258
+ " proto auth - Interactive authentication setup\n": " proto auth - Interactive authentication setup\n",
330259
+ "\u2713 Authentication Method: Proto OAuth": "\u2713 Authentication Method: Proto OAuth",
330221
330260
  " Type: Free tier": " Type: Free tier",
330222
330261
  " Limit: Up to 1,000 requests/day": " Limit: Up to 1,000 requests/day",
330223
- " Models: Qwen latest models\n": " Models: Qwen latest models\n",
330262
+ " Models: Proto latest models\n": " Models: Proto latest models\n",
330224
330263
  "\u2713 Authentication Method: Alibaba Cloud Coding Plan": "\u2713 Authentication Method: Alibaba Cloud Coding Plan",
330225
330264
  "\u4E2D\u56FD (China) - \u963F\u91CC\u4E91\u767E\u70BC": "\u4E2D\u56FD (China) - \u963F\u91CC\u4E91\u767E\u70BC",
330226
330265
  "Global - Alibaba Cloud": "Global - Alibaba Cloud",
@@ -330230,7 +330269,7 @@ var init_en3 = __esm({
330230
330269
  " Status: API key configured\n": " Status: API key configured\n",
330231
330270
  "\u26A0\uFE0F Authentication Method: Alibaba Cloud Coding Plan (Incomplete)": "\u26A0\uFE0F Authentication Method: Alibaba Cloud Coding Plan (Incomplete)",
330232
330271
  " Issue: API key not found in environment or settings\n": " Issue: API key not found in environment or settings\n",
330233
- " Run `qwen auth coding-plan` to re-configure.\n": " Run `qwen auth coding-plan` to re-configure.\n",
330272
+ " Run `proto auth coding-plan` to re-configure.\n": " Run `proto auth coding-plan` to re-configure.\n",
330234
330273
  "\u2713 Authentication Method: {{type}}": "\u2713 Authentication Method: {{type}}",
330235
330274
  " Status: Configured\n": " Status: Configured\n",
330236
330275
  "Failed to check authentication status: {{error}}": "Failed to check authentication status: {{error}}",
@@ -405606,13 +405645,13 @@ var SETTINGS_SCHEMA = {
405606
405645
  description: "Respect .gitignore files when searching",
405607
405646
  showInDialog: true
405608
405647
  },
405609
- respectQwenIgnore: {
405648
+ respectProtoIgnore: {
405610
405649
  type: "boolean",
405611
- label: "Respect .qwenignore",
405650
+ label: "Respect .protoignore",
405612
405651
  category: "Context",
405613
405652
  requiresRestart: true,
405614
405653
  default: true,
405615
- description: "Respect .qwenignore files when searching",
405654
+ description: "Respect .protoignore files when searching",
405616
405655
  showInDialog: true
405617
405656
  },
405618
405657
  enableRecursiveFileSearch: {
@@ -406839,7 +406878,7 @@ var SETTINGS_DIALOG_ORDER = [
406839
406878
  "general.gitCoAuthor",
406840
406879
  // File Filtering
406841
406880
  "context.fileFiltering.respectGitIgnore",
406842
- "context.fileFiltering.respectQwenIgnore",
406881
+ "context.fileFiltering.respectProtoIgnore",
406843
406882
  // System Settings - rarely changed
406844
406883
  "general.disableAutoUpdate",
406845
406884
  // Privacy
@@ -416089,7 +416128,7 @@ __name(getPackageJson, "getPackageJson");
416089
416128
  // packages/cli/src/utils/version.ts
416090
416129
  async function getCliVersion() {
416091
416130
  const pkgJson = await getPackageJson();
416092
- return "0.26.3";
416131
+ return "0.26.5";
416093
416132
  }
416094
416133
  __name(getCliVersion, "getCliVersion");
416095
416134
 
@@ -423861,7 +423900,7 @@ var formatDuration = /* @__PURE__ */ __name((milliseconds) => {
423861
423900
 
423862
423901
  // packages/cli/src/generated/git-commit.ts
423863
423902
  init_esbuild_shims();
423864
- var GIT_COMMIT_INFO = "e2418fd12";
423903
+ var GIT_COMMIT_INFO = "3cea3ab78";
423865
423904
 
423866
423905
  // packages/cli/src/utils/systemInfo.ts
423867
423906
  async function getNpmVersion() {
@@ -426122,6 +426161,7 @@ import { randomUUID as randomUUID7 } from "node:crypto";
426122
426161
 
426123
426162
  // packages/cli/src/acp-integration/session/HistoryReplayer.ts
426124
426163
  init_esbuild_shims();
426164
+ init_dist4();
426125
426165
 
426126
426166
  // packages/cli/src/acp-integration/session/emitters/MessageEmitter.ts
426127
426167
  init_esbuild_shims();
@@ -426623,6 +426663,7 @@ var HistoryReplayer = class {
426623
426663
  async replayContent(content, role, timestamp) {
426624
426664
  for (const part of content.parts ?? []) {
426625
426665
  if ("text" in part && part.text) {
426666
+ if (isInternalPart(part)) continue;
426626
426667
  const isThought = part.thought ?? false;
426627
426668
  await this.messageEmitter.emitMessage(
426628
426669
  part.text,
@@ -433039,7 +433080,7 @@ var AtFileProcessor = class {
433039
433080
  try {
433040
433081
  const fileContentParts = await readPathFromWorkspace(pathStr, config2);
433041
433082
  if (fileContentParts.length === 0) {
433042
- const uiMessage = `File '@{${pathStr}}' was ignored by .gitignore or .qwenignore and was not included in the prompt.`;
433083
+ const uiMessage = `File '@{${pathStr}}' was ignored by .gitignore or .protoignore and was not included in the prompt.`;
433043
433084
  context2.ui.addItem(
433044
433085
  { type: "info" /* INFO */, text: uiMessage },
433045
433086
  Date.now()
@@ -434682,6 +434723,7 @@ function partsToContentBlock(parts2) {
434682
434723
  const blocks = [];
434683
434724
  let currentTextBlock = null;
434684
434725
  for (const part of parts2) {
434726
+ if (isInternalPart(part)) continue;
434685
434727
  let textContent2 = null;
434686
434728
  if ("text" in part && typeof part.text === "string") {
434687
434729
  textContent2 = part.text;
@@ -435114,7 +435156,7 @@ async function handleAtCommand({
435114
435156
  const contentLabelsForDisplay = [];
435115
435157
  const ignoredByReason = {
435116
435158
  git: [],
435117
- qwen: [],
435159
+ proto: [],
435118
435160
  both: []
435119
435161
  };
435120
435162
  for (const atPathPart of atPathCommandParts) {
@@ -435137,16 +435179,16 @@ async function handleAtCommand({
435137
435179
  }
435138
435180
  const gitIgnored = respectFileIgnore.respectGitIgnore && fileDiscovery.shouldIgnoreFile(pathName, {
435139
435181
  respectGitIgnore: true,
435140
- respectQwenIgnore: false
435182
+ respectProtoIgnore: false
435141
435183
  });
435142
- const qwenIgnored = respectFileIgnore.respectQwenIgnore && fileDiscovery.shouldIgnoreFile(pathName, {
435184
+ const protoIgnored = respectFileIgnore.respectProtoIgnore && fileDiscovery.shouldIgnoreFile(pathName, {
435143
435185
  respectGitIgnore: false,
435144
- respectQwenIgnore: true
435186
+ respectProtoIgnore: true
435145
435187
  });
435146
- if (gitIgnored || qwenIgnored) {
435147
- const reason = gitIgnored && qwenIgnored ? "both" : gitIgnored ? "git" : "qwen";
435188
+ if (gitIgnored || protoIgnored) {
435189
+ const reason = gitIgnored && protoIgnored ? "both" : gitIgnored ? "git" : "proto";
435148
435190
  ignoredByReason[reason].push(pathName);
435149
- const reasonText = reason === "both" ? "ignored by both git and qwen" : reason === "git" ? "git-ignored" : "qwen-ignored";
435191
+ const reasonText = reason === "both" ? "ignored by both git and proto" : reason === "git" ? "git-ignored" : "proto-ignored";
435150
435192
  onDebugMessage(`Path ${pathName} is ${reasonText} and will be skipped.`);
435151
435193
  continue;
435152
435194
  }
@@ -435211,14 +435253,14 @@ async function handleAtCommand({
435211
435253
  }
435212
435254
  }
435213
435255
  initialQueryText = initialQueryText.trim();
435214
- const totalIgnored = ignoredByReason["git"].length + ignoredByReason["qwen"].length + ignoredByReason["both"].length;
435256
+ const totalIgnored = ignoredByReason["git"].length + ignoredByReason["proto"].length + ignoredByReason["both"].length;
435215
435257
  if (totalIgnored > 0) {
435216
435258
  const messages = [];
435217
435259
  if (ignoredByReason["git"].length) {
435218
435260
  messages.push(`Git-ignored: ${ignoredByReason["git"].join(", ")}`);
435219
435261
  }
435220
- if (ignoredByReason["qwen"].length) {
435221
- messages.push(`Qwen-ignored: ${ignoredByReason["qwen"].join(", ")}`);
435262
+ if (ignoredByReason["proto"].length) {
435263
+ messages.push(`Proto-ignored: ${ignoredByReason["proto"].join(", ")}`);
435222
435264
  }
435223
435265
  if (ignoredByReason["both"].length) {
435224
435266
  messages.push(`Ignored by both: ${ignoredByReason["both"].join(", ")}`);
@@ -472835,7 +472877,7 @@ function useAtCompletion(props) {
472835
472877
  projectRoot: cwd6,
472836
472878
  ignoreDirs: [],
472837
472879
  useGitignore: config2?.getFileFilteringOptions()?.respectGitIgnore ?? true,
472838
- useQwenignore: config2?.getFileFilteringOptions()?.respectQwenIgnore ?? true,
472880
+ useQwenignore: config2?.getFileFilteringOptions()?.respectProtoIgnore ?? true,
472839
472881
  cache: true,
472840
472882
  cacheTtl: 30,
472841
472883
  // 30 seconds
@@ -477349,12 +477391,14 @@ init_dist4();
477349
477391
 
477350
477392
  // packages/cli/src/ui/utils/resumeHistoryUtils.ts
477351
477393
  init_esbuild_shims();
477394
+ init_dist4();
477352
477395
  import * as path135 from "node:path";
477353
477396
  function extractTextFromParts(parts2) {
477354
477397
  if (!parts2) return "";
477355
477398
  const textParts = [];
477356
477399
  for (const part of parts2) {
477357
477400
  if ("text" in part && part.text) {
477401
+ if (isInternalPart(part)) continue;
477358
477402
  if (!("thought" in part && part.thought)) {
477359
477403
  textParts.push(part.text);
477360
477404
  }
@@ -477368,6 +477412,7 @@ function extractThoughtTextFromParts(parts2) {
477368
477412
  const thoughtParts = [];
477369
477413
  for (const part of parts2) {
477370
477414
  if ("text" in part && part.text && "thought" in part && part.thought) {
477415
+ if (isInternalPart(part)) continue;
477371
477416
  thoughtParts.push(part.text);
477372
477417
  }
477373
477418
  }
@@ -482004,7 +482049,7 @@ import { basename as basename31 } from "node:path";
482004
482049
  // packages/cli/src/utils/windowTitle.ts
482005
482050
  init_esbuild_shims();
482006
482051
  function computeWindowTitle(folderName) {
482007
- const title = process.env["CLI_TITLE"] || `Qwen - ${folderName}`;
482052
+ const title = process.env["CLI_TITLE"] || `protoCLI - ${folderName}`;
482008
482053
  return title.replace(
482009
482054
  // eslint-disable-next-line no-control-regex
482010
482055
  /[\x00-\x1F\x7F]/g,
@@ -490707,7 +490752,7 @@ var Session3 = class {
490707
490752
  if (resp.type === StreamEventType.CHUNK && resp.value.candidates && resp.value.candidates.length > 0) {
490708
490753
  const candidate = resp.value.candidates[0];
490709
490754
  for (const part of candidate.content?.parts ?? []) {
490710
- if (!part.text) {
490755
+ if (!part.text || isInternalPart(part)) {
490711
490756
  continue;
490712
490757
  }
490713
490758
  this.messageEmitter.emitMessage(
@@ -490849,7 +490894,7 @@ var Session3 = class {
490849
490894
  if (resp.type === StreamEventType.CHUNK && resp.value.candidates && resp.value.candidates.length > 0) {
490850
490895
  const candidate = resp.value.candidates[0];
490851
490896
  for (const part of candidate.content?.parts ?? []) {
490852
- if (!part.text) continue;
490897
+ if (!part.text || isInternalPart(part)) continue;
490853
490898
  this.messageEmitter.emitMessage(
490854
490899
  part.text,
490855
490900
  "assistant",
@@ -491531,7 +491576,7 @@ var QwenAgent = class {
491531
491576
  async initialize(args2) {
491532
491577
  this.clientCapabilities = args2.clientCapabilities;
491533
491578
  const authMethods = buildAuthMethods();
491534
- const version2 = "0.26.3";
491579
+ const version2 = "0.26.5";
491535
491580
  return {
491536
491581
  protocolVersion: PROTOCOL_VERSION,
491537
491582
  agentInfo: {
@@ -492454,6 +492499,11 @@ main().catch((error40) => {
492454
492499
  *
492455
492500
  * Exports for the prompt suggestion feature.
492456
492501
  */
492502
+ /**
492503
+ * @license
492504
+ * Copyright 2025 Proto
492505
+ * SPDX-License-Identifier: Apache-2.0
492506
+ */
492457
492507
  /**
492458
492508
  * @license
492459
492509
  * Copyright 2026 Google LLC