create-mastra 0.0.0-cli-debug-2-20250611100354 → 0.0.0-client-js-listmessages-agentid-fix-20251119175531

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,25 +4,30 @@ import { randomUUID } from 'node:crypto';
4
4
  import * as fs3__default from 'node:fs';
5
5
  import fs3__default__default, { existsSync, readFileSync, writeFileSync } from 'node:fs';
6
6
  import os from 'node:os';
7
- import path2, { dirname } from 'node:path';
7
+ import path3, { dirname } from 'node:path';
8
8
  import { fileURLToPath } from 'node:url';
9
9
  import { PostHog } from 'posthog-node';
10
- import h, { stdin, stdout } from 'node:process';
11
- import * as f from 'node:readline';
12
- import f__default from 'node:readline';
13
- import tty, { WriteStream } from 'node:tty';
14
- import child_process from 'node:child_process';
15
- import util from 'node:util';
10
+ import util, { stripVTControlCharacters } from 'node:util';
11
+ import y$1, { stdout, stdin } from 'node:process';
12
+ import * as g from 'node:readline';
13
+ import g__default from 'node:readline';
14
+ import { Writable } from 'node:stream';
16
15
  import fs4 from 'node:fs/promises';
17
- import { execa } from 'execa';
18
- import fsExtra3, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
16
+ import child_process from 'node:child_process';
17
+ import tty from 'node:tty';
18
+ import fsExtra, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
19
19
  import prettier from 'prettier';
20
+ import { execa } from 'execa';
20
21
  import pino from 'pino';
21
22
  import pretty from 'pino-pretty';
22
- import fsExtra from 'fs-extra';
23
+ import fsExtra$1 from 'fs-extra';
23
24
 
24
25
  var __filename = fileURLToPath(import.meta.url);
25
- var __dirname = path2.dirname(__filename);
26
+ var __dirname = path3.dirname(__filename);
27
+ var analyticsInstance = null;
28
+ function getAnalytics() {
29
+ return analyticsInstance;
30
+ }
26
31
  var PosthogAnalytics = class {
27
32
  sessionId;
28
33
  client;
@@ -34,7 +39,7 @@ var PosthogAnalytics = class {
34
39
  host = "https://app.posthog.com"
35
40
  }) {
36
41
  this.version = version;
37
- const cliConfigPath = path2.join(__dirname, "mastra-cli.json");
42
+ const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
38
43
  if (existsSync(cliConfigPath)) {
39
44
  try {
40
45
  const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
@@ -62,7 +67,7 @@ var PosthogAnalytics = class {
62
67
  }
63
68
  writeCliConfig({ distinctId, sessionId }) {
64
69
  try {
65
- writeFileSync(path2.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
70
+ writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
66
71
  } catch {
67
72
  }
68
73
  }
@@ -112,6 +117,22 @@ var PosthogAnalytics = class {
112
117
  }
113
118
  });
114
119
  }
120
+ trackEvent(eventName, properties) {
121
+ try {
122
+ if (!this.client) {
123
+ return;
124
+ }
125
+ this.client.capture({
126
+ distinctId: this.distinctId,
127
+ event: eventName,
128
+ properties: {
129
+ ...this.getSystemProperties(),
130
+ ...properties
131
+ }
132
+ });
133
+ } catch {
134
+ }
135
+ }
115
136
  trackCommand(options) {
116
137
  try {
117
138
  if (!this.client) {
@@ -348,74 +369,60 @@ function requirePicocolors () {
348
369
  var picocolorsExports = /*@__PURE__*/ requirePicocolors();
349
370
  var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
350
371
 
351
- function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(F,e?void 0:"g")}const J=q();function S(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(J,"")}function T$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var j$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(t){var s=t.charCodeAt(0),C=t.length==2?t.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=C&&C<=57343&&(s&=1023,C&=1023,D=s<<10|C,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(t){var s=this.eastAsianWidth(t);return s=="F"||s=="W"||s=="A"?2:1};function F(t){return t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(t){for(var s=F(t),C=0,D=0;D<s.length;D++)C=C+this.characterLength(s[D]);return C},u.slice=function(t,s,C){textLen=u.length(t),s=s||0,C=C||1,s<0&&(s=textLen+s),C<0&&(C=textLen+C);for(var D="",i=0,n=F(t),E=0;E<n.length;E++){var h=n[E],o=u.length(h);if(i>=s-(o==2?1:0))if(i+o<=C)D+=h;else break;i+=o;}return D};})(j$1);var Q$1=j$1.exports;const X=T$1(Q$1);var DD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const uD=T$1(DD);function A(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=S(e),e.length===0))return 0;e=e.replace(uD()," ");const F=u.ambiguousIsNarrow?1:2;let t=0;for(const s of e){const C=s.codePointAt(0);if(C<=31||C>=127&&C<=159||C>=768&&C<=879)continue;switch(X.eastAsianWidth(s)){case "F":case "W":t+=2;break;case "A":t+=F;break;default:t+=1;}}return t}const d=10,M$1=(e=0)=>u=>`\x1B[${u+e}m`,P$1=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,W=(e=0)=>(u,F,t)=>`\x1B[${38+e};2;${u};${F};${t}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const FD=Object.keys(r.color),eD=Object.keys(r.bgColor);[...FD,...eD];function tD(){const e=new Map;for(const[u,F]of Object.entries(r)){for(const[t,s]of Object.entries(F))r[t]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},F[t]=r[t],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:F,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=M$1(),r.color.ansi256=P$1(),r.color.ansi16m=W(),r.bgColor.ansi=M$1(d),r.bgColor.ansi256=P$1(d),r.bgColor.ansi16m=W(d),Object.defineProperties(r,{rgbToAnsi256:{value:(u,F,t)=>u===F&&F===t?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(F/255*5)+Math.round(t/255*5),enumerable:false},hexToRgb:{value:u=>{const F=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!F)return [0,0,0];let[t]=F;t.length===3&&(t=[...t].map(C=>C+C).join(""));const s=Number.parseInt(t,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let F,t,s;if(u>=232)F=((u-232)*10+8)/255,t=F,s=F;else {u-=16;const i=u%36;F=Math.floor(u/36)/5,t=Math.floor(i/6)/5,s=i%6/5;}const C=Math.max(F,t,s)*2;if(C===0)return 30;let D=30+(Math.round(s)<<2|Math.round(t)<<1|Math.round(F));return C===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,F,t)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,F,t)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const sD=tD(),g=new Set(["\x1B","\x9B"]),CD=39,b$1="\x07",O="[",iD="]",I$1="m",w=`${iD}8;;`,N=e=>`${g.values().next().value}${O}${e}${I$1}`,L=e=>`${g.values().next().value}${w}${e}${b$1}`,rD=e=>e.split(" ").map(u=>A(u)),y$1=(e,u,F)=>{const t=[...u];let s=false,C=false,D=A(S(e[e.length-1]));for(const[i,n]of t.entries()){const E=A(n);if(D+E<=F?e[e.length-1]+=n:(e.push(n),D=0),g.has(n)&&(s=true,C=t.slice(i+1).join("").startsWith(w)),s){C?n===b$1&&(s=false,C=false):n===I$1&&(s=false);continue}D+=E,D===F&&i<t.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},ED=e=>{const u=e.split(" ");let F=u.length;for(;F>0&&!(A(u[F-1])>0);)F--;return F===u.length?e:u.slice(0,F).join(" ")+u.slice(F).join("")},oD=(e,u,F={})=>{if(F.trim!==false&&e.trim()==="")return "";let t="",s,C;const D=rD(e);let i=[""];for(const[E,h]of e.split(" ").entries()){F.trim!==false&&(i[i.length-1]=i[i.length-1].trimStart());let o=A(i[i.length-1]);if(E!==0&&(o>=u&&(F.wordWrap===false||F.trim===false)&&(i.push(""),o=0),(o>0||F.trim===false)&&(i[i.length-1]+=" ",o++)),F.hard&&D[E]>u){const B=u-o,p=1+Math.floor((D[E]-B-1)/u);Math.floor((D[E]-1)/u)<p&&i.push(""),y$1(i,h,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(F.wordWrap===false&&o<u){y$1(i,h,u);continue}i.push("");}if(o+D[E]>u&&F.wordWrap===false){y$1(i,h,u);continue}i[i.length-1]+=h;}F.trim!==false&&(i=i.map(E=>ED(E)));const n=[...i.join(`
352
- `)];for(const[E,h]of n.entries()){if(t+=h,g.has(h)){const{groups:B}=new RegExp(`(?:\\${O}(?<code>\\d+)m|\\${w}(?<uri>.*)${b$1})`).exec(n.slice(E).join(""))||{groups:{}};if(B.code!==void 0){const p=Number.parseFloat(B.code);s=p===CD?void 0:p;}else B.uri!==void 0&&(C=B.uri.length===0?void 0:B.uri);}const o=sD.codes.get(Number(s));n[E+1]===`
353
- `?(C&&(t+=L("")),s&&o&&(t+=N(o))):h===`
354
- `&&(s&&o&&(t+=N(s)),C&&(t+=L(C)));}return t};function R$1(e,u,F){return String(e).normalize().replace(/\r\n/g,`
372
+ function DD({onlyFirst:e=false}={}){const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}const uD=DD();function P$1(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(uD,"")}function L$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var W$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(F){var s=F.charCodeAt(0),i=F.length==2?F.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=i&&i<=57343&&(s&=1023,i&=1023,D=s<<10|i,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(F){var s=this.eastAsianWidth(F);return s=="F"||s=="W"||s=="A"?2:1};function t(F){return F.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(F){for(var s=t(F),i=0,D=0;D<s.length;D++)i=i+this.characterLength(s[D]);return i},u.slice=function(F,s,i){textLen=u.length(F),s=s||0,i=i||1,s<0&&(s=textLen+s),i<0&&(i=textLen+i);for(var D="",C=0,n=t(F),E=0;E<n.length;E++){var a=n[E],o=u.length(a);if(C>=s-(o==2?1:0))if(C+o<=i)D+=a;else break;C+=o;}return D};})(W$1);var tD=W$1.exports;const eD=L$1(tD);var FD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const sD=L$1(FD);function p(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=P$1(e),e.length===0))return 0;e=e.replace(sD()," ");const t=u.ambiguousIsNarrow?1:2;let F=0;for(const s of e){const i=s.codePointAt(0);if(i<=31||i>=127&&i<=159||i>=768&&i<=879)continue;switch(eD.eastAsianWidth(s)){case "F":case "W":F+=2;break;case "A":F+=t;break;default:F+=1;}}return F}const w=10,N=(e=0)=>u=>`\x1B[${u+e}m`,I=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,R=(e=0)=>(u,t,F)=>`\x1B[${38+e};2;${u};${t};${F}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const iD=Object.keys(r.color),CD=Object.keys(r.bgColor);[...iD,...CD];function rD(){const e=new Map;for(const[u,t]of Object.entries(r)){for(const[F,s]of Object.entries(t))r[F]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},t[F]=r[F],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:t,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=N(),r.color.ansi256=I(),r.color.ansi16m=R(),r.bgColor.ansi=N(w),r.bgColor.ansi256=I(w),r.bgColor.ansi16m=R(w),Object.defineProperties(r,{rgbToAnsi256:{value:(u,t,F)=>u===t&&t===F?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(t/255*5)+Math.round(F/255*5),enumerable:false},hexToRgb:{value:u=>{const t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!t)return [0,0,0];let[F]=t;F.length===3&&(F=[...F].map(i=>i+i).join(""));const s=Number.parseInt(F,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let t,F,s;if(u>=232)t=((u-232)*10+8)/255,F=t,s=t;else {u-=16;const C=u%36;t=Math.floor(u/36)/5,F=Math.floor(C/6)/5,s=C%6/5;}const i=Math.max(t,F,s)*2;if(i===0)return 30;let D=30+(Math.round(s)<<2|Math.round(F)<<1|Math.round(t));return i===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,t,F)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,t,F)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const ED=rD(),d$1=new Set(["\x1B","\x9B"]),oD=39,y="\x07",V$1="[",nD="]",G$1="m",_$1=`${nD}8;;`,z=e=>`${d$1.values().next().value}${V$1}${e}${G$1}`,K$1=e=>`${d$1.values().next().value}${_$1}${e}${y}`,aD=e=>e.split(" ").map(u=>p(u)),k$1=(e,u,t)=>{const F=[...u];let s=false,i=false,D=p(P$1(e[e.length-1]));for(const[C,n]of F.entries()){const E=p(n);if(D+E<=t?e[e.length-1]+=n:(e.push(n),D=0),d$1.has(n)&&(s=true,i=F.slice(C+1).join("").startsWith(_$1)),s){i?n===y&&(s=false,i=false):n===G$1&&(s=false);continue}D+=E,D===t&&C<F.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},hD=e=>{const u=e.split(" ");let t=u.length;for(;t>0&&!(p(u[t-1])>0);)t--;return t===u.length?e:u.slice(0,t).join(" ")+u.slice(t).join("")},lD=(e,u,t={})=>{if(t.trim!==false&&e.trim()==="")return "";let F="",s,i;const D=aD(e);let C=[""];for(const[E,a]of e.split(" ").entries()){t.trim!==false&&(C[C.length-1]=C[C.length-1].trimStart());let o=p(C[C.length-1]);if(E!==0&&(o>=u&&(t.wordWrap===false||t.trim===false)&&(C.push(""),o=0),(o>0||t.trim===false)&&(C[C.length-1]+=" ",o++)),t.hard&&D[E]>u){const c=u-o,f=1+Math.floor((D[E]-c-1)/u);Math.floor((D[E]-1)/u)<f&&C.push(""),k$1(C,a,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(t.wordWrap===false&&o<u){k$1(C,a,u);continue}C.push("");}if(o+D[E]>u&&t.wordWrap===false){k$1(C,a,u);continue}C[C.length-1]+=a;}t.trim!==false&&(C=C.map(E=>hD(E)));const n=[...C.join(`
373
+ `)];for(const[E,a]of n.entries()){if(F+=a,d$1.has(a)){const{groups:c}=new RegExp(`(?:\\${V$1}(?<code>\\d+)m|\\${_$1}(?<uri>.*)${y})`).exec(n.slice(E).join(""))||{groups:{}};if(c.code!==void 0){const f=Number.parseFloat(c.code);s=f===oD?void 0:f;}else c.uri!==void 0&&(i=c.uri.length===0?void 0:c.uri);}const o=ED.codes.get(Number(s));n[E+1]===`
374
+ `?(i&&(F+=K$1("")),s&&o&&(F+=z(o))):a===`
375
+ `&&(s&&o&&(F+=z(s)),i&&(F+=K$1(i)));}return F};function Y$1(e,u,t){return String(e).normalize().replace(/\r\n/g,`
355
376
  `).split(`
356
- `).map(t=>oD(t,u,F)).join(`
357
- `)}var nD=Object.defineProperty,aD=(e,u,F)=>u in e?nD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,a$1=(e,u,F)=>(aD(e,typeof u!="symbol"?u+"":u,F),F);function hD(e,u){if(e===u)return;const F=e.split(`
358
- `),t=u.split(`
359
- `),s=[];for(let C=0;C<Math.max(F.length,t.length);C++)F[C]!==t[C]&&s.push(C);return s}const V$1=Symbol("clack:cancel");function lD(e){return e===V$1}function v$1(e,u){e.isTTY&&e.setRawMode(u);}const z=new Map([["k","up"],["j","down"],["h","left"],["l","right"]]),xD=new Set(["up","down","left","right","space","enter"]);class x{constructor({render:u,input:F=stdin,output:t=stdout,...s},C=true){a$1(this,"input"),a$1(this,"output"),a$1(this,"rl"),a$1(this,"opts"),a$1(this,"_track",false),a$1(this,"_render"),a$1(this,"_cursor",0),a$1(this,"state","initial"),a$1(this,"value"),a$1(this,"error",""),a$1(this,"subscribers",new Map),a$1(this,"_prevFrame",""),this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=u.bind(this),this._track=C,this.input=F,this.output=t;}prompt(){const u=new WriteStream(0);return u._write=(F,t,s)=>{this._track&&(this.value=this.rl.line.replace(/\t/g,""),this._cursor=this.rl.cursor,this.emit("value",this.value)),s();},this.input.pipe(u),this.rl=f__default.createInterface({input:this.input,output:u,tabSize:2,prompt:"",escapeCodeTimeout:50}),f__default.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),v$1(this.input,true),this.output.on("resize",this.render),this.render(),new Promise((F,t)=>{this.once("submit",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v$1(this.input,false),F(this.value);}),this.once("cancel",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v$1(this.input,false),F(V$1);});})}on(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F}),this.subscribers.set(u,t);}once(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F,once:true}),this.subscribers.set(u,t);}emit(u,...F){const t=this.subscribers.get(u)??[],s=[];for(const C of t)C.cb(...F),C.once&&s.push(()=>t.splice(t.indexOf(C),1));for(const C of s)C();}unsubscribe(){this.subscribers.clear();}onKeypress(u,F){if(this.state==="error"&&(this.state="active"),F?.name&&!this._track&&z.has(F.name)&&this.emit("cursor",z.get(F.name)),F?.name&&xD.has(F.name)&&this.emit("cursor",F.name),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),F?.name==="return"){if(this.opts.validate){const t=this.opts.validate(this.value);t&&(this.error=t,this.state="error",this.rl.write(this.value));}this.state!=="error"&&(this.state="submit");}u===""&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close();}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
360
- `),v$1(this.input,false),this.rl.close(),this.emit(`${this.state}`,this.value),this.unsubscribe();}restoreCursor(){const u=R$1(this._prevFrame,process.stdout.columns,{hard:true}).split(`
361
- `).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=R$1(this._render(this)??"",process.stdout.columns,{hard:true});if(u!==this._prevFrame){if(this.state==="initial")this.output.write(srcExports.cursor.hide);else {const F=hD(this._prevFrame,u);if(this.restoreCursor(),F&&F?.length===1){const t=F[0];this.output.write(srcExports.cursor.move(0,t)),this.output.write(srcExports.erase.lines(1));const s=u.split(`
362
- `);this.output.write(s[t]),this._prevFrame=u,this.output.write(srcExports.cursor.move(0,s.length-t-1));return}else if(F&&F?.length>1){const t=F[0];this.output.write(srcExports.cursor.move(0,t)),this.output.write(srcExports.erase.down());const s=u.split(`
363
- `).slice(t);this.output.write(s.join(`
364
- `)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}class BD extends x{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(u){super(u,false),this.value=!!u.initialValue,this.on("value",()=>{this.value=this._value;}),this.on("confirm",F=>{this.output.write(srcExports.cursor.move(0,-1)),this.value=F,this.state="submit",this.close();}),this.on("cursor",()=>{this.value=!this.value;});}}var fD=Object.defineProperty,gD=(e,u,F)=>u in e?fD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,K$1=(e,u,F)=>(gD(e,typeof u!="symbol"?u+"":u,F),F);let vD=class extends x{constructor(u){super(u,false),K$1(this,"options"),K$1(this,"cursor",0),this.options=u.options,this.value=[...u.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:F})=>F===u.cursorAt),0),this.on("key",F=>{F==="a"&&this.toggleAll();}),this.on("cursor",F=>{switch(F){case "left":case "up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case "down":case "right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break;case "space":this.toggleValue();break}});}get _value(){return this.options[this.cursor].value}toggleAll(){const u=this.value.length===this.options.length;this.value=u?[]:this.options.map(F=>F.value);}toggleValue(){const u=this.value.includes(this._value);this.value=u?this.value.filter(F=>F!==this._value):[...this.value,this._value];}};var wD=Object.defineProperty,yD=(e,u,F)=>u in e?wD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,Z=(e,u,F)=>(yD(e,typeof u!="symbol"?u+"":u,F),F);let $D=class extends x{constructor(u){super(u,false),Z(this,"options"),Z(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:F})=>F===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",F=>{switch(F){case "left":case "up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case "down":case "right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue();});}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value;}};var TD=Object.defineProperty,jD=(e,u,F)=>u in e?TD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,MD=(e,u,F)=>(jD(e,u+"",F),F);class PD extends x{constructor(u){super(u),MD(this,"valueWithCursor",""),this.on("finalize",()=>{this.value||(this.value=u.defaultValue),this.valueWithCursor=this.value;}),this.on("value",()=>{if(this.cursor>=this.value.length)this.valueWithCursor=`${this.value}${color2.inverse(color2.hidden("_"))}`;else {const F=this.value.slice(0,this.cursor),t=this.value.slice(this.cursor);this.valueWithCursor=`${F}${color2.inverse(t[0])}${t.slice(1)}`;}});}get cursor(){return this._cursor}}const WD=globalThis.process.platform.startsWith("win");function OD({input:e=stdin,output:u=stdout,overwrite:F=true,hideCursor:t=true}={}){const s=f.createInterface({input:e,output:u,prompt:"",tabSize:1});f.emitKeypressEvents(e,s),e.isTTY&&e.setRawMode(true);const C=(D,{name:i})=>{if(String(D)===""){t&&u.write(srcExports.cursor.show),process.exit(0);return}if(!F)return;let n=i==="return"?0:-1,E=i==="return"?-1:0;f.moveCursor(u,n,E,()=>{f.clearLine(u,1,()=>{e.once("keypress",C);});});};return t&&u.write(srcExports.cursor.hide),e.once("keypress",C),()=>{e.off("keypress",C),t&&u.write(srcExports.cursor.show),e.isTTY&&!WD&&e.setRawMode(false),s.terminal=false,s.close();}}
365
-
366
- function K(){return h.platform!=="win32"?h.env.TERM!=="linux":!!h.env.CI||!!h.env.WT_SESSION||!!h.env.TERMINUS_SUBLIME||h.env.ConEmuTask==="{cmd::Cmder}"||h.env.TERM_PROGRAM==="Terminus-Sublime"||h.env.TERM_PROGRAM==="vscode"||h.env.TERM==="xterm-256color"||h.env.TERM==="alacritty"||h.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const C=K(),u=(s,n)=>C?s:n,Y=u("\u25C6","*"),P=u("\u25A0","x"),V=u("\u25B2","x"),M=u("\u25C7","o"),Q=u("\u250C","T"),a=u("\u2502","|"),$=u("\u2514","\u2014"),I=u("\u25CF",">"),T=u("\u25CB"," "),j=u("\u25FB","[\u2022]"),b=u("\u25FC","[+]"),B=u("\u25FB","[ ]"),G=u("\u2500","-"),H=u("\u256E","+"),ee=u("\u251C","+"),te=u("\u256F","+"),se=u("\u25CF","\u2022"),re=u("\u25C6","*"),ie=u("\u25B2","!"),ne=u("\u25A0","x"),y=s=>{switch(s){case "initial":case "active":return color2.cyan(Y);case "cancel":return color2.red(P);case "error":return color2.yellow(V);case "submit":return color2.green(M)}},E=s=>{const{cursor:n,options:t,style:i}=s,r=s.maxItems??1/0,o=Math.max(process.stdout.rows-4,0),c=Math.min(o,Math.max(r,5));let l=0;n>=l+c-3?l=Math.max(Math.min(n-c+3,t.length-c),0):n<l+2&&(l=Math.max(n-2,0));const d=c<t.length&&l>0,p=c<t.length&&l+c<t.length;return t.slice(l,l+c).map((S,f,x)=>{const g=f===0&&d,m=f===x.length-1&&p;return g||m?color2.dim("..."):i(S,f+l===n)})},ae=s=>new PD({validate:s.validate,placeholder:s.placeholder,defaultValue:s.defaultValue,initialValue:s.initialValue,render(){const n=`${color2.gray(a)}
367
- ${y(this.state)} ${s.message}
368
- `,t=s.placeholder?color2.inverse(s.placeholder[0])+color2.dim(s.placeholder.slice(1)):color2.inverse(color2.hidden("_")),i=this.value?this.valueWithCursor:t;switch(this.state){case "error":return `${n.trim()}
369
- ${color2.yellow(a)} ${i}
370
- ${color2.yellow($)} ${color2.yellow(this.error)}
371
- `;case "submit":return `${n}${color2.gray(a)} ${color2.dim(this.value||s.placeholder)}`;case "cancel":return `${n}${color2.gray(a)} ${color2.strikethrough(color2.dim(this.value??""))}${this.value?.trim()?`
372
- `+color2.gray(a):""}`;default:return `${n}${color2.cyan(a)} ${i}
373
- ${color2.cyan($)}
374
- `}}}).prompt(),ce=s=>{const n=s.active??"Yes",t=s.inactive??"No";return new BD({active:n,inactive:t,initialValue:s.initialValue??true,render(){const i=`${color2.gray(a)}
375
- ${y(this.state)} ${s.message}
376
- `,r=this.value?n:t;switch(this.state){case "submit":return `${i}${color2.gray(a)} ${color2.dim(r)}`;case "cancel":return `${i}${color2.gray(a)} ${color2.strikethrough(color2.dim(r))}
377
- ${color2.gray(a)}`;default:return `${i}${color2.cyan(a)} ${this.value?`${color2.green(I)} ${n}`:`${color2.dim(T)} ${color2.dim(n)}`} ${color2.dim("/")} ${this.value?`${color2.dim(T)} ${color2.dim(t)}`:`${color2.green(I)} ${t}`}
378
- ${color2.cyan($)}
379
- `}}}).prompt()},le=s=>{const n=(t,i)=>{const r=t.label??String(t.value);switch(i){case "selected":return `${color2.dim(r)}`;case "active":return `${color2.green(I)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`;case "cancelled":return `${color2.strikethrough(color2.dim(r))}`;default:return `${color2.dim(T)} ${color2.dim(r)}`}};return new $D({options:s.options,initialValue:s.initialValue,render(){const t=`${color2.gray(a)}
380
- ${y(this.state)} ${s.message}
381
- `;switch(this.state){case "submit":return `${t}${color2.gray(a)} ${n(this.options[this.cursor],"selected")}`;case "cancel":return `${t}${color2.gray(a)} ${n(this.options[this.cursor],"cancelled")}
382
- ${color2.gray(a)}`;default:return `${t}${color2.cyan(a)} ${E({cursor:this.cursor,options:this.options,maxItems:s.maxItems,style:(i,r)=>n(i,r?"active":"inactive")}).join(`
383
- ${color2.cyan(a)} `)}
384
- ${color2.cyan($)}
385
- `}}}).prompt()},$e=s=>{const n=(t,i)=>{const r=t.label??String(t.value);return i==="active"?`${color2.cyan(j)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`:i==="selected"?`${color2.green(b)} ${color2.dim(r)}`:i==="cancelled"?`${color2.strikethrough(color2.dim(r))}`:i==="active-selected"?`${color2.green(b)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`:i==="submitted"?`${color2.dim(r)}`:`${color2.dim(B)} ${color2.dim(r)}`};return new vD({options:s.options,initialValues:s.initialValues,required:s.required??true,cursorAt:s.cursorAt,validate(t){if(this.required&&t.length===0)return `Please select at least one option.
386
- ${color2.reset(color2.dim(`Press ${color2.gray(color2.bgWhite(color2.inverse(" space ")))} to select, ${color2.gray(color2.bgWhite(color2.inverse(" enter ")))} to submit`))}`},render(){let t=`${color2.gray(a)}
387
- ${y(this.state)} ${s.message}
388
- `;const i=(r,o)=>{const c=this.value.includes(r.value);return o&&c?n(r,"active-selected"):c?n(r,"selected"):n(r,o?"active":"inactive")};switch(this.state){case "submit":return `${t}${color2.gray(a)} ${this.options.filter(({value:r})=>this.value.includes(r)).map(r=>n(r,"submitted")).join(color2.dim(", "))||color2.dim("none")}`;case "cancel":{const r=this.options.filter(({value:o})=>this.value.includes(o)).map(o=>n(o,"cancelled")).join(color2.dim(", "));return `${t}${color2.gray(a)} ${r.trim()?`${r}
389
- ${color2.gray(a)}`:""}`}case "error":{const r=this.error.split(`
390
- `).map((o,c)=>c===0?`${color2.yellow($)} ${color2.yellow(o)}`:` ${o}`).join(`
391
- `);return t+color2.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
392
- ${color2.yellow(a)} `)+`
393
- `+r+`
394
- `}default:return `${t}${color2.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
395
- ${color2.cyan(a)} `)}
396
- ${color2.cyan($)}
397
- `}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
398
- ${s}
377
+ `).map(F=>lD(F,u,t)).join(`
378
+ `)}const xD=["up","down","left","right","space","enter","cancel"],B={actions:new Set(xD),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]])};function $(e,u){if(typeof e=="string")return B.aliases.get(e)===u;for(const t of e)if(t!==void 0&&$(t,u))return true;return false}function BD(e,u){if(e===u)return;const t=e.split(`
379
+ `),F=u.split(`
380
+ `),s=[];for(let i=0;i<Math.max(t.length,F.length);i++)t[i]!==F[i]&&s.push(i);return s}const AD=globalThis.process.platform.startsWith("win"),S=Symbol("clack:cancel");function pD(e){return e===S}function m(e,u){const t=e;t.isTTY&&t.setRawMode(u);}function fD({input:e=stdin,output:u=stdout,overwrite:t=true,hideCursor:F=true}={}){const s=g.createInterface({input:e,output:u,prompt:"",tabSize:1});g.emitKeypressEvents(e,s),e.isTTY&&e.setRawMode(true);const i=(D,{name:C,sequence:n})=>{const E=String(D);if($([E,C,n],"cancel")){F&&u.write(srcExports.cursor.show),process.exit(0);return}if(!t)return;const a=C==="return"?0:-1,o=C==="return"?-1:0;g.moveCursor(u,a,o,()=>{g.clearLine(u,1,()=>{e.once("keypress",i);});});};return F&&u.write(srcExports.cursor.hide),e.once("keypress",i),()=>{e.off("keypress",i),F&&u.write(srcExports.cursor.show),e.isTTY&&!AD&&e.setRawMode(false),s.terminal=false,s.close();}}var gD=Object.defineProperty,vD=(e,u,t)=>u in e?gD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,h=(e,u,t)=>(vD(e,typeof u!="symbol"?u+"":u,t),t);class x{constructor(u,t=true){h(this,"input"),h(this,"output"),h(this,"_abortSignal"),h(this,"rl"),h(this,"opts"),h(this,"_render"),h(this,"_track",false),h(this,"_prevFrame",""),h(this,"_subscribers",new Map),h(this,"_cursor",0),h(this,"state","initial"),h(this,"error",""),h(this,"value");const{input:F=stdin,output:s=stdout,render:i,signal:D,...C}=u;this.opts=C,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=t,this._abortSignal=D,this.input=F,this.output=s;}unsubscribe(){this._subscribers.clear();}setSubscriber(u,t){const F=this._subscribers.get(u)??[];F.push(t),this._subscribers.set(u,F);}on(u,t){this.setSubscriber(u,{cb:t});}once(u,t){this.setSubscriber(u,{cb:t,once:true});}emit(u,...t){const F=this._subscribers.get(u)??[],s=[];for(const i of F)i.cb(...t),i.once&&s.push(()=>F.splice(F.indexOf(i),1));for(const i of s)i();}prompt(){return new Promise((u,t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),u(S);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close();},{once:true});}const F=new Writable;F._write=(s,i,D)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),D();},this.input.pipe(F),this.rl=g__default.createInterface({input:this.input,output:F,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:true}),g__default.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),m(this.input,true),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),m(this.input,false),u(this.value);}),this.once("cancel",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),m(this.input,false),u(S);});})}onKeypress(u,t){if(this.state==="error"&&(this.state="active"),t?.name&&(!this._track&&B.aliases.has(t.name)&&this.emit("cursor",B.aliases.get(t.name)),B.actions.has(t.name)&&this.emit("cursor",t.name)),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),t?.name==="return"){if(this.opts.validate){const F=this.opts.validate(this.value);F&&(this.error=F instanceof Error?F.message:F,this.state="error",this.rl?.write(this.value));}this.state!=="error"&&(this.state="submit");}$([u,t?.name,t?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close();}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
381
+ `),m(this.input,false),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe();}restoreCursor(){const u=Y$1(this._prevFrame,process.stdout.columns,{hard:true}).split(`
382
+ `).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=Y$1(this._render(this)??"",process.stdout.columns,{hard:true});if(u!==this._prevFrame){if(this.state==="initial")this.output.write(srcExports.cursor.hide);else {const t=BD(this._prevFrame,u);if(this.restoreCursor(),t&&t?.length===1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.lines(1));const s=u.split(`
383
+ `);this.output.write(s[F]),this._prevFrame=u,this.output.write(srcExports.cursor.move(0,s.length-F-1));return}if(t&&t?.length>1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.down());const s=u.split(`
384
+ `).slice(F);this.output.write(s.join(`
385
+ `)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}var OD=Object.defineProperty,PD=(e,u,t)=>u in e?OD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,J=(e,u,t)=>(PD(e,typeof u!="symbol"?u+"":u,t),t);class LD extends x{constructor(u){super(u,false),J(this,"options"),J(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case "left":case "up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case "down":case "right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue();});}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value;}}class RD extends x{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return `${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...F]=this.value.slice(this.cursor);return `${u}${color2.inverse(t)}${F.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue);});}}
386
+
387
+ function ce(){return y$1.platform!=="win32"?y$1.env.TERM!=="linux":!!y$1.env.CI||!!y$1.env.WT_SESSION||!!y$1.env.TERMINUS_SUBLIME||y$1.env.ConEmuTask==="{cmd::Cmder}"||y$1.env.TERM_PROGRAM==="Terminus-Sublime"||y$1.env.TERM_PROGRAM==="vscode"||y$1.env.TERM==="xterm-256color"||y$1.env.TERM==="alacritty"||y$1.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const V=ce(),u=(t,n)=>V?t:n,le=u("\u25C6","*"),L=u("\u25A0","x"),W=u("\u25B2","x"),C=u("\u25C7","o"),ue=u("\u250C","T"),o=u("\u2502","|"),d=u("\u2514","\u2014"),k=u("\u25CF",">"),P=u("\u25CB"," "),_=u("\u2500","-"),me=u("\u256E","+"),de=u("\u251C","+"),pe=u("\u256F","+"),q=u("\u25CF","\u2022"),D=u("\u25C6","*"),U=u("\u25B2","!"),K=u("\u25A0","x"),b=t=>{switch(t){case "initial":case "active":return color2.cyan(le);case "cancel":return color2.red(L);case "error":return color2.yellow(W);case "submit":return color2.green(C)}},G=t=>{const{cursor:n,options:r,style:i}=t,s=t.maxItems??Number.POSITIVE_INFINITY,c=Math.max(process.stdout.rows-4,0),a=Math.min(c,Math.max(s,5));let l=0;n>=l+a-3?l=Math.max(Math.min(n-a+3,r.length-a),0):n<l+2&&(l=Math.max(n-2,0));const $=a<r.length&&l>0,g=a<r.length&&l+a<r.length;return r.slice(l,l+a).map((p,v,f)=>{const j=v===0&&$,E=v===f.length-1&&g;return j||E?color2.dim("..."):i(p,v+l===n)})},he=t=>new RD({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,render(){const n=`${color2.gray(o)}
388
+ ${b(this.state)} ${t.message}
389
+ `,r=t.placeholder?color2.inverse(t.placeholder[0])+color2.dim(t.placeholder.slice(1)):color2.inverse(color2.hidden("_")),i=this.value?this.valueWithCursor:r;switch(this.state){case "error":return `${n.trim()}
390
+ ${color2.yellow(o)} ${i}
391
+ ${color2.yellow(d)} ${color2.yellow(this.error)}
392
+ `;case "submit":return `${n}${color2.gray(o)} ${color2.dim(this.value||t.placeholder)}`;case "cancel":return `${n}${color2.gray(o)} ${color2.strikethrough(color2.dim(this.value??""))}${this.value?.trim()?`
393
+ ${color2.gray(o)}`:""}`;default:return `${n}${color2.cyan(o)} ${i}
394
+ ${color2.cyan(d)}
395
+ `}}}).prompt(),ve=t=>{const n=(r,i)=>{const s=r.label??String(r.value);switch(i){case "selected":return `${color2.dim(s)}`;case "active":return `${color2.green(k)} ${s} ${r.hint?color2.dim(`(${r.hint})`):""}`;case "cancelled":return `${color2.strikethrough(color2.dim(s))}`;default:return `${color2.dim(P)} ${color2.dim(s)}`}};return new LD({options:t.options,initialValue:t.initialValue,render(){const r=`${color2.gray(o)}
396
+ ${b(this.state)} ${t.message}
397
+ `;switch(this.state){case "submit":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"selected")}`;case "cancel":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"cancelled")}
398
+ ${color2.gray(o)}`;default:return `${r}${color2.cyan(o)} ${G({cursor:this.cursor,options:this.options,maxItems:t.maxItems,style:(i,s)=>n(i,s?"active":"inactive")}).join(`
399
+ ${color2.cyan(o)} `)}
400
+ ${color2.cyan(d)}
401
+ `}}}).prompt()},Me=(t="",n="")=>{const r=`
402
+ ${t}
399
403
  `.split(`
400
- `),i=R(n).length,r=Math.max(t.reduce((c,l)=>(l=R(l),l.length>c?l.length:c),0),i)+2,o=t.map(c=>`${color2.gray(a)} ${color2.dim(c)}${" ".repeat(r-R(c).length)}${color2.gray(a)}`).join(`
401
- `);process.stdout.write(`${color2.gray(a)}
402
- ${color2.green(M)} ${color2.reset(n)} ${color2.gray(G.repeat(Math.max(r-i-1,1))+H)}
403
- ${o}
404
- ${color2.gray(ee+G.repeat(r+2)+te)}
405
- `);},he=(s="")=>{process.stdout.write(`${color2.gray($)} ${color2.red(s)}
406
-
407
- `);},pe=(s="")=>{process.stdout.write(`${color2.gray(Q)} ${s}
408
- `);},ge=(s="")=>{process.stdout.write(`${color2.gray(a)}
409
- ${color2.gray($)} ${s}
410
-
411
- `);},v={message:(s="",{symbol:n=color2.gray(a)}={})=>{const t=[`${color2.gray(a)}`];if(s){const[i,...r]=s.split(`
412
- `);t.push(`${n} ${i}`,...r.map(o=>`${color2.gray(a)} ${o}`));}process.stdout.write(`${t.join(`
404
+ `),i=stripVTControlCharacters(n).length,s=Math.max(r.reduce((a,l)=>{const $=stripVTControlCharacters(l);return $.length>a?$.length:a},0),i)+2,c=r.map(a=>`${color2.gray(o)} ${color2.dim(a)}${" ".repeat(s-stripVTControlCharacters(a).length)}${color2.gray(o)}`).join(`
405
+ `);process.stdout.write(`${color2.gray(o)}
406
+ ${color2.green(C)} ${color2.reset(n)} ${color2.gray(_.repeat(Math.max(s-i-1,1))+me)}
407
+ ${c}
408
+ ${color2.gray(de+_.repeat(s+2)+pe)}
409
+ `);},xe=(t="")=>{process.stdout.write(`${color2.gray(d)} ${color2.red(t)}
410
+
411
+ `);},Ie=(t="")=>{process.stdout.write(`${color2.gray(ue)} ${t}
412
+ `);},Se=(t="")=>{process.stdout.write(`${color2.gray(o)}
413
+ ${color2.gray(d)} ${t}
414
+
415
+ `);},M={message:(t="",{symbol:n=color2.gray(o)}={})=>{const r=[`${color2.gray(o)}`];if(t){const[i,...s]=t.split(`
416
+ `);r.push(`${n} ${i}`,...s.map(c=>`${color2.gray(o)} ${c}`));}process.stdout.write(`${r.join(`
413
417
  `)}
414
- `);},info:s=>{v.message(s,{symbol:color2.blue(se)});},success:s=>{v.message(s,{symbol:color2.green(re)});},step:s=>{v.message(s,{symbol:color2.green(M)});},warn:s=>{v.message(s,{symbol:color2.yellow(ie)});},warning:s=>{v.warn(s);},error:s=>{v.message(s,{symbol:color2.red(ne)});}},_=()=>{const s=C?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],n=C?80:120;let t,i,r=false,o="";const c=g=>{const m=g>1?"Something went wrong":"Canceled";r&&x(m,g);},l=()=>c(2),d=()=>c(1),p=()=>{process.on("uncaughtExceptionMonitor",l),process.on("unhandledRejection",l),process.on("SIGINT",d),process.on("SIGTERM",d),process.on("exit",c);},S=()=>{process.removeListener("uncaughtExceptionMonitor",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d),process.removeListener("exit",c);},f=(g="")=>{r=true,t=OD(),o=g.replace(/\.+$/,""),process.stdout.write(`${color2.gray(a)}
415
- `);let m=0,w=0;p(),i=setInterval(()=>{const L=color2.magenta(s[m]),O=".".repeat(Math.floor(w)).slice(0,3);process.stdout.write(srcExports.cursor.move(-999,0)),process.stdout.write(srcExports.erase.down(1)),process.stdout.write(`${L} ${o}${O}`),m=m+1<s.length?m+1:0,w=w<s.length?w+.125:0;},n);},x=(g="",m=0)=>{o=g??o,r=false,clearInterval(i);const w=m===0?color2.green(M):m===1?color2.red(P):color2.red(V);process.stdout.write(srcExports.cursor.move(-999,0)),process.stdout.write(srcExports.erase.down(1)),process.stdout.write(`${w} ${o}
416
- `),S(),t();};return {start:f,stop:x,message:(g="")=>{o=g??o;}}};function ye(){const s=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(s,"g")}const ve=async(s,n)=>{const t={},i=Object.keys(s);for(const r of i){const o=s[r],c=await o({results:t})?.catch(l=>{throw l});if(typeof n?.onCancel=="function"&&lD(c)){t[r]="canceled",n.onCancel({results:t});continue}t[r]=c;}return t};
418
+ `);},info:t=>{M.message(t,{symbol:color2.blue(q)});},success:t=>{M.message(t,{symbol:color2.green(D)});},step:t=>{M.message(t,{symbol:color2.green(C)});},warn:t=>{M.message(t,{symbol:color2.yellow(U)});},warning:t=>{M.warn(t);},error:t=>{M.message(t,{symbol:color2.red(K)});}};`${color2.gray(o)} `;const Y=({indicator:t="dots"}={})=>{const n=V?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],r=V?80:120,i=process.env.CI==="true";let s,c,a=false,l="",$,g=performance.now();const p=m=>{const h=m>1?"Something went wrong":"Canceled";a&&N(h,m);},v=()=>p(2),f=()=>p(1),j=()=>{process.on("uncaughtExceptionMonitor",v),process.on("unhandledRejection",v),process.on("SIGINT",f),process.on("SIGTERM",f),process.on("exit",p);},E=()=>{process.removeListener("uncaughtExceptionMonitor",v),process.removeListener("unhandledRejection",v),process.removeListener("SIGINT",f),process.removeListener("SIGTERM",f),process.removeListener("exit",p);},B=()=>{if($===void 0)return;i&&process.stdout.write(`
419
+ `);const m=$.split(`
420
+ `);process.stdout.write(srcExports.cursor.move(-999,m.length-1)),process.stdout.write(srcExports.erase.down(m.length));},R=m=>m.replace(/\.+$/,""),O=m=>{const h=(performance.now()-m)/1e3,w=Math.floor(h/60),I=Math.floor(h%60);return w>0?`[${w}m ${I}s]`:`[${I}s]`},H=(m="")=>{a=true,s=fD(),l=R(m),g=performance.now(),process.stdout.write(`${color2.gray(o)}
421
+ `);let h=0,w=0;j(),c=setInterval(()=>{if(i&&l===$)return;B(),$=l;const I=color2.magenta(n[h]);if(i)process.stdout.write(`${I} ${l}...`);else if(t==="timer")process.stdout.write(`${I} ${l} ${O(g)}`);else {const z=".".repeat(Math.floor(w)).slice(0,3);process.stdout.write(`${I} ${l}${z}`);}h=h+1<n.length?h+1:0,w=w<n.length?w+.125:0;},r);},N=(m="",h=0)=>{a=false,clearInterval(c),B();const w=h===0?color2.green(C):h===1?color2.red(L):color2.red(W);l=R(m??l),t==="timer"?process.stdout.write(`${w} ${l} ${O(g)}
422
+ `):process.stdout.write(`${w} ${l}
423
+ `),E(),s();};return {start:H,stop:N,message:(m="")=>{l=R(m??l);}}},Ce=async(t,n)=>{const r={},i=Object.keys(t);for(const s of i){const c=t[s],a=await c({results:r})?.catch(l=>{throw l});if(typeof n?.onCancel=="function"&&pD(a)){r[s]="canceled",n.onCancel({results:r});continue}r[s]=a;}return r};
417
424
 
418
- var shellQuote$1 = {};
425
+ var shellQuote = {};
419
426
 
420
427
  var quote;
421
428
  var hasRequiredQuote;
@@ -432,8 +439,8 @@ function requireQuote () {
432
439
  if (s && typeof s === 'object') {
433
440
  return s.op.replace(/(.)/g, '\\$1');
434
441
  }
435
- if ((/["\s]/).test(s) && !(/'/).test(s)) {
436
- return "'" + s.replace(/(['\\])/g, '\\$1') + "'";
442
+ if ((/["\s\\]/).test(s) && !(/'/).test(s)) {
443
+ return "'" + s.replace(/(['])/g, '\\$1') + "'";
437
444
  }
438
445
  if ((/["'\s]/).test(s)) {
439
446
  return '"' + s.replace(/(["\\$`!])/g, '\\$1') + '"';
@@ -681,16 +688,16 @@ function requireParse () {
681
688
  var hasRequiredShellQuote;
682
689
 
683
690
  function requireShellQuote () {
684
- if (hasRequiredShellQuote) return shellQuote$1;
691
+ if (hasRequiredShellQuote) return shellQuote;
685
692
  hasRequiredShellQuote = 1;
686
693
 
687
- shellQuote$1.quote = requireQuote();
688
- shellQuote$1.parse = requireParse();
689
- return shellQuote$1;
694
+ shellQuote.quote = requireQuote();
695
+ shellQuote.parse = requireParse();
696
+ return shellQuote;
690
697
  }
691
698
 
692
699
  var shellQuoteExports = requireShellQuote();
693
- var shellQuote = /*@__PURE__*/getDefaultExportFromCjs(shellQuoteExports);
700
+ var shellQuote2 = /*@__PURE__*/getDefaultExportFromCjs(shellQuoteExports);
694
701
 
695
702
  // eslint-disable-next-line no-warning-comments
696
703
  // TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
@@ -717,13 +724,18 @@ const format = (open, close) => {
717
724
  // Handle nested colors.
718
725
 
719
726
  // We could have done this, but it's too slow (as of Node.js 22).
720
- // return openCode + string.replaceAll(closeCode, openCode) + closeCode;
727
+ // return openCode + string.replaceAll(closeCode, (close === 22 ? closeCode : '') + openCode) + closeCode;
721
728
 
722
729
  let result = openCode;
723
730
  let lastIndex = 0;
724
731
 
732
+ // SGR 22 resets both bold (1) and dim (2). When we encounter a nested
733
+ // close for styles that use 22, we need to re-open the outer style.
734
+ const reopenOnNestedClose = close === 22;
735
+ const replaceCode = (reopenOnNestedClose ? closeCode : '') + openCode;
736
+
725
737
  while (index !== -1) {
726
- result += string.slice(lastIndex, index) + openCode;
738
+ result += string.slice(lastIndex, index) + replaceCode;
727
739
  lastIndex = index + closeCode.length;
728
740
  index = string.indexOf(closeCode, lastIndex);
729
741
  }
@@ -825,18 +837,20 @@ var yoctocolors = /*#__PURE__*/Object.freeze({
825
837
  yellowBright: yellowBright
826
838
  });
827
839
 
828
- const isUnicodeSupported = h.platform !== 'win32' || Boolean(h.env.WT_SESSION);
840
+ const isUnicodeSupported = y$1.platform !== 'win32'
841
+ || Boolean(y$1.env.WT_SESSION) // Windows Terminal
842
+ || y$1.env.TERM_PROGRAM === 'vscode';
829
843
 
830
844
  const isInteractive = stream => Boolean(
831
845
  stream.isTTY
832
- && h.env.TERM !== 'dumb'
833
- && !('CI' in h.env),
846
+ && y$1.env.TERM !== 'dumb'
847
+ && !('CI' in y$1.env),
834
848
  );
835
849
 
836
850
  const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
837
851
  const successSymbol = green(isUnicodeSupported ? '✔' : '√');
838
852
  const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
839
- const errorSymbol = red(isUnicodeSupported ? '✖️' : '×');
853
+ const errorSymbol = red(isUnicodeSupported ? '' : '×');
840
854
 
841
855
  const defaultSpinner = {
842
856
  frames: isUnicodeSupported
@@ -873,13 +887,14 @@ class YoctoSpinner {
873
887
  #exitHandlerBound;
874
888
  #isInteractive;
875
889
  #lastSpinnerFrameTime = 0;
890
+ #isSpinning = false;
876
891
 
877
892
  constructor(options = {}) {
878
893
  const spinner = options.spinner ?? defaultSpinner;
879
894
  this.#frames = spinner.frames;
880
895
  this.#interval = spinner.interval;
881
896
  this.#text = options.text ?? '';
882
- this.#stream = options.stream ?? h.stderr;
897
+ this.#stream = options.stream ?? y$1.stderr;
883
898
  this.#color = options.color ?? 'cyan';
884
899
  this.#isInteractive = isInteractive(this.#stream);
885
900
  this.#exitHandlerBound = this.#exitHandler.bind(this);
@@ -894,13 +909,17 @@ class YoctoSpinner {
894
909
  return this;
895
910
  }
896
911
 
912
+ this.#isSpinning = true;
897
913
  this.#hideCursor();
898
914
  this.#render();
899
915
  this.#subscribeToProcessEvents();
900
916
 
901
- this.#timer = setInterval(() => {
902
- this.#render();
903
- }, this.#interval);
917
+ // Only start the timer in interactive mode
918
+ if (this.#isInteractive) {
919
+ this.#timer = setInterval(() => {
920
+ this.#render();
921
+ }, this.#interval);
922
+ }
904
923
 
905
924
  return this;
906
925
  }
@@ -910,8 +929,12 @@ class YoctoSpinner {
910
929
  return this;
911
930
  }
912
931
 
913
- clearInterval(this.#timer);
914
- this.#timer = undefined;
932
+ this.#isSpinning = false;
933
+ if (this.#timer) {
934
+ clearInterval(this.#timer);
935
+ this.#timer = undefined;
936
+ }
937
+
915
938
  this.#showCursor();
916
939
  this.clear();
917
940
  this.#unsubscribeFromProcessEvents();
@@ -944,15 +967,15 @@ class YoctoSpinner {
944
967
  }
945
968
 
946
969
  get isSpinning() {
947
- return this.#timer !== undefined;
970
+ return this.#isSpinning;
948
971
  }
949
972
 
950
973
  get text() {
951
974
  return this.#text;
952
975
  }
953
976
 
954
- set text(value = '') {
955
- this.#text = value;
977
+ set text(value) {
978
+ this.#text = value ?? '';
956
979
  this.#render();
957
980
  }
958
981
 
@@ -1016,7 +1039,7 @@ class YoctoSpinner {
1016
1039
 
1017
1040
  #lineCount(text) {
1018
1041
  const width = this.#stream.columns ?? 80;
1019
- const lines = text.split('\n');
1042
+ const lines = stripVTControlCharacters(text).split('\n');
1020
1043
 
1021
1044
  let lineCount = 0;
1022
1045
  for (const line of lines) {
@@ -1039,13 +1062,13 @@ class YoctoSpinner {
1039
1062
  }
1040
1063
 
1041
1064
  #subscribeToProcessEvents() {
1042
- h.once('SIGINT', this.#exitHandlerBound);
1043
- h.once('SIGTERM', this.#exitHandlerBound);
1065
+ y$1.once('SIGINT', this.#exitHandlerBound);
1066
+ y$1.once('SIGTERM', this.#exitHandlerBound);
1044
1067
  }
1045
1068
 
1046
1069
  #unsubscribeFromProcessEvents() {
1047
- h.off('SIGINT', this.#exitHandlerBound);
1048
- h.off('SIGTERM', this.#exitHandlerBound);
1070
+ y$1.off('SIGINT', this.#exitHandlerBound);
1071
+ y$1.off('SIGTERM', this.#exitHandlerBound);
1049
1072
  }
1050
1073
 
1051
1074
  #exitHandler(signal) {
@@ -1056,7 +1079,7 @@ class YoctoSpinner {
1056
1079
  // SIGINT: 128 + 2
1057
1080
  // SIGTERM: 128 + 15
1058
1081
  const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
1059
- h.exit(exitCode);
1082
+ y$1.exit(exitCode);
1060
1083
  }
1061
1084
  }
1062
1085
 
@@ -1081,11 +1104,11 @@ var MastraLogger = class {
1081
1104
  }
1082
1105
  trackException(_error) {
1083
1106
  }
1084
- async getLogs(transportId, params) {
1107
+ async listLogs(transportId, params) {
1085
1108
  if (!transportId || !this.transports.has(transportId)) {
1086
1109
  return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
1087
1110
  }
1088
- return this.transports.get(transportId).getLogs(params) ?? {
1111
+ return this.transports.get(transportId).listLogs(params) ?? {
1089
1112
  logs: [],
1090
1113
  total: 0,
1091
1114
  page: params?.page ?? 1,
@@ -1093,7 +1116,7 @@ var MastraLogger = class {
1093
1116
  hasMore: false
1094
1117
  };
1095
1118
  }
1096
- async getLogsByRunId({
1119
+ async listLogsByRunId({
1097
1120
  transportId,
1098
1121
  runId,
1099
1122
  fromDate,
@@ -1106,7 +1129,7 @@ var MastraLogger = class {
1106
1129
  if (!transportId || !this.transports.has(transportId) || !runId) {
1107
1130
  return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
1108
1131
  }
1109
- return this.transports.get(transportId).getLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
1132
+ return this.transports.get(transportId).listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
1110
1133
  logs: [],
1111
1134
  total: 0,
1112
1135
  page: page ?? 1,
@@ -1136,9 +1159,7 @@ var PinoLogger = class extends MastraLogger {
1136
1159
  {
1137
1160
  name: options.name || "app",
1138
1161
  level: options.level || LogLevel.INFO,
1139
- formatters: {
1140
- level: (label) => ({ level: label })
1141
- }
1162
+ formatters: options.formatters
1142
1163
  },
1143
1164
  options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
1144
1165
  ...transportsAry.map(([, transport]) => ({
@@ -1166,6 +1187,22 @@ var PinoLogger = class extends MastraLogger {
1166
1187
  }
1167
1188
  };
1168
1189
 
1190
+ var package_default = {
1191
+ version: "1.0.0-beta.2"};
1192
+ function getPackageManagerAddCommand(pm) {
1193
+ switch (pm) {
1194
+ case "npm":
1195
+ return "install --audit=false --fund=false --loglevel=error --progress=false --update-notifier=false";
1196
+ case "yarn":
1197
+ return "add";
1198
+ case "pnpm":
1199
+ return "add --loglevel=error";
1200
+ case "bun":
1201
+ return "add";
1202
+ default:
1203
+ return "add";
1204
+ }
1205
+ }
1169
1206
  var DepsService = class {
1170
1207
  packageManager;
1171
1208
  constructor() {
@@ -1174,11 +1211,11 @@ var DepsService = class {
1174
1211
  findLockFile(dir) {
1175
1212
  const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
1176
1213
  for (const file of lockFiles) {
1177
- if (fs3__default__default.existsSync(path2.join(dir, file))) {
1214
+ if (fs3__default__default.existsSync(path3.join(dir, file))) {
1178
1215
  return file;
1179
1216
  }
1180
1217
  }
1181
- const parentDir = path2.resolve(dir, "..");
1218
+ const parentDir = path3.resolve(dir, "..");
1182
1219
  if (parentDir !== dir) {
1183
1220
  return this.findLockFile(parentDir);
1184
1221
  }
@@ -1200,14 +1237,10 @@ var DepsService = class {
1200
1237
  }
1201
1238
  }
1202
1239
  async installPackages(packages) {
1203
- let runCommand = this.packageManager;
1204
- if (this.packageManager === "npm") {
1205
- runCommand = `${this.packageManager} i`;
1206
- } else {
1207
- runCommand = `${this.packageManager} add`;
1208
- }
1240
+ const pm = this.packageManager;
1241
+ const installCommand = getPackageManagerAddCommand(pm);
1209
1242
  const packageList = packages.join(" ");
1210
- return execa(`${runCommand} ${packageList}`, {
1243
+ return execa(`${pm} ${installCommand} ${packageList}`, {
1211
1244
  all: true,
1212
1245
  shell: true,
1213
1246
  stdio: "inherit"
@@ -1215,7 +1248,7 @@ var DepsService = class {
1215
1248
  }
1216
1249
  async checkDependencies(dependencies) {
1217
1250
  try {
1218
- const packageJsonPath = path2.join(process.cwd(), "package.json");
1251
+ const packageJsonPath = path3.join(process.cwd(), "package.json");
1219
1252
  try {
1220
1253
  await fs4.access(packageJsonPath);
1221
1254
  } catch {
@@ -1235,7 +1268,7 @@ var DepsService = class {
1235
1268
  }
1236
1269
  async getProjectName() {
1237
1270
  try {
1238
- const packageJsonPath = path2.join(process.cwd(), "package.json");
1271
+ const packageJsonPath = path3.join(process.cwd(), "package.json");
1239
1272
  const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
1240
1273
  const pkg = JSON.parse(packageJson);
1241
1274
  return pkg.name;
@@ -1243,13 +1276,6 @@ var DepsService = class {
1243
1276
  throw err;
1244
1277
  }
1245
1278
  }
1246
- async getPackageVersion() {
1247
- const __filename = fileURLToPath(import.meta.url);
1248
- const __dirname = dirname(__filename);
1249
- const pkgJsonPath = path2.join(__dirname, "..", "package.json");
1250
- const content = await fsExtra3.readJSON(pkgJsonPath);
1251
- return content.version;
1252
- }
1253
1279
  async addScriptsToPackageJson(scripts) {
1254
1280
  const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
1255
1281
  packageJson.scripts = {
@@ -1259,153 +1285,6 @@ var DepsService = class {
1259
1285
  await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
1260
1286
  }
1261
1287
  };
1262
- function getPackageManager() {
1263
- const userAgent = process.env.npm_config_user_agent || "";
1264
- const execPath = process.env.npm_execpath || "";
1265
- if (userAgent.includes("yarn")) {
1266
- return "yarn";
1267
- }
1268
- if (userAgent.includes("pnpm")) {
1269
- return "pnpm";
1270
- }
1271
- if (userAgent.includes("npm")) {
1272
- return "npm";
1273
- }
1274
- if (execPath.includes("yarn")) {
1275
- return "yarn";
1276
- }
1277
- if (execPath.includes("pnpm")) {
1278
- return "pnpm";
1279
- }
1280
- if (execPath.includes("npm")) {
1281
- return "npm";
1282
- }
1283
- return "npm";
1284
- }
1285
- function getPackageManagerInstallCommand(pm) {
1286
- switch (pm) {
1287
- case "npm":
1288
- return "install";
1289
- case "yarn":
1290
- return "add";
1291
- case "pnpm":
1292
- return "add";
1293
- default:
1294
- return "install";
1295
- }
1296
- }
1297
- var args = ["-y", "@mastra/mcp-docs-server"];
1298
- var createMcpConfig = (editor) => {
1299
- if (editor === "vscode") {
1300
- return {
1301
- servers: {
1302
- mastra: process.platform === `win32` ? {
1303
- command: "cmd",
1304
- args: ["/c", "npx", ...args],
1305
- type: "stdio"
1306
- } : {
1307
- command: "npx",
1308
- args,
1309
- type: "stdio"
1310
- }
1311
- }
1312
- };
1313
- }
1314
- return {
1315
- mcpServers: {
1316
- mastra: {
1317
- command: "npx",
1318
- args
1319
- }
1320
- }
1321
- };
1322
- };
1323
- function makeConfig(original, editor) {
1324
- if (editor === "vscode") {
1325
- return {
1326
- ...original,
1327
- servers: {
1328
- ...original?.servers || {},
1329
- ...createMcpConfig(editor).servers
1330
- }
1331
- };
1332
- }
1333
- return {
1334
- ...original,
1335
- mcpServers: {
1336
- ...original?.mcpServers || {},
1337
- ...createMcpConfig(editor).mcpServers
1338
- }
1339
- };
1340
- }
1341
- async function writeMergedConfig(configPath, editor) {
1342
- const configExists = existsSync(configPath);
1343
- const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor);
1344
- await ensureFile(configPath);
1345
- await writeJSON(configPath, config, {
1346
- spaces: 2
1347
- });
1348
- }
1349
- var windsurfGlobalMCPConfigPath = path2.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
1350
- var cursorGlobalMCPConfigPath = path2.join(os.homedir(), ".cursor", "mcp.json");
1351
- path2.join(process.cwd(), ".vscode", "mcp.json");
1352
- var vscodeGlobalMCPConfigPath = path2.join(
1353
- os.homedir(),
1354
- process.platform === "win32" ? path2.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path2.join("Library", "Application Support", "Code", "User", "settings.json") : path2.join(".config", "Code", "User", "settings.json")
1355
- );
1356
- async function installMastraDocsMCPServer({ editor, directory }) {
1357
- if (editor === `cursor`) {
1358
- await writeMergedConfig(path2.join(directory, ".cursor", "mcp.json"), "cursor");
1359
- }
1360
- if (editor === `vscode`) {
1361
- await writeMergedConfig(path2.join(directory, ".vscode", "mcp.json"), "vscode");
1362
- }
1363
- if (editor === `cursor-global`) {
1364
- const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
1365
- if (alreadyInstalled) {
1366
- return;
1367
- }
1368
- await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global");
1369
- }
1370
- if (editor === `windsurf`) {
1371
- const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
1372
- if (alreadyInstalled) {
1373
- return;
1374
- }
1375
- await writeMergedConfig(windsurfGlobalMCPConfigPath, editor);
1376
- }
1377
- }
1378
- async function globalMCPIsAlreadyInstalled(editor) {
1379
- let configPath = ``;
1380
- if (editor === "windsurf") {
1381
- configPath = windsurfGlobalMCPConfigPath;
1382
- } else if (editor === "cursor-global") {
1383
- configPath = cursorGlobalMCPConfigPath;
1384
- } else if (editor === "vscode") {
1385
- configPath = vscodeGlobalMCPConfigPath;
1386
- }
1387
- if (!configPath || !existsSync(configPath)) {
1388
- return false;
1389
- }
1390
- try {
1391
- const configContents = await readJSON(configPath);
1392
- if (editor === "vscode") {
1393
- if (!configContents?.servers) return false;
1394
- const hasMastraMCP2 = Object.values(configContents.servers).some(
1395
- (server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
1396
- );
1397
- return hasMastraMCP2;
1398
- }
1399
- if (!configContents?.mcpServers) return false;
1400
- const hasMastraMCP = Object.values(configContents.mcpServers).some(
1401
- (server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
1402
- );
1403
- return hasMastraMCP;
1404
- } catch (e) {
1405
- console.error(e);
1406
- return false;
1407
- }
1408
- }
1409
1288
  var EnvService = class {
1410
1289
  };
1411
1290
  var FileEnvService = class extends EnvService {
@@ -1444,7 +1323,7 @@ var FileEnvService = class extends EnvService {
1444
1323
  ${key}=${value}`;
1445
1324
  }
1446
1325
  await this.writeFile({ filePath, data });
1447
- console.log(`${key} set to ${value} in ENV file.`);
1326
+ console.info(`${key} set to ${value} in ENV file.`);
1448
1327
  return data;
1449
1328
  }
1450
1329
  async getEnvValue(key) {
@@ -1477,19 +1356,19 @@ var FileService = class {
1477
1356
  */
1478
1357
  async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
1479
1358
  const __filename = fileURLToPath(import.meta.url);
1480
- const __dirname = path2.dirname(__filename);
1481
- const filePath = path2.resolve(__dirname, "starter-files", inputFile);
1359
+ const __dirname = path3.dirname(__filename);
1360
+ const filePath = path3.resolve(__dirname, "starter-files", inputFile);
1482
1361
  const fileString = fs3__default__default.readFileSync(filePath, "utf8");
1483
1362
  if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
1484
- console.log(`${outputFilePath} already exists`);
1363
+ console.info(`${outputFilePath} already exists`);
1485
1364
  return false;
1486
1365
  }
1487
- await fsExtra3.outputFile(outputFilePath, fileString);
1366
+ await fsExtra.outputFile(outputFilePath, fileString);
1488
1367
  return true;
1489
1368
  }
1490
1369
  async setupEnvFile({ dbUrl }) {
1491
- const envPath = path2.join(process.cwd(), ".env.development");
1492
- await fsExtra3.ensureFile(envPath);
1370
+ const envPath = path3.join(process.cwd(), ".env.development");
1371
+ await fsExtra.ensureFile(envPath);
1493
1372
  const fileEnvService = new FileEnvService(envPath);
1494
1373
  await fileEnvService.setEnvValue("DB_URL", dbUrl);
1495
1374
  }
@@ -1512,76 +1391,198 @@ var FileService = class {
1512
1391
  fs3__default__default.writeFileSync(filePath, fileContent);
1513
1392
  }
1514
1393
  };
1515
- new PinoLogger({
1516
- name: "Mastra CLI",
1517
- level: "debug"
1518
- });
1519
- var exec = util.promisify(child_process.exec);
1520
- var getAISDKPackage = (llmProvider) => {
1521
- switch (llmProvider) {
1522
- case "openai":
1523
- return "@ai-sdk/openai";
1524
- case "anthropic":
1525
- return "@ai-sdk/anthropic";
1526
- case "groq":
1527
- return "@ai-sdk/groq";
1528
- case "google":
1529
- return "@ai-sdk/google";
1530
- case "cerebras":
1531
- return "@ai-sdk/cerebras";
1532
- default:
1533
- return "@ai-sdk/openai";
1394
+ var createArgs = (versionTag) => {
1395
+ const packageName = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
1396
+ return ["-y", packageName];
1397
+ };
1398
+ var createMcpConfig = (editor, versionTag) => {
1399
+ const args = createArgs(versionTag);
1400
+ if (editor === "vscode") {
1401
+ return {
1402
+ servers: {
1403
+ mastra: process.platform === `win32` ? {
1404
+ command: "cmd",
1405
+ args: ["/c", "npx", ...args],
1406
+ type: "stdio"
1407
+ } : {
1408
+ command: "npx",
1409
+ args,
1410
+ type: "stdio"
1411
+ }
1412
+ }
1413
+ };
1534
1414
  }
1415
+ return {
1416
+ mcpServers: {
1417
+ mastra: {
1418
+ command: "npx",
1419
+ args
1420
+ }
1421
+ }
1422
+ };
1535
1423
  };
1536
- var getProviderImportAndModelItem = (llmProvider) => {
1537
- let providerImport = "";
1538
- let modelItem = "";
1539
- if (llmProvider === "openai") {
1540
- providerImport = `import { openai } from '${getAISDKPackage(llmProvider)}';`;
1541
- modelItem = `openai('gpt-4o-mini')`;
1542
- } else if (llmProvider === "anthropic") {
1543
- providerImport = `import { anthropic } from '${getAISDKPackage(llmProvider)}';`;
1544
- modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
1424
+ function makeConfig(original, editor, versionTag) {
1425
+ if (editor === "vscode") {
1426
+ return {
1427
+ ...original,
1428
+ servers: {
1429
+ ...original?.servers || {},
1430
+ ...createMcpConfig(editor, versionTag).servers
1431
+ }
1432
+ };
1433
+ }
1434
+ return {
1435
+ ...original,
1436
+ mcpServers: {
1437
+ ...original?.mcpServers || {},
1438
+ ...createMcpConfig(editor, versionTag).mcpServers
1439
+ }
1440
+ };
1441
+ }
1442
+ async function writeMergedConfig(configPath, editor, versionTag) {
1443
+ const configExists = existsSync(configPath);
1444
+ const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor, versionTag);
1445
+ await ensureFile(configPath);
1446
+ await writeJSON(configPath, config, {
1447
+ spaces: 2
1448
+ });
1449
+ }
1450
+ var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
1451
+ var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
1452
+ path3.join(process.cwd(), ".vscode", "mcp.json");
1453
+ var vscodeGlobalMCPConfigPath = path3.join(
1454
+ os.homedir(),
1455
+ process.platform === "win32" ? path3.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path3.join("Library", "Application Support", "Code", "User", "settings.json") : path3.join(".config", "Code", "User", "settings.json")
1456
+ );
1457
+ async function installMastraDocsMCPServer({
1458
+ editor,
1459
+ directory,
1460
+ versionTag
1461
+ }) {
1462
+ if (editor === `cursor`) {
1463
+ await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor", versionTag);
1464
+ }
1465
+ if (editor === `vscode`) {
1466
+ await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode", versionTag);
1467
+ }
1468
+ if (editor === `cursor-global`) {
1469
+ const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
1470
+ if (alreadyInstalled) {
1471
+ return;
1472
+ }
1473
+ await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global", versionTag);
1474
+ }
1475
+ if (editor === `windsurf`) {
1476
+ const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
1477
+ if (alreadyInstalled) {
1478
+ return;
1479
+ }
1480
+ await writeMergedConfig(windsurfGlobalMCPConfigPath, editor, versionTag);
1481
+ }
1482
+ }
1483
+ async function globalMCPIsAlreadyInstalled(editor, versionTag) {
1484
+ let configPath = ``;
1485
+ if (editor === "windsurf") {
1486
+ configPath = windsurfGlobalMCPConfigPath;
1487
+ } else if (editor === "cursor-global") {
1488
+ configPath = cursorGlobalMCPConfigPath;
1489
+ } else if (editor === "vscode") {
1490
+ configPath = vscodeGlobalMCPConfigPath;
1491
+ }
1492
+ if (!configPath || !existsSync(configPath)) {
1493
+ return false;
1494
+ }
1495
+ try {
1496
+ const configContents = await readJSON(configPath);
1497
+ if (!configContents) return false;
1498
+ const expectedPackage = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
1499
+ if (editor === "vscode") {
1500
+ if (!configContents.servers) return false;
1501
+ const hasMastraMCP2 = Object.values(configContents.servers).some(
1502
+ (server) => server?.args?.find((arg) => arg === expectedPackage)
1503
+ );
1504
+ return hasMastraMCP2;
1505
+ }
1506
+ if (!configContents?.mcpServers) return false;
1507
+ const hasMastraMCP = Object.values(configContents.mcpServers).some(
1508
+ (server) => server?.args?.find((arg) => arg === expectedPackage)
1509
+ );
1510
+ return hasMastraMCP;
1511
+ } catch {
1512
+ return false;
1513
+ }
1514
+ }
1515
+ var exec = util.promisify(child_process.exec);
1516
+ var getModelIdentifier = (llmProvider) => {
1517
+ let model = "openai/gpt-4o";
1518
+ if (llmProvider === "anthropic") {
1519
+ model = "anthropic/claude-sonnet-4-5";
1545
1520
  } else if (llmProvider === "groq") {
1546
- providerImport = `import { groq } from '${getAISDKPackage(llmProvider)}';`;
1547
- modelItem = `groq('llama-3.3-70b-versatile')`;
1521
+ model = "groq/llama-3.3-70b-versatile";
1548
1522
  } else if (llmProvider === "google") {
1549
- providerImport = `import { google } from '${getAISDKPackage(llmProvider)}';`;
1550
- modelItem = `google('gemini-1.5-pro-latest')`;
1523
+ model = "google/gemini-2.5-pro";
1551
1524
  } else if (llmProvider === "cerebras") {
1552
- providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
1553
- modelItem = `cerebras('llama-3.3-70b')`;
1525
+ model = "cerebras/llama-3.3-70b";
1526
+ } else if (llmProvider === "mistral") {
1527
+ model = "mistral/mistral-medium-2508";
1554
1528
  }
1555
- return { providerImport, modelItem };
1529
+ return model;
1556
1530
  };
1557
- async function writeAgentSample(llmProvider, destPath, addExampleTool) {
1558
- const { providerImport, modelItem } = getProviderImportAndModelItem(llmProvider);
1531
+ async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorers) {
1532
+ const modelString = getModelIdentifier(llmProvider);
1559
1533
  const instructions = `
1560
- You are a helpful weather assistant that provides accurate weather information.
1534
+ You are a helpful weather assistant that provides accurate weather information and can help planning activities based on the weather.
1561
1535
 
1562
1536
  Your primary function is to help users get weather details for specific locations. When responding:
1563
1537
  - Always ask for a location if none is provided
1564
- - If the location name isn\u2019t in English, please translate it
1538
+ - If the location name isn't in English, please translate it
1565
1539
  - If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
1566
1540
  - Include relevant details like humidity, wind conditions, and precipitation
1567
1541
  - Keep responses concise but informative
1542
+ - If the user asks for activities and provides the weather forecast, suggest activities based on the weather forecast.
1543
+ - If the user asks for activities, respond in the format they request.
1568
1544
 
1569
1545
  ${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
1570
1546
  `;
1571
1547
  const content = `
1572
- ${providerImport}
1573
1548
  import { Agent } from '@mastra/core/agent';
1574
1549
  import { Memory } from '@mastra/memory';
1575
1550
  import { LibSQLStore } from '@mastra/libsql';
1576
1551
  ${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
1552
+ ${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
1577
1553
 
1578
1554
  export const weatherAgent = new Agent({
1555
+ id: 'weather-agent',
1579
1556
  name: 'Weather Agent',
1580
1557
  instructions: \`${instructions}\`,
1581
- model: ${modelItem},
1558
+ model: '${modelString}',
1582
1559
  ${addExampleTool ? "tools: { weatherTool }," : ""}
1560
+ ${addScorers ? `scorers: {
1561
+ toolCallAppropriateness: {
1562
+ scorer: scorers.toolCallAppropriatenessScorer,
1563
+ sampling: {
1564
+ type: 'ratio',
1565
+ rate: 1,
1566
+ },
1567
+ },
1568
+ completeness: {
1569
+ scorer: scorers.completenessScorer,
1570
+ sampling: {
1571
+ type: 'ratio',
1572
+ rate: 1,
1573
+ },
1574
+ },
1575
+ translation: {
1576
+ scorer: scorers.translationScorer,
1577
+ sampling: {
1578
+ type: 'ratio',
1579
+ rate: 1,
1580
+ },
1581
+ },
1582
+ },` : ""}
1583
1583
  memory: new Memory({
1584
1584
  storage: new LibSQLStore({
1585
+ id: "memory-storage",
1585
1586
  url: "file:../mastra.db", // path is relative to the .mastra/output directory
1586
1587
  })
1587
1588
  })
@@ -1594,63 +1595,10 @@ export const weatherAgent = new Agent({
1594
1595
  await fs4.writeFile(destPath, "");
1595
1596
  await fs4.writeFile(destPath, formattedContent);
1596
1597
  }
1597
- async function writeWorkflowSample(destPath, llmProvider) {
1598
- const { providerImport, modelItem } = getProviderImportAndModelItem(llmProvider);
1599
- const content = `${providerImport}
1600
- import { Agent } from '@mastra/core/agent';
1601
- import { createStep, createWorkflow } from '@mastra/core/workflows';
1598
+ async function writeWorkflowSample(destPath) {
1599
+ const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
1602
1600
  import { z } from 'zod';
1603
1601
 
1604
- const llm = ${modelItem};
1605
-
1606
- const agent = new Agent({
1607
- name: 'Weather Agent',
1608
- model: llm,
1609
- instructions: \`
1610
- You are a local activities and travel expert who excels at weather-based planning. Analyze the weather data and provide practical activity recommendations.
1611
-
1612
- For each day in the forecast, structure your response exactly as follows:
1613
-
1614
- \u{1F4C5} [Day, Month Date, Year]
1615
- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
1616
-
1617
- \u{1F321}\uFE0F WEATHER SUMMARY
1618
- \u2022 Conditions: [brief description]
1619
- \u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
1620
- \u2022 Precipitation: [X% chance]
1621
-
1622
- \u{1F305} MORNING ACTIVITIES
1623
- Outdoor:
1624
- \u2022 [Activity Name] - [Brief description including specific location/route]
1625
- Best timing: [specific time range]
1626
- Note: [relevant weather consideration]
1627
-
1628
- \u{1F31E} AFTERNOON ACTIVITIES
1629
- Outdoor:
1630
- \u2022 [Activity Name] - [Brief description including specific location/route]
1631
- Best timing: [specific time range]
1632
- Note: [relevant weather consideration]
1633
-
1634
- \u{1F3E0} INDOOR ALTERNATIVES
1635
- \u2022 [Activity Name] - [Brief description including specific venue]
1636
- Ideal for: [weather condition that would trigger this alternative]
1637
-
1638
- \u26A0\uFE0F SPECIAL CONSIDERATIONS
1639
- \u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
1640
-
1641
- Guidelines:
1642
- - Suggest 2-3 time-specific outdoor activities per day
1643
- - Include 1-2 indoor backup options
1644
- - For precipitation >50%, lead with indoor activities
1645
- - All activities must be specific to the location
1646
- - Include specific venues, trails, or locations
1647
- - Consider activity intensity based on temperature
1648
- - Keep descriptions concise but informative
1649
-
1650
- Maintain this exact formatting for consistency, using the emoji and section headers as shown.
1651
- \`,
1652
- });
1653
-
1654
1602
  const forecastSchema = z.object({
1655
1603
  date: z.string(),
1656
1604
  maxTemp: z.number(),
@@ -1744,16 +1692,59 @@ const planActivities = createStep({
1744
1692
  outputSchema: z.object({
1745
1693
  activities: z.string(),
1746
1694
  }),
1747
- execute: async ({ inputData }) => {
1695
+ execute: async ({ inputData, mastra }) => {
1748
1696
  const forecast = inputData
1749
1697
 
1750
1698
  if (!forecast) {
1751
1699
  throw new Error('Forecast data not found')
1752
1700
  }
1753
1701
 
1702
+ const agent = mastra?.getAgent('weatherAgent');
1703
+ if (!agent) {
1704
+ throw new Error('Weather agent not found');
1705
+ }
1706
+
1754
1707
  const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
1755
1708
  \${JSON.stringify(forecast, null, 2)}
1756
- \`;
1709
+ For each day in the forecast, structure your response exactly as follows:
1710
+
1711
+ \u{1F4C5} [Day, Month Date, Year]
1712
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
1713
+
1714
+ \u{1F321}\uFE0F WEATHER SUMMARY
1715
+ \u2022 Conditions: [brief description]
1716
+ \u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
1717
+ \u2022 Precipitation: [X% chance]
1718
+
1719
+ \u{1F305} MORNING ACTIVITIES
1720
+ Outdoor:
1721
+ \u2022 [Activity Name] - [Brief description including specific location/route]
1722
+ Best timing: [specific time range]
1723
+ Note: [relevant weather consideration]
1724
+
1725
+ \u{1F31E} AFTERNOON ACTIVITIES
1726
+ Outdoor:
1727
+ \u2022 [Activity Name] - [Brief description including specific location/route]
1728
+ Best timing: [specific time range]
1729
+ Note: [relevant weather consideration]
1730
+
1731
+ \u{1F3E0} INDOOR ALTERNATIVES
1732
+ \u2022 [Activity Name] - [Brief description including specific venue]
1733
+ Ideal for: [weather condition that would trigger this alternative]
1734
+
1735
+ \u26A0\uFE0F SPECIAL CONSIDERATIONS
1736
+ \u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
1737
+
1738
+ Guidelines:
1739
+ - Suggest 2-3 time-specific outdoor activities per day
1740
+ - Include 1-2 indoor backup options
1741
+ - For precipitation >50%, lead with indoor activities
1742
+ - All activities must be specific to the location
1743
+ - Include specific venues, trails, or locations
1744
+ - Consider activity intensity based on temperature
1745
+ - Keep descriptions concise but informative
1746
+
1747
+ Maintain this exact formatting for consistency, using the emoji and section headers as shown.\`;
1757
1748
 
1758
1749
  const response = await agent.stream([
1759
1750
  {
@@ -1801,41 +1792,138 @@ async function writeToolSample(destPath) {
1801
1792
  const fileService = new FileService();
1802
1793
  await fileService.copyStarterFile("tools.ts", destPath);
1803
1794
  }
1795
+ async function writeScorersSample(llmProvider, destPath) {
1796
+ const modelString = getModelIdentifier(llmProvider);
1797
+ const content = `import { z } from 'zod';
1798
+ import { createToolCallAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt';
1799
+ import { createCompletenessScorer } from '@mastra/evals/scorers/prebuilt';
1800
+ import { getAssistantMessageFromRunOutput, getUserMessageFromRunInput } from '@mastra/evals/scorers/utils';
1801
+ import { createScorer } from '@mastra/core/evals';
1802
+
1803
+ export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({
1804
+ expectedTool: 'weatherTool',
1805
+ strictMode: false,
1806
+ });
1807
+
1808
+ export const completenessScorer = createCompletenessScorer();
1809
+
1810
+ // Custom LLM-judged scorer: evaluates if non-English locations are translated appropriately
1811
+ export const translationScorer = createScorer({
1812
+ id: 'translation-quality-scorer',
1813
+ name: 'Translation Quality',
1814
+ description: 'Checks that non-English location names are translated and used correctly',
1815
+ type: 'agent',
1816
+ judge: {
1817
+ model: '${modelString}',
1818
+ instructions:
1819
+ 'You are an expert evaluator of translation quality for geographic locations. ' +
1820
+ 'Determine whether the user text mentions a non-English location and whether the assistant correctly uses an English translation of that location. ' +
1821
+ 'Be lenient with transliteration differences and diacritics. ' +
1822
+ 'Return only the structured JSON matching the provided schema.',
1823
+ },
1824
+ })
1825
+ .preprocess(({ run }) => {
1826
+ const userText = getUserMessageFromRunInput(run.input) || '';
1827
+ const assistantText = getAssistantMessageFromRunOutput(run.output) || '';
1828
+ return { userText, assistantText };
1829
+ })
1830
+ .analyze({
1831
+ description: 'Extract location names and detect language/translation adequacy',
1832
+ outputSchema: z.object({
1833
+ nonEnglish: z.boolean(),
1834
+ translated: z.boolean(),
1835
+ confidence: z.number().min(0).max(1).default(1),
1836
+ explanation: z.string().default(''),
1837
+ }),
1838
+ createPrompt: ({ results }) => \`
1839
+ You are evaluating if a weather assistant correctly handled translation of a non-English location.
1840
+ User text:
1841
+ """
1842
+ \${results.preprocessStepResult.userText}
1843
+ """
1844
+ Assistant response:
1845
+ """
1846
+ \${results.preprocessStepResult.assistantText}
1847
+ """
1848
+ Tasks:
1849
+ 1) Identify if the user mentioned a location that appears non-English.
1850
+ 2) If non-English, check whether the assistant used a correct English translation of that location in its response.
1851
+ 3) Be lenient with transliteration differences (e.g., accents/diacritics).
1852
+ Return JSON with fields:
1853
+ {
1854
+ "nonEnglish": boolean,
1855
+ "translated": boolean,
1856
+ "confidence": number, // 0-1
1857
+ "explanation": string
1858
+ }
1859
+ \`,
1860
+ })
1861
+ .generateScore(({ results }) => {
1862
+ const r = (results as any)?.analyzeStepResult || {};
1863
+ if (!r.nonEnglish) return 1; // If not applicable, full credit
1864
+ if (r.translated) return Math.max(0, Math.min(1, 0.7 + 0.3 * (r.confidence ?? 1)));
1865
+ return 0; // Non-English but not translated
1866
+ })
1867
+ .generateReason(({ results, score }) => {
1868
+ const r = (results as any)?.analyzeStepResult || {};
1869
+ return \`Translation scoring: nonEnglish=\${r.nonEnglish ?? false}, translated=\${r.translated ?? false}, confidence=\${r.confidence ?? 0}. Score=\${score}. \${r.explanation ?? ''}\`;
1870
+ });
1871
+
1872
+ export const scorers = {
1873
+ toolCallAppropriatenessScorer,
1874
+ completenessScorer,
1875
+ translationScorer,
1876
+ };`;
1877
+ const formattedContent = await prettier.format(content, {
1878
+ parser: "typescript",
1879
+ singleQuote: true
1880
+ });
1881
+ await fs4.writeFile(destPath, formattedContent);
1882
+ }
1804
1883
  async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
1805
1884
  switch (component) {
1806
1885
  case "agents":
1807
- return writeAgentSample(llmprovider, destPath, importComponents.includes("tools"));
1886
+ return writeAgentSample(
1887
+ llmprovider,
1888
+ destPath,
1889
+ importComponents.includes("tools"),
1890
+ importComponents.includes("scorers")
1891
+ );
1808
1892
  case "tools":
1809
1893
  return writeToolSample(destPath);
1810
1894
  case "workflows":
1811
- return writeWorkflowSample(destPath, llmprovider);
1895
+ return writeWorkflowSample(destPath);
1896
+ case "scorers":
1897
+ return writeScorersSample(llmprovider, destPath);
1812
1898
  default:
1813
1899
  return "";
1814
1900
  }
1815
1901
  }
1816
1902
  var createComponentsDir = async (dirPath, component) => {
1817
1903
  const componentPath = dirPath + `/${component}`;
1818
- await fsExtra3.ensureDir(componentPath);
1904
+ await fsExtra.ensureDir(componentPath);
1819
1905
  };
1820
1906
  var writeIndexFile = async ({
1821
1907
  dirPath,
1822
1908
  addAgent,
1823
1909
  addExample,
1824
- addWorkflow
1910
+ addWorkflow,
1911
+ addScorers
1825
1912
  }) => {
1826
1913
  const indexPath = dirPath + "/index.ts";
1827
- const destPath = path2.join(indexPath);
1914
+ const destPath = path3.join(indexPath);
1828
1915
  try {
1829
1916
  await fs4.writeFile(destPath, "");
1830
1917
  const filteredExports = [
1831
1918
  addWorkflow ? `workflows: { weatherWorkflow },` : "",
1832
- addAgent ? `agents: { weatherAgent },` : ""
1919
+ addAgent ? `agents: { weatherAgent },` : "",
1920
+ addScorers ? `scorers: { toolCallAppropriatenessScorer, completenessScorer, translationScorer },` : ""
1833
1921
  ].filter(Boolean);
1834
1922
  if (!addExample) {
1835
1923
  await fs4.writeFile(
1836
1924
  destPath,
1837
1925
  `
1838
- import { Mastra } from '@mastra/core';
1926
+ import { Mastra } from '@mastra/core/mastra';
1839
1927
 
1840
1928
  export const mastra = new Mastra()
1841
1929
  `
@@ -1848,19 +1936,26 @@ export const mastra = new Mastra()
1848
1936
  import { Mastra } from '@mastra/core/mastra';
1849
1937
  import { PinoLogger } from '@mastra/loggers';
1850
1938
  import { LibSQLStore } from '@mastra/libsql';
1939
+ import { Observability } from '@mastra/observability';
1851
1940
  ${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
1852
1941
  ${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
1942
+ ${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
1853
1943
 
1854
1944
  export const mastra = new Mastra({
1855
1945
  ${filteredExports.join("\n ")}
1856
1946
  storage: new LibSQLStore({
1857
- // stores telemetry, evals, ... into memory storage, if it needs to persist, change to file:../mastra.db
1947
+ id: "mastra-storage",
1948
+ // stores observability, scores, ... into memory storage, if it needs to persist, change to file:../mastra.db
1858
1949
  url: ":memory:",
1859
1950
  }),
1860
1951
  logger: new PinoLogger({
1861
1952
  name: 'Mastra',
1862
1953
  level: 'info',
1863
1954
  }),
1955
+ observability: new Observability({
1956
+ // Enables DefaultExporter and CloudExporter for tracing
1957
+ default: { enabled: true },
1958
+ }),
1864
1959
  });
1865
1960
  `
1866
1961
  );
@@ -1868,7 +1963,6 @@ export const mastra = new Mastra({
1868
1963
  throw err;
1869
1964
  }
1870
1965
  };
1871
- yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
1872
1966
  var getAPIKey = async (provider) => {
1873
1967
  let key = "OPENAI_API_KEY";
1874
1968
  switch (provider) {
@@ -1884,27 +1978,28 @@ var getAPIKey = async (provider) => {
1884
1978
  case "cerebras":
1885
1979
  key = "CEREBRAS_API_KEY";
1886
1980
  return key;
1981
+ case "mistral":
1982
+ key = "MISTRAL_API_KEY";
1983
+ return key;
1887
1984
  default:
1888
1985
  return key;
1889
1986
  }
1890
1987
  };
1891
- var writeAPIKey = async ({
1892
- provider,
1893
- apiKey = "your-api-key"
1894
- }) => {
1988
+ var writeAPIKey = async ({ provider, apiKey }) => {
1989
+ const envFileName = apiKey ? ".env" : ".env.example";
1895
1990
  const key = await getAPIKey(provider);
1896
- const escapedKey = shellQuote.quote([key]);
1897
- const escapedApiKey = shellQuote.quote([apiKey]);
1898
- await exec(`echo ${escapedKey}=${escapedApiKey} >> .env`);
1991
+ const escapedKey = shellQuote2.quote([key]);
1992
+ const escapedApiKey = shellQuote2.quote([apiKey ? apiKey : "your-api-key"]);
1993
+ await exec(`echo ${escapedKey}=${escapedApiKey} >> ${envFileName}`);
1899
1994
  };
1900
1995
  var createMastraDir = async (directory) => {
1901
1996
  let dir = directory.trim().split("/").filter((item) => item !== "");
1902
- const dirPath = path2.join(process.cwd(), ...dir, "mastra");
1997
+ const dirPath = path3.join(process.cwd(), ...dir, "mastra");
1903
1998
  try {
1904
1999
  await fs4.access(dirPath);
1905
2000
  return { ok: false };
1906
2001
  } catch {
1907
- await fsExtra3.ensureDir(dirPath);
2002
+ await fsExtra.ensureDir(dirPath);
1908
2003
  return { ok: true, dirPath };
1909
2004
  }
1910
2005
  };
@@ -1916,42 +2011,35 @@ var writeCodeSample = async (dirPath, component, llmProvider, importComponents)
1916
2011
  throw err;
1917
2012
  }
1918
2013
  };
1919
- var interactivePrompt = async () => {
1920
- pe(color2.inverse("Mastra Init"));
1921
- const mastraProject = await ve(
2014
+ var LLM_PROVIDERS = [
2015
+ { value: "openai", label: "OpenAI", hint: "recommended" },
2016
+ { value: "anthropic", label: "Anthropic" },
2017
+ { value: "groq", label: "Groq" },
2018
+ { value: "google", label: "Google" },
2019
+ { value: "cerebras", label: "Cerebras" },
2020
+ { value: "mistral", label: "Mistral" }
2021
+ ];
2022
+ var interactivePrompt = async (args = {}) => {
2023
+ const { skip = {}, options: { showBanner = true } = {} } = args;
2024
+ if (showBanner) {
2025
+ Ie(color2.inverse(" Mastra Init "));
2026
+ }
2027
+ const mastraProject = await Ce(
1922
2028
  {
1923
- directory: () => ae({
2029
+ directory: () => he({
1924
2030
  message: "Where should we create the Mastra files? (default: src/)",
1925
2031
  placeholder: "src/",
1926
2032
  defaultValue: "src/"
1927
2033
  }),
1928
- components: () => $e({
1929
- message: "Choose components to install:",
1930
- options: [
1931
- { value: "agents", label: "Agents", hint: "recommended" },
1932
- {
1933
- value: "workflows",
1934
- label: "Workflows"
1935
- }
1936
- ]
1937
- }),
1938
- shouldAddTools: () => ce({
1939
- message: "Add tools?",
1940
- initialValue: false
1941
- }),
1942
- llmProvider: () => le({
1943
- message: "Select default provider:",
1944
- options: [
1945
- { value: "openai", label: "OpenAI", hint: "recommended" },
1946
- { value: "anthropic", label: "Anthropic" },
1947
- { value: "groq", label: "Groq" },
1948
- { value: "google", label: "Google" },
1949
- { value: "cerebras", label: "Cerebras" }
1950
- ]
2034
+ llmProvider: () => skip?.llmProvider ? void 0 : ve({
2035
+ message: "Select a default provider:",
2036
+ options: LLM_PROVIDERS
1951
2037
  }),
1952
2038
  llmApiKey: async ({ results: { llmProvider } }) => {
1953
- const keyChoice = await le({
1954
- message: `Enter your ${llmProvider} API key?`,
2039
+ if (skip?.llmApiKey) return void 0;
2040
+ const llmName = LLM_PROVIDERS.find((p6) => p6.value === llmProvider)?.label || "provider";
2041
+ const keyChoice = await ve({
2042
+ message: `Enter your ${llmName} API key?`,
1955
2043
  options: [
1956
2044
  { value: "skip", label: "Skip for now", hint: "default" },
1957
2045
  { value: "enter", label: "Enter API key" }
@@ -1959,79 +2047,61 @@ var interactivePrompt = async () => {
1959
2047
  initialValue: "skip"
1960
2048
  });
1961
2049
  if (keyChoice === "enter") {
1962
- return ae({
2050
+ return he({
1963
2051
  message: "Enter your API key:",
1964
- placeholder: "sk-..."
2052
+ placeholder: "sk-...",
2053
+ validate: (value) => {
2054
+ if (value.length === 0) return "API key cannot be empty";
2055
+ }
1965
2056
  });
1966
2057
  }
1967
2058
  return void 0;
1968
2059
  },
1969
- addExample: () => ce({
1970
- message: "Add example",
1971
- initialValue: false
1972
- }),
1973
2060
  configureEditorWithDocsMCP: async () => {
1974
- const windsurfIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`windsurf`);
1975
- const cursorIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`cursor`);
1976
- const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
1977
- const editor = await le({
1978
- message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
2061
+ const editor = await ve({
2062
+ message: `Make your IDE into a Mastra expert? (Installs Mastra's MCP server)`,
1979
2063
  options: [
1980
2064
  { value: "skip", label: "Skip for now", hint: "default" },
1981
2065
  {
1982
2066
  value: "cursor",
1983
- label: "Cursor (project only)",
1984
- hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
2067
+ label: "Cursor (project only)"
1985
2068
  },
1986
2069
  {
1987
2070
  value: "cursor-global",
1988
- label: "Cursor (global, all projects)",
1989
- hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
2071
+ label: "Cursor (global, all projects)"
1990
2072
  },
1991
2073
  {
1992
2074
  value: "windsurf",
1993
- label: "Windsurf",
1994
- hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
2075
+ label: "Windsurf"
1995
2076
  },
1996
2077
  {
1997
2078
  value: "vscode",
1998
- label: "VSCode",
1999
- hint: vscodeIsAlreadyInstalled ? `Already installed` : void 0
2079
+ label: "VSCode"
2000
2080
  }
2001
2081
  ]
2002
2082
  });
2003
2083
  if (editor === `skip`) return void 0;
2004
- if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
2005
- v.message(`
2006
- Windsurf is already installed, skipping.`);
2007
- return void 0;
2008
- }
2009
- if (editor === `vscode` && vscodeIsAlreadyInstalled) {
2010
- v.message(`
2011
- VSCode is already installed, skipping.`);
2012
- return void 0;
2013
- }
2014
2084
  if (editor === `cursor`) {
2015
- v.message(
2085
+ M.message(
2016
2086
  `
2017
2087
  Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
2018
2088
  `
2019
2089
  );
2020
2090
  }
2021
2091
  if (editor === `cursor-global`) {
2022
- const confirm2 = await le({
2092
+ const confirm = await ve({
2023
2093
  message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
2024
2094
  options: [
2025
2095
  { value: "yes", label: "Yes, I understand" },
2026
2096
  { value: "skip", label: "No, skip for now" }
2027
2097
  ]
2028
2098
  });
2029
- if (confirm2 !== `yes`) {
2099
+ if (confirm !== `yes`) {
2030
2100
  return void 0;
2031
2101
  }
2032
2102
  }
2033
2103
  if (editor === `windsurf`) {
2034
- const confirm2 = await le({
2104
+ const confirm = await ve({
2035
2105
  message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
2036
2106
  This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
2037
2107
  options: [
@@ -2039,7 +2109,7 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
2039
2109
  { value: "skip", label: "No, skip for now" }
2040
2110
  ]
2041
2111
  });
2042
- if (confirm2 !== `yes`) {
2112
+ if (confirm !== `yes`) {
2043
2113
  return void 0;
2044
2114
  }
2045
2115
  }
@@ -2048,26 +2118,231 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
2048
2118
  },
2049
2119
  {
2050
2120
  onCancel: () => {
2051
- he("Operation cancelled.");
2121
+ xe("Operation cancelled.");
2052
2122
  process.exit(0);
2053
2123
  }
2054
2124
  }
2055
2125
  );
2056
- const { shouldAddTools, components, ...rest } = mastraProject;
2057
- const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
2058
- return { ...rest, components: mastraComponents };
2126
+ return mastraProject;
2059
2127
  };
2060
- var s = _();
2128
+ function getPackageManager() {
2129
+ const userAgent = process.env.npm_config_user_agent || "";
2130
+ const execPath = process.env.npm_execpath || "";
2131
+ if (userAgent.includes("yarn")) {
2132
+ return "yarn";
2133
+ }
2134
+ if (userAgent.includes("pnpm")) {
2135
+ return "pnpm";
2136
+ }
2137
+ if (userAgent.includes("npm")) {
2138
+ return "npm";
2139
+ }
2140
+ if (execPath.includes("yarn")) {
2141
+ return "yarn";
2142
+ }
2143
+ if (execPath.includes("pnpm")) {
2144
+ return "pnpm";
2145
+ }
2146
+ if (execPath.includes("npm")) {
2147
+ return "npm";
2148
+ }
2149
+ return "npm";
2150
+ }
2151
+ var logger = createLogger(false);
2152
+ function createLogger(debug = false) {
2153
+ return new PinoLogger({
2154
+ name: "Mastra CLI",
2155
+ level: debug ? "debug" : "info"
2156
+ });
2157
+ }
2061
2158
  var exec2 = util.promisify(child_process.exec);
2159
+ async function cloneTemplate(options) {
2160
+ const { template, projectName, targetDir, branch, llmProvider } = options;
2161
+ const projectPath = targetDir ? path3.resolve(targetDir, projectName) : path3.resolve(projectName);
2162
+ const spinner4 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
2163
+ try {
2164
+ if (await directoryExists(projectPath)) {
2165
+ spinner4.error(`Directory ${projectName} already exists`);
2166
+ throw new Error(`Directory ${projectName} already exists`);
2167
+ }
2168
+ await cloneRepositoryWithoutGit(template.githubUrl, projectPath, branch);
2169
+ await updatePackageJson(projectPath, projectName);
2170
+ const envExamplePath = path3.join(projectPath, ".env.example");
2171
+ if (await fileExists(envExamplePath)) {
2172
+ const envPath = path3.join(projectPath, ".env");
2173
+ await fs4.copyFile(envExamplePath, envPath);
2174
+ if (llmProvider) {
2175
+ await updateEnvFile(envPath, llmProvider);
2176
+ }
2177
+ }
2178
+ spinner4.success(`Template "${template.title}" cloned successfully to ${projectName}`);
2179
+ return projectPath;
2180
+ } catch (error) {
2181
+ spinner4.error(`Failed to clone template: ${error instanceof Error ? error.message : "Unknown error"}`);
2182
+ throw error;
2183
+ }
2184
+ }
2185
+ async function directoryExists(dirPath) {
2186
+ try {
2187
+ const stat = await fs4.stat(dirPath);
2188
+ return stat.isDirectory();
2189
+ } catch {
2190
+ return false;
2191
+ }
2192
+ }
2193
+ async function fileExists(filePath) {
2194
+ try {
2195
+ const stat = await fs4.stat(filePath);
2196
+ return stat.isFile();
2197
+ } catch {
2198
+ return false;
2199
+ }
2200
+ }
2201
+ async function cloneRepositoryWithoutGit(repoUrl, targetPath, branch) {
2202
+ await fs4.mkdir(targetPath, { recursive: true });
2203
+ try {
2204
+ const degitRepo = repoUrl.replace("https://github.com/", "");
2205
+ const degitRepoWithBranch = branch ? `${degitRepo}#${branch}` : degitRepo;
2206
+ const degitCommand = shellQuote2.quote(["npx", "degit", degitRepoWithBranch, targetPath]);
2207
+ await exec2(degitCommand, {
2208
+ cwd: process.cwd()
2209
+ });
2210
+ } catch {
2211
+ try {
2212
+ const gitArgs = ["git", "clone"];
2213
+ if (branch) {
2214
+ gitArgs.push("--branch", branch);
2215
+ }
2216
+ gitArgs.push(repoUrl, targetPath);
2217
+ const gitCommand = shellQuote2.quote(gitArgs);
2218
+ await exec2(gitCommand, {
2219
+ cwd: process.cwd()
2220
+ });
2221
+ const gitDir = path3.join(targetPath, ".git");
2222
+ if (await directoryExists(gitDir)) {
2223
+ await fs4.rm(gitDir, { recursive: true, force: true });
2224
+ }
2225
+ } catch (gitError) {
2226
+ throw new Error(`Failed to clone repository: ${gitError instanceof Error ? gitError.message : "Unknown error"}`);
2227
+ }
2228
+ }
2229
+ }
2230
+ async function updatePackageJson(projectPath, projectName) {
2231
+ const packageJsonPath = path3.join(projectPath, "package.json");
2232
+ try {
2233
+ const packageJsonContent = await fs4.readFile(packageJsonPath, "utf-8");
2234
+ const packageJson = JSON.parse(packageJsonContent);
2235
+ packageJson.name = projectName;
2236
+ await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), "utf-8");
2237
+ } catch (error) {
2238
+ logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
2239
+ }
2240
+ }
2241
+ async function updateEnvFile(envPath, llmProvider) {
2242
+ try {
2243
+ const envContent = await fs4.readFile(envPath, "utf-8");
2244
+ const modelString = getModelIdentifier(llmProvider);
2245
+ if (!modelString) {
2246
+ logger.warn(`Could not get model identifier for provider: ${llmProvider}`);
2247
+ return;
2248
+ }
2249
+ const modelValue = modelString.replace(/'/g, "");
2250
+ const updatedContent = envContent.replace(/^MODEL=.*/m, `MODEL=${modelValue}`);
2251
+ await fs4.writeFile(envPath, updatedContent, "utf-8");
2252
+ logger.info(`Updated MODEL in .env to ${modelValue}`);
2253
+ } catch (error) {
2254
+ logger.warn(`Could not update .env file: ${error instanceof Error ? error.message : "Unknown error"}`);
2255
+ }
2256
+ }
2257
+ async function installDependencies(projectPath, packageManager) {
2258
+ const spinner4 = yoctoSpinner({ text: "Installing dependencies..." }).start();
2259
+ try {
2260
+ const pm = packageManager || getPackageManager();
2261
+ const installCommand = shellQuote2.quote([pm, "install"]);
2262
+ await exec2(installCommand, {
2263
+ cwd: projectPath
2264
+ });
2265
+ spinner4.success("Dependencies installed successfully");
2266
+ } catch (error) {
2267
+ spinner4.error(`Failed to install dependencies: ${error instanceof Error ? error.message : "Unknown error"}`);
2268
+ throw error;
2269
+ }
2270
+ }
2271
+ var TEMPLATES_API_URL = process.env.MASTRA_TEMPLATES_API_URL || "https://mastra.ai/api/templates.json";
2272
+ async function loadTemplates() {
2273
+ try {
2274
+ const response = await fetch(TEMPLATES_API_URL);
2275
+ if (!response.ok) {
2276
+ throw new Error(`Failed to fetch templates: ${response.statusText}`);
2277
+ }
2278
+ const templates = await response.json();
2279
+ return templates;
2280
+ } catch (error) {
2281
+ console.error("Error loading templates:", error);
2282
+ throw new Error("Failed to load templates. Please check your internet connection and try again.");
2283
+ }
2284
+ }
2285
+ function pluralize(count, singular, plural) {
2286
+ return count === 1 ? singular : plural || `${singular}s`;
2287
+ }
2288
+ async function selectTemplate(templates) {
2289
+ const choices = templates.map((template) => {
2290
+ const parts = [];
2291
+ if (template.agents?.length) {
2292
+ parts.push(`${template.agents.length} ${pluralize(template.agents.length, "agent")}`);
2293
+ }
2294
+ if (template.tools?.length) {
2295
+ parts.push(`${template.tools.length} ${pluralize(template.tools.length, "tool")}`);
2296
+ }
2297
+ if (template.workflows?.length) {
2298
+ parts.push(`${template.workflows.length} ${pluralize(template.workflows.length, "workflow")}`);
2299
+ }
2300
+ if (template.mcp?.length) {
2301
+ parts.push(`${template.mcp.length} ${pluralize(template.mcp.length, "MCP server")}`);
2302
+ }
2303
+ if (template.networks?.length) {
2304
+ parts.push(`${template.networks.length} ${pluralize(template.networks.length, "agent network")}`);
2305
+ }
2306
+ return {
2307
+ value: template,
2308
+ label: template.title,
2309
+ hint: parts.join(", ") || "Template components"
2310
+ };
2311
+ });
2312
+ const selected = await ve({
2313
+ message: "Select a template:",
2314
+ options: choices
2315
+ });
2316
+ if (pD(selected)) {
2317
+ return null;
2318
+ }
2319
+ return selected;
2320
+ }
2321
+ function findTemplateByName(templates, templateName) {
2322
+ let template = templates.find((t) => t.slug === templateName);
2323
+ if (template) return template;
2324
+ const slugWithPrefix = `template-${templateName}`;
2325
+ template = templates.find((t) => t.slug === slugWithPrefix);
2326
+ if (template) return template;
2327
+ template = templates.find((t) => t.title.toLowerCase() === templateName.toLowerCase());
2328
+ if (template) return template;
2329
+ return null;
2330
+ }
2331
+ function getDefaultProjectName(template) {
2332
+ return template.slug.replace(/^template-/, "");
2333
+ }
2334
+ var s = Y();
2062
2335
  var init = async ({
2063
- directory,
2064
- addExample = false,
2336
+ directory = "src/",
2065
2337
  components,
2066
2338
  llmProvider = "openai",
2067
2339
  llmApiKey,
2068
- configureEditorWithDocsMCP
2340
+ addExample = false,
2341
+ configureEditorWithDocsMCP,
2342
+ versionTag
2069
2343
  }) => {
2070
2344
  s.start("Initializing Mastra");
2345
+ const packageVersionTag = versionTag ? `@${versionTag}` : "";
2071
2346
  try {
2072
2347
  const result = await createMastraDir(directory);
2073
2348
  if (!result.ok) {
@@ -2080,7 +2355,8 @@ var init = async ({
2080
2355
  dirPath,
2081
2356
  addExample,
2082
2357
  addWorkflow: components.includes("workflows"),
2083
- addAgent: components.includes("agents")
2358
+ addAgent: components.includes("agents"),
2359
+ addScorers: components.includes("scorers")
2084
2360
  }),
2085
2361
  ...components.map((component) => createComponentsDir(dirPath, component)),
2086
2362
  writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
@@ -2094,39 +2370,43 @@ var init = async ({
2094
2370
  const depService = new DepsService();
2095
2371
  const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
2096
2372
  if (needsLibsql) {
2097
- await depService.installPackages(["@mastra/libsql"]);
2373
+ await depService.installPackages([`@mastra/libsql${packageVersionTag}`]);
2098
2374
  }
2099
2375
  const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
2100
2376
  if (needsMemory) {
2101
- await depService.installPackages(["@mastra/memory"]);
2377
+ await depService.installPackages([`@mastra/memory${packageVersionTag}`]);
2102
2378
  }
2103
2379
  const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
2104
2380
  if (needsLoggers) {
2105
- await depService.installPackages(["@mastra/loggers"]);
2381
+ await depService.installPackages([`@mastra/loggers${packageVersionTag}`]);
2382
+ }
2383
+ const needsObservability = await depService.checkDependencies(["@mastra/observability"]) !== `ok`;
2384
+ if (needsObservability) {
2385
+ await depService.installPackages([`@mastra/observability${packageVersionTag}`]);
2386
+ }
2387
+ const needsEvals = components.includes(`scorers`) && await depService.checkDependencies(["@mastra/evals"]) !== `ok`;
2388
+ if (needsEvals) {
2389
+ await depService.installPackages([`@mastra/evals${packageVersionTag}`]);
2106
2390
  }
2107
2391
  }
2108
2392
  const key = await getAPIKey(llmProvider || "openai");
2109
- const aiSdkPackage = getAISDKPackage(llmProvider);
2110
- const depsService = new DepsService();
2111
- const pm = depsService.packageManager;
2112
- const installCommand = getPackageManagerInstallCommand(pm);
2113
- await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
2114
2393
  if (configureEditorWithDocsMCP) {
2115
2394
  await installMastraDocsMCPServer({
2116
2395
  editor: configureEditorWithDocsMCP,
2117
- directory: process.cwd()
2396
+ directory: process.cwd(),
2397
+ versionTag
2118
2398
  });
2119
2399
  }
2120
2400
  s.stop();
2121
2401
  if (!llmApiKey) {
2122
- me(`
2402
+ Me(`
2123
2403
  ${color2.green("Mastra initialized successfully!")}
2124
2404
 
2125
2405
  Add your ${color2.cyan(key)} as an environment variable
2126
2406
  in your ${color2.cyan(".env")} file
2127
2407
  `);
2128
2408
  } else {
2129
- me(`
2409
+ Me(`
2130
2410
  ${color2.green("Mastra initialized successfully!")}
2131
2411
  `);
2132
2412
  }
@@ -2160,71 +2440,101 @@ var execWithTimeout = async (command, timeoutMs) => {
2160
2440
  throw error;
2161
2441
  }
2162
2442
  } catch (error) {
2163
- console.error(error);
2164
2443
  throw error;
2165
2444
  }
2166
2445
  };
2167
2446
  async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
2168
- let installCommand = getPackageManagerInstallCommand(pm);
2447
+ let installCommand = getPackageManagerAddCommand(pm);
2169
2448
  if (isDev) {
2170
- installCommand = `${installCommand} --save-dev`;
2449
+ installCommand = `${installCommand} -D`;
2171
2450
  }
2172
2451
  try {
2173
2452
  await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
2174
2453
  } catch (err) {
2175
- console.log("err", err);
2176
2454
  if (versionTag === "@latest") {
2177
- throw err;
2455
+ throw new Error(
2456
+ `Failed to install ${dependency}@latest: ${err instanceof Error ? err.message : "Unknown error"}`
2457
+ );
2458
+ }
2459
+ try {
2460
+ await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
2461
+ } catch (fallbackErr) {
2462
+ throw new Error(
2463
+ `Failed to install ${dependency} (tried ${versionTag} and @latest): ${fallbackErr instanceof Error ? fallbackErr.message : "Unknown error"}`
2464
+ );
2178
2465
  }
2179
- await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
2180
2466
  }
2181
2467
  }
2182
2468
  var createMastraProject = async ({
2183
2469
  projectName: name,
2184
2470
  createVersionTag,
2185
- timeout
2471
+ timeout,
2472
+ llmProvider,
2473
+ llmApiKey,
2474
+ needsInteractive
2186
2475
  }) => {
2187
- pe(color2.inverse(" Mastra Create "));
2188
- const projectName = name ?? await ae({
2476
+ Ie(color2.inverse(" Mastra Create "));
2477
+ const projectName = name ?? await he({
2189
2478
  message: "What do you want to name your project?",
2190
2479
  placeholder: "my-mastra-app",
2191
- defaultValue: "my-mastra-app"
2480
+ defaultValue: "my-mastra-app",
2481
+ validate: (value) => {
2482
+ if (value.length === 0) return "Project name cannot be empty";
2483
+ if (fs3__default__default.existsSync(value)) {
2484
+ return `A directory named "${value}" already exists. Please choose a different name.`;
2485
+ }
2486
+ }
2192
2487
  });
2193
- if (lD(projectName)) {
2194
- he("Operation cancelled");
2488
+ if (pD(projectName)) {
2489
+ xe("Operation cancelled");
2195
2490
  process.exit(0);
2196
2491
  }
2197
- const s2 = _();
2198
- s2.start("Creating project");
2492
+ let result;
2493
+ if (needsInteractive) {
2494
+ result = await interactivePrompt({
2495
+ options: { showBanner: false },
2496
+ skip: { llmProvider: llmProvider !== void 0, llmApiKey: llmApiKey !== void 0 }
2497
+ });
2498
+ }
2499
+ const s2 = Y();
2199
2500
  try {
2200
- await fs4.mkdir(projectName);
2201
- } catch (error) {
2202
- if (error instanceof Error && "code" in error && error.code === "EEXIST") {
2203
- s2.stop(
2204
- `A directory named "${projectName}" already exists. Please choose a different name or delete the existing directory.`
2501
+ s2.start("Creating project");
2502
+ try {
2503
+ await fs4.mkdir(projectName);
2504
+ } catch (error) {
2505
+ if (error instanceof Error && "code" in error && error.code === "EEXIST") {
2506
+ s2.stop(`A directory named "${projectName}" already exists. Please choose a different name.`);
2507
+ process.exit(1);
2508
+ }
2509
+ throw new Error(
2510
+ `Failed to create project directory: ${error instanceof Error ? error.message : "Unknown error"}`
2205
2511
  );
2206
- process.exit(1);
2207
2512
  }
2208
- throw error;
2209
- }
2210
- process.chdir(projectName);
2211
- const pm = getPackageManager();
2212
- const installCommand = getPackageManagerInstallCommand(pm);
2213
- s2.message("Creating project");
2214
- await exec3(`npm init -y`);
2215
- await exec3(`npm pkg set type="module"`);
2216
- await exec3(`npm pkg set engines.node=">=20.9.0"`);
2217
- const depsService = new DepsService();
2218
- await depsService.addScriptsToPackageJson({
2219
- dev: "mastra dev",
2220
- build: "mastra build",
2221
- start: "mastra start"
2222
- });
2223
- s2.stop("Project created");
2224
- s2.start(`Installing ${pm} dependencies`);
2225
- await exec3(`${pm} ${installCommand} zod`);
2226
- await exec3(`${pm} ${installCommand} typescript @types/node --save-dev`);
2227
- await exec3(`echo '{
2513
+ process.chdir(projectName);
2514
+ const pm = getPackageManager();
2515
+ const installCommand = getPackageManagerAddCommand(pm);
2516
+ s2.message("Initializing project structure");
2517
+ try {
2518
+ await exec3(`npm init -y`);
2519
+ await exec3(`npm pkg set type="module"`);
2520
+ await exec3(`npm pkg set engines.node=">=20.9.0"`);
2521
+ const depsService = new DepsService();
2522
+ await depsService.addScriptsToPackageJson({
2523
+ dev: "mastra dev",
2524
+ build: "mastra build",
2525
+ start: "mastra start"
2526
+ });
2527
+ } catch (error) {
2528
+ throw new Error(
2529
+ `Failed to initialize project structure: ${error instanceof Error ? error.message : "Unknown error"}`
2530
+ );
2531
+ }
2532
+ s2.stop("Project structure created");
2533
+ s2.start(`Installing ${pm} dependencies`);
2534
+ try {
2535
+ await exec3(`${pm} ${installCommand} zod@^4`);
2536
+ await exec3(`${pm} ${installCommand} -D typescript @types/node`);
2537
+ await exec3(`echo '{
2228
2538
  "compilerOptions": {
2229
2539
  "target": "ES2022",
2230
2540
  "module": "ES2022",
@@ -2240,81 +2550,298 @@ var createMastraProject = async ({
2240
2550
  "src/**/*"
2241
2551
  ]
2242
2552
  }' > tsconfig.json`);
2243
- s2.stop(`${pm} dependencies installed`);
2244
- s2.start("Installing mastra");
2245
- const versionTag = createVersionTag ? `@latest` : "@latest";
2246
- await installMastraDependency(pm, "mastra", versionTag, true, timeout);
2247
- s2.stop("mastra installed");
2248
- s2.start("Installing dependencies");
2249
- await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
2250
- await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
2251
- await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
2252
- s2.stop("Dependencies installed");
2253
- s2.start("Adding .gitignore");
2254
- await exec3(`echo output.txt >> .gitignore`);
2255
- await exec3(`echo node_modules >> .gitignore`);
2256
- await exec3(`echo dist >> .gitignore`);
2257
- await exec3(`echo .mastra >> .gitignore`);
2258
- await exec3(`echo .env.development >> .gitignore`);
2259
- await exec3(`echo .env >> .gitignore`);
2260
- await exec3(`echo *.db >> .gitignore`);
2261
- await exec3(`echo *.db-* >> .gitignore`);
2262
- s2.stop(".gitignore added");
2263
- ge("Project created successfully");
2264
- console.log("");
2265
- return { projectName };
2553
+ } catch (error) {
2554
+ throw new Error(
2555
+ `Failed to install basic dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
2556
+ );
2557
+ }
2558
+ s2.stop(`${pm} dependencies installed`);
2559
+ s2.start("Installing Mastra CLI");
2560
+ const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
2561
+ try {
2562
+ await installMastraDependency(pm, "mastra", versionTag, true, timeout);
2563
+ } catch (error) {
2564
+ throw new Error(`Failed to install Mastra CLI: ${error instanceof Error ? error.message : "Unknown error"}`);
2565
+ }
2566
+ s2.stop("Mastra CLI installed");
2567
+ s2.start("Installing Mastra dependencies");
2568
+ try {
2569
+ await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
2570
+ await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
2571
+ await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
2572
+ } catch (error) {
2573
+ throw new Error(
2574
+ `Failed to install Mastra dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
2575
+ );
2576
+ }
2577
+ s2.stop("Mastra dependencies installed");
2578
+ s2.start("Adding .gitignore");
2579
+ try {
2580
+ await exec3(`echo output.txt >> .gitignore`);
2581
+ await exec3(`echo node_modules >> .gitignore`);
2582
+ await exec3(`echo dist >> .gitignore`);
2583
+ await exec3(`echo .mastra >> .gitignore`);
2584
+ await exec3(`echo .env.development >> .gitignore`);
2585
+ await exec3(`echo .env >> .gitignore`);
2586
+ await exec3(`echo *.db >> .gitignore`);
2587
+ await exec3(`echo *.db-* >> .gitignore`);
2588
+ } catch (error) {
2589
+ throw new Error(`Failed to create .gitignore: ${error instanceof Error ? error.message : "Unknown error"}`);
2590
+ }
2591
+ s2.stop(".gitignore added");
2592
+ Se("Project created successfully");
2593
+ console.info("");
2594
+ return { projectName, result };
2595
+ } catch (error) {
2596
+ s2.stop();
2597
+ const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred";
2598
+ xe(`Project creation failed: ${errorMessage}`);
2599
+ process.exit(1);
2600
+ }
2266
2601
  };
2267
- var create = async (args2) => {
2268
- const { projectName } = await createMastraProject({
2269
- projectName: args2?.projectName,
2270
- createVersionTag: args2?.createVersionTag,
2271
- timeout: args2?.timeout
2602
+ var version$1 = package_default.version;
2603
+ var create = async (args) => {
2604
+ if (args.template !== void 0) {
2605
+ await createFromTemplate({
2606
+ projectName: args.projectName,
2607
+ template: args.template,
2608
+ timeout: args.timeout,
2609
+ injectedAnalytics: args.analytics,
2610
+ llmProvider: args.llmProvider
2611
+ });
2612
+ return;
2613
+ }
2614
+ const needsInteractive = args.components === void 0 || args.llmProvider === void 0 || args.addExample === void 0;
2615
+ const { projectName, result } = await createMastraProject({
2616
+ projectName: args?.projectName,
2617
+ createVersionTag: args?.createVersionTag,
2618
+ timeout: args?.timeout,
2619
+ llmProvider: args?.llmProvider,
2620
+ llmApiKey: args?.llmApiKey,
2621
+ needsInteractive
2272
2622
  });
2273
- const directory = args2.directory || "src/";
2274
- console.log("args", args2);
2275
- if (args2.components === void 0 || args2.llmProvider === void 0 || args2.addExample === void 0) {
2276
- console.log("got to interactive prompt");
2277
- const result = await interactivePrompt();
2623
+ const directory = args.directory || "src/";
2624
+ if (needsInteractive && result) {
2278
2625
  await init({
2279
2626
  ...result,
2280
- llmApiKey: result?.llmApiKey
2627
+ llmApiKey: result?.llmApiKey,
2628
+ components: ["agents", "tools", "workflows", "scorers"],
2629
+ addExample: true,
2630
+ versionTag: args.createVersionTag
2281
2631
  });
2282
2632
  postCreate({ projectName });
2283
- console.log("done with interactive prompt");
2284
2633
  return;
2285
2634
  }
2286
- const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args2;
2635
+ const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
2287
2636
  await init({
2288
2637
  directory,
2289
2638
  components,
2290
2639
  llmProvider,
2291
2640
  addExample,
2292
2641
  llmApiKey,
2293
- configureEditorWithDocsMCP: args2.mcpServer
2642
+ configureEditorWithDocsMCP: args.mcpServer,
2643
+ versionTag: args.createVersionTag
2294
2644
  });
2295
2645
  postCreate({ projectName });
2296
2646
  };
2297
2647
  var postCreate = ({ projectName }) => {
2298
2648
  const packageManager = getPackageManager();
2299
- ge(`
2649
+ Se(`
2300
2650
  ${color2.green("To start your project:")}
2301
2651
 
2302
2652
  ${color2.cyan("cd")} ${projectName}
2303
2653
  ${color2.cyan(`${packageManager} run dev`)}
2304
2654
  `);
2305
2655
  };
2656
+ function isGitHubUrl(url) {
2657
+ try {
2658
+ const parsedUrl = new URL(url);
2659
+ return parsedUrl.hostname === "github.com" && parsedUrl.pathname.split("/").length >= 3;
2660
+ } catch {
2661
+ return false;
2662
+ }
2663
+ }
2664
+ async function validateGitHubProject(githubUrl) {
2665
+ const errors = [];
2666
+ try {
2667
+ const urlParts = new URL(githubUrl).pathname.split("/").filter(Boolean);
2668
+ const owner = urlParts[0];
2669
+ const repo = urlParts[1]?.replace(".git", "");
2670
+ if (!owner || !repo) {
2671
+ throw new Error("Invalid GitHub URL format");
2672
+ }
2673
+ const branches = ["main", "master"];
2674
+ let packageJsonContent = null;
2675
+ let indexContent = null;
2676
+ for (const branch of branches) {
2677
+ try {
2678
+ const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/package.json`;
2679
+ const packageJsonResponse = await fetch(packageJsonUrl);
2680
+ if (packageJsonResponse.ok) {
2681
+ packageJsonContent = await packageJsonResponse.text();
2682
+ const indexUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/src/mastra/index.ts`;
2683
+ const indexResponse = await fetch(indexUrl);
2684
+ if (indexResponse.ok) {
2685
+ indexContent = await indexResponse.text();
2686
+ }
2687
+ break;
2688
+ }
2689
+ } catch {
2690
+ }
2691
+ }
2692
+ if (!packageJsonContent) {
2693
+ errors.push("Could not fetch package.json from repository");
2694
+ return { isValid: false, errors };
2695
+ }
2696
+ try {
2697
+ const packageJson = JSON.parse(packageJsonContent);
2698
+ const hasMastraCore = packageJson.dependencies?.["@mastra/core"] || packageJson.devDependencies?.["@mastra/core"] || packageJson.peerDependencies?.["@mastra/core"];
2699
+ if (!hasMastraCore) {
2700
+ errors.push("Missing @mastra/core dependency in package.json");
2701
+ }
2702
+ } catch {
2703
+ errors.push("Invalid package.json format");
2704
+ }
2705
+ if (!indexContent) {
2706
+ errors.push("Missing src/mastra/index.ts file");
2707
+ } else {
2708
+ const hasMastraExport = indexContent.includes("export") && (indexContent.includes("new Mastra") || indexContent.includes("Mastra("));
2709
+ if (!hasMastraExport) {
2710
+ errors.push("src/mastra/index.ts does not export a Mastra instance");
2711
+ }
2712
+ }
2713
+ return { isValid: errors.length === 0, errors };
2714
+ } catch (error) {
2715
+ errors.push(`Failed to validate GitHub repository: ${error instanceof Error ? error.message : "Unknown error"}`);
2716
+ return { isValid: false, errors };
2717
+ }
2718
+ }
2719
+ async function createFromGitHubUrl(url) {
2720
+ const urlParts = new URL(url).pathname.split("/").filter(Boolean);
2721
+ const owner = urlParts[0] || "unknown";
2722
+ const repo = urlParts[1] || "unknown";
2723
+ return {
2724
+ githubUrl: url,
2725
+ title: `${owner}/${repo}`,
2726
+ slug: repo,
2727
+ agents: [],
2728
+ mcp: [],
2729
+ tools: [],
2730
+ networks: [],
2731
+ workflows: []
2732
+ };
2733
+ }
2734
+ async function createFromTemplate(args) {
2735
+ let selectedTemplate;
2736
+ if (args.template === true) {
2737
+ const templates = await loadTemplates();
2738
+ const selected = await selectTemplate(templates);
2739
+ if (!selected) {
2740
+ M.info("No template selected. Exiting.");
2741
+ return;
2742
+ }
2743
+ selectedTemplate = selected;
2744
+ } else if (args.template && typeof args.template === "string") {
2745
+ if (isGitHubUrl(args.template)) {
2746
+ const spinner4 = Y();
2747
+ spinner4.start("Validating GitHub repository...");
2748
+ const validation = await validateGitHubProject(args.template);
2749
+ if (!validation.isValid) {
2750
+ spinner4.stop("Validation failed");
2751
+ M.error("This does not appear to be a valid Mastra project:");
2752
+ validation.errors.forEach((error) => M.error(` - ${error}`));
2753
+ throw new Error("Invalid Mastra project");
2754
+ }
2755
+ spinner4.stop("Valid Mastra project \u2713");
2756
+ selectedTemplate = await createFromGitHubUrl(args.template);
2757
+ } else {
2758
+ const templates = await loadTemplates();
2759
+ const found = findTemplateByName(templates, args.template);
2760
+ if (!found) {
2761
+ M.error(`Template "${args.template}" not found. Available templates:`);
2762
+ templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
2763
+ throw new Error(`Template "${args.template}" not found`);
2764
+ }
2765
+ selectedTemplate = found;
2766
+ }
2767
+ }
2768
+ if (!selectedTemplate) {
2769
+ throw new Error("No template selected");
2770
+ }
2771
+ let projectName = args.projectName;
2772
+ if (!projectName) {
2773
+ const defaultName = getDefaultProjectName(selectedTemplate);
2774
+ const response = await he({
2775
+ message: "What is your project name?",
2776
+ defaultValue: defaultName,
2777
+ placeholder: defaultName
2778
+ });
2779
+ if (pD(response)) {
2780
+ M.info("Project creation cancelled.");
2781
+ return;
2782
+ }
2783
+ projectName = response;
2784
+ }
2785
+ let llmProvider = args.llmProvider;
2786
+ if (!llmProvider) {
2787
+ const providerResponse = await ve({
2788
+ message: "Select a default provider:",
2789
+ options: LLM_PROVIDERS
2790
+ });
2791
+ if (pD(providerResponse)) {
2792
+ M.info("Project creation cancelled.");
2793
+ return;
2794
+ }
2795
+ llmProvider = providerResponse;
2796
+ }
2797
+ try {
2798
+ const analytics = args.injectedAnalytics || getAnalytics();
2799
+ if (analytics) {
2800
+ analytics.trackEvent("cli_template_used", {
2801
+ template_slug: selectedTemplate.slug,
2802
+ template_title: selectedTemplate.title
2803
+ });
2804
+ if (llmProvider) {
2805
+ analytics.trackEvent("cli_model_provider_selected", {
2806
+ provider: llmProvider,
2807
+ selection_method: args.llmProvider ? "cli_args" : "interactive"
2808
+ });
2809
+ }
2810
+ }
2811
+ const isBeta = version$1?.includes("beta") ?? false;
2812
+ const isMastraTemplate = selectedTemplate.githubUrl.includes("github.com/mastra-ai/");
2813
+ const branch = isBeta && isMastraTemplate ? "beta" : void 0;
2814
+ const projectPath = await cloneTemplate({
2815
+ template: selectedTemplate,
2816
+ projectName,
2817
+ branch,
2818
+ llmProvider
2819
+ });
2820
+ await installDependencies(projectPath);
2821
+ Me(`
2822
+ ${color2.green("Mastra template installed!")}
2823
+
2824
+ Add the necessary environment
2825
+ variables in your ${color2.cyan(".env")} file
2826
+ `);
2827
+ postCreate({ projectName });
2828
+ } catch (error) {
2829
+ M.error(`Failed to create project from template: ${error instanceof Error ? error.message : "Unknown error"}`);
2830
+ throw error;
2831
+ }
2832
+ }
2306
2833
 
2307
2834
  async function getPackageVersion() {
2308
2835
  const __filename = fileURLToPath(import.meta.url);
2309
2836
  const __dirname = dirname(__filename);
2310
- const pkgJsonPath = path2.join(__dirname, "..", "package.json");
2311
- const content = await fsExtra.readJSON(pkgJsonPath);
2837
+ const pkgJsonPath = path3.join(__dirname, "..", "package.json");
2838
+ const content = await fsExtra$1.readJSON(pkgJsonPath);
2312
2839
  return content.version;
2313
2840
  }
2314
2841
  async function getCreateVersionTag() {
2315
2842
  try {
2316
2843
  const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
2317
- const json = await fsExtra.readJSON(pkgPath);
2844
+ const json = await fsExtra$1.readJSON(pkgPath);
2318
2845
  const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
2319
2846
  const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
2320
2847
  const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
@@ -2338,25 +2865,30 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
2338
2865
  analytics.trackCommand({
2339
2866
  command: "version"
2340
2867
  });
2341
- console.log(`create-mastra ${version}`);
2868
+ console.info(`create-mastra ${version}`);
2342
2869
  } catch {
2343
2870
  }
2344
2871
  });
2345
2872
  program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
2346
2873
  "-p, --project-name <string>",
2347
2874
  "Project name that will be used in package.json and as the project directory name."
2348
- ).option("--default", "Quick start with defaults(src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-n, --no-example", "Do not include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").option("-d, --dir <directory>", "Target directory for Mastra source code (default: src/)").option("-m, --mcp <mcp>", "MCP Server for code editor (cursor, cursor-global, windsurf, vscode)").action(async (projectNameArg, args) => {
2875
+ ).option("--default", "Quick start with defaults (src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows, scorers)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-n, --no-example", "Do not include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").option("-d, --dir <directory>", "Target directory for Mastra source code (default: src/)").option("-m, --mcp <mcp>", "MCP Server for code editor (cursor, cursor-global, windsurf, vscode)").option(
2876
+ "--template [template-name]",
2877
+ "Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
2878
+ ).action(async (projectNameArg, args) => {
2349
2879
  const projectName = projectNameArg || args.projectName;
2350
2880
  const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
2351
2881
  if (args.default) {
2352
2882
  await create({
2353
- components: ["agents", "tools", "workflows"],
2883
+ components: ["agents", "tools", "workflows", "scorers"],
2354
2884
  llmProvider: "openai",
2355
2885
  addExample: true,
2356
2886
  createVersionTag,
2357
2887
  timeout,
2358
2888
  mcpServer: args.mcp,
2359
- directory: "src/"
2889
+ directory: "src/",
2890
+ template: args.template,
2891
+ analytics
2360
2892
  });
2361
2893
  return;
2362
2894
  }
@@ -2364,12 +2896,14 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
2364
2896
  components: args.components ? args.components.split(",") : [],
2365
2897
  llmProvider: args.llm,
2366
2898
  addExample: args.example,
2367
- llmApiKey: args["llm-api-key"],
2899
+ llmApiKey: args.llmApiKey,
2368
2900
  createVersionTag,
2369
2901
  timeout,
2370
2902
  projectName,
2371
2903
  directory: args.dir,
2372
- mcpServer: args.mcp
2904
+ mcpServer: args.mcp,
2905
+ template: args.template,
2906
+ analytics
2373
2907
  });
2374
2908
  });
2375
2909
  program.parse(process.argv);