create-mastra 0.0.0-taofeeqInngest-20250603090617 → 0.0.0-testing-cloud-studios-20260114234039
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/CHANGELOG.md +2322 -0
- package/LICENSE.md +11 -42
- package/README.md +11 -39
- package/dist/index.js +1344 -615
- package/dist/index.js.map +1 -1
- package/dist/starter-files/tools.ts +2 -2
- package/dist/templates/dev.entry.js +10 -43
- package/package.json +31 -24
- package/dist/starter-files/config.ts +0 -25
- package/dist/starter-files/mastra-pg.docker-compose.yaml +0 -15
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
|
|
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';
|
|
16
10
|
import fs4 from 'node:fs/promises';
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
11
|
+
import util, { stripVTControlCharacters } from 'node:util';
|
|
12
|
+
import y$1, { stdout, stdin } from 'node:process';
|
|
13
|
+
import * as g from 'node:readline';
|
|
14
|
+
import g__default from 'node:readline';
|
|
15
|
+
import { Writable } from 'node:stream';
|
|
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';
|
|
21
|
+
import fsExtra$1 from 'fs-extra';
|
|
20
22
|
import pino from 'pino';
|
|
21
23
|
import pretty from 'pino-pretty';
|
|
22
|
-
import fsExtra from 'fs-extra';
|
|
23
24
|
|
|
24
25
|
var __filename = fileURLToPath(import.meta.url);
|
|
25
|
-
var __dirname =
|
|
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 =
|
|
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(
|
|
70
|
+
writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
66
71
|
} catch {
|
|
67
72
|
}
|
|
68
73
|
}
|
|
@@ -100,6 +105,10 @@ var PosthogAnalytics = class {
|
|
|
100
105
|
machine_id: os.hostname()
|
|
101
106
|
};
|
|
102
107
|
}
|
|
108
|
+
getDurationMs(startTime) {
|
|
109
|
+
const [seconds, nanoseconds] = process.hrtime(startTime);
|
|
110
|
+
return seconds * 1e3 + nanoseconds / 1e6;
|
|
111
|
+
}
|
|
103
112
|
captureSessionStart() {
|
|
104
113
|
if (!this.client) {
|
|
105
114
|
return;
|
|
@@ -112,6 +121,22 @@ var PosthogAnalytics = class {
|
|
|
112
121
|
}
|
|
113
122
|
});
|
|
114
123
|
}
|
|
124
|
+
trackEvent(eventName, properties) {
|
|
125
|
+
try {
|
|
126
|
+
if (!this.client) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
this.client.capture({
|
|
130
|
+
distinctId: this.distinctId,
|
|
131
|
+
event: eventName,
|
|
132
|
+
properties: {
|
|
133
|
+
...this.getSystemProperties(),
|
|
134
|
+
...properties
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
} catch {
|
|
138
|
+
}
|
|
139
|
+
}
|
|
115
140
|
trackCommand(options) {
|
|
116
141
|
try {
|
|
117
142
|
if (!this.client) {
|
|
@@ -152,8 +177,7 @@ var PosthogAnalytics = class {
|
|
|
152
177
|
const startTime = process.hrtime();
|
|
153
178
|
try {
|
|
154
179
|
const result = await execution();
|
|
155
|
-
const
|
|
156
|
-
const durationMs = seconds * 1e3 + nanoseconds / 1e6;
|
|
180
|
+
const durationMs = this.getDurationMs(startTime);
|
|
157
181
|
this.trackCommand({
|
|
158
182
|
command,
|
|
159
183
|
args,
|
|
@@ -163,8 +187,7 @@ var PosthogAnalytics = class {
|
|
|
163
187
|
});
|
|
164
188
|
return result;
|
|
165
189
|
} catch (error) {
|
|
166
|
-
const
|
|
167
|
-
const durationMs = seconds * 1e3 + nanoseconds / 1e6;
|
|
190
|
+
const durationMs = this.getDurationMs(startTime);
|
|
168
191
|
this.trackCommand({
|
|
169
192
|
command,
|
|
170
193
|
args,
|
|
@@ -348,74 +371,65 @@ function requirePicocolors () {
|
|
|
348
371
|
var picocolorsExports = /*@__PURE__*/ requirePicocolors();
|
|
349
372
|
var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
|
|
350
373
|
|
|
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,
|
|
353
|
-
`?(
|
|
354
|
-
`&&(s&&o&&(
|
|
374
|
+
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(`
|
|
375
|
+
`)];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]===`
|
|
376
|
+
`?(i&&(F+=K$1("")),s&&o&&(F+=z(o))):a===`
|
|
377
|
+
`&&(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
378
|
`).split(`
|
|
356
|
-
`).map(
|
|
357
|
-
`)}
|
|
358
|
-
`),
|
|
359
|
-
`),s=[];for(let
|
|
360
|
-
`),
|
|
361
|
-
`).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=
|
|
362
|
-
`);this.output.write(s[
|
|
363
|
-
`).slice(
|
|
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
|
|
365
|
-
|
|
366
|
-
function
|
|
367
|
-
${
|
|
368
|
-
`,t
|
|
369
|
-
${color2.yellow(
|
|
370
|
-
${color2.yellow(
|
|
371
|
-
`;case "submit":return `${n}${color2.gray(
|
|
372
|
-
|
|
373
|
-
${color2.cyan(
|
|
374
|
-
`}}}).prompt(),
|
|
375
|
-
${
|
|
376
|
-
`,
|
|
377
|
-
${color2.gray(
|
|
378
|
-
${color2.cyan(
|
|
379
|
-
`}}}).prompt()},
|
|
380
|
-
${
|
|
381
|
-
`;switch(this.state){case "submit":return `${
|
|
382
|
-
${color2.gray(
|
|
383
|
-
${color2.cyan(
|
|
384
|
-
${color2.cyan(
|
|
385
|
-
`}}}).prompt()}
|
|
386
|
-
${
|
|
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}
|
|
379
|
+
`).map(F=>lD(F,u,t)).join(`
|
|
380
|
+
`)}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(`
|
|
381
|
+
`),F=u.split(`
|
|
382
|
+
`),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(`
|
|
383
|
+
`),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(`
|
|
384
|
+
`).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(`
|
|
385
|
+
`);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(`
|
|
386
|
+
`).slice(F);this.output.write(s.join(`
|
|
387
|
+
`)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}class dD 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",t=>{this.output.write(srcExports.cursor.move(0,-1)),this.value=t,this.state="submit",this.close();}),this.on("cursor",()=>{this.value=!this.value;});}}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);});}}
|
|
388
|
+
|
|
389
|
+
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)}
|
|
390
|
+
${b(this.state)} ${t.message}
|
|
391
|
+
`,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()}
|
|
392
|
+
${color2.yellow(o)} ${i}
|
|
393
|
+
${color2.yellow(d)} ${color2.yellow(this.error)}
|
|
394
|
+
`;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()?`
|
|
395
|
+
${color2.gray(o)}`:""}`;default:return `${n}${color2.cyan(o)} ${i}
|
|
396
|
+
${color2.cyan(d)}
|
|
397
|
+
`}}}).prompt(),ye=t=>{const n=t.active??"Yes",r=t.inactive??"No";return new dD({active:n,inactive:r,initialValue:t.initialValue??true,render(){const i=`${color2.gray(o)}
|
|
398
|
+
${b(this.state)} ${t.message}
|
|
399
|
+
`,s=this.value?n:r;switch(this.state){case "submit":return `${i}${color2.gray(o)} ${color2.dim(s)}`;case "cancel":return `${i}${color2.gray(o)} ${color2.strikethrough(color2.dim(s))}
|
|
400
|
+
${color2.gray(o)}`;default:return `${i}${color2.cyan(o)} ${this.value?`${color2.green(k)} ${n}`:`${color2.dim(P)} ${color2.dim(n)}`} ${color2.dim("/")} ${this.value?`${color2.dim(P)} ${color2.dim(r)}`:`${color2.green(k)} ${r}`}
|
|
401
|
+
${color2.cyan(d)}
|
|
402
|
+
`}}}).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)}
|
|
403
|
+
${b(this.state)} ${t.message}
|
|
404
|
+
`;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")}
|
|
405
|
+
${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(`
|
|
406
|
+
${color2.cyan(o)} `)}
|
|
407
|
+
${color2.cyan(d)}
|
|
408
|
+
`}}}).prompt()},Me=(t="",n="")=>{const r=`
|
|
409
|
+
${t}
|
|
399
410
|
`.split(`
|
|
400
|
-
`),i=
|
|
401
|
-
`);process.stdout.write(`${color2.gray(
|
|
402
|
-
${color2.green(
|
|
403
|
-
${
|
|
404
|
-
${color2.gray(
|
|
405
|
-
`);},
|
|
406
|
-
|
|
407
|
-
`);},
|
|
408
|
-
`);},
|
|
409
|
-
${color2.gray(
|
|
410
|
-
|
|
411
|
-
`);},
|
|
412
|
-
`);
|
|
411
|
+
`),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(`
|
|
412
|
+
`);process.stdout.write(`${color2.gray(o)}
|
|
413
|
+
${color2.green(C)} ${color2.reset(n)} ${color2.gray(_.repeat(Math.max(s-i-1,1))+me)}
|
|
414
|
+
${c}
|
|
415
|
+
${color2.gray(de+_.repeat(s+2)+pe)}
|
|
416
|
+
`);},xe=(t="")=>{process.stdout.write(`${color2.gray(d)} ${color2.red(t)}
|
|
417
|
+
|
|
418
|
+
`);},Ie=(t="")=>{process.stdout.write(`${color2.gray(ue)} ${t}
|
|
419
|
+
`);},Se=(t="")=>{process.stdout.write(`${color2.gray(o)}
|
|
420
|
+
${color2.gray(d)} ${t}
|
|
421
|
+
|
|
422
|
+
`);},M={message:(t="",{symbol:n=color2.gray(o)}={})=>{const r=[`${color2.gray(o)}`];if(t){const[i,...s]=t.split(`
|
|
423
|
+
`);r.push(`${n} ${i}`,...s.map(c=>`${color2.gray(o)} ${c}`));}process.stdout.write(`${r.join(`
|
|
413
424
|
`)}
|
|
414
|
-
`);},info:
|
|
415
|
-
`);
|
|
416
|
-
`),
|
|
425
|
+
`);},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(`
|
|
426
|
+
`);const m=$.split(`
|
|
427
|
+
`);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)}
|
|
428
|
+
`);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)}
|
|
429
|
+
`):process.stdout.write(`${w} ${l}
|
|
430
|
+
`),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
431
|
|
|
418
|
-
var shellQuote
|
|
432
|
+
var shellQuote = {};
|
|
419
433
|
|
|
420
434
|
var quote;
|
|
421
435
|
var hasRequiredQuote;
|
|
@@ -432,8 +446,8 @@ function requireQuote () {
|
|
|
432
446
|
if (s && typeof s === 'object') {
|
|
433
447
|
return s.op.replace(/(.)/g, '\\$1');
|
|
434
448
|
}
|
|
435
|
-
if ((/["\s]/).test(s) && !(/'/).test(s)) {
|
|
436
|
-
return "'" + s.replace(/(['
|
|
449
|
+
if ((/["\s\\]/).test(s) && !(/'/).test(s)) {
|
|
450
|
+
return "'" + s.replace(/(['])/g, '\\$1') + "'";
|
|
437
451
|
}
|
|
438
452
|
if ((/["'\s]/).test(s)) {
|
|
439
453
|
return '"' + s.replace(/(["\\$`!])/g, '\\$1') + '"';
|
|
@@ -540,7 +554,7 @@ function requireParse () {
|
|
|
540
554
|
return matches.map(function (match) {
|
|
541
555
|
var s = match[0];
|
|
542
556
|
if (!s || commented) {
|
|
543
|
-
return void
|
|
557
|
+
return void undefined;
|
|
544
558
|
}
|
|
545
559
|
if (controlRE.test(s)) {
|
|
546
560
|
return { op: s };
|
|
@@ -681,16 +695,16 @@ function requireParse () {
|
|
|
681
695
|
var hasRequiredShellQuote;
|
|
682
696
|
|
|
683
697
|
function requireShellQuote () {
|
|
684
|
-
if (hasRequiredShellQuote) return shellQuote
|
|
698
|
+
if (hasRequiredShellQuote) return shellQuote;
|
|
685
699
|
hasRequiredShellQuote = 1;
|
|
686
700
|
|
|
687
|
-
shellQuote
|
|
688
|
-
shellQuote
|
|
689
|
-
return shellQuote
|
|
701
|
+
shellQuote.quote = requireQuote();
|
|
702
|
+
shellQuote.parse = requireParse();
|
|
703
|
+
return shellQuote;
|
|
690
704
|
}
|
|
691
705
|
|
|
692
706
|
var shellQuoteExports = requireShellQuote();
|
|
693
|
-
var
|
|
707
|
+
var shellQuote2 = /*@__PURE__*/getDefaultExportFromCjs(shellQuoteExports);
|
|
694
708
|
|
|
695
709
|
// eslint-disable-next-line no-warning-comments
|
|
696
710
|
// TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
|
|
@@ -717,13 +731,18 @@ const format = (open, close) => {
|
|
|
717
731
|
// Handle nested colors.
|
|
718
732
|
|
|
719
733
|
// We could have done this, but it's too slow (as of Node.js 22).
|
|
720
|
-
// return openCode + string.replaceAll(closeCode, openCode) + closeCode;
|
|
734
|
+
// return openCode + string.replaceAll(closeCode, (close === 22 ? closeCode : '') + openCode) + closeCode;
|
|
721
735
|
|
|
722
736
|
let result = openCode;
|
|
723
737
|
let lastIndex = 0;
|
|
724
738
|
|
|
739
|
+
// SGR 22 resets both bold (1) and dim (2). When we encounter a nested
|
|
740
|
+
// close for styles that use 22, we need to re-open the outer style.
|
|
741
|
+
const reopenOnNestedClose = close === 22;
|
|
742
|
+
const replaceCode = (reopenOnNestedClose ? closeCode : '') + openCode;
|
|
743
|
+
|
|
725
744
|
while (index !== -1) {
|
|
726
|
-
result += string.slice(lastIndex, index) +
|
|
745
|
+
result += string.slice(lastIndex, index) + replaceCode;
|
|
727
746
|
lastIndex = index + closeCode.length;
|
|
728
747
|
index = string.indexOf(closeCode, lastIndex);
|
|
729
748
|
}
|
|
@@ -825,18 +844,20 @@ var yoctocolors = /*#__PURE__*/Object.freeze({
|
|
|
825
844
|
yellowBright: yellowBright
|
|
826
845
|
});
|
|
827
846
|
|
|
828
|
-
const isUnicodeSupported =
|
|
847
|
+
const isUnicodeSupported = y$1.platform !== 'win32'
|
|
848
|
+
|| Boolean(y$1.env.WT_SESSION) // Windows Terminal
|
|
849
|
+
|| y$1.env.TERM_PROGRAM === 'vscode';
|
|
829
850
|
|
|
830
851
|
const isInteractive = stream => Boolean(
|
|
831
852
|
stream.isTTY
|
|
832
|
-
&&
|
|
833
|
-
&& !('CI' in
|
|
853
|
+
&& y$1.env.TERM !== 'dumb'
|
|
854
|
+
&& !('CI' in y$1.env),
|
|
834
855
|
);
|
|
835
856
|
|
|
836
857
|
const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
|
|
837
858
|
const successSymbol = green(isUnicodeSupported ? '✔' : '√');
|
|
838
859
|
const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
|
|
839
|
-
const errorSymbol = red(isUnicodeSupported ? '
|
|
860
|
+
const errorSymbol = red(isUnicodeSupported ? '✖' : '×');
|
|
840
861
|
|
|
841
862
|
const defaultSpinner = {
|
|
842
863
|
frames: isUnicodeSupported
|
|
@@ -873,13 +894,14 @@ class YoctoSpinner {
|
|
|
873
894
|
#exitHandlerBound;
|
|
874
895
|
#isInteractive;
|
|
875
896
|
#lastSpinnerFrameTime = 0;
|
|
897
|
+
#isSpinning = false;
|
|
876
898
|
|
|
877
899
|
constructor(options = {}) {
|
|
878
900
|
const spinner = options.spinner ?? defaultSpinner;
|
|
879
901
|
this.#frames = spinner.frames;
|
|
880
902
|
this.#interval = spinner.interval;
|
|
881
903
|
this.#text = options.text ?? '';
|
|
882
|
-
this.#stream = options.stream ??
|
|
904
|
+
this.#stream = options.stream ?? y$1.stderr;
|
|
883
905
|
this.#color = options.color ?? 'cyan';
|
|
884
906
|
this.#isInteractive = isInteractive(this.#stream);
|
|
885
907
|
this.#exitHandlerBound = this.#exitHandler.bind(this);
|
|
@@ -894,13 +916,17 @@ class YoctoSpinner {
|
|
|
894
916
|
return this;
|
|
895
917
|
}
|
|
896
918
|
|
|
919
|
+
this.#isSpinning = true;
|
|
897
920
|
this.#hideCursor();
|
|
898
921
|
this.#render();
|
|
899
922
|
this.#subscribeToProcessEvents();
|
|
900
923
|
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
924
|
+
// Only start the timer in interactive mode
|
|
925
|
+
if (this.#isInteractive) {
|
|
926
|
+
this.#timer = setInterval(() => {
|
|
927
|
+
this.#render();
|
|
928
|
+
}, this.#interval);
|
|
929
|
+
}
|
|
904
930
|
|
|
905
931
|
return this;
|
|
906
932
|
}
|
|
@@ -910,8 +936,12 @@ class YoctoSpinner {
|
|
|
910
936
|
return this;
|
|
911
937
|
}
|
|
912
938
|
|
|
913
|
-
|
|
914
|
-
this.#timer
|
|
939
|
+
this.#isSpinning = false;
|
|
940
|
+
if (this.#timer) {
|
|
941
|
+
clearInterval(this.#timer);
|
|
942
|
+
this.#timer = undefined;
|
|
943
|
+
}
|
|
944
|
+
|
|
915
945
|
this.#showCursor();
|
|
916
946
|
this.clear();
|
|
917
947
|
this.#unsubscribeFromProcessEvents();
|
|
@@ -944,15 +974,15 @@ class YoctoSpinner {
|
|
|
944
974
|
}
|
|
945
975
|
|
|
946
976
|
get isSpinning() {
|
|
947
|
-
return this.#
|
|
977
|
+
return this.#isSpinning;
|
|
948
978
|
}
|
|
949
979
|
|
|
950
980
|
get text() {
|
|
951
981
|
return this.#text;
|
|
952
982
|
}
|
|
953
983
|
|
|
954
|
-
set text(value
|
|
955
|
-
this.#text = value;
|
|
984
|
+
set text(value) {
|
|
985
|
+
this.#text = value ?? '';
|
|
956
986
|
this.#render();
|
|
957
987
|
}
|
|
958
988
|
|
|
@@ -1016,7 +1046,7 @@ class YoctoSpinner {
|
|
|
1016
1046
|
|
|
1017
1047
|
#lineCount(text) {
|
|
1018
1048
|
const width = this.#stream.columns ?? 80;
|
|
1019
|
-
const lines = text.split('\n');
|
|
1049
|
+
const lines = stripVTControlCharacters(text).split('\n');
|
|
1020
1050
|
|
|
1021
1051
|
let lineCount = 0;
|
|
1022
1052
|
for (const line of lines) {
|
|
@@ -1039,13 +1069,13 @@ class YoctoSpinner {
|
|
|
1039
1069
|
}
|
|
1040
1070
|
|
|
1041
1071
|
#subscribeToProcessEvents() {
|
|
1042
|
-
|
|
1043
|
-
|
|
1072
|
+
y$1.once('SIGINT', this.#exitHandlerBound);
|
|
1073
|
+
y$1.once('SIGTERM', this.#exitHandlerBound);
|
|
1044
1074
|
}
|
|
1045
1075
|
|
|
1046
1076
|
#unsubscribeFromProcessEvents() {
|
|
1047
|
-
|
|
1048
|
-
|
|
1077
|
+
y$1.off('SIGINT', this.#exitHandlerBound);
|
|
1078
|
+
y$1.off('SIGTERM', this.#exitHandlerBound);
|
|
1049
1079
|
}
|
|
1050
1080
|
|
|
1051
1081
|
#exitHandler(signal) {
|
|
@@ -1056,7 +1086,7 @@ class YoctoSpinner {
|
|
|
1056
1086
|
// SIGINT: 128 + 2
|
|
1057
1087
|
// SIGTERM: 128 + 15
|
|
1058
1088
|
const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
|
|
1059
|
-
|
|
1089
|
+
y$1.exit(exitCode);
|
|
1060
1090
|
}
|
|
1061
1091
|
}
|
|
1062
1092
|
|
|
@@ -1079,24 +1109,52 @@ var MastraLogger = class {
|
|
|
1079
1109
|
getTransports() {
|
|
1080
1110
|
return this.transports;
|
|
1081
1111
|
}
|
|
1082
|
-
|
|
1112
|
+
trackException(_error) {
|
|
1113
|
+
}
|
|
1114
|
+
async listLogs(transportId, params) {
|
|
1083
1115
|
if (!transportId || !this.transports.has(transportId)) {
|
|
1084
|
-
return [];
|
|
1116
|
+
return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
|
|
1085
1117
|
}
|
|
1086
|
-
return this.transports.get(transportId).
|
|
1118
|
+
return this.transports.get(transportId).listLogs(params) ?? {
|
|
1119
|
+
logs: [],
|
|
1120
|
+
total: 0,
|
|
1121
|
+
page: params?.page ?? 1,
|
|
1122
|
+
perPage: params?.perPage ?? 100,
|
|
1123
|
+
hasMore: false
|
|
1124
|
+
};
|
|
1087
1125
|
}
|
|
1088
|
-
async
|
|
1126
|
+
async listLogsByRunId({
|
|
1127
|
+
transportId,
|
|
1128
|
+
runId,
|
|
1129
|
+
fromDate,
|
|
1130
|
+
toDate,
|
|
1131
|
+
logLevel,
|
|
1132
|
+
filters,
|
|
1133
|
+
page,
|
|
1134
|
+
perPage
|
|
1135
|
+
}) {
|
|
1089
1136
|
if (!transportId || !this.transports.has(transportId) || !runId) {
|
|
1090
|
-
return [];
|
|
1137
|
+
return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
|
|
1091
1138
|
}
|
|
1092
|
-
return this.transports.get(transportId).
|
|
1139
|
+
return this.transports.get(transportId).listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
|
|
1140
|
+
logs: [],
|
|
1141
|
+
total: 0,
|
|
1142
|
+
page: page ?? 1,
|
|
1143
|
+
perPage: perPage ?? 100,
|
|
1144
|
+
hasMore: false
|
|
1145
|
+
};
|
|
1093
1146
|
}
|
|
1094
1147
|
};
|
|
1095
1148
|
|
|
1096
|
-
var PinoLogger = class extends MastraLogger {
|
|
1149
|
+
var PinoLogger = class _PinoLogger extends MastraLogger {
|
|
1097
1150
|
logger;
|
|
1098
1151
|
constructor(options = {}) {
|
|
1099
1152
|
super(options);
|
|
1153
|
+
const internalOptions = options;
|
|
1154
|
+
if (internalOptions._logger) {
|
|
1155
|
+
this.logger = internalOptions._logger;
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1100
1158
|
let prettyStream = void 0;
|
|
1101
1159
|
if (!options.overrideDefaultTransports) {
|
|
1102
1160
|
prettyStream = pretty({
|
|
@@ -1113,9 +1171,8 @@ var PinoLogger = class extends MastraLogger {
|
|
|
1113
1171
|
{
|
|
1114
1172
|
name: options.name || "app",
|
|
1115
1173
|
level: options.level || LogLevel.INFO,
|
|
1116
|
-
formatters:
|
|
1117
|
-
|
|
1118
|
-
}
|
|
1174
|
+
formatters: options.formatters,
|
|
1175
|
+
redact: options.redact
|
|
1119
1176
|
},
|
|
1120
1177
|
options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
|
|
1121
1178
|
...transportsAry.map(([, transport]) => ({
|
|
@@ -1129,6 +1186,38 @@ var PinoLogger = class extends MastraLogger {
|
|
|
1129
1186
|
])
|
|
1130
1187
|
);
|
|
1131
1188
|
}
|
|
1189
|
+
/**
|
|
1190
|
+
* Creates a child logger with additional bound context.
|
|
1191
|
+
* All logs from the child logger will include the bound context.
|
|
1192
|
+
*
|
|
1193
|
+
* @param bindings - Key-value pairs to include in all logs from this child logger
|
|
1194
|
+
* @returns A new PinoLogger instance with the bound context
|
|
1195
|
+
*
|
|
1196
|
+
* @example
|
|
1197
|
+
* ```typescript
|
|
1198
|
+
* const baseLogger = new PinoLogger({ name: 'MyApp' });
|
|
1199
|
+
*
|
|
1200
|
+
* // Create module-scoped logger
|
|
1201
|
+
* const serviceLogger = baseLogger.child({ module: 'UserService' });
|
|
1202
|
+
* serviceLogger.info('User created', { userId: '123' });
|
|
1203
|
+
* // Output includes: { module: 'UserService', userId: '123', msg: 'User created' }
|
|
1204
|
+
*
|
|
1205
|
+
* // Create request-scoped logger
|
|
1206
|
+
* const requestLogger = baseLogger.child({ requestId: req.id });
|
|
1207
|
+
* requestLogger.error('Request failed', { err: error });
|
|
1208
|
+
* // Output includes: { requestId: 'abc', msg: 'Request failed', err: {...} }
|
|
1209
|
+
* ```
|
|
1210
|
+
*/
|
|
1211
|
+
child(bindings) {
|
|
1212
|
+
const childPino = this.logger.child(bindings);
|
|
1213
|
+
const childOptions = {
|
|
1214
|
+
name: this.name,
|
|
1215
|
+
level: this.level,
|
|
1216
|
+
transports: Object.fromEntries(this.transports),
|
|
1217
|
+
_logger: childPino
|
|
1218
|
+
};
|
|
1219
|
+
return new _PinoLogger(childOptions);
|
|
1220
|
+
}
|
|
1132
1221
|
debug(message, args = {}) {
|
|
1133
1222
|
this.logger.debug(args, message);
|
|
1134
1223
|
}
|
|
@@ -1143,6 +1232,22 @@ var PinoLogger = class extends MastraLogger {
|
|
|
1143
1232
|
}
|
|
1144
1233
|
};
|
|
1145
1234
|
|
|
1235
|
+
var package_default = {
|
|
1236
|
+
version: "1.0.0-beta.13"};
|
|
1237
|
+
function getPackageManagerAddCommand(pm) {
|
|
1238
|
+
switch (pm) {
|
|
1239
|
+
case "npm":
|
|
1240
|
+
return "install --audit=false --fund=false --loglevel=error --progress=false --update-notifier=false";
|
|
1241
|
+
case "yarn":
|
|
1242
|
+
return "add";
|
|
1243
|
+
case "pnpm":
|
|
1244
|
+
return "add --loglevel=error";
|
|
1245
|
+
case "bun":
|
|
1246
|
+
return "add";
|
|
1247
|
+
default:
|
|
1248
|
+
return "add";
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1146
1251
|
var DepsService = class {
|
|
1147
1252
|
packageManager;
|
|
1148
1253
|
constructor() {
|
|
@@ -1151,11 +1256,11 @@ var DepsService = class {
|
|
|
1151
1256
|
findLockFile(dir) {
|
|
1152
1257
|
const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
|
|
1153
1258
|
for (const file of lockFiles) {
|
|
1154
|
-
if (fs3__default__default.existsSync(
|
|
1259
|
+
if (fs3__default__default.existsSync(path3.join(dir, file))) {
|
|
1155
1260
|
return file;
|
|
1156
1261
|
}
|
|
1157
1262
|
}
|
|
1158
|
-
const parentDir =
|
|
1263
|
+
const parentDir = path3.resolve(dir, "..");
|
|
1159
1264
|
if (parentDir !== dir) {
|
|
1160
1265
|
return this.findLockFile(parentDir);
|
|
1161
1266
|
}
|
|
@@ -1177,14 +1282,10 @@ var DepsService = class {
|
|
|
1177
1282
|
}
|
|
1178
1283
|
}
|
|
1179
1284
|
async installPackages(packages) {
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
runCommand = `${this.packageManager} i`;
|
|
1183
|
-
} else {
|
|
1184
|
-
runCommand = `${this.packageManager} add`;
|
|
1185
|
-
}
|
|
1285
|
+
const pm = this.packageManager;
|
|
1286
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
1186
1287
|
const packageList = packages.join(" ");
|
|
1187
|
-
return execa(`${
|
|
1288
|
+
return execa(`${pm} ${installCommand} ${packageList}`, {
|
|
1188
1289
|
all: true,
|
|
1189
1290
|
shell: true,
|
|
1190
1291
|
stdio: "inherit"
|
|
@@ -1192,7 +1293,7 @@ var DepsService = class {
|
|
|
1192
1293
|
}
|
|
1193
1294
|
async checkDependencies(dependencies) {
|
|
1194
1295
|
try {
|
|
1195
|
-
const packageJsonPath =
|
|
1296
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
1196
1297
|
try {
|
|
1197
1298
|
await fs4.access(packageJsonPath);
|
|
1198
1299
|
} catch {
|
|
@@ -1212,7 +1313,7 @@ var DepsService = class {
|
|
|
1212
1313
|
}
|
|
1213
1314
|
async getProjectName() {
|
|
1214
1315
|
try {
|
|
1215
|
-
const packageJsonPath =
|
|
1316
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
1216
1317
|
const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
|
|
1217
1318
|
const pkg = JSON.parse(packageJson);
|
|
1218
1319
|
return pkg.name;
|
|
@@ -1220,13 +1321,6 @@ var DepsService = class {
|
|
|
1220
1321
|
throw err;
|
|
1221
1322
|
}
|
|
1222
1323
|
}
|
|
1223
|
-
async getPackageVersion() {
|
|
1224
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
1225
|
-
const __dirname = dirname(__filename);
|
|
1226
|
-
const pkgJsonPath = path2.join(__dirname, "..", "package.json");
|
|
1227
|
-
const content = await fsExtra3.readJSON(pkgJsonPath);
|
|
1228
|
-
return content.version;
|
|
1229
|
-
}
|
|
1230
1324
|
async addScriptsToPackageJson(scripts) {
|
|
1231
1325
|
const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
|
|
1232
1326
|
packageJson.scripts = {
|
|
@@ -1236,156 +1330,6 @@ var DepsService = class {
|
|
|
1236
1330
|
await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
1237
1331
|
}
|
|
1238
1332
|
};
|
|
1239
|
-
function getPackageManager() {
|
|
1240
|
-
const userAgent = process.env.npm_config_user_agent || "";
|
|
1241
|
-
const execPath = process.env.npm_execpath || "";
|
|
1242
|
-
if (userAgent.includes("yarn")) {
|
|
1243
|
-
return "yarn";
|
|
1244
|
-
}
|
|
1245
|
-
if (userAgent.includes("pnpm")) {
|
|
1246
|
-
return "pnpm";
|
|
1247
|
-
}
|
|
1248
|
-
if (userAgent.includes("npm")) {
|
|
1249
|
-
return "npm";
|
|
1250
|
-
}
|
|
1251
|
-
if (execPath.includes("yarn")) {
|
|
1252
|
-
return "yarn";
|
|
1253
|
-
}
|
|
1254
|
-
if (execPath.includes("pnpm")) {
|
|
1255
|
-
return "pnpm";
|
|
1256
|
-
}
|
|
1257
|
-
if (execPath.includes("npm")) {
|
|
1258
|
-
return "npm";
|
|
1259
|
-
}
|
|
1260
|
-
return "npm";
|
|
1261
|
-
}
|
|
1262
|
-
function getPackageManagerInstallCommand(pm) {
|
|
1263
|
-
switch (pm) {
|
|
1264
|
-
case "npm":
|
|
1265
|
-
return "install";
|
|
1266
|
-
case "yarn":
|
|
1267
|
-
return "add";
|
|
1268
|
-
case "pnpm":
|
|
1269
|
-
return "add";
|
|
1270
|
-
default:
|
|
1271
|
-
return "install";
|
|
1272
|
-
}
|
|
1273
|
-
}
|
|
1274
|
-
var args = ["-y", "@mastra/mcp-docs-server@latest"];
|
|
1275
|
-
var createMcpConfig = (editor) => {
|
|
1276
|
-
if (editor === "vscode") {
|
|
1277
|
-
return {
|
|
1278
|
-
servers: {
|
|
1279
|
-
mastra: process.platform === `win32` ? {
|
|
1280
|
-
command: "cmd",
|
|
1281
|
-
args: ["/c", "npx", ...args],
|
|
1282
|
-
type: "stdio"
|
|
1283
|
-
} : {
|
|
1284
|
-
command: "npx",
|
|
1285
|
-
args,
|
|
1286
|
-
type: "stdio"
|
|
1287
|
-
}
|
|
1288
|
-
}
|
|
1289
|
-
};
|
|
1290
|
-
}
|
|
1291
|
-
return {
|
|
1292
|
-
mcpServers: {
|
|
1293
|
-
mastra: process.platform === `win32` ? {
|
|
1294
|
-
command: "cmd",
|
|
1295
|
-
args: ["/c", "npx", ...args]
|
|
1296
|
-
} : {
|
|
1297
|
-
command: "npx",
|
|
1298
|
-
args
|
|
1299
|
-
}
|
|
1300
|
-
}
|
|
1301
|
-
};
|
|
1302
|
-
};
|
|
1303
|
-
function makeConfig(original, editor) {
|
|
1304
|
-
if (editor === "vscode") {
|
|
1305
|
-
return {
|
|
1306
|
-
...original,
|
|
1307
|
-
servers: {
|
|
1308
|
-
...original?.servers || {},
|
|
1309
|
-
...createMcpConfig(editor).servers
|
|
1310
|
-
}
|
|
1311
|
-
};
|
|
1312
|
-
}
|
|
1313
|
-
return {
|
|
1314
|
-
...original,
|
|
1315
|
-
mcpServers: {
|
|
1316
|
-
...original?.mcpServers || {},
|
|
1317
|
-
...createMcpConfig(editor).mcpServers
|
|
1318
|
-
}
|
|
1319
|
-
};
|
|
1320
|
-
}
|
|
1321
|
-
async function writeMergedConfig(configPath, editor) {
|
|
1322
|
-
const configExists = existsSync(configPath);
|
|
1323
|
-
const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor);
|
|
1324
|
-
await ensureFile(configPath);
|
|
1325
|
-
await writeJSON(configPath, config, {
|
|
1326
|
-
spaces: 2
|
|
1327
|
-
});
|
|
1328
|
-
}
|
|
1329
|
-
var windsurfGlobalMCPConfigPath = path2.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1330
|
-
var cursorGlobalMCPConfigPath = path2.join(os.homedir(), ".cursor", "mcp.json");
|
|
1331
|
-
path2.join(process.cwd(), ".vscode", "mcp.json");
|
|
1332
|
-
var vscodeGlobalMCPConfigPath = path2.join(
|
|
1333
|
-
os.homedir(),
|
|
1334
|
-
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")
|
|
1335
|
-
);
|
|
1336
|
-
async function installMastraDocsMCPServer({ editor, directory }) {
|
|
1337
|
-
if (editor === `cursor`) {
|
|
1338
|
-
await writeMergedConfig(path2.join(directory, ".cursor", "mcp.json"), "cursor");
|
|
1339
|
-
}
|
|
1340
|
-
if (editor === `vscode`) {
|
|
1341
|
-
await writeMergedConfig(path2.join(directory, ".vscode", "mcp.json"), "vscode");
|
|
1342
|
-
}
|
|
1343
|
-
if (editor === `cursor-global`) {
|
|
1344
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1345
|
-
if (alreadyInstalled) {
|
|
1346
|
-
return;
|
|
1347
|
-
}
|
|
1348
|
-
await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global");
|
|
1349
|
-
}
|
|
1350
|
-
if (editor === `windsurf`) {
|
|
1351
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1352
|
-
if (alreadyInstalled) {
|
|
1353
|
-
return;
|
|
1354
|
-
}
|
|
1355
|
-
await writeMergedConfig(windsurfGlobalMCPConfigPath, editor);
|
|
1356
|
-
}
|
|
1357
|
-
}
|
|
1358
|
-
async function globalMCPIsAlreadyInstalled(editor) {
|
|
1359
|
-
let configPath = ``;
|
|
1360
|
-
if (editor === "windsurf") {
|
|
1361
|
-
configPath = windsurfGlobalMCPConfigPath;
|
|
1362
|
-
} else if (editor === "cursor-global") {
|
|
1363
|
-
configPath = cursorGlobalMCPConfigPath;
|
|
1364
|
-
} else if (editor === "vscode") {
|
|
1365
|
-
configPath = vscodeGlobalMCPConfigPath;
|
|
1366
|
-
}
|
|
1367
|
-
if (!configPath || !existsSync(configPath)) {
|
|
1368
|
-
return false;
|
|
1369
|
-
}
|
|
1370
|
-
try {
|
|
1371
|
-
const configContents = await readJSON(configPath);
|
|
1372
|
-
if (editor === "vscode") {
|
|
1373
|
-
if (!configContents?.servers) return false;
|
|
1374
|
-
const hasMastraMCP2 = Object.values(configContents.servers).some(
|
|
1375
|
-
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1376
|
-
);
|
|
1377
|
-
return hasMastraMCP2;
|
|
1378
|
-
}
|
|
1379
|
-
if (!configContents?.mcpServers) return false;
|
|
1380
|
-
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1381
|
-
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1382
|
-
);
|
|
1383
|
-
return hasMastraMCP;
|
|
1384
|
-
} catch (e) {
|
|
1385
|
-
console.error(e);
|
|
1386
|
-
return false;
|
|
1387
|
-
}
|
|
1388
|
-
}
|
|
1389
1333
|
var EnvService = class {
|
|
1390
1334
|
};
|
|
1391
1335
|
var FileEnvService = class extends EnvService {
|
|
@@ -1424,7 +1368,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1424
1368
|
${key}=${value}`;
|
|
1425
1369
|
}
|
|
1426
1370
|
await this.writeFile({ filePath, data });
|
|
1427
|
-
console.
|
|
1371
|
+
console.info(`${key} set to ${value} in ENV file.`);
|
|
1428
1372
|
return data;
|
|
1429
1373
|
}
|
|
1430
1374
|
async getEnvValue(key) {
|
|
@@ -1457,19 +1401,19 @@ var FileService = class {
|
|
|
1457
1401
|
*/
|
|
1458
1402
|
async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
|
|
1459
1403
|
const __filename = fileURLToPath(import.meta.url);
|
|
1460
|
-
const __dirname =
|
|
1461
|
-
const filePath =
|
|
1404
|
+
const __dirname = path3.dirname(__filename);
|
|
1405
|
+
const filePath = path3.resolve(__dirname, "starter-files", inputFile);
|
|
1462
1406
|
const fileString = fs3__default__default.readFileSync(filePath, "utf8");
|
|
1463
1407
|
if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
|
|
1464
|
-
console.
|
|
1408
|
+
console.info(`${outputFilePath} already exists`);
|
|
1465
1409
|
return false;
|
|
1466
1410
|
}
|
|
1467
|
-
await
|
|
1411
|
+
await fsExtra.outputFile(outputFilePath, fileString);
|
|
1468
1412
|
return true;
|
|
1469
1413
|
}
|
|
1470
1414
|
async setupEnvFile({ dbUrl }) {
|
|
1471
|
-
const envPath =
|
|
1472
|
-
await
|
|
1415
|
+
const envPath = path3.join(process.cwd(), ".env.development");
|
|
1416
|
+
await fsExtra.ensureFile(envPath);
|
|
1473
1417
|
const fileEnvService = new FileEnvService(envPath);
|
|
1474
1418
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1475
1419
|
}
|
|
@@ -1492,144 +1436,217 @@ var FileService = class {
|
|
|
1492
1436
|
fs3__default__default.writeFileSync(filePath, fileContent);
|
|
1493
1437
|
}
|
|
1494
1438
|
};
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
});
|
|
1499
|
-
var exec = util.promisify(child_process.exec);
|
|
1500
|
-
var getAISDKPackage = (llmProvider) => {
|
|
1501
|
-
switch (llmProvider) {
|
|
1502
|
-
case "openai":
|
|
1503
|
-
return "@ai-sdk/openai";
|
|
1504
|
-
case "anthropic":
|
|
1505
|
-
return "@ai-sdk/anthropic";
|
|
1506
|
-
case "groq":
|
|
1507
|
-
return "@ai-sdk/groq";
|
|
1508
|
-
case "google":
|
|
1509
|
-
return "@ai-sdk/google";
|
|
1510
|
-
case "cerebras":
|
|
1511
|
-
return "@ai-sdk/cerebras";
|
|
1512
|
-
default:
|
|
1513
|
-
return "@ai-sdk/openai";
|
|
1514
|
-
}
|
|
1439
|
+
var createArgs = (versionTag) => {
|
|
1440
|
+
const packageName = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
|
|
1441
|
+
return ["-y", packageName];
|
|
1515
1442
|
};
|
|
1516
|
-
var
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1533
|
-
modelItem = `cerebras('llama-3.3-70b')`;
|
|
1443
|
+
var createMcpConfig = (editor, versionTag) => {
|
|
1444
|
+
const args = createArgs(versionTag);
|
|
1445
|
+
if (editor === "vscode") {
|
|
1446
|
+
return {
|
|
1447
|
+
servers: {
|
|
1448
|
+
mastra: process.platform === `win32` ? {
|
|
1449
|
+
command: "cmd",
|
|
1450
|
+
args: ["/c", "npx", ...args],
|
|
1451
|
+
type: "stdio"
|
|
1452
|
+
} : {
|
|
1453
|
+
command: "npx",
|
|
1454
|
+
args,
|
|
1455
|
+
type: "stdio"
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
};
|
|
1534
1459
|
}
|
|
1535
|
-
return {
|
|
1460
|
+
return {
|
|
1461
|
+
mcpServers: {
|
|
1462
|
+
mastra: {
|
|
1463
|
+
command: "npx",
|
|
1464
|
+
args
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
};
|
|
1536
1468
|
};
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
model: ${modelItem},
|
|
1562
|
-
${addExampleTool ? "tools: { weatherTool }," : ""}
|
|
1563
|
-
memory: new Memory({
|
|
1564
|
-
storage: new LibSQLStore({
|
|
1565
|
-
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
1566
|
-
})
|
|
1567
|
-
})
|
|
1568
|
-
});
|
|
1569
|
-
`;
|
|
1570
|
-
const formattedContent = await prettier.format(content, {
|
|
1571
|
-
parser: "typescript",
|
|
1572
|
-
singleQuote: true
|
|
1469
|
+
function makeConfig(original, editor, versionTag) {
|
|
1470
|
+
if (editor === "vscode") {
|
|
1471
|
+
return {
|
|
1472
|
+
...original,
|
|
1473
|
+
servers: {
|
|
1474
|
+
...original?.servers || {},
|
|
1475
|
+
...createMcpConfig(editor, versionTag).servers
|
|
1476
|
+
}
|
|
1477
|
+
};
|
|
1478
|
+
}
|
|
1479
|
+
return {
|
|
1480
|
+
...original,
|
|
1481
|
+
mcpServers: {
|
|
1482
|
+
...original?.mcpServers || {},
|
|
1483
|
+
...createMcpConfig(editor, versionTag).mcpServers
|
|
1484
|
+
}
|
|
1485
|
+
};
|
|
1486
|
+
}
|
|
1487
|
+
async function writeMergedConfig(configPath, editor, versionTag) {
|
|
1488
|
+
const configExists = existsSync(configPath);
|
|
1489
|
+
const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor, versionTag);
|
|
1490
|
+
await ensureFile(configPath);
|
|
1491
|
+
await writeJSON(configPath, config, {
|
|
1492
|
+
spaces: 2
|
|
1573
1493
|
});
|
|
1574
|
-
await fs4.writeFile(destPath, "");
|
|
1575
|
-
await fs4.writeFile(destPath, formattedContent);
|
|
1576
1494
|
}
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1495
|
+
var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1496
|
+
var antigravityGlobalMCPConfigPath = path3.join(os.homedir(), ".gemini", "antigravity", "mcp_config.json");
|
|
1497
|
+
var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
|
|
1498
|
+
path3.join(process.cwd(), ".vscode", "mcp.json");
|
|
1499
|
+
var vscodeGlobalMCPConfigPath = path3.join(
|
|
1500
|
+
os.homedir(),
|
|
1501
|
+
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")
|
|
1502
|
+
);
|
|
1503
|
+
async function installMastraDocsMCPServer({
|
|
1504
|
+
editor,
|
|
1505
|
+
directory,
|
|
1506
|
+
versionTag
|
|
1507
|
+
}) {
|
|
1508
|
+
if (editor === `cursor`) {
|
|
1509
|
+
await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor", versionTag);
|
|
1510
|
+
}
|
|
1511
|
+
if (editor === `vscode`) {
|
|
1512
|
+
await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode", versionTag);
|
|
1513
|
+
}
|
|
1514
|
+
if (editor === `cursor-global`) {
|
|
1515
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1516
|
+
if (alreadyInstalled) {
|
|
1517
|
+
return;
|
|
1518
|
+
}
|
|
1519
|
+
await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global", versionTag);
|
|
1520
|
+
}
|
|
1521
|
+
if (editor === `windsurf`) {
|
|
1522
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1523
|
+
if (alreadyInstalled) {
|
|
1524
|
+
return;
|
|
1525
|
+
}
|
|
1526
|
+
await writeMergedConfig(windsurfGlobalMCPConfigPath, editor, versionTag);
|
|
1527
|
+
}
|
|
1528
|
+
if (editor === `antigravity`) {
|
|
1529
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1530
|
+
if (alreadyInstalled) {
|
|
1531
|
+
return;
|
|
1532
|
+
}
|
|
1533
|
+
await writeMergedConfig(antigravityGlobalMCPConfigPath, editor, versionTag);
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1536
|
+
async function globalMCPIsAlreadyInstalled(editor, versionTag) {
|
|
1537
|
+
let configPath = ``;
|
|
1538
|
+
if (editor === "windsurf") {
|
|
1539
|
+
configPath = windsurfGlobalMCPConfigPath;
|
|
1540
|
+
} else if (editor === "antigravity") {
|
|
1541
|
+
configPath = antigravityGlobalMCPConfigPath;
|
|
1542
|
+
} else if (editor === "cursor-global") {
|
|
1543
|
+
configPath = cursorGlobalMCPConfigPath;
|
|
1544
|
+
} else if (editor === "vscode") {
|
|
1545
|
+
configPath = vscodeGlobalMCPConfigPath;
|
|
1546
|
+
}
|
|
1547
|
+
if (!configPath || !existsSync(configPath)) {
|
|
1548
|
+
return false;
|
|
1549
|
+
}
|
|
1550
|
+
try {
|
|
1551
|
+
const configContents = await readJSON(configPath);
|
|
1552
|
+
if (!configContents) return false;
|
|
1553
|
+
const expectedPackage = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
|
|
1554
|
+
if (editor === "vscode") {
|
|
1555
|
+
if (!configContents.servers) return false;
|
|
1556
|
+
const hasMastraMCP2 = Object.values(configContents.servers).some(
|
|
1557
|
+
(server) => server?.args?.find((arg) => arg === expectedPackage)
|
|
1558
|
+
);
|
|
1559
|
+
return hasMastraMCP2;
|
|
1560
|
+
}
|
|
1561
|
+
if (!configContents?.mcpServers) return false;
|
|
1562
|
+
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1563
|
+
(server) => server?.args?.find((arg) => arg === expectedPackage)
|
|
1564
|
+
);
|
|
1565
|
+
return hasMastraMCP;
|
|
1566
|
+
} catch {
|
|
1567
|
+
return false;
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
var exec = util.promisify(child_process.exec);
|
|
1571
|
+
var getModelIdentifier = (llmProvider) => {
|
|
1572
|
+
let model = "openai/gpt-4o";
|
|
1573
|
+
if (llmProvider === "anthropic") {
|
|
1574
|
+
model = "anthropic/claude-sonnet-4-5";
|
|
1575
|
+
} else if (llmProvider === "groq") {
|
|
1576
|
+
model = "groq/llama-3.3-70b-versatile";
|
|
1577
|
+
} else if (llmProvider === "google") {
|
|
1578
|
+
model = "google/gemini-2.5-pro";
|
|
1579
|
+
} else if (llmProvider === "cerebras") {
|
|
1580
|
+
model = "cerebras/llama-3.3-70b";
|
|
1581
|
+
} else if (llmProvider === "mistral") {
|
|
1582
|
+
model = "mistral/mistral-medium-2508";
|
|
1583
|
+
}
|
|
1584
|
+
return model;
|
|
1585
|
+
};
|
|
1586
|
+
async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorers) {
|
|
1587
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1588
|
+
const instructions = `
|
|
1589
|
+
You are a helpful weather assistant that provides accurate weather information and can help planning activities based on the weather.
|
|
1590
|
+
|
|
1591
|
+
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1592
|
+
- Always ask for a location if none is provided
|
|
1593
|
+
- If the location name isn't in English, please translate it
|
|
1594
|
+
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1595
|
+
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1596
|
+
- Keep responses concise but informative
|
|
1597
|
+
- If the user asks for activities and provides the weather forecast, suggest activities based on the weather forecast.
|
|
1598
|
+
- If the user asks for activities, respond in the format they request.
|
|
1599
|
+
|
|
1600
|
+
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1601
|
+
`;
|
|
1602
|
+
const content = `
|
|
1603
|
+
import { Agent } from '@mastra/core/agent';
|
|
1604
|
+
import { Memory } from '@mastra/memory';
|
|
1605
|
+
${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
|
|
1606
|
+
${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
|
|
1607
|
+
|
|
1608
|
+
export const weatherAgent = new Agent({
|
|
1609
|
+
id: 'weather-agent',
|
|
1610
|
+
name: 'Weather Agent',
|
|
1611
|
+
instructions: \`${instructions}\`,
|
|
1612
|
+
model: '${modelString}',
|
|
1613
|
+
${addExampleTool ? "tools: { weatherTool }," : ""}
|
|
1614
|
+
${addScorers ? `scorers: {
|
|
1615
|
+
toolCallAppropriateness: {
|
|
1616
|
+
scorer: scorers.toolCallAppropriatenessScorer,
|
|
1617
|
+
sampling: {
|
|
1618
|
+
type: 'ratio',
|
|
1619
|
+
rate: 1,
|
|
1620
|
+
},
|
|
1621
|
+
},
|
|
1622
|
+
completeness: {
|
|
1623
|
+
scorer: scorers.completenessScorer,
|
|
1624
|
+
sampling: {
|
|
1625
|
+
type: 'ratio',
|
|
1626
|
+
rate: 1,
|
|
1627
|
+
},
|
|
1628
|
+
},
|
|
1629
|
+
translation: {
|
|
1630
|
+
scorer: scorers.translationScorer,
|
|
1631
|
+
sampling: {
|
|
1632
|
+
type: 'ratio',
|
|
1633
|
+
rate: 1,
|
|
1634
|
+
},
|
|
1635
|
+
},
|
|
1636
|
+
},` : ""}
|
|
1637
|
+
memory: new Memory()
|
|
1638
|
+
});
|
|
1639
|
+
`;
|
|
1640
|
+
const formattedContent = await prettier.format(content, {
|
|
1641
|
+
parser: "typescript",
|
|
1642
|
+
singleQuote: true
|
|
1643
|
+
});
|
|
1644
|
+
await fs4.writeFile(destPath, "");
|
|
1645
|
+
await fs4.writeFile(destPath, formattedContent);
|
|
1646
|
+
}
|
|
1647
|
+
async function writeWorkflowSample(destPath) {
|
|
1648
|
+
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1649
|
+
import { z } from 'zod';
|
|
1633
1650
|
|
|
1634
1651
|
const forecastSchema = z.object({
|
|
1635
1652
|
date: z.string(),
|
|
@@ -1724,16 +1741,59 @@ const planActivities = createStep({
|
|
|
1724
1741
|
outputSchema: z.object({
|
|
1725
1742
|
activities: z.string(),
|
|
1726
1743
|
}),
|
|
1727
|
-
execute: async ({ inputData }) => {
|
|
1744
|
+
execute: async ({ inputData, mastra }) => {
|
|
1728
1745
|
const forecast = inputData
|
|
1729
1746
|
|
|
1730
1747
|
if (!forecast) {
|
|
1731
1748
|
throw new Error('Forecast data not found')
|
|
1732
1749
|
}
|
|
1733
1750
|
|
|
1751
|
+
const agent = mastra?.getAgent('weatherAgent');
|
|
1752
|
+
if (!agent) {
|
|
1753
|
+
throw new Error('Weather agent not found');
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1734
1756
|
const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
|
|
1735
1757
|
\${JSON.stringify(forecast, null, 2)}
|
|
1736
|
-
|
|
1758
|
+
For each day in the forecast, structure your response exactly as follows:
|
|
1759
|
+
|
|
1760
|
+
\u{1F4C5} [Day, Month Date, Year]
|
|
1761
|
+
\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
|
|
1762
|
+
|
|
1763
|
+
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1764
|
+
\u2022 Conditions: [brief description]
|
|
1765
|
+
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1766
|
+
\u2022 Precipitation: [X% chance]
|
|
1767
|
+
|
|
1768
|
+
\u{1F305} MORNING ACTIVITIES
|
|
1769
|
+
Outdoor:
|
|
1770
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1771
|
+
Best timing: [specific time range]
|
|
1772
|
+
Note: [relevant weather consideration]
|
|
1773
|
+
|
|
1774
|
+
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1775
|
+
Outdoor:
|
|
1776
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1777
|
+
Best timing: [specific time range]
|
|
1778
|
+
Note: [relevant weather consideration]
|
|
1779
|
+
|
|
1780
|
+
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1781
|
+
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1782
|
+
Ideal for: [weather condition that would trigger this alternative]
|
|
1783
|
+
|
|
1784
|
+
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1785
|
+
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1786
|
+
|
|
1787
|
+
Guidelines:
|
|
1788
|
+
- Suggest 2-3 time-specific outdoor activities per day
|
|
1789
|
+
- Include 1-2 indoor backup options
|
|
1790
|
+
- For precipitation >50%, lead with indoor activities
|
|
1791
|
+
- All activities must be specific to the location
|
|
1792
|
+
- Include specific venues, trails, or locations
|
|
1793
|
+
- Consider activity intensity based on temperature
|
|
1794
|
+
- Keep descriptions concise but informative
|
|
1795
|
+
|
|
1796
|
+
Maintain this exact formatting for consistency, using the emoji and section headers as shown.\`;
|
|
1737
1797
|
|
|
1738
1798
|
const response = await agent.stream([
|
|
1739
1799
|
{
|
|
@@ -1781,41 +1841,138 @@ async function writeToolSample(destPath) {
|
|
|
1781
1841
|
const fileService = new FileService();
|
|
1782
1842
|
await fileService.copyStarterFile("tools.ts", destPath);
|
|
1783
1843
|
}
|
|
1844
|
+
async function writeScorersSample(llmProvider, destPath) {
|
|
1845
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1846
|
+
const content = `import { z } from 'zod';
|
|
1847
|
+
import { createToolCallAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt';
|
|
1848
|
+
import { createCompletenessScorer } from '@mastra/evals/scorers/prebuilt';
|
|
1849
|
+
import { getAssistantMessageFromRunOutput, getUserMessageFromRunInput } from '@mastra/evals/scorers/utils';
|
|
1850
|
+
import { createScorer } from '@mastra/core/evals';
|
|
1851
|
+
|
|
1852
|
+
export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({
|
|
1853
|
+
expectedTool: 'weatherTool',
|
|
1854
|
+
strictMode: false,
|
|
1855
|
+
});
|
|
1856
|
+
|
|
1857
|
+
export const completenessScorer = createCompletenessScorer();
|
|
1858
|
+
|
|
1859
|
+
// Custom LLM-judged scorer: evaluates if non-English locations are translated appropriately
|
|
1860
|
+
export const translationScorer = createScorer({
|
|
1861
|
+
id: 'translation-quality-scorer',
|
|
1862
|
+
name: 'Translation Quality',
|
|
1863
|
+
description: 'Checks that non-English location names are translated and used correctly',
|
|
1864
|
+
type: 'agent',
|
|
1865
|
+
judge: {
|
|
1866
|
+
model: '${modelString}',
|
|
1867
|
+
instructions:
|
|
1868
|
+
'You are an expert evaluator of translation quality for geographic locations. ' +
|
|
1869
|
+
'Determine whether the user text mentions a non-English location and whether the assistant correctly uses an English translation of that location. ' +
|
|
1870
|
+
'Be lenient with transliteration differences and diacritics. ' +
|
|
1871
|
+
'Return only the structured JSON matching the provided schema.',
|
|
1872
|
+
},
|
|
1873
|
+
})
|
|
1874
|
+
.preprocess(({ run }) => {
|
|
1875
|
+
const userText = getUserMessageFromRunInput(run.input) || '';
|
|
1876
|
+
const assistantText = getAssistantMessageFromRunOutput(run.output) || '';
|
|
1877
|
+
return { userText, assistantText };
|
|
1878
|
+
})
|
|
1879
|
+
.analyze({
|
|
1880
|
+
description: 'Extract location names and detect language/translation adequacy',
|
|
1881
|
+
outputSchema: z.object({
|
|
1882
|
+
nonEnglish: z.boolean(),
|
|
1883
|
+
translated: z.boolean(),
|
|
1884
|
+
confidence: z.number().min(0).max(1).default(1),
|
|
1885
|
+
explanation: z.string().default(''),
|
|
1886
|
+
}),
|
|
1887
|
+
createPrompt: ({ results }) => \`
|
|
1888
|
+
You are evaluating if a weather assistant correctly handled translation of a non-English location.
|
|
1889
|
+
User text:
|
|
1890
|
+
"""
|
|
1891
|
+
\${results.preprocessStepResult.userText}
|
|
1892
|
+
"""
|
|
1893
|
+
Assistant response:
|
|
1894
|
+
"""
|
|
1895
|
+
\${results.preprocessStepResult.assistantText}
|
|
1896
|
+
"""
|
|
1897
|
+
Tasks:
|
|
1898
|
+
1) Identify if the user mentioned a location that appears non-English.
|
|
1899
|
+
2) If non-English, check whether the assistant used a correct English translation of that location in its response.
|
|
1900
|
+
3) Be lenient with transliteration differences (e.g., accents/diacritics).
|
|
1901
|
+
Return JSON with fields:
|
|
1902
|
+
{
|
|
1903
|
+
"nonEnglish": boolean,
|
|
1904
|
+
"translated": boolean,
|
|
1905
|
+
"confidence": number, // 0-1
|
|
1906
|
+
"explanation": string
|
|
1907
|
+
}
|
|
1908
|
+
\`,
|
|
1909
|
+
})
|
|
1910
|
+
.generateScore(({ results }) => {
|
|
1911
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1912
|
+
if (!r.nonEnglish) return 1; // If not applicable, full credit
|
|
1913
|
+
if (r.translated) return Math.max(0, Math.min(1, 0.7 + 0.3 * (r.confidence ?? 1)));
|
|
1914
|
+
return 0; // Non-English but not translated
|
|
1915
|
+
})
|
|
1916
|
+
.generateReason(({ results, score }) => {
|
|
1917
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1918
|
+
return \`Translation scoring: nonEnglish=\${r.nonEnglish ?? false}, translated=\${r.translated ?? false}, confidence=\${r.confidence ?? 0}. Score=\${score}. \${r.explanation ?? ''}\`;
|
|
1919
|
+
});
|
|
1920
|
+
|
|
1921
|
+
export const scorers = {
|
|
1922
|
+
toolCallAppropriatenessScorer,
|
|
1923
|
+
completenessScorer,
|
|
1924
|
+
translationScorer,
|
|
1925
|
+
};`;
|
|
1926
|
+
const formattedContent = await prettier.format(content, {
|
|
1927
|
+
parser: "typescript",
|
|
1928
|
+
singleQuote: true
|
|
1929
|
+
});
|
|
1930
|
+
await fs4.writeFile(destPath, formattedContent);
|
|
1931
|
+
}
|
|
1784
1932
|
async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
|
|
1785
1933
|
switch (component) {
|
|
1786
1934
|
case "agents":
|
|
1787
|
-
return writeAgentSample(
|
|
1935
|
+
return writeAgentSample(
|
|
1936
|
+
llmprovider,
|
|
1937
|
+
destPath,
|
|
1938
|
+
importComponents.includes("tools"),
|
|
1939
|
+
importComponents.includes("scorers")
|
|
1940
|
+
);
|
|
1788
1941
|
case "tools":
|
|
1789
1942
|
return writeToolSample(destPath);
|
|
1790
1943
|
case "workflows":
|
|
1791
|
-
return writeWorkflowSample(destPath
|
|
1944
|
+
return writeWorkflowSample(destPath);
|
|
1945
|
+
case "scorers":
|
|
1946
|
+
return writeScorersSample(llmprovider, destPath);
|
|
1792
1947
|
default:
|
|
1793
1948
|
return "";
|
|
1794
1949
|
}
|
|
1795
1950
|
}
|
|
1796
1951
|
var createComponentsDir = async (dirPath, component) => {
|
|
1797
1952
|
const componentPath = dirPath + `/${component}`;
|
|
1798
|
-
await
|
|
1953
|
+
await fsExtra.ensureDir(componentPath);
|
|
1799
1954
|
};
|
|
1800
1955
|
var writeIndexFile = async ({
|
|
1801
1956
|
dirPath,
|
|
1802
1957
|
addAgent,
|
|
1803
1958
|
addExample,
|
|
1804
|
-
addWorkflow
|
|
1959
|
+
addWorkflow,
|
|
1960
|
+
addScorers
|
|
1805
1961
|
}) => {
|
|
1806
1962
|
const indexPath = dirPath + "/index.ts";
|
|
1807
|
-
const destPath =
|
|
1963
|
+
const destPath = path3.join(indexPath);
|
|
1808
1964
|
try {
|
|
1809
1965
|
await fs4.writeFile(destPath, "");
|
|
1810
1966
|
const filteredExports = [
|
|
1811
1967
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1812
|
-
addAgent ? `agents: { weatherAgent },` : ""
|
|
1968
|
+
addAgent ? `agents: { weatherAgent },` : "",
|
|
1969
|
+
addScorers ? `scorers: { toolCallAppropriatenessScorer, completenessScorer, translationScorer },` : ""
|
|
1813
1970
|
].filter(Boolean);
|
|
1814
1971
|
if (!addExample) {
|
|
1815
1972
|
await fs4.writeFile(
|
|
1816
1973
|
destPath,
|
|
1817
1974
|
`
|
|
1818
|
-
import { Mastra } from '@mastra/core';
|
|
1975
|
+
import { Mastra } from '@mastra/core/mastra';
|
|
1819
1976
|
|
|
1820
1977
|
export const mastra = new Mastra()
|
|
1821
1978
|
`
|
|
@@ -1828,19 +1985,26 @@ export const mastra = new Mastra()
|
|
|
1828
1985
|
import { Mastra } from '@mastra/core/mastra';
|
|
1829
1986
|
import { PinoLogger } from '@mastra/loggers';
|
|
1830
1987
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1988
|
+
import { Observability } from '@mastra/observability';
|
|
1831
1989
|
${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
|
|
1832
1990
|
${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
|
|
1991
|
+
${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
|
|
1833
1992
|
|
|
1834
1993
|
export const mastra = new Mastra({
|
|
1835
1994
|
${filteredExports.join("\n ")}
|
|
1836
1995
|
storage: new LibSQLStore({
|
|
1837
|
-
|
|
1996
|
+
id: "mastra-storage",
|
|
1997
|
+
// stores observability, scores, ... into memory storage, if it needs to persist, change to file:../mastra.db
|
|
1838
1998
|
url: ":memory:",
|
|
1839
1999
|
}),
|
|
1840
2000
|
logger: new PinoLogger({
|
|
1841
2001
|
name: 'Mastra',
|
|
1842
2002
|
level: 'info',
|
|
1843
2003
|
}),
|
|
2004
|
+
observability: new Observability({
|
|
2005
|
+
// Enables DefaultExporter and CloudExporter for tracing
|
|
2006
|
+
default: { enabled: true },
|
|
2007
|
+
}),
|
|
1844
2008
|
});
|
|
1845
2009
|
`
|
|
1846
2010
|
);
|
|
@@ -1848,7 +2012,6 @@ export const mastra = new Mastra({
|
|
|
1848
2012
|
throw err;
|
|
1849
2013
|
}
|
|
1850
2014
|
};
|
|
1851
|
-
yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
|
|
1852
2015
|
var getAPIKey = async (provider) => {
|
|
1853
2016
|
let key = "OPENAI_API_KEY";
|
|
1854
2017
|
switch (provider) {
|
|
@@ -1864,27 +2027,28 @@ var getAPIKey = async (provider) => {
|
|
|
1864
2027
|
case "cerebras":
|
|
1865
2028
|
key = "CEREBRAS_API_KEY";
|
|
1866
2029
|
return key;
|
|
2030
|
+
case "mistral":
|
|
2031
|
+
key = "MISTRAL_API_KEY";
|
|
2032
|
+
return key;
|
|
1867
2033
|
default:
|
|
1868
2034
|
return key;
|
|
1869
2035
|
}
|
|
1870
2036
|
};
|
|
1871
|
-
var writeAPIKey = async ({
|
|
1872
|
-
|
|
1873
|
-
apiKey = "your-api-key"
|
|
1874
|
-
}) => {
|
|
2037
|
+
var writeAPIKey = async ({ provider, apiKey }) => {
|
|
2038
|
+
const envFileName = apiKey ? ".env" : ".env.example";
|
|
1875
2039
|
const key = await getAPIKey(provider);
|
|
1876
|
-
const escapedKey =
|
|
1877
|
-
const escapedApiKey =
|
|
1878
|
-
await exec(`echo ${escapedKey}=${escapedApiKey} >>
|
|
2040
|
+
const escapedKey = shellQuote2.quote([key]);
|
|
2041
|
+
const escapedApiKey = shellQuote2.quote([apiKey ? apiKey : "your-api-key"]);
|
|
2042
|
+
await exec(`echo ${escapedKey}=${escapedApiKey} >> ${envFileName}`);
|
|
1879
2043
|
};
|
|
1880
2044
|
var createMastraDir = async (directory) => {
|
|
1881
2045
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
1882
|
-
const dirPath =
|
|
2046
|
+
const dirPath = path3.join(process.cwd(), ...dir, "mastra");
|
|
1883
2047
|
try {
|
|
1884
2048
|
await fs4.access(dirPath);
|
|
1885
2049
|
return { ok: false };
|
|
1886
2050
|
} catch {
|
|
1887
|
-
await
|
|
2051
|
+
await fsExtra.ensureDir(dirPath);
|
|
1888
2052
|
return { ok: true, dirPath };
|
|
1889
2053
|
}
|
|
1890
2054
|
};
|
|
@@ -1896,42 +2060,35 @@ var writeCodeSample = async (dirPath, component, llmProvider, importComponents)
|
|
|
1896
2060
|
throw err;
|
|
1897
2061
|
}
|
|
1898
2062
|
};
|
|
1899
|
-
var
|
|
1900
|
-
|
|
1901
|
-
|
|
2063
|
+
var LLM_PROVIDERS = [
|
|
2064
|
+
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
2065
|
+
{ value: "anthropic", label: "Anthropic" },
|
|
2066
|
+
{ value: "groq", label: "Groq" },
|
|
2067
|
+
{ value: "google", label: "Google" },
|
|
2068
|
+
{ value: "cerebras", label: "Cerebras" },
|
|
2069
|
+
{ value: "mistral", label: "Mistral" }
|
|
2070
|
+
];
|
|
2071
|
+
var interactivePrompt = async (args = {}) => {
|
|
2072
|
+
const { skip = {}, options: { showBanner = true } = {} } = args;
|
|
2073
|
+
if (showBanner) {
|
|
2074
|
+
Ie(color2.inverse(" Mastra Init "));
|
|
2075
|
+
}
|
|
2076
|
+
const mastraProject = await Ce(
|
|
1902
2077
|
{
|
|
1903
|
-
directory: () =>
|
|
2078
|
+
directory: () => he({
|
|
1904
2079
|
message: "Where should we create the Mastra files? (default: src/)",
|
|
1905
2080
|
placeholder: "src/",
|
|
1906
2081
|
defaultValue: "src/"
|
|
1907
2082
|
}),
|
|
1908
|
-
|
|
1909
|
-
message: "
|
|
1910
|
-
options:
|
|
1911
|
-
{ value: "agents", label: "Agents", hint: "recommended" },
|
|
1912
|
-
{
|
|
1913
|
-
value: "workflows",
|
|
1914
|
-
label: "Workflows"
|
|
1915
|
-
}
|
|
1916
|
-
]
|
|
1917
|
-
}),
|
|
1918
|
-
shouldAddTools: () => ce({
|
|
1919
|
-
message: "Add tools?",
|
|
1920
|
-
initialValue: false
|
|
1921
|
-
}),
|
|
1922
|
-
llmProvider: () => le({
|
|
1923
|
-
message: "Select default provider:",
|
|
1924
|
-
options: [
|
|
1925
|
-
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1926
|
-
{ value: "anthropic", label: "Anthropic" },
|
|
1927
|
-
{ value: "groq", label: "Groq" },
|
|
1928
|
-
{ value: "google", label: "Google" },
|
|
1929
|
-
{ value: "cerebras", label: "Cerebras" }
|
|
1930
|
-
]
|
|
2083
|
+
llmProvider: () => skip?.llmProvider ? void 0 : ve({
|
|
2084
|
+
message: "Select a default provider:",
|
|
2085
|
+
options: LLM_PROVIDERS
|
|
1931
2086
|
}),
|
|
1932
2087
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
1933
|
-
|
|
1934
|
-
|
|
2088
|
+
if (skip?.llmApiKey) return void 0;
|
|
2089
|
+
const llmName = LLM_PROVIDERS.find((p6) => p6.value === llmProvider)?.label || "provider";
|
|
2090
|
+
const keyChoice = await ve({
|
|
2091
|
+
message: `Enter your ${llmName} API key?`,
|
|
1935
2092
|
options: [
|
|
1936
2093
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1937
2094
|
{ value: "enter", label: "Enter API key" }
|
|
@@ -1939,79 +2096,65 @@ var interactivePrompt = async () => {
|
|
|
1939
2096
|
initialValue: "skip"
|
|
1940
2097
|
});
|
|
1941
2098
|
if (keyChoice === "enter") {
|
|
1942
|
-
return
|
|
2099
|
+
return he({
|
|
1943
2100
|
message: "Enter your API key:",
|
|
1944
|
-
placeholder: "sk-..."
|
|
2101
|
+
placeholder: "sk-...",
|
|
2102
|
+
validate: (value) => {
|
|
2103
|
+
if (value.length === 0) return "API key cannot be empty";
|
|
2104
|
+
}
|
|
1945
2105
|
});
|
|
1946
2106
|
}
|
|
1947
2107
|
return void 0;
|
|
1948
2108
|
},
|
|
1949
|
-
addExample: () => ce({
|
|
1950
|
-
message: "Add example",
|
|
1951
|
-
initialValue: false
|
|
1952
|
-
}),
|
|
1953
2109
|
configureEditorWithDocsMCP: async () => {
|
|
1954
|
-
const
|
|
1955
|
-
|
|
1956
|
-
const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
|
|
1957
|
-
const editor = await le({
|
|
1958
|
-
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
2110
|
+
const editor = await ve({
|
|
2111
|
+
message: `Make your IDE into a Mastra expert? (Installs Mastra's MCP server)`,
|
|
1959
2112
|
options: [
|
|
1960
2113
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1961
2114
|
{
|
|
1962
2115
|
value: "cursor",
|
|
1963
|
-
label: "Cursor (project only)"
|
|
1964
|
-
hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
|
|
2116
|
+
label: "Cursor (project only)"
|
|
1965
2117
|
},
|
|
1966
2118
|
{
|
|
1967
2119
|
value: "cursor-global",
|
|
1968
|
-
label: "Cursor (global, all projects)"
|
|
1969
|
-
hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
|
|
2120
|
+
label: "Cursor (global, all projects)"
|
|
1970
2121
|
},
|
|
1971
2122
|
{
|
|
1972
2123
|
value: "windsurf",
|
|
1973
|
-
label: "Windsurf"
|
|
1974
|
-
hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
|
|
2124
|
+
label: "Windsurf"
|
|
1975
2125
|
},
|
|
1976
2126
|
{
|
|
1977
2127
|
value: "vscode",
|
|
1978
|
-
label: "VSCode"
|
|
1979
|
-
|
|
2128
|
+
label: "VSCode"
|
|
2129
|
+
},
|
|
2130
|
+
{
|
|
2131
|
+
value: "antigravity",
|
|
2132
|
+
label: "Antigravity"
|
|
1980
2133
|
}
|
|
1981
2134
|
]
|
|
1982
2135
|
});
|
|
1983
2136
|
if (editor === `skip`) return void 0;
|
|
1984
|
-
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
1985
|
-
v.message(`
|
|
1986
|
-
Windsurf is already installed, skipping.`);
|
|
1987
|
-
return void 0;
|
|
1988
|
-
}
|
|
1989
|
-
if (editor === `vscode` && vscodeIsAlreadyInstalled) {
|
|
1990
|
-
v.message(`
|
|
1991
|
-
VSCode is already installed, skipping.`);
|
|
1992
|
-
return void 0;
|
|
1993
|
-
}
|
|
1994
2137
|
if (editor === `cursor`) {
|
|
1995
|
-
|
|
2138
|
+
M.message(
|
|
1996
2139
|
`
|
|
1997
2140
|
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1998
2141
|
`
|
|
1999
2142
|
);
|
|
2000
2143
|
}
|
|
2001
2144
|
if (editor === `cursor-global`) {
|
|
2002
|
-
const
|
|
2145
|
+
const confirm3 = await ve({
|
|
2003
2146
|
message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
|
|
2004
2147
|
options: [
|
|
2005
2148
|
{ value: "yes", label: "Yes, I understand" },
|
|
2006
2149
|
{ value: "skip", label: "No, skip for now" }
|
|
2007
2150
|
]
|
|
2008
2151
|
});
|
|
2009
|
-
if (
|
|
2152
|
+
if (confirm3 !== `yes`) {
|
|
2010
2153
|
return void 0;
|
|
2011
2154
|
}
|
|
2012
2155
|
}
|
|
2013
2156
|
if (editor === `windsurf`) {
|
|
2014
|
-
const
|
|
2157
|
+
const confirm3 = await ve({
|
|
2015
2158
|
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
2016
2159
|
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
2017
2160
|
options: [
|
|
@@ -2019,35 +2162,281 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
2019
2162
|
{ value: "skip", label: "No, skip for now" }
|
|
2020
2163
|
]
|
|
2021
2164
|
});
|
|
2022
|
-
if (
|
|
2165
|
+
if (confirm3 !== `yes`) {
|
|
2166
|
+
return void 0;
|
|
2167
|
+
}
|
|
2168
|
+
}
|
|
2169
|
+
if (editor === `antigravity`) {
|
|
2170
|
+
const confirm3 = await ve({
|
|
2171
|
+
message: `Antigravity only supports a global MCP config (at ${antigravityGlobalMCPConfigPath}). Is it ok to add/update that global config?
|
|
2172
|
+
This will make the Mastra docs MCP server available in all Antigravity projects.`,
|
|
2173
|
+
options: [
|
|
2174
|
+
{ value: "yes", label: "Yes, I understand" },
|
|
2175
|
+
{ value: "skip", label: "No, skip for now" }
|
|
2176
|
+
]
|
|
2177
|
+
});
|
|
2178
|
+
if (confirm3 !== `yes`) {
|
|
2023
2179
|
return void 0;
|
|
2024
2180
|
}
|
|
2025
2181
|
}
|
|
2026
2182
|
return editor;
|
|
2183
|
+
},
|
|
2184
|
+
initGit: async () => {
|
|
2185
|
+
if (skip?.gitInit) return false;
|
|
2186
|
+
return ye({
|
|
2187
|
+
message: "Initialize a new git repository?",
|
|
2188
|
+
initialValue: true
|
|
2189
|
+
});
|
|
2027
2190
|
}
|
|
2028
2191
|
},
|
|
2029
2192
|
{
|
|
2030
2193
|
onCancel: () => {
|
|
2031
|
-
|
|
2194
|
+
xe("Operation cancelled.");
|
|
2032
2195
|
process.exit(0);
|
|
2033
2196
|
}
|
|
2034
2197
|
}
|
|
2035
2198
|
);
|
|
2036
|
-
|
|
2037
|
-
const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
|
|
2038
|
-
return { ...rest, components: mastraComponents };
|
|
2199
|
+
return mastraProject;
|
|
2039
2200
|
};
|
|
2040
|
-
|
|
2201
|
+
function getPackageManager() {
|
|
2202
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
2203
|
+
const execPath = process.env.npm_execpath || "";
|
|
2204
|
+
if (userAgent.includes("bun")) {
|
|
2205
|
+
return "bun";
|
|
2206
|
+
}
|
|
2207
|
+
if (userAgent.includes("yarn")) {
|
|
2208
|
+
return "yarn";
|
|
2209
|
+
}
|
|
2210
|
+
if (userAgent.includes("pnpm")) {
|
|
2211
|
+
return "pnpm";
|
|
2212
|
+
}
|
|
2213
|
+
if (userAgent.includes("npm")) {
|
|
2214
|
+
return "npm";
|
|
2215
|
+
}
|
|
2216
|
+
if (execPath.includes("bun")) {
|
|
2217
|
+
return "bun";
|
|
2218
|
+
}
|
|
2219
|
+
if (execPath.includes("yarn")) {
|
|
2220
|
+
return "yarn";
|
|
2221
|
+
}
|
|
2222
|
+
if (execPath.includes("pnpm")) {
|
|
2223
|
+
return "pnpm";
|
|
2224
|
+
}
|
|
2225
|
+
if (execPath.includes("npm")) {
|
|
2226
|
+
return "npm";
|
|
2227
|
+
}
|
|
2228
|
+
return "npm";
|
|
2229
|
+
}
|
|
2230
|
+
async function gitInit({ cwd }) {
|
|
2231
|
+
await execa("git", ["init"], { cwd, stdio: "ignore" });
|
|
2232
|
+
await execa("git", ["add", "-A"], { cwd, stdio: "ignore" });
|
|
2233
|
+
await execa(
|
|
2234
|
+
"git",
|
|
2235
|
+
[
|
|
2236
|
+
"commit",
|
|
2237
|
+
"-m",
|
|
2238
|
+
'"Initial commit from Mastra"',
|
|
2239
|
+
'--author="dane-ai-mastra[bot] <dane-ai-mastra[bot]@users.noreply.github.com>"'
|
|
2240
|
+
],
|
|
2241
|
+
{ cwd, stdio: "ignore" }
|
|
2242
|
+
);
|
|
2243
|
+
}
|
|
2244
|
+
var logger = createLogger(false);
|
|
2245
|
+
function createLogger(debug = false) {
|
|
2246
|
+
return new PinoLogger({
|
|
2247
|
+
name: "Mastra CLI",
|
|
2248
|
+
level: debug ? "debug" : "info"
|
|
2249
|
+
});
|
|
2250
|
+
}
|
|
2041
2251
|
var exec2 = util.promisify(child_process.exec);
|
|
2252
|
+
async function cloneTemplate(options) {
|
|
2253
|
+
const { template, projectName, targetDir, branch, llmProvider } = options;
|
|
2254
|
+
const projectPath = targetDir ? path3.resolve(targetDir, projectName) : path3.resolve(projectName);
|
|
2255
|
+
const spinner4 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
|
|
2256
|
+
try {
|
|
2257
|
+
if (await directoryExists(projectPath)) {
|
|
2258
|
+
spinner4.error(`Directory ${projectName} already exists`);
|
|
2259
|
+
throw new Error(`Directory ${projectName} already exists`);
|
|
2260
|
+
}
|
|
2261
|
+
await cloneRepositoryWithoutGit(template.githubUrl, projectPath, branch);
|
|
2262
|
+
await updatePackageJson(projectPath, projectName);
|
|
2263
|
+
const envExamplePath = path3.join(projectPath, ".env.example");
|
|
2264
|
+
if (await fileExists(envExamplePath)) {
|
|
2265
|
+
const envPath = path3.join(projectPath, ".env");
|
|
2266
|
+
await fs4.copyFile(envExamplePath, envPath);
|
|
2267
|
+
if (llmProvider) {
|
|
2268
|
+
await updateEnvFile(envPath, llmProvider);
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
spinner4.success(`Template "${template.title}" cloned successfully to ${projectName}`);
|
|
2272
|
+
return projectPath;
|
|
2273
|
+
} catch (error) {
|
|
2274
|
+
spinner4.error(`Failed to clone template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2275
|
+
throw error;
|
|
2276
|
+
}
|
|
2277
|
+
}
|
|
2278
|
+
async function directoryExists(dirPath) {
|
|
2279
|
+
try {
|
|
2280
|
+
const stat = await fs4.stat(dirPath);
|
|
2281
|
+
return stat.isDirectory();
|
|
2282
|
+
} catch {
|
|
2283
|
+
return false;
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
async function fileExists(filePath) {
|
|
2287
|
+
try {
|
|
2288
|
+
const stat = await fs4.stat(filePath);
|
|
2289
|
+
return stat.isFile();
|
|
2290
|
+
} catch {
|
|
2291
|
+
return false;
|
|
2292
|
+
}
|
|
2293
|
+
}
|
|
2294
|
+
async function cloneRepositoryWithoutGit(repoUrl, targetPath, branch) {
|
|
2295
|
+
await fs4.mkdir(targetPath, { recursive: true });
|
|
2296
|
+
try {
|
|
2297
|
+
const degitRepo = repoUrl.replace("https://github.com/", "");
|
|
2298
|
+
const degitRepoWithBranch = branch ? `${degitRepo}#${branch}` : degitRepo;
|
|
2299
|
+
const degitCommand = shellQuote2.quote(["npx", "degit", degitRepoWithBranch, targetPath]);
|
|
2300
|
+
await exec2(degitCommand, {
|
|
2301
|
+
cwd: process.cwd()
|
|
2302
|
+
});
|
|
2303
|
+
} catch {
|
|
2304
|
+
try {
|
|
2305
|
+
const gitArgs = ["git", "clone"];
|
|
2306
|
+
if (branch) {
|
|
2307
|
+
gitArgs.push("--branch", branch);
|
|
2308
|
+
}
|
|
2309
|
+
gitArgs.push(repoUrl, targetPath);
|
|
2310
|
+
const gitCommand = shellQuote2.quote(gitArgs);
|
|
2311
|
+
await exec2(gitCommand, {
|
|
2312
|
+
cwd: process.cwd()
|
|
2313
|
+
});
|
|
2314
|
+
const gitDir = path3.join(targetPath, ".git");
|
|
2315
|
+
if (await directoryExists(gitDir)) {
|
|
2316
|
+
await fs4.rm(gitDir, { recursive: true, force: true });
|
|
2317
|
+
}
|
|
2318
|
+
} catch (gitError) {
|
|
2319
|
+
throw new Error(`Failed to clone repository: ${gitError instanceof Error ? gitError.message : "Unknown error"}`);
|
|
2320
|
+
}
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
async function updatePackageJson(projectPath, projectName) {
|
|
2324
|
+
const packageJsonPath = path3.join(projectPath, "package.json");
|
|
2325
|
+
try {
|
|
2326
|
+
const packageJsonContent = await fs4.readFile(packageJsonPath, "utf-8");
|
|
2327
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2328
|
+
packageJson.name = projectName;
|
|
2329
|
+
await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), "utf-8");
|
|
2330
|
+
} catch (error) {
|
|
2331
|
+
logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2332
|
+
}
|
|
2333
|
+
}
|
|
2334
|
+
async function updateEnvFile(envPath, llmProvider) {
|
|
2335
|
+
try {
|
|
2336
|
+
const envContent = await fs4.readFile(envPath, "utf-8");
|
|
2337
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
2338
|
+
if (!modelString) {
|
|
2339
|
+
logger.warn(`Could not get model identifier for provider: ${llmProvider}`);
|
|
2340
|
+
return;
|
|
2341
|
+
}
|
|
2342
|
+
const modelValue = modelString.replace(/'/g, "");
|
|
2343
|
+
const updatedContent = envContent.replace(/^MODEL=.*/m, `MODEL=${modelValue}`);
|
|
2344
|
+
await fs4.writeFile(envPath, updatedContent, "utf-8");
|
|
2345
|
+
logger.info(`Updated MODEL in .env to ${modelValue}`);
|
|
2346
|
+
} catch (error) {
|
|
2347
|
+
logger.warn(`Could not update .env file: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2348
|
+
}
|
|
2349
|
+
}
|
|
2350
|
+
async function installDependencies(projectPath, packageManager) {
|
|
2351
|
+
const spinner4 = yoctoSpinner({ text: "Installing dependencies..." }).start();
|
|
2352
|
+
try {
|
|
2353
|
+
const pm = packageManager || getPackageManager();
|
|
2354
|
+
const installCommand = shellQuote2.quote([pm, "install"]);
|
|
2355
|
+
await exec2(installCommand, {
|
|
2356
|
+
cwd: projectPath
|
|
2357
|
+
});
|
|
2358
|
+
spinner4.success("Dependencies installed successfully");
|
|
2359
|
+
} catch (error) {
|
|
2360
|
+
spinner4.error(`Failed to install dependencies: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2361
|
+
throw error;
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
var TEMPLATES_API_URL = process.env.MASTRA_TEMPLATES_API_URL || "https://mastra.ai/api/templates.json";
|
|
2365
|
+
async function loadTemplates() {
|
|
2366
|
+
try {
|
|
2367
|
+
const response = await fetch(TEMPLATES_API_URL);
|
|
2368
|
+
if (!response.ok) {
|
|
2369
|
+
throw new Error(`Failed to fetch templates: ${response.statusText}`);
|
|
2370
|
+
}
|
|
2371
|
+
const templates = await response.json();
|
|
2372
|
+
return templates;
|
|
2373
|
+
} catch (error) {
|
|
2374
|
+
console.error("Error loading templates:", error);
|
|
2375
|
+
throw new Error("Failed to load templates. Please check your internet connection and try again.");
|
|
2376
|
+
}
|
|
2377
|
+
}
|
|
2378
|
+
function pluralize(count, singular, plural) {
|
|
2379
|
+
return count === 1 ? singular : plural || `${singular}s`;
|
|
2380
|
+
}
|
|
2381
|
+
async function selectTemplate(templates) {
|
|
2382
|
+
const choices = templates.map((template) => {
|
|
2383
|
+
const parts = [];
|
|
2384
|
+
if (template.agents?.length) {
|
|
2385
|
+
parts.push(`${template.agents.length} ${pluralize(template.agents.length, "agent")}`);
|
|
2386
|
+
}
|
|
2387
|
+
if (template.tools?.length) {
|
|
2388
|
+
parts.push(`${template.tools.length} ${pluralize(template.tools.length, "tool")}`);
|
|
2389
|
+
}
|
|
2390
|
+
if (template.workflows?.length) {
|
|
2391
|
+
parts.push(`${template.workflows.length} ${pluralize(template.workflows.length, "workflow")}`);
|
|
2392
|
+
}
|
|
2393
|
+
if (template.mcp?.length) {
|
|
2394
|
+
parts.push(`${template.mcp.length} ${pluralize(template.mcp.length, "MCP server")}`);
|
|
2395
|
+
}
|
|
2396
|
+
if (template.networks?.length) {
|
|
2397
|
+
parts.push(`${template.networks.length} ${pluralize(template.networks.length, "agent network")}`);
|
|
2398
|
+
}
|
|
2399
|
+
return {
|
|
2400
|
+
value: template,
|
|
2401
|
+
label: template.title,
|
|
2402
|
+
hint: parts.join(", ") || "Template components"
|
|
2403
|
+
};
|
|
2404
|
+
});
|
|
2405
|
+
const selected = await ve({
|
|
2406
|
+
message: "Select a template:",
|
|
2407
|
+
options: choices
|
|
2408
|
+
});
|
|
2409
|
+
if (pD(selected)) {
|
|
2410
|
+
return null;
|
|
2411
|
+
}
|
|
2412
|
+
return selected;
|
|
2413
|
+
}
|
|
2414
|
+
function findTemplateByName(templates, templateName) {
|
|
2415
|
+
let template = templates.find((t) => t.slug === templateName);
|
|
2416
|
+
if (template) return template;
|
|
2417
|
+
const slugWithPrefix = `template-${templateName}`;
|
|
2418
|
+
template = templates.find((t) => t.slug === slugWithPrefix);
|
|
2419
|
+
if (template) return template;
|
|
2420
|
+
template = templates.find((t) => t.title.toLowerCase() === templateName.toLowerCase());
|
|
2421
|
+
if (template) return template;
|
|
2422
|
+
return null;
|
|
2423
|
+
}
|
|
2424
|
+
function getDefaultProjectName(template) {
|
|
2425
|
+
return template.slug.replace(/^template-/, "");
|
|
2426
|
+
}
|
|
2427
|
+
var s = Y();
|
|
2042
2428
|
var init = async ({
|
|
2043
|
-
directory,
|
|
2044
|
-
addExample = false,
|
|
2429
|
+
directory = "src/",
|
|
2045
2430
|
components,
|
|
2046
2431
|
llmProvider = "openai",
|
|
2047
2432
|
llmApiKey,
|
|
2048
|
-
|
|
2433
|
+
addExample = false,
|
|
2434
|
+
configureEditorWithDocsMCP,
|
|
2435
|
+
versionTag,
|
|
2436
|
+
initGit = false
|
|
2049
2437
|
}) => {
|
|
2050
2438
|
s.start("Initializing Mastra");
|
|
2439
|
+
const packageVersionTag = versionTag ? `@${versionTag}` : "";
|
|
2051
2440
|
try {
|
|
2052
2441
|
const result = await createMastraDir(directory);
|
|
2053
2442
|
if (!result.ok) {
|
|
@@ -2060,7 +2449,8 @@ var init = async ({
|
|
|
2060
2449
|
dirPath,
|
|
2061
2450
|
addExample,
|
|
2062
2451
|
addWorkflow: components.includes("workflows"),
|
|
2063
|
-
addAgent: components.includes("agents")
|
|
2452
|
+
addAgent: components.includes("agents"),
|
|
2453
|
+
addScorers: components.includes("scorers")
|
|
2064
2454
|
}),
|
|
2065
2455
|
...components.map((component) => createComponentsDir(dirPath, component)),
|
|
2066
2456
|
writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
|
|
@@ -2074,39 +2464,53 @@ var init = async ({
|
|
|
2074
2464
|
const depService = new DepsService();
|
|
2075
2465
|
const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
|
|
2076
2466
|
if (needsLibsql) {
|
|
2077
|
-
await depService.installPackages([
|
|
2467
|
+
await depService.installPackages([`@mastra/libsql${packageVersionTag}`]);
|
|
2078
2468
|
}
|
|
2079
2469
|
const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
|
|
2080
2470
|
if (needsMemory) {
|
|
2081
|
-
await depService.installPackages([
|
|
2471
|
+
await depService.installPackages([`@mastra/memory${packageVersionTag}`]);
|
|
2082
2472
|
}
|
|
2083
2473
|
const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
|
|
2084
2474
|
if (needsLoggers) {
|
|
2085
|
-
await depService.installPackages([
|
|
2475
|
+
await depService.installPackages([`@mastra/loggers${packageVersionTag}`]);
|
|
2476
|
+
}
|
|
2477
|
+
const needsObservability = await depService.checkDependencies(["@mastra/observability"]) !== `ok`;
|
|
2478
|
+
if (needsObservability) {
|
|
2479
|
+
await depService.installPackages([`@mastra/observability${packageVersionTag}`]);
|
|
2480
|
+
}
|
|
2481
|
+
const needsEvals = components.includes(`scorers`) && await depService.checkDependencies(["@mastra/evals"]) !== `ok`;
|
|
2482
|
+
if (needsEvals) {
|
|
2483
|
+
await depService.installPackages([`@mastra/evals${packageVersionTag}`]);
|
|
2086
2484
|
}
|
|
2087
2485
|
}
|
|
2088
2486
|
const key = await getAPIKey(llmProvider || "openai");
|
|
2089
|
-
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
2090
|
-
const depsService = new DepsService();
|
|
2091
|
-
const pm = depsService.packageManager;
|
|
2092
|
-
const installCommand = getPackageManagerInstallCommand(pm);
|
|
2093
|
-
await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
|
|
2094
2487
|
if (configureEditorWithDocsMCP) {
|
|
2095
2488
|
await installMastraDocsMCPServer({
|
|
2096
2489
|
editor: configureEditorWithDocsMCP,
|
|
2097
|
-
directory: process.cwd()
|
|
2490
|
+
directory: process.cwd(),
|
|
2491
|
+
versionTag
|
|
2098
2492
|
});
|
|
2099
2493
|
}
|
|
2100
2494
|
s.stop();
|
|
2495
|
+
if (initGit) {
|
|
2496
|
+
const s2 = Y();
|
|
2497
|
+
try {
|
|
2498
|
+
s2.start("Initializing git repository");
|
|
2499
|
+
await gitInit({ cwd: process.cwd() });
|
|
2500
|
+
s2.stop("Git repository initialized");
|
|
2501
|
+
} catch {
|
|
2502
|
+
s2.stop();
|
|
2503
|
+
}
|
|
2504
|
+
}
|
|
2101
2505
|
if (!llmApiKey) {
|
|
2102
|
-
|
|
2506
|
+
Me(`
|
|
2103
2507
|
${color2.green("Mastra initialized successfully!")}
|
|
2104
2508
|
|
|
2105
2509
|
Add your ${color2.cyan(key)} as an environment variable
|
|
2106
2510
|
in your ${color2.cyan(".env")} file
|
|
2107
2511
|
`);
|
|
2108
2512
|
} else {
|
|
2109
|
-
|
|
2513
|
+
Me(`
|
|
2110
2514
|
${color2.green("Mastra initialized successfully!")}
|
|
2111
2515
|
`);
|
|
2112
2516
|
}
|
|
@@ -2140,71 +2544,128 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
2140
2544
|
throw error;
|
|
2141
2545
|
}
|
|
2142
2546
|
} catch (error) {
|
|
2143
|
-
console.error(error);
|
|
2144
2547
|
throw error;
|
|
2145
2548
|
}
|
|
2146
2549
|
};
|
|
2550
|
+
async function getInitCommand(pm) {
|
|
2551
|
+
switch (pm) {
|
|
2552
|
+
case "npm":
|
|
2553
|
+
return "npm init -y";
|
|
2554
|
+
case "pnpm":
|
|
2555
|
+
return "pnpm init";
|
|
2556
|
+
case "yarn":
|
|
2557
|
+
return "yarn init -y";
|
|
2558
|
+
case "bun":
|
|
2559
|
+
return "bun init -y";
|
|
2560
|
+
default:
|
|
2561
|
+
return "npm init -y";
|
|
2562
|
+
}
|
|
2563
|
+
}
|
|
2564
|
+
async function initializePackageJson(pm) {
|
|
2565
|
+
const initCommand = await getInitCommand(pm);
|
|
2566
|
+
await exec3(initCommand);
|
|
2567
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
2568
|
+
const packageJson = JSON.parse(await fs4.readFile(packageJsonPath, "utf-8"));
|
|
2569
|
+
packageJson.type = "module";
|
|
2570
|
+
packageJson.engines = {
|
|
2571
|
+
...packageJson.engines,
|
|
2572
|
+
node: ">=22.13.0"
|
|
2573
|
+
};
|
|
2574
|
+
await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
2575
|
+
}
|
|
2147
2576
|
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
2148
|
-
let installCommand =
|
|
2577
|
+
let installCommand = getPackageManagerAddCommand(pm);
|
|
2149
2578
|
if (isDev) {
|
|
2150
|
-
installCommand = `${installCommand}
|
|
2579
|
+
installCommand = `${installCommand} -D`;
|
|
2151
2580
|
}
|
|
2152
2581
|
try {
|
|
2153
2582
|
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
2154
2583
|
} catch (err) {
|
|
2155
|
-
console.log("err", err);
|
|
2156
2584
|
if (versionTag === "@latest") {
|
|
2157
|
-
throw
|
|
2585
|
+
throw new Error(
|
|
2586
|
+
`Failed to install ${dependency}@latest: ${err instanceof Error ? err.message : "Unknown error"}`
|
|
2587
|
+
);
|
|
2588
|
+
}
|
|
2589
|
+
try {
|
|
2590
|
+
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
2591
|
+
} catch (fallbackErr) {
|
|
2592
|
+
throw new Error(
|
|
2593
|
+
`Failed to install ${dependency} (tried ${versionTag} and @latest): ${fallbackErr instanceof Error ? fallbackErr.message : "Unknown error"}`
|
|
2594
|
+
);
|
|
2158
2595
|
}
|
|
2159
|
-
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
2160
2596
|
}
|
|
2161
2597
|
}
|
|
2162
2598
|
var createMastraProject = async ({
|
|
2163
2599
|
projectName: name,
|
|
2164
2600
|
createVersionTag,
|
|
2165
|
-
timeout
|
|
2601
|
+
timeout,
|
|
2602
|
+
llmProvider,
|
|
2603
|
+
llmApiKey,
|
|
2604
|
+
needsInteractive
|
|
2166
2605
|
}) => {
|
|
2167
|
-
|
|
2168
|
-
const projectName = name ?? await
|
|
2606
|
+
Ie(color2.inverse(" Mastra Create "));
|
|
2607
|
+
const projectName = name ?? await he({
|
|
2169
2608
|
message: "What do you want to name your project?",
|
|
2170
2609
|
placeholder: "my-mastra-app",
|
|
2171
|
-
defaultValue: "my-mastra-app"
|
|
2610
|
+
defaultValue: "my-mastra-app",
|
|
2611
|
+
validate: (value) => {
|
|
2612
|
+
if (value.length === 0) return "Project name cannot be empty";
|
|
2613
|
+
if (fs3__default__default.existsSync(value)) {
|
|
2614
|
+
return `A directory named "${value}" already exists. Please choose a different name.`;
|
|
2615
|
+
}
|
|
2616
|
+
}
|
|
2172
2617
|
});
|
|
2173
|
-
if (
|
|
2174
|
-
|
|
2618
|
+
if (pD(projectName)) {
|
|
2619
|
+
xe("Operation cancelled");
|
|
2175
2620
|
process.exit(0);
|
|
2176
2621
|
}
|
|
2177
|
-
|
|
2178
|
-
|
|
2622
|
+
let result = void 0;
|
|
2623
|
+
if (needsInteractive) {
|
|
2624
|
+
result = await interactivePrompt({
|
|
2625
|
+
options: { showBanner: false },
|
|
2626
|
+
skip: { llmProvider: llmProvider !== void 0, llmApiKey: llmApiKey !== void 0 }
|
|
2627
|
+
});
|
|
2628
|
+
}
|
|
2629
|
+
const s2 = Y();
|
|
2630
|
+
const originalCwd = process.cwd();
|
|
2631
|
+
let projectPath = null;
|
|
2179
2632
|
try {
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2633
|
+
s2.start("Creating project");
|
|
2634
|
+
try {
|
|
2635
|
+
await fs4.mkdir(projectName);
|
|
2636
|
+
projectPath = path3.resolve(originalCwd, projectName);
|
|
2637
|
+
} catch (error) {
|
|
2638
|
+
if (error instanceof Error && "code" in error && error.code === "EEXIST") {
|
|
2639
|
+
s2.stop(`A directory named "${projectName}" already exists. Please choose a different name.`);
|
|
2640
|
+
process.exit(1);
|
|
2641
|
+
}
|
|
2642
|
+
throw new Error(
|
|
2643
|
+
`Failed to create project directory: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2185
2644
|
);
|
|
2186
|
-
process.exit(1);
|
|
2187
2645
|
}
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2646
|
+
process.chdir(projectName);
|
|
2647
|
+
const pm = getPackageManager();
|
|
2648
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
2649
|
+
s2.message("Initializing project structure");
|
|
2650
|
+
try {
|
|
2651
|
+
await initializePackageJson(pm);
|
|
2652
|
+
const depsService = new DepsService();
|
|
2653
|
+
await depsService.addScriptsToPackageJson({
|
|
2654
|
+
dev: "mastra dev",
|
|
2655
|
+
build: "mastra build",
|
|
2656
|
+
start: "mastra start"
|
|
2657
|
+
});
|
|
2658
|
+
} catch (error) {
|
|
2659
|
+
throw new Error(
|
|
2660
|
+
`Failed to initialize project structure: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2661
|
+
);
|
|
2662
|
+
}
|
|
2663
|
+
s2.stop("Project structure created");
|
|
2664
|
+
s2.start(`Installing ${pm} dependencies`);
|
|
2665
|
+
try {
|
|
2666
|
+
await exec3(`${pm} ${installCommand} zod@^4`);
|
|
2667
|
+
await exec3(`${pm} ${installCommand} -D typescript @types/node`);
|
|
2668
|
+
await exec3(`echo '{
|
|
2208
2669
|
"compilerOptions": {
|
|
2209
2670
|
"target": "ES2022",
|
|
2210
2671
|
"module": "ES2022",
|
|
@@ -2220,78 +2681,338 @@ var createMastraProject = async ({
|
|
|
2220
2681
|
"src/**/*"
|
|
2221
2682
|
]
|
|
2222
2683
|
}' > tsconfig.json`);
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2684
|
+
} catch (error) {
|
|
2685
|
+
throw new Error(
|
|
2686
|
+
`Failed to install basic dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2687
|
+
);
|
|
2688
|
+
}
|
|
2689
|
+
s2.stop(`${pm} dependencies installed`);
|
|
2690
|
+
s2.start("Installing Mastra CLI");
|
|
2691
|
+
const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
|
|
2692
|
+
try {
|
|
2693
|
+
await installMastraDependency(pm, "mastra", versionTag, true, timeout);
|
|
2694
|
+
} catch (error) {
|
|
2695
|
+
throw new Error(`Failed to install Mastra CLI: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2696
|
+
}
|
|
2697
|
+
s2.stop("Mastra CLI installed");
|
|
2698
|
+
s2.start("Installing Mastra dependencies");
|
|
2699
|
+
try {
|
|
2700
|
+
await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
|
|
2701
|
+
await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
|
|
2702
|
+
await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
|
|
2703
|
+
} catch (error) {
|
|
2704
|
+
throw new Error(
|
|
2705
|
+
`Failed to install Mastra dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2706
|
+
);
|
|
2707
|
+
}
|
|
2708
|
+
s2.stop("Mastra dependencies installed");
|
|
2709
|
+
s2.start("Adding .gitignore");
|
|
2710
|
+
try {
|
|
2711
|
+
await exec3(`echo output.txt >> .gitignore`);
|
|
2712
|
+
await exec3(`echo node_modules >> .gitignore`);
|
|
2713
|
+
await exec3(`echo dist >> .gitignore`);
|
|
2714
|
+
await exec3(`echo .mastra >> .gitignore`);
|
|
2715
|
+
await exec3(`echo .env.development >> .gitignore`);
|
|
2716
|
+
await exec3(`echo .env >> .gitignore`);
|
|
2717
|
+
await exec3(`echo *.db >> .gitignore`);
|
|
2718
|
+
await exec3(`echo *.db-* >> .gitignore`);
|
|
2719
|
+
} catch (error) {
|
|
2720
|
+
throw new Error(`Failed to create .gitignore: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2721
|
+
}
|
|
2722
|
+
s2.stop(".gitignore added");
|
|
2723
|
+
Se("Project created successfully");
|
|
2724
|
+
console.info("");
|
|
2725
|
+
return { projectName, result };
|
|
2726
|
+
} catch (error) {
|
|
2727
|
+
s2.stop();
|
|
2728
|
+
const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred";
|
|
2729
|
+
xe(`Project creation failed: ${errorMessage}`);
|
|
2730
|
+
if (projectPath && fs3__default__default.existsSync(projectPath)) {
|
|
2731
|
+
try {
|
|
2732
|
+
process.chdir(originalCwd);
|
|
2733
|
+
await fs4.rm(projectPath, { recursive: true, force: true });
|
|
2734
|
+
} catch (cleanupError) {
|
|
2735
|
+
console.error(
|
|
2736
|
+
`Warning: Failed to clean up project directory: ${cleanupError instanceof Error ? cleanupError.message : "Unknown error"}`
|
|
2737
|
+
);
|
|
2738
|
+
}
|
|
2739
|
+
}
|
|
2740
|
+
process.exit(1);
|
|
2741
|
+
}
|
|
2246
2742
|
};
|
|
2247
|
-
var
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2743
|
+
var version$1 = package_default.version;
|
|
2744
|
+
var create = async (args) => {
|
|
2745
|
+
if (args.template !== void 0) {
|
|
2746
|
+
await createFromTemplate({
|
|
2747
|
+
projectName: args.projectName,
|
|
2748
|
+
template: args.template,
|
|
2749
|
+
timeout: args.timeout,
|
|
2750
|
+
injectedAnalytics: args.analytics,
|
|
2751
|
+
llmProvider: args.llmProvider
|
|
2752
|
+
});
|
|
2753
|
+
return;
|
|
2754
|
+
}
|
|
2755
|
+
const needsInteractive = args.components === void 0 || args.llmProvider === void 0 || args.addExample === void 0;
|
|
2756
|
+
const { projectName, result } = await createMastraProject({
|
|
2757
|
+
projectName: args?.projectName,
|
|
2758
|
+
createVersionTag: args?.createVersionTag,
|
|
2759
|
+
timeout: args?.timeout,
|
|
2760
|
+
llmProvider: args?.llmProvider,
|
|
2761
|
+
llmApiKey: args?.llmApiKey,
|
|
2762
|
+
needsInteractive
|
|
2252
2763
|
});
|
|
2253
|
-
const directory =
|
|
2254
|
-
if (
|
|
2255
|
-
const result = await interactivePrompt();
|
|
2764
|
+
const directory = args.directory || "src/";
|
|
2765
|
+
if (needsInteractive && result) {
|
|
2256
2766
|
await init({
|
|
2257
2767
|
...result,
|
|
2258
|
-
llmApiKey: result?.llmApiKey
|
|
2768
|
+
llmApiKey: result?.llmApiKey,
|
|
2769
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
2770
|
+
addExample: true,
|
|
2771
|
+
versionTag: args.createVersionTag
|
|
2259
2772
|
});
|
|
2260
2773
|
postCreate({ projectName });
|
|
2261
2774
|
return;
|
|
2262
2775
|
}
|
|
2263
|
-
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } =
|
|
2776
|
+
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
|
|
2264
2777
|
await init({
|
|
2265
2778
|
directory,
|
|
2266
2779
|
components,
|
|
2267
2780
|
llmProvider,
|
|
2268
2781
|
addExample,
|
|
2269
2782
|
llmApiKey,
|
|
2270
|
-
configureEditorWithDocsMCP:
|
|
2783
|
+
configureEditorWithDocsMCP: args.mcpServer,
|
|
2784
|
+
versionTag: args.createVersionTag
|
|
2271
2785
|
});
|
|
2272
2786
|
postCreate({ projectName });
|
|
2273
2787
|
};
|
|
2274
2788
|
var postCreate = ({ projectName }) => {
|
|
2275
2789
|
const packageManager = getPackageManager();
|
|
2276
|
-
|
|
2790
|
+
Se(`
|
|
2277
2791
|
${color2.green("To start your project:")}
|
|
2278
2792
|
|
|
2279
2793
|
${color2.cyan("cd")} ${projectName}
|
|
2280
2794
|
${color2.cyan(`${packageManager} run dev`)}
|
|
2281
2795
|
`);
|
|
2282
2796
|
};
|
|
2797
|
+
function isGitHubUrl(url) {
|
|
2798
|
+
try {
|
|
2799
|
+
const parsedUrl = new URL(url);
|
|
2800
|
+
return parsedUrl.hostname === "github.com" && parsedUrl.pathname.split("/").length >= 3;
|
|
2801
|
+
} catch {
|
|
2802
|
+
return false;
|
|
2803
|
+
}
|
|
2804
|
+
}
|
|
2805
|
+
async function validateGitHubProject(githubUrl) {
|
|
2806
|
+
const errors = [];
|
|
2807
|
+
try {
|
|
2808
|
+
const urlParts = new URL(githubUrl).pathname.split("/").filter(Boolean);
|
|
2809
|
+
const owner = urlParts[0];
|
|
2810
|
+
const repo = urlParts[1]?.replace(".git", "");
|
|
2811
|
+
if (!owner || !repo) {
|
|
2812
|
+
throw new Error("Invalid GitHub URL format");
|
|
2813
|
+
}
|
|
2814
|
+
const branches = ["main", "master"];
|
|
2815
|
+
let packageJsonContent = null;
|
|
2816
|
+
let indexContent = null;
|
|
2817
|
+
for (const branch of branches) {
|
|
2818
|
+
try {
|
|
2819
|
+
const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/package.json`;
|
|
2820
|
+
const packageJsonResponse = await fetch(packageJsonUrl);
|
|
2821
|
+
if (packageJsonResponse.ok) {
|
|
2822
|
+
packageJsonContent = await packageJsonResponse.text();
|
|
2823
|
+
const indexUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/src/mastra/index.ts`;
|
|
2824
|
+
const indexResponse = await fetch(indexUrl);
|
|
2825
|
+
if (indexResponse.ok) {
|
|
2826
|
+
indexContent = await indexResponse.text();
|
|
2827
|
+
}
|
|
2828
|
+
break;
|
|
2829
|
+
}
|
|
2830
|
+
} catch {
|
|
2831
|
+
}
|
|
2832
|
+
}
|
|
2833
|
+
if (!packageJsonContent) {
|
|
2834
|
+
errors.push("Could not fetch package.json from repository");
|
|
2835
|
+
return { isValid: false, errors };
|
|
2836
|
+
}
|
|
2837
|
+
try {
|
|
2838
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2839
|
+
const hasMastraCore = packageJson.dependencies?.["@mastra/core"] || packageJson.devDependencies?.["@mastra/core"] || packageJson.peerDependencies?.["@mastra/core"];
|
|
2840
|
+
if (!hasMastraCore) {
|
|
2841
|
+
errors.push("Missing @mastra/core dependency in package.json");
|
|
2842
|
+
}
|
|
2843
|
+
} catch {
|
|
2844
|
+
errors.push("Invalid package.json format");
|
|
2845
|
+
}
|
|
2846
|
+
if (!indexContent) {
|
|
2847
|
+
errors.push("Missing src/mastra/index.ts file");
|
|
2848
|
+
} else {
|
|
2849
|
+
const hasMastraExport = indexContent.includes("export") && (indexContent.includes("new Mastra") || indexContent.includes("Mastra("));
|
|
2850
|
+
if (!hasMastraExport) {
|
|
2851
|
+
errors.push("src/mastra/index.ts does not export a Mastra instance");
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
return { isValid: errors.length === 0, errors };
|
|
2855
|
+
} catch (error) {
|
|
2856
|
+
errors.push(`Failed to validate GitHub repository: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2857
|
+
return { isValid: false, errors };
|
|
2858
|
+
}
|
|
2859
|
+
}
|
|
2860
|
+
async function createFromGitHubUrl(url) {
|
|
2861
|
+
const urlParts = new URL(url).pathname.split("/").filter(Boolean);
|
|
2862
|
+
const owner = urlParts[0] || "unknown";
|
|
2863
|
+
const repo = urlParts[1] || "unknown";
|
|
2864
|
+
return {
|
|
2865
|
+
githubUrl: url,
|
|
2866
|
+
title: `${owner}/${repo}`,
|
|
2867
|
+
slug: repo,
|
|
2868
|
+
agents: [],
|
|
2869
|
+
mcp: [],
|
|
2870
|
+
tools: [],
|
|
2871
|
+
networks: [],
|
|
2872
|
+
workflows: []
|
|
2873
|
+
};
|
|
2874
|
+
}
|
|
2875
|
+
async function createFromTemplate(args) {
|
|
2876
|
+
let selectedTemplate;
|
|
2877
|
+
if (args.template === true) {
|
|
2878
|
+
const templates = await loadTemplates();
|
|
2879
|
+
const selected = await selectTemplate(templates);
|
|
2880
|
+
if (!selected) {
|
|
2881
|
+
M.info("No template selected. Exiting.");
|
|
2882
|
+
return;
|
|
2883
|
+
}
|
|
2884
|
+
selectedTemplate = selected;
|
|
2885
|
+
} else if (args.template && typeof args.template === "string") {
|
|
2886
|
+
if (isGitHubUrl(args.template)) {
|
|
2887
|
+
const spinner4 = Y();
|
|
2888
|
+
spinner4.start("Validating GitHub repository...");
|
|
2889
|
+
const validation = await validateGitHubProject(args.template);
|
|
2890
|
+
if (!validation.isValid) {
|
|
2891
|
+
spinner4.stop("Validation failed");
|
|
2892
|
+
M.error("This does not appear to be a valid Mastra project:");
|
|
2893
|
+
validation.errors.forEach((error) => M.error(` - ${error}`));
|
|
2894
|
+
throw new Error("Invalid Mastra project");
|
|
2895
|
+
}
|
|
2896
|
+
spinner4.stop("Valid Mastra project \u2713");
|
|
2897
|
+
selectedTemplate = await createFromGitHubUrl(args.template);
|
|
2898
|
+
} else {
|
|
2899
|
+
const templates = await loadTemplates();
|
|
2900
|
+
const found = findTemplateByName(templates, args.template);
|
|
2901
|
+
if (!found) {
|
|
2902
|
+
M.error(`Template "${args.template}" not found. Available templates:`);
|
|
2903
|
+
templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
|
|
2904
|
+
throw new Error(`Template "${args.template}" not found`);
|
|
2905
|
+
}
|
|
2906
|
+
selectedTemplate = found;
|
|
2907
|
+
}
|
|
2908
|
+
}
|
|
2909
|
+
if (!selectedTemplate) {
|
|
2910
|
+
throw new Error("No template selected");
|
|
2911
|
+
}
|
|
2912
|
+
let projectName = args.projectName;
|
|
2913
|
+
if (!projectName) {
|
|
2914
|
+
const defaultName = getDefaultProjectName(selectedTemplate);
|
|
2915
|
+
const response = await he({
|
|
2916
|
+
message: "What is your project name?",
|
|
2917
|
+
defaultValue: defaultName,
|
|
2918
|
+
placeholder: defaultName
|
|
2919
|
+
});
|
|
2920
|
+
if (pD(response)) {
|
|
2921
|
+
M.info("Project creation cancelled.");
|
|
2922
|
+
return;
|
|
2923
|
+
}
|
|
2924
|
+
projectName = response;
|
|
2925
|
+
}
|
|
2926
|
+
let llmProvider = args.llmProvider;
|
|
2927
|
+
if (!llmProvider) {
|
|
2928
|
+
const providerResponse = await ve({
|
|
2929
|
+
message: "Select a default provider:",
|
|
2930
|
+
options: LLM_PROVIDERS
|
|
2931
|
+
});
|
|
2932
|
+
if (pD(providerResponse)) {
|
|
2933
|
+
M.info("Project creation cancelled.");
|
|
2934
|
+
return;
|
|
2935
|
+
}
|
|
2936
|
+
llmProvider = providerResponse;
|
|
2937
|
+
}
|
|
2938
|
+
let initGit = false;
|
|
2939
|
+
const gitConfirmResult = await ye({
|
|
2940
|
+
message: "Initialize a new git repository?",
|
|
2941
|
+
initialValue: true
|
|
2942
|
+
});
|
|
2943
|
+
if (!pD(gitConfirmResult)) {
|
|
2944
|
+
initGit = gitConfirmResult;
|
|
2945
|
+
}
|
|
2946
|
+
let projectPath = null;
|
|
2947
|
+
try {
|
|
2948
|
+
const analytics = args.injectedAnalytics || getAnalytics();
|
|
2949
|
+
if (analytics) {
|
|
2950
|
+
analytics.trackEvent("cli_template_used", {
|
|
2951
|
+
template_slug: selectedTemplate.slug,
|
|
2952
|
+
template_title: selectedTemplate.title
|
|
2953
|
+
});
|
|
2954
|
+
if (llmProvider) {
|
|
2955
|
+
analytics.trackEvent("cli_model_provider_selected", {
|
|
2956
|
+
provider: llmProvider,
|
|
2957
|
+
selection_method: args.llmProvider ? "cli_args" : "interactive"
|
|
2958
|
+
});
|
|
2959
|
+
}
|
|
2960
|
+
}
|
|
2961
|
+
const isBeta = version$1?.includes("beta") ?? false;
|
|
2962
|
+
const isMastraTemplate = selectedTemplate.githubUrl.includes("github.com/mastra-ai/");
|
|
2963
|
+
const branch = isBeta && isMastraTemplate ? "beta" : void 0;
|
|
2964
|
+
projectPath = await cloneTemplate({
|
|
2965
|
+
template: selectedTemplate,
|
|
2966
|
+
projectName,
|
|
2967
|
+
branch,
|
|
2968
|
+
llmProvider
|
|
2969
|
+
});
|
|
2970
|
+
await installDependencies(projectPath);
|
|
2971
|
+
if (initGit) {
|
|
2972
|
+
const s2 = Y();
|
|
2973
|
+
try {
|
|
2974
|
+
s2.start("Initializing git repository");
|
|
2975
|
+
await gitInit({ cwd: projectPath });
|
|
2976
|
+
s2.stop("Git repository initialized");
|
|
2977
|
+
} catch {
|
|
2978
|
+
s2.stop();
|
|
2979
|
+
}
|
|
2980
|
+
}
|
|
2981
|
+
Me(`
|
|
2982
|
+
${color2.green("Mastra template installed!")}
|
|
2983
|
+
|
|
2984
|
+
Add the necessary environment
|
|
2985
|
+
variables in your ${color2.cyan(".env")} file
|
|
2986
|
+
`);
|
|
2987
|
+
postCreate({ projectName });
|
|
2988
|
+
} catch (error) {
|
|
2989
|
+
if (projectPath) {
|
|
2990
|
+
try {
|
|
2991
|
+
if (fs3__default__default.existsSync(projectPath)) {
|
|
2992
|
+
await fs4.rm(projectPath, { recursive: true, force: true });
|
|
2993
|
+
}
|
|
2994
|
+
} catch (cleanupError) {
|
|
2995
|
+
console.error(
|
|
2996
|
+
`Warning: Failed to clean up project directory: ${cleanupError instanceof Error ? cleanupError.message : "Unknown error"}`
|
|
2997
|
+
);
|
|
2998
|
+
}
|
|
2999
|
+
}
|
|
3000
|
+
M.error(`Failed to create project from template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
3001
|
+
throw error;
|
|
3002
|
+
}
|
|
3003
|
+
}
|
|
2283
3004
|
|
|
2284
3005
|
async function getPackageVersion() {
|
|
2285
3006
|
const __filename = fileURLToPath(import.meta.url);
|
|
2286
3007
|
const __dirname = dirname(__filename);
|
|
2287
|
-
const pkgJsonPath =
|
|
2288
|
-
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
3008
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
3009
|
+
const content = await fsExtra$1.readJSON(pkgJsonPath);
|
|
2289
3010
|
return content.version;
|
|
2290
3011
|
}
|
|
2291
3012
|
async function getCreateVersionTag() {
|
|
2292
3013
|
try {
|
|
2293
3014
|
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
2294
|
-
const json = await fsExtra.readJSON(pkgPath);
|
|
3015
|
+
const json = await fsExtra$1.readJSON(pkgPath);
|
|
2295
3016
|
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
2296
3017
|
const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
|
|
2297
3018
|
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
@@ -2315,24 +3036,30 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
2315
3036
|
analytics.trackCommand({
|
|
2316
3037
|
command: "version"
|
|
2317
3038
|
});
|
|
2318
|
-
console.
|
|
3039
|
+
console.info(`create-mastra ${version}`);
|
|
2319
3040
|
} catch {
|
|
2320
3041
|
}
|
|
2321
3042
|
});
|
|
2322
3043
|
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
2323
3044
|
"-p, --project-name <string>",
|
|
2324
3045
|
"Project name that will be used in package.json and as the project directory name."
|
|
2325
|
-
).option("--default", "Quick start with defaults(src, OpenAI,
|
|
3046
|
+
).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, antigravity)").option(
|
|
3047
|
+
"--template [template-name]",
|
|
3048
|
+
"Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
|
|
3049
|
+
).action(async (projectNameArg, args) => {
|
|
2326
3050
|
const projectName = projectNameArg || args.projectName;
|
|
2327
3051
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
2328
3052
|
if (args.default) {
|
|
2329
3053
|
await create({
|
|
2330
|
-
components: ["agents", "tools", "workflows"],
|
|
3054
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
2331
3055
|
llmProvider: "openai",
|
|
2332
3056
|
addExample: true,
|
|
2333
3057
|
createVersionTag,
|
|
2334
3058
|
timeout,
|
|
2335
|
-
mcpServer: args.mcp
|
|
3059
|
+
mcpServer: args.mcp,
|
|
3060
|
+
directory: "src/",
|
|
3061
|
+
template: args.template,
|
|
3062
|
+
analytics
|
|
2336
3063
|
});
|
|
2337
3064
|
return;
|
|
2338
3065
|
}
|
|
@@ -2340,12 +3067,14 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2340
3067
|
components: args.components ? args.components.split(",") : [],
|
|
2341
3068
|
llmProvider: args.llm,
|
|
2342
3069
|
addExample: args.example,
|
|
2343
|
-
llmApiKey: args
|
|
3070
|
+
llmApiKey: args.llmApiKey,
|
|
2344
3071
|
createVersionTag,
|
|
2345
3072
|
timeout,
|
|
2346
3073
|
projectName,
|
|
2347
3074
|
directory: args.dir,
|
|
2348
|
-
mcpServer: args.mcp
|
|
3075
|
+
mcpServer: args.mcp,
|
|
3076
|
+
template: args.template,
|
|
3077
|
+
analytics
|
|
2349
3078
|
});
|
|
2350
3079
|
});
|
|
2351
3080
|
program.parse(process.argv);
|