@proxysoul/soulforge 2.1.0 → 2.2.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.
@@ -16150,7 +16150,7 @@ function toRegExpDetails(pattern, options) {
16150
16150
  }
16151
16151
  return details;
16152
16152
  }
16153
- var cp, r3, envFlags, EsVersion, Target, asciiSpaceChar = "[\t-\r ]", CharsWithoutIgnoreCaseExpansion, defaultWordChar, JsUnicodePropertyMap, LowerToAlternativeLowerCaseMap, LowerToAlternativeUpperCaseMap, LowerToTitleCaseMap, PosixClassMap, UnicodePropertiesWithSpecificCase, FirstPassVisitor, SecondPassVisitor, ThirdPassVisitor, FlagModifierVisitor, generator, BaseEscapeChars, CharClassEscapeChars, CharClassEscapeCharsFlagV, CharCodeEscapeMap, casedRe, EmulatedRegExp;
16153
+ var cp, r3, envFlags, globalRegExp, EsVersion, Target, asciiSpaceChar = "[\t-\r ]", CharsWithoutIgnoreCaseExpansion, defaultWordChar, JsUnicodePropertyMap, LowerToAlternativeLowerCaseMap, LowerToAlternativeUpperCaseMap, LowerToTitleCaseMap, PosixClassMap, UnicodePropertiesWithSpecificCase, FirstPassVisitor, SecondPassVisitor, ThirdPassVisitor, FlagModifierVisitor, generator, BaseEscapeChars, CharClassEscapeChars, CharClassEscapeCharsFlagV, CharCodeEscapeMap, casedRe, EmulatedRegExp;
16154
16154
  var init_esm = __esm(() => {
16155
16155
  init_parse();
16156
16156
  init_parse();
@@ -16162,33 +16162,33 @@ var init_esm = __esm(() => {
16162
16162
  init_src2();
16163
16163
  cp = String.fromCodePoint;
16164
16164
  r3 = String.raw;
16165
- envFlags = {
16166
- flagGroups: (() => {
16167
- try {
16168
- new RegExp("(?i:)");
16169
- } catch {
16170
- return false;
16171
- }
16172
- return true;
16173
- })(),
16174
- unicodeSets: (() => {
16175
- try {
16176
- new RegExp("[[]]", "v");
16177
- } catch {
16178
- return false;
16179
- }
16180
- return true;
16181
- })()
16182
- };
16165
+ envFlags = {};
16166
+ globalRegExp = globalThis.RegExp;
16167
+ envFlags.flagGroups = (() => {
16168
+ try {
16169
+ new globalRegExp("(?i:)");
16170
+ } catch {
16171
+ return false;
16172
+ }
16173
+ return true;
16174
+ })();
16175
+ envFlags.unicodeSets = (() => {
16176
+ try {
16177
+ new globalRegExp("[[]]", "v");
16178
+ } catch {
16179
+ return false;
16180
+ }
16181
+ return true;
16182
+ })();
16183
16183
  envFlags.bugFlagVLiteralHyphenIsRange = envFlags.unicodeSets ? (() => {
16184
16184
  try {
16185
- new RegExp(r3`[\d\-a]`, "v");
16185
+ new globalRegExp(r3`[\d\-a]`, "v");
16186
16186
  } catch {
16187
16187
  return true;
16188
16188
  }
16189
16189
  return false;
16190
16190
  })() : false;
16191
- envFlags.bugNestedClassIgnoresNegation = envFlags.unicodeSets && new RegExp("[[^a]]", "v").test("a");
16191
+ envFlags.bugNestedClassIgnoresNegation = envFlags.unicodeSets && new globalRegExp("[[^a]]", "v").test("a");
16192
16192
  EsVersion = {
16193
16193
  ES2025: 2025,
16194
16194
  ES2024: 2024,
@@ -29361,6 +29361,16 @@ var init_errors = __esm(() => {
29361
29361
  })));
29362
29362
  });
29363
29363
 
29364
+ // src/core/process-tracker.ts
29365
+ function trackProcess(proc) {
29366
+ tracked.add(proc);
29367
+ proc.on("exit", () => tracked.delete(proc));
29368
+ }
29369
+ var tracked;
29370
+ var init_process_tracker = __esm(() => {
29371
+ tracked = new Set;
29372
+ });
29373
+
29364
29374
  // src/core/intelligence/backends/lsp/standalone-client.ts
29365
29375
  import { spawn } from "child_process";
29366
29376
  import { readFile as readFile3 } from "fs/promises";
@@ -29390,6 +29400,7 @@ class StandaloneLspClient {
29390
29400
  stdio: ["pipe", "pipe", "pipe"],
29391
29401
  cwd: this.cwd
29392
29402
  });
29403
+ trackProcess(this.process);
29393
29404
  this.process.stdout?.on("data", (chunk) => this.onData(chunk));
29394
29405
  this.process.on("exit", (code, signal) => {
29395
29406
  this.process = null;
@@ -29928,6 +29939,7 @@ function normalizeLocations(result) {
29928
29939
  }
29929
29940
  var init_standalone_client = __esm(() => {
29930
29941
  init_errors();
29942
+ init_process_tracker();
29931
29943
  init_protocol();
29932
29944
  });
29933
29945
 
@@ -200018,7 +200030,7 @@ var require_commonjs2 = __commonJS((exports) => {
200018
200030
  const x2 = numeric(n[0]);
200019
200031
  const y3 = numeric(n[1]);
200020
200032
  const width = Math.max(n[0].length, n[1].length);
200021
- let incr = n.length === 3 && n[2] !== undefined ? Math.abs(numeric(n[2])) : 1;
200033
+ let incr = n.length === 3 && n[2] !== undefined ? Math.max(Math.abs(numeric(n[2])), 1) : 1;
200022
200034
  let test = lte;
200023
200035
  const reverse = y3 < x2;
200024
200036
  if (reverse) {
@@ -200206,9 +200218,9 @@ var require_unescape = __commonJS((exports) => {
200206
200218
  exports.unescape = undefined;
200207
200219
  var unescape = (s2, { windowsPathsNoEscape = false, magicalBraces = true } = {}) => {
200208
200220
  if (magicalBraces) {
200209
- return windowsPathsNoEscape ? s2.replace(/\[([^\/\\])\]/g, "$1") : s2.replace(/((?!\\).|^)\[([^\/\\])\]/g, "$1$2").replace(/\\([^\/])/g, "$1");
200221
+ return windowsPathsNoEscape ? s2.replace(/\[([^/\\])\]/g, "$1") : s2.replace(/((?!\\).|^)\[([^/\\])\]/g, "$1$2").replace(/\\([^/])/g, "$1");
200210
200222
  }
200211
- return windowsPathsNoEscape ? s2.replace(/\[([^\/\\{}])\]/g, "$1") : s2.replace(/((?!\\).|^)\[([^\/\\{}])\]/g, "$1$2").replace(/\\([^\/{}])/g, "$1");
200223
+ return windowsPathsNoEscape ? s2.replace(/\[([^/\\{}])\]/g, "$1") : s2.replace(/((?!\\).|^)\[([^/\\{}])\]/g, "$1$2").replace(/\\([^/{}])/g, "$1");
200212
200224
  };
200213
200225
  exports.unescape = unescape;
200214
200226
  });
@@ -200333,13 +200345,7 @@ var require_ast = __commonJS((exports) => {
200333
200345
  return this.#hasMagic;
200334
200346
  }
200335
200347
  toString() {
200336
- if (this.#toString !== undefined)
200337
- return this.#toString;
200338
- if (!this.type) {
200339
- return this.#toString = this.#parts.map((p2) => String(p2)).join("");
200340
- } else {
200341
- return this.#toString = this.type + "(" + this.#parts.map((p2) => String(p2)).join("|") + ")";
200342
- }
200348
+ return this.#toString !== undefined ? this.#toString : !this.type ? this.#toString = this.#parts.map((p2) => String(p2)).join("") : this.#toString = this.type + "(" + this.#parts.map((p2) => String(p2)).join("|") + ")";
200343
200349
  }
200344
200350
  #fillNegs() {
200345
200351
  if (this !== this.#root)
@@ -200818,7 +200824,7 @@ var require_commonjs3 = __commonJS((exports) => {
200818
200824
  return new Minimatch(pattern, options).match(p2);
200819
200825
  };
200820
200826
  exports.minimatch = minimatch;
200821
- var starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
200827
+ var starDotExtRE = /^\*+([^+@!?*[(]*)$/;
200822
200828
  var starDotExtTest = (ext2) => (f3) => !f3.startsWith(".") && f3.endsWith(ext2);
200823
200829
  var starDotExtTestDot = (ext2) => (f3) => f3.endsWith(ext2);
200824
200830
  var starDotExtTestNocase = (ext2) => {
@@ -200837,7 +200843,7 @@ var require_commonjs3 = __commonJS((exports) => {
200837
200843
  var starRE = /^\*+$/;
200838
200844
  var starTest = (f3) => f3.length !== 0 && !f3.startsWith(".");
200839
200845
  var starTestDot = (f3) => f3.length !== 0 && f3 !== "." && f3 !== "..";
200840
- var qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
200846
+ var qmarksRE = /^\?+([^+@!?*[(]*)?$/;
200841
200847
  var qmarksTestNocase = ([$0, ext2 = ""]) => {
200842
200848
  const noext = qmarksTestNoExt([$0]);
200843
200849
  if (!ext2)
@@ -201054,10 +201060,10 @@ var require_commonjs3 = __commonJS((exports) => {
201054
201060
  }
201055
201061
  preprocess(globParts) {
201056
201062
  if (this.options.noglobstar) {
201057
- for (let i4 = 0;i4 < globParts.length; i4++) {
201058
- for (let j2 = 0;j2 < globParts[i4].length; j2++) {
201059
- if (globParts[i4][j2] === "**") {
201060
- globParts[i4][j2] = "*";
201063
+ for (const partset of globParts) {
201064
+ for (let j2 = 0;j2 < partset.length; j2++) {
201065
+ if (partset[j2] === "**") {
201066
+ partset[j2] = "*";
201061
201067
  }
201062
201068
  }
201063
201069
  }
@@ -201133,7 +201139,7 @@ var require_commonjs3 = __commonJS((exports) => {
201133
201139
  let dd2 = 0;
201134
201140
  while ((dd2 = parts2.indexOf("..", dd2 + 1)) !== -1) {
201135
201141
  const p2 = parts2[dd2 - 1];
201136
- if (p2 && p2 !== "." && p2 !== ".." && p2 !== "**") {
201142
+ if (p2 && p2 !== "." && p2 !== ".." && p2 !== "**" && !(this.isWindows && /^[a-z]:$/i.test(p2))) {
201137
201143
  didSomething = true;
201138
201144
  parts2.splice(dd2 - 1, 2);
201139
201145
  dd2 -= 2;
@@ -201517,7 +201523,7 @@ var require_commonjs3 = __commonJS((exports) => {
201517
201523
  re3 = "^(?!" + re3 + ").+$";
201518
201524
  try {
201519
201525
  this.regexp = new RegExp(re3, [...flags2].join(""));
201520
- } catch (ex) {
201526
+ } catch {
201521
201527
  this.regexp = false;
201522
201528
  }
201523
201529
  return this.regexp;
@@ -201525,7 +201531,7 @@ var require_commonjs3 = __commonJS((exports) => {
201525
201531
  slashSplit(p2) {
201526
201532
  if (this.preserveMultipleSlashes) {
201527
201533
  return p2.split("/");
201528
- } else if (this.isWindows && /^\/\/[^\/]+/.test(p2)) {
201534
+ } else if (this.isWindows && /^\/\/[^/]+/.test(p2)) {
201529
201535
  return ["", ...p2.split(/\/+/)];
201530
201536
  } else {
201531
201537
  return p2.split(/\/+/);
@@ -201556,8 +201562,7 @@ var require_commonjs3 = __commonJS((exports) => {
201556
201562
  filename = ff[i4];
201557
201563
  }
201558
201564
  }
201559
- for (let i4 = 0;i4 < set.length; i4++) {
201560
- const pattern = set[i4];
201565
+ for (const pattern of set) {
201561
201566
  let file = ff;
201562
201567
  if (options.matchBase && pattern.length === 1) {
201563
201568
  file = [filename];
@@ -202021,6 +202026,7 @@ var require_path_browserify = __commonJS((exports, module2) => {
202021
202026
  var require_constants = __commonJS((exports, module2) => {
202022
202027
  var WIN_SLASH = "\\\\/";
202023
202028
  var WIN_NO_SLASH = `[^${WIN_SLASH}]`;
202029
+ var DEFAULT_MAX_EXTGLOB_RECURSION = 0;
202024
202030
  var DOT_LITERAL = "\\.";
202025
202031
  var PLUS_LITERAL = "\\+";
202026
202032
  var QMARK_LITERAL = "\\?";
@@ -202071,6 +202077,7 @@ var require_constants = __commonJS((exports, module2) => {
202071
202077
  SEP: "\\"
202072
202078
  };
202073
202079
  var POSIX_REGEX_SOURCE = {
202080
+ __proto__: null,
202074
202081
  alnum: "a-zA-Z0-9",
202075
202082
  alpha: "a-zA-Z",
202076
202083
  ascii: "\\x00-\\x7F",
@@ -202087,6 +202094,7 @@ var require_constants = __commonJS((exports, module2) => {
202087
202094
  xdigit: "A-Fa-f0-9"
202088
202095
  };
202089
202096
  module2.exports = {
202097
+ DEFAULT_MAX_EXTGLOB_RECURSION,
202090
202098
  MAX_LENGTH: 1024 * 64,
202091
202099
  POSIX_REGEX_SOURCE,
202092
202100
  REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g,
@@ -202564,6 +202572,213 @@ var require_parse = __commonJS((exports, module2) => {
202564
202572
  var syntaxError = (type, char) => {
202565
202573
  return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`;
202566
202574
  };
202575
+ var splitTopLevel = (input) => {
202576
+ const parts2 = [];
202577
+ let bracket = 0;
202578
+ let paren = 0;
202579
+ let quote = 0;
202580
+ let value = "";
202581
+ let escaped = false;
202582
+ for (const ch of input) {
202583
+ if (escaped === true) {
202584
+ value += ch;
202585
+ escaped = false;
202586
+ continue;
202587
+ }
202588
+ if (ch === "\\") {
202589
+ value += ch;
202590
+ escaped = true;
202591
+ continue;
202592
+ }
202593
+ if (ch === '"') {
202594
+ quote = quote === 1 ? 0 : 1;
202595
+ value += ch;
202596
+ continue;
202597
+ }
202598
+ if (quote === 0) {
202599
+ if (ch === "[") {
202600
+ bracket++;
202601
+ } else if (ch === "]" && bracket > 0) {
202602
+ bracket--;
202603
+ } else if (bracket === 0) {
202604
+ if (ch === "(") {
202605
+ paren++;
202606
+ } else if (ch === ")" && paren > 0) {
202607
+ paren--;
202608
+ } else if (ch === "|" && paren === 0) {
202609
+ parts2.push(value);
202610
+ value = "";
202611
+ continue;
202612
+ }
202613
+ }
202614
+ }
202615
+ value += ch;
202616
+ }
202617
+ parts2.push(value);
202618
+ return parts2;
202619
+ };
202620
+ var isPlainBranch = (branch) => {
202621
+ let escaped = false;
202622
+ for (const ch of branch) {
202623
+ if (escaped === true) {
202624
+ escaped = false;
202625
+ continue;
202626
+ }
202627
+ if (ch === "\\") {
202628
+ escaped = true;
202629
+ continue;
202630
+ }
202631
+ if (/[?*+@!()[\]{}]/.test(ch)) {
202632
+ return false;
202633
+ }
202634
+ }
202635
+ return true;
202636
+ };
202637
+ var normalizeSimpleBranch = (branch) => {
202638
+ let value = branch.trim();
202639
+ let changed = true;
202640
+ while (changed === true) {
202641
+ changed = false;
202642
+ if (/^@\([^\\()[\]{}|]+\)$/.test(value)) {
202643
+ value = value.slice(2, -1);
202644
+ changed = true;
202645
+ }
202646
+ }
202647
+ if (!isPlainBranch(value)) {
202648
+ return;
202649
+ }
202650
+ return value.replace(/\\(.)/g, "$1");
202651
+ };
202652
+ var hasRepeatedCharPrefixOverlap = (branches) => {
202653
+ const values = branches.map(normalizeSimpleBranch).filter(Boolean);
202654
+ for (let i4 = 0;i4 < values.length; i4++) {
202655
+ for (let j2 = i4 + 1;j2 < values.length; j2++) {
202656
+ const a2 = values[i4];
202657
+ const b3 = values[j2];
202658
+ const char = a2[0];
202659
+ if (!char || a2 !== char.repeat(a2.length) || b3 !== char.repeat(b3.length)) {
202660
+ continue;
202661
+ }
202662
+ if (a2 === b3 || a2.startsWith(b3) || b3.startsWith(a2)) {
202663
+ return true;
202664
+ }
202665
+ }
202666
+ }
202667
+ return false;
202668
+ };
202669
+ var parseRepeatedExtglob = (pattern, requireEnd = true) => {
202670
+ if (pattern[0] !== "+" && pattern[0] !== "*" || pattern[1] !== "(") {
202671
+ return;
202672
+ }
202673
+ let bracket = 0;
202674
+ let paren = 0;
202675
+ let quote = 0;
202676
+ let escaped = false;
202677
+ for (let i4 = 1;i4 < pattern.length; i4++) {
202678
+ const ch = pattern[i4];
202679
+ if (escaped === true) {
202680
+ escaped = false;
202681
+ continue;
202682
+ }
202683
+ if (ch === "\\") {
202684
+ escaped = true;
202685
+ continue;
202686
+ }
202687
+ if (ch === '"') {
202688
+ quote = quote === 1 ? 0 : 1;
202689
+ continue;
202690
+ }
202691
+ if (quote === 1) {
202692
+ continue;
202693
+ }
202694
+ if (ch === "[") {
202695
+ bracket++;
202696
+ continue;
202697
+ }
202698
+ if (ch === "]" && bracket > 0) {
202699
+ bracket--;
202700
+ continue;
202701
+ }
202702
+ if (bracket > 0) {
202703
+ continue;
202704
+ }
202705
+ if (ch === "(") {
202706
+ paren++;
202707
+ continue;
202708
+ }
202709
+ if (ch === ")") {
202710
+ paren--;
202711
+ if (paren === 0) {
202712
+ if (requireEnd === true && i4 !== pattern.length - 1) {
202713
+ return;
202714
+ }
202715
+ return {
202716
+ type: pattern[0],
202717
+ body: pattern.slice(2, i4),
202718
+ end: i4
202719
+ };
202720
+ }
202721
+ }
202722
+ }
202723
+ };
202724
+ var getStarExtglobSequenceOutput = (pattern) => {
202725
+ let index = 0;
202726
+ const chars = [];
202727
+ while (index < pattern.length) {
202728
+ const match = parseRepeatedExtglob(pattern.slice(index), false);
202729
+ if (!match || match.type !== "*") {
202730
+ return;
202731
+ }
202732
+ const branches = splitTopLevel(match.body).map((branch2) => branch2.trim());
202733
+ if (branches.length !== 1) {
202734
+ return;
202735
+ }
202736
+ const branch = normalizeSimpleBranch(branches[0]);
202737
+ if (!branch || branch.length !== 1) {
202738
+ return;
202739
+ }
202740
+ chars.push(branch);
202741
+ index += match.end + 1;
202742
+ }
202743
+ if (chars.length < 1) {
202744
+ return;
202745
+ }
202746
+ const source = chars.length === 1 ? utils.escapeRegex(chars[0]) : `[${chars.map((ch) => utils.escapeRegex(ch)).join("")}]`;
202747
+ return `${source}*`;
202748
+ };
202749
+ var repeatedExtglobRecursion = (pattern) => {
202750
+ let depth = 0;
202751
+ let value = pattern.trim();
202752
+ let match = parseRepeatedExtglob(value);
202753
+ while (match) {
202754
+ depth++;
202755
+ value = match.body.trim();
202756
+ match = parseRepeatedExtglob(value);
202757
+ }
202758
+ return depth;
202759
+ };
202760
+ var analyzeRepeatedExtglob = (body4, options) => {
202761
+ if (options.maxExtglobRecursion === false) {
202762
+ return { risky: false };
202763
+ }
202764
+ const max = typeof options.maxExtglobRecursion === "number" ? options.maxExtglobRecursion : constants2.DEFAULT_MAX_EXTGLOB_RECURSION;
202765
+ const branches = splitTopLevel(body4).map((branch) => branch.trim());
202766
+ if (branches.length > 1) {
202767
+ if (branches.some((branch) => branch === "") || branches.some((branch) => /^[*?]+$/.test(branch)) || hasRepeatedCharPrefixOverlap(branches)) {
202768
+ return { risky: true };
202769
+ }
202770
+ }
202771
+ for (const branch of branches) {
202772
+ const safeOutput = getStarExtglobSequenceOutput(branch);
202773
+ if (safeOutput) {
202774
+ return { risky: true, safeOutput };
202775
+ }
202776
+ if (repeatedExtglobRecursion(branch) > max) {
202777
+ return { risky: true };
202778
+ }
202779
+ }
202780
+ return { risky: false };
202781
+ };
202567
202782
  var parse = (input, options) => {
202568
202783
  if (typeof input !== "string") {
202569
202784
  throw new TypeError("Expected a string");
@@ -202695,6 +202910,8 @@ var require_parse = __commonJS((exports, module2) => {
202695
202910
  token2.prev = prev;
202696
202911
  token2.parens = state.parens;
202697
202912
  token2.output = state.output;
202913
+ token2.startIndex = state.index;
202914
+ token2.tokensIndex = tokens.length;
202698
202915
  const output = (opts.capture ? "(" : "") + token2.open;
202699
202916
  increment2("parens");
202700
202917
  push({ type, value: value2, output: state.output ? "" : ONE_CHAR });
@@ -202702,6 +202919,26 @@ var require_parse = __commonJS((exports, module2) => {
202702
202919
  extglobs.push(token2);
202703
202920
  };
202704
202921
  const extglobClose = (token2) => {
202922
+ const literal = input.slice(token2.startIndex, state.index + 1);
202923
+ const body4 = input.slice(token2.startIndex + 2, state.index);
202924
+ const analysis = analyzeRepeatedExtglob(body4, opts);
202925
+ if ((token2.type === "plus" || token2.type === "star") && analysis.risky) {
202926
+ const safeOutput = analysis.safeOutput ? (token2.output ? "" : ONE_CHAR) + (opts.capture ? `(${analysis.safeOutput})` : analysis.safeOutput) : undefined;
202927
+ const open = tokens[token2.tokensIndex];
202928
+ open.type = "text";
202929
+ open.value = literal;
202930
+ open.output = safeOutput || utils.escapeRegex(literal);
202931
+ for (let i4 = token2.tokensIndex + 1;i4 < tokens.length; i4++) {
202932
+ tokens[i4].value = "";
202933
+ tokens[i4].output = "";
202934
+ delete tokens[i4].suffix;
202935
+ }
202936
+ state.output = token2.output + open.output;
202937
+ state.backtrack = true;
202938
+ push({ type: "paren", extglob: true, value, output: "" });
202939
+ decrement("parens");
202940
+ return;
202941
+ }
202705
202942
  let output = token2.close + (opts.capture ? ")" : "");
202706
202943
  let rest;
202707
202944
  if (token2.type === "negate") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proxysoul/soulforge",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Graph-powered code intelligence — multi-agent coding with codebase-aware AI",
5
5
  "repository": {
6
6
  "type": "git",
@@ -61,8 +61,13 @@
61
61
  "typescript": "6.0.2"
62
62
  },
63
63
  "dependencies": {
64
+ "@ai-sdk/amazon-bedrock": "^4.0.89",
64
65
  "@ai-sdk/anthropic": "3.0.66",
66
+ "@ai-sdk/deepseek": "^2.0.27",
67
+ "@ai-sdk/fireworks": "^2.0.43",
65
68
  "@ai-sdk/google": "3.0.58",
69
+ "@ai-sdk/groq": "^3.0.33",
70
+ "@ai-sdk/mistral": "^3.0.28",
66
71
  "@ai-sdk/openai": "3.0.50",
67
72
  "@ai-sdk/xai": "3.0.77",
68
73
  "@anthropic-ai/sdk": "0.82.0",