@t2000/cli 5.22.0 → 5.23.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.
@@ -33187,7 +33187,7 @@ function camelToSnakeCaseObject(obj) {
33187
33187
  return result;
33188
33188
  }
33189
33189
  var init_utils6 = __esm({
33190
- "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.15.2/node_modules/@pythnetwork/hermes-client/dist/esm/utils.mjs"() {
33190
+ "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.16.1/node_modules/@pythnetwork/hermes-client/dist/esm/utils.mjs"() {
33191
33191
  }
33192
33192
  });
33193
33193
  function bind(fn, thisArg) {
@@ -33196,7 +33196,7 @@ function bind(fn, thisArg) {
33196
33196
  };
33197
33197
  }
33198
33198
  var init_bind = __esm({
33199
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/bind.js"() {
33199
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/bind.js"() {
33200
33200
  }
33201
33201
  });
33202
33202
  function isBuffer(val) {
@@ -33260,7 +33260,7 @@ function findKey(obj, key) {
33260
33260
  }
33261
33261
  return null;
33262
33262
  }
33263
- function merge2() {
33263
+ function merge2(...objs) {
33264
33264
  const { caseless, skipUndefined } = isContextDefined(this) && this || {};
33265
33265
  const result = {};
33266
33266
  const assignValue = (val, key) => {
@@ -33268,8 +33268,9 @@ function merge2() {
33268
33268
  return;
33269
33269
  }
33270
33270
  const targetKey = caseless && findKey(result, key) || key;
33271
- if (isPlainObject3(result[targetKey]) && isPlainObject3(val)) {
33272
- result[targetKey] = merge2(result[targetKey], val);
33271
+ const existing = hasOwnProperty(result, targetKey) ? result[targetKey] : void 0;
33272
+ if (isPlainObject3(existing) && isPlainObject3(val)) {
33273
+ result[targetKey] = merge2(existing, val);
33273
33274
  } else if (isPlainObject3(val)) {
33274
33275
  result[targetKey] = merge2({}, val);
33275
33276
  } else if (isArray(val)) {
@@ -33278,8 +33279,8 @@ function merge2() {
33278
33279
  result[targetKey] = val;
33279
33280
  }
33280
33281
  };
33281
- for (let i = 0, l2 = arguments.length; i < l2; i++) {
33282
- arguments[i] && forEach(arguments[i], assignValue);
33282
+ for (let i = 0, l2 = objs.length; i < l2; i++) {
33283
+ objs[i] && forEach(objs[i], assignValue);
33283
33284
  }
33284
33285
  return result;
33285
33286
  }
@@ -33347,7 +33348,7 @@ var asap;
33347
33348
  var isIterable;
33348
33349
  var utils_default;
33349
33350
  var init_utils7 = __esm({
33350
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/utils.js"() {
33351
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/utils.js"() {
33351
33352
  init_bind();
33352
33353
  ({ toString } = Object.prototype);
33353
33354
  ({ getPrototypeOf } = Object);
@@ -33428,6 +33429,9 @@ var init_utils7 = __esm({
33428
33429
  (val, key) => {
33429
33430
  if (thisArg && isFunction(val)) {
33430
33431
  Object.defineProperty(a, key, {
33432
+ // Null-proto descriptor so a polluted Object.prototype.get cannot
33433
+ // hijack defineProperty's accessor-vs-data resolution.
33434
+ __proto__: null,
33431
33435
  value: bind(val, thisArg),
33432
33436
  writable: true,
33433
33437
  enumerable: true,
@@ -33435,6 +33439,7 @@ var init_utils7 = __esm({
33435
33439
  });
33436
33440
  } else {
33437
33441
  Object.defineProperty(a, key, {
33442
+ __proto__: null,
33438
33443
  value: val,
33439
33444
  writable: true,
33440
33445
  enumerable: true,
@@ -33455,12 +33460,14 @@ var init_utils7 = __esm({
33455
33460
  inherits = (constructor, superConstructor, props, descriptors) => {
33456
33461
  constructor.prototype = Object.create(superConstructor.prototype, descriptors);
33457
33462
  Object.defineProperty(constructor.prototype, "constructor", {
33463
+ __proto__: null,
33458
33464
  value: constructor,
33459
33465
  writable: true,
33460
33466
  enumerable: false,
33461
33467
  configurable: true
33462
33468
  });
33463
33469
  Object.defineProperty(constructor, "super", {
33470
+ __proto__: null,
33464
33471
  value: superConstructor.prototype
33465
33472
  });
33466
33473
  props && Object.assign(constructor.prototype, props);
@@ -33549,7 +33556,7 @@ var init_utils7 = __esm({
33549
33556
  };
33550
33557
  freezeMethods = (obj) => {
33551
33558
  reduceDescriptors(obj, (descriptor, name) => {
33552
- if (isFunction(obj) && ["arguments", "caller", "callee"].indexOf(name) !== -1) {
33559
+ if (isFunction(obj) && ["arguments", "caller", "callee"].includes(name)) {
33553
33560
  return false;
33554
33561
  }
33555
33562
  const value = obj[name];
@@ -33582,29 +33589,29 @@ var init_utils7 = __esm({
33582
33589
  return value != null && Number.isFinite(value = +value) ? value : defaultValue;
33583
33590
  };
33584
33591
  toJSONObject = (obj) => {
33585
- const stack = new Array(10);
33586
- const visit2 = (source, i) => {
33592
+ const visited = /* @__PURE__ */ new WeakSet();
33593
+ const visit2 = (source) => {
33587
33594
  if (isObject2(source)) {
33588
- if (stack.indexOf(source) >= 0) {
33595
+ if (visited.has(source)) {
33589
33596
  return;
33590
33597
  }
33591
33598
  if (isBuffer(source)) {
33592
33599
  return source;
33593
33600
  }
33594
33601
  if (!("toJSON" in source)) {
33595
- stack[i] = source;
33602
+ visited.add(source);
33596
33603
  const target = isArray(source) ? [] : {};
33597
33604
  forEach(source, (value, key) => {
33598
- const reducedValue = visit2(value, i + 1);
33605
+ const reducedValue = visit2(value);
33599
33606
  !isUndefined(reducedValue) && (target[key] = reducedValue);
33600
33607
  });
33601
- stack[i] = void 0;
33608
+ visited.delete(source);
33602
33609
  return target;
33603
33610
  }
33604
33611
  }
33605
33612
  return source;
33606
33613
  };
33607
- return visit2(obj, 0);
33614
+ return visit2(obj);
33608
33615
  };
33609
33616
  isAsyncFn = kindOfTest("AsyncFunction");
33610
33617
  isThenable = (thing) => thing && (isObject2(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);
@@ -33694,11 +33701,408 @@ var init_utils7 = __esm({
33694
33701
  };
33695
33702
  }
33696
33703
  });
33704
+ var ignoreDuplicateOf;
33705
+ var parseHeaders_default;
33706
+ var init_parseHeaders = __esm({
33707
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/parseHeaders.js"() {
33708
+ init_utils7();
33709
+ ignoreDuplicateOf = utils_default.toObjectSet([
33710
+ "age",
33711
+ "authorization",
33712
+ "content-length",
33713
+ "content-type",
33714
+ "etag",
33715
+ "expires",
33716
+ "from",
33717
+ "host",
33718
+ "if-modified-since",
33719
+ "if-unmodified-since",
33720
+ "last-modified",
33721
+ "location",
33722
+ "max-forwards",
33723
+ "proxy-authorization",
33724
+ "referer",
33725
+ "retry-after",
33726
+ "user-agent"
33727
+ ]);
33728
+ parseHeaders_default = (rawHeaders) => {
33729
+ const parsed = {};
33730
+ let key;
33731
+ let val;
33732
+ let i;
33733
+ rawHeaders && rawHeaders.split("\n").forEach(function parser(line) {
33734
+ i = line.indexOf(":");
33735
+ key = line.substring(0, i).trim().toLowerCase();
33736
+ val = line.substring(i + 1).trim();
33737
+ if (!key || parsed[key] && ignoreDuplicateOf[key]) {
33738
+ return;
33739
+ }
33740
+ if (key === "set-cookie") {
33741
+ if (parsed[key]) {
33742
+ parsed[key].push(val);
33743
+ } else {
33744
+ parsed[key] = [val];
33745
+ }
33746
+ } else {
33747
+ parsed[key] = parsed[key] ? parsed[key] + ", " + val : val;
33748
+ }
33749
+ });
33750
+ return parsed;
33751
+ };
33752
+ }
33753
+ });
33754
+ function trimSPorHTAB(str) {
33755
+ let start = 0;
33756
+ let end = str.length;
33757
+ while (start < end) {
33758
+ const code = str.charCodeAt(start);
33759
+ if (code !== 9 && code !== 32) {
33760
+ break;
33761
+ }
33762
+ start += 1;
33763
+ }
33764
+ while (end > start) {
33765
+ const code = str.charCodeAt(end - 1);
33766
+ if (code !== 9 && code !== 32) {
33767
+ break;
33768
+ }
33769
+ end -= 1;
33770
+ }
33771
+ return start === 0 && end === str.length ? str : str.slice(start, end);
33772
+ }
33773
+ function sanitizeValue(value, invalidChars) {
33774
+ if (utils_default.isArray(value)) {
33775
+ return value.map((item) => sanitizeValue(item, invalidChars));
33776
+ }
33777
+ return trimSPorHTAB(String(value).replace(invalidChars, ""));
33778
+ }
33779
+ function toByteStringHeaderObject(headers) {
33780
+ const byteStringHeaders = /* @__PURE__ */ Object.create(null);
33781
+ utils_default.forEach(headers.toJSON(), (value, header) => {
33782
+ byteStringHeaders[header] = sanitizeByteStringHeaderValue(value);
33783
+ });
33784
+ return byteStringHeaders;
33785
+ }
33786
+ var INVALID_UNICODE_HEADER_VALUE_CHARS;
33787
+ var INVALID_BYTE_STRING_HEADER_VALUE_CHARS;
33788
+ var sanitizeHeaderValue;
33789
+ var sanitizeByteStringHeaderValue;
33790
+ var init_sanitizeHeaderValue = __esm({
33791
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/sanitizeHeaderValue.js"() {
33792
+ init_utils7();
33793
+ INVALID_UNICODE_HEADER_VALUE_CHARS = new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+", "g");
33794
+ INVALID_BYTE_STRING_HEADER_VALUE_CHARS = new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+", "g");
33795
+ sanitizeHeaderValue = (value) => sanitizeValue(value, INVALID_UNICODE_HEADER_VALUE_CHARS);
33796
+ sanitizeByteStringHeaderValue = (value) => sanitizeValue(value, INVALID_BYTE_STRING_HEADER_VALUE_CHARS);
33797
+ }
33798
+ });
33799
+ function normalizeHeader(header) {
33800
+ return header && String(header).trim().toLowerCase();
33801
+ }
33802
+ function normalizeValue(value) {
33803
+ if (value === false || value == null) {
33804
+ return value;
33805
+ }
33806
+ return utils_default.isArray(value) ? value.map(normalizeValue) : sanitizeHeaderValue(String(value));
33807
+ }
33808
+ function parseTokens(str) {
33809
+ const tokens = /* @__PURE__ */ Object.create(null);
33810
+ const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
33811
+ let match;
33812
+ while (match = tokensRE.exec(str)) {
33813
+ tokens[match[1]] = match[2];
33814
+ }
33815
+ return tokens;
33816
+ }
33817
+ function matchHeaderValue(context, value, header, filter2, isHeaderNameFilter) {
33818
+ if (utils_default.isFunction(filter2)) {
33819
+ return filter2.call(this, value, header);
33820
+ }
33821
+ if (isHeaderNameFilter) {
33822
+ value = header;
33823
+ }
33824
+ if (!utils_default.isString(value)) return;
33825
+ if (utils_default.isString(filter2)) {
33826
+ return value.indexOf(filter2) !== -1;
33827
+ }
33828
+ if (utils_default.isRegExp(filter2)) {
33829
+ return filter2.test(value);
33830
+ }
33831
+ }
33832
+ function formatHeader(header) {
33833
+ return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (w2, char, str) => {
33834
+ return char.toUpperCase() + str;
33835
+ });
33836
+ }
33837
+ function buildAccessors(obj, header) {
33838
+ const accessorName = utils_default.toCamelCase(" " + header);
33839
+ ["get", "set", "has"].forEach((methodName) => {
33840
+ Object.defineProperty(obj, methodName + accessorName, {
33841
+ // Null-proto descriptor so a polluted Object.prototype.get cannot turn
33842
+ // this data descriptor into an accessor descriptor on the way in.
33843
+ __proto__: null,
33844
+ value: function(arg1, arg2, arg3) {
33845
+ return this[methodName].call(this, header, arg1, arg2, arg3);
33846
+ },
33847
+ configurable: true
33848
+ });
33849
+ });
33850
+ }
33851
+ var $internals;
33852
+ var isValidHeaderName;
33853
+ var AxiosHeaders;
33854
+ var AxiosHeaders_default;
33855
+ var init_AxiosHeaders = __esm({
33856
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/AxiosHeaders.js"() {
33857
+ init_utils7();
33858
+ init_parseHeaders();
33859
+ init_sanitizeHeaderValue();
33860
+ $internals = /* @__PURE__ */ Symbol("internals");
33861
+ isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());
33862
+ AxiosHeaders = class {
33863
+ constructor(headers) {
33864
+ headers && this.set(headers);
33865
+ }
33866
+ set(header, valueOrRewrite, rewrite) {
33867
+ const self2 = this;
33868
+ function setHeader(_value, _header, _rewrite) {
33869
+ const lHeader = normalizeHeader(_header);
33870
+ if (!lHeader) {
33871
+ throw new Error("header name must be a non-empty string");
33872
+ }
33873
+ const key = utils_default.findKey(self2, lHeader);
33874
+ if (!key || self2[key] === void 0 || _rewrite === true || _rewrite === void 0 && self2[key] !== false) {
33875
+ self2[key || _header] = normalizeValue(_value);
33876
+ }
33877
+ }
33878
+ const setHeaders = (headers, _rewrite) => utils_default.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
33879
+ if (utils_default.isPlainObject(header) || header instanceof this.constructor) {
33880
+ setHeaders(header, valueOrRewrite);
33881
+ } else if (utils_default.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
33882
+ setHeaders(parseHeaders_default(header), valueOrRewrite);
33883
+ } else if (utils_default.isObject(header) && utils_default.isIterable(header)) {
33884
+ let obj = {}, dest, key;
33885
+ for (const entry of header) {
33886
+ if (!utils_default.isArray(entry)) {
33887
+ throw TypeError("Object iterator must return a key-value pair");
33888
+ }
33889
+ obj[key = entry[0]] = (dest = obj[key]) ? utils_default.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]] : entry[1];
33890
+ }
33891
+ setHeaders(obj, valueOrRewrite);
33892
+ } else {
33893
+ header != null && setHeader(valueOrRewrite, header, rewrite);
33894
+ }
33895
+ return this;
33896
+ }
33897
+ get(header, parser) {
33898
+ header = normalizeHeader(header);
33899
+ if (header) {
33900
+ const key = utils_default.findKey(this, header);
33901
+ if (key) {
33902
+ const value = this[key];
33903
+ if (!parser) {
33904
+ return value;
33905
+ }
33906
+ if (parser === true) {
33907
+ return parseTokens(value);
33908
+ }
33909
+ if (utils_default.isFunction(parser)) {
33910
+ return parser.call(this, value, key);
33911
+ }
33912
+ if (utils_default.isRegExp(parser)) {
33913
+ return parser.exec(value);
33914
+ }
33915
+ throw new TypeError("parser must be boolean|regexp|function");
33916
+ }
33917
+ }
33918
+ }
33919
+ has(header, matcher) {
33920
+ header = normalizeHeader(header);
33921
+ if (header) {
33922
+ const key = utils_default.findKey(this, header);
33923
+ return !!(key && this[key] !== void 0 && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
33924
+ }
33925
+ return false;
33926
+ }
33927
+ delete(header, matcher) {
33928
+ const self2 = this;
33929
+ let deleted = false;
33930
+ function deleteHeader(_header) {
33931
+ _header = normalizeHeader(_header);
33932
+ if (_header) {
33933
+ const key = utils_default.findKey(self2, _header);
33934
+ if (key && (!matcher || matchHeaderValue(self2, self2[key], key, matcher))) {
33935
+ delete self2[key];
33936
+ deleted = true;
33937
+ }
33938
+ }
33939
+ }
33940
+ if (utils_default.isArray(header)) {
33941
+ header.forEach(deleteHeader);
33942
+ } else {
33943
+ deleteHeader(header);
33944
+ }
33945
+ return deleted;
33946
+ }
33947
+ clear(matcher) {
33948
+ const keys = Object.keys(this);
33949
+ let i = keys.length;
33950
+ let deleted = false;
33951
+ while (i--) {
33952
+ const key = keys[i];
33953
+ if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
33954
+ delete this[key];
33955
+ deleted = true;
33956
+ }
33957
+ }
33958
+ return deleted;
33959
+ }
33960
+ normalize(format) {
33961
+ const self2 = this;
33962
+ const headers = {};
33963
+ utils_default.forEach(this, (value, header) => {
33964
+ const key = utils_default.findKey(headers, header);
33965
+ if (key) {
33966
+ self2[key] = normalizeValue(value);
33967
+ delete self2[header];
33968
+ return;
33969
+ }
33970
+ const normalized = format ? formatHeader(header) : String(header).trim();
33971
+ if (normalized !== header) {
33972
+ delete self2[header];
33973
+ }
33974
+ self2[normalized] = normalizeValue(value);
33975
+ headers[normalized] = true;
33976
+ });
33977
+ return this;
33978
+ }
33979
+ concat(...targets) {
33980
+ return this.constructor.concat(this, ...targets);
33981
+ }
33982
+ toJSON(asStrings) {
33983
+ const obj = /* @__PURE__ */ Object.create(null);
33984
+ utils_default.forEach(this, (value, header) => {
33985
+ value != null && value !== false && (obj[header] = asStrings && utils_default.isArray(value) ? value.join(", ") : value);
33986
+ });
33987
+ return obj;
33988
+ }
33989
+ [Symbol.iterator]() {
33990
+ return Object.entries(this.toJSON())[Symbol.iterator]();
33991
+ }
33992
+ toString() {
33993
+ return Object.entries(this.toJSON()).map(([header, value]) => header + ": " + value).join("\n");
33994
+ }
33995
+ getSetCookie() {
33996
+ return this.get("set-cookie") || [];
33997
+ }
33998
+ get [Symbol.toStringTag]() {
33999
+ return "AxiosHeaders";
34000
+ }
34001
+ static from(thing) {
34002
+ return thing instanceof this ? thing : new this(thing);
34003
+ }
34004
+ static concat(first, ...targets) {
34005
+ const computed = new this(first);
34006
+ targets.forEach((target) => computed.set(target));
34007
+ return computed;
34008
+ }
34009
+ static accessor(header) {
34010
+ const internals = this[$internals] = this[$internals] = {
34011
+ accessors: {}
34012
+ };
34013
+ const accessors = internals.accessors;
34014
+ const prototype2 = this.prototype;
34015
+ function defineAccessor(_header) {
34016
+ const lHeader = normalizeHeader(_header);
34017
+ if (!accessors[lHeader]) {
34018
+ buildAccessors(prototype2, _header);
34019
+ accessors[lHeader] = true;
34020
+ }
34021
+ }
34022
+ utils_default.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
34023
+ return this;
34024
+ }
34025
+ };
34026
+ AxiosHeaders.accessor([
34027
+ "Content-Type",
34028
+ "Content-Length",
34029
+ "Accept",
34030
+ "Accept-Encoding",
34031
+ "User-Agent",
34032
+ "Authorization"
34033
+ ]);
34034
+ utils_default.reduceDescriptors(AxiosHeaders.prototype, ({ value }, key) => {
34035
+ let mapped = key[0].toUpperCase() + key.slice(1);
34036
+ return {
34037
+ get: () => value,
34038
+ set(headerValue) {
34039
+ this[mapped] = headerValue;
34040
+ }
34041
+ };
34042
+ });
34043
+ utils_default.freezeMethods(AxiosHeaders);
34044
+ AxiosHeaders_default = AxiosHeaders;
34045
+ }
34046
+ });
34047
+ function hasOwnOrPrototypeToJSON(source) {
34048
+ if (utils_default.hasOwnProp(source, "toJSON")) {
34049
+ return true;
34050
+ }
34051
+ let prototype2 = Object.getPrototypeOf(source);
34052
+ while (prototype2 && prototype2 !== Object.prototype) {
34053
+ if (utils_default.hasOwnProp(prototype2, "toJSON")) {
34054
+ return true;
34055
+ }
34056
+ prototype2 = Object.getPrototypeOf(prototype2);
34057
+ }
34058
+ return false;
34059
+ }
34060
+ function redactConfig(config3, redactKeys) {
34061
+ const lowerKeys = new Set(redactKeys.map((k) => String(k).toLowerCase()));
34062
+ const seen = [];
34063
+ const visit2 = (source) => {
34064
+ if (source === null || typeof source !== "object") return source;
34065
+ if (utils_default.isBuffer(source)) return source;
34066
+ if (seen.indexOf(source) !== -1) return void 0;
34067
+ if (source instanceof AxiosHeaders_default) {
34068
+ source = source.toJSON();
34069
+ }
34070
+ seen.push(source);
34071
+ let result;
34072
+ if (utils_default.isArray(source)) {
34073
+ result = [];
34074
+ source.forEach((v, i) => {
34075
+ const reducedValue = visit2(v);
34076
+ if (!utils_default.isUndefined(reducedValue)) {
34077
+ result[i] = reducedValue;
34078
+ }
34079
+ });
34080
+ } else {
34081
+ if (!utils_default.isPlainObject(source) && hasOwnOrPrototypeToJSON(source)) {
34082
+ seen.pop();
34083
+ return source;
34084
+ }
34085
+ result = /* @__PURE__ */ Object.create(null);
34086
+ for (const [key, value] of Object.entries(source)) {
34087
+ const reducedValue = lowerKeys.has(key.toLowerCase()) ? REDACTED : visit2(value);
34088
+ if (!utils_default.isUndefined(reducedValue)) {
34089
+ result[key] = reducedValue;
34090
+ }
34091
+ }
34092
+ }
34093
+ seen.pop();
34094
+ return result;
34095
+ };
34096
+ return visit2(config3);
34097
+ }
34098
+ var REDACTED;
33697
34099
  var AxiosError;
33698
34100
  var AxiosError_default;
33699
34101
  var init_AxiosError = __esm({
33700
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/AxiosError.js"() {
34102
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/AxiosError.js"() {
33701
34103
  init_utils7();
34104
+ init_AxiosHeaders();
34105
+ REDACTED = "[REDACTED ****]";
33702
34106
  AxiosError = class _AxiosError extends Error {
33703
34107
  static from(error2, code, config3, request, response, customProps) {
33704
34108
  const axiosError = new _AxiosError(error2.message, code || error2.code, config3, request, response);
@@ -33724,6 +34128,9 @@ var init_AxiosError = __esm({
33724
34128
  constructor(message, code, config3, request, response) {
33725
34129
  super(message);
33726
34130
  Object.defineProperty(this, "message", {
34131
+ // Null-proto descriptor so a polluted Object.prototype.get cannot turn
34132
+ // this data descriptor into an accessor descriptor on the way in.
34133
+ __proto__: null,
33727
34134
  value: message,
33728
34135
  enumerable: true,
33729
34136
  writable: true,
@@ -33740,6 +34147,9 @@ var init_AxiosError = __esm({
33740
34147
  }
33741
34148
  }
33742
34149
  toJSON() {
34150
+ const config3 = this.config;
34151
+ const redactKeys = config3 && utils_default.hasOwnProp(config3, "redact") ? config3.redact : void 0;
34152
+ const serializedConfig = utils_default.isArray(redactKeys) && redactKeys.length > 0 ? redactConfig(config3, redactKeys) : utils_default.toJSONObject(config3);
33743
34153
  return {
33744
34154
  // Standard
33745
34155
  message: this.message,
@@ -33753,7 +34163,7 @@ var init_AxiosError = __esm({
33753
34163
  columnNumber: this.columnNumber,
33754
34164
  stack: this.stack,
33755
34165
  // Axios
33756
- config: utils_default.toJSONObject(this.config),
34166
+ config: serializedConfig,
33757
34167
  code: this.code,
33758
34168
  status: this.status
33759
34169
  };
@@ -33763,6 +34173,7 @@ var init_AxiosError = __esm({
33763
34173
  AxiosError.ERR_BAD_OPTION = "ERR_BAD_OPTION";
33764
34174
  AxiosError.ECONNABORTED = "ECONNABORTED";
33765
34175
  AxiosError.ETIMEDOUT = "ETIMEDOUT";
34176
+ AxiosError.ECONNREFUSED = "ECONNREFUSED";
33766
34177
  AxiosError.ERR_NETWORK = "ERR_NETWORK";
33767
34178
  AxiosError.ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS";
33768
34179
  AxiosError.ERR_DEPRECATED = "ERR_DEPRECATED";
@@ -43902,7 +44313,7 @@ var require_form_data = __commonJS({
43902
44313
  var import_form_data;
43903
44314
  var FormData_default;
43904
44315
  var init_FormData = __esm({
43905
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/platform/node/classes/FormData.js"() {
44316
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/platform/node/classes/FormData.js"() {
43906
44317
  import_form_data = __toESM(require_form_data());
43907
44318
  FormData_default = import_form_data.default;
43908
44319
  }
@@ -44029,7 +44440,7 @@ function toFormData(obj, formData, options) {
44029
44440
  var predicates;
44030
44441
  var toFormData_default;
44031
44442
  var init_toFormData = __esm({
44032
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/toFormData.js"() {
44443
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/toFormData.js"() {
44033
44444
  init_utils7();
44034
44445
  init_AxiosError();
44035
44446
  init_FormData();
@@ -44059,7 +44470,7 @@ function AxiosURLSearchParams(params, options) {
44059
44470
  var prototype;
44060
44471
  var AxiosURLSearchParams_default;
44061
44472
  var init_AxiosURLSearchParams = __esm({
44062
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/AxiosURLSearchParams.js"() {
44473
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/AxiosURLSearchParams.js"() {
44063
44474
  init_toFormData();
44064
44475
  prototype = AxiosURLSearchParams.prototype;
44065
44476
  prototype.append = function append(name, value) {
@@ -44104,7 +44515,7 @@ function buildURL(url2, params, options) {
44104
44515
  return url2;
44105
44516
  }
44106
44517
  var init_buildURL = __esm({
44107
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/buildURL.js"() {
44518
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/buildURL.js"() {
44108
44519
  init_utils7();
44109
44520
  init_AxiosURLSearchParams();
44110
44521
  }
@@ -44112,7 +44523,7 @@ var init_buildURL = __esm({
44112
44523
  var InterceptorManager;
44113
44524
  var InterceptorManager_default;
44114
44525
  var init_InterceptorManager = __esm({
44115
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/InterceptorManager.js"() {
44526
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/InterceptorManager.js"() {
44116
44527
  init_utils7();
44117
44528
  InterceptorManager = class {
44118
44529
  constructor() {
@@ -44181,7 +44592,7 @@ var init_InterceptorManager = __esm({
44181
44592
  });
44182
44593
  var transitional_default;
44183
44594
  var init_transitional = __esm({
44184
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/defaults/transitional.js"() {
44595
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/defaults/transitional.js"() {
44185
44596
  transitional_default = {
44186
44597
  silentJSONParsing: true,
44187
44598
  forcedJSONParsing: true,
@@ -44192,7 +44603,7 @@ var init_transitional = __esm({
44192
44603
  });
44193
44604
  var URLSearchParams_default;
44194
44605
  var init_URLSearchParams = __esm({
44195
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/platform/node/classes/URLSearchParams.js"() {
44606
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/platform/node/classes/URLSearchParams.js"() {
44196
44607
  URLSearchParams_default = Url.URLSearchParams;
44197
44608
  }
44198
44609
  });
@@ -44202,7 +44613,7 @@ var ALPHABET;
44202
44613
  var generateString;
44203
44614
  var node_default;
44204
44615
  var init_node = __esm({
44205
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/platform/node/index.js"() {
44616
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/platform/node/index.js"() {
44206
44617
  init_URLSearchParams();
44207
44618
  init_FormData();
44208
44619
  ALPHA = "abcdefghijklmnopqrstuvwxyz";
@@ -44249,7 +44660,7 @@ var hasStandardBrowserEnv;
44249
44660
  var hasStandardBrowserWebWorkerEnv;
44250
44661
  var origin;
44251
44662
  var init_utils8 = __esm({
44252
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/platform/common/utils.js"() {
44663
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/platform/common/utils.js"() {
44253
44664
  hasBrowserEnv = typeof window !== "undefined" && typeof document !== "undefined";
44254
44665
  _navigator = typeof navigator === "object" && navigator || void 0;
44255
44666
  hasStandardBrowserEnv = hasBrowserEnv && (!_navigator || ["ReactNative", "NativeScript", "NS"].indexOf(_navigator.product) < 0);
@@ -44262,7 +44673,7 @@ var init_utils8 = __esm({
44262
44673
  });
44263
44674
  var platform_default;
44264
44675
  var init_platform = __esm({
44265
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/platform/index.js"() {
44676
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/platform/index.js"() {
44266
44677
  init_node();
44267
44678
  init_utils8();
44268
44679
  platform_default = {
@@ -44284,7 +44695,7 @@ function toURLEncodedForm(data, options) {
44284
44695
  });
44285
44696
  }
44286
44697
  var init_toURLEncodedForm = __esm({
44287
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/toURLEncodedForm.js"() {
44698
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/toURLEncodedForm.js"() {
44288
44699
  init_utils7();
44289
44700
  init_toFormData();
44290
44701
  init_platform();
@@ -44322,7 +44733,7 @@ function formDataToJSON(formData) {
44322
44733
  }
44323
44734
  return !isNumericKey;
44324
44735
  }
44325
- if (!target[name] || !utils_default.isObject(target[name])) {
44736
+ if (!utils_default.hasOwnProp(target, name) || !utils_default.isObject(target[name])) {
44326
44737
  target[name] = [];
44327
44738
  }
44328
44739
  const result = buildPath(path, value, target[name], index);
@@ -44342,7 +44753,7 @@ function formDataToJSON(formData) {
44342
44753
  }
44343
44754
  var formDataToJSON_default;
44344
44755
  var init_formDataToJSON = __esm({
44345
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/formDataToJSON.js"() {
44756
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/formDataToJSON.js"() {
44346
44757
  init_utils7();
44347
44758
  formDataToJSON_default = formDataToJSON;
44348
44759
  }
@@ -44364,7 +44775,7 @@ var own;
44364
44775
  var defaults;
44365
44776
  var defaults_default;
44366
44777
  var init_defaults = __esm({
44367
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/defaults/index.js"() {
44778
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/defaults/index.js"() {
44368
44779
  init_utils7();
44369
44780
  init_AxiosError();
44370
44781
  init_transitional();
@@ -44470,330 +44881,12 @@ var init_defaults = __esm({
44470
44881
  }
44471
44882
  }
44472
44883
  };
44473
- utils_default.forEach(["delete", "get", "head", "post", "put", "patch"], (method) => {
44884
+ utils_default.forEach(["delete", "get", "head", "post", "put", "patch", "query"], (method) => {
44474
44885
  defaults.headers[method] = {};
44475
44886
  });
44476
44887
  defaults_default = defaults;
44477
44888
  }
44478
44889
  });
44479
- var ignoreDuplicateOf;
44480
- var parseHeaders_default;
44481
- var init_parseHeaders = __esm({
44482
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/parseHeaders.js"() {
44483
- init_utils7();
44484
- ignoreDuplicateOf = utils_default.toObjectSet([
44485
- "age",
44486
- "authorization",
44487
- "content-length",
44488
- "content-type",
44489
- "etag",
44490
- "expires",
44491
- "from",
44492
- "host",
44493
- "if-modified-since",
44494
- "if-unmodified-since",
44495
- "last-modified",
44496
- "location",
44497
- "max-forwards",
44498
- "proxy-authorization",
44499
- "referer",
44500
- "retry-after",
44501
- "user-agent"
44502
- ]);
44503
- parseHeaders_default = (rawHeaders) => {
44504
- const parsed = {};
44505
- let key;
44506
- let val;
44507
- let i;
44508
- rawHeaders && rawHeaders.split("\n").forEach(function parser(line) {
44509
- i = line.indexOf(":");
44510
- key = line.substring(0, i).trim().toLowerCase();
44511
- val = line.substring(i + 1).trim();
44512
- if (!key || parsed[key] && ignoreDuplicateOf[key]) {
44513
- return;
44514
- }
44515
- if (key === "set-cookie") {
44516
- if (parsed[key]) {
44517
- parsed[key].push(val);
44518
- } else {
44519
- parsed[key] = [val];
44520
- }
44521
- } else {
44522
- parsed[key] = parsed[key] ? parsed[key] + ", " + val : val;
44523
- }
44524
- });
44525
- return parsed;
44526
- };
44527
- }
44528
- });
44529
- function trimSPorHTAB(str) {
44530
- let start = 0;
44531
- let end = str.length;
44532
- while (start < end) {
44533
- const code = str.charCodeAt(start);
44534
- if (code !== 9 && code !== 32) {
44535
- break;
44536
- }
44537
- start += 1;
44538
- }
44539
- while (end > start) {
44540
- const code = str.charCodeAt(end - 1);
44541
- if (code !== 9 && code !== 32) {
44542
- break;
44543
- }
44544
- end -= 1;
44545
- }
44546
- return start === 0 && end === str.length ? str : str.slice(start, end);
44547
- }
44548
- function normalizeHeader(header) {
44549
- return header && String(header).trim().toLowerCase();
44550
- }
44551
- function sanitizeHeaderValue(str) {
44552
- return trimSPorHTAB(str.replace(INVALID_HEADER_VALUE_CHARS_RE, ""));
44553
- }
44554
- function normalizeValue(value) {
44555
- if (value === false || value == null) {
44556
- return value;
44557
- }
44558
- return utils_default.isArray(value) ? value.map(normalizeValue) : sanitizeHeaderValue(String(value));
44559
- }
44560
- function parseTokens(str) {
44561
- const tokens = /* @__PURE__ */ Object.create(null);
44562
- const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
44563
- let match;
44564
- while (match = tokensRE.exec(str)) {
44565
- tokens[match[1]] = match[2];
44566
- }
44567
- return tokens;
44568
- }
44569
- function matchHeaderValue(context, value, header, filter2, isHeaderNameFilter) {
44570
- if (utils_default.isFunction(filter2)) {
44571
- return filter2.call(this, value, header);
44572
- }
44573
- if (isHeaderNameFilter) {
44574
- value = header;
44575
- }
44576
- if (!utils_default.isString(value)) return;
44577
- if (utils_default.isString(filter2)) {
44578
- return value.indexOf(filter2) !== -1;
44579
- }
44580
- if (utils_default.isRegExp(filter2)) {
44581
- return filter2.test(value);
44582
- }
44583
- }
44584
- function formatHeader(header) {
44585
- return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (w2, char, str) => {
44586
- return char.toUpperCase() + str;
44587
- });
44588
- }
44589
- function buildAccessors(obj, header) {
44590
- const accessorName = utils_default.toCamelCase(" " + header);
44591
- ["get", "set", "has"].forEach((methodName) => {
44592
- Object.defineProperty(obj, methodName + accessorName, {
44593
- value: function(arg1, arg2, arg3) {
44594
- return this[methodName].call(this, header, arg1, arg2, arg3);
44595
- },
44596
- configurable: true
44597
- });
44598
- });
44599
- }
44600
- var $internals;
44601
- var INVALID_HEADER_VALUE_CHARS_RE;
44602
- var isValidHeaderName;
44603
- var AxiosHeaders;
44604
- var AxiosHeaders_default;
44605
- var init_AxiosHeaders = __esm({
44606
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/AxiosHeaders.js"() {
44607
- init_utils7();
44608
- init_parseHeaders();
44609
- $internals = /* @__PURE__ */ Symbol("internals");
44610
- INVALID_HEADER_VALUE_CHARS_RE = /[^\x09\x20-\x7E\x80-\xFF]/g;
44611
- isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());
44612
- AxiosHeaders = class {
44613
- constructor(headers) {
44614
- headers && this.set(headers);
44615
- }
44616
- set(header, valueOrRewrite, rewrite) {
44617
- const self2 = this;
44618
- function setHeader(_value, _header, _rewrite) {
44619
- const lHeader = normalizeHeader(_header);
44620
- if (!lHeader) {
44621
- throw new Error("header name must be a non-empty string");
44622
- }
44623
- const key = utils_default.findKey(self2, lHeader);
44624
- if (!key || self2[key] === void 0 || _rewrite === true || _rewrite === void 0 && self2[key] !== false) {
44625
- self2[key || _header] = normalizeValue(_value);
44626
- }
44627
- }
44628
- const setHeaders = (headers, _rewrite) => utils_default.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
44629
- if (utils_default.isPlainObject(header) || header instanceof this.constructor) {
44630
- setHeaders(header, valueOrRewrite);
44631
- } else if (utils_default.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
44632
- setHeaders(parseHeaders_default(header), valueOrRewrite);
44633
- } else if (utils_default.isObject(header) && utils_default.isIterable(header)) {
44634
- let obj = {}, dest, key;
44635
- for (const entry of header) {
44636
- if (!utils_default.isArray(entry)) {
44637
- throw TypeError("Object iterator must return a key-value pair");
44638
- }
44639
- obj[key = entry[0]] = (dest = obj[key]) ? utils_default.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]] : entry[1];
44640
- }
44641
- setHeaders(obj, valueOrRewrite);
44642
- } else {
44643
- header != null && setHeader(valueOrRewrite, header, rewrite);
44644
- }
44645
- return this;
44646
- }
44647
- get(header, parser) {
44648
- header = normalizeHeader(header);
44649
- if (header) {
44650
- const key = utils_default.findKey(this, header);
44651
- if (key) {
44652
- const value = this[key];
44653
- if (!parser) {
44654
- return value;
44655
- }
44656
- if (parser === true) {
44657
- return parseTokens(value);
44658
- }
44659
- if (utils_default.isFunction(parser)) {
44660
- return parser.call(this, value, key);
44661
- }
44662
- if (utils_default.isRegExp(parser)) {
44663
- return parser.exec(value);
44664
- }
44665
- throw new TypeError("parser must be boolean|regexp|function");
44666
- }
44667
- }
44668
- }
44669
- has(header, matcher) {
44670
- header = normalizeHeader(header);
44671
- if (header) {
44672
- const key = utils_default.findKey(this, header);
44673
- return !!(key && this[key] !== void 0 && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
44674
- }
44675
- return false;
44676
- }
44677
- delete(header, matcher) {
44678
- const self2 = this;
44679
- let deleted = false;
44680
- function deleteHeader(_header) {
44681
- _header = normalizeHeader(_header);
44682
- if (_header) {
44683
- const key = utils_default.findKey(self2, _header);
44684
- if (key && (!matcher || matchHeaderValue(self2, self2[key], key, matcher))) {
44685
- delete self2[key];
44686
- deleted = true;
44687
- }
44688
- }
44689
- }
44690
- if (utils_default.isArray(header)) {
44691
- header.forEach(deleteHeader);
44692
- } else {
44693
- deleteHeader(header);
44694
- }
44695
- return deleted;
44696
- }
44697
- clear(matcher) {
44698
- const keys = Object.keys(this);
44699
- let i = keys.length;
44700
- let deleted = false;
44701
- while (i--) {
44702
- const key = keys[i];
44703
- if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
44704
- delete this[key];
44705
- deleted = true;
44706
- }
44707
- }
44708
- return deleted;
44709
- }
44710
- normalize(format) {
44711
- const self2 = this;
44712
- const headers = {};
44713
- utils_default.forEach(this, (value, header) => {
44714
- const key = utils_default.findKey(headers, header);
44715
- if (key) {
44716
- self2[key] = normalizeValue(value);
44717
- delete self2[header];
44718
- return;
44719
- }
44720
- const normalized = format ? formatHeader(header) : String(header).trim();
44721
- if (normalized !== header) {
44722
- delete self2[header];
44723
- }
44724
- self2[normalized] = normalizeValue(value);
44725
- headers[normalized] = true;
44726
- });
44727
- return this;
44728
- }
44729
- concat(...targets) {
44730
- return this.constructor.concat(this, ...targets);
44731
- }
44732
- toJSON(asStrings) {
44733
- const obj = /* @__PURE__ */ Object.create(null);
44734
- utils_default.forEach(this, (value, header) => {
44735
- value != null && value !== false && (obj[header] = asStrings && utils_default.isArray(value) ? value.join(", ") : value);
44736
- });
44737
- return obj;
44738
- }
44739
- [Symbol.iterator]() {
44740
- return Object.entries(this.toJSON())[Symbol.iterator]();
44741
- }
44742
- toString() {
44743
- return Object.entries(this.toJSON()).map(([header, value]) => header + ": " + value).join("\n");
44744
- }
44745
- getSetCookie() {
44746
- return this.get("set-cookie") || [];
44747
- }
44748
- get [Symbol.toStringTag]() {
44749
- return "AxiosHeaders";
44750
- }
44751
- static from(thing) {
44752
- return thing instanceof this ? thing : new this(thing);
44753
- }
44754
- static concat(first, ...targets) {
44755
- const computed = new this(first);
44756
- targets.forEach((target) => computed.set(target));
44757
- return computed;
44758
- }
44759
- static accessor(header) {
44760
- const internals = this[$internals] = this[$internals] = {
44761
- accessors: {}
44762
- };
44763
- const accessors = internals.accessors;
44764
- const prototype2 = this.prototype;
44765
- function defineAccessor(_header) {
44766
- const lHeader = normalizeHeader(_header);
44767
- if (!accessors[lHeader]) {
44768
- buildAccessors(prototype2, _header);
44769
- accessors[lHeader] = true;
44770
- }
44771
- }
44772
- utils_default.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
44773
- return this;
44774
- }
44775
- };
44776
- AxiosHeaders.accessor([
44777
- "Content-Type",
44778
- "Content-Length",
44779
- "Accept",
44780
- "Accept-Encoding",
44781
- "User-Agent",
44782
- "Authorization"
44783
- ]);
44784
- utils_default.reduceDescriptors(AxiosHeaders.prototype, ({ value }, key) => {
44785
- let mapped = key[0].toUpperCase() + key.slice(1);
44786
- return {
44787
- get: () => value,
44788
- set(headerValue) {
44789
- this[mapped] = headerValue;
44790
- }
44791
- };
44792
- });
44793
- utils_default.freezeMethods(AxiosHeaders);
44794
- AxiosHeaders_default = AxiosHeaders;
44795
- }
44796
- });
44797
44890
  function transformData(fns, response) {
44798
44891
  const config3 = this || defaults_default;
44799
44892
  const context = response || config3;
@@ -44806,7 +44899,7 @@ function transformData(fns, response) {
44806
44899
  return data;
44807
44900
  }
44808
44901
  var init_transformData = __esm({
44809
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/transformData.js"() {
44902
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/transformData.js"() {
44810
44903
  init_utils7();
44811
44904
  init_defaults();
44812
44905
  init_AxiosHeaders();
@@ -44816,13 +44909,13 @@ function isCancel(value) {
44816
44909
  return !!(value && value.__CANCEL__);
44817
44910
  }
44818
44911
  var init_isCancel = __esm({
44819
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/cancel/isCancel.js"() {
44912
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/cancel/isCancel.js"() {
44820
44913
  }
44821
44914
  });
44822
44915
  var CanceledError;
44823
44916
  var CanceledError_default;
44824
44917
  var init_CanceledError = __esm({
44825
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/cancel/CanceledError.js"() {
44918
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/cancel/CanceledError.js"() {
44826
44919
  init_AxiosError();
44827
44920
  CanceledError = class extends AxiosError_default {
44828
44921
  /**
@@ -44848,19 +44941,17 @@ function settle(resolve2, reject, response) {
44848
44941
  if (!response.status || !validateStatus2 || validateStatus2(response.status)) {
44849
44942
  resolve2(response);
44850
44943
  } else {
44851
- reject(
44852
- new AxiosError_default(
44853
- "Request failed with status code " + response.status,
44854
- [AxiosError_default.ERR_BAD_REQUEST, AxiosError_default.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
44855
- response.config,
44856
- response.request,
44857
- response
44858
- )
44859
- );
44944
+ reject(new AxiosError_default(
44945
+ "Request failed with status code " + response.status,
44946
+ response.status >= 400 && response.status < 500 ? AxiosError_default.ERR_BAD_REQUEST : AxiosError_default.ERR_BAD_RESPONSE,
44947
+ response.config,
44948
+ response.request,
44949
+ response
44950
+ ));
44860
44951
  }
44861
44952
  }
44862
44953
  var init_settle = __esm({
44863
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/settle.js"() {
44954
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/settle.js"() {
44864
44955
  init_AxiosError();
44865
44956
  }
44866
44957
  });
@@ -44871,14 +44962,14 @@ function isAbsoluteURL(url2) {
44871
44962
  return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url2);
44872
44963
  }
44873
44964
  var init_isAbsoluteURL = __esm({
44874
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/isAbsoluteURL.js"() {
44965
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/isAbsoluteURL.js"() {
44875
44966
  }
44876
44967
  });
44877
44968
  function combineURLs(baseURL, relativeURL) {
44878
44969
  return relativeURL ? baseURL.replace(/\/?\/$/, "") + "/" + relativeURL.replace(/^\/+/, "") : baseURL;
44879
44970
  }
44880
44971
  var init_combineURLs = __esm({
44881
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/combineURLs.js"() {
44972
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/combineURLs.js"() {
44882
44973
  }
44883
44974
  });
44884
44975
  function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
@@ -44889,7 +44980,7 @@ function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
44889
44980
  return requestedURL;
44890
44981
  }
44891
44982
  var init_buildFullPath = __esm({
44892
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/buildFullPath.js"() {
44983
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/buildFullPath.js"() {
44893
44984
  init_isAbsoluteURL();
44894
44985
  init_combineURLs();
44895
44986
  }
@@ -45711,8 +45802,443 @@ var require_src = __commonJS({
45711
45802
  }
45712
45803
  }
45713
45804
  });
45805
+ var require_promisify = __commonJS({
45806
+ "../../node_modules/.pnpm/agent-base@6.0.2/node_modules/agent-base/dist/src/promisify.js"(exports$1) {
45807
+ Object.defineProperty(exports$1, "__esModule", { value: true });
45808
+ function promisify(fn) {
45809
+ return function(req, opts) {
45810
+ return new Promise((resolve2, reject) => {
45811
+ fn.call(this, req, opts, (err, rtn) => {
45812
+ if (err) {
45813
+ reject(err);
45814
+ } else {
45815
+ resolve2(rtn);
45816
+ }
45817
+ });
45818
+ });
45819
+ };
45820
+ }
45821
+ exports$1.default = promisify;
45822
+ }
45823
+ });
45824
+ var require_src2 = __commonJS({
45825
+ "../../node_modules/.pnpm/agent-base@6.0.2/node_modules/agent-base/dist/src/index.js"(exports$1, module) {
45826
+ var __importDefault = exports$1 && exports$1.__importDefault || function(mod4) {
45827
+ return mod4 && mod4.__esModule ? mod4 : { "default": mod4 };
45828
+ };
45829
+ var events_1 = __require("events");
45830
+ var debug_1 = __importDefault(require_src());
45831
+ var promisify_1 = __importDefault(require_promisify());
45832
+ var debug = debug_1.default("agent-base");
45833
+ function isAgent(v) {
45834
+ return Boolean(v) && typeof v.addRequest === "function";
45835
+ }
45836
+ function isSecureEndpoint() {
45837
+ const { stack } = new Error();
45838
+ if (typeof stack !== "string")
45839
+ return false;
45840
+ return stack.split("\n").some((l2) => l2.indexOf("(https.js:") !== -1 || l2.indexOf("node:https:") !== -1);
45841
+ }
45842
+ function createAgent2(callback, opts) {
45843
+ return new createAgent2.Agent(callback, opts);
45844
+ }
45845
+ (function(createAgent3) {
45846
+ class Agent extends events_1.EventEmitter {
45847
+ constructor(callback, _opts) {
45848
+ super();
45849
+ let opts = _opts;
45850
+ if (typeof callback === "function") {
45851
+ this.callback = callback;
45852
+ } else if (callback) {
45853
+ opts = callback;
45854
+ }
45855
+ this.timeout = null;
45856
+ if (opts && typeof opts.timeout === "number") {
45857
+ this.timeout = opts.timeout;
45858
+ }
45859
+ this.maxFreeSockets = 1;
45860
+ this.maxSockets = 1;
45861
+ this.maxTotalSockets = Infinity;
45862
+ this.sockets = {};
45863
+ this.freeSockets = {};
45864
+ this.requests = {};
45865
+ this.options = {};
45866
+ }
45867
+ get defaultPort() {
45868
+ if (typeof this.explicitDefaultPort === "number") {
45869
+ return this.explicitDefaultPort;
45870
+ }
45871
+ return isSecureEndpoint() ? 443 : 80;
45872
+ }
45873
+ set defaultPort(v) {
45874
+ this.explicitDefaultPort = v;
45875
+ }
45876
+ get protocol() {
45877
+ if (typeof this.explicitProtocol === "string") {
45878
+ return this.explicitProtocol;
45879
+ }
45880
+ return isSecureEndpoint() ? "https:" : "http:";
45881
+ }
45882
+ set protocol(v) {
45883
+ this.explicitProtocol = v;
45884
+ }
45885
+ callback(req, opts, fn) {
45886
+ throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`');
45887
+ }
45888
+ /**
45889
+ * Called by node-core's "_http_client.js" module when creating
45890
+ * a new HTTP request with this Agent instance.
45891
+ *
45892
+ * @api public
45893
+ */
45894
+ addRequest(req, _opts) {
45895
+ const opts = Object.assign({}, _opts);
45896
+ if (typeof opts.secureEndpoint !== "boolean") {
45897
+ opts.secureEndpoint = isSecureEndpoint();
45898
+ }
45899
+ if (opts.host == null) {
45900
+ opts.host = "localhost";
45901
+ }
45902
+ if (opts.port == null) {
45903
+ opts.port = opts.secureEndpoint ? 443 : 80;
45904
+ }
45905
+ if (opts.protocol == null) {
45906
+ opts.protocol = opts.secureEndpoint ? "https:" : "http:";
45907
+ }
45908
+ if (opts.host && opts.path) {
45909
+ delete opts.path;
45910
+ }
45911
+ delete opts.agent;
45912
+ delete opts.hostname;
45913
+ delete opts._defaultAgent;
45914
+ delete opts.defaultPort;
45915
+ delete opts.createConnection;
45916
+ req._last = true;
45917
+ req.shouldKeepAlive = false;
45918
+ let timedOut = false;
45919
+ let timeoutId = null;
45920
+ const timeoutMs = opts.timeout || this.timeout;
45921
+ const onerror = (err) => {
45922
+ if (req._hadError)
45923
+ return;
45924
+ req.emit("error", err);
45925
+ req._hadError = true;
45926
+ };
45927
+ const ontimeout = () => {
45928
+ timeoutId = null;
45929
+ timedOut = true;
45930
+ const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`);
45931
+ err.code = "ETIMEOUT";
45932
+ onerror(err);
45933
+ };
45934
+ const callbackError = (err) => {
45935
+ if (timedOut)
45936
+ return;
45937
+ if (timeoutId !== null) {
45938
+ clearTimeout(timeoutId);
45939
+ timeoutId = null;
45940
+ }
45941
+ onerror(err);
45942
+ };
45943
+ const onsocket = (socket) => {
45944
+ if (timedOut)
45945
+ return;
45946
+ if (timeoutId != null) {
45947
+ clearTimeout(timeoutId);
45948
+ timeoutId = null;
45949
+ }
45950
+ if (isAgent(socket)) {
45951
+ debug("Callback returned another Agent instance %o", socket.constructor.name);
45952
+ socket.addRequest(req, opts);
45953
+ return;
45954
+ }
45955
+ if (socket) {
45956
+ socket.once("free", () => {
45957
+ this.freeSocket(socket, opts);
45958
+ });
45959
+ req.onSocket(socket);
45960
+ return;
45961
+ }
45962
+ const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``);
45963
+ onerror(err);
45964
+ };
45965
+ if (typeof this.callback !== "function") {
45966
+ onerror(new Error("`callback` is not defined"));
45967
+ return;
45968
+ }
45969
+ if (!this.promisifiedCallback) {
45970
+ if (this.callback.length >= 3) {
45971
+ debug("Converting legacy callback function to promise");
45972
+ this.promisifiedCallback = promisify_1.default(this.callback);
45973
+ } else {
45974
+ this.promisifiedCallback = this.callback;
45975
+ }
45976
+ }
45977
+ if (typeof timeoutMs === "number" && timeoutMs > 0) {
45978
+ timeoutId = setTimeout(ontimeout, timeoutMs);
45979
+ }
45980
+ if ("port" in opts && typeof opts.port !== "number") {
45981
+ opts.port = Number(opts.port);
45982
+ }
45983
+ try {
45984
+ debug("Resolving socket for %o request: %o", opts.protocol, `${req.method} ${req.path}`);
45985
+ Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError);
45986
+ } catch (err) {
45987
+ Promise.reject(err).catch(callbackError);
45988
+ }
45989
+ }
45990
+ freeSocket(socket, opts) {
45991
+ debug("Freeing socket %o %o", socket.constructor.name, opts);
45992
+ socket.destroy();
45993
+ }
45994
+ destroy() {
45995
+ debug("Destroying agent %o", this.constructor.name);
45996
+ }
45997
+ }
45998
+ createAgent3.Agent = Agent;
45999
+ createAgent3.prototype = createAgent3.Agent.prototype;
46000
+ })(createAgent2 || (createAgent2 = {}));
46001
+ module.exports = createAgent2;
46002
+ }
46003
+ });
46004
+ var require_parse_proxy_response = __commonJS({
46005
+ "../../node_modules/.pnpm/https-proxy-agent@5.0.1/node_modules/https-proxy-agent/dist/parse-proxy-response.js"(exports$1) {
46006
+ var __importDefault = exports$1 && exports$1.__importDefault || function(mod4) {
46007
+ return mod4 && mod4.__esModule ? mod4 : { "default": mod4 };
46008
+ };
46009
+ Object.defineProperty(exports$1, "__esModule", { value: true });
46010
+ var debug_1 = __importDefault(require_src());
46011
+ var debug = debug_1.default("https-proxy-agent:parse-proxy-response");
46012
+ function parseProxyResponse(socket) {
46013
+ return new Promise((resolve2, reject) => {
46014
+ let buffersLength = 0;
46015
+ const buffers = [];
46016
+ function read() {
46017
+ const b = socket.read();
46018
+ if (b)
46019
+ ondata(b);
46020
+ else
46021
+ socket.once("readable", read);
46022
+ }
46023
+ function cleanup() {
46024
+ socket.removeListener("end", onend);
46025
+ socket.removeListener("error", onerror);
46026
+ socket.removeListener("close", onclose);
46027
+ socket.removeListener("readable", read);
46028
+ }
46029
+ function onclose(err) {
46030
+ debug("onclose had error %o", err);
46031
+ }
46032
+ function onend() {
46033
+ debug("onend");
46034
+ }
46035
+ function onerror(err) {
46036
+ cleanup();
46037
+ debug("onerror %o", err);
46038
+ reject(err);
46039
+ }
46040
+ function ondata(b) {
46041
+ buffers.push(b);
46042
+ buffersLength += b.length;
46043
+ const buffered = Buffer.concat(buffers, buffersLength);
46044
+ const endOfHeaders = buffered.indexOf("\r\n\r\n");
46045
+ if (endOfHeaders === -1) {
46046
+ debug("have not received end of HTTP headers yet...");
46047
+ read();
46048
+ return;
46049
+ }
46050
+ const firstLine = buffered.toString("ascii", 0, buffered.indexOf("\r\n"));
46051
+ const statusCode = +firstLine.split(" ")[1];
46052
+ debug("got proxy server response: %o", firstLine);
46053
+ resolve2({
46054
+ statusCode,
46055
+ buffered
46056
+ });
46057
+ }
46058
+ socket.on("error", onerror);
46059
+ socket.on("close", onclose);
46060
+ socket.on("end", onend);
46061
+ read();
46062
+ });
46063
+ }
46064
+ exports$1.default = parseProxyResponse;
46065
+ }
46066
+ });
46067
+ var require_agent = __commonJS({
46068
+ "../../node_modules/.pnpm/https-proxy-agent@5.0.1/node_modules/https-proxy-agent/dist/agent.js"(exports$1) {
46069
+ var __awaiter4 = exports$1 && exports$1.__awaiter || function(thisArg, _arguments, P3, generator) {
46070
+ function adopt(value) {
46071
+ return value instanceof P3 ? value : new P3(function(resolve2) {
46072
+ resolve2(value);
46073
+ });
46074
+ }
46075
+ return new (P3 || (P3 = Promise))(function(resolve2, reject) {
46076
+ function fulfilled(value) {
46077
+ try {
46078
+ step(generator.next(value));
46079
+ } catch (e) {
46080
+ reject(e);
46081
+ }
46082
+ }
46083
+ function rejected(value) {
46084
+ try {
46085
+ step(generator["throw"](value));
46086
+ } catch (e) {
46087
+ reject(e);
46088
+ }
46089
+ }
46090
+ function step(result) {
46091
+ result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);
46092
+ }
46093
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
46094
+ });
46095
+ };
46096
+ var __importDefault = exports$1 && exports$1.__importDefault || function(mod4) {
46097
+ return mod4 && mod4.__esModule ? mod4 : { "default": mod4 };
46098
+ };
46099
+ Object.defineProperty(exports$1, "__esModule", { value: true });
46100
+ var net_1 = __importDefault(__require("net"));
46101
+ var tls_1 = __importDefault(__require("tls"));
46102
+ var url_1 = __importDefault(__require("url"));
46103
+ var assert_1 = __importDefault(__require("assert"));
46104
+ var debug_1 = __importDefault(require_src());
46105
+ var agent_base_1 = require_src2();
46106
+ var parse_proxy_response_1 = __importDefault(require_parse_proxy_response());
46107
+ var debug = debug_1.default("https-proxy-agent:agent");
46108
+ var HttpsProxyAgent2 = class extends agent_base_1.Agent {
46109
+ constructor(_opts) {
46110
+ let opts;
46111
+ if (typeof _opts === "string") {
46112
+ opts = url_1.default.parse(_opts);
46113
+ } else {
46114
+ opts = _opts;
46115
+ }
46116
+ if (!opts) {
46117
+ throw new Error("an HTTP(S) proxy server `host` and `port` must be specified!");
46118
+ }
46119
+ debug("creating new HttpsProxyAgent instance: %o", opts);
46120
+ super(opts);
46121
+ const proxy = Object.assign({}, opts);
46122
+ this.secureProxy = opts.secureProxy || isHTTPS(proxy.protocol);
46123
+ proxy.host = proxy.hostname || proxy.host;
46124
+ if (typeof proxy.port === "string") {
46125
+ proxy.port = parseInt(proxy.port, 10);
46126
+ }
46127
+ if (!proxy.port && proxy.host) {
46128
+ proxy.port = this.secureProxy ? 443 : 80;
46129
+ }
46130
+ if (this.secureProxy && !("ALPNProtocols" in proxy)) {
46131
+ proxy.ALPNProtocols = ["http 1.1"];
46132
+ }
46133
+ if (proxy.host && proxy.path) {
46134
+ delete proxy.path;
46135
+ delete proxy.pathname;
46136
+ }
46137
+ this.proxy = proxy;
46138
+ }
46139
+ /**
46140
+ * Called when the node-core HTTP client library is creating a
46141
+ * new HTTP request.
46142
+ *
46143
+ * @api protected
46144
+ */
46145
+ callback(req, opts) {
46146
+ return __awaiter4(this, void 0, void 0, function* () {
46147
+ const { proxy, secureProxy } = this;
46148
+ let socket;
46149
+ if (secureProxy) {
46150
+ debug("Creating `tls.Socket`: %o", proxy);
46151
+ socket = tls_1.default.connect(proxy);
46152
+ } else {
46153
+ debug("Creating `net.Socket`: %o", proxy);
46154
+ socket = net_1.default.connect(proxy);
46155
+ }
46156
+ const headers = Object.assign({}, proxy.headers);
46157
+ const hostname2 = `${opts.host}:${opts.port}`;
46158
+ let payload = `CONNECT ${hostname2} HTTP/1.1\r
46159
+ `;
46160
+ if (proxy.auth) {
46161
+ headers["Proxy-Authorization"] = `Basic ${Buffer.from(proxy.auth).toString("base64")}`;
46162
+ }
46163
+ let { host, port, secureEndpoint } = opts;
46164
+ if (!isDefaultPort(port, secureEndpoint)) {
46165
+ host += `:${port}`;
46166
+ }
46167
+ headers.Host = host;
46168
+ headers.Connection = "close";
46169
+ for (const name of Object.keys(headers)) {
46170
+ payload += `${name}: ${headers[name]}\r
46171
+ `;
46172
+ }
46173
+ const proxyResponsePromise = parse_proxy_response_1.default(socket);
46174
+ socket.write(`${payload}\r
46175
+ `);
46176
+ const { statusCode, buffered } = yield proxyResponsePromise;
46177
+ if (statusCode === 200) {
46178
+ req.once("socket", resume);
46179
+ if (opts.secureEndpoint) {
46180
+ debug("Upgrading socket connection to TLS");
46181
+ const servername = opts.servername || opts.host;
46182
+ return tls_1.default.connect(Object.assign(Object.assign({}, omit2(opts, "host", "hostname", "path", "port")), {
46183
+ socket,
46184
+ servername
46185
+ }));
46186
+ }
46187
+ return socket;
46188
+ }
46189
+ socket.destroy();
46190
+ const fakeSocket = new net_1.default.Socket({ writable: false });
46191
+ fakeSocket.readable = true;
46192
+ req.once("socket", (s) => {
46193
+ debug("replaying proxy buffer for failed request");
46194
+ assert_1.default(s.listenerCount("data") > 0);
46195
+ s.push(buffered);
46196
+ s.push(null);
46197
+ });
46198
+ return fakeSocket;
46199
+ });
46200
+ }
46201
+ };
46202
+ exports$1.default = HttpsProxyAgent2;
46203
+ function resume(socket) {
46204
+ socket.resume();
46205
+ }
46206
+ function isDefaultPort(port, secure) {
46207
+ return Boolean(!secure && port === 80 || secure && port === 443);
46208
+ }
46209
+ function isHTTPS(protocol) {
46210
+ return typeof protocol === "string" ? /^https:?$/i.test(protocol) : false;
46211
+ }
46212
+ function omit2(obj, ...keys) {
46213
+ const ret = {};
46214
+ let key;
46215
+ for (key in obj) {
46216
+ if (!keys.includes(key)) {
46217
+ ret[key] = obj[key];
46218
+ }
46219
+ }
46220
+ return ret;
46221
+ }
46222
+ }
46223
+ });
46224
+ var require_dist2 = __commonJS({
46225
+ "../../node_modules/.pnpm/https-proxy-agent@5.0.1/node_modules/https-proxy-agent/dist/index.js"(exports$1, module) {
46226
+ var __importDefault = exports$1 && exports$1.__importDefault || function(mod4) {
46227
+ return mod4 && mod4.__esModule ? mod4 : { "default": mod4 };
46228
+ };
46229
+ var agent_1 = __importDefault(require_agent());
46230
+ function createHttpsProxyAgent(opts) {
46231
+ return new agent_1.default(opts);
46232
+ }
46233
+ (function(createHttpsProxyAgent2) {
46234
+ createHttpsProxyAgent2.HttpsProxyAgent = agent_1.default;
46235
+ createHttpsProxyAgent2.prototype = agent_1.default.prototype;
46236
+ })(createHttpsProxyAgent || (createHttpsProxyAgent = {}));
46237
+ module.exports = createHttpsProxyAgent;
46238
+ }
46239
+ });
45714
46240
  var require_debug = __commonJS({
45715
- "../../node_modules/.pnpm/follow-redirects@1.15.11/node_modules/follow-redirects/debug.js"(exports$1, module) {
46241
+ "../../node_modules/.pnpm/follow-redirects@1.16.0/node_modules/follow-redirects/debug.js"(exports$1, module) {
45716
46242
  var debug;
45717
46243
  module.exports = function() {
45718
46244
  if (!debug) {
@@ -45730,7 +46256,7 @@ var require_debug = __commonJS({
45730
46256
  }
45731
46257
  });
45732
46258
  var require_follow_redirects = __commonJS({
45733
- "../../node_modules/.pnpm/follow-redirects@1.15.11/node_modules/follow-redirects/index.js"(exports$1, module) {
46259
+ "../../node_modules/.pnpm/follow-redirects@1.16.0/node_modules/follow-redirects/index.js"(exports$1, module) {
45734
46260
  var url2 = __require("url");
45735
46261
  var URL3 = url2.URL;
45736
46262
  var http4 = __require("http");
@@ -45752,6 +46278,11 @@ var require_follow_redirects = __commonJS({
45752
46278
  } catch (error2) {
45753
46279
  useNativeURL = error2.code === "ERR_INVALID_URL";
45754
46280
  }
46281
+ var sensitiveHeaders = [
46282
+ "Authorization",
46283
+ "Proxy-Authorization",
46284
+ "Cookie"
46285
+ ];
45755
46286
  var preservedUrlFields = [
45756
46287
  "auth",
45757
46288
  "host",
@@ -45816,6 +46347,7 @@ var require_follow_redirects = __commonJS({
45816
46347
  self2.emit("error", cause instanceof RedirectionError ? cause : new RedirectionError({ cause }));
45817
46348
  }
45818
46349
  };
46350
+ this._headerFilter = new RegExp("^(?:" + sensitiveHeaders.concat(options.sensitiveHeaders).map(escapeRegex2).join("|") + ")$", "i");
45819
46351
  this._performRequest();
45820
46352
  }
45821
46353
  RedirectableRequest.prototype = Object.create(Writable.prototype);
@@ -45953,6 +46485,9 @@ var require_follow_redirects = __commonJS({
45953
46485
  if (!options.headers) {
45954
46486
  options.headers = {};
45955
46487
  }
46488
+ if (!isArray2(options.sensitiveHeaders)) {
46489
+ options.sensitiveHeaders = [];
46490
+ }
45956
46491
  if (options.host) {
45957
46492
  if (!options.hostname) {
45958
46493
  options.hostname = options.host;
@@ -46058,7 +46593,7 @@ var require_follow_redirects = __commonJS({
46058
46593
  this._isRedirect = true;
46059
46594
  spreadUrlObject(redirectUrl, this._options);
46060
46595
  if (redirectUrl.protocol !== currentUrlParts.protocol && redirectUrl.protocol !== "https:" || redirectUrl.host !== currentHost && !isSubdomain(redirectUrl.host, currentHost)) {
46061
- removeMatchingHeaders(/^(?:(?:proxy-)?authorization|cookie)$/i, this._options.headers);
46596
+ removeMatchingHeaders(this._headerFilter, this._options.headers);
46062
46597
  }
46063
46598
  if (isFunction3(beforeRedirect)) {
46064
46599
  var responseDetails = {
@@ -46207,6 +46742,9 @@ var require_follow_redirects = __commonJS({
46207
46742
  var dot = subdomain.length - domain.length - 1;
46208
46743
  return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain);
46209
46744
  }
46745
+ function isArray2(value) {
46746
+ return value instanceof Array;
46747
+ }
46210
46748
  function isString2(value) {
46211
46749
  return typeof value === "string" || value instanceof String;
46212
46750
  }
@@ -46219,22 +46757,25 @@ var require_follow_redirects = __commonJS({
46219
46757
  function isURL(value) {
46220
46758
  return URL3 && value instanceof URL3;
46221
46759
  }
46760
+ function escapeRegex2(regex) {
46761
+ return regex.replace(/[\]\\/()*+?.$]/g, "\\$&");
46762
+ }
46222
46763
  module.exports = wrap2({ http: http4, https: https3 });
46223
46764
  module.exports.wrap = wrap2;
46224
46765
  }
46225
46766
  });
46226
46767
  var VERSION;
46227
46768
  var init_data = __esm({
46228
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/env/data.js"() {
46229
- VERSION = "1.15.2";
46769
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/env/data.js"() {
46770
+ VERSION = "1.16.1";
46230
46771
  }
46231
46772
  });
46232
46773
  function parseProtocol(url2) {
46233
- const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url2);
46774
+ const match = /^([-+\w]{1,25}):(?:\/\/)?/.exec(url2);
46234
46775
  return match && match[1] || "";
46235
46776
  }
46236
46777
  var init_parseProtocol = __esm({
46237
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/parseProtocol.js"() {
46778
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/parseProtocol.js"() {
46238
46779
  }
46239
46780
  });
46240
46781
  function fromDataURI(uri, asBlob, options) {
@@ -46249,10 +46790,17 @@ function fromDataURI(uri, asBlob, options) {
46249
46790
  if (!match) {
46250
46791
  throw new AxiosError_default("Invalid URL", AxiosError_default.ERR_INVALID_URL);
46251
46792
  }
46252
- const mime = match[1];
46253
- const isBase64 = match[2];
46254
- const body2 = match[3];
46255
- const buffer = Buffer.from(decodeURIComponent(body2), isBase64 ? "base64" : "utf8");
46793
+ const type = match[1];
46794
+ const params = match[2];
46795
+ const encoding = match[3] ? "base64" : "utf8";
46796
+ const body2 = match[4];
46797
+ let mime;
46798
+ if (type) {
46799
+ mime = params ? type + params : type;
46800
+ } else if (params) {
46801
+ mime = "text/plain" + params;
46802
+ }
46803
+ const buffer = Buffer.from(decodeURIComponent(body2), encoding);
46256
46804
  if (asBlob) {
46257
46805
  if (!_Blob) {
46258
46806
  throw new AxiosError_default("Blob is not supported", AxiosError_default.ERR_NOT_SUPPORT);
@@ -46265,18 +46813,18 @@ function fromDataURI(uri, asBlob, options) {
46265
46813
  }
46266
46814
  var DATA_URL_PATTERN;
46267
46815
  var init_fromDataURI = __esm({
46268
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/fromDataURI.js"() {
46816
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/fromDataURI.js"() {
46269
46817
  init_AxiosError();
46270
46818
  init_parseProtocol();
46271
46819
  init_platform();
46272
- DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
46820
+ DATA_URL_PATTERN = /^([^,;]+\/[^,;]+)?((?:;[^,;=]+=[^,;]+)*)(;base64)?,([\s\S]*)$/;
46273
46821
  }
46274
46822
  });
46275
46823
  var kInternals;
46276
46824
  var AxiosTransformStream;
46277
46825
  var AxiosTransformStream_default;
46278
46826
  var init_AxiosTransformStream = __esm({
46279
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/AxiosTransformStream.js"() {
46827
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/AxiosTransformStream.js"() {
46280
46828
  init_utils7();
46281
46829
  kInternals = /* @__PURE__ */ Symbol("internals");
46282
46830
  AxiosTransformStream = class extends stream3.Transform {
@@ -46404,7 +46952,7 @@ var asyncIterator;
46404
46952
  var readBlob;
46405
46953
  var readBlob_default;
46406
46954
  var init_readBlob = __esm({
46407
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/readBlob.js"() {
46955
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/readBlob.js"() {
46408
46956
  ({ asyncIterator } = Symbol);
46409
46957
  readBlob = async function* (blob) {
46410
46958
  if (blob.stream) {
@@ -46429,7 +46977,7 @@ var FormDataPart;
46429
46977
  var formDataToStream;
46430
46978
  var formDataToStream_default;
46431
46979
  var init_formDataToStream = __esm({
46432
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/formDataToStream.js"() {
46980
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/formDataToStream.js"() {
46433
46981
  init_utils7();
46434
46982
  init_readBlob();
46435
46983
  init_platform();
@@ -46486,7 +47034,7 @@ var init_formDataToStream = __esm({
46486
47034
  throw TypeError("FormData instance required");
46487
47035
  }
46488
47036
  if (boundary.length < 1 || boundary.length > 70) {
46489
- throw Error("boundary must be 10-70 characters long");
47037
+ throw Error("boundary must be 1-70 characters long");
46490
47038
  }
46491
47039
  const boundaryBytes = textEncoder.encode("--" + boundary + CRLF);
46492
47040
  const footerBytes = textEncoder.encode("--" + boundary + "--" + CRLF);
@@ -46521,7 +47069,7 @@ var init_formDataToStream = __esm({
46521
47069
  var ZlibHeaderTransformStream;
46522
47070
  var ZlibHeaderTransformStream_default;
46523
47071
  var init_ZlibHeaderTransformStream = __esm({
46524
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js"() {
47072
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js"() {
46525
47073
  ZlibHeaderTransformStream = class extends stream3.Transform {
46526
47074
  __transform(chunk2, encoding, callback) {
46527
47075
  this.push(chunk2);
@@ -46546,7 +47094,7 @@ var init_ZlibHeaderTransformStream = __esm({
46546
47094
  var callbackify;
46547
47095
  var callbackify_default;
46548
47096
  var init_callbackify = __esm({
46549
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/callbackify.js"() {
47097
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/callbackify.js"() {
46550
47098
  init_utils7();
46551
47099
  callbackify = (fn, reducer) => {
46552
47100
  return utils_default.isAsyncFn(fn) ? function(...args) {
@@ -46606,9 +47154,12 @@ var isIPv6Loopback;
46606
47154
  var isLoopback;
46607
47155
  var DEFAULT_PORTS2;
46608
47156
  var parseNoProxyEntry;
47157
+ var IPV4_MAPPED_DOTTED_RE;
47158
+ var IPV4_MAPPED_HEX_RE;
47159
+ var unmapIPv4MappedIPv6;
46609
47160
  var normalizeNoProxyHost;
46610
47161
  var init_shouldBypassProxy = __esm({
46611
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/shouldBypassProxy.js"() {
47162
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/shouldBypassProxy.js"() {
46612
47163
  LOOPBACK_HOSTNAMES = /* @__PURE__ */ new Set(["localhost"]);
46613
47164
  isIPv4Loopback = (host) => {
46614
47165
  const parts = host.split(".");
@@ -46669,6 +47220,20 @@ var init_shouldBypassProxy = __esm({
46669
47220
  }
46670
47221
  return [entryHost, entryPort];
46671
47222
  };
47223
+ IPV4_MAPPED_DOTTED_RE = /^(?:::|(?:0{1,4}:){1,4}:|(?:0{1,4}:){5})ffff:(\d+\.\d+\.\d+\.\d+)$/i;
47224
+ IPV4_MAPPED_HEX_RE = /^(?:::|(?:0{1,4}:){1,4}:|(?:0{1,4}:){5})ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i;
47225
+ unmapIPv4MappedIPv6 = (host) => {
47226
+ if (typeof host !== "string" || host.indexOf(":") === -1) return host;
47227
+ const dotted = host.match(IPV4_MAPPED_DOTTED_RE);
47228
+ if (dotted) return dotted[1];
47229
+ const hex = host.match(IPV4_MAPPED_HEX_RE);
47230
+ if (hex) {
47231
+ const high = parseInt(hex[1], 16);
47232
+ const low = parseInt(hex[2], 16);
47233
+ return `${high >> 8}.${high & 255}.${low >> 8}.${low & 255}`;
47234
+ }
47235
+ return host;
47236
+ };
46672
47237
  normalizeNoProxyHost = (hostname2) => {
46673
47238
  if (!hostname2) {
46674
47239
  return hostname2;
@@ -46676,7 +47241,7 @@ var init_shouldBypassProxy = __esm({
46676
47241
  if (hostname2.charAt(0) === "[" && hostname2.charAt(hostname2.length - 1) === "]") {
46677
47242
  hostname2 = hostname2.slice(1, -1);
46678
47243
  }
46679
- return hostname2.replace(/\.+$/, "");
47244
+ return unmapIPv4MappedIPv6(hostname2.replace(/\.+$/, ""));
46680
47245
  };
46681
47246
  }
46682
47247
  });
@@ -46715,7 +47280,7 @@ function speedometer(samplesCount, min2) {
46715
47280
  }
46716
47281
  var speedometer_default;
46717
47282
  var init_speedometer = __esm({
46718
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/speedometer.js"() {
47283
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/speedometer.js"() {
46719
47284
  speedometer_default = speedometer;
46720
47285
  }
46721
47286
  });
@@ -46753,7 +47318,7 @@ function throttle(fn, freq) {
46753
47318
  }
46754
47319
  var throttle_default;
46755
47320
  var init_throttle = __esm({
46756
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/throttle.js"() {
47321
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/throttle.js"() {
46757
47322
  throttle_default = throttle;
46758
47323
  }
46759
47324
  });
@@ -46761,7 +47326,7 @@ var progressEventReducer;
46761
47326
  var progressEventDecorator;
46762
47327
  var asyncDecorator;
46763
47328
  var init_progressEventReducer = __esm({
46764
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/progressEventReducer.js"() {
47329
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/progressEventReducer.js"() {
46765
47330
  init_speedometer();
46766
47331
  init_throttle();
46767
47332
  init_utils7();
@@ -46769,6 +47334,9 @@ var init_progressEventReducer = __esm({
46769
47334
  let bytesNotified = 0;
46770
47335
  const _speedometer = speedometer_default(50, 250);
46771
47336
  return throttle_default((e) => {
47337
+ if (!e || typeof e.loaded !== "number") {
47338
+ return;
47339
+ }
46772
47340
  const rawLoaded = e.loaded;
46773
47341
  const total = e.lengthComputable ? e.total : void 0;
46774
47342
  const loaded = total != null ? Math.min(rawLoaded, total) : rawLoaded;
@@ -46847,24 +47415,68 @@ function estimateDataURLDecodedBytes(url2) {
46847
47415
  }
46848
47416
  }
46849
47417
  const groups = Math.floor(effectiveLen / 4);
46850
- const bytes = groups * 3 - (pad || 0);
46851
- return bytes > 0 ? bytes : 0;
47418
+ const bytes2 = groups * 3 - (pad || 0);
47419
+ return bytes2 > 0 ? bytes2 : 0;
47420
+ }
47421
+ if (typeof Buffer !== "undefined" && typeof Buffer.byteLength === "function") {
47422
+ return Buffer.byteLength(body2, "utf8");
47423
+ }
47424
+ let bytes = 0;
47425
+ for (let i = 0, len = body2.length; i < len; i++) {
47426
+ const c = body2.charCodeAt(i);
47427
+ if (c < 128) {
47428
+ bytes += 1;
47429
+ } else if (c < 2048) {
47430
+ bytes += 2;
47431
+ } else if (c >= 55296 && c <= 56319 && i + 1 < len) {
47432
+ const next = body2.charCodeAt(i + 1);
47433
+ if (next >= 56320 && next <= 57343) {
47434
+ bytes += 4;
47435
+ i++;
47436
+ } else {
47437
+ bytes += 3;
47438
+ }
47439
+ } else {
47440
+ bytes += 3;
47441
+ }
46852
47442
  }
46853
- return Buffer.byteLength(body2, "utf8");
47443
+ return bytes;
46854
47444
  }
46855
47445
  var init_estimateDataURLDecodedBytes = __esm({
46856
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js"() {
47446
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js"() {
46857
47447
  }
46858
47448
  });
46859
- function dispatchBeforeRedirect(options, responseDetails) {
47449
+ function setFormDataHeaders(headers, formHeaders, policy) {
47450
+ if (policy !== "content-only") {
47451
+ headers.set(formHeaders);
47452
+ return;
47453
+ }
47454
+ Object.entries(formHeaders).forEach(([key, val]) => {
47455
+ if (FORM_DATA_CONTENT_HEADERS.includes(key.toLowerCase())) {
47456
+ headers.set(key, val);
47457
+ }
47458
+ });
47459
+ }
47460
+ function getTunnelingAgent(agentOptions, userHttpsAgent) {
47461
+ const key = agentOptions.protocol + "//" + agentOptions.hostname + ":" + (agentOptions.port || "") + "#" + (agentOptions.auth || "");
47462
+ const cache = userHttpsAgent ? tunnelingAgentCacheUser.get(userHttpsAgent) || tunnelingAgentCacheUser.set(userHttpsAgent, /* @__PURE__ */ new Map()).get(userHttpsAgent) : tunnelingAgentCache;
47463
+ let agent = cache.get(key);
47464
+ if (agent) return agent;
47465
+ const merged = userHttpsAgent && userHttpsAgent.options ? { ...userHttpsAgent.options, ...agentOptions } : agentOptions;
47466
+ agent = new import_https_proxy_agent.default(merged);
47467
+ agent[kAxiosInstalledTunnel] = true;
47468
+ cache.set(key, agent);
47469
+ return agent;
47470
+ }
47471
+ function dispatchBeforeRedirect(options, responseDetails, requestDetails) {
46860
47472
  if (options.beforeRedirects.proxy) {
46861
47473
  options.beforeRedirects.proxy(options);
46862
47474
  }
46863
47475
  if (options.beforeRedirects.config) {
46864
- options.beforeRedirects.config(options, responseDetails);
47476
+ options.beforeRedirects.config(options, responseDetails, requestDetails);
46865
47477
  }
46866
47478
  }
46867
- function setProxy(options, configProxy, location) {
47479
+ function setProxy(options, configProxy, location, isRedirect, configHttpsAgent) {
46868
47480
  let proxy = configProxy;
46869
47481
  if (!proxy && proxy !== false) {
46870
47482
  const proxyUrl = getProxyForUrl(location);
@@ -46874,34 +47486,93 @@ function setProxy(options, configProxy, location) {
46874
47486
  }
46875
47487
  }
46876
47488
  }
46877
- if (proxy) {
46878
- if (proxy.username) {
46879
- proxy.auth = (proxy.username || "") + ":" + (proxy.password || "");
47489
+ if (isRedirect && options.headers) {
47490
+ for (const name of Object.keys(options.headers)) {
47491
+ if (name.toLowerCase() === "proxy-authorization") {
47492
+ delete options.headers[name];
47493
+ }
46880
47494
  }
46881
- if (proxy.auth) {
46882
- const validProxyAuth = Boolean(proxy.auth.username || proxy.auth.password);
47495
+ }
47496
+ if (isRedirect && options.agent && options.agent[kAxiosInstalledTunnel]) {
47497
+ options.agent = void 0;
47498
+ }
47499
+ if (proxy) {
47500
+ const isProxyURL = proxy instanceof URL;
47501
+ const readProxyField = (key) => isProxyURL || utils_default.hasOwnProp(proxy, key) ? proxy[key] : void 0;
47502
+ const proxyUsername = readProxyField("username");
47503
+ const proxyPassword = readProxyField("password");
47504
+ let proxyAuth = utils_default.hasOwnProp(proxy, "auth") ? proxy.auth : void 0;
47505
+ if (proxyUsername) {
47506
+ proxyAuth = (proxyUsername || "") + ":" + (proxyPassword || "");
47507
+ }
47508
+ if (proxyAuth) {
47509
+ const authIsObject = typeof proxyAuth === "object";
47510
+ const authUsername = authIsObject && utils_default.hasOwnProp(proxyAuth, "username") ? proxyAuth.username : void 0;
47511
+ const authPassword = authIsObject && utils_default.hasOwnProp(proxyAuth, "password") ? proxyAuth.password : void 0;
47512
+ const validProxyAuth = Boolean(authUsername || authPassword);
46883
47513
  if (validProxyAuth) {
46884
- proxy.auth = (proxy.auth.username || "") + ":" + (proxy.auth.password || "");
46885
- } else if (typeof proxy.auth === "object") {
47514
+ proxyAuth = (authUsername || "") + ":" + (authPassword || "");
47515
+ } else if (authIsObject) {
46886
47516
  throw new AxiosError_default("Invalid proxy authorization", AxiosError_default.ERR_BAD_OPTION, { proxy });
46887
47517
  }
46888
- const base642 = Buffer.from(proxy.auth, "utf8").toString("base64");
46889
- options.headers["Proxy-Authorization"] = "Basic " + base642;
46890
47518
  }
46891
- options.headers.host = options.hostname + (options.port ? ":" + options.port : "");
46892
- const proxyHost = proxy.hostname || proxy.host;
46893
- options.hostname = proxyHost;
46894
- options.host = proxyHost;
46895
- options.port = proxy.port;
46896
- options.path = location;
46897
- if (proxy.protocol) {
46898
- options.protocol = proxy.protocol.includes(":") ? proxy.protocol : `${proxy.protocol}:`;
47519
+ const targetIsHttps = isHttps.test(options.protocol);
47520
+ if (targetIsHttps) {
47521
+ if (!(configHttpsAgent instanceof import_https_proxy_agent.default)) {
47522
+ const proxyHost = readProxyField("hostname") || readProxyField("host");
47523
+ const proxyPort = readProxyField("port");
47524
+ const rawProxyProtocol = readProxyField("protocol");
47525
+ const normalizedProtocol = rawProxyProtocol ? rawProxyProtocol.includes(":") ? rawProxyProtocol : `${rawProxyProtocol}:` : "http:";
47526
+ const proxyHostForURL = proxyHost && proxyHost.includes(":") && !proxyHost.startsWith("[") ? `[${proxyHost}]` : proxyHost;
47527
+ const proxyURL = new URL(
47528
+ `${normalizedProtocol}//${proxyHostForURL}${proxyPort ? ":" + proxyPort : ""}`
47529
+ );
47530
+ const agentOptions = {
47531
+ protocol: proxyURL.protocol,
47532
+ hostname: proxyURL.hostname.replace(/^\[|\]$/g, ""),
47533
+ port: proxyURL.port,
47534
+ auth: proxyAuth && typeof proxyAuth === "string" ? proxyAuth : void 0
47535
+ };
47536
+ if (proxyURL.protocol === "https:") {
47537
+ agentOptions.ALPNProtocols = ["http/1.1"];
47538
+ }
47539
+ const tunnelingAgent = getTunnelingAgent(agentOptions, configHttpsAgent);
47540
+ options.agent = tunnelingAgent;
47541
+ if (options.agents) {
47542
+ options.agents.https = tunnelingAgent;
47543
+ }
47544
+ }
47545
+ } else {
47546
+ if (proxyAuth) {
47547
+ const base642 = Buffer.from(proxyAuth, "utf8").toString("base64");
47548
+ options.headers["Proxy-Authorization"] = "Basic " + base642;
47549
+ }
47550
+ let hasUserHostHeader = false;
47551
+ for (const name of Object.keys(options.headers)) {
47552
+ if (name.toLowerCase() === "host") {
47553
+ hasUserHostHeader = true;
47554
+ break;
47555
+ }
47556
+ }
47557
+ if (!hasUserHostHeader) {
47558
+ options.headers.host = options.hostname + (options.port ? ":" + options.port : "");
47559
+ }
47560
+ const proxyHost = readProxyField("hostname") || readProxyField("host");
47561
+ options.hostname = proxyHost;
47562
+ options.host = proxyHost;
47563
+ options.port = readProxyField("port");
47564
+ options.path = location;
47565
+ const proxyProtocol = readProxyField("protocol");
47566
+ if (proxyProtocol) {
47567
+ options.protocol = proxyProtocol.includes(":") ? proxyProtocol : `${proxyProtocol}:`;
47568
+ }
46899
47569
  }
46900
47570
  }
46901
47571
  options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {
46902
- setProxy(redirectOptions, configProxy, redirectOptions.href);
47572
+ setProxy(redirectOptions, configProxy, redirectOptions.href, true, configHttpsAgent);
46903
47573
  };
46904
47574
  }
47575
+ var import_https_proxy_agent;
46905
47576
  var import_follow_redirects;
46906
47577
  var zlibOptions;
46907
47578
  var brotliOptions;
@@ -46909,9 +47580,14 @@ var isBrotliSupported;
46909
47580
  var httpFollow;
46910
47581
  var httpsFollow;
46911
47582
  var isHttps;
47583
+ var FORM_DATA_CONTENT_HEADERS;
46912
47584
  var kAxiosSocketListener;
46913
47585
  var kAxiosCurrentReq;
47586
+ var kAxiosInstalledTunnel;
47587
+ var tunnelingAgentCache;
47588
+ var tunnelingAgentCacheUser;
46914
47589
  var supportedProtocols;
47590
+ var decodeURIComponentSafe;
46915
47591
  var flushOnFinish;
46916
47592
  var Http2Sessions;
46917
47593
  var http2Sessions;
@@ -46922,12 +47598,13 @@ var buildAddressEntry;
46922
47598
  var http2Transport;
46923
47599
  var http_default;
46924
47600
  var init_http = __esm({
46925
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/adapters/http.js"() {
47601
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/adapters/http.js"() {
46926
47602
  init_utils7();
46927
47603
  init_settle();
46928
47604
  init_buildFullPath();
46929
47605
  init_buildURL();
46930
47606
  init_proxy_from_env();
47607
+ import_https_proxy_agent = __toESM(require_dist2());
46931
47608
  import_follow_redirects = __toESM(require_follow_redirects());
46932
47609
  init_data();
46933
47610
  init_transitional();
@@ -46942,6 +47619,7 @@ var init_http = __esm({
46942
47619
  init_ZlibHeaderTransformStream();
46943
47620
  init_callbackify();
46944
47621
  init_shouldBypassProxy();
47622
+ init_sanitizeHeaderValue();
46945
47623
  init_progressEventReducer();
46946
47624
  init_estimateDataURLDecodedBytes();
46947
47625
  zlibOptions = {
@@ -46955,11 +47633,25 @@ var init_http = __esm({
46955
47633
  isBrotliSupported = utils_default.isFunction(zlib.createBrotliDecompress);
46956
47634
  ({ http: httpFollow, https: httpsFollow } = import_follow_redirects.default);
46957
47635
  isHttps = /https:?/;
47636
+ FORM_DATA_CONTENT_HEADERS = ["content-type", "content-length"];
46958
47637
  kAxiosSocketListener = /* @__PURE__ */ Symbol("axios.http.socketListener");
46959
47638
  kAxiosCurrentReq = /* @__PURE__ */ Symbol("axios.http.currentReq");
47639
+ kAxiosInstalledTunnel = /* @__PURE__ */ Symbol("axios.http.installedTunnel");
47640
+ tunnelingAgentCache = /* @__PURE__ */ new Map();
47641
+ tunnelingAgentCacheUser = /* @__PURE__ */ new WeakMap();
46960
47642
  supportedProtocols = platform_default.protocols.map((protocol) => {
46961
47643
  return protocol + ":";
46962
47644
  });
47645
+ decodeURIComponentSafe = (value) => {
47646
+ if (!utils_default.isString(value)) {
47647
+ return value;
47648
+ }
47649
+ try {
47650
+ return decodeURIComponent(value);
47651
+ } catch (error2) {
47652
+ return value;
47653
+ }
47654
+ };
46963
47655
  flushOnFinish = (stream4, [throttled, flush]) => {
46964
47656
  stream4.on("end", flush).on("error", flush);
46965
47657
  return throttled;
@@ -47110,6 +47802,7 @@ var init_http = __esm({
47110
47802
  let isDone;
47111
47803
  let rejected = false;
47112
47804
  let req;
47805
+ let connectPhaseTimer;
47113
47806
  httpVersion = +httpVersion;
47114
47807
  if (Number.isNaN(httpVersion)) {
47115
47808
  throw TypeError(`Invalid protocol version: '${config3.httpVersion}' is not a number`);
@@ -47141,8 +47834,28 @@ var init_http = __esm({
47141
47834
  console.warn("emit error", err);
47142
47835
  }
47143
47836
  }
47837
+ function clearConnectPhaseTimer() {
47838
+ if (connectPhaseTimer) {
47839
+ clearTimeout(connectPhaseTimer);
47840
+ connectPhaseTimer = null;
47841
+ }
47842
+ }
47843
+ function createTimeoutError() {
47844
+ let timeoutErrorMessage = config3.timeout ? "timeout of " + config3.timeout + "ms exceeded" : "timeout exceeded";
47845
+ const transitional2 = config3.transitional || transitional_default;
47846
+ if (config3.timeoutErrorMessage) {
47847
+ timeoutErrorMessage = config3.timeoutErrorMessage;
47848
+ }
47849
+ return new AxiosError_default(
47850
+ timeoutErrorMessage,
47851
+ transitional2.clarifyTimeoutError ? AxiosError_default.ETIMEDOUT : AxiosError_default.ECONNABORTED,
47852
+ config3,
47853
+ req
47854
+ );
47855
+ }
47144
47856
  abortEmitter.once("abort", reject);
47145
47857
  const onFinished = () => {
47858
+ clearConnectPhaseTimer();
47146
47859
  if (config3.cancelToken) {
47147
47860
  config3.cancelToken.unsubscribe(abort);
47148
47861
  }
@@ -47159,6 +47872,7 @@ var init_http = __esm({
47159
47872
  }
47160
47873
  onDone((response, isRejected) => {
47161
47874
  isDone = true;
47875
+ clearConnectPhaseTimer();
47162
47876
  if (isRejected) {
47163
47877
  rejected = true;
47164
47878
  onFinished();
@@ -47247,7 +47961,7 @@ var init_http = __esm({
47247
47961
  }
47248
47962
  );
47249
47963
  } else if (utils_default.isFormData(data) && utils_default.isFunction(data.getHeaders) && data.getHeaders !== Object.prototype.getHeaders) {
47250
- headers.set(data.getHeaders());
47964
+ setFormDataHeaders(headers, data.getHeaders(), own2("formDataHeaderPolicy"));
47251
47965
  if (!headers.hasContentLength()) {
47252
47966
  try {
47253
47967
  const knownLength = await util3.promisify(data.getLength).call(data);
@@ -47324,8 +48038,8 @@ var init_http = __esm({
47324
48038
  auth = username + ":" + password;
47325
48039
  }
47326
48040
  if (!auth && parsed.username) {
47327
- const urlUsername = parsed.username;
47328
- const urlPassword = parsed.password;
48041
+ const urlUsername = decodeURIComponentSafe(parsed.username);
48042
+ const urlPassword = decodeURIComponentSafe(parsed.password);
47329
48043
  auth = urlUsername + ":" + urlPassword;
47330
48044
  }
47331
48045
  auth && headers.delete("authorization");
@@ -47351,7 +48065,7 @@ var init_http = __esm({
47351
48065
  const options = Object.assign(/* @__PURE__ */ Object.create(null), {
47352
48066
  path,
47353
48067
  method,
47354
- headers: headers.toJSON(),
48068
+ headers: toByteStringHeaderObject(headers),
47355
48069
  agents: { http: config3.httpAgent, https: config3.httpsAgent },
47356
48070
  auth,
47357
48071
  protocol,
@@ -47363,11 +48077,9 @@ var init_http = __esm({
47363
48077
  !utils_default.isUndefined(lookup) && (options.lookup = lookup);
47364
48078
  if (config3.socketPath) {
47365
48079
  if (typeof config3.socketPath !== "string") {
47366
- return reject(new AxiosError_default(
47367
- "socketPath must be a string",
47368
- AxiosError_default.ERR_BAD_OPTION_VALUE,
47369
- config3
47370
- ));
48080
+ return reject(
48081
+ new AxiosError_default("socketPath must be a string", AxiosError_default.ERR_BAD_OPTION_VALUE, config3)
48082
+ );
47371
48083
  }
47372
48084
  if (config3.allowedSocketPaths != null) {
47373
48085
  const allowed = Array.isArray(config3.allowedSocketPaths) ? config3.allowedSocketPaths : [config3.allowedSocketPaths];
@@ -47376,11 +48088,13 @@ var init_http = __esm({
47376
48088
  (entry) => typeof entry === "string" && resolve(entry) === resolvedSocket
47377
48089
  );
47378
48090
  if (!isAllowed) {
47379
- return reject(new AxiosError_default(
47380
- `socketPath "${config3.socketPath}" is not permitted by allowedSocketPaths`,
47381
- AxiosError_default.ERR_BAD_OPTION_VALUE,
47382
- config3
47383
- ));
48091
+ return reject(
48092
+ new AxiosError_default(
48093
+ `socketPath "${config3.socketPath}" is not permitted by allowedSocketPaths`,
48094
+ AxiosError_default.ERR_BAD_OPTION_VALUE,
48095
+ config3
48096
+ )
48097
+ );
47384
48098
  }
47385
48099
  }
47386
48100
  options.socketPath = config3.socketPath;
@@ -47390,12 +48104,17 @@ var init_http = __esm({
47390
48104
  setProxy(
47391
48105
  options,
47392
48106
  config3.proxy,
47393
- protocol + "//" + parsed.hostname + (parsed.port ? ":" + parsed.port : "") + options.path
48107
+ protocol + "//" + parsed.hostname + (parsed.port ? ":" + parsed.port : "") + options.path,
48108
+ false,
48109
+ config3.httpsAgent
47394
48110
  );
47395
48111
  }
47396
48112
  let transport;
48113
+ let isNativeTransport = false;
47397
48114
  const isHttpsRequest = isHttps.test(options.protocol);
47398
- options.agent = isHttpsRequest ? config3.httpsAgent : config3.httpAgent;
48115
+ if (options.agent == null) {
48116
+ options.agent = isHttpsRequest ? config3.httpsAgent : config3.httpAgent;
48117
+ }
47399
48118
  if (isHttp2) {
47400
48119
  transport = http2Transport;
47401
48120
  } else {
@@ -47404,6 +48123,7 @@ var init_http = __esm({
47404
48123
  transport = configTransport;
47405
48124
  } else if (config3.maxRedirects === 0) {
47406
48125
  transport = isHttpsRequest ? https : http3;
48126
+ isNativeTransport = true;
47407
48127
  } else {
47408
48128
  if (config3.maxRedirects) {
47409
48129
  options.maxRedirects = config3.maxRedirects;
@@ -47422,6 +48142,7 @@ var init_http = __esm({
47422
48142
  }
47423
48143
  options.insecureHTTPParser = Boolean(own2("insecureHTTPParser"));
47424
48144
  req = transport.request(options, function handleResponse(res) {
48145
+ clearConnectPhaseTimer();
47425
48146
  if (req.destroyed) return;
47426
48147
  const streams = [res];
47427
48148
  const responseLength = utils_default.toFiniteNumber(res.headers["content-length"]);
@@ -47528,14 +48249,15 @@ var init_http = __esm({
47528
48249
  "stream has been aborted",
47529
48250
  AxiosError_default.ERR_BAD_RESPONSE,
47530
48251
  config3,
47531
- lastRequest
48252
+ lastRequest,
48253
+ response
47532
48254
  );
47533
48255
  responseStream.destroy(err);
47534
48256
  reject(err);
47535
48257
  });
47536
48258
  responseStream.on("error", function handleStreamError(err) {
47537
- if (req.destroyed) return;
47538
- reject(AxiosError_default.from(err, null, config3, lastRequest));
48259
+ if (rejected) return;
48260
+ reject(AxiosError_default.from(err, null, config3, lastRequest, response));
47539
48261
  });
47540
48262
  responseStream.on("end", function handleStreamEnd() {
47541
48263
  try {
@@ -47570,6 +48292,7 @@ var init_http = __esm({
47570
48292
  req.on("error", function handleRequestError(err) {
47571
48293
  reject(AxiosError_default.from(err, null, config3, req));
47572
48294
  });
48295
+ const boundSockets = /* @__PURE__ */ new Set();
47573
48296
  req.on("socket", function handleRequestSocket(socket) {
47574
48297
  socket.setKeepAlive(true, 1e3 * 60);
47575
48298
  if (!socket[kAxiosSocketListener]) {
@@ -47582,11 +48305,16 @@ var init_http = __esm({
47582
48305
  socket[kAxiosSocketListener] = true;
47583
48306
  }
47584
48307
  socket[kAxiosCurrentReq] = req;
47585
- req.once("close", function clearCurrentReq() {
48308
+ boundSockets.add(socket);
48309
+ });
48310
+ req.once("close", function clearCurrentReq() {
48311
+ clearConnectPhaseTimer();
48312
+ for (const socket of boundSockets) {
47586
48313
  if (socket[kAxiosCurrentReq] === req) {
47587
48314
  socket[kAxiosCurrentReq] = null;
47588
48315
  }
47589
- });
48316
+ }
48317
+ boundSockets.clear();
47590
48318
  });
47591
48319
  if (config3.timeout) {
47592
48320
  const timeout = parseInt(config3.timeout, 10);
@@ -47601,22 +48329,14 @@ var init_http = __esm({
47601
48329
  );
47602
48330
  return;
47603
48331
  }
47604
- req.setTimeout(timeout, function handleRequestTimeout() {
48332
+ const handleTimeout = function handleTimeout2() {
47605
48333
  if (isDone) return;
47606
- let timeoutErrorMessage = config3.timeout ? "timeout of " + config3.timeout + "ms exceeded" : "timeout exceeded";
47607
- const transitional2 = config3.transitional || transitional_default;
47608
- if (config3.timeoutErrorMessage) {
47609
- timeoutErrorMessage = config3.timeoutErrorMessage;
47610
- }
47611
- abort(
47612
- new AxiosError_default(
47613
- timeoutErrorMessage,
47614
- transitional2.clarifyTimeoutError ? AxiosError_default.ETIMEDOUT : AxiosError_default.ECONNABORTED,
47615
- config3,
47616
- req
47617
- )
47618
- );
47619
- });
48334
+ abort(createTimeoutError());
48335
+ };
48336
+ if (isNativeTransport && timeout > 0) {
48337
+ connectPhaseTimer = setTimeout(handleTimeout, timeout);
48338
+ }
48339
+ req.setTimeout(timeout, handleTimeout);
47620
48340
  } else {
47621
48341
  req.setTimeout(0);
47622
48342
  }
@@ -47676,7 +48396,7 @@ var init_http = __esm({
47676
48396
  });
47677
48397
  var isURLSameOrigin_default;
47678
48398
  var init_isURLSameOrigin = __esm({
47679
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/isURLSameOrigin.js"() {
48399
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/isURLSameOrigin.js"() {
47680
48400
  init_platform();
47681
48401
  isURLSameOrigin_default = platform_default.hasStandardBrowserEnv ? /* @__PURE__ */ ((origin2, isMSIE) => (url2) => {
47682
48402
  url2 = new URL(url2, platform_default.origin);
@@ -47689,7 +48409,7 @@ var init_isURLSameOrigin = __esm({
47689
48409
  });
47690
48410
  var cookies_default;
47691
48411
  var init_cookies = __esm({
47692
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/cookies.js"() {
48412
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/cookies.js"() {
47693
48413
  init_utils7();
47694
48414
  init_platform();
47695
48415
  cookies_default = platform_default.hasStandardBrowserEnv ? (
@@ -47717,8 +48437,15 @@ var init_cookies = __esm({
47717
48437
  },
47718
48438
  read(name) {
47719
48439
  if (typeof document === "undefined") return null;
47720
- const match = document.cookie.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
47721
- return match ? decodeURIComponent(match[1]) : null;
48440
+ const cookies = document.cookie.split(";");
48441
+ for (let i = 0; i < cookies.length; i++) {
48442
+ const cookie = cookies[i].replace(/^\s+/, "");
48443
+ const eq = cookie.indexOf("=");
48444
+ if (eq !== -1 && cookie.slice(0, eq) === name) {
48445
+ return decodeURIComponent(cookie.slice(eq + 1));
48446
+ }
48447
+ }
48448
+ return null;
47722
48449
  },
47723
48450
  remove(name) {
47724
48451
  this.write(name, "", Date.now() - 864e5, "/");
@@ -47742,6 +48469,9 @@ function mergeConfig(config1, config22) {
47742
48469
  config22 = config22 || {};
47743
48470
  const config3 = /* @__PURE__ */ Object.create(null);
47744
48471
  Object.defineProperty(config3, "hasOwnProperty", {
48472
+ // Null-proto descriptor so a polluted Object.prototype.get cannot turn
48473
+ // this data descriptor into an accessor descriptor on the way in.
48474
+ __proto__: null,
47745
48475
  value: Object.prototype.hasOwnProperty,
47746
48476
  enumerable: false,
47747
48477
  writable: true,
@@ -47827,15 +48557,28 @@ function mergeConfig(config1, config22) {
47827
48557
  }
47828
48558
  var headersToObject;
47829
48559
  var init_mergeConfig = __esm({
47830
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/mergeConfig.js"() {
48560
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/mergeConfig.js"() {
47831
48561
  init_utils7();
47832
48562
  init_AxiosHeaders();
47833
48563
  headersToObject = (thing) => thing instanceof AxiosHeaders_default ? { ...thing } : thing;
47834
48564
  }
47835
48565
  });
48566
+ function setFormDataHeaders2(headers, formHeaders, policy) {
48567
+ if (policy !== "content-only") {
48568
+ headers.set(formHeaders);
48569
+ return;
48570
+ }
48571
+ Object.entries(formHeaders).forEach(([key, val]) => {
48572
+ if (FORM_DATA_CONTENT_HEADERS2.includes(key.toLowerCase())) {
48573
+ headers.set(key, val);
48574
+ }
48575
+ });
48576
+ }
48577
+ var FORM_DATA_CONTENT_HEADERS2;
48578
+ var encodeUTF8;
47836
48579
  var resolveConfig_default;
47837
48580
  var init_resolveConfig = __esm({
47838
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/resolveConfig.js"() {
48581
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/resolveConfig.js"() {
47839
48582
  init_platform();
47840
48583
  init_utils7();
47841
48584
  init_isURLSameOrigin();
@@ -47844,6 +48587,11 @@ var init_resolveConfig = __esm({
47844
48587
  init_mergeConfig();
47845
48588
  init_AxiosHeaders();
47846
48589
  init_buildURL();
48590
+ FORM_DATA_CONTENT_HEADERS2 = ["content-type", "content-length"];
48591
+ encodeUTF8 = (str) => encodeURIComponent(str).replace(
48592
+ /%([0-9A-F]{2})/gi,
48593
+ (_, hex) => String.fromCharCode(parseInt(hex, 16))
48594
+ );
47847
48595
  resolveConfig_default = (config3) => {
47848
48596
  const newConfig = mergeConfig({}, config3);
47849
48597
  const own2 = (key) => utils_default.hasOwnProp(newConfig, key) ? newConfig[key] : void 0;
@@ -47865,22 +48613,14 @@ var init_resolveConfig = __esm({
47865
48613
  if (auth) {
47866
48614
  headers.set(
47867
48615
  "Authorization",
47868
- "Basic " + btoa(
47869
- (auth.username || "") + ":" + (auth.password ? unescape(encodeURIComponent(auth.password)) : "")
47870
- )
48616
+ "Basic " + btoa((auth.username || "") + ":" + (auth.password ? encodeUTF8(auth.password) : ""))
47871
48617
  );
47872
48618
  }
47873
48619
  if (utils_default.isFormData(data)) {
47874
48620
  if (platform_default.hasStandardBrowserEnv || platform_default.hasStandardBrowserWebWorkerEnv) {
47875
48621
  headers.setContentType(void 0);
47876
48622
  } else if (utils_default.isFunction(data.getHeaders)) {
47877
- const formHeaders = data.getHeaders();
47878
- const allowedHeaders = ["content-type", "content-length"];
47879
- Object.entries(formHeaders).forEach(([key, val]) => {
47880
- if (allowedHeaders.includes(key.toLowerCase())) {
47881
- headers.set(key, val);
47882
- }
47883
- });
48623
+ setFormDataHeaders2(headers, data.getHeaders(), own2("formDataHeaderPolicy"));
47884
48624
  }
47885
48625
  }
47886
48626
  if (platform_default.hasStandardBrowserEnv) {
@@ -47902,7 +48642,7 @@ var init_resolveConfig = __esm({
47902
48642
  var isXHRAdapterSupported;
47903
48643
  var xhr_default;
47904
48644
  var init_xhr = __esm({
47905
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/adapters/xhr.js"() {
48645
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/adapters/xhr.js"() {
47906
48646
  init_utils7();
47907
48647
  init_settle();
47908
48648
  init_transitional();
@@ -47913,6 +48653,7 @@ var init_xhr = __esm({
47913
48653
  init_AxiosHeaders();
47914
48654
  init_progressEventReducer();
47915
48655
  init_resolveConfig();
48656
+ init_sanitizeHeaderValue();
47916
48657
  isXHRAdapterSupported = typeof XMLHttpRequest !== "undefined";
47917
48658
  xhr_default = isXHRAdapterSupported && function(config3) {
47918
48659
  return new Promise(function dispatchXhrRequest(resolve2, reject) {
@@ -47968,7 +48709,7 @@ var init_xhr = __esm({
47968
48709
  if (!request || request.readyState !== 4) {
47969
48710
  return;
47970
48711
  }
47971
- if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf("file:") === 0)) {
48712
+ if (request.status === 0 && !(request.responseURL && request.responseURL.startsWith("file:"))) {
47972
48713
  return;
47973
48714
  }
47974
48715
  setTimeout(onloadend);
@@ -47979,6 +48720,7 @@ var init_xhr = __esm({
47979
48720
  return;
47980
48721
  }
47981
48722
  reject(new AxiosError_default("Request aborted", AxiosError_default.ECONNABORTED, config3, request));
48723
+ done();
47982
48724
  request = null;
47983
48725
  };
47984
48726
  request.onerror = function handleError(event) {
@@ -47986,6 +48728,7 @@ var init_xhr = __esm({
47986
48728
  const err = new AxiosError_default(msg, AxiosError_default.ERR_NETWORK, config3, request);
47987
48729
  err.event = event || null;
47988
48730
  reject(err);
48731
+ done();
47989
48732
  request = null;
47990
48733
  };
47991
48734
  request.ontimeout = function handleTimeout() {
@@ -48002,11 +48745,12 @@ var init_xhr = __esm({
48002
48745
  request
48003
48746
  )
48004
48747
  );
48748
+ done();
48005
48749
  request = null;
48006
48750
  };
48007
48751
  requestData === void 0 && requestHeaders.setContentType(null);
48008
48752
  if ("setRequestHeader" in request) {
48009
- utils_default.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
48753
+ utils_default.forEach(toByteStringHeaderObject(requestHeaders), function setRequestHeader(val, key) {
48010
48754
  request.setRequestHeader(key, val);
48011
48755
  });
48012
48756
  }
@@ -48032,6 +48776,7 @@ var init_xhr = __esm({
48032
48776
  }
48033
48777
  reject(!cancel || cancel.type ? new CanceledError_default(null, config3, request) : cancel);
48034
48778
  request.abort();
48779
+ done();
48035
48780
  request = null;
48036
48781
  };
48037
48782
  _config.cancelToken && _config.cancelToken.subscribe(onCanceled);
@@ -48040,7 +48785,7 @@ var init_xhr = __esm({
48040
48785
  }
48041
48786
  }
48042
48787
  const protocol = parseProtocol(_config.url);
48043
- if (protocol && platform_default.protocols.indexOf(protocol) === -1) {
48788
+ if (protocol && !platform_default.protocols.includes(protocol)) {
48044
48789
  reject(
48045
48790
  new AxiosError_default(
48046
48791
  "Unsupported protocol " + protocol + ":",
@@ -48058,44 +48803,46 @@ var init_xhr = __esm({
48058
48803
  var composeSignals;
48059
48804
  var composeSignals_default;
48060
48805
  var init_composeSignals = __esm({
48061
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/composeSignals.js"() {
48806
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/composeSignals.js"() {
48062
48807
  init_CanceledError();
48063
48808
  init_AxiosError();
48064
48809
  init_utils7();
48065
48810
  composeSignals = (signals, timeout) => {
48066
- const { length } = signals = signals ? signals.filter(Boolean) : [];
48067
- if (timeout || length) {
48068
- let controller = new AbortController();
48069
- let aborted2;
48070
- const onabort = function(reason) {
48071
- if (!aborted2) {
48072
- aborted2 = true;
48073
- unsubscribe();
48074
- const err = reason instanceof Error ? reason : this.reason;
48075
- controller.abort(
48076
- err instanceof AxiosError_default ? err : new CanceledError_default(err instanceof Error ? err.message : err)
48077
- );
48078
- }
48079
- };
48080
- let timer = timeout && setTimeout(() => {
48081
- timer = null;
48082
- onabort(new AxiosError_default(`timeout of ${timeout}ms exceeded`, AxiosError_default.ETIMEDOUT));
48083
- }, timeout);
48084
- const unsubscribe = () => {
48085
- if (signals) {
48086
- timer && clearTimeout(timer);
48087
- timer = null;
48088
- signals.forEach((signal2) => {
48089
- signal2.unsubscribe ? signal2.unsubscribe(onabort) : signal2.removeEventListener("abort", onabort);
48090
- });
48091
- signals = null;
48092
- }
48093
- };
48094
- signals.forEach((signal2) => signal2.addEventListener("abort", onabort));
48095
- const { signal } = controller;
48096
- signal.unsubscribe = () => utils_default.asap(unsubscribe);
48097
- return signal;
48811
+ signals = signals ? signals.filter(Boolean) : [];
48812
+ if (!timeout && !signals.length) {
48813
+ return;
48098
48814
  }
48815
+ const controller = new AbortController();
48816
+ let aborted2 = false;
48817
+ const onabort = function(reason) {
48818
+ if (!aborted2) {
48819
+ aborted2 = true;
48820
+ unsubscribe();
48821
+ const err = reason instanceof Error ? reason : this.reason;
48822
+ controller.abort(
48823
+ err instanceof AxiosError_default ? err : new CanceledError_default(err instanceof Error ? err.message : err)
48824
+ );
48825
+ }
48826
+ };
48827
+ let timer = timeout && setTimeout(() => {
48828
+ timer = null;
48829
+ onabort(new AxiosError_default(`timeout of ${timeout}ms exceeded`, AxiosError_default.ETIMEDOUT));
48830
+ }, timeout);
48831
+ const unsubscribe = () => {
48832
+ if (!signals) {
48833
+ return;
48834
+ }
48835
+ timer && clearTimeout(timer);
48836
+ timer = null;
48837
+ signals.forEach((signal2) => {
48838
+ signal2.unsubscribe ? signal2.unsubscribe(onabort) : signal2.removeEventListener("abort", onabort);
48839
+ });
48840
+ signals = null;
48841
+ };
48842
+ signals.forEach((signal2) => signal2.addEventListener("abort", onabort));
48843
+ const { signal } = controller;
48844
+ signal.unsubscribe = () => utils_default.asap(unsubscribe);
48845
+ return signal;
48099
48846
  };
48100
48847
  composeSignals_default = composeSignals;
48101
48848
  }
@@ -48105,7 +48852,7 @@ var readBytes;
48105
48852
  var readStream;
48106
48853
  var trackStream;
48107
48854
  var init_trackStream = __esm({
48108
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/trackStream.js"() {
48855
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/trackStream.js"() {
48109
48856
  streamChunk = function* (chunk2, chunkSize) {
48110
48857
  let len = chunk2.byteLength;
48111
48858
  if (!chunkSize || len < chunkSize) {
@@ -48188,15 +48935,12 @@ var init_trackStream = __esm({
48188
48935
  });
48189
48936
  var DEFAULT_CHUNK_SIZE;
48190
48937
  var isFunction2;
48191
- var globalFetchAPI;
48192
- var ReadableStream2;
48193
- var TextEncoder2;
48194
48938
  var test;
48195
48939
  var factory;
48196
48940
  var seedCache;
48197
48941
  var getFetch;
48198
48942
  var init_fetch = __esm({
48199
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/adapters/fetch.js"() {
48943
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/adapters/fetch.js"() {
48200
48944
  init_platform();
48201
48945
  init_utils7();
48202
48946
  init_AxiosError();
@@ -48206,13 +48950,11 @@ var init_fetch = __esm({
48206
48950
  init_progressEventReducer();
48207
48951
  init_resolveConfig();
48208
48952
  init_settle();
48953
+ init_estimateDataURLDecodedBytes();
48954
+ init_data();
48955
+ init_sanitizeHeaderValue();
48209
48956
  DEFAULT_CHUNK_SIZE = 64 * 1024;
48210
48957
  ({ isFunction: isFunction2 } = utils_default);
48211
- globalFetchAPI = (({ Request: Request2, Response: Response2 }) => ({
48212
- Request: Request2,
48213
- Response: Response2
48214
- }))(utils_default.global);
48215
- ({ ReadableStream: ReadableStream2, TextEncoder: TextEncoder2 } = utils_default.global);
48216
48958
  test = (fn, ...args) => {
48217
48959
  try {
48218
48960
  return !!fn(...args);
@@ -48221,11 +48963,16 @@ var init_fetch = __esm({
48221
48963
  }
48222
48964
  };
48223
48965
  factory = (env) => {
48966
+ const globalObject = utils_default.global !== void 0 && utils_default.global !== null ? utils_default.global : globalThis;
48967
+ const { ReadableStream: ReadableStream2, TextEncoder: TextEncoder2 } = globalObject;
48224
48968
  env = utils_default.merge.call(
48225
48969
  {
48226
48970
  skipUndefined: true
48227
48971
  },
48228
- globalFetchAPI,
48972
+ {
48973
+ Request: globalObject.Request,
48974
+ Response: globalObject.Response
48975
+ },
48229
48976
  env
48230
48977
  );
48231
48978
  const { fetch: envFetch, Request: Request2, Response: Response2 } = env;
@@ -48313,8 +49060,12 @@ var init_fetch = __esm({
48313
49060
  responseType,
48314
49061
  headers,
48315
49062
  withCredentials = "same-origin",
48316
- fetchOptions
49063
+ fetchOptions,
49064
+ maxContentLength,
49065
+ maxBodyLength
48317
49066
  } = resolveConfig_default(config3);
49067
+ const hasMaxContentLength = utils_default.isNumber(maxContentLength) && maxContentLength > -1;
49068
+ const hasMaxBodyLength = utils_default.isNumber(maxBodyLength) && maxBodyLength > -1;
48318
49069
  let _fetch2 = envFetch || fetch;
48319
49070
  responseType = responseType ? (responseType + "").toLowerCase() : "text";
48320
49071
  let composedSignal = composeSignals_default(
@@ -48327,6 +49078,28 @@ var init_fetch = __esm({
48327
49078
  });
48328
49079
  let requestContentLength;
48329
49080
  try {
49081
+ if (hasMaxContentLength && typeof url2 === "string" && url2.startsWith("data:")) {
49082
+ const estimated = estimateDataURLDecodedBytes(url2);
49083
+ if (estimated > maxContentLength) {
49084
+ throw new AxiosError_default(
49085
+ "maxContentLength size of " + maxContentLength + " exceeded",
49086
+ AxiosError_default.ERR_BAD_RESPONSE,
49087
+ config3,
49088
+ request
49089
+ );
49090
+ }
49091
+ }
49092
+ if (hasMaxBodyLength && method !== "get" && method !== "head") {
49093
+ const outboundLength = await resolveBodyLength(headers, data);
49094
+ if (typeof outboundLength === "number" && isFinite(outboundLength) && outboundLength > maxBodyLength) {
49095
+ throw new AxiosError_default(
49096
+ "Request body larger than maxBodyLength limit",
49097
+ AxiosError_default.ERR_BAD_REQUEST,
49098
+ config3,
49099
+ request
49100
+ );
49101
+ }
49102
+ }
48330
49103
  if (onUploadProgress && supportsRequestStream && method !== "get" && method !== "head" && (requestContentLength = await resolveBodyLength(headers, data)) !== 0) {
48331
49104
  let _request = new Request2(url2, {
48332
49105
  method: "POST",
@@ -48355,19 +49128,31 @@ var init_fetch = __esm({
48355
49128
  headers.delete("content-type");
48356
49129
  }
48357
49130
  }
49131
+ headers.set("User-Agent", "axios/" + VERSION, false);
48358
49132
  const resolvedOptions = {
48359
49133
  ...fetchOptions,
48360
49134
  signal: composedSignal,
48361
49135
  method: method.toUpperCase(),
48362
- headers: headers.normalize().toJSON(),
49136
+ headers: toByteStringHeaderObject(headers.normalize()),
48363
49137
  body: data,
48364
49138
  duplex: "half",
48365
49139
  credentials: isCredentialsSupported ? withCredentials : void 0
48366
49140
  };
48367
49141
  request = isRequestSupported && new Request2(url2, resolvedOptions);
48368
49142
  let response = await (isRequestSupported ? _fetch2(request, fetchOptions) : _fetch2(url2, resolvedOptions));
49143
+ if (hasMaxContentLength) {
49144
+ const declaredLength = utils_default.toFiniteNumber(response.headers.get("content-length"));
49145
+ if (declaredLength != null && declaredLength > maxContentLength) {
49146
+ throw new AxiosError_default(
49147
+ "maxContentLength size of " + maxContentLength + " exceeded",
49148
+ AxiosError_default.ERR_BAD_RESPONSE,
49149
+ config3,
49150
+ request
49151
+ );
49152
+ }
49153
+ }
48369
49154
  const isStreamResponse = supportsResponseStream && (responseType === "stream" || responseType === "response");
48370
- if (supportsResponseStream && (onDownloadProgress || isStreamResponse && unsubscribe)) {
49155
+ if (supportsResponseStream && response.body && (onDownloadProgress || hasMaxContentLength || isStreamResponse && unsubscribe)) {
48371
49156
  const options = {};
48372
49157
  ["status", "statusText", "headers"].forEach((prop) => {
48373
49158
  options[prop] = response[prop];
@@ -48377,8 +49162,23 @@ var init_fetch = __esm({
48377
49162
  responseContentLength,
48378
49163
  progressEventReducer(asyncDecorator(onDownloadProgress), true)
48379
49164
  ) || [];
49165
+ let bytesRead = 0;
49166
+ const onChunkProgress = (loadedBytes) => {
49167
+ if (hasMaxContentLength) {
49168
+ bytesRead = loadedBytes;
49169
+ if (bytesRead > maxContentLength) {
49170
+ throw new AxiosError_default(
49171
+ "maxContentLength size of " + maxContentLength + " exceeded",
49172
+ AxiosError_default.ERR_BAD_RESPONSE,
49173
+ config3,
49174
+ request
49175
+ );
49176
+ }
49177
+ }
49178
+ onProgress && onProgress(loadedBytes);
49179
+ };
48380
49180
  response = new Response2(
48381
- trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
49181
+ trackStream(response.body, DEFAULT_CHUNK_SIZE, onChunkProgress, () => {
48382
49182
  flush && flush();
48383
49183
  unsubscribe && unsubscribe();
48384
49184
  }),
@@ -48390,6 +49190,26 @@ var init_fetch = __esm({
48390
49190
  response,
48391
49191
  config3
48392
49192
  );
49193
+ if (hasMaxContentLength && !supportsResponseStream && !isStreamResponse) {
49194
+ let materializedSize;
49195
+ if (responseData != null) {
49196
+ if (typeof responseData.byteLength === "number") {
49197
+ materializedSize = responseData.byteLength;
49198
+ } else if (typeof responseData.size === "number") {
49199
+ materializedSize = responseData.size;
49200
+ } else if (typeof responseData === "string") {
49201
+ materializedSize = typeof TextEncoder2 === "function" ? new TextEncoder2().encode(responseData).byteLength : responseData.length;
49202
+ }
49203
+ }
49204
+ if (typeof materializedSize === "number" && materializedSize > maxContentLength) {
49205
+ throw new AxiosError_default(
49206
+ "maxContentLength size of " + maxContentLength + " exceeded",
49207
+ AxiosError_default.ERR_BAD_RESPONSE,
49208
+ config3,
49209
+ request
49210
+ );
49211
+ }
49212
+ }
48393
49213
  !isStreamResponse && unsubscribe && unsubscribe();
48394
49214
  return await new Promise((resolve2, reject) => {
48395
49215
  settle(resolve2, reject, {
@@ -48403,6 +49223,13 @@ var init_fetch = __esm({
48403
49223
  });
48404
49224
  } catch (err) {
48405
49225
  unsubscribe && unsubscribe();
49226
+ if (composedSignal && composedSignal.aborted && composedSignal.reason instanceof AxiosError_default) {
49227
+ const canceledError = composedSignal.reason;
49228
+ canceledError.config = config3;
49229
+ request && (canceledError.request = request);
49230
+ err !== canceledError && (canceledError.cause = err);
49231
+ throw canceledError;
49232
+ }
48406
49233
  if (err && err.name === "TypeError" && /Load failed|fetch/i.test(err.message)) {
48407
49234
  throw Object.assign(
48408
49235
  new AxiosError_default(
@@ -48476,7 +49303,7 @@ var renderReason;
48476
49303
  var isResolvedHandle;
48477
49304
  var adapters_default;
48478
49305
  var init_adapters = __esm({
48479
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/adapters/adapters.js"() {
49306
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/adapters/adapters.js"() {
48480
49307
  init_utils7();
48481
49308
  init_http();
48482
49309
  init_xhr();
@@ -48492,10 +49319,10 @@ var init_adapters = __esm({
48492
49319
  utils_default.forEach(knownAdapters, (fn, value) => {
48493
49320
  if (fn) {
48494
49321
  try {
48495
- Object.defineProperty(fn, "name", { value });
49322
+ Object.defineProperty(fn, "name", { __proto__: null, value });
48496
49323
  } catch (e) {
48497
49324
  }
48498
- Object.defineProperty(fn, "adapterName", { value });
49325
+ Object.defineProperty(fn, "adapterName", { __proto__: null, value });
48499
49326
  }
48500
49327
  });
48501
49328
  renderReason = (reason) => `- ${reason}`;
@@ -48533,7 +49360,12 @@ function dispatchRequest(config3) {
48533
49360
  return adapter2(config3).then(
48534
49361
  function onAdapterResolution(response) {
48535
49362
  throwIfCancellationRequested(config3);
48536
- response.data = transformData.call(config3, config3.transformResponse, response);
49363
+ config3.response = response;
49364
+ try {
49365
+ response.data = transformData.call(config3, config3.transformResponse, response);
49366
+ } finally {
49367
+ delete config3.response;
49368
+ }
48537
49369
  response.headers = AxiosHeaders_default.from(response.headers);
48538
49370
  return response;
48539
49371
  },
@@ -48541,11 +49373,16 @@ function dispatchRequest(config3) {
48541
49373
  if (!isCancel(reason)) {
48542
49374
  throwIfCancellationRequested(config3);
48543
49375
  if (reason && reason.response) {
48544
- reason.response.data = transformData.call(
48545
- config3,
48546
- config3.transformResponse,
48547
- reason.response
48548
- );
49376
+ config3.response = reason.response;
49377
+ try {
49378
+ reason.response.data = transformData.call(
49379
+ config3,
49380
+ config3.transformResponse,
49381
+ reason.response
49382
+ );
49383
+ } finally {
49384
+ delete config3.response;
49385
+ }
48549
49386
  reason.response.headers = AxiosHeaders_default.from(reason.response.headers);
48550
49387
  }
48551
49388
  }
@@ -48554,7 +49391,7 @@ function dispatchRequest(config3) {
48554
49391
  );
48555
49392
  }
48556
49393
  var init_dispatchRequest = __esm({
48557
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/dispatchRequest.js"() {
49394
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/dispatchRequest.js"() {
48558
49395
  init_transformData();
48559
49396
  init_isCancel();
48560
49397
  init_defaults();
@@ -48592,7 +49429,7 @@ var validators;
48592
49429
  var deprecatedWarnings;
48593
49430
  var validator_default;
48594
49431
  var init_validator = __esm({
48595
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/validator.js"() {
49432
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/validator.js"() {
48596
49433
  init_data();
48597
49434
  init_AxiosError();
48598
49435
  validators = {};
@@ -48641,7 +49478,7 @@ var validators2;
48641
49478
  var Axios;
48642
49479
  var Axios_default;
48643
49480
  var init_Axios = __esm({
48644
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/core/Axios.js"() {
49481
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/core/Axios.js"() {
48645
49482
  init_utils7();
48646
49483
  init_buildURL();
48647
49484
  init_InterceptorManager();
@@ -48752,7 +49589,7 @@ var init_Axios = __esm({
48752
49589
  );
48753
49590
  config3.method = (config3.method || this.defaults.method || "get").toLowerCase();
48754
49591
  let contextHeaders = headers && utils_default.merge(headers.common, headers[config3.method]);
48755
- headers && utils_default.forEach(["delete", "get", "head", "post", "put", "patch", "common"], (method) => {
49592
+ headers && utils_default.forEach(["delete", "get", "head", "post", "put", "patch", "query", "common"], (method) => {
48756
49593
  delete headers[method];
48757
49594
  });
48758
49595
  config3.headers = AxiosHeaders_default.concat(contextHeaders, headers);
@@ -48830,7 +49667,7 @@ var init_Axios = __esm({
48830
49667
  );
48831
49668
  };
48832
49669
  });
48833
- utils_default.forEach(["post", "put", "patch"], function forEachMethodWithData(method) {
49670
+ utils_default.forEach(["post", "put", "patch", "query"], function forEachMethodWithData(method) {
48834
49671
  function generateHTTPMethod(isForm) {
48835
49672
  return function httpMethod(url2, data, config3) {
48836
49673
  return this.request(
@@ -48846,7 +49683,9 @@ var init_Axios = __esm({
48846
49683
  };
48847
49684
  }
48848
49685
  Axios.prototype[method] = generateHTTPMethod();
48849
- Axios.prototype[method + "Form"] = generateHTTPMethod(true);
49686
+ if (method !== "query") {
49687
+ Axios.prototype[method + "Form"] = generateHTTPMethod(true);
49688
+ }
48850
49689
  });
48851
49690
  Axios_default = Axios;
48852
49691
  }
@@ -48854,7 +49693,7 @@ var init_Axios = __esm({
48854
49693
  var CancelToken;
48855
49694
  var CancelToken_default;
48856
49695
  var init_CancelToken = __esm({
48857
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/cancel/CancelToken.js"() {
49696
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/cancel/CancelToken.js"() {
48858
49697
  init_CanceledError();
48859
49698
  CancelToken = class _CancelToken {
48860
49699
  constructor(executor) {
@@ -48960,21 +49799,21 @@ function spread(callback) {
48960
49799
  };
48961
49800
  }
48962
49801
  var init_spread = __esm({
48963
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/spread.js"() {
49802
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/spread.js"() {
48964
49803
  }
48965
49804
  });
48966
49805
  function isAxiosError(payload) {
48967
49806
  return utils_default.isObject(payload) && payload.isAxiosError === true;
48968
49807
  }
48969
49808
  var init_isAxiosError = __esm({
48970
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/isAxiosError.js"() {
49809
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/isAxiosError.js"() {
48971
49810
  init_utils7();
48972
49811
  }
48973
49812
  });
48974
49813
  var HttpStatusCode;
48975
49814
  var HttpStatusCode_default;
48976
49815
  var init_HttpStatusCode = __esm({
48977
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/helpers/HttpStatusCode.js"() {
49816
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/helpers/HttpStatusCode.js"() {
48978
49817
  HttpStatusCode = {
48979
49818
  Continue: 100,
48980
49819
  SwitchingProtocols: 101,
@@ -49057,7 +49896,7 @@ function createInstance(defaultConfig) {
49057
49896
  const instance = bind(Axios_default.prototype.request, context);
49058
49897
  utils_default.extend(instance, Axios_default.prototype, context, { allOwnKeys: true });
49059
49898
  utils_default.extend(instance, context, null, { allOwnKeys: true });
49060
- instance.create = function create(instanceConfig) {
49899
+ instance.create = function create2(instanceConfig) {
49061
49900
  return createInstance(mergeConfig(defaultConfig, instanceConfig));
49062
49901
  };
49063
49902
  return instance;
@@ -49065,7 +49904,7 @@ function createInstance(defaultConfig) {
49065
49904
  var axios;
49066
49905
  var axios_default;
49067
49906
  var init_axios = __esm({
49068
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/lib/axios.js"() {
49907
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/lib/axios.js"() {
49069
49908
  init_utils7();
49070
49909
  init_bind();
49071
49910
  init_Axios();
@@ -49122,8 +49961,9 @@ var HttpStatusCode2;
49122
49961
  var formToJSON;
49123
49962
  var getAdapter2;
49124
49963
  var mergeConfig2;
49964
+ var create;
49125
49965
  var init_axios2 = __esm({
49126
- "../../node_modules/.pnpm/axios@1.15.2/node_modules/axios/index.js"() {
49966
+ "../../node_modules/.pnpm/axios@1.16.1/node_modules/axios/index.js"() {
49127
49967
  init_axios();
49128
49968
  ({
49129
49969
  Axios: Axios2,
@@ -49141,7 +49981,8 @@ var init_axios2 = __esm({
49141
49981
  HttpStatusCode: HttpStatusCode2,
49142
49982
  formToJSON,
49143
49983
  getAdapter: getAdapter2,
49144
- mergeConfig: mergeConfig2
49984
+ mergeConfig: mergeConfig2,
49985
+ create
49145
49986
  } = axios_default);
49146
49987
  }
49147
49988
  });
@@ -49244,7 +50085,7 @@ var y;
49244
50085
  var B;
49245
50086
  var te;
49246
50087
  var init_lib = __esm({
49247
- "../../node_modules/.pnpm/@zodios+core@10.9.6_axios@1.15.2_zod@3.25.76/node_modules/@zodios/core/lib/index.mjs"() {
50088
+ "../../node_modules/.pnpm/@zodios+core@10.9.6_axios@1.16.1_zod@3.25.76/node_modules/@zodios/core/lib/index.mjs"() {
49248
50089
  init_axios2();
49249
50090
  M = /:([a-zA-Z_][a-zA-Z0-9_]*)/g;
49250
50091
  u = class extends Error {
@@ -49421,7 +50262,7 @@ var LatestPublisherStakeCapsUpdateDataResponse;
49421
50262
  var schemas;
49422
50263
  var endpoints;
49423
50264
  var init_zodSchemas = __esm({
49424
- "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.15.2/node_modules/@pythnetwork/hermes-client/dist/esm/zodSchemas.mjs"() {
50265
+ "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.16.1/node_modules/@pythnetwork/hermes-client/dist/esm/zodSchemas.mjs"() {
49425
50266
  init_lib();
49426
50267
  init_zod();
49427
50268
  AssetType = external_exports.enum([
@@ -49697,7 +50538,7 @@ var DEFAULT_TIMEOUT;
49697
50538
  var DEFAULT_HTTP_RETRIES;
49698
50539
  var HermesClient;
49699
50540
  var init_hermes_client = __esm({
49700
- "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.15.2/node_modules/@pythnetwork/hermes-client/dist/esm/hermes-client.mjs"() {
50541
+ "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.16.1/node_modules/@pythnetwork/hermes-client/dist/esm/hermes-client.mjs"() {
49701
50542
  init_dist6();
49702
50543
  init_utils6();
49703
50544
  init_zodSchemas();
@@ -49903,7 +50744,7 @@ var init_hermes_client = __esm({
49903
50744
  }
49904
50745
  });
49905
50746
  var init_esm = __esm({
49906
- "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.15.2/node_modules/@pythnetwork/hermes-client/dist/esm/index.mjs"() {
50747
+ "../../node_modules/.pnpm/@pythnetwork+hermes-client@3.1.0_axios@1.16.1/node_modules/@pythnetwork/hermes-client/dist/esm/index.mjs"() {
49907
50748
  init_hermes_client();
49908
50749
  }
49909
50750
  });
@@ -51820,7 +52661,7 @@ var DEFAULT_ENDPOINT;
51820
52661
  var _AggregatorClient;
51821
52662
  var AggregatorClient;
51822
52663
  var init_dist7 = __esm({
51823
- "../../node_modules/.pnpm/@cetusprotocol+aggregator-sdk@1.4.8_axios@1.15.2_typescript@5.9.3/node_modules/@cetusprotocol/aggregator-sdk/dist/index.js"() {
52664
+ "../../node_modules/.pnpm/@cetusprotocol+aggregator-sdk@1.4.8_axios@1.16.1_typescript@5.9.3/node_modules/@cetusprotocol/aggregator-sdk/dist/index.js"() {
51824
52665
  init_transactions();
51825
52666
  import_json_bigint = __toESM(require_json_bigint());
51826
52667
  init_utils3();
@@ -78056,7 +78897,7 @@ ${pckCertChain}`;
78056
78897
  };
78057
78898
  }
78058
78899
  });
78059
- var require_src2 = __commonJS({
78900
+ var require_src3 = __commonJS({
78060
78901
  "../../node_modules/.pnpm/@phala+dcap-qvl@0.5.2/node_modules/@phala/dcap-qvl/src/index.js"(exports$1, module) {
78061
78902
  var { Quote } = require_quote();
78062
78903
  var { verify, QuoteVerifier, VerifiedReport } = require_verify();
@@ -94594,8 +95435,8 @@ function weierstrass(c) {
94594
95435
  return _ecdsa_new_output_to_legacy(c, signs);
94595
95436
  }
94596
95437
  function createCurve(curveDef, defHash) {
94597
- const create = (hash) => weierstrass({ ...curveDef, hash });
94598
- return { ...create(defHash), create };
95438
+ const create2 = (hash) => weierstrass({ ...curveDef, hash });
95439
+ return { ...create2(defHash), create: create2 };
94599
95440
  }
94600
95441
  var secp256k1_CURVE = {
94601
95442
  p: BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),
@@ -96563,7 +97404,7 @@ async function verifyTdxQuote(base, model, receiptWorkloadId) {
96563
97404
  };
96564
97405
  }
96565
97406
  try {
96566
- const dcap = await Promise.resolve().then(() => __toESM(require_src2(), 1));
97407
+ const dcap = await Promise.resolve().then(() => __toESM(require_src3(), 1));
96567
97408
  const getCollateralAndVerify = dcap.getCollateralAndVerify ?? dcap.default?.getCollateralAndVerify;
96568
97409
  if (typeof getCollateralAndVerify !== "function") {
96569
97410
  return {
@@ -97717,11 +98558,11 @@ Use the returned values to inform the user about their own configured caps befor
97717
98558
  );
97718
98559
  }
97719
98560
  init_zod();
97720
- var DEFAULT_MODEL = "zai/glm-5.2";
98561
+ var DEFAULT_MODEL = "openai/gpt-oss-120b";
97721
98562
  function registerChatTools(server) {
97722
98563
  server.tool(
97723
98564
  "t2000_chat",
97724
- "Run private inference on the t2000 Private API (OpenAI-compatible; ZDR by default, a `phala/*` tier is GPU-TEE confidential), billed to the user's t2000 credit. Requires T2000_API_KEY in the server env (generate at platform.t2000.ai \u2014 Pro/Max). Pass a single `prompt`, or a full `messages` list. Discover model ids with t2000_models; defaults to GLM 5.2.",
98565
+ "Run private inference on the t2000 Private API (OpenAI-compatible; ZDR by default, a `phala/*` tier is GPU-TEE confidential), billed to the user's t2000 credit. Requires T2000_API_KEY in the server env (any funded account can mint one \u2014 platform.t2000.ai or `t2 agent onboard`). Pass a single `prompt`, or a full `messages` list. Discover model ids with t2000_models; defaults to the fast gpt-oss-120b.",
97725
98566
  {
97726
98567
  prompt: external_exports.string().optional().describe("User prompt (shorthand for a single user message)"),
97727
98568
  messages: external_exports.array(
@@ -97800,7 +98641,7 @@ function registerChatTools(server) {
97800
98641
  var cachedSkills = null;
97801
98642
  function getBakedSkills() {
97802
98643
  if (cachedSkills) return cachedSkills;
97803
- const raw = '[{"name":"t2000-check-balance","description":"Check the t2000 Agent Wallet balance on Sui. Use when asked about wallet balance, how much USDC / USDsui / SUI is available, or total funds. Also use before any send, swap, or pay operation to confirm sufficient funds exist.","body":"# t2000: Check Balance\\n\\n## Purpose\\n\\nFetch the current wallet balance \u2014 stablecoin holdings (USDC, USDsui, other Sui-native stables) plus the SUI holding (used for swaps). Wallet only; **no savings or debt** rollup (those live on audric.ai, not in the Agent Wallet CLI).\\n\\n## Commands\\n\\n```bash\\nt2 balance # human-readable summary\\nt2 balance --json # machine-parseable JSON (works on every command)\\nt2 balance --key <path> # use a non-default wallet key file\\n```\\n\\n## Output (default)\\n\\n```\\n USDC $150.00\\n USDsui $20.00\\n SUI $0.50 (0.5000 SUI \u2014 gas)\\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n Wallet total $170.50\\n```\\n\\nThe list shows every stablecoin with a balance \u2265 $0.01, sorted with USDC first. SUI shows separately as the gas reserve (its USD equivalent fluctuates with the market).\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"available\\": 170.0,\\n \\"stables\\": { \\"USDC\\": 150.0, \\"USDsui\\": 20.0 },\\n \\"sui\\": { \\"amount\\": 0.5, \\"usdValue\\": 0.5 },\\n \\"totalUsd\\": 170.5\\n}\\n```\\n\\n## Rules\\n\\n1. **Wallet-only.** This skill returns holdings, not savings or debt. If the user asks \\"what are my savings?\\" or \\"what\'s my health factor?\\", redirect them to audric.ai (the consumer surface that wraps Audric Finance).\\n2. **Always check before writes.** Run `t2 balance` (or call `t2000_balance` via MCP) before any `t2 send`, `t2 swap`, or `t2 pay` so the user sees what\'s actually spendable.\\n3. **--json is universal.** Every t2 command supports `--json` \u2014 surface this when scripting.\\n\\n## Notes\\n\\n- `sui.usdValue` is an estimate at current SUI price; it fluctuates.\\n- If balance shows $0.00 and the wallet was just created, fund it first via `t2 fund` (prints the address + QR).\\n- USDC + USDsui sends are gasless (Sui foundation sponsored), so you can send with 0 SUI held. Swaps via Cetus DO need a small SUI balance."},{"name":"t2000-mcp","description":"Connect a t2000 Agent Wallet to Claude Desktop, Cursor, Cline, Continue, or any MCP-compatible client. Use when asked to set up MCP, paste an MCP server config, install @t2000/mcp, or troubleshoot why the MCP server \\"doesn\'t do anything\\" when run from a terminal. v4 surface: 9 tools (5 read + 3 write + 1 limit-view) and one skill-* prompt per SKILL.md in t2000-skills/skills/.","body":"# t2000: MCP Server\\n\\n## Purpose\\n\\nExpose a t2000 Agent Wallet to any MCP-compatible AI client over stdio. **9 tools + N skill prompts** (one per `SKILL.md` in `t2000-skills/skills/`). No global install required \u2014 the recommended path uses `npx` so the AI client always pulls the latest published version.\\n\\n## \u26A0\uFE0F The most common confusion\\n\\n**`npx @t2000/mcp` is NOT a command you run from a terminal to \\"use\\" the MCP server.** It is a JSON-RPC server that listens silently on `stdin`. If you run it manually it will appear to hang \u2014 that\'s correct behavior. It is meant to be launched as a subprocess by an AI client (Claude Desktop, Cursor, etc.) which speaks JSON-RPC to it over `stdin`/`stdout`.\\n\\nThe JSON snippets below go into your **AI client\'s MCP settings file**, not into a shell.\\n\\n## Setup\\n\\n### 1. Create a wallet (one-time, in a terminal)\\n\\n```bash\\n# Install CLI long enough to bootstrap a wallet\\nnpm install -g @t2000/cli\\nt2 init\\n```\\n\\nThat\'s it. No PIN. No safeguards gate. The MCP server starts as soon as the wallet file exists at `~/.t2000/wallet.key`.\\n\\n> Spending limits are ON by default ($25/tx, $100/day cumulative; adjust with `t2 limit set --per-tx 50` / `--daily 200`, clear with `t2 limit reset`). Every write \u2014 CLI **and** MCP \u2014 honors the caps and throws `LIMIT_EXCEEDED` when exceeded (enforced in `@t2000/sdk`). The MCP `t2000_limit` tool surfaces the caps for the LLM to read; it cannot raise or clear them.\\n\\n### 2. Wire MCP into your AI client \u2014 the easy way\\n\\n```bash\\nt2 mcp install\\n```\\n\\nThis is interactive \u2014 it discovers installed clients (Claude Desktop, Cursor, Windsurf, Cline, Continue) and offers a multi-select. The CLI writes the correct config block into each chosen client. Then restart the client.\\n\\n### 2-alt. Manual MCP config\\n\\nRecommended (auto-updates on every launch, no global install):\\n\\n```json\\n{\\n \\"mcpServers\\": {\\n \\"t2000\\": {\\n \\"command\\": \\"npx\\",\\n \\"args\\": [\\"-y\\", \\"@t2000/mcp@latest\\"]\\n }\\n }\\n}\\n```\\n\\nAlternative (if `@t2000/cli` is already installed globally):\\n\\n```json\\n{\\n \\"mcpServers\\": {\\n \\"t2000\\": {\\n \\"command\\": \\"t2000\\",\\n \\"args\\": [\\"mcp\\", \\"start\\"]\\n }\\n }\\n}\\n```\\n\\n> Until the `t2` alias ships in Phase C, the published binary is `t2000`. Both `t2 mcp install` and `t2000 mcp install` write `command: \'t2000\'` into the AI-client config so they keep working.\\n\\n### 3. Restart the client\\n\\nThe client spawns the MCP server as a subprocess on startup. You should see `t2000_*` tools appear in the tool list.\\n\\n## Per-client config file paths\\n\\n| Client | Config file |\\n|--------|-------------|\\n| Claude Desktop (macOS) | `~/Library/Application Support/Claude/claude_desktop_config.json` |\\n| Claude Desktop (Windows) | `%APPDATA%\\\\Claude\\\\claude_desktop_config.json` |\\n| Cursor | Settings \u2192 MCP \u2192 Add new MCP server (or `~/.cursor/mcp.json`) |\\n| Cline | VSCode settings \u2192 `cline.mcpServers` |\\n| Continue | `~/.continue/config.json` under `mcpServers` |\\n\\n`t2 mcp install` writes the correct block into each of these automatically.\\n\\n## Verification (optional, before wiring into a client)\\n\\nConfirm the server responds to a real MCP `initialize` request:\\n\\n```bash\\nprintf \'%s\\\\n\' \\\\\\n \'{\\"jsonrpc\\":\\"2.0\\",\\"id\\":1,\\"method\\":\\"initialize\\",\\"params\\":{\\"protocolVersion\\":\\"2024-11-05\\",\\"capabilities\\":{},\\"clientInfo\\":{\\"name\\":\\"test\\",\\"version\\":\\"1.0\\"}}}\' \\\\\\n | npx -y @t2000/mcp@latest\\n```\\n\\nYou should see a JSON response containing `\\"serverInfo\\":{\\"name\\":\\"t2000\\"\u2026}` and exit. If you see that, the server is healthy and ready to be launched by a client.\\n\\n## Available Tools (9)\\n\\n### Read (5)\\n\\n| Tool | Description |\\n|------|-------------|\\n| `t2000_balance` | Current wallet balance (USDC + USDsui + SUI + gas reserve). |\\n| `t2000_address` | Wallet address. |\\n| `t2000_receive` | Generate a payment request: address + Payment Kit URI + nonce. |\\n| `t2000_history` | Recent on-chain activity (sends / swaps / pays). |\\n| `t2000_services` | Discover x402 services (gateway catalog at mpp.t2000.ai). |\\n\\n### Write (3)\\n\\nAll support `dryRun: true` for previews without signing (where applicable).\\n\\n| Tool | Description |\\n|------|-------------|\\n| `t2000_send` | Send USDC / USDsui / SUI. Asset REQUIRED. USDC + USDsui are gasless. |\\n| `t2000_swap` | Swap tokens via Cetus Aggregator. Requires SUI for gas. |\\n| `t2000_pay` | Pay for an x402-protected API service (USDC, gasless). |\\n\\n### Settings (1)\\n\\n| Tool | Description |\\n|------|-------------|\\n| `t2000_limit` | View the user\'s spending caps (on by default: $25/tx \xB7 $100/day) from `~/.t2000/config.json`. READ-ONLY \u2014 the LLM cannot set or clear limits via MCP. |\\n\\n> **v3 \u2192 v4 deletions.** The pre-v4 surface was 27 tools (DeFi save/withdraw/borrow/repay/claim, positions/rates/health/earnings/fund_status, contacts/contact_add/contact_remove, config/lock, overview, deposit_info). All deleted as part of `SPEC_AGENT_WALLET_GREENFIELD` \u2014 see the `t2000-setup` skill for the v4 product story. DeFi lives on audric.ai now; local contacts are deprecated in favor of SuiNS (`alice.sui`).\\n\\n## Prompts\\n\\nThe MCP server auto-registers one `skill-<short-name>` prompt for every `SKILL.md` baked into the bundle. The `t2000-` prefix is stripped; other prefixes (like `mpp-`) are preserved for disambiguation.\\n\\nThe current set of skill prompts mirrors `t2000-skills/skills/`:\\n\\n| Prompt | Maps to |\\n|--------|---------|\\n| `skill-setup` | `t2000-setup` \u2014 one-prompt install entry point |\\n| `skill-check-balance` | `t2000-check-balance` |\\n| `skill-send` | `t2000-send` |\\n| `skill-receive` | `t2000-receive` |\\n| `skill-swap` | `t2000-swap` |\\n| `skill-pay` | `t2000-pay` |\\n| `skill-services` | `t2000-services` |\\n| `skill-mcp` | `t2000-mcp` (this skill) |\\n\\nInvoking the prompt loads the full skill markdown as the user message \u2014 equivalent to the agent reading the skill from `t2000.ai/skills/<slug>`. Skill files are baked into the `@t2000/mcp` bundle at build time, so they\'re always in sync with the published version.\\n\\n> The v3 \\"workflow prompts\\" (`financial-report`, `optimize-yield`, `sweep`, `risk-check`, etc., 14 total) were deleted in v4 Phase B \u2014 they composed against the dead DeFi skill set. Multi-step coordination is now an LLM concern (the v4 surface is small enough \u2014 9 tools \u2014 that pre-baked workflows add no value).\\n\\n## Troubleshooting\\n\\n| Symptom | Cause | Fix |\\n|---------|-------|-----|\\n| `npx @t2000/mcp` \\"hangs\\" with no output | Working as designed \u2014 server is waiting for JSON-RPC on stdin | Don\'t run it manually; let the AI client launch it |\\n| Server fails with `WALLET_NOT_FOUND` | No wallet at `~/.t2000/wallet.key` | Run `t2 init` first |\\n| Server fails with `WALLET_CORRUPT` | File at `~/.t2000/wallet.key` is not a v4 wallet (e.g. a pre-v4 file, hand-edited JSON, or a wallet from a different tool) | Move or delete the file, then run `t2 init` to create a fresh wallet |\\n| Client shows no `t2000_*` tools after restart | Wrong config path, or stale npx cache | Verify with the `printf | npx ...` test above; clear cache with `rm -rf ~/.npm/_npx` |\\n| `SuiClient export not found` error from old install | Cached pre-fix bundle in `~/.npm/_npx` | `rm -rf ~/.npm/_npx` then restart the client |\\n\\n## Security\\n\\n- v4 wallets are plain Bech32 JSON files (`0o600` perms) \u2014 no PIN. Anyone with read access to `~/.t2000/wallet.key` owns the wallet.\\n- Local-only stdio transport \u2014 the key never leaves the machine.\\n- `dryRun: true` previews operations before signing (on `t2000_send`).\\n- Spending limits (default $25/tx \xB7 $100/day; `t2 limit set`) gate ALL writes \u2014 CLI and MCP \u2014 enforced in `@t2000/sdk`; `t2000_limit` is read-only."},{"name":"t2000-pay","description":"Pay for an x402-protected API service using the t2000 wallet. Use when asked to call an AI model, search the web, generate images, send email, buy gift cards, send physical mail, check weather, execute code, or any task that requires a paid API. Handles the full x402 402 challenge automatically. Use t2000_services to discover all available services first.","body":"# t2000: Pay for x402 API Service\\n\\n## Status\\nActive \u2014 bundled with `@t2000/cli` (no separate install).\\n\\n**USDC payment is gasless.** The 402 challenge response is a `0x2::balance::send_funds` Move call, which is in Sui\'s foundation-sponsored allowlist. The wallet can pay even with 0 SUI in the gas reserve.\\n\\n## Purpose\\nMake a paid HTTP request to any x402-protected endpoint. Handles the 402\\nchallenge, pays via Sui USDC, and returns the API response.\\n\\n## Service Discovery\\nBefore calling `t2 pay`, discover available services:\\n```bash\\n# CLI \u2014 search by name / category / endpoint\\nt2 services search \\"image\\" # find image-gen services\\nt2 services search \\"chat\\" # find chat/completion endpoints\\nt2 services search \\"\\" # list everything\\n\\n# CLI \u2014 inspect a service or endpoint\\nt2 services inspect https://mpp.t2000.ai/openai\\nt2 services inspect https://mpp.t2000.ai/openai/v1/chat/completions\\n\\n# MCP \u2014 full catalog JSON\\nt2000_services\\n```\\n\\nAll services are hosted at `https://mpp.t2000.ai/`. See the `t2000-services` skill for the full discovery workflow.\\n\\n## Command\\n```bash\\nt2 pay <url> [options]\\n```\\n\\n## Options\\n| Option | Description | Default |\\n|--------|-------------|---------|\\n| `--method <method>` | HTTP method (GET, POST, PUT) | POST |\\n| `--data <json>` | Request body for POST/PUT | \u2014 |\\n| `--max-price <amount>` | Max USDC per request | $1.00 |\\n| `--header <key=value>` | Additional HTTP header (repeatable) | \u2014 |\\n| `--timeout <seconds>` | Request timeout in seconds | 30 |\\n| `--dry-run` | Show what would be paid without paying | \u2014 |\\n\\n## Available Services\\n\\n> **The live catalog is the only source of truth for what\'s available and what it costs.**\\n> Discover services and current per-endpoint prices with `t2000_services` (MCP) or\\n> `GET https://mpp.t2000.ai/api/services`. Inspect one with `t2 services inspect <url>`.\\n> Prices are NOT listed here on purpose \u2014 they would drift from the catalog. Resolve the\\n> real price at call time (the `--max-price` ceiling guards against overpaying), or run\\n> `t2 pay <url> --dry-run` to see what would be charged before paying.\\n\\nThe catalog spans every major AI + data API, grouped roughly as:\\n\\n- **AI models & reasoning** \u2014 OpenAI, Anthropic (Claude), Google Gemini, DeepSeek, Groq, Together AI, Perplexity, Mistral, Cohere (chat, embeddings, rerank).\\n- **Media & generation** \u2014 OpenAI (images, text-to-speech), fal.ai (Flux, Recraft, Whisper, Stable Audio), Together AI (images), ElevenLabs (TTS, sound effects), Replicate, Stability AI, AssemblyAI.\\n- **Search** \u2014 Brave, Exa, Serper, SerpAPI, NewsAPI.\\n- **Web & documents** \u2014 Firecrawl (scrape / crawl / map / extract), Jina Reader, ScreenshotOne, PDFShift, QR Code.\\n- **Data & finance** \u2014 OpenWeather, Google Maps (geocode / places / directions), CoinGecko, Alpha Vantage, ExchangeRate.\\n- **Translation** \u2014 DeepL, Google Translate.\\n- **Intelligence & security** \u2014 Hunter.io, IPinfo, VirusTotal.\\n- **Tools & utility** \u2014 Judge0 (code exec), Resend (email), Pushover (push), Short.io (URL shortener), TinyPNG (image compression & resize).\\n- **Commerce** \u2014 Lob (postcards, letters, address verification).\\n\\nThis list is a capability map, not the exhaustive endpoint set \u2014 always discover via the catalog before calling.\\n\\n## Example Commands\\n\\n### Ask an AI model\\n```bash\\nt2 pay https://mpp.t2000.ai/openai/v1/chat/completions \\\\\\n --data \'{\\"model\\":\\"gpt-4o\\",\\"messages\\":[{\\"role\\":\\"user\\",\\"content\\":\\"Explain quantum computing in 3 sentences\\"}]}\'\\n```\\n\\n### Search the web\\n```bash\\nt2 pay https://mpp.t2000.ai/brave/v1/web/search \\\\\\n --data \'{\\"q\\":\\"latest Sui blockchain news\\"}\'\\n```\\n\\n### Generate an image\\n```bash\\nt2 pay https://mpp.t2000.ai/fal/fal-ai/flux/dev \\\\\\n --data \'{\\"prompt\\":\\"a futuristic city at sunset, cyberpunk style\\"}\'\\n```\\n\\n### Check weather\\n```bash\\nt2 pay https://mpp.t2000.ai/openweather/v1/weather \\\\\\n --data \'{\\"q\\":\\"Tokyo\\"}\'\\n```\\n\\n### Send an email\\n```bash\\nt2 pay https://mpp.t2000.ai/resend/v1/emails \\\\\\n --data \'{\\"from\\":\\"agent@t2000.ai\\",\\"to\\":\\"user@example.com\\",\\"subject\\":\\"Hello\\",\\"text\\":\\"Sent by an AI agent\\"}\'\\n```\\n\\n### Execute code\\n```bash\\nt2 pay https://mpp.t2000.ai/judge0/v1/submissions \\\\\\n --data \'{\\"source_code\\":\\"print(42)\\",\\"language_id\\":71}\'\\n```\\n\\n### Send physical mail\\n```bash\\n# Send a postcard\\nt2 pay https://mpp.t2000.ai/lob/v1/postcards \\\\\\n --max-price 2 \\\\\\n --data \'{\\n \\"to\\":{\\"name\\":\\"Jane Doe\\",\\"address_line1\\":\\"123 Main St\\",\\"address_city\\":\\"San Francisco\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94105\\"},\\n \\"from\\":{\\"name\\":\\"AI Agent\\",\\"address_line1\\":\\"456 Oak Ave\\",\\"address_city\\":\\"Palo Alto\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94301\\"},\\n \\"front\\":\\"https://example.com/front.png\\",\\n \\"back\\":\\"https://example.com/back.png\\",\\n \\"use_type\\":\\"operational\\"\\n }\'\\n\\n# Send a letter\\nt2 pay https://mpp.t2000.ai/lob/v1/letters \\\\\\n --max-price 2 \\\\\\n --data \'{\\n \\"to\\":{\\"name\\":\\"Jane Doe\\",\\"address_line1\\":\\"123 Main St\\",\\"address_city\\":\\"San Francisco\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94105\\"},\\n \\"from\\":{\\"name\\":\\"AI Agent\\",\\"address_line1\\":\\"456 Oak Ave\\",\\"address_city\\":\\"Palo Alto\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94301\\"},\\n \\"file\\":\\"https://example.com/letter.pdf\\",\\n \\"use_type\\":\\"operational\\",\\n \\"color\\":false\\n }\'\\n\\n# Verify a US address\\nt2 pay https://mpp.t2000.ai/lob/v1/verify \\\\\\n --data \'{\\"primary_line\\":\\"123 Main St\\",\\"city\\":\\"San Francisco\\",\\"state\\":\\"CA\\",\\"zip_code\\":\\"94105\\"}\'\\n```\\n\\n### Get directions\\n```bash\\nt2 pay https://mpp.t2000.ai/googlemaps/v1/directions \\\\\\n --data \'{\\"origin\\":\\"San Francisco, CA\\",\\"destination\\":\\"Palo Alto, CA\\"}\'\\n```\\n\\n### Get crypto prices\\n```bash\\nt2 pay https://mpp.t2000.ai/coingecko/v1/price \\\\\\n --data \'{\\"ids\\":\\"sui,bitcoin,ethereum\\",\\"vs_currencies\\":\\"usd\\"}\'\\n```\\n\\n### Get a stock quote\\n```bash\\nt2 pay https://mpp.t2000.ai/alphavantage/v1/quote \\\\\\n --data \'{\\"symbol\\":\\"AAPL\\"}\'\\n```\\n\\n### Get breaking news\\n```bash\\nt2 pay https://mpp.t2000.ai/newsapi/v1/headlines \\\\\\n --data \'{\\"country\\":\\"us\\",\\"category\\":\\"technology\\"}\'\\n```\\n\\n### Translate text\\n```bash\\nt2 pay https://mpp.t2000.ai/deepl/v1/translate \\\\\\n --data \'{\\"text\\":[\\"Hello, how are you?\\"],\\"target_lang\\":\\"ES\\"}\'\\n```\\n\\n### Semantic search\\n```bash\\nt2 pay https://mpp.t2000.ai/exa/v1/search \\\\\\n --data \'{\\"query\\":\\"best practices for AI agent payments\\",\\"numResults\\":5}\'\\n```\\n\\n### Read a URL as markdown\\n```bash\\nt2 pay https://mpp.t2000.ai/jina/v1/read \\\\\\n --data \'{\\"url\\":\\"https://docs.sui.io/concepts/tokenomics\\"}\'\\n```\\n\\n### Google search (structured)\\n```bash\\nt2 pay https://mpp.t2000.ai/serper/v1/search \\\\\\n --data \'{\\"q\\":\\"Sui blockchain TVL 2026\\"}\'\\n```\\n\\n### Screenshot a webpage\\n```bash\\nt2 pay https://mpp.t2000.ai/screenshot/v1/capture \\\\\\n --data \'{\\"url\\":\\"https://example.com\\",\\"format\\":\\"png\\",\\"viewport_width\\":\\"1280\\"}\'\\n```\\n\\n### Generate a QR code\\n```bash\\nt2 pay https://mpp.t2000.ai/qrcode/v1/generate \\\\\\n --data \'{\\"data\\":\\"https://t2000.ai\\",\\"size\\":\\"400x400\\"}\'\\n```\\n\\n### Convert HTML to PDF\\n```bash\\nt2 pay https://mpp.t2000.ai/pdfshift/v1/convert \\\\\\n --data \'{\\"source\\":\\"https://t2000.ai/docs\\"}\'\\n```\\n\\n### Run a Replicate model\\n```bash\\nt2 pay https://mpp.t2000.ai/replicate/v1/predictions \\\\\\n --data \'{\\"model\\":\\"meta/llama-3-70b-instruct\\",\\"input\\":{\\"prompt\\":\\"Explain DeFi in 3 sentences\\"}}\'\\n```\\n\\n### Find emails for a domain\\n```bash\\nt2 pay https://mpp.t2000.ai/hunter/v1/search \\\\\\n --data \'{\\"domain\\":\\"mystenlabs.com\\"}\'\\n```\\n\\n### Look up an IP address\\n```bash\\nt2 pay https://mpp.t2000.ai/ipinfo/v1/lookup \\\\\\n --data \'{\\"ip\\":\\"8.8.8.8\\"}\'\\n```\\n\\n### Search for flights\\n```bash\\nt2 pay https://mpp.t2000.ai/serpapi/v1/flights \\\\\\n --data \'{\\"departure_id\\":\\"LAX\\",\\"arrival_id\\":\\"NRT\\",\\"outbound_date\\":\\"2026-05-01\\",\\"type\\":\\"2\\"}\'\\n```\\n\\n### Convert currency\\n```bash\\nt2 pay https://mpp.t2000.ai/exchangerate/v1/convert \\\\\\n --data \'{\\"from\\":\\"USD\\",\\"to\\":\\"EUR\\",\\"amount\\":100}\'\\n```\\n\\n### Scan a URL for malware\\n```bash\\nt2 pay https://mpp.t2000.ai/virustotal/v1/scan \\\\\\n --data \'{\\"url\\":\\"https://suspicious-site.com\\"}\'\\n```\\n\\n### Shorten a URL\\n```bash\\nt2 pay https://mpp.t2000.ai/shortio/v1/shorten \\\\\\n --data \'{\\"url\\":\\"https://example.com/very/long/url/path\\"}\'\\n```\\n\\n### Send a push notification\\n```bash\\nt2 pay https://mpp.t2000.ai/pushover/v1/push \\\\\\n --data \'{\\"user\\":\\"USER_KEY\\",\\"message\\":\\"Your agent has a message!\\"}\'\\n```\\n\\n## Flow (automatic)\\n1. Makes initial HTTP request to the URL\\n2. If 402: reads x402 challenge for amount and terms\\n3. If price <= --max-price: pays via Sui USDC\\n4. Retries with credential header\\n5. Returns the API response body\\n\\n## Safety\\n- If requested price exceeds --max-price, payment is refused (no funds spent)\\n- Default max-price: $1.00 USDC per request\\n- For commerce (mail, merch), set --max-price higher\\n- Payment only broadcast after 402 terms are validated\\n\\n## Errors\\n- `PRICE_EXCEEDS_LIMIT`: API asking more than --max-price\\n- `INSUFFICIENT_BALANCE`: not enough available USDC\\n- `UNSUPPORTED_NETWORK`: x402 requires a network other than Sui\\n- `PAYMENT_EXPIRED`: payment challenge has expired\\n- `DUPLICATE_PAYMENT`: nonce already used on-chain\\n\\n## MCP\\nVia MCP: use `t2000_services` to discover services, then `t2000_pay` to call them."},{"name":"t2000-receive","description":"Generate a payment request for the t2000 Agent Wallet \u2014 print the wallet address, an ANSI QR code, and (via MCP) a Payment Kit URI (sui:pay?\u2026). Use when asked to receive a payment, share a wallet address, create a payment link, or set up a fund-me link.","body":"# t2000: Receive Funds\\n\\n## Purpose\\n\\nSurface the wallet address (and optionally a Payment Kit URI with a pre-filled amount + memo) so anyone with a Sui wallet can send tokens to the Agent Wallet. Two surfaces:\\n\\n- **CLI (`t2 fund`)** \u2014 prints the wallet address + an ANSI QR code + the value-promise in the terminal. Minimal; no amount or memo.\\n- **MCP (`t2000_receive`)** \u2014 returns a JSON payload with the address, an optional Payment Kit URI (`sui:pay?\u2026`), a nonce, plus an optional amount / currency / memo / label. Use this when the LLM is building a payment-request flow.\\n\\n## Rules\\n\\n1. **Receive is non-custodial.** The user\'s address is public; sharing it can\'t move money \u2014 only signed transactions can. Don\'t add scary disclaimers; the operation is safe.\\n2. **Show the QR + the address text.** Some users scan, some copy. Both surfaces.\\n3. **No PIN, no sign-in.** v4 wallets are plain Bech32; `t2 fund` is a pure read with no authentication step.\\n4. **Default currency is USDC.** When asking the user to fund the wallet, USDC is the most useful (every paid service is USDC-denominated, USDC sends are gasless). USDsui also works.\\n5. **Don\'t generate a Payment Kit URI without an amount unless asked.** A bare address scans just as well; URIs with amounts force the sender into a particular tx shape.\\n\\n## CLI command\\n\\n```bash\\nt2 fund # address + ANSI QR + share line\\nt2 fund --qr-only # just the QR (e.g. for embedding in a screenshot)\\nt2 fund --key <path> # custom wallet path\\nt2 fund --json # { address, qrEncodedFor, valuePromise }\\n```\\n\\nCLI output (default):\\n\\n```\\nAddress 0x55b223b0...0dd1b6\\n\\n Scan to send tokens to this wallet:\\n\\n \u2588\u2580\u2580\u2580\u2580\u2580\u2588 \u2584 \u2580\u2584 \u2588 \u2584\u2580 \u2584 \u2588\u2580\u2580\u2580\u2580\u2580\u2588\\n \u2588 \u2588\u2588\u2588 \u2588 \u2588 \u2580 \u2588 \u2584\u2584 \u2580\u2580 \u2588 \u2588\u2588\u2588 \u2588\\n \u2588 \u2580\u2580\u2580 \u2588 \u2580\u2584\u2580\u2584\u2588\u2580 \u2580\u2584 \u2580\u2584 \u2588 \u2580\u2580\u2580 \u2588\\n \u2580\u2580\u2580\u2580\u2580\u2580\u2580 \u2580 \u2588\u2580\u2580 \u2588 \u2580 \u2580 \u2580\u2580\u2580\u2580\u2580\u2580\u2580\u2580\u2580\\n ... (truncated)\\n\\n Or share `0x55b223b0...0dd1b6` directly.\\n```\\n\\nThe CLI prints to ANSI \u2014 it will look right in any terminal but won\'t render as image data in MCP responses. Use the MCP tool for a structured JSON response.\\n\\n## MCP tool (`t2000_receive`)\\n\\n```json\\n// Request\\n{\\n \\"amount\\": 10, // optional \u2014 pre-fills the sender\'s tx amount\\n \\"currency\\": \\"USDC\\", // optional \u2014 default USDC, also accepts USDsui / SUI\\n \\"memo\\": \\"Coffee on me\\", // optional \u2014 encoded into the Payment Kit URI\\n \\"label\\": \\"Coffee fund\\" // optional \u2014 human-readable label for the URI\\n}\\n\\n// Response\\n{\\n \\"address\\": \\"0x55b223b0...0dd1b6\\",\\n \\"uri\\": \\"sui:pay?recipient=0x55b223b0...&amount=10000000&coinType=0xdba34672...::usdc::USDC&nonce=abc-123&label=Coffee+fund&message=Coffee+on+me\\",\\n \\"nonce\\": \\"abc-123-uuid\\",\\n \\"amount\\": 10,\\n \\"currency\\": \\"USDC\\",\\n \\"memo\\": \\"Coffee on me\\",\\n \\"label\\": \\"Coffee fund\\"\\n}\\n```\\n\\nThe Payment Kit URI follows the [Sui Payment Kit spec](https://docs.sui.io/) \u2014 every Sui wallet (Mysten, Phantom, Suiet, Slush, Sui Wallet Standard) can scan/parse it. If you omit `amount`, the URI is a \\"bring your own amount\\" link that the sender fills in.\\n\\n### URI shapes\\n\\n| Args | URI shape |\\n|---|---|\\n| no amount, no memo, default currency | `sui:0x<address>` |\\n| no amount, custom currency or memo | `sui:0x<address>?currency=USDsui&memo=\u2026` |\\n| with amount | `sui:pay?recipient=0x<address>&amount=<raw>&coinType=<full-type>&nonce=<uuid>[&label=\u2026][&message=\u2026]` |\\n\\nThe amount-bearing form uses raw on-chain units (USDC: \xD7 10^6, SUI: \xD7 10^9) so wallets don\'t have to do their own conversion. The `nonce` is a UUID v4 minted at request time; senders include it in the tx metadata so the receiving agent can correlate the inflow back to the request.\\n\\n## When to use which surface\\n\\n| Need | Use |\\n|---|---|\\n| \\"What\'s my wallet address?\\" | `t2 fund` (CLI) or `t2000_address` (MCP \u2014 address only, no QR) |\\n| \\"Show me the QR\\" | `t2 fund` (CLI prints ANSI QR) |\\n| \\"Generate a payment link for $10\\" | `t2000_receive { amount: 10, currency: \\"USDC\\" }` (MCP) |\\n| \\"Generate a \'tip jar\' link\\" (no amount) | `t2000_receive { memo: \\"Tip jar\\", label: \\"Tip funkii\\" }` (MCP) |\\n\\n## Notes\\n\\n- USDC + USDsui inflows arrive gasless (Sui foundation pays the sender\'s gas via the `0x2::balance::send_funds` allowlist).\\n- SUI inflows require the sender to have SUI for their own gas.\\n- Once the funds land, run `t2 balance` (CLI) or `t2000_balance` (MCP) to verify. Inflows show up within ~1 block (~500 ms).\\n- This skill is the receive-half of \\"Audric Pay\\". The send-half is the `t2000-send` skill.\\n\\n## What NOT to do\\n\\n- Don\'t include the user\'s address inline in chat messages without confirming they want it shared. It\'s public \u2014 but politeness matters.\\n- Don\'t generate a one-off Payment Kit URI for every conversation. The bare address works fine for repeated transfers.\\n- Don\'t redirect users to audric.ai for receive flows \u2014 the Agent Wallet handles receive natively. (Audric Pay\'s hosted UI is for users who DON\'T have the CLI.)"},{"name":"t2000-send","description":"Send USDC, USDsui, or SUI from the t2000 Agent Wallet to another Sui address. Use when asked to pay someone, transfer funds, send money, tip a creator, or make a payment to a specific Sui address, SuiNS name, or saved contact. Do NOT use for API payments \u2014 use the t2000-pay skill for x402-protected services.","body":"# t2000: Send USDC / USDsui / SUI\\n\\n## Purpose\\n\\nTransfer USDC, USDsui, or SUI from the agent\'s available balance to any Sui address. **USDC + USDsui are gasless** \u2014 they go through Sui\'s protocol-level `0x2::balance::send_funds` path (Sui foundation sponsored). **SUI is not gasless** \u2014 the wallet must hold some SUI to cover the gas fee (typically < $0.0002).\\n\\n## Rules\\n\\n1. **Asset is REQUIRED.** v4 has no implicit USDC default. `t2 send 5 alice.sui` exits with a clear error pointing at the missing `<asset>` arg. Always pass one of `USDC | USDsui | SUI`.\\n2. **Only USDC / USDsui / SUI are accepted.** Other tokens (e.g. USDY, USDT, USDe) are rejected with `unsupported asset`. To send a different asset, the user first swaps it via `t2 swap` (or audric.ai) into USDC, USDsui, or SUI.\\n3. **Validate the recipient first.** Names \u2192 SuiNS resolves (`alice.sui`). Raw addresses \u2192 `isValidSuiAddress()`. The SDK throws clear errors (`INVALID_ADDRESS`, `SUINS_NOT_REGISTERED`); don\'t guess.\\n4. **Prefer SuiNS names.** `alice.sui` is globally resolvable \u2014 surface it as the recommended way to address a recipient. (There is no local contacts/alias map.)\\n5. **Sends are single-write.** Each transfer is its own intent. If you need send + something else, sequence them across turns.\\n6. **Amount precision matters.** Floor to the asset\'s decimals (USDC + USDsui: 6, SUI: 9). Never round up \u2014 `Math.round` can produce a number larger than the on-chain balance and the transfer will fail simulation.\\n7. **Multi-recipient = multiple sends.** A \\"send to A, B, C\\" request emits N sequential `t2 send` invocations (CLI) or N `t2000_send` tool calls (MCP). Each is atomic.\\n8. **Limits apply to every write (CLI and MCP).** Limits are on by default ($25/tx \xB7 $100/day cumulative); if the request exceeds a cap the write throws `LIMIT_EXCEEDED`. Override one time with `--force` (CLI).\\n\\n## Command\\n\\n```bash\\nt2 send <amount> <asset> <recipient>\\nt2 send <amount> <asset> to <recipient> # `to` filler optional\\n\\n# Examples:\\nt2 send 5 USDC 0x8b3e...d412 # 5 USDC to a hex address (gasless)\\nt2 send 5 USDsui alice.sui # 5 USDsui to a SuiNS name (gasless)\\nt2 send 50 USDC to mission69b@audric # @audric handle (gasless)\\nt2 send 0.1 SUI 0x8b3e...d412 # 0.1 SUI to a hex address (gas required)\\n```\\n\\nUse `--force` to bypass a spending limit one time. Use `--key <path>` to point at a non-default wallet file.\\n\\n## Output (default)\\n\\n```\\n\u2713 Sent $5.00 USDC \u2192 alex.sui (0x8b3e...d412)\\n Gas: gasless \u26A1\\n Tx: https://suiscan.xyz/mainnet/tx/0xdigest...\\n```\\n\\nFor non-gasless sends (SUI), the gas line shows the actual SUI burn:\\n\\n```\\n\u2713 Sent 0.1000 SUI \u2192 0x8b3e...d412\\n Gas: 0.000123 SUI\\n Tx: https://suiscan.xyz/mainnet/tx/0xdigest...\\n```\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"tx\\": \\"0xdigest...\\",\\n \\"amount\\": 5,\\n \\"to\\": \\"0x8b3e...d412\\",\\n \\"suinsName\\": \\"alex.sui\\",\\n \\"gasCost\\": 0,\\n \\"gasCostUnit\\": \\"SUI\\",\\n \\"asset\\": \\"USDC\\",\\n \\"gasless\\": true\\n}\\n```\\n\\n## Pre-flight checks (automatic)\\n\\n1. Sufficient asset balance (USDC / USDsui / SUI as requested).\\n2. For SUI sends only: sufficient SUI for gas.\\n3. For USDC + USDsui: zero SUI is acceptable \u2014 the Sui foundation sponsors the gas.\\n4. Limit check (CLI only): per-tx cap (any asset) + daily-send cap (any asset). Override with `--force`.\\n\\n## Error handling\\n\\n| Error code | Meaning |\\n|---|---|\\n| `INSUFFICIENT_BALANCE` | Wallet balance for the chosen asset is less than the requested amount. |\\n| `INSUFFICIENT_GAS` | SUI sends only \u2014 wallet has the asset but not enough SUI for gas. Suggest a swap. |\\n| `INVALID_ADDRESS` | Recipient is not a valid Sui hex address. |\\n| `INVALID_ASSET` | Asset is missing or not in the allowlist (USDC / USDsui / SUI). |\\n| `SUINS_NOT_REGISTERED` | The `.sui` name isn\'t registered. |\\n| `CONTACT_NOT_FOUND` | The name isn\'t a SuiNS name, an @audric handle, or a saved local contact. |\\n| `LIMIT_EXCEEDED` | CLI hit a `t2 limit set` cap. Use `--force` to override. |\\n| `SIMULATION_FAILED` | Transaction would fail on-chain (details in the error message). |\\n\\n## Recipient resolution flow\\n\\nThe SDK (`T2000.resolveRecipient`) handles resolution in this priority order:\\n\\n1. **Hex address** (starts with `0x`) \u2192 validated via `isValidSuiAddress()`. If invalid \u2192 `INVALID_ADDRESS`.\\n2. **SuiNS name** (`*.sui`) \u2192 resolves via SuiNS registry. If unregistered \u2192 `SUINS_NOT_REGISTERED`.\\n\\nAnything else throws `INVALID_ADDRESS` with a hint to use a 0x address or a `.sui` name. (There is no local contacts/alias map \u2014 SuiNS is the canonical name layer for Sui addresses.)\\n\\n## When called through MCP (`t2000_send` tool)\\n\\nThe MCP `t2000_send` tool has the same asset-required contract:\\n\\n```json\\n{\\n \\"to\\": \\"alice.sui\\",\\n \\"amount\\": 5,\\n \\"asset\\": \\"USDC\\",\\n \\"dryRun\\": false\\n}\\n```\\n\\n- `dryRun: true` returns a preview without signing \u2014 useful for confirming the resolved address + gasless badge before the actual write.\\n- `asset` is REQUIRED \u2014 calls without it return an error.\\n- Both CLI and MCP writes honor `t2 limit set` caps (enforced in `@t2000/sdk`). Default caps: $25/tx \xB7 $100/day cumulative."},{"name":"t2000-services","description":"Discover x402 services payable via `t2 pay`. Use when the user asks \\"what can I pay for?\\", \\"what AI models are available?\\", \\"show me the service catalog\\", \\"is there a weather API?\\", or any other discovery question. Pairs with the t2000-pay skill (discovery first, then pay).","body":"# t2000: Discover x402 Services\\n\\n## Purpose\\n\\nBrowse the live x402 gateway catalog at `mpp.t2000.ai` to find a service that matches the user\'s intent (chat, image gen, search, weather, email, code exec, mail, etc.) before calling `t2 pay`. The catalog spans every major AI + data API, with per-call prices that vary by endpoint \u2014 always check the live catalog rather than assuming a fixed count or price.\\n\\n## Rules\\n\\n1. **Discover before paying.** Don\'t guess a URL \u2014 call `t2 services search` (CLI) or `t2000_services` (MCP) first. Service paths + pricing change as the gateway expands.\\n2. **Pick the cheapest endpoint that satisfies the user.** Many services have multiple tiers (e.g. `openai/v1/chat/completions` at $0.01 vs `openai/v1/audio/speech` at $0.05). Surface options.\\n3. **Surface pricing to the user before signing.** Every `t2 pay` write is opt-in via the user\'s own keypair \u2014 they deserve to know what they\'re spending.\\n4. **Live source of truth.** The catalog is fetched live from `https://mpp.t2000.ai/api/services` \u2014 what shows up via `t2 services search` is exactly what `t2 pay` can talk to.\\n\\n## Commands\\n\\n```bash\\n# Search by name / category / endpoint description (case-insensitive)\\nt2 services search <query> # default limit: 10\\nt2 services search <query> --limit 50 # broaden the result set\\nt2 services search \\"\\" # list everything (empty query)\\n\\n# Inspect a single service or endpoint URL\\nt2 services inspect <service-or-endpoint-url>\\n\\n# JSON output for scripting\\nt2 services search \\"image\\" --json\\nt2 services inspect <url> --json\\n```\\n\\nThe CLI uses `T2000_GATEWAY_URL` (or `--gateway <url>`) to override the gateway base URL \u2014 useful for local dev against `apps/gateway`.\\n\\n## Example workflow\\n\\n### \\"What AI chat models are available?\\"\\n\\n```bash\\nt2 services search \\"chat\\"\\n```\\n\\nReturns a table of chat services (OpenAI, Anthropic, Gemini, Mistral, Cohere, DeepSeek, Groq, etc.) with cheapest endpoint price + base URL.\\n\\n### \\"How much does GPT-4o cost?\\"\\n\\n```bash\\nt2 services inspect https://mpp.t2000.ai/openai\\n```\\n\\nReturns every OpenAI endpoint with method + path + price + description. The user picks one (e.g. `/v1/chat/completions` at $0.01) and copies the URL into a `t2 pay <url>` call.\\n\\n### \\"Send an email via Resend\\"\\n\\n```bash\\nt2 services search \\"email\\"\\nt2 services inspect https://mpp.t2000.ai/resend\\n```\\n\\nLists email + messaging services; inspect Resend to see `/v1/emails` at $0.05.\\n\\n### \\"What\'s the price of SUI?\\" (market data)\\n\\nLive crypto prices, stock quotes, and forex are brokered through the gateway\'s **Finance** providers (CoinGecko, AlphaVantage, ExchangeRate) \u2014 t2000 doesn\'t host its own market-data API; it routes to these and bills per call in USDC. (Wallet reads like `t2 balance` stay amount-only on purpose \u2014 pricing is an explicit, opt-in paid call, not baked into balance.)\\n\\n```bash\\nt2 services search \\"price\\"\\nt2 services inspect https://mpp.t2000.ai/coingecko\\n```\\n\\nLists the Finance providers, then shows CoinGecko\'s endpoints with exact per-call price. Copy the endpoint URL into `t2 pay <url>` to fetch the quote. (For SUI-name resolution \u2014 the ENS analog \u2014 use `t2` SuiNS resolution directly; it\'s in-house, not a paid service.)\\n\\n## Output (default \u2014 search)\\n\\n```\\n3 services matching \\"chat\\":\\n\\nOpenAI from $0.01 [ai, chat]\\n url https://mpp.t2000.ai/openai\\n about OpenAI Chat Completions API\\n\\nAnthropic from $0.01 [ai, chat]\\n url https://mpp.t2000.ai/anthropic\\n about Claude messages API\\n\\nMistral from $0.005 [ai, chat]\\n url https://mpp.t2000.ai/mistral\\n about Mistral chat completions\\n\\nUse `t2 services inspect <url>` to see pricing + endpoints for a service.\\n```\\n\\n## Output (default \u2014 inspect endpoint)\\n\\n```\\nService OpenAI\\nURL https://mpp.t2000.ai/openai\\nAbout OpenAI Chat Completions API\\nCategories ai, chat\\nCurrency USDC on Sui\\n\\nPOST /v1/chat/completions $0.01 Chat completions (gpt-4o, gpt-4o-mini)\\n url https://mpp.t2000.ai/openai/v1/chat/completions\\n\\nPay with: `t2 pay https://mpp.t2000.ai/openai/v1/chat/completions`\\n```\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"query\\": \\"chat\\",\\n \\"count\\": 3,\\n \\"services\\": [\\n {\\n \\"name\\": \\"OpenAI\\",\\n \\"serviceUrl\\": \\"https://mpp.t2000.ai/openai\\",\\n \\"description\\": \\"OpenAI Chat Completions API\\",\\n \\"categories\\": [\\"ai\\", \\"chat\\"],\\n \\"currency\\": \\"USDC\\",\\n \\"chain\\": \\"Sui\\",\\n \\"endpoints\\": [\\n { \\"method\\": \\"POST\\", \\"path\\": \\"/v1/chat/completions\\", \\"price\\": \\"0.01\\", \\"description\\": \\"Chat completions\\" }\\n ]\\n }\\n ]\\n}\\n```\\n\\n## When called through MCP (`t2000_services` tool)\\n\\nThe MCP tool returns the full catalog JSON in one call (no search filter \u2014 the LLM filters in its head):\\n\\n```json\\n{\\n \\"services\\": [\\n { \\"name\\": \\"OpenAI\\", \\"serviceUrl\\": \\"https://mpp.t2000.ai/openai\\", \\"endpoints\\": [...] },\\n { \\"name\\": \\"Anthropic\\", \\"serviceUrl\\": \\"https://mpp.t2000.ai/anthropic\\", \\"endpoints\\": [...] },\\n ...\\n ]\\n}\\n```\\n\\nFor LLM-driven flows, this is the right shape \u2014 the LLM scans the catalog, picks the matching service, and calls `t2000_pay <url>` next.\\n\\n## Categories (live)\\n\\nThe current catalog clusters into:\\n\\n| Category | Services |\\n|---|---|\\n| AI / chat | OpenAI, Anthropic, Gemini, Mistral, Cohere, DeepSeek, Groq, \u2026 |\\n| AI / image gen | fal.ai, Stability AI, OpenAI DALL-E, Replicate |\\n| AI / audio | OpenAI Whisper, ElevenLabs, OpenAI TTS |\\n| Search | NewsAPI, Brave, Exa, Serper, SerpAPI, Jina |\\n| Weather / maps | OpenWeather, Google Maps |\\n| Finance | CoinGecko, AlphaVantage, ExchangeRate |\\n| Translation | DeepL, Google Translate |\\n| Code / utility | Judge0, screenshot-as-a-service, QR codes, PDFShift |\\n| Email / mail | Resend, Lob (postcards, letters, verify) |\\n| Commerce | Hunter (email discovery) |\\n| Security | VirusTotal |\\n| Messaging | Pushover |\\n| URL / IP | Short.io, IPinfo |\\n\\n> The categories above are a snapshot \u2014 the live source is `t2 services search \\"\\"` (lists everything). New services land regularly.\\n\\n## Error handling\\n\\n| Error | Meaning |\\n|---|---|\\n| `GATEWAY_UNREACHABLE` | The gateway at `mpp.t2000.ai/api/services` is down or DNS is failing. Retry; if persistent, status page is at `t2000.ai`. |\\n| `No services match` | The search query returned zero hits. Suggest a broader query or `t2 services search \\"\\"` to list everything. |\\n| `No service matches <url>` (inspect) | The URL isn\'t in the catalog. Run `t2 services search` to find the right URL first. |\\n\\n## What NOT to do\\n\\n- Don\'t hardcode service URLs in your prompts. The catalog is the source of truth.\\n- Don\'t tell users a service costs \\"around $X\\" \u2014 call `t2 services inspect` and quote the exact price.\\n- Don\'t bundle `t2 services search` + `t2 pay` into a single hidden step. Show the user what you found before paying."},{"name":"t2000-setup","description":"Set up a t2000 Agent Wallet end-to-end on the user\'s machine. Use when the user says \\"set up t2000\\", \\"install the wallet\\", \\"create my Agent Wallet\\", \\"connect t2000 to Claude / Cursor\\", or pastes a one-prompt install URL. Covers wallet creation, optional spending limits, and MCP wiring. Read this first when bootstrapping a new user; the other skills assume this has run.","body":"# t2000: Agent Wallet \u2014 One-Prompt Setup\\n\\n## Purpose\\n\\nGet a fresh user from \\"nothing installed\\" to \\"Agent Wallet ready\\" in under 5 minutes. This is the canonical entry point for the **one-prompt install** UX:\\n\\n```\\nRun curl -sL https://t2000.ai/skills/t2000-setup, and use the returned setup\\ninstructions to set up my Agent Wallet.\\n```\\n\\nWhen invoked through that prompt, the LLM fetches this file, then executes the steps below in order.\\n\\n## Rules\\n\\n1. **Walk the steps in order.** Each step depends on the previous one. Skipping breaks setup.\\n2. **Stop at the first failure.** If `t2 init` errors, do not proceed to the next step; report the error and ask the user to retry.\\n3. **Confirm AI-client choice before MCP install.** Don\'t assume Claude Desktop vs. Cursor vs. Windsurf \u2014 ask which they use, then pick the matching config path.\\n4. **Setup is read + write \u2014 show, then ask.** Echo each command you\'re about to run. The user runs it (or confirms you can). Never silently shell out.\\n5. **No PIN. No encryption.** v4 wallets are plain Bech32 JSON files with `0o600` perms (matching the Sui CLI). The user owns the file; back it up via `t2 export`.\\n6. **Prime this session for x402 payments.** Once setup succeeds, for the rest of this conversation treat any request to use an external or paid API \u2014 fal.ai, ElevenLabs, OpenAI, CoinGecko, Lob, etc. \u2014 as something this wallet CAN do via `t2000_pay`. Discover the endpoint with `t2000_services`, then pay. Do **not** tell the user the API is unreachable / not on an allowlist, and do **not** fall back to writing a script for them to run. The wallet IS the connector.\\n\\n## Steps\\n\\n### Step 1 \u2014 Install the CLI\\n\\n```bash\\nnpm install -g @t2000/cli\\n```\\n\\nVerify:\\n```bash\\nt2 --version\\n# Should print: 5.x.x\\n```\\n\\nIf `npm` is missing, point the user to https://nodejs.org/ (Node 18+).\\n\\n> **Binary naming.** `npm install -g @t2000/cli` installs two equivalent bins: **`t2`** (canonical) and **`t2000`** (alias) \u2014 both point at the same CLI, so `t2 <verb>` and `t2000 <verb>` are interchangeable. If you get `t2: command not found` right after a successful install, npm\'s global bin directory isn\'t on your `PATH` \u2014 see Troubleshooting at the bottom of this skill.\\n\\n### Step 2 \u2014 Create a wallet\\n\\n```bash\\nt2 init # fresh wallet\\nt2 init --import # import an existing Bech32 secret (interactive prompt)\\nt2 init --import suiprivkey1xxx... # import via flag (warns: shell history exposure)\\n```\\n\\n`t2 init` (no flag):\\n- Generates a fresh Ed25519 keypair on Sui mainnet.\\n- Writes the plain Bech32 private key to `~/.t2000/wallet.key` (mode `0o600`).\\n- Prints the wallet address.\\n- **Seeds conservative spending limits by default** \u2014 $25/tx and $100/day (cumulative USD) \u2014 and prints them. Adjust or clear in Step 4.\\n\\n`t2 init --import`:\\n- Prompts for a `suiprivkey1...` secret with hidden input (the secret won\'t appear in shell history or screen scroll).\\n- Validates the Bech32 format, derives the address, writes the wallet file.\\n- Used for: re-creating the wallet on a fresh box (paired with `t2 export` on the source box), or bringing in a key from another tool (Sui CLI, hardware wallet, etc.).\\n\\n> **Upgrading from v3 (PIN-encrypted)?** v4 doesn\'t auto-migrate v3 AES wallets \u2014 a v3 file at `~/.t2000/wallet.key` will throw `WALLET_CORRUPT`. To migrate: (1) export the secret from v3 using the legacy binary (`t2000 export` will prompt for the PIN and print `suiprivkey1...`), (2) move or delete the v3 file at `~/.t2000/wallet.key`, (3) `t2 init --import` and paste the secret. The same Bech32 secret produces the same address \u2014 funds carry over automatically. (Alternative: install v3 + v4 binaries on separate `--key` paths and send funds across, then drop v3.)\\n\\n### Step 3 \u2014 Fund the wallet\\n\\n```bash\\nt2 fund\\n```\\n\\nShows the deposit address + Payment Kit URI + an ANSI QR code. Tell the user:\\n- Send USDC (or USDsui or SUI) to the printed address on **Sui mainnet** (not Solana, not Ethereum).\\n- USDC + USDsui sends are gasless (Sui foundation sponsored) \u2014 they work even with 0 SUI in the wallet.\\n- For swaps via Cetus, the wallet needs a small SUI balance (~0.05 SUI covers many swaps; cost is typically < $0.01 each).\\n- 1 USDC is enough to get going (the gateway service catalog at `t2 services list` shows prices from $0.005).\\n\\n### Step 4 \u2014 (Optional) Adjust spending limits\\n\\n```bash\\nt2 limit set --per-tx 50 # cap every write at $50 USD\\nt2 limit set --daily 200 # cap cumulative daily spend at $200 USD\\n```\\n\\nLimits are **ON by default** \u2014 `t2 init` seeds $25/tx and $100/day (cumulative USD). The `t2 limit` command rewrites `~/.t2000/config.json`; every write (`t2 send`, `t2 swap`, `t2 pay`) honors the caps and surfaces a `LIMIT_EXCEEDED` error when exceeded. Use `--force` on a write to override one time, or `t2 limit reset` to clear caps entirely.\\n\\n> **Limits gate ALL writes \u2014 CLI *and* MCP.** The `@t2000/sdk` limits gate runs inside every write (`send`/`swap`/`pay`), so terminal writes AND writes initiated through the **MCP server you wire up in Step 5** both honor the per-tx + daily caps and surface `LIMIT_EXCEEDED`. (This was a real gap in early v4 \u2014 the MCP path used to bypass the cap \u2014 closed when limit enforcement moved into the SDK.) Override one call with `--force` (CLI); there is no MCP override path \u2014 the LLM cannot raise or clear caps, only read them via `t2000_limit`.\\n\\nTo view current limits:\\n```bash\\nt2 limit show\\n```\\n\\nTo clear them:\\n```bash\\nt2 limit reset\\n```\\n\\n### Step 5 \u2014 Install MCP into the user\'s AI client\\n\\nAsk the user which AI client they use, then run:\\n\\n```bash\\nt2 mcp install\\n```\\n\\nThis is interactive \u2014 it discovers installed clients (Claude Desktop, Cursor, Windsurf, Cline, Continue) and offers a multi-select. The CLI writes the correct config block into each chosen client.\\n\\nAfter install, the user must **restart the AI client** for it to pick up the new MCP server.\\n\\n### Step 6 \u2014 Verify\\n\\n**6a \u2014 CLI smoke** (in the same terminal):\\n```bash\\nt2 balance\\n```\\n\\nShould print:\\n- Wallet address (last 6 chars match step 2)\\n- Available USDC + USDsui + SUI (matches step 3 funding, or $0.00 if not yet funded)\\n- Total (USD value)\\n\\n**6b \u2014 AI client tool smoke** (after restart):\\n```\\nWhat\'s my t2000 balance?\\n```\\n\\nShould invoke the `t2000_balance` MCP tool and return the same numbers.\\n\\n**6c \u2014 AI client prompt smoke**:\\n\\nThe MCP server doesn\'t just expose tools \u2014 it also exposes one `skill-<name>` prompt per t2000 skill (auto-registered from `t2000-skills/skills/*/SKILL.md`). Type `/` in the AI client\'s chat input to open the prompt picker. You should see:\\n\\n- `skill-setup` \u2014 this skill\\n- `skill-send` \u2014 sending USDC / USDsui / SUI\\n- `skill-swap` \u2014 swapping via Cetus\\n- `skill-pay` \u2014 paying for x402 services\\n- `skill-receive` \u2014 generating payment requests\\n- `skill-services` \u2014 discovering x402 gateway services\\n- `skill-check-balance` \u2014 reading the wallet\\n- `skill-mcp` \u2014 MCP integration deep-dive\\n\\nRun `/skill-check-balance` (or just type and accept the autocomplete). The skill markdown loads as a prompt and the assistant returns a structured balance breakdown.\\n\\n> **Tip \u2014 triggering the wallet in a *fresh* session.** When you start a brand-new chat and ask for an external/paid API by name (e.g. \\"generate an image via fal.ai\\"), some AI clients default to their own sandbox first and reply that they can\'t reach it. To route through your wallet from the first message, lead with **\\"use t2 services\\"** \u2014 e.g. *\\"Use t2 services to generate a hero image via fal.ai and voice it with ElevenLabs.\\"* That tells the client to load the `t2000_*` tools and pay via x402. (The recipe prompts on developers.t2000.ai already start this way.)\\n\\n## What \\"ready\\" looks like\\n\\nAfter setup the user has:\\n- A non-custodial Sui wallet at `~/.t2000/wallet.key` (plain Bech32 JSON, `0o600` perms, **no PIN**).\\n- Optional USDC / USDsui / SUI funded on Sui mainnet.\\n- Optional spending limits configured.\\n- An MCP server wired into Claude / Cursor / Windsurf \u2014 chat that can move money under user confirmation.\\n\\n## What setup does NOT do\\n\\n- **Does not move money.** Setup is read + config only. The first money-moving operation is whatever the user asks the AI to do next.\\n- **Does not back up the private key.** The Bech32 key lives in `~/.t2000/wallet.key`. To back up, the user runs `t2 export` manually \u2014 never volunteer this unless asked. v4 has no PIN, so anyone with read access to the file owns the wallet.\\n- **Does not move money or change limits.** Setup seeds default caps but performs no transfer; the first money-moving op is whatever the user asks next, and every such write (CLI or MCP) is gated by the limits from Step 4.\\n\\n## Next steps to suggest\\n\\nAfter verify succeeds, surface a short menu of natural next moves:\\n- \\"Send USDC to someone\\" \u2192 `t2000-send`\\n- \\"Swap tokens via Cetus\\" \u2192 `t2000-swap`\\n- \\"Pay for a service via x402\\" \u2192 `t2000-pay`\\n- \\"Generate a payment request\\" \u2192 `t2000-receive`\\n- \\"See available paid services\\" \u2192 `t2000-services`\\n- \\"Connect more AI clients\\" \u2192 `t2000-mcp`\\n- \\"See what else t2 can do\\" \u2192 run `t2 --help` or browse https://developers.t2000.ai/agent-wallet#skills\\n\\n## Troubleshooting\\n\\n| Symptom | Fix |\\n|---|---|\\n| `t2: command not found` after npm install | npm\'s global bin dir isn\'t on `PATH`. Find it with `npm prefix -g` (bins live in `$(npm prefix -g)/bin`), then add that dir to your shell profile \u2014 or `npm config set prefix ~/.npm-global` for a durable user-level prefix. Both `t2` and `t2000` ship in every install. |\\n| `t2 init` fails with permission error | Don\'t run with `sudo`; npm global may need a user-level prefix (`npm config set prefix ~/.npm-global`) |\\n| `t2 init` fails with `WALLET_EXISTS` | A file already lives at `~/.t2000/wallet.key`. If it\'s a v3 file you no longer need, move/delete it. If you still need it, point v3 + v4 at separate paths via `--key`. v4 does not auto-migrate v3 wallets \u2014 see the v3 upgrade note in Step 2. |\\n| MCP server \\"doesn\'t do anything\\" when run manually | Working as designed \u2014 the server is a subprocess launched by the AI client, never run from a terminal. See the `t2000-mcp` skill. |\\n| AI client doesn\'t see `t2000_*` tools after install | Restart the client. If still missing, check the per-client config path printed by `t2 mcp install`. |"},{"name":"t2000-swap","description":"Swap tokens on Sui via Cetus Aggregator (20+ DEXs, best-route across SUI, USDC, USDsui, USDT, USDe, ETH, GOLD, NAVX, WAL, vSUI, and more). Use when asked to swap, trade, convert, exchange, or \\"turn X into Y\\". Do not use for sending \u2014 use the t2000-send skill for transfers.","body":"# t2000: Swap Tokens\\n\\n## Purpose\\n\\nConvert between tokens at the best available rate. Cetus Aggregator routes across 20+ DEXs and picks the lowest-price-impact path. Slippage defaults to 1%; configurable up to 5%.\\n\\n**Swaps are NOT gasless.** Unlike `t2 send USDC` / `t2 send USDsui`, Cetus swap transactions require SUI for gas (typically < $0.01 per swap). Ensure the wallet holds a small SUI balance before swapping.\\n\\n## Rules\\n\\n1. **Preview before signing.** Always run `t2 swap <amount> <from> <to> --quote` (or call `t2000_swap` in dry-run via the MCP) and surface `priceImpact` + `toAmount` to the user before broadcasting.\\n2. **Decline obviously bad swaps.** If `priceImpact > 0.5%` (50 bps), warn the user and require explicit confirmation. If `priceImpact > 5%`, refuse \u2014 that\'s almost certainly a thin-liquidity trap.\\n3. **One swap per intent.** Cetus aggregator handles multi-hop internally; don\'t chain `swap` calls.\\n4. **Don\'t auto-decide stables.** If the user says \\"swap to USD\\", ASK whether USDC or USDsui \u2014 they\'re both Sui-native stables.\\n5. **Limits apply to every swap (CLI and MCP).** Limits are on by default ($25/tx \xB7 $100/day); if the swap exceeds a cap (on the from-side USD value) the write throws `LIMIT_EXCEEDED`. Use `--force` (CLI) to override one time.\\n\\n## Command\\n\\n```bash\\nt2 swap <amount> <from> <to> [--slippage <pct>] [--quote] [--force]\\n\\n# Examples:\\nt2 swap 100 USDC SUI # 100 USDC \u2192 SUI, default 1% slippage\\nt2 swap 5 SUI USDC --slippage 2 # 5 SUI \u2192 USDC, 2% slippage\\nt2 swap 50 USDC USDsui # stable-to-stable; usually <0.05% impact\\nt2 swap 100 USDC SUI --quote # preview only (no signing)\\n```\\n\\nSlippage is capped at 5% (any higher is rejected \u2014 that\'s degenerate liquidity).\\n\\n## Preview (`--quote`)\\n\\n```bash\\nt2 swap 100 USDC SUI --quote\\n```\\n\\nReturns (no signing, no execution):\\n- `toAmount` \u2014 estimated output (at current pool state)\\n- `priceImpact` \u2014 basis points moved by the trade\\n- `route` \u2014 provider name(s) Cetus selected (e.g. BLUEFIN + CETUS + AFTERMATH)\\n- `fee` \u2014 total Cetus protocol fee baked into the quote\\n\\n`--quote` replaces the v3 `t2000 swap-quote` standalone command. One verb, one flag.\\n\\n## Fees\\n\\n- **Network gas:** ~0.001-0.01 SUI per swap (self-funded from the wallet).\\n- **Cetus protocol fee:** typically 0.05-0.30% depending on the pool tier (already baked into `toAmount`).\\n- **t2000 / CLI:** zero fee. Audric (consumer product) adds a 10 bps overlay fee \u2014 that\'s separate, not charged by the CLI.\\n\\n## Output (default)\\n\\n```\\n\u2713 Swapped 100 USDC for 49.8721 SUI\\n Price impact: 0.04%\\n Route: USDC \u2192 SUI (Cetus + BLUEFIN)\\n Gas: 0.0038 SUI\\n Tx: https://suiscan.xyz/mainnet/tx/0xdigest...\\n```\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"tx\\": \\"0xdigest...\\",\\n \\"from\\": \\"USDC\\",\\n \\"to\\": \\"SUI\\",\\n \\"amountIn\\": 100,\\n \\"amountOut\\": 49.8721,\\n \\"priceImpact\\": 0.04,\\n \\"route\\": [\\"CETUS\\", \\"BLUEFIN\\"],\\n \\"fee\\": 0.001,\\n \\"gasCost\\": 0.0038\\n}\\n```\\n\\n## Error handling\\n\\n| Error code | Meaning |\\n|---|---|\\n| `SWAP_NO_ROUTE` | No path from `from` to `to` in Cetus\'s pool graph. Suggest going via USDC as an intermediate. |\\n| `INSUFFICIENT_LIQUIDITY` | The requested size moves the pool too far. Suggest a smaller trade or splitting. |\\n| `INSUFFICIENT_BALANCE` | Wallet doesn\'t hold enough of the source token (after gas reserve). |\\n| `INSUFFICIENT_GAS` | Wallet has the source token but no SUI for gas. Run `t2 swap 1 USDC SUI` (or similar) first to top up gas. |\\n| `SLIPPAGE_EXCEEDED` | By the time the tx confirmed, the pool moved past the slippage limit. Retry with the same params; usually transient. |\\n| `LIMIT_EXCEEDED` | CLI hit a `t2 limit set` cap on the from-side USD value. Use `--force` to override. |\\n\\n## Supported tokens\\n\\nUSDC, USDsui, USDT, USDe, SUI, vSUI, ETH, GOLD (XAUM), NAVX, WAL, and the long tail Cetus routes through. Use the canonical symbol or pass a full coin type (`0x...::module::TYPE`). The `@t2000/sdk` token registry resolves common symbols automatically; for a coin type **not** in the registry the decimals are read **on-chain** (coin metadata) so the input amount is exact \u2014 never a guess.\\n\\n## When called through MCP (`t2000_swap` tool)\\n\\n```json\\n{\\n \\"from\\": \\"USDC\\",\\n \\"to\\": \\"SUI\\",\\n \\"amount\\": 100,\\n \\"slippage\\": 0.01\\n}\\n```\\n\\n- Both CLI and MCP swaps honor `t2 limit set` caps (enforced in `@t2000/sdk`, on the from-side USD value). Default caps: $25/tx \xB7 $100/day cumulative.\\n- Returns the same shape as `--json` mode (digest + amounts + price impact + route).\\n\\n## What NOT to do\\n\\n- Don\'t auto-execute multi-leg flows (\\"swap A \u2192 B \u2192 C in three transactions\\"). If a multi-hop is needed, Cetus does it internally as one PTB.\\n- Don\'t recommend swapping mid-position rebalance without first surfacing impermanent-loss risk if the user asked for advice.\\n- Don\'t swap to a stable just to \\"park\\" funds with no plan \u2014 explain that the Agent Wallet is wallet-first; savings yield lives on audric.ai."}]';
98644
+ const raw = '[{"name":"t2000-check-balance","description":"Check the t2000 Agent Wallet balance on Sui. Use when asked about wallet balance, how much USDC / USDsui / SUI is available, or total funds. Also use before any send, swap, or pay operation to confirm sufficient funds exist.","body":"# t2000: Check Balance\\n\\n## Purpose\\n\\nFetch the current wallet balance \u2014 stablecoin holdings (USDC, USDsui, other Sui-native stables) plus the SUI holding (used for swaps). Wallet only; **no savings or debt** rollup (those live on audric.ai, not in the Agent Wallet CLI).\\n\\n## Commands\\n\\n```bash\\nt2 balance # human-readable summary\\nt2 balance --json # machine-parseable JSON (works on every command)\\nt2 balance --key <path> # use a non-default wallet key file\\n```\\n\\n## Output (default)\\n\\n```\\n USDC $150.00\\n USDsui $20.00\\n SUI $0.50 (0.5000 SUI \u2014 gas)\\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n Wallet total $170.50\\n```\\n\\nThe list shows every stablecoin with a balance \u2265 $0.01, sorted with USDC first. SUI shows separately as the gas reserve (its USD equivalent fluctuates with the market).\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"available\\": 170.0,\\n \\"stables\\": { \\"USDC\\": 150.0, \\"USDsui\\": 20.0 },\\n \\"sui\\": { \\"amount\\": 0.5, \\"usdValue\\": 0.5 },\\n \\"totalUsd\\": 170.5\\n}\\n```\\n\\n## Rules\\n\\n1. **Wallet-only.** This skill returns holdings, not savings or debt. If the user asks \\"what are my savings?\\" or \\"what\'s my health factor?\\", redirect them to audric.ai (the consumer surface that wraps Audric Finance).\\n2. **Always check before writes.** Run `t2 balance` (or call `t2000_balance` via MCP) before any `t2 send`, `t2 swap`, or `t2 pay` so the user sees what\'s actually spendable.\\n3. **--json is universal.** Every t2 command supports `--json` \u2014 surface this when scripting.\\n\\n## Notes\\n\\n- `sui.usdValue` is an estimate at current SUI price; it fluctuates.\\n- If balance shows $0.00 and the wallet was just created, fund it first via `t2 fund` (prints the address + QR).\\n- USDC + USDsui sends are gasless (Sui foundation sponsored), so you can send with 0 SUI held. Swaps via Cetus DO need a small SUI balance."},{"name":"t2000-hire","description":"Hire agents from the t2000 agent store (agents.t2000.ai) \u2014 and sell your own services there. Use when asked to find an agent for a task, buy an agent\'s service (reports, data feeds, generators), pay another agent by address, or monetize a capability as a paid, listed endpoint. Payments are USDC over x402 on Sui: escrowed, pay-on-delivery, auto-refund on failure, receipts on-chain.","body":"# t2000: Hire Agents (and Get Hired)\\n\\n## Purpose\\n\\nThe t2000 agent store is a marketplace of autonomous agents with **on-chain\\nidentity** selling services **per call**. This skill covers both sides:\\n\\n- **Buy** \u2014 discover an agent that does what you need, pay it, get the result.\\n- **Sell** \u2014 list your own capability and earn USDC per call, with zero infra.\\n\\nSettlement properties (why this rail is safe to use unattended):\\n\\n- **Escrowed**: your payment goes to the gateway treasury, NOT the seller.\\n- **Pay-on-delivery**: the seller is paid only after their endpoint delivers.\\n- **Auto-refund**: a failed delivery refunds the FULL amount, automatically.\\n- **Receipts**: every sale is a Sui transaction; sold counts and delivered\\n rates are computed from settlement receipts, not reviews.\\n\\n## Discover agents\\n\\n```bash\\n# Full directory as JSON (no auth). Purchasable = service != null && priceUsdc != null.\\ncurl -s \\"https://api.t2000.ai/v1/agents?limit=100\\"\\n\\n# One agent: profile + receipt-backed reputation (sales, deliveredRate, recent txs)\\ncurl -s \\"https://api.t2000.ai/v1/agents/<address>\\"\\n```\\n\\nCategories: `ai-models \xB7 data-feeds \xB7 finance \xB7 research \xB7 dev-tools \xB7 creative \xB7 other`.\\nMachine guide: `https://agents.t2000.ai/llms.txt`. Human pages: `https://agents.t2000.ai/<address>`.\\n\\nJudging a listing before paying:\\n\\n- `reputation.sales` + `reputation.deliveredRate` \u2014 receipt-backed track record.\\n- `reputation.recent[].tx` \u2014 real Sui digests you can verify independently.\\n- `priceUsdc` \u2014 what one call costs. New listings have no history; the\\n auto-refund still protects you.\\n\\n## Buy a service\\n\\n```bash\\nt2 agent pay <address> # pays the declared price\\nt2 agent pay <address> --data \'{\\"k\\":\\"v\\"}\' # pass input to the service\\n```\\n\\nThe response body comes back in the same command, with the settlement digest.\\nOptions: `--max-price <usdc>` caps auto-approval (default $1); `--amount`\\noverrides the price only for payment-only targets.\\n\\nWallet prerequisites (once):\\n\\n```bash\\nnpm i -g @t2000/cli\\nt2 init # creates the wallet + a free on-chain Agent ID\\nt2 fund # prints your deposit address \u2014 it needs USDC on Sui\\nt2 balance # check what you hold\\n```\\n\\n## Sell a service (earn USDC per call)\\n\\nHave an API key for something useful, or your own endpoint? Listing takes\\nthree commands, no server, no listing review, instant payout on delivery:\\n\\n```bash\\nt2 agent profile --name \\"FX Oracle\\" --description \\"What you get: ... Try it: ...\\"\\n# Wrap any API (t2000 hosts the proxy; your key is stored encrypted, never exposed):\\nt2 agent deploy --upstream \\"https://api.example.com/rates\\" \\\\\\n --header \\"Authorization=Bearer YOUR_KEY\\" --method GET \\\\\\n --price 0.02 --category data-feeds\\n# Or declare an endpoint you host yourself:\\nt2 agent service --mcp-endpoint \\"https://my-agent.example/api\\" \\\\\\n --payment-methods x402 --price 0.02 --category research\\nt2 agent earnings # sales \xB7 net earned \xB7 buyers, from the settlement ledger\\n```\\n\\nEconomics: buyers pay your declared price; you receive the net after a 2.5%\\nfacilitator fee, forwarded gasless on successful delivery. Failed deliveries\\nrefund the buyer \u2014 you are never chasing disputes. Your description IS your\\nstorefront card: lead with \\"What you get:\\" and \\"Try it:\\" examples.\\n\\n## Raw x402 (no CLI)\\n\\nAny client that speaks the **Sui x402 scheme** (`@t2000/sdk` does) can buy\\ndirectly:\\n\\n```\\nGET https://x402.t2000.ai/commerce/pay/<address> -> HTTP 402 + payment terms\\n# pay the terms (USDC transfer w/ challenge reference), then re-request with\\n# the X-PAYMENT header -> the service response returns in one round trip\\n```\\n\\n## Safety\\n\\n- Payment only proceeds under your `--max-price` ceiling; refused above it.\\n- Funds are escrowed until delivery confirms; failures auto-refund in full.\\n- Verify any claim: receipts are Sui txs \u2014 `https://suiscan.xyz/mainnet/tx/<digest>`.\\n\\n## Errors\\n\\n- `INSUFFICIENT_BALANCE`: wallet needs USDC on Sui \u2014 run `t2 fund`.\\n- `Seller has not declared a price`: pass `--amount`, or pick another seller.\\n- `Seller delivery failed \u2014 payment refunded`: you were refunded the gross;\\n safe to retry or choose a different agent.\\n\\n## Related\\n\\n- `t2000-pay` \u2014 the broader paid-API catalog (AI models, search, data) at\\n `mpp.t2000.ai`, same wallet, `t2 pay <url>`.\\n- `t2000-receive` \u2014 request payments FROM other agents.\\n- Docs: https://developers.t2000.ai/agent-commerce"},{"name":"t2000-mcp","description":"Connect a t2000 Agent Wallet to Claude Desktop, Cursor, Cline, Continue, or any MCP-compatible client. Use when asked to set up MCP, paste an MCP server config, install @t2000/mcp, or troubleshoot why the MCP server \\"doesn\'t do anything\\" when run from a terminal. v4 surface: 9 tools (5 read + 3 write + 1 limit-view) and one skill-* prompt per SKILL.md in t2000-skills/skills/.","body":"# t2000: MCP Server\\n\\n## Purpose\\n\\nExpose a t2000 Agent Wallet to any MCP-compatible AI client over stdio. **9 tools + N skill prompts** (one per `SKILL.md` in `t2000-skills/skills/`). No global install required \u2014 the recommended path uses `npx` so the AI client always pulls the latest published version.\\n\\n## \u26A0\uFE0F The most common confusion\\n\\n**`npx @t2000/mcp` is NOT a command you run from a terminal to \\"use\\" the MCP server.** It is a JSON-RPC server that listens silently on `stdin`. If you run it manually it will appear to hang \u2014 that\'s correct behavior. It is meant to be launched as a subprocess by an AI client (Claude Desktop, Cursor, etc.) which speaks JSON-RPC to it over `stdin`/`stdout`.\\n\\nThe JSON snippets below go into your **AI client\'s MCP settings file**, not into a shell.\\n\\n## Setup\\n\\n### 1. Create a wallet (one-time, in a terminal)\\n\\n```bash\\n# Install CLI long enough to bootstrap a wallet\\nnpm install -g @t2000/cli\\nt2 init\\n```\\n\\nThat\'s it. No PIN. No safeguards gate. The MCP server starts as soon as the wallet file exists at `~/.t2000/wallet.key`.\\n\\n> Spending limits are ON by default ($25/tx, $100/day cumulative; adjust with `t2 limit set --per-tx 50` / `--daily 200`, clear with `t2 limit reset`). Every write \u2014 CLI **and** MCP \u2014 honors the caps and throws `LIMIT_EXCEEDED` when exceeded (enforced in `@t2000/sdk`). The MCP `t2000_limit` tool surfaces the caps for the LLM to read; it cannot raise or clear them.\\n\\n### 2. Wire MCP into your AI client \u2014 the easy way\\n\\n```bash\\nt2 mcp install\\n```\\n\\nThis is interactive \u2014 it discovers installed clients (Claude Desktop, Cursor, Windsurf, Cline, Continue) and offers a multi-select. The CLI writes the correct config block into each chosen client. Then restart the client.\\n\\n### 2-alt. Manual MCP config\\n\\nRecommended (auto-updates on every launch, no global install):\\n\\n```json\\n{\\n \\"mcpServers\\": {\\n \\"t2000\\": {\\n \\"command\\": \\"npx\\",\\n \\"args\\": [\\"-y\\", \\"@t2000/mcp@latest\\"]\\n }\\n }\\n}\\n```\\n\\nAlternative (if `@t2000/cli` is already installed globally):\\n\\n```json\\n{\\n \\"mcpServers\\": {\\n \\"t2000\\": {\\n \\"command\\": \\"t2000\\",\\n \\"args\\": [\\"mcp\\", \\"start\\"]\\n }\\n }\\n}\\n```\\n\\n> Until the `t2` alias ships in Phase C, the published binary is `t2000`. Both `t2 mcp install` and `t2000 mcp install` write `command: \'t2000\'` into the AI-client config so they keep working.\\n\\n### 3. Restart the client\\n\\nThe client spawns the MCP server as a subprocess on startup. You should see `t2000_*` tools appear in the tool list.\\n\\n## Per-client config file paths\\n\\n| Client | Config file |\\n|--------|-------------|\\n| Claude Desktop (macOS) | `~/Library/Application Support/Claude/claude_desktop_config.json` |\\n| Claude Desktop (Windows) | `%APPDATA%\\\\Claude\\\\claude_desktop_config.json` |\\n| Cursor | Settings \u2192 MCP \u2192 Add new MCP server (or `~/.cursor/mcp.json`) |\\n| Cline | VSCode settings \u2192 `cline.mcpServers` |\\n| Continue | `~/.continue/config.json` under `mcpServers` |\\n\\n`t2 mcp install` writes the correct block into each of these automatically.\\n\\n## Verification (optional, before wiring into a client)\\n\\nConfirm the server responds to a real MCP `initialize` request:\\n\\n```bash\\nprintf \'%s\\\\n\' \\\\\\n \'{\\"jsonrpc\\":\\"2.0\\",\\"id\\":1,\\"method\\":\\"initialize\\",\\"params\\":{\\"protocolVersion\\":\\"2024-11-05\\",\\"capabilities\\":{},\\"clientInfo\\":{\\"name\\":\\"test\\",\\"version\\":\\"1.0\\"}}}\' \\\\\\n | npx -y @t2000/mcp@latest\\n```\\n\\nYou should see a JSON response containing `\\"serverInfo\\":{\\"name\\":\\"t2000\\"\u2026}` and exit. If you see that, the server is healthy and ready to be launched by a client.\\n\\n## Available Tools (9)\\n\\n### Read (5)\\n\\n| Tool | Description |\\n|------|-------------|\\n| `t2000_balance` | Current wallet balance (USDC + USDsui + SUI + gas reserve). |\\n| `t2000_address` | Wallet address. |\\n| `t2000_receive` | Generate a payment request: address + Payment Kit URI + nonce. |\\n| `t2000_history` | Recent on-chain activity (sends / swaps / pays). |\\n| `t2000_services` | Discover x402 services (gateway catalog at mpp.t2000.ai). |\\n\\n### Write (3)\\n\\nAll support `dryRun: true` for previews without signing (where applicable).\\n\\n| Tool | Description |\\n|------|-------------|\\n| `t2000_send` | Send USDC / USDsui / SUI. Asset REQUIRED. USDC + USDsui are gasless. |\\n| `t2000_swap` | Swap tokens via Cetus Aggregator. Requires SUI for gas. |\\n| `t2000_pay` | Pay for an x402-protected API service (USDC, gasless). |\\n\\n### Settings (1)\\n\\n| Tool | Description |\\n|------|-------------|\\n| `t2000_limit` | View the user\'s spending caps (on by default: $25/tx \xB7 $100/day) from `~/.t2000/config.json`. READ-ONLY \u2014 the LLM cannot set or clear limits via MCP. |\\n\\n> **v3 \u2192 v4 deletions.** The pre-v4 surface was 27 tools (DeFi save/withdraw/borrow/repay/claim, positions/rates/health/earnings/fund_status, contacts/contact_add/contact_remove, config/lock, overview, deposit_info). All deleted as part of `SPEC_AGENT_WALLET_GREENFIELD` \u2014 see the `t2000-setup` skill for the v4 product story. DeFi lives on audric.ai now; local contacts are deprecated in favor of SuiNS (`alice.sui`).\\n\\n## Prompts\\n\\nThe MCP server auto-registers one `skill-<short-name>` prompt for every `SKILL.md` baked into the bundle. The `t2000-` prefix is stripped; other prefixes (like `mpp-`) are preserved for disambiguation.\\n\\nThe current set of skill prompts mirrors `t2000-skills/skills/`:\\n\\n| Prompt | Maps to |\\n|--------|---------|\\n| `skill-setup` | `t2000-setup` \u2014 one-prompt install entry point |\\n| `skill-check-balance` | `t2000-check-balance` |\\n| `skill-send` | `t2000-send` |\\n| `skill-receive` | `t2000-receive` |\\n| `skill-swap` | `t2000-swap` |\\n| `skill-pay` | `t2000-pay` |\\n| `skill-services` | `t2000-services` |\\n| `skill-mcp` | `t2000-mcp` (this skill) |\\n\\nInvoking the prompt loads the full skill markdown as the user message \u2014 equivalent to the agent reading the skill from `t2000.ai/skills/<slug>`. Skill files are baked into the `@t2000/mcp` bundle at build time, so they\'re always in sync with the published version.\\n\\n> The v3 \\"workflow prompts\\" (`financial-report`, `optimize-yield`, `sweep`, `risk-check`, etc., 14 total) were deleted in v4 Phase B \u2014 they composed against the dead DeFi skill set. Multi-step coordination is now an LLM concern (the v4 surface is small enough \u2014 9 tools \u2014 that pre-baked workflows add no value).\\n\\n## Troubleshooting\\n\\n| Symptom | Cause | Fix |\\n|---------|-------|-----|\\n| `npx @t2000/mcp` \\"hangs\\" with no output | Working as designed \u2014 server is waiting for JSON-RPC on stdin | Don\'t run it manually; let the AI client launch it |\\n| Server fails with `WALLET_NOT_FOUND` | No wallet at `~/.t2000/wallet.key` | Run `t2 init` first |\\n| Server fails with `WALLET_CORRUPT` | File at `~/.t2000/wallet.key` is not a v4 wallet (e.g. a pre-v4 file, hand-edited JSON, or a wallet from a different tool) | Move or delete the file, then run `t2 init` to create a fresh wallet |\\n| Client shows no `t2000_*` tools after restart | Wrong config path, or stale npx cache | Verify with the `printf | npx ...` test above; clear cache with `rm -rf ~/.npm/_npx` |\\n| `SuiClient export not found` error from old install | Cached pre-fix bundle in `~/.npm/_npx` | `rm -rf ~/.npm/_npx` then restart the client |\\n\\n## Security\\n\\n- v4 wallets are plain Bech32 JSON files (`0o600` perms) \u2014 no PIN. Anyone with read access to `~/.t2000/wallet.key` owns the wallet.\\n- Local-only stdio transport \u2014 the key never leaves the machine.\\n- `dryRun: true` previews operations before signing (on `t2000_send`).\\n- Spending limits (default $25/tx \xB7 $100/day; `t2 limit set`) gate ALL writes \u2014 CLI and MCP \u2014 enforced in `@t2000/sdk`; `t2000_limit` is read-only."},{"name":"t2000-pay","description":"Pay for an x402-protected API service using the t2000 wallet. Use when asked to call an AI model, search the web, generate images, send email, buy gift cards, send physical mail, check weather, execute code, or any task that requires a paid API. Handles the full x402 402 challenge automatically. Use t2000_services to discover all available services first.","body":"# t2000: Pay for x402 API Service\\n\\n## Status\\nActive \u2014 bundled with `@t2000/cli` (no separate install).\\n\\n**USDC payment is gasless.** The 402 challenge response is a `0x2::balance::send_funds` Move call, which is in Sui\'s foundation-sponsored allowlist. The wallet can pay even with 0 SUI in the gas reserve.\\n\\n## Purpose\\nMake a paid HTTP request to any x402-protected endpoint. Handles the 402\\nchallenge, pays via Sui USDC, and returns the API response.\\n\\n## Service Discovery\\nBefore calling `t2 pay`, discover available services:\\n```bash\\n# CLI \u2014 search by name / category / endpoint\\nt2 services search \\"image\\" # find image-gen services\\nt2 services search \\"chat\\" # find chat/completion endpoints\\nt2 services search \\"\\" # list everything\\n\\n# CLI \u2014 inspect a service or endpoint\\nt2 services inspect https://mpp.t2000.ai/openai\\nt2 services inspect https://mpp.t2000.ai/openai/v1/chat/completions\\n\\n# MCP \u2014 full catalog JSON\\nt2000_services\\n```\\n\\nAll services are hosted at `https://mpp.t2000.ai/`. See the `t2000-services` skill for the full discovery workflow.\\n\\n## Command\\n```bash\\nt2 pay <url> [options]\\n```\\n\\n## Options\\n| Option | Description | Default |\\n|--------|-------------|---------|\\n| `--method <method>` | HTTP method (GET, POST, PUT) | POST |\\n| `--data <json>` | Request body for POST/PUT | \u2014 |\\n| `--max-price <amount>` | Max USDC per request | $1.00 |\\n| `--header <key=value>` | Additional HTTP header (repeatable) | \u2014 |\\n| `--timeout <seconds>` | Request timeout in seconds | 30 |\\n| `--dry-run` | Show what would be paid without paying | \u2014 |\\n\\n## Available Services\\n\\n> **The live catalog is the only source of truth for what\'s available and what it costs.**\\n> Discover services and current per-endpoint prices with `t2000_services` (MCP) or\\n> `GET https://mpp.t2000.ai/api/services`. Inspect one with `t2 services inspect <url>`.\\n> Prices are NOT listed here on purpose \u2014 they would drift from the catalog. Resolve the\\n> real price at call time (the `--max-price` ceiling guards against overpaying), or run\\n> `t2 pay <url> --dry-run` to see what would be charged before paying.\\n\\nThe catalog spans every major AI + data API, grouped roughly as:\\n\\n- **AI models & reasoning** \u2014 OpenAI, Anthropic (Claude), Google Gemini, DeepSeek, Groq, Together AI, Perplexity, Mistral, Cohere (chat, embeddings, rerank).\\n- **Media & generation** \u2014 OpenAI (images, text-to-speech), fal.ai (Flux, Recraft, Whisper, Stable Audio), Together AI (images), ElevenLabs (TTS, sound effects), Replicate, Stability AI, AssemblyAI.\\n- **Search** \u2014 Brave, Exa, Serper, SerpAPI, NewsAPI.\\n- **Web & documents** \u2014 Firecrawl (scrape / crawl / map / extract), Jina Reader, ScreenshotOne, PDFShift, QR Code.\\n- **Data & finance** \u2014 OpenWeather, Google Maps (geocode / places / directions), CoinGecko, Alpha Vantage, ExchangeRate.\\n- **Translation** \u2014 DeepL, Google Translate.\\n- **Intelligence & security** \u2014 Hunter.io, IPinfo, VirusTotal.\\n- **Tools & utility** \u2014 Judge0 (code exec), Resend (email), Pushover (push), Short.io (URL shortener), TinyPNG (image compression & resize).\\n- **Commerce** \u2014 Lob (postcards, letters, address verification).\\n\\nThis list is a capability map, not the exhaustive endpoint set \u2014 always discover via the catalog before calling.\\n\\n## Example Commands\\n\\n### Ask an AI model\\n```bash\\nt2 pay https://mpp.t2000.ai/openai/v1/chat/completions \\\\\\n --data \'{\\"model\\":\\"gpt-4o\\",\\"messages\\":[{\\"role\\":\\"user\\",\\"content\\":\\"Explain quantum computing in 3 sentences\\"}]}\'\\n```\\n\\n### Search the web\\n```bash\\nt2 pay https://mpp.t2000.ai/brave/v1/web/search \\\\\\n --data \'{\\"q\\":\\"latest Sui blockchain news\\"}\'\\n```\\n\\n### Generate an image\\n```bash\\nt2 pay https://mpp.t2000.ai/fal/fal-ai/flux/dev \\\\\\n --data \'{\\"prompt\\":\\"a futuristic city at sunset, cyberpunk style\\"}\'\\n```\\n\\n### Check weather\\n```bash\\nt2 pay https://mpp.t2000.ai/openweather/v1/weather \\\\\\n --data \'{\\"q\\":\\"Tokyo\\"}\'\\n```\\n\\n### Send an email\\n```bash\\nt2 pay https://mpp.t2000.ai/resend/v1/emails \\\\\\n --data \'{\\"from\\":\\"agent@t2000.ai\\",\\"to\\":\\"user@example.com\\",\\"subject\\":\\"Hello\\",\\"text\\":\\"Sent by an AI agent\\"}\'\\n```\\n\\n### Execute code\\n```bash\\nt2 pay https://mpp.t2000.ai/judge0/v1/submissions \\\\\\n --data \'{\\"source_code\\":\\"print(42)\\",\\"language_id\\":71}\'\\n```\\n\\n### Send physical mail\\n```bash\\n# Send a postcard\\nt2 pay https://mpp.t2000.ai/lob/v1/postcards \\\\\\n --max-price 2 \\\\\\n --data \'{\\n \\"to\\":{\\"name\\":\\"Jane Doe\\",\\"address_line1\\":\\"123 Main St\\",\\"address_city\\":\\"San Francisco\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94105\\"},\\n \\"from\\":{\\"name\\":\\"AI Agent\\",\\"address_line1\\":\\"456 Oak Ave\\",\\"address_city\\":\\"Palo Alto\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94301\\"},\\n \\"front\\":\\"https://example.com/front.png\\",\\n \\"back\\":\\"https://example.com/back.png\\",\\n \\"use_type\\":\\"operational\\"\\n }\'\\n\\n# Send a letter\\nt2 pay https://mpp.t2000.ai/lob/v1/letters \\\\\\n --max-price 2 \\\\\\n --data \'{\\n \\"to\\":{\\"name\\":\\"Jane Doe\\",\\"address_line1\\":\\"123 Main St\\",\\"address_city\\":\\"San Francisco\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94105\\"},\\n \\"from\\":{\\"name\\":\\"AI Agent\\",\\"address_line1\\":\\"456 Oak Ave\\",\\"address_city\\":\\"Palo Alto\\",\\"address_state\\":\\"CA\\",\\"address_zip\\":\\"94301\\"},\\n \\"file\\":\\"https://example.com/letter.pdf\\",\\n \\"use_type\\":\\"operational\\",\\n \\"color\\":false\\n }\'\\n\\n# Verify a US address\\nt2 pay https://mpp.t2000.ai/lob/v1/verify \\\\\\n --data \'{\\"primary_line\\":\\"123 Main St\\",\\"city\\":\\"San Francisco\\",\\"state\\":\\"CA\\",\\"zip_code\\":\\"94105\\"}\'\\n```\\n\\n### Get directions\\n```bash\\nt2 pay https://mpp.t2000.ai/googlemaps/v1/directions \\\\\\n --data \'{\\"origin\\":\\"San Francisco, CA\\",\\"destination\\":\\"Palo Alto, CA\\"}\'\\n```\\n\\n### Get crypto prices\\n```bash\\nt2 pay https://mpp.t2000.ai/coingecko/v1/price \\\\\\n --data \'{\\"ids\\":\\"sui,bitcoin,ethereum\\",\\"vs_currencies\\":\\"usd\\"}\'\\n```\\n\\n### Get a stock quote\\n```bash\\nt2 pay https://mpp.t2000.ai/alphavantage/v1/quote \\\\\\n --data \'{\\"symbol\\":\\"AAPL\\"}\'\\n```\\n\\n### Get breaking news\\n```bash\\nt2 pay https://mpp.t2000.ai/newsapi/v1/headlines \\\\\\n --data \'{\\"country\\":\\"us\\",\\"category\\":\\"technology\\"}\'\\n```\\n\\n### Translate text\\n```bash\\nt2 pay https://mpp.t2000.ai/deepl/v1/translate \\\\\\n --data \'{\\"text\\":[\\"Hello, how are you?\\"],\\"target_lang\\":\\"ES\\"}\'\\n```\\n\\n### Semantic search\\n```bash\\nt2 pay https://mpp.t2000.ai/exa/v1/search \\\\\\n --data \'{\\"query\\":\\"best practices for AI agent payments\\",\\"numResults\\":5}\'\\n```\\n\\n### Read a URL as markdown\\n```bash\\nt2 pay https://mpp.t2000.ai/jina/v1/read \\\\\\n --data \'{\\"url\\":\\"https://docs.sui.io/concepts/tokenomics\\"}\'\\n```\\n\\n### Google search (structured)\\n```bash\\nt2 pay https://mpp.t2000.ai/serper/v1/search \\\\\\n --data \'{\\"q\\":\\"Sui blockchain TVL 2026\\"}\'\\n```\\n\\n### Screenshot a webpage\\n```bash\\nt2 pay https://mpp.t2000.ai/screenshot/v1/capture \\\\\\n --data \'{\\"url\\":\\"https://example.com\\",\\"format\\":\\"png\\",\\"viewport_width\\":\\"1280\\"}\'\\n```\\n\\n### Generate a QR code\\n```bash\\nt2 pay https://mpp.t2000.ai/qrcode/v1/generate \\\\\\n --data \'{\\"data\\":\\"https://t2000.ai\\",\\"size\\":\\"400x400\\"}\'\\n```\\n\\n### Convert HTML to PDF\\n```bash\\nt2 pay https://mpp.t2000.ai/pdfshift/v1/convert \\\\\\n --data \'{\\"source\\":\\"https://t2000.ai/docs\\"}\'\\n```\\n\\n### Run a Replicate model\\n```bash\\nt2 pay https://mpp.t2000.ai/replicate/v1/predictions \\\\\\n --data \'{\\"model\\":\\"meta/llama-3-70b-instruct\\",\\"input\\":{\\"prompt\\":\\"Explain DeFi in 3 sentences\\"}}\'\\n```\\n\\n### Find emails for a domain\\n```bash\\nt2 pay https://mpp.t2000.ai/hunter/v1/search \\\\\\n --data \'{\\"domain\\":\\"mystenlabs.com\\"}\'\\n```\\n\\n### Look up an IP address\\n```bash\\nt2 pay https://mpp.t2000.ai/ipinfo/v1/lookup \\\\\\n --data \'{\\"ip\\":\\"8.8.8.8\\"}\'\\n```\\n\\n### Search for flights\\n```bash\\nt2 pay https://mpp.t2000.ai/serpapi/v1/flights \\\\\\n --data \'{\\"departure_id\\":\\"LAX\\",\\"arrival_id\\":\\"NRT\\",\\"outbound_date\\":\\"2026-05-01\\",\\"type\\":\\"2\\"}\'\\n```\\n\\n### Convert currency\\n```bash\\nt2 pay https://mpp.t2000.ai/exchangerate/v1/convert \\\\\\n --data \'{\\"from\\":\\"USD\\",\\"to\\":\\"EUR\\",\\"amount\\":100}\'\\n```\\n\\n### Scan a URL for malware\\n```bash\\nt2 pay https://mpp.t2000.ai/virustotal/v1/scan \\\\\\n --data \'{\\"url\\":\\"https://suspicious-site.com\\"}\'\\n```\\n\\n### Shorten a URL\\n```bash\\nt2 pay https://mpp.t2000.ai/shortio/v1/shorten \\\\\\n --data \'{\\"url\\":\\"https://example.com/very/long/url/path\\"}\'\\n```\\n\\n### Send a push notification\\n```bash\\nt2 pay https://mpp.t2000.ai/pushover/v1/push \\\\\\n --data \'{\\"user\\":\\"USER_KEY\\",\\"message\\":\\"Your agent has a message!\\"}\'\\n```\\n\\n## Flow (automatic)\\n1. Makes initial HTTP request to the URL\\n2. If 402: reads x402 challenge for amount and terms\\n3. If price <= --max-price: pays via Sui USDC\\n4. Retries with credential header\\n5. Returns the API response body\\n\\n## Safety\\n- If requested price exceeds --max-price, payment is refused (no funds spent)\\n- Default max-price: $1.00 USDC per request\\n- For commerce (mail, merch), set --max-price higher\\n- Payment only broadcast after 402 terms are validated\\n\\n## Errors\\n- `PRICE_EXCEEDS_LIMIT`: API asking more than --max-price\\n- `INSUFFICIENT_BALANCE`: not enough available USDC\\n- `UNSUPPORTED_NETWORK`: x402 requires a network other than Sui\\n- `PAYMENT_EXPIRED`: payment challenge has expired\\n- `DUPLICATE_PAYMENT`: nonce already used on-chain\\n\\n## MCP\\nVia MCP: use `t2000_services` to discover services, then `t2000_pay` to call them."},{"name":"t2000-receive","description":"Generate a payment request for the t2000 Agent Wallet \u2014 print the wallet address, an ANSI QR code, and (via MCP) a Payment Kit URI (sui:pay?\u2026). Use when asked to receive a payment, share a wallet address, create a payment link, or set up a fund-me link.","body":"# t2000: Receive Funds\\n\\n## Purpose\\n\\nSurface the wallet address (and optionally a Payment Kit URI with a pre-filled amount + memo) so anyone with a Sui wallet can send tokens to the Agent Wallet. Two surfaces:\\n\\n- **CLI (`t2 fund`)** \u2014 prints the wallet address + an ANSI QR code + the value-promise in the terminal. Minimal; no amount or memo.\\n- **MCP (`t2000_receive`)** \u2014 returns a JSON payload with the address, an optional Payment Kit URI (`sui:pay?\u2026`), a nonce, plus an optional amount / currency / memo / label. Use this when the LLM is building a payment-request flow.\\n\\n## Rules\\n\\n1. **Receive is non-custodial.** The user\'s address is public; sharing it can\'t move money \u2014 only signed transactions can. Don\'t add scary disclaimers; the operation is safe.\\n2. **Show the QR + the address text.** Some users scan, some copy. Both surfaces.\\n3. **No PIN, no sign-in.** v4 wallets are plain Bech32; `t2 fund` is a pure read with no authentication step.\\n4. **Default currency is USDC.** When asking the user to fund the wallet, USDC is the most useful (every paid service is USDC-denominated, USDC sends are gasless). USDsui also works.\\n5. **Don\'t generate a Payment Kit URI without an amount unless asked.** A bare address scans just as well; URIs with amounts force the sender into a particular tx shape.\\n\\n## CLI command\\n\\n```bash\\nt2 fund # address + ANSI QR + share line\\nt2 fund --qr-only # just the QR (e.g. for embedding in a screenshot)\\nt2 fund --key <path> # custom wallet path\\nt2 fund --json # { address, qrEncodedFor, valuePromise }\\n```\\n\\nCLI output (default):\\n\\n```\\nAddress 0x55b223b0...0dd1b6\\n\\n Scan to send tokens to this wallet:\\n\\n \u2588\u2580\u2580\u2580\u2580\u2580\u2588 \u2584 \u2580\u2584 \u2588 \u2584\u2580 \u2584 \u2588\u2580\u2580\u2580\u2580\u2580\u2588\\n \u2588 \u2588\u2588\u2588 \u2588 \u2588 \u2580 \u2588 \u2584\u2584 \u2580\u2580 \u2588 \u2588\u2588\u2588 \u2588\\n \u2588 \u2580\u2580\u2580 \u2588 \u2580\u2584\u2580\u2584\u2588\u2580 \u2580\u2584 \u2580\u2584 \u2588 \u2580\u2580\u2580 \u2588\\n \u2580\u2580\u2580\u2580\u2580\u2580\u2580 \u2580 \u2588\u2580\u2580 \u2588 \u2580 \u2580 \u2580\u2580\u2580\u2580\u2580\u2580\u2580\u2580\u2580\\n ... (truncated)\\n\\n Or share `0x55b223b0...0dd1b6` directly.\\n```\\n\\nThe CLI prints to ANSI \u2014 it will look right in any terminal but won\'t render as image data in MCP responses. Use the MCP tool for a structured JSON response.\\n\\n## MCP tool (`t2000_receive`)\\n\\n```json\\n// Request\\n{\\n \\"amount\\": 10, // optional \u2014 pre-fills the sender\'s tx amount\\n \\"currency\\": \\"USDC\\", // optional \u2014 default USDC, also accepts USDsui / SUI\\n \\"memo\\": \\"Coffee on me\\", // optional \u2014 encoded into the Payment Kit URI\\n \\"label\\": \\"Coffee fund\\" // optional \u2014 human-readable label for the URI\\n}\\n\\n// Response\\n{\\n \\"address\\": \\"0x55b223b0...0dd1b6\\",\\n \\"uri\\": \\"sui:pay?recipient=0x55b223b0...&amount=10000000&coinType=0xdba34672...::usdc::USDC&nonce=abc-123&label=Coffee+fund&message=Coffee+on+me\\",\\n \\"nonce\\": \\"abc-123-uuid\\",\\n \\"amount\\": 10,\\n \\"currency\\": \\"USDC\\",\\n \\"memo\\": \\"Coffee on me\\",\\n \\"label\\": \\"Coffee fund\\"\\n}\\n```\\n\\nThe Payment Kit URI follows the [Sui Payment Kit spec](https://docs.sui.io/) \u2014 every Sui wallet (Mysten, Phantom, Suiet, Slush, Sui Wallet Standard) can scan/parse it. If you omit `amount`, the URI is a \\"bring your own amount\\" link that the sender fills in.\\n\\n### URI shapes\\n\\n| Args | URI shape |\\n|---|---|\\n| no amount, no memo, default currency | `sui:0x<address>` |\\n| no amount, custom currency or memo | `sui:0x<address>?currency=USDsui&memo=\u2026` |\\n| with amount | `sui:pay?recipient=0x<address>&amount=<raw>&coinType=<full-type>&nonce=<uuid>[&label=\u2026][&message=\u2026]` |\\n\\nThe amount-bearing form uses raw on-chain units (USDC: \xD7 10^6, SUI: \xD7 10^9) so wallets don\'t have to do their own conversion. The `nonce` is a UUID v4 minted at request time; senders include it in the tx metadata so the receiving agent can correlate the inflow back to the request.\\n\\n## When to use which surface\\n\\n| Need | Use |\\n|---|---|\\n| \\"What\'s my wallet address?\\" | `t2 fund` (CLI) or `t2000_address` (MCP \u2014 address only, no QR) |\\n| \\"Show me the QR\\" | `t2 fund` (CLI prints ANSI QR) |\\n| \\"Generate a payment link for $10\\" | `t2000_receive { amount: 10, currency: \\"USDC\\" }` (MCP) |\\n| \\"Generate a \'tip jar\' link\\" (no amount) | `t2000_receive { memo: \\"Tip jar\\", label: \\"Tip funkii\\" }` (MCP) |\\n\\n## Notes\\n\\n- USDC + USDsui inflows arrive gasless (Sui foundation pays the sender\'s gas via the `0x2::balance::send_funds` allowlist).\\n- SUI inflows require the sender to have SUI for their own gas.\\n- Once the funds land, run `t2 balance` (CLI) or `t2000_balance` (MCP) to verify. Inflows show up within ~1 block (~500 ms).\\n- This skill is the receive-half of \\"Audric Pay\\". The send-half is the `t2000-send` skill.\\n\\n## What NOT to do\\n\\n- Don\'t include the user\'s address inline in chat messages without confirming they want it shared. It\'s public \u2014 but politeness matters.\\n- Don\'t generate a one-off Payment Kit URI for every conversation. The bare address works fine for repeated transfers.\\n- Don\'t redirect users to audric.ai for receive flows \u2014 the Agent Wallet handles receive natively. (Audric Pay\'s hosted UI is for users who DON\'T have the CLI.)"},{"name":"t2000-send","description":"Send USDC, USDsui, or SUI from the t2000 Agent Wallet to another Sui address. Use when asked to pay someone, transfer funds, send money, tip a creator, or make a payment to a specific Sui address, SuiNS name, or saved contact. Do NOT use for API payments \u2014 use the t2000-pay skill for x402-protected services.","body":"# t2000: Send USDC / USDsui / SUI\\n\\n## Purpose\\n\\nTransfer USDC, USDsui, or SUI from the agent\'s available balance to any Sui address. **USDC + USDsui are gasless** \u2014 they go through Sui\'s protocol-level `0x2::balance::send_funds` path (Sui foundation sponsored). **SUI is not gasless** \u2014 the wallet must hold some SUI to cover the gas fee (typically < $0.0002).\\n\\n## Rules\\n\\n1. **Asset is REQUIRED.** v4 has no implicit USDC default. `t2 send 5 alice.sui` exits with a clear error pointing at the missing `<asset>` arg. Always pass one of `USDC | USDsui | SUI`.\\n2. **Only USDC / USDsui / SUI are accepted.** Other tokens (e.g. USDY, USDT, USDe) are rejected with `unsupported asset`. To send a different asset, the user first swaps it via `t2 swap` (or audric.ai) into USDC, USDsui, or SUI.\\n3. **Validate the recipient first.** Names \u2192 SuiNS resolves (`alice.sui`). Raw addresses \u2192 `isValidSuiAddress()`. The SDK throws clear errors (`INVALID_ADDRESS`, `SUINS_NOT_REGISTERED`); don\'t guess.\\n4. **Prefer SuiNS names.** `alice.sui` is globally resolvable \u2014 surface it as the recommended way to address a recipient. (There is no local contacts/alias map.)\\n5. **Sends are single-write.** Each transfer is its own intent. If you need send + something else, sequence them across turns.\\n6. **Amount precision matters.** Floor to the asset\'s decimals (USDC + USDsui: 6, SUI: 9). Never round up \u2014 `Math.round` can produce a number larger than the on-chain balance and the transfer will fail simulation.\\n7. **Multi-recipient = multiple sends.** A \\"send to A, B, C\\" request emits N sequential `t2 send` invocations (CLI) or N `t2000_send` tool calls (MCP). Each is atomic.\\n8. **Limits apply to every write (CLI and MCP).** Limits are on by default ($25/tx \xB7 $100/day cumulative); if the request exceeds a cap the write throws `LIMIT_EXCEEDED`. Override one time with `--force` (CLI).\\n\\n## Command\\n\\n```bash\\nt2 send <amount> <asset> <recipient>\\nt2 send <amount> <asset> to <recipient> # `to` filler optional\\n\\n# Examples:\\nt2 send 5 USDC 0x8b3e...d412 # 5 USDC to a hex address (gasless)\\nt2 send 5 USDsui alice.sui # 5 USDsui to a SuiNS name (gasless)\\nt2 send 50 USDC to mission69b@audric # @audric handle (gasless)\\nt2 send 0.1 SUI 0x8b3e...d412 # 0.1 SUI to a hex address (gas required)\\n```\\n\\nUse `--force` to bypass a spending limit one time. Use `--key <path>` to point at a non-default wallet file.\\n\\n## Output (default)\\n\\n```\\n\u2713 Sent $5.00 USDC \u2192 alex.sui (0x8b3e...d412)\\n Gas: gasless \u26A1\\n Tx: https://suiscan.xyz/mainnet/tx/0xdigest...\\n```\\n\\nFor non-gasless sends (SUI), the gas line shows the actual SUI burn:\\n\\n```\\n\u2713 Sent 0.1000 SUI \u2192 0x8b3e...d412\\n Gas: 0.000123 SUI\\n Tx: https://suiscan.xyz/mainnet/tx/0xdigest...\\n```\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"tx\\": \\"0xdigest...\\",\\n \\"amount\\": 5,\\n \\"to\\": \\"0x8b3e...d412\\",\\n \\"suinsName\\": \\"alex.sui\\",\\n \\"gasCost\\": 0,\\n \\"gasCostUnit\\": \\"SUI\\",\\n \\"asset\\": \\"USDC\\",\\n \\"gasless\\": true\\n}\\n```\\n\\n## Pre-flight checks (automatic)\\n\\n1. Sufficient asset balance (USDC / USDsui / SUI as requested).\\n2. For SUI sends only: sufficient SUI for gas.\\n3. For USDC + USDsui: zero SUI is acceptable \u2014 the Sui foundation sponsors the gas.\\n4. Limit check (CLI only): per-tx cap (any asset) + daily-send cap (any asset). Override with `--force`.\\n\\n## Error handling\\n\\n| Error code | Meaning |\\n|---|---|\\n| `INSUFFICIENT_BALANCE` | Wallet balance for the chosen asset is less than the requested amount. |\\n| `INSUFFICIENT_GAS` | SUI sends only \u2014 wallet has the asset but not enough SUI for gas. Suggest a swap. |\\n| `INVALID_ADDRESS` | Recipient is not a valid Sui hex address. |\\n| `INVALID_ASSET` | Asset is missing or not in the allowlist (USDC / USDsui / SUI). |\\n| `SUINS_NOT_REGISTERED` | The `.sui` name isn\'t registered. |\\n| `CONTACT_NOT_FOUND` | The name isn\'t a SuiNS name, an @audric handle, or a saved local contact. |\\n| `LIMIT_EXCEEDED` | CLI hit a `t2 limit set` cap. Use `--force` to override. |\\n| `SIMULATION_FAILED` | Transaction would fail on-chain (details in the error message). |\\n\\n## Recipient resolution flow\\n\\nThe SDK (`T2000.resolveRecipient`) handles resolution in this priority order:\\n\\n1. **Hex address** (starts with `0x`) \u2192 validated via `isValidSuiAddress()`. If invalid \u2192 `INVALID_ADDRESS`.\\n2. **SuiNS name** (`*.sui`) \u2192 resolves via SuiNS registry. If unregistered \u2192 `SUINS_NOT_REGISTERED`.\\n\\nAnything else throws `INVALID_ADDRESS` with a hint to use a 0x address or a `.sui` name. (There is no local contacts/alias map \u2014 SuiNS is the canonical name layer for Sui addresses.)\\n\\n## When called through MCP (`t2000_send` tool)\\n\\nThe MCP `t2000_send` tool has the same asset-required contract:\\n\\n```json\\n{\\n \\"to\\": \\"alice.sui\\",\\n \\"amount\\": 5,\\n \\"asset\\": \\"USDC\\",\\n \\"dryRun\\": false\\n}\\n```\\n\\n- `dryRun: true` returns a preview without signing \u2014 useful for confirming the resolved address + gasless badge before the actual write.\\n- `asset` is REQUIRED \u2014 calls without it return an error.\\n- Both CLI and MCP writes honor `t2 limit set` caps (enforced in `@t2000/sdk`). Default caps: $25/tx \xB7 $100/day cumulative."},{"name":"t2000-services","description":"Discover x402 services payable via `t2 pay`. Use when the user asks \\"what can I pay for?\\", \\"what AI models are available?\\", \\"show me the service catalog\\", \\"is there a weather API?\\", or any other discovery question. Pairs with the t2000-pay skill (discovery first, then pay).","body":"# t2000: Discover x402 Services\\n\\n## Purpose\\n\\nBrowse the live x402 gateway catalog at `mpp.t2000.ai` to find a service that matches the user\'s intent (chat, image gen, search, weather, email, code exec, mail, etc.) before calling `t2 pay`. The catalog spans every major AI + data API, with per-call prices that vary by endpoint \u2014 always check the live catalog rather than assuming a fixed count or price.\\n\\n## Rules\\n\\n1. **Discover before paying.** Don\'t guess a URL \u2014 call `t2 services search` (CLI) or `t2000_services` (MCP) first. Service paths + pricing change as the gateway expands.\\n2. **Pick the cheapest endpoint that satisfies the user.** Many services have multiple tiers (e.g. `openai/v1/chat/completions` at $0.01 vs `openai/v1/audio/speech` at $0.05). Surface options.\\n3. **Surface pricing to the user before signing.** Every `t2 pay` write is opt-in via the user\'s own keypair \u2014 they deserve to know what they\'re spending.\\n4. **Live source of truth.** The catalog is fetched live from `https://mpp.t2000.ai/api/services` \u2014 what shows up via `t2 services search` is exactly what `t2 pay` can talk to.\\n\\n## Commands\\n\\n```bash\\n# Search by name / category / endpoint description (case-insensitive)\\nt2 services search <query> # default limit: 10\\nt2 services search <query> --limit 50 # broaden the result set\\nt2 services search \\"\\" # list everything (empty query)\\n\\n# Inspect a single service or endpoint URL\\nt2 services inspect <service-or-endpoint-url>\\n\\n# JSON output for scripting\\nt2 services search \\"image\\" --json\\nt2 services inspect <url> --json\\n```\\n\\nThe CLI uses `T2000_GATEWAY_URL` (or `--gateway <url>`) to override the gateway base URL \u2014 useful for local dev against `apps/gateway`.\\n\\n## Example workflow\\n\\n### \\"What AI chat models are available?\\"\\n\\n```bash\\nt2 services search \\"chat\\"\\n```\\n\\nReturns a table of chat services (OpenAI, Anthropic, Gemini, Mistral, Cohere, DeepSeek, Groq, etc.) with cheapest endpoint price + base URL.\\n\\n### \\"How much does GPT-4o cost?\\"\\n\\n```bash\\nt2 services inspect https://mpp.t2000.ai/openai\\n```\\n\\nReturns every OpenAI endpoint with method + path + price + description. The user picks one (e.g. `/v1/chat/completions` at $0.01) and copies the URL into a `t2 pay <url>` call.\\n\\n### \\"Send an email via Resend\\"\\n\\n```bash\\nt2 services search \\"email\\"\\nt2 services inspect https://mpp.t2000.ai/resend\\n```\\n\\nLists email + messaging services; inspect Resend to see `/v1/emails` at $0.05.\\n\\n### \\"What\'s the price of SUI?\\" (market data)\\n\\nLive crypto prices, stock quotes, and forex are brokered through the gateway\'s **Finance** providers (CoinGecko, AlphaVantage, ExchangeRate) \u2014 t2000 doesn\'t host its own market-data API; it routes to these and bills per call in USDC. (Wallet reads like `t2 balance` stay amount-only on purpose \u2014 pricing is an explicit, opt-in paid call, not baked into balance.)\\n\\n```bash\\nt2 services search \\"price\\"\\nt2 services inspect https://mpp.t2000.ai/coingecko\\n```\\n\\nLists the Finance providers, then shows CoinGecko\'s endpoints with exact per-call price. Copy the endpoint URL into `t2 pay <url>` to fetch the quote. (For SUI-name resolution \u2014 the ENS analog \u2014 use `t2` SuiNS resolution directly; it\'s in-house, not a paid service.)\\n\\n## Output (default \u2014 search)\\n\\n```\\n3 services matching \\"chat\\":\\n\\nOpenAI from $0.01 [ai, chat]\\n url https://mpp.t2000.ai/openai\\n about OpenAI Chat Completions API\\n\\nAnthropic from $0.01 [ai, chat]\\n url https://mpp.t2000.ai/anthropic\\n about Claude messages API\\n\\nMistral from $0.005 [ai, chat]\\n url https://mpp.t2000.ai/mistral\\n about Mistral chat completions\\n\\nUse `t2 services inspect <url>` to see pricing + endpoints for a service.\\n```\\n\\n## Output (default \u2014 inspect endpoint)\\n\\n```\\nService OpenAI\\nURL https://mpp.t2000.ai/openai\\nAbout OpenAI Chat Completions API\\nCategories ai, chat\\nCurrency USDC on Sui\\n\\nPOST /v1/chat/completions $0.01 Chat completions (gpt-4o, gpt-4o-mini)\\n url https://mpp.t2000.ai/openai/v1/chat/completions\\n\\nPay with: `t2 pay https://mpp.t2000.ai/openai/v1/chat/completions`\\n```\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"query\\": \\"chat\\",\\n \\"count\\": 3,\\n \\"services\\": [\\n {\\n \\"name\\": \\"OpenAI\\",\\n \\"serviceUrl\\": \\"https://mpp.t2000.ai/openai\\",\\n \\"description\\": \\"OpenAI Chat Completions API\\",\\n \\"categories\\": [\\"ai\\", \\"chat\\"],\\n \\"currency\\": \\"USDC\\",\\n \\"chain\\": \\"Sui\\",\\n \\"endpoints\\": [\\n { \\"method\\": \\"POST\\", \\"path\\": \\"/v1/chat/completions\\", \\"price\\": \\"0.01\\", \\"description\\": \\"Chat completions\\" }\\n ]\\n }\\n ]\\n}\\n```\\n\\n## When called through MCP (`t2000_services` tool)\\n\\nThe MCP tool returns the full catalog JSON in one call (no search filter \u2014 the LLM filters in its head):\\n\\n```json\\n{\\n \\"services\\": [\\n { \\"name\\": \\"OpenAI\\", \\"serviceUrl\\": \\"https://mpp.t2000.ai/openai\\", \\"endpoints\\": [...] },\\n { \\"name\\": \\"Anthropic\\", \\"serviceUrl\\": \\"https://mpp.t2000.ai/anthropic\\", \\"endpoints\\": [...] },\\n ...\\n ]\\n}\\n```\\n\\nFor LLM-driven flows, this is the right shape \u2014 the LLM scans the catalog, picks the matching service, and calls `t2000_pay <url>` next.\\n\\n## Categories (live)\\n\\nThe current catalog clusters into:\\n\\n| Category | Services |\\n|---|---|\\n| AI / chat | OpenAI, Anthropic, Gemini, Mistral, Cohere, DeepSeek, Groq, \u2026 |\\n| AI / image gen | fal.ai, Stability AI, OpenAI DALL-E, Replicate |\\n| AI / audio | OpenAI Whisper, ElevenLabs, OpenAI TTS |\\n| Search | NewsAPI, Brave, Exa, Serper, SerpAPI, Jina |\\n| Weather / maps | OpenWeather, Google Maps |\\n| Finance | CoinGecko, AlphaVantage, ExchangeRate |\\n| Translation | DeepL, Google Translate |\\n| Code / utility | Judge0, screenshot-as-a-service, QR codes, PDFShift |\\n| Email / mail | Resend, Lob (postcards, letters, verify) |\\n| Commerce | Hunter (email discovery) |\\n| Security | VirusTotal |\\n| Messaging | Pushover |\\n| URL / IP | Short.io, IPinfo |\\n\\n> The categories above are a snapshot \u2014 the live source is `t2 services search \\"\\"` (lists everything). New services land regularly.\\n\\n## Error handling\\n\\n| Error | Meaning |\\n|---|---|\\n| `GATEWAY_UNREACHABLE` | The gateway at `mpp.t2000.ai/api/services` is down or DNS is failing. Retry; if persistent, status page is at `t2000.ai`. |\\n| `No services match` | The search query returned zero hits. Suggest a broader query or `t2 services search \\"\\"` to list everything. |\\n| `No service matches <url>` (inspect) | The URL isn\'t in the catalog. Run `t2 services search` to find the right URL first. |\\n\\n## What NOT to do\\n\\n- Don\'t hardcode service URLs in your prompts. The catalog is the source of truth.\\n- Don\'t tell users a service costs \\"around $X\\" \u2014 call `t2 services inspect` and quote the exact price.\\n- Don\'t bundle `t2 services search` + `t2 pay` into a single hidden step. Show the user what you found before paying."},{"name":"t2000-setup","description":"Set up a t2000 Agent Wallet end-to-end on the user\'s machine. Use when the user says \\"set up t2000\\", \\"install the wallet\\", \\"create my Agent Wallet\\", \\"connect t2000 to Claude / Cursor\\", or pastes a one-prompt install URL. Covers wallet creation, optional spending limits, and MCP wiring. Read this first when bootstrapping a new user; the other skills assume this has run.","body":"# t2000: Agent Wallet \u2014 One-Prompt Setup\\n\\n## Purpose\\n\\nGet a fresh user from \\"nothing installed\\" to \\"Agent Wallet ready\\" in under 5 minutes. This is the canonical entry point for the **one-prompt install** UX:\\n\\n```\\nRun curl -sL https://t2000.ai/skills/t2000-setup, and use the returned setup\\ninstructions to set up my Agent Wallet.\\n```\\n\\nWhen invoked through that prompt, the LLM fetches this file, then executes the steps below in order.\\n\\n## Rules\\n\\n1. **Walk the steps in order.** Each step depends on the previous one. Skipping breaks setup.\\n2. **Stop at the first failure.** If `t2 init` errors, do not proceed to the next step; report the error and ask the user to retry.\\n3. **Confirm AI-client choice before MCP install.** Don\'t assume Claude Desktop vs. Cursor vs. Windsurf \u2014 ask which they use, then pick the matching config path.\\n4. **Setup is read + write \u2014 show, then ask.** Echo each command you\'re about to run. The user runs it (or confirms you can). Never silently shell out.\\n5. **No PIN. No encryption.** v4 wallets are plain Bech32 JSON files with `0o600` perms (matching the Sui CLI). The user owns the file; back it up via `t2 export`.\\n6. **Prime this session for x402 payments.** Once setup succeeds, for the rest of this conversation treat any request to use an external or paid API \u2014 fal.ai, ElevenLabs, OpenAI, CoinGecko, Lob, etc. \u2014 as something this wallet CAN do via `t2000_pay`. Discover the endpoint with `t2000_services`, then pay. Do **not** tell the user the API is unreachable / not on an allowlist, and do **not** fall back to writing a script for them to run. The wallet IS the connector.\\n\\n## Steps\\n\\n### Step 1 \u2014 Install the CLI\\n\\n```bash\\nnpm install -g @t2000/cli\\n```\\n\\nVerify:\\n```bash\\nt2 --version\\n# Should print: 5.x.x\\n```\\n\\nIf `npm` is missing, point the user to https://nodejs.org/ (Node 18+).\\n\\n> **Binary naming.** `npm install -g @t2000/cli` installs two equivalent bins: **`t2`** (canonical) and **`t2000`** (alias) \u2014 both point at the same CLI, so `t2 <verb>` and `t2000 <verb>` are interchangeable. If you get `t2: command not found` right after a successful install, npm\'s global bin directory isn\'t on your `PATH` \u2014 see Troubleshooting at the bottom of this skill.\\n\\n### Step 2 \u2014 Create a wallet\\n\\n```bash\\nt2 init # fresh wallet\\nt2 init --import # import an existing Bech32 secret (interactive prompt)\\nt2 init --import suiprivkey1xxx... # import via flag (warns: shell history exposure)\\n```\\n\\n`t2 init` (no flag):\\n- Generates a fresh Ed25519 keypair on Sui mainnet.\\n- Writes the plain Bech32 private key to `~/.t2000/wallet.key` (mode `0o600`).\\n- Prints the wallet address.\\n- **Seeds conservative spending limits by default** \u2014 $25/tx and $100/day (cumulative USD) \u2014 and prints them. Adjust or clear in Step 4.\\n\\n`t2 init --import`:\\n- Prompts for a `suiprivkey1...` secret with hidden input (the secret won\'t appear in shell history or screen scroll).\\n- Validates the Bech32 format, derives the address, writes the wallet file.\\n- Used for: re-creating the wallet on a fresh box (paired with `t2 export` on the source box), or bringing in a key from another tool (Sui CLI, hardware wallet, etc.).\\n\\n> **Upgrading from v3 (PIN-encrypted)?** v4 doesn\'t auto-migrate v3 AES wallets \u2014 a v3 file at `~/.t2000/wallet.key` will throw `WALLET_CORRUPT`. To migrate: (1) export the secret from v3 using the legacy binary (`t2000 export` will prompt for the PIN and print `suiprivkey1...`), (2) move or delete the v3 file at `~/.t2000/wallet.key`, (3) `t2 init --import` and paste the secret. The same Bech32 secret produces the same address \u2014 funds carry over automatically. (Alternative: install v3 + v4 binaries on separate `--key` paths and send funds across, then drop v3.)\\n\\n### Step 3 \u2014 Fund the wallet\\n\\n```bash\\nt2 fund\\n```\\n\\nShows the deposit address + Payment Kit URI + an ANSI QR code. Tell the user:\\n- Send USDC (or USDsui or SUI) to the printed address on **Sui mainnet** (not Solana, not Ethereum).\\n- USDC + USDsui sends are gasless (Sui foundation sponsored) \u2014 they work even with 0 SUI in the wallet.\\n- For swaps via Cetus, the wallet needs a small SUI balance (~0.05 SUI covers many swaps; cost is typically < $0.01 each).\\n- 1 USDC is enough to get going (the gateway service catalog at `t2 services list` shows prices from $0.005).\\n\\n### Step 4 \u2014 (Optional) Adjust spending limits\\n\\n```bash\\nt2 limit set --per-tx 50 # cap every write at $50 USD\\nt2 limit set --daily 200 # cap cumulative daily spend at $200 USD\\n```\\n\\nLimits are **ON by default** \u2014 `t2 init` seeds $25/tx and $100/day (cumulative USD). The `t2 limit` command rewrites `~/.t2000/config.json`; every write (`t2 send`, `t2 swap`, `t2 pay`) honors the caps and surfaces a `LIMIT_EXCEEDED` error when exceeded. Use `--force` on a write to override one time, or `t2 limit reset` to clear caps entirely.\\n\\n> **Limits gate ALL writes \u2014 CLI *and* MCP.** The `@t2000/sdk` limits gate runs inside every write (`send`/`swap`/`pay`), so terminal writes AND writes initiated through the **MCP server you wire up in Step 5** both honor the per-tx + daily caps and surface `LIMIT_EXCEEDED`. (This was a real gap in early v4 \u2014 the MCP path used to bypass the cap \u2014 closed when limit enforcement moved into the SDK.) Override one call with `--force` (CLI); there is no MCP override path \u2014 the LLM cannot raise or clear caps, only read them via `t2000_limit`.\\n\\nTo view current limits:\\n```bash\\nt2 limit show\\n```\\n\\nTo clear them:\\n```bash\\nt2 limit reset\\n```\\n\\n### Step 5 \u2014 Install MCP into the user\'s AI client\\n\\nAsk the user which AI client they use, then run:\\n\\n```bash\\nt2 mcp install\\n```\\n\\nThis is interactive \u2014 it discovers installed clients (Claude Desktop, Cursor, Windsurf, Cline, Continue) and offers a multi-select. The CLI writes the correct config block into each chosen client.\\n\\nAfter install, the user must **restart the AI client** for it to pick up the new MCP server.\\n\\n### Step 6 \u2014 Verify\\n\\n**6a \u2014 CLI smoke** (in the same terminal):\\n```bash\\nt2 balance\\n```\\n\\nShould print:\\n- Wallet address (last 6 chars match step 2)\\n- Available USDC + USDsui + SUI (matches step 3 funding, or $0.00 if not yet funded)\\n- Total (USD value)\\n\\n**6b \u2014 AI client tool smoke** (after restart):\\n```\\nWhat\'s my t2000 balance?\\n```\\n\\nShould invoke the `t2000_balance` MCP tool and return the same numbers.\\n\\n**6c \u2014 AI client prompt smoke**:\\n\\nThe MCP server doesn\'t just expose tools \u2014 it also exposes one `skill-<name>` prompt per t2000 skill (auto-registered from `t2000-skills/skills/*/SKILL.md`). Type `/` in the AI client\'s chat input to open the prompt picker. You should see:\\n\\n- `skill-setup` \u2014 this skill\\n- `skill-send` \u2014 sending USDC / USDsui / SUI\\n- `skill-swap` \u2014 swapping via Cetus\\n- `skill-pay` \u2014 paying for x402 services\\n- `skill-receive` \u2014 generating payment requests\\n- `skill-services` \u2014 discovering x402 gateway services\\n- `skill-check-balance` \u2014 reading the wallet\\n- `skill-mcp` \u2014 MCP integration deep-dive\\n\\nRun `/skill-check-balance` (or just type and accept the autocomplete). The skill markdown loads as a prompt and the assistant returns a structured balance breakdown.\\n\\n> **Tip \u2014 triggering the wallet in a *fresh* session.** When you start a brand-new chat and ask for an external/paid API by name (e.g. \\"generate an image via fal.ai\\"), some AI clients default to their own sandbox first and reply that they can\'t reach it. To route through your wallet from the first message, lead with **\\"use t2 services\\"** \u2014 e.g. *\\"Use t2 services to generate a hero image via fal.ai and voice it with ElevenLabs.\\"* That tells the client to load the `t2000_*` tools and pay via x402. (The recipe prompts on developers.t2000.ai already start this way.)\\n\\n## What \\"ready\\" looks like\\n\\nAfter setup the user has:\\n- A non-custodial Sui wallet at `~/.t2000/wallet.key` (plain Bech32 JSON, `0o600` perms, **no PIN**).\\n- Optional USDC / USDsui / SUI funded on Sui mainnet.\\n- Optional spending limits configured.\\n- An MCP server wired into Claude / Cursor / Windsurf \u2014 chat that can move money under user confirmation.\\n\\n## What setup does NOT do\\n\\n- **Does not move money.** Setup is read + config only. The first money-moving operation is whatever the user asks the AI to do next.\\n- **Does not back up the private key.** The Bech32 key lives in `~/.t2000/wallet.key`. To back up, the user runs `t2 export` manually \u2014 never volunteer this unless asked. v4 has no PIN, so anyone with read access to the file owns the wallet.\\n- **Does not move money or change limits.** Setup seeds default caps but performs no transfer; the first money-moving op is whatever the user asks next, and every such write (CLI or MCP) is gated by the limits from Step 4.\\n\\n## Next steps to suggest\\n\\nAfter verify succeeds, surface a short menu of natural next moves:\\n- \\"Send USDC to someone\\" \u2192 `t2000-send`\\n- \\"Swap tokens via Cetus\\" \u2192 `t2000-swap`\\n- \\"Pay for a service via x402\\" \u2192 `t2000-pay`\\n- \\"Generate a payment request\\" \u2192 `t2000-receive`\\n- \\"See available paid services\\" \u2192 `t2000-services`\\n- \\"Connect more AI clients\\" \u2192 `t2000-mcp`\\n- \\"See what else t2 can do\\" \u2192 run `t2 --help` or browse https://developers.t2000.ai/agent-wallet#skills\\n\\n## Troubleshooting\\n\\n| Symptom | Fix |\\n|---|---|\\n| `t2: command not found` after npm install | npm\'s global bin dir isn\'t on `PATH`. Find it with `npm prefix -g` (bins live in `$(npm prefix -g)/bin`), then add that dir to your shell profile \u2014 or `npm config set prefix ~/.npm-global` for a durable user-level prefix. Both `t2` and `t2000` ship in every install. |\\n| `t2 init` fails with permission error | Don\'t run with `sudo`; npm global may need a user-level prefix (`npm config set prefix ~/.npm-global`) |\\n| `t2 init` fails with `WALLET_EXISTS` | A file already lives at `~/.t2000/wallet.key`. If it\'s a v3 file you no longer need, move/delete it. If you still need it, point v3 + v4 at separate paths via `--key`. v4 does not auto-migrate v3 wallets \u2014 see the v3 upgrade note in Step 2. |\\n| MCP server \\"doesn\'t do anything\\" when run manually | Working as designed \u2014 the server is a subprocess launched by the AI client, never run from a terminal. See the `t2000-mcp` skill. |\\n| AI client doesn\'t see `t2000_*` tools after install | Restart the client. If still missing, check the per-client config path printed by `t2 mcp install`. |"},{"name":"t2000-swap","description":"Swap tokens on Sui via Cetus Aggregator (20+ DEXs, best-route across SUI, USDC, USDsui, USDT, USDe, ETH, GOLD, NAVX, WAL, vSUI, and more). Use when asked to swap, trade, convert, exchange, or \\"turn X into Y\\". Do not use for sending \u2014 use the t2000-send skill for transfers.","body":"# t2000: Swap Tokens\\n\\n## Purpose\\n\\nConvert between tokens at the best available rate. Cetus Aggregator routes across 20+ DEXs and picks the lowest-price-impact path. Slippage defaults to 1%; configurable up to 5%.\\n\\n**Swaps are NOT gasless.** Unlike `t2 send USDC` / `t2 send USDsui`, Cetus swap transactions require SUI for gas (typically < $0.01 per swap). Ensure the wallet holds a small SUI balance before swapping.\\n\\n## Rules\\n\\n1. **Preview before signing.** Always run `t2 swap <amount> <from> <to> --quote` (or call `t2000_swap` in dry-run via the MCP) and surface `priceImpact` + `toAmount` to the user before broadcasting.\\n2. **Decline obviously bad swaps.** If `priceImpact > 0.5%` (50 bps), warn the user and require explicit confirmation. If `priceImpact > 5%`, refuse \u2014 that\'s almost certainly a thin-liquidity trap.\\n3. **One swap per intent.** Cetus aggregator handles multi-hop internally; don\'t chain `swap` calls.\\n4. **Don\'t auto-decide stables.** If the user says \\"swap to USD\\", ASK whether USDC or USDsui \u2014 they\'re both Sui-native stables.\\n5. **Limits apply to every swap (CLI and MCP).** Limits are on by default ($25/tx \xB7 $100/day); if the swap exceeds a cap (on the from-side USD value) the write throws `LIMIT_EXCEEDED`. Use `--force` (CLI) to override one time.\\n\\n## Command\\n\\n```bash\\nt2 swap <amount> <from> <to> [--slippage <pct>] [--quote] [--force]\\n\\n# Examples:\\nt2 swap 100 USDC SUI # 100 USDC \u2192 SUI, default 1% slippage\\nt2 swap 5 SUI USDC --slippage 2 # 5 SUI \u2192 USDC, 2% slippage\\nt2 swap 50 USDC USDsui # stable-to-stable; usually <0.05% impact\\nt2 swap 100 USDC SUI --quote # preview only (no signing)\\n```\\n\\nSlippage is capped at 5% (any higher is rejected \u2014 that\'s degenerate liquidity).\\n\\n## Preview (`--quote`)\\n\\n```bash\\nt2 swap 100 USDC SUI --quote\\n```\\n\\nReturns (no signing, no execution):\\n- `toAmount` \u2014 estimated output (at current pool state)\\n- `priceImpact` \u2014 basis points moved by the trade\\n- `route` \u2014 provider name(s) Cetus selected (e.g. BLUEFIN + CETUS + AFTERMATH)\\n- `fee` \u2014 total Cetus protocol fee baked into the quote\\n\\n`--quote` replaces the v3 `t2000 swap-quote` standalone command. One verb, one flag.\\n\\n## Fees\\n\\n- **Network gas:** ~0.001-0.01 SUI per swap (self-funded from the wallet).\\n- **Cetus protocol fee:** typically 0.05-0.30% depending on the pool tier (already baked into `toAmount`).\\n- **t2000 / CLI:** zero fee. Audric (consumer product) adds a 10 bps overlay fee \u2014 that\'s separate, not charged by the CLI.\\n\\n## Output (default)\\n\\n```\\n\u2713 Swapped 100 USDC for 49.8721 SUI\\n Price impact: 0.04%\\n Route: USDC \u2192 SUI (Cetus + BLUEFIN)\\n Gas: 0.0038 SUI\\n Tx: https://suiscan.xyz/mainnet/tx/0xdigest...\\n```\\n\\n## Output (--json)\\n\\n```json\\n{\\n \\"tx\\": \\"0xdigest...\\",\\n \\"from\\": \\"USDC\\",\\n \\"to\\": \\"SUI\\",\\n \\"amountIn\\": 100,\\n \\"amountOut\\": 49.8721,\\n \\"priceImpact\\": 0.04,\\n \\"route\\": [\\"CETUS\\", \\"BLUEFIN\\"],\\n \\"fee\\": 0.001,\\n \\"gasCost\\": 0.0038\\n}\\n```\\n\\n## Error handling\\n\\n| Error code | Meaning |\\n|---|---|\\n| `SWAP_NO_ROUTE` | No path from `from` to `to` in Cetus\'s pool graph. Suggest going via USDC as an intermediate. |\\n| `INSUFFICIENT_LIQUIDITY` | The requested size moves the pool too far. Suggest a smaller trade or splitting. |\\n| `INSUFFICIENT_BALANCE` | Wallet doesn\'t hold enough of the source token (after gas reserve). |\\n| `INSUFFICIENT_GAS` | Wallet has the source token but no SUI for gas. Run `t2 swap 1 USDC SUI` (or similar) first to top up gas. |\\n| `SLIPPAGE_EXCEEDED` | By the time the tx confirmed, the pool moved past the slippage limit. Retry with the same params; usually transient. |\\n| `LIMIT_EXCEEDED` | CLI hit a `t2 limit set` cap on the from-side USD value. Use `--force` to override. |\\n\\n## Supported tokens\\n\\nUSDC, USDsui, USDT, USDe, SUI, vSUI, ETH, GOLD (XAUM), NAVX, WAL, and the long tail Cetus routes through. Use the canonical symbol or pass a full coin type (`0x...::module::TYPE`). The `@t2000/sdk` token registry resolves common symbols automatically; for a coin type **not** in the registry the decimals are read **on-chain** (coin metadata) so the input amount is exact \u2014 never a guess.\\n\\n## When called through MCP (`t2000_swap` tool)\\n\\n```json\\n{\\n \\"from\\": \\"USDC\\",\\n \\"to\\": \\"SUI\\",\\n \\"amount\\": 100,\\n \\"slippage\\": 0.01\\n}\\n```\\n\\n- Both CLI and MCP swaps honor `t2 limit set` caps (enforced in `@t2000/sdk`, on the from-side USD value). Default caps: $25/tx \xB7 $100/day cumulative.\\n- Returns the same shape as `--json` mode (digest + amounts + price impact + route).\\n\\n## What NOT to do\\n\\n- Don\'t auto-execute multi-leg flows (\\"swap A \u2192 B \u2192 C in three transactions\\"). If a multi-hop is needed, Cetus does it internally as one PTB.\\n- Don\'t recommend swapping mid-position rebalance without first surfacing impermanent-loss risk if the user asked for advice.\\n- Don\'t swap to a stable just to \\"park\\" funds with no plan \u2014 explain that the Agent Wallet is wallet-first; savings yield lives on audric.ai."},{"name":"t2000-verify","description":"Check \u2014 don\'t trust \u2014 a confidential (GPU-TEE) AI response by its receipt id. Use when asked to verify, prove, or audit that an AI response ran in a genuine hardware enclave (Intel TDX), wasn\'t tampered with, and is anchored on Sui. Works on any t2000 Private API confidential (`phala/*`) response. No key needed.","body":"# t2000: Verify a Confidential Response\\n\\n## Purpose\\n\\nConfidential (`phala/*`) responses from the t2000 Private API run inside a verified\\nGPU-TEE and carry a **signed receipt** that\'s **auto-anchored on Sui**. `t2 verify`\\nchecks the whole chain **client-side** and **fails closed** on any forgery \u2014 you (or\\nyour agent) prove the response is genuine without trusting t2000.\\n\\n## Where the receipt id comes from\\n\\nAny confidential inference call returns one:\\n\\n```bash\\nt2 chat --model phala/glm-5.2 \\"\u2026\\" # \u2192 \u{1F512} confidential \xB7 attested \xB7 receipt rcpt-\u2026\\n```\\n\\nThe API returns it in the `x-receipt-id` header (streaming: `x_receipt_id` on the\\nfinal usage chunk). Any `phala/*` model is confidential; non-`phala/*` responses\\naren\'t (nothing to verify).\\n\\n## Command\\n\\n```bash\\nt2 verify <receipt-id> # full check (incl. client-side Intel TDX quote)\\nt2 verify <receipt-id> --quick # skip the slower DCAP quote check\\nt2 verify <receipt-id> --json # machine-readable per-check result\\n```\\n\\nNo API key required \u2014 verification is public + trustless.\\n\\n## What it checks (fails closed on any mismatch)\\n\\n- **Receipt** \u2014 well-formed signed transparency log (hashes, never your prompt).\\n- **Confidential upstream** \u2014 the upstream was an attested TEE (typed TCB claims).\\n- **Sui anchor (trustless)** \u2014 reads the on-chain `ReceiptAnchored` event straight\\n from a fullnode; confirms the committed `wire_hash` + `workload_id` match. t2000\\n can\'t forge it.\\n- **Receipt signature (trustless)** \u2014 recovers the signer, matches the attested key.\\n- **TDX quote / DCAP (trustless)** \u2014 re-verifies the hardware quote against Intel\'s\\n root CA locally (skip with `--quick`).\\n\\nExit code is non-zero if anything doesn\'t line up.\\n\\n## Other surfaces\\n\\n- **Browser:** paste any receipt id at **`verify.t2000.ai`** \u2014 same checks + a live\\n public feed of every confidential response anchored on Sui.\\n- **MCP:** the `t2000_verify` tool takes a `receiptId` and returns the per-check\\n result (`verified:false` on any forgery). No key required.\\n- **SDK:** `verifyReceipt(receiptId)` from `@t2000/sdk`; `agent.verify(id)` on a\\n `T2000` instance.\\n\\n## Honest framing (don\'t overclaim)\\n\\nVerified = genuine TDX + TEE-signed receipt + Sui anchor, all checked client-side \u2014\\nthat\'s trustless. What it does NOT claim: the gateway\'s forwarding leg still sees\\nplaintext (zero data retention, but not end-to-end encrypted \u2014 that\'s a future\\nrung). State exactly what\'s proven; a wrong \\"verified\\" claim is worse than honest."}]';
97804
98645
  cachedSkills = JSON.parse(raw);
97805
98646
  return cachedSkills;
97806
98647
  }
@@ -97863,7 +98704,7 @@ Through this wallet you can reach essentially any major external API, billed to
97863
98704
  CRITICAL: When the user asks to use any external or paid API, names a provider (e.g. "via fal.ai", "with ElevenLabs"), or requests a capability one of the services above provides, DO NOT say you cannot reach that service, that it isn't on an allowlist, or that there's no connector \u2014 and do NOT fall back to writing a script for the user to run. You CAN do it directly through this wallet. Use t2000_services to discover the endpoint and request shape, then t2000_pay to execute, then show the user the result (display image/audio URLs returned in the response).
97864
98705
 
97865
98706
  Spending is the user's own USDC and every t2000_pay call is bounded by maxPrice. For larger or multi-step spends, state the estimated cost first and proceed once the user is happy. Use t2000_balance to check funds. The v4 wallet is payments-only; savings / lending live on audric.ai.`;
97866
- var PKG_VERSION = "5.22.0";
98707
+ var PKG_VERSION = "5.23.0";
97867
98708
  console.log = (...args) => console.error("[log]", ...args);
97868
98709
  console.warn = (...args) => console.error("[warn]", ...args);
97869
98710
  async function startMcpServer(opts) {
@@ -97937,4 +98778,4 @@ mime-types/index.js:
97937
98778
  @scure/bip39/index.js:
97938
98779
  (*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) *)
97939
98780
  */
97940
- //# sourceMappingURL=dist-3T3V2562.js.map
98781
+ //# sourceMappingURL=dist-TCGFVCLO.js.map