create-mastra 0.0.0-trigger-playground-ui-package-20250506151043 → 0.0.0-type-testing-20260120105120
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 +2355 -0
- package/LICENSE.md +11 -42
- package/README.md +11 -40
- package/dist/index.js +1781 -669
- package/dist/index.js.map +1 -1
- package/dist/starter-files/tools.ts +2 -2
- package/dist/templates/dev.entry.js +9 -47
- 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,26 +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 {
|
|
20
|
+
import { execa } from 'execa';
|
|
21
|
+
import fsExtra$1 from 'fs-extra';
|
|
21
22
|
import pino from 'pino';
|
|
22
23
|
import pretty from 'pino-pretty';
|
|
23
|
-
import fsExtra from 'fs-extra';
|
|
24
24
|
|
|
25
25
|
var __filename = fileURLToPath(import.meta.url);
|
|
26
|
-
var __dirname =
|
|
26
|
+
var __dirname = path3.dirname(__filename);
|
|
27
|
+
var analyticsInstance = null;
|
|
28
|
+
function getAnalytics() {
|
|
29
|
+
return analyticsInstance;
|
|
30
|
+
}
|
|
27
31
|
var PosthogAnalytics = class {
|
|
28
32
|
sessionId;
|
|
29
33
|
client;
|
|
@@ -35,7 +39,7 @@ var PosthogAnalytics = class {
|
|
|
35
39
|
host = "https://app.posthog.com"
|
|
36
40
|
}) {
|
|
37
41
|
this.version = version;
|
|
38
|
-
const cliConfigPath =
|
|
42
|
+
const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
|
|
39
43
|
if (existsSync(cliConfigPath)) {
|
|
40
44
|
try {
|
|
41
45
|
const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
|
|
@@ -63,7 +67,7 @@ var PosthogAnalytics = class {
|
|
|
63
67
|
}
|
|
64
68
|
writeCliConfig({ distinctId, sessionId }) {
|
|
65
69
|
try {
|
|
66
|
-
writeFileSync(
|
|
70
|
+
writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
67
71
|
} catch {
|
|
68
72
|
}
|
|
69
73
|
}
|
|
@@ -101,6 +105,10 @@ var PosthogAnalytics = class {
|
|
|
101
105
|
machine_id: os.hostname()
|
|
102
106
|
};
|
|
103
107
|
}
|
|
108
|
+
getDurationMs(startTime) {
|
|
109
|
+
const [seconds, nanoseconds] = process.hrtime(startTime);
|
|
110
|
+
return seconds * 1e3 + nanoseconds / 1e6;
|
|
111
|
+
}
|
|
104
112
|
captureSessionStart() {
|
|
105
113
|
if (!this.client) {
|
|
106
114
|
return;
|
|
@@ -113,6 +121,22 @@ var PosthogAnalytics = class {
|
|
|
113
121
|
}
|
|
114
122
|
});
|
|
115
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
|
+
}
|
|
116
140
|
trackCommand(options) {
|
|
117
141
|
try {
|
|
118
142
|
if (!this.client) {
|
|
@@ -153,8 +177,7 @@ var PosthogAnalytics = class {
|
|
|
153
177
|
const startTime = process.hrtime();
|
|
154
178
|
try {
|
|
155
179
|
const result = await execution();
|
|
156
|
-
const
|
|
157
|
-
const durationMs = seconds * 1e3 + nanoseconds / 1e6;
|
|
180
|
+
const durationMs = this.getDurationMs(startTime);
|
|
158
181
|
this.trackCommand({
|
|
159
182
|
command,
|
|
160
183
|
args,
|
|
@@ -164,8 +187,7 @@ var PosthogAnalytics = class {
|
|
|
164
187
|
});
|
|
165
188
|
return result;
|
|
166
189
|
} catch (error) {
|
|
167
|
-
const
|
|
168
|
-
const durationMs = seconds * 1e3 + nanoseconds / 1e6;
|
|
190
|
+
const durationMs = this.getDurationMs(startTime);
|
|
169
191
|
this.trackCommand({
|
|
170
192
|
command,
|
|
171
193
|
args,
|
|
@@ -349,72 +371,340 @@ function requirePicocolors () {
|
|
|
349
371
|
var picocolorsExports = /*@__PURE__*/ requirePicocolors();
|
|
350
372
|
var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
|
|
351
373
|
|
|
352
|
-
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(`
|
|
353
|
-
`)];for(const[E,
|
|
354
|
-
`?(
|
|
355
|
-
`&&(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,`
|
|
356
378
|
`).split(`
|
|
357
|
-
`).map(
|
|
358
|
-
`)}
|
|
359
|
-
`),
|
|
360
|
-
`),s=[];for(let
|
|
361
|
-
`),
|
|
362
|
-
`).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=
|
|
363
|
-
`);this.output.write(s[
|
|
364
|
-
`).slice(
|
|
365
|
-
`)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}class
|
|
366
|
-
|
|
367
|
-
function
|
|
368
|
-
${
|
|
369
|
-
`,t
|
|
370
|
-
${color2.yellow(
|
|
371
|
-
${color2.yellow(
|
|
372
|
-
`;case "submit":return `${n}${color2.gray(
|
|
373
|
-
|
|
374
|
-
${color2.cyan(
|
|
375
|
-
`}}}).prompt(),
|
|
376
|
-
${
|
|
377
|
-
`,
|
|
378
|
-
${color2.gray(
|
|
379
|
-
${color2.cyan(
|
|
380
|
-
`}}}).prompt()},
|
|
381
|
-
${
|
|
382
|
-
`;switch(this.state){case "submit":return `${
|
|
383
|
-
${color2.gray(
|
|
384
|
-
${color2.cyan(
|
|
385
|
-
${color2.cyan(
|
|
386
|
-
`}}}).prompt()}
|
|
387
|
-
${
|
|
388
|
-
${y(this.state)} ${s.message}
|
|
389
|
-
`;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}
|
|
390
|
-
${color2.gray(a)}`:""}`}case "error":{const r=this.error.split(`
|
|
391
|
-
`).map((o,c)=>c===0?`${color2.yellow($)} ${color2.yellow(o)}`:` ${o}`).join(`
|
|
392
|
-
`);return t+color2.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
393
|
-
${color2.yellow(a)} `)+`
|
|
394
|
-
`+r+`
|
|
395
|
-
`}default:return `${t}${color2.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
396
|
-
${color2.cyan(a)} `)}
|
|
397
|
-
${color2.cyan($)}
|
|
398
|
-
`}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
|
|
399
|
-
${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}
|
|
400
410
|
`.split(`
|
|
401
|
-
`),i=
|
|
402
|
-
`);process.stdout.write(`${color2.gray(
|
|
403
|
-
${color2.green(
|
|
404
|
-
${
|
|
405
|
-
${color2.gray(
|
|
406
|
-
`);},
|
|
407
|
-
|
|
408
|
-
`);},
|
|
409
|
-
`);},
|
|
410
|
-
${color2.gray(
|
|
411
|
-
|
|
412
|
-
`);},
|
|
413
|
-
`);
|
|
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(`
|
|
414
424
|
`)}
|
|
415
|
-
`);},info:
|
|
416
|
-
`);
|
|
417
|
-
`),
|
|
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};
|
|
431
|
+
|
|
432
|
+
var shellQuote = {};
|
|
433
|
+
|
|
434
|
+
var quote;
|
|
435
|
+
var hasRequiredQuote;
|
|
436
|
+
|
|
437
|
+
function requireQuote () {
|
|
438
|
+
if (hasRequiredQuote) return quote;
|
|
439
|
+
hasRequiredQuote = 1;
|
|
440
|
+
|
|
441
|
+
quote = function quote(xs) {
|
|
442
|
+
return xs.map(function (s) {
|
|
443
|
+
if (s === '') {
|
|
444
|
+
return '\'\'';
|
|
445
|
+
}
|
|
446
|
+
if (s && typeof s === 'object') {
|
|
447
|
+
return s.op.replace(/(.)/g, '\\$1');
|
|
448
|
+
}
|
|
449
|
+
if ((/["\s\\]/).test(s) && !(/'/).test(s)) {
|
|
450
|
+
return "'" + s.replace(/(['])/g, '\\$1') + "'";
|
|
451
|
+
}
|
|
452
|
+
if ((/["'\s]/).test(s)) {
|
|
453
|
+
return '"' + s.replace(/(["\\$`!])/g, '\\$1') + '"';
|
|
454
|
+
}
|
|
455
|
+
return String(s).replace(/([A-Za-z]:)?([#!"$&'()*,:;<=>?@[\\\]^`{|}])/g, '$1\\$2');
|
|
456
|
+
}).join(' ');
|
|
457
|
+
};
|
|
458
|
+
return quote;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
var parse;
|
|
462
|
+
var hasRequiredParse;
|
|
463
|
+
|
|
464
|
+
function requireParse () {
|
|
465
|
+
if (hasRequiredParse) return parse;
|
|
466
|
+
hasRequiredParse = 1;
|
|
467
|
+
|
|
468
|
+
// '<(' is process substitution operator and
|
|
469
|
+
// can be parsed the same as control operator
|
|
470
|
+
var CONTROL = '(?:' + [
|
|
471
|
+
'\\|\\|',
|
|
472
|
+
'\\&\\&',
|
|
473
|
+
';;',
|
|
474
|
+
'\\|\\&',
|
|
475
|
+
'\\<\\(',
|
|
476
|
+
'\\<\\<\\<',
|
|
477
|
+
'>>',
|
|
478
|
+
'>\\&',
|
|
479
|
+
'<\\&',
|
|
480
|
+
'[&;()|<>]'
|
|
481
|
+
].join('|') + ')';
|
|
482
|
+
var controlRE = new RegExp('^' + CONTROL + '$');
|
|
483
|
+
var META = '|&;()<> \\t';
|
|
484
|
+
var SINGLE_QUOTE = '"((\\\\"|[^"])*?)"';
|
|
485
|
+
var DOUBLE_QUOTE = '\'((\\\\\'|[^\'])*?)\'';
|
|
486
|
+
var hash = /^#$/;
|
|
487
|
+
|
|
488
|
+
var SQ = "'";
|
|
489
|
+
var DQ = '"';
|
|
490
|
+
var DS = '$';
|
|
491
|
+
|
|
492
|
+
var TOKEN = '';
|
|
493
|
+
var mult = 0x100000000; // Math.pow(16, 8);
|
|
494
|
+
for (var i = 0; i < 4; i++) {
|
|
495
|
+
TOKEN += (mult * Math.random()).toString(16);
|
|
496
|
+
}
|
|
497
|
+
var startsWithToken = new RegExp('^' + TOKEN);
|
|
498
|
+
|
|
499
|
+
function matchAll(s, r) {
|
|
500
|
+
var origIndex = r.lastIndex;
|
|
501
|
+
|
|
502
|
+
var matches = [];
|
|
503
|
+
var matchObj;
|
|
504
|
+
|
|
505
|
+
while ((matchObj = r.exec(s))) {
|
|
506
|
+
matches.push(matchObj);
|
|
507
|
+
if (r.lastIndex === matchObj.index) {
|
|
508
|
+
r.lastIndex += 1;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
r.lastIndex = origIndex;
|
|
513
|
+
|
|
514
|
+
return matches;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
function getVar(env, pre, key) {
|
|
518
|
+
var r = typeof env === 'function' ? env(key) : env[key];
|
|
519
|
+
if (typeof r === 'undefined' && key != '') {
|
|
520
|
+
r = '';
|
|
521
|
+
} else if (typeof r === 'undefined') {
|
|
522
|
+
r = '$';
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
if (typeof r === 'object') {
|
|
526
|
+
return pre + TOKEN + JSON.stringify(r) + TOKEN;
|
|
527
|
+
}
|
|
528
|
+
return pre + r;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
function parseInternal(string, env, opts) {
|
|
532
|
+
if (!opts) {
|
|
533
|
+
opts = {};
|
|
534
|
+
}
|
|
535
|
+
var BS = opts.escape || '\\';
|
|
536
|
+
var BAREWORD = '(\\' + BS + '[\'"' + META + ']|[^\\s\'"' + META + '])+';
|
|
537
|
+
|
|
538
|
+
var chunker = new RegExp([
|
|
539
|
+
'(' + CONTROL + ')', // control chars
|
|
540
|
+
'(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')+'
|
|
541
|
+
].join('|'), 'g');
|
|
542
|
+
|
|
543
|
+
var matches = matchAll(string, chunker);
|
|
544
|
+
|
|
545
|
+
if (matches.length === 0) {
|
|
546
|
+
return [];
|
|
547
|
+
}
|
|
548
|
+
if (!env) {
|
|
549
|
+
env = {};
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
var commented = false;
|
|
553
|
+
|
|
554
|
+
return matches.map(function (match) {
|
|
555
|
+
var s = match[0];
|
|
556
|
+
if (!s || commented) {
|
|
557
|
+
return void undefined;
|
|
558
|
+
}
|
|
559
|
+
if (controlRE.test(s)) {
|
|
560
|
+
return { op: s };
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// Hand-written scanner/parser for Bash quoting rules:
|
|
564
|
+
//
|
|
565
|
+
// 1. inside single quotes, all characters are printed literally.
|
|
566
|
+
// 2. inside double quotes, all characters are printed literally
|
|
567
|
+
// except variables prefixed by '$' and backslashes followed by
|
|
568
|
+
// either a double quote or another backslash.
|
|
569
|
+
// 3. outside of any quotes, backslashes are treated as escape
|
|
570
|
+
// characters and not printed (unless they are themselves escaped)
|
|
571
|
+
// 4. quote context can switch mid-token if there is no whitespace
|
|
572
|
+
// between the two quote contexts (e.g. all'one'"token" parses as
|
|
573
|
+
// "allonetoken")
|
|
574
|
+
var quote = false;
|
|
575
|
+
var esc = false;
|
|
576
|
+
var out = '';
|
|
577
|
+
var isGlob = false;
|
|
578
|
+
var i;
|
|
579
|
+
|
|
580
|
+
function parseEnvVar() {
|
|
581
|
+
i += 1;
|
|
582
|
+
var varend;
|
|
583
|
+
var varname;
|
|
584
|
+
var char = s.charAt(i);
|
|
585
|
+
|
|
586
|
+
if (char === '{') {
|
|
587
|
+
i += 1;
|
|
588
|
+
if (s.charAt(i) === '}') {
|
|
589
|
+
throw new Error('Bad substitution: ' + s.slice(i - 2, i + 1));
|
|
590
|
+
}
|
|
591
|
+
varend = s.indexOf('}', i);
|
|
592
|
+
if (varend < 0) {
|
|
593
|
+
throw new Error('Bad substitution: ' + s.slice(i));
|
|
594
|
+
}
|
|
595
|
+
varname = s.slice(i, varend);
|
|
596
|
+
i = varend;
|
|
597
|
+
} else if ((/[*@#?$!_-]/).test(char)) {
|
|
598
|
+
varname = char;
|
|
599
|
+
i += 1;
|
|
600
|
+
} else {
|
|
601
|
+
var slicedFromI = s.slice(i);
|
|
602
|
+
varend = slicedFromI.match(/[^\w\d_]/);
|
|
603
|
+
if (!varend) {
|
|
604
|
+
varname = slicedFromI;
|
|
605
|
+
i = s.length;
|
|
606
|
+
} else {
|
|
607
|
+
varname = slicedFromI.slice(0, varend.index);
|
|
608
|
+
i += varend.index - 1;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
return getVar(env, '', varname);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
for (i = 0; i < s.length; i++) {
|
|
615
|
+
var c = s.charAt(i);
|
|
616
|
+
isGlob = isGlob || (!quote && (c === '*' || c === '?'));
|
|
617
|
+
if (esc) {
|
|
618
|
+
out += c;
|
|
619
|
+
esc = false;
|
|
620
|
+
} else if (quote) {
|
|
621
|
+
if (c === quote) {
|
|
622
|
+
quote = false;
|
|
623
|
+
} else if (quote == SQ) {
|
|
624
|
+
out += c;
|
|
625
|
+
} else { // Double quote
|
|
626
|
+
if (c === BS) {
|
|
627
|
+
i += 1;
|
|
628
|
+
c = s.charAt(i);
|
|
629
|
+
if (c === DQ || c === BS || c === DS) {
|
|
630
|
+
out += c;
|
|
631
|
+
} else {
|
|
632
|
+
out += BS + c;
|
|
633
|
+
}
|
|
634
|
+
} else if (c === DS) {
|
|
635
|
+
out += parseEnvVar();
|
|
636
|
+
} else {
|
|
637
|
+
out += c;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
} else if (c === DQ || c === SQ) {
|
|
641
|
+
quote = c;
|
|
642
|
+
} else if (controlRE.test(c)) {
|
|
643
|
+
return { op: s };
|
|
644
|
+
} else if (hash.test(c)) {
|
|
645
|
+
commented = true;
|
|
646
|
+
var commentObj = { comment: string.slice(match.index + i + 1) };
|
|
647
|
+
if (out.length) {
|
|
648
|
+
return [out, commentObj];
|
|
649
|
+
}
|
|
650
|
+
return [commentObj];
|
|
651
|
+
} else if (c === BS) {
|
|
652
|
+
esc = true;
|
|
653
|
+
} else if (c === DS) {
|
|
654
|
+
out += parseEnvVar();
|
|
655
|
+
} else {
|
|
656
|
+
out += c;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
if (isGlob) {
|
|
661
|
+
return { op: 'glob', pattern: out };
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
return out;
|
|
665
|
+
}).reduce(function (prev, arg) { // finalize parsed arguments
|
|
666
|
+
// TODO: replace this whole reduce with a concat
|
|
667
|
+
return typeof arg === 'undefined' ? prev : prev.concat(arg);
|
|
668
|
+
}, []);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
parse = function parse(s, env, opts) {
|
|
672
|
+
var mapped = parseInternal(s, env, opts);
|
|
673
|
+
if (typeof env !== 'function') {
|
|
674
|
+
return mapped;
|
|
675
|
+
}
|
|
676
|
+
return mapped.reduce(function (acc, s) {
|
|
677
|
+
if (typeof s === 'object') {
|
|
678
|
+
return acc.concat(s);
|
|
679
|
+
}
|
|
680
|
+
var xs = s.split(RegExp('(' + TOKEN + '.*?' + TOKEN + ')', 'g'));
|
|
681
|
+
if (xs.length === 1) {
|
|
682
|
+
return acc.concat(xs[0]);
|
|
683
|
+
}
|
|
684
|
+
return acc.concat(xs.filter(Boolean).map(function (x) {
|
|
685
|
+
if (startsWithToken.test(x)) {
|
|
686
|
+
return JSON.parse(x.split(TOKEN)[1]);
|
|
687
|
+
}
|
|
688
|
+
return x;
|
|
689
|
+
}));
|
|
690
|
+
}, []);
|
|
691
|
+
};
|
|
692
|
+
return parse;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
var hasRequiredShellQuote;
|
|
696
|
+
|
|
697
|
+
function requireShellQuote () {
|
|
698
|
+
if (hasRequiredShellQuote) return shellQuote;
|
|
699
|
+
hasRequiredShellQuote = 1;
|
|
700
|
+
|
|
701
|
+
shellQuote.quote = requireQuote();
|
|
702
|
+
shellQuote.parse = requireParse();
|
|
703
|
+
return shellQuote;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
var shellQuoteExports = requireShellQuote();
|
|
707
|
+
var shellQuote2 = /*@__PURE__*/getDefaultExportFromCjs(shellQuoteExports);
|
|
418
708
|
|
|
419
709
|
// eslint-disable-next-line no-warning-comments
|
|
420
710
|
// TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
|
|
@@ -441,13 +731,18 @@ const format = (open, close) => {
|
|
|
441
731
|
// Handle nested colors.
|
|
442
732
|
|
|
443
733
|
// We could have done this, but it's too slow (as of Node.js 22).
|
|
444
|
-
// return openCode + string.replaceAll(closeCode, openCode) + closeCode;
|
|
734
|
+
// return openCode + string.replaceAll(closeCode, (close === 22 ? closeCode : '') + openCode) + closeCode;
|
|
445
735
|
|
|
446
736
|
let result = openCode;
|
|
447
737
|
let lastIndex = 0;
|
|
448
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
|
+
|
|
449
744
|
while (index !== -1) {
|
|
450
|
-
result += string.slice(lastIndex, index) +
|
|
745
|
+
result += string.slice(lastIndex, index) + replaceCode;
|
|
451
746
|
lastIndex = index + closeCode.length;
|
|
452
747
|
index = string.indexOf(closeCode, lastIndex);
|
|
453
748
|
}
|
|
@@ -549,18 +844,20 @@ var yoctocolors = /*#__PURE__*/Object.freeze({
|
|
|
549
844
|
yellowBright: yellowBright
|
|
550
845
|
});
|
|
551
846
|
|
|
552
|
-
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';
|
|
553
850
|
|
|
554
851
|
const isInteractive = stream => Boolean(
|
|
555
852
|
stream.isTTY
|
|
556
|
-
&&
|
|
557
|
-
&& !('CI' in
|
|
853
|
+
&& y$1.env.TERM !== 'dumb'
|
|
854
|
+
&& !('CI' in y$1.env),
|
|
558
855
|
);
|
|
559
856
|
|
|
560
857
|
const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
|
|
561
858
|
const successSymbol = green(isUnicodeSupported ? '✔' : '√');
|
|
562
859
|
const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
|
|
563
|
-
const errorSymbol = red(isUnicodeSupported ? '
|
|
860
|
+
const errorSymbol = red(isUnicodeSupported ? '✖' : '×');
|
|
564
861
|
|
|
565
862
|
const defaultSpinner = {
|
|
566
863
|
frames: isUnicodeSupported
|
|
@@ -597,13 +894,14 @@ class YoctoSpinner {
|
|
|
597
894
|
#exitHandlerBound;
|
|
598
895
|
#isInteractive;
|
|
599
896
|
#lastSpinnerFrameTime = 0;
|
|
897
|
+
#isSpinning = false;
|
|
600
898
|
|
|
601
899
|
constructor(options = {}) {
|
|
602
900
|
const spinner = options.spinner ?? defaultSpinner;
|
|
603
901
|
this.#frames = spinner.frames;
|
|
604
902
|
this.#interval = spinner.interval;
|
|
605
903
|
this.#text = options.text ?? '';
|
|
606
|
-
this.#stream = options.stream ??
|
|
904
|
+
this.#stream = options.stream ?? y$1.stderr;
|
|
607
905
|
this.#color = options.color ?? 'cyan';
|
|
608
906
|
this.#isInteractive = isInteractive(this.#stream);
|
|
609
907
|
this.#exitHandlerBound = this.#exitHandler.bind(this);
|
|
@@ -618,13 +916,17 @@ class YoctoSpinner {
|
|
|
618
916
|
return this;
|
|
619
917
|
}
|
|
620
918
|
|
|
919
|
+
this.#isSpinning = true;
|
|
621
920
|
this.#hideCursor();
|
|
622
921
|
this.#render();
|
|
623
922
|
this.#subscribeToProcessEvents();
|
|
624
923
|
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
924
|
+
// Only start the timer in interactive mode
|
|
925
|
+
if (this.#isInteractive) {
|
|
926
|
+
this.#timer = setInterval(() => {
|
|
927
|
+
this.#render();
|
|
928
|
+
}, this.#interval);
|
|
929
|
+
}
|
|
628
930
|
|
|
629
931
|
return this;
|
|
630
932
|
}
|
|
@@ -634,8 +936,12 @@ class YoctoSpinner {
|
|
|
634
936
|
return this;
|
|
635
937
|
}
|
|
636
938
|
|
|
637
|
-
|
|
638
|
-
this.#timer
|
|
939
|
+
this.#isSpinning = false;
|
|
940
|
+
if (this.#timer) {
|
|
941
|
+
clearInterval(this.#timer);
|
|
942
|
+
this.#timer = undefined;
|
|
943
|
+
}
|
|
944
|
+
|
|
639
945
|
this.#showCursor();
|
|
640
946
|
this.clear();
|
|
641
947
|
this.#unsubscribeFromProcessEvents();
|
|
@@ -668,15 +974,15 @@ class YoctoSpinner {
|
|
|
668
974
|
}
|
|
669
975
|
|
|
670
976
|
get isSpinning() {
|
|
671
|
-
return this.#
|
|
977
|
+
return this.#isSpinning;
|
|
672
978
|
}
|
|
673
979
|
|
|
674
980
|
get text() {
|
|
675
981
|
return this.#text;
|
|
676
982
|
}
|
|
677
983
|
|
|
678
|
-
set text(value
|
|
679
|
-
this.#text = value;
|
|
984
|
+
set text(value) {
|
|
985
|
+
this.#text = value ?? '';
|
|
680
986
|
this.#render();
|
|
681
987
|
}
|
|
682
988
|
|
|
@@ -740,7 +1046,7 @@ class YoctoSpinner {
|
|
|
740
1046
|
|
|
741
1047
|
#lineCount(text) {
|
|
742
1048
|
const width = this.#stream.columns ?? 80;
|
|
743
|
-
const lines = text.split('\n');
|
|
1049
|
+
const lines = stripVTControlCharacters(text).split('\n');
|
|
744
1050
|
|
|
745
1051
|
let lineCount = 0;
|
|
746
1052
|
for (const line of lines) {
|
|
@@ -763,13 +1069,13 @@ class YoctoSpinner {
|
|
|
763
1069
|
}
|
|
764
1070
|
|
|
765
1071
|
#subscribeToProcessEvents() {
|
|
766
|
-
|
|
767
|
-
|
|
1072
|
+
y$1.once('SIGINT', this.#exitHandlerBound);
|
|
1073
|
+
y$1.once('SIGTERM', this.#exitHandlerBound);
|
|
768
1074
|
}
|
|
769
1075
|
|
|
770
1076
|
#unsubscribeFromProcessEvents() {
|
|
771
|
-
|
|
772
|
-
|
|
1077
|
+
y$1.off('SIGINT', this.#exitHandlerBound);
|
|
1078
|
+
y$1.off('SIGTERM', this.#exitHandlerBound);
|
|
773
1079
|
}
|
|
774
1080
|
|
|
775
1081
|
#exitHandler(signal) {
|
|
@@ -780,7 +1086,7 @@ class YoctoSpinner {
|
|
|
780
1086
|
// SIGINT: 128 + 2
|
|
781
1087
|
// SIGTERM: 128 + 15
|
|
782
1088
|
const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
|
|
783
|
-
|
|
1089
|
+
y$1.exit(exitCode);
|
|
784
1090
|
}
|
|
785
1091
|
}
|
|
786
1092
|
|
|
@@ -789,51 +1095,129 @@ function yoctoSpinner(options) {
|
|
|
789
1095
|
}
|
|
790
1096
|
|
|
791
1097
|
var LogLevel = {
|
|
792
|
-
INFO: "info"
|
|
793
|
-
|
|
794
|
-
|
|
1098
|
+
INFO: "info",
|
|
1099
|
+
ERROR: "error"};
|
|
1100
|
+
var MastraLogger = class {
|
|
1101
|
+
name;
|
|
1102
|
+
level;
|
|
795
1103
|
transports;
|
|
796
1104
|
constructor(options = {}) {
|
|
797
|
-
this.
|
|
798
|
-
|
|
799
|
-
this.
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
1105
|
+
this.name = options.name || "Mastra";
|
|
1106
|
+
this.level = options.level || LogLevel.ERROR;
|
|
1107
|
+
this.transports = new Map(Object.entries(options.transports || {}));
|
|
1108
|
+
}
|
|
1109
|
+
getTransports() {
|
|
1110
|
+
return this.transports;
|
|
1111
|
+
}
|
|
1112
|
+
trackException(_error) {
|
|
1113
|
+
}
|
|
1114
|
+
async listLogs(transportId, params) {
|
|
1115
|
+
if (!transportId || !this.transports.has(transportId)) {
|
|
1116
|
+
return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
|
|
1117
|
+
}
|
|
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
|
+
};
|
|
1125
|
+
}
|
|
1126
|
+
async listLogsByRunId({
|
|
1127
|
+
transportId,
|
|
1128
|
+
runId,
|
|
1129
|
+
fromDate,
|
|
1130
|
+
toDate,
|
|
1131
|
+
logLevel,
|
|
1132
|
+
filters,
|
|
1133
|
+
page,
|
|
1134
|
+
perPage
|
|
1135
|
+
}) {
|
|
1136
|
+
if (!transportId || !this.transports.has(transportId) || !runId) {
|
|
1137
|
+
return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
|
|
1138
|
+
}
|
|
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
|
+
};
|
|
1146
|
+
}
|
|
1147
|
+
};
|
|
1148
|
+
|
|
1149
|
+
var PinoLogger = class _PinoLogger extends MastraLogger {
|
|
1150
|
+
logger;
|
|
1151
|
+
constructor(options = {}) {
|
|
1152
|
+
super(options);
|
|
1153
|
+
const internalOptions = options;
|
|
1154
|
+
if (internalOptions._logger) {
|
|
1155
|
+
this.logger = internalOptions._logger;
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1158
|
+
let prettyStream = void 0;
|
|
1159
|
+
if (!options.overrideDefaultTransports) {
|
|
1160
|
+
prettyStream = pretty({
|
|
812
1161
|
colorize: true,
|
|
813
1162
|
levelFirst: true,
|
|
814
1163
|
ignore: "pid,hostname",
|
|
815
1164
|
colorizeObjects: true,
|
|
816
1165
|
translateTime: "SYS:standard",
|
|
817
1166
|
singleLine: false
|
|
818
|
-
})
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
const transportsAry = [...this.getTransports().entries()];
|
|
1170
|
+
this.logger = pino(
|
|
1171
|
+
{
|
|
1172
|
+
name: options.name || "app",
|
|
1173
|
+
level: options.level || LogLevel.INFO,
|
|
1174
|
+
formatters: options.formatters,
|
|
1175
|
+
redact: options.redact
|
|
1176
|
+
},
|
|
1177
|
+
options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
|
|
819
1178
|
...transportsAry.map(([, transport]) => ({
|
|
820
1179
|
stream: transport,
|
|
821
1180
|
level: options.level || LogLevel.INFO
|
|
822
1181
|
})),
|
|
823
1182
|
{
|
|
824
|
-
stream:
|
|
825
|
-
colorize: true,
|
|
826
|
-
levelFirst: true,
|
|
827
|
-
ignore: "pid,hostname",
|
|
828
|
-
colorizeObjects: true,
|
|
829
|
-
translateTime: "SYS:standard",
|
|
830
|
-
singleLine: false
|
|
831
|
-
}),
|
|
1183
|
+
stream: prettyStream,
|
|
832
1184
|
level: options.level || LogLevel.INFO
|
|
833
1185
|
}
|
|
834
1186
|
])
|
|
835
1187
|
);
|
|
836
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
|
+
}
|
|
837
1221
|
debug(message, args = {}) {
|
|
838
1222
|
this.logger.debug(args, message);
|
|
839
1223
|
}
|
|
@@ -846,45 +1230,37 @@ var Logger = class {
|
|
|
846
1230
|
error(message, args = {}) {
|
|
847
1231
|
this.logger.error(args, message);
|
|
848
1232
|
}
|
|
849
|
-
// Stream creation for process output handling
|
|
850
|
-
createStream() {
|
|
851
|
-
return new Transform({
|
|
852
|
-
transform: (chunk, _encoding, callback) => {
|
|
853
|
-
const line = chunk.toString().trim();
|
|
854
|
-
if (line) {
|
|
855
|
-
this.info(line);
|
|
856
|
-
}
|
|
857
|
-
callback(null, chunk);
|
|
858
|
-
}
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
|
-
async getLogs(transportId) {
|
|
862
|
-
if (!transportId || !this.transports[transportId]) {
|
|
863
|
-
return [];
|
|
864
|
-
}
|
|
865
|
-
return this.transports[transportId].getLogs();
|
|
866
|
-
}
|
|
867
|
-
async getLogsByRunId({ runId, transportId }) {
|
|
868
|
-
return this.transports[transportId]?.getLogsByRunId({ runId });
|
|
869
|
-
}
|
|
870
1233
|
};
|
|
871
|
-
function createLogger(options) {
|
|
872
|
-
return new Logger(options);
|
|
873
|
-
}
|
|
874
1234
|
|
|
1235
|
+
var package_default = {
|
|
1236
|
+
version: "1.0.0-beta.16"};
|
|
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
|
+
}
|
|
875
1251
|
var DepsService = class {
|
|
876
1252
|
packageManager;
|
|
877
1253
|
constructor() {
|
|
878
1254
|
this.packageManager = this.getPackageManager();
|
|
879
1255
|
}
|
|
880
1256
|
findLockFile(dir) {
|
|
881
|
-
const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
|
|
1257
|
+
const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock", "bun.lockb"];
|
|
882
1258
|
for (const file of lockFiles) {
|
|
883
|
-
if (fs3__default__default.existsSync(
|
|
1259
|
+
if (fs3__default__default.existsSync(path3.join(dir, file))) {
|
|
884
1260
|
return file;
|
|
885
1261
|
}
|
|
886
1262
|
}
|
|
887
|
-
const parentDir =
|
|
1263
|
+
const parentDir = path3.resolve(dir, "..");
|
|
888
1264
|
if (parentDir !== dir) {
|
|
889
1265
|
return this.findLockFile(parentDir);
|
|
890
1266
|
}
|
|
@@ -900,20 +1276,17 @@ var DepsService = class {
|
|
|
900
1276
|
case "yarn.lock":
|
|
901
1277
|
return "yarn";
|
|
902
1278
|
case "bun.lock":
|
|
1279
|
+
case "bun.lockb":
|
|
903
1280
|
return "bun";
|
|
904
1281
|
default:
|
|
905
1282
|
return "npm";
|
|
906
1283
|
}
|
|
907
1284
|
}
|
|
908
1285
|
async installPackages(packages) {
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
runCommand = `${this.packageManager} i`;
|
|
912
|
-
} else {
|
|
913
|
-
runCommand = `${this.packageManager} add`;
|
|
914
|
-
}
|
|
1286
|
+
const pm = this.packageManager;
|
|
1287
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
915
1288
|
const packageList = packages.join(" ");
|
|
916
|
-
return execa(`${
|
|
1289
|
+
return execa(`${pm} ${installCommand} ${packageList}`, {
|
|
917
1290
|
all: true,
|
|
918
1291
|
shell: true,
|
|
919
1292
|
stdio: "inherit"
|
|
@@ -921,7 +1294,7 @@ var DepsService = class {
|
|
|
921
1294
|
}
|
|
922
1295
|
async checkDependencies(dependencies) {
|
|
923
1296
|
try {
|
|
924
|
-
const packageJsonPath =
|
|
1297
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
925
1298
|
try {
|
|
926
1299
|
await fs4.access(packageJsonPath);
|
|
927
1300
|
} catch {
|
|
@@ -941,7 +1314,7 @@ var DepsService = class {
|
|
|
941
1314
|
}
|
|
942
1315
|
async getProjectName() {
|
|
943
1316
|
try {
|
|
944
|
-
const packageJsonPath =
|
|
1317
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
945
1318
|
const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
|
|
946
1319
|
const pkg = JSON.parse(packageJson);
|
|
947
1320
|
return pkg.name;
|
|
@@ -949,13 +1322,6 @@ var DepsService = class {
|
|
|
949
1322
|
throw err;
|
|
950
1323
|
}
|
|
951
1324
|
}
|
|
952
|
-
async getPackageVersion() {
|
|
953
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
954
|
-
const __dirname = dirname(__filename);
|
|
955
|
-
const pkgJsonPath = path.join(__dirname, "..", "package.json");
|
|
956
|
-
const content = await fsExtra3.readJSON(pkgJsonPath);
|
|
957
|
-
return content.version;
|
|
958
|
-
}
|
|
959
1325
|
async addScriptsToPackageJson(scripts) {
|
|
960
1326
|
const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
|
|
961
1327
|
packageJson.scripts = {
|
|
@@ -965,116 +1331,6 @@ var DepsService = class {
|
|
|
965
1331
|
await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
966
1332
|
}
|
|
967
1333
|
};
|
|
968
|
-
function getPackageManager() {
|
|
969
|
-
const userAgent = process.env.npm_config_user_agent || "";
|
|
970
|
-
const execPath = process.env.npm_execpath || "";
|
|
971
|
-
if (userAgent.includes("yarn")) {
|
|
972
|
-
return "yarn";
|
|
973
|
-
}
|
|
974
|
-
if (userAgent.includes("pnpm")) {
|
|
975
|
-
return "pnpm";
|
|
976
|
-
}
|
|
977
|
-
if (userAgent.includes("npm")) {
|
|
978
|
-
return "npm";
|
|
979
|
-
}
|
|
980
|
-
if (execPath.includes("yarn")) {
|
|
981
|
-
return "yarn";
|
|
982
|
-
}
|
|
983
|
-
if (execPath.includes("pnpm")) {
|
|
984
|
-
return "pnpm";
|
|
985
|
-
}
|
|
986
|
-
if (execPath.includes("npm")) {
|
|
987
|
-
return "npm";
|
|
988
|
-
}
|
|
989
|
-
return "npm";
|
|
990
|
-
}
|
|
991
|
-
function getPackageManagerInstallCommand(pm) {
|
|
992
|
-
switch (pm) {
|
|
993
|
-
case "npm":
|
|
994
|
-
return "install";
|
|
995
|
-
case "yarn":
|
|
996
|
-
return "add";
|
|
997
|
-
case "pnpm":
|
|
998
|
-
return "add";
|
|
999
|
-
default:
|
|
1000
|
-
return "install";
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
var args = ["-y", "@mastra/mcp-docs-server@latest"];
|
|
1004
|
-
var mcpConfig = {
|
|
1005
|
-
mcpServers: {
|
|
1006
|
-
mastra: process.platform === `win32` ? {
|
|
1007
|
-
command: "cmd",
|
|
1008
|
-
args: ["/c", "npx", ...args]
|
|
1009
|
-
} : {
|
|
1010
|
-
command: "npx",
|
|
1011
|
-
args
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
};
|
|
1015
|
-
function makeConfig(original) {
|
|
1016
|
-
return {
|
|
1017
|
-
...original,
|
|
1018
|
-
mcpServers: {
|
|
1019
|
-
...original?.mcpServers || {},
|
|
1020
|
-
...mcpConfig.mcpServers
|
|
1021
|
-
}
|
|
1022
|
-
};
|
|
1023
|
-
}
|
|
1024
|
-
async function writeMergedConfig(configPath) {
|
|
1025
|
-
const configExists = existsSync(configPath);
|
|
1026
|
-
const config = makeConfig(configExists ? await readJSON(configPath) : {});
|
|
1027
|
-
await ensureFile(configPath);
|
|
1028
|
-
await writeJSON(configPath, config, {
|
|
1029
|
-
spaces: 2
|
|
1030
|
-
});
|
|
1031
|
-
}
|
|
1032
|
-
var windsurfGlobalMCPConfigPath = path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1033
|
-
var cursorGlobalMCPConfigPath = path.join(os.homedir(), ".cursor", "mcp.json");
|
|
1034
|
-
async function installMastraDocsMCPServer({
|
|
1035
|
-
editor,
|
|
1036
|
-
directory
|
|
1037
|
-
}) {
|
|
1038
|
-
if (editor === `cursor`) {
|
|
1039
|
-
await writeMergedConfig(path.join(directory, ".cursor", "mcp.json"));
|
|
1040
|
-
}
|
|
1041
|
-
if (editor === `cursor-global`) {
|
|
1042
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1043
|
-
if (alreadyInstalled) {
|
|
1044
|
-
return;
|
|
1045
|
-
}
|
|
1046
|
-
await writeMergedConfig(cursorGlobalMCPConfigPath);
|
|
1047
|
-
}
|
|
1048
|
-
if (editor === `windsurf`) {
|
|
1049
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1050
|
-
if (alreadyInstalled) {
|
|
1051
|
-
return;
|
|
1052
|
-
}
|
|
1053
|
-
await writeMergedConfig(windsurfGlobalMCPConfigPath);
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
async function globalMCPIsAlreadyInstalled(editor) {
|
|
1057
|
-
let configPath = ``;
|
|
1058
|
-
if (editor === "windsurf") {
|
|
1059
|
-
configPath = windsurfGlobalMCPConfigPath;
|
|
1060
|
-
} else if (editor === "cursor-global") {
|
|
1061
|
-
configPath = cursorGlobalMCPConfigPath;
|
|
1062
|
-
}
|
|
1063
|
-
if (!configPath || !existsSync(configPath)) {
|
|
1064
|
-
return false;
|
|
1065
|
-
}
|
|
1066
|
-
try {
|
|
1067
|
-
const configContents = await readJSON(configPath);
|
|
1068
|
-
if (!configContents?.mcpServers) return false;
|
|
1069
|
-
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1070
|
-
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1071
|
-
);
|
|
1072
|
-
return hasMastraMCP;
|
|
1073
|
-
} catch (e) {
|
|
1074
|
-
console.error(e);
|
|
1075
|
-
return false;
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
1334
|
var EnvService = class {
|
|
1079
1335
|
};
|
|
1080
1336
|
var FileEnvService = class extends EnvService {
|
|
@@ -1113,7 +1369,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1113
1369
|
${key}=${value}`;
|
|
1114
1370
|
}
|
|
1115
1371
|
await this.writeFile({ filePath, data });
|
|
1116
|
-
console.
|
|
1372
|
+
console.info(`${key} set to ${value} in ENV file.`);
|
|
1117
1373
|
return data;
|
|
1118
1374
|
}
|
|
1119
1375
|
async getEnvValue(key) {
|
|
@@ -1146,19 +1402,19 @@ var FileService = class {
|
|
|
1146
1402
|
*/
|
|
1147
1403
|
async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
|
|
1148
1404
|
const __filename = fileURLToPath(import.meta.url);
|
|
1149
|
-
const __dirname =
|
|
1150
|
-
const filePath =
|
|
1405
|
+
const __dirname = path3.dirname(__filename);
|
|
1406
|
+
const filePath = path3.resolve(__dirname, "starter-files", inputFile);
|
|
1151
1407
|
const fileString = fs3__default__default.readFileSync(filePath, "utf8");
|
|
1152
1408
|
if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
|
|
1153
|
-
console.
|
|
1409
|
+
console.info(`${outputFilePath} already exists`);
|
|
1154
1410
|
return false;
|
|
1155
1411
|
}
|
|
1156
|
-
await
|
|
1412
|
+
await fsExtra.outputFile(outputFilePath, fileString);
|
|
1157
1413
|
return true;
|
|
1158
1414
|
}
|
|
1159
1415
|
async setupEnvFile({ dbUrl }) {
|
|
1160
|
-
const envPath =
|
|
1161
|
-
await
|
|
1416
|
+
const envPath = path3.join(process.cwd(), ".env.development");
|
|
1417
|
+
await fsExtra.ensureFile(envPath);
|
|
1162
1418
|
const fileEnvService = new FileEnvService(envPath);
|
|
1163
1419
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1164
1420
|
}
|
|
@@ -1181,86 +1437,205 @@ var FileService = class {
|
|
|
1181
1437
|
fs3__default__default.writeFileSync(filePath, fileContent);
|
|
1182
1438
|
}
|
|
1183
1439
|
};
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
});
|
|
1188
|
-
var exec = util.promisify(child_process.exec);
|
|
1189
|
-
var getAISDKPackage = (llmProvider) => {
|
|
1190
|
-
switch (llmProvider) {
|
|
1191
|
-
case "openai":
|
|
1192
|
-
return "@ai-sdk/openai";
|
|
1193
|
-
case "anthropic":
|
|
1194
|
-
return "@ai-sdk/anthropic";
|
|
1195
|
-
case "groq":
|
|
1196
|
-
return "@ai-sdk/groq";
|
|
1197
|
-
case "google":
|
|
1198
|
-
return "@ai-sdk/google";
|
|
1199
|
-
case "cerebras":
|
|
1200
|
-
return "@ai-sdk/cerebras";
|
|
1201
|
-
default:
|
|
1202
|
-
return "@ai-sdk/openai";
|
|
1203
|
-
}
|
|
1440
|
+
var createArgs = (versionTag) => {
|
|
1441
|
+
const packageName = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
|
|
1442
|
+
return ["-y", packageName];
|
|
1204
1443
|
};
|
|
1205
|
-
var
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1222
|
-
modelItem = `cerebras('llama-3.3-70b')`;
|
|
1444
|
+
var createMcpConfig = (editor, versionTag) => {
|
|
1445
|
+
const args = createArgs(versionTag);
|
|
1446
|
+
if (editor === "vscode") {
|
|
1447
|
+
return {
|
|
1448
|
+
servers: {
|
|
1449
|
+
mastra: process.platform === `win32` ? {
|
|
1450
|
+
command: "cmd",
|
|
1451
|
+
args: ["/c", "npx", ...args],
|
|
1452
|
+
type: "stdio"
|
|
1453
|
+
} : {
|
|
1454
|
+
command: "npx",
|
|
1455
|
+
args,
|
|
1456
|
+
type: "stdio"
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
};
|
|
1223
1460
|
}
|
|
1224
|
-
return {
|
|
1461
|
+
return {
|
|
1462
|
+
mcpServers: {
|
|
1463
|
+
mastra: {
|
|
1464
|
+
command: "npx",
|
|
1465
|
+
args
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
};
|
|
1225
1469
|
};
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
${providerImport}
|
|
1242
|
-
import { Agent } from '@mastra/core/agent';
|
|
1243
|
-
import { Memory } from '@mastra/memory';
|
|
1244
|
-
import { LibSQLStore } from '@mastra/libsql';
|
|
1245
|
-
${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
|
|
1246
|
-
|
|
1247
|
-
export const weatherAgent = new Agent({
|
|
1248
|
-
name: 'Weather Agent',
|
|
1249
|
-
instructions: \`${instructions}\`,
|
|
1250
|
-
model: ${modelItem},
|
|
1251
|
-
${addExampleTool ? "tools: { weatherTool }," : ""}
|
|
1252
|
-
memory: new Memory({
|
|
1253
|
-
storage: new LibSQLStore({
|
|
1254
|
-
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
1255
|
-
}),
|
|
1256
|
-
options: {
|
|
1257
|
-
lastMessages: 10,
|
|
1258
|
-
semanticRecall: false,
|
|
1259
|
-
threads: {
|
|
1260
|
-
generateTitle: false
|
|
1261
|
-
}
|
|
1470
|
+
function makeConfig(original, editor, versionTag) {
|
|
1471
|
+
if (editor === "vscode") {
|
|
1472
|
+
return {
|
|
1473
|
+
...original,
|
|
1474
|
+
servers: {
|
|
1475
|
+
...original?.servers || {},
|
|
1476
|
+
...createMcpConfig(editor, versionTag).servers
|
|
1477
|
+
}
|
|
1478
|
+
};
|
|
1479
|
+
}
|
|
1480
|
+
return {
|
|
1481
|
+
...original,
|
|
1482
|
+
mcpServers: {
|
|
1483
|
+
...original?.mcpServers || {},
|
|
1484
|
+
...createMcpConfig(editor, versionTag).mcpServers
|
|
1262
1485
|
}
|
|
1263
|
-
}
|
|
1486
|
+
};
|
|
1487
|
+
}
|
|
1488
|
+
async function writeMergedConfig(configPath, editor, versionTag) {
|
|
1489
|
+
const configExists = existsSync(configPath);
|
|
1490
|
+
const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor, versionTag);
|
|
1491
|
+
await ensureFile(configPath);
|
|
1492
|
+
await writeJSON(configPath, config, {
|
|
1493
|
+
spaces: 2
|
|
1494
|
+
});
|
|
1495
|
+
}
|
|
1496
|
+
var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1497
|
+
var antigravityGlobalMCPConfigPath = path3.join(os.homedir(), ".gemini", "antigravity", "mcp_config.json");
|
|
1498
|
+
var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
|
|
1499
|
+
path3.join(process.cwd(), ".vscode", "mcp.json");
|
|
1500
|
+
var vscodeGlobalMCPConfigPath = path3.join(
|
|
1501
|
+
os.homedir(),
|
|
1502
|
+
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")
|
|
1503
|
+
);
|
|
1504
|
+
async function installMastraDocsMCPServer({
|
|
1505
|
+
editor,
|
|
1506
|
+
directory,
|
|
1507
|
+
versionTag
|
|
1508
|
+
}) {
|
|
1509
|
+
if (editor === `cursor`) {
|
|
1510
|
+
await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor", versionTag);
|
|
1511
|
+
}
|
|
1512
|
+
if (editor === `vscode`) {
|
|
1513
|
+
await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode", versionTag);
|
|
1514
|
+
}
|
|
1515
|
+
if (editor === `cursor-global`) {
|
|
1516
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1517
|
+
if (alreadyInstalled) {
|
|
1518
|
+
return;
|
|
1519
|
+
}
|
|
1520
|
+
await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global", versionTag);
|
|
1521
|
+
}
|
|
1522
|
+
if (editor === `windsurf`) {
|
|
1523
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1524
|
+
if (alreadyInstalled) {
|
|
1525
|
+
return;
|
|
1526
|
+
}
|
|
1527
|
+
await writeMergedConfig(windsurfGlobalMCPConfigPath, editor, versionTag);
|
|
1528
|
+
}
|
|
1529
|
+
if (editor === `antigravity`) {
|
|
1530
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1531
|
+
if (alreadyInstalled) {
|
|
1532
|
+
return;
|
|
1533
|
+
}
|
|
1534
|
+
await writeMergedConfig(antigravityGlobalMCPConfigPath, editor, versionTag);
|
|
1535
|
+
}
|
|
1536
|
+
}
|
|
1537
|
+
async function globalMCPIsAlreadyInstalled(editor, versionTag) {
|
|
1538
|
+
let configPath = ``;
|
|
1539
|
+
if (editor === "windsurf") {
|
|
1540
|
+
configPath = windsurfGlobalMCPConfigPath;
|
|
1541
|
+
} else if (editor === "antigravity") {
|
|
1542
|
+
configPath = antigravityGlobalMCPConfigPath;
|
|
1543
|
+
} else if (editor === "cursor-global") {
|
|
1544
|
+
configPath = cursorGlobalMCPConfigPath;
|
|
1545
|
+
} else if (editor === "vscode") {
|
|
1546
|
+
configPath = vscodeGlobalMCPConfigPath;
|
|
1547
|
+
}
|
|
1548
|
+
if (!configPath || !existsSync(configPath)) {
|
|
1549
|
+
return false;
|
|
1550
|
+
}
|
|
1551
|
+
try {
|
|
1552
|
+
const configContents = await readJSON(configPath);
|
|
1553
|
+
if (!configContents) return false;
|
|
1554
|
+
const expectedPackage = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
|
|
1555
|
+
if (editor === "vscode") {
|
|
1556
|
+
if (!configContents.servers) return false;
|
|
1557
|
+
const hasMastraMCP2 = Object.values(configContents.servers).some(
|
|
1558
|
+
(server) => server?.args?.find((arg) => arg === expectedPackage)
|
|
1559
|
+
);
|
|
1560
|
+
return hasMastraMCP2;
|
|
1561
|
+
}
|
|
1562
|
+
if (!configContents?.mcpServers) return false;
|
|
1563
|
+
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1564
|
+
(server) => server?.args?.find((arg) => arg === expectedPackage)
|
|
1565
|
+
);
|
|
1566
|
+
return hasMastraMCP;
|
|
1567
|
+
} catch {
|
|
1568
|
+
return false;
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
var exec = util.promisify(child_process.exec);
|
|
1572
|
+
var getModelIdentifier = (llmProvider) => {
|
|
1573
|
+
let model = "openai/gpt-4o";
|
|
1574
|
+
if (llmProvider === "anthropic") {
|
|
1575
|
+
model = "anthropic/claude-sonnet-4-5";
|
|
1576
|
+
} else if (llmProvider === "groq") {
|
|
1577
|
+
model = "groq/llama-3.3-70b-versatile";
|
|
1578
|
+
} else if (llmProvider === "google") {
|
|
1579
|
+
model = "google/gemini-2.5-pro";
|
|
1580
|
+
} else if (llmProvider === "cerebras") {
|
|
1581
|
+
model = "cerebras/llama-3.3-70b";
|
|
1582
|
+
} else if (llmProvider === "mistral") {
|
|
1583
|
+
model = "mistral/mistral-medium-2508";
|
|
1584
|
+
}
|
|
1585
|
+
return model;
|
|
1586
|
+
};
|
|
1587
|
+
async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorers) {
|
|
1588
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1589
|
+
const instructions = `
|
|
1590
|
+
You are a helpful weather assistant that provides accurate weather information and can help planning activities based on the weather.
|
|
1591
|
+
|
|
1592
|
+
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1593
|
+
- Always ask for a location if none is provided
|
|
1594
|
+
- If the location name isn't in English, please translate it
|
|
1595
|
+
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1596
|
+
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1597
|
+
- Keep responses concise but informative
|
|
1598
|
+
- If the user asks for activities and provides the weather forecast, suggest activities based on the weather forecast.
|
|
1599
|
+
- If the user asks for activities, respond in the format they request.
|
|
1600
|
+
|
|
1601
|
+
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1602
|
+
`;
|
|
1603
|
+
const content = `
|
|
1604
|
+
import { Agent } from '@mastra/core/agent';
|
|
1605
|
+
import { Memory } from '@mastra/memory';
|
|
1606
|
+
${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
|
|
1607
|
+
${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
|
|
1608
|
+
|
|
1609
|
+
export const weatherAgent = new Agent({
|
|
1610
|
+
id: 'weather-agent',
|
|
1611
|
+
name: 'Weather Agent',
|
|
1612
|
+
instructions: \`${instructions}\`,
|
|
1613
|
+
model: '${modelString}',
|
|
1614
|
+
${addExampleTool ? "tools: { weatherTool }," : ""}
|
|
1615
|
+
${addScorers ? `scorers: {
|
|
1616
|
+
toolCallAppropriateness: {
|
|
1617
|
+
scorer: scorers.toolCallAppropriatenessScorer,
|
|
1618
|
+
sampling: {
|
|
1619
|
+
type: 'ratio',
|
|
1620
|
+
rate: 1,
|
|
1621
|
+
},
|
|
1622
|
+
},
|
|
1623
|
+
completeness: {
|
|
1624
|
+
scorer: scorers.completenessScorer,
|
|
1625
|
+
sampling: {
|
|
1626
|
+
type: 'ratio',
|
|
1627
|
+
rate: 1,
|
|
1628
|
+
},
|
|
1629
|
+
},
|
|
1630
|
+
translation: {
|
|
1631
|
+
scorer: scorers.translationScorer,
|
|
1632
|
+
sampling: {
|
|
1633
|
+
type: 'ratio',
|
|
1634
|
+
rate: 1,
|
|
1635
|
+
},
|
|
1636
|
+
},
|
|
1637
|
+
},` : ""}
|
|
1638
|
+
memory: new Memory()
|
|
1264
1639
|
});
|
|
1265
1640
|
`;
|
|
1266
1641
|
const formattedContent = await prettier.format(content, {
|
|
@@ -1270,139 +1645,156 @@ export const weatherAgent = new Agent({
|
|
|
1270
1645
|
await fs4.writeFile(destPath, "");
|
|
1271
1646
|
await fs4.writeFile(destPath, formattedContent);
|
|
1272
1647
|
}
|
|
1273
|
-
async function writeWorkflowSample(destPath
|
|
1274
|
-
const {
|
|
1275
|
-
const content = `${providerImport}
|
|
1276
|
-
import { Agent } from '@mastra/core/agent';
|
|
1277
|
-
import { Step, Workflow } from '@mastra/core/workflows';
|
|
1648
|
+
async function writeWorkflowSample(destPath) {
|
|
1649
|
+
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1278
1650
|
import { z } from 'zod';
|
|
1279
1651
|
|
|
1280
|
-
const
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
For each day in the forecast, structure your response exactly as follows:
|
|
1289
|
-
|
|
1290
|
-
\u{1F4C5} [Day, Month Date, Year]
|
|
1291
|
-
\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
|
|
1292
|
-
|
|
1293
|
-
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1294
|
-
\u2022 Conditions: [brief description]
|
|
1295
|
-
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1296
|
-
\u2022 Precipitation: [X% chance]
|
|
1297
|
-
|
|
1298
|
-
\u{1F305} MORNING ACTIVITIES
|
|
1299
|
-
Outdoor:
|
|
1300
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1301
|
-
Best timing: [specific time range]
|
|
1302
|
-
Note: [relevant weather consideration]
|
|
1303
|
-
|
|
1304
|
-
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1305
|
-
Outdoor:
|
|
1306
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1307
|
-
Best timing: [specific time range]
|
|
1308
|
-
Note: [relevant weather consideration]
|
|
1309
|
-
|
|
1310
|
-
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1311
|
-
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1312
|
-
Ideal for: [weather condition that would trigger this alternative]
|
|
1313
|
-
|
|
1314
|
-
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1315
|
-
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1316
|
-
|
|
1317
|
-
Guidelines:
|
|
1318
|
-
- Suggest 2-3 time-specific outdoor activities per day
|
|
1319
|
-
- Include 1-2 indoor backup options
|
|
1320
|
-
- For precipitation >50%, lead with indoor activities
|
|
1321
|
-
- All activities must be specific to the location
|
|
1322
|
-
- Include specific venues, trails, or locations
|
|
1323
|
-
- Consider activity intensity based on temperature
|
|
1324
|
-
- Keep descriptions concise but informative
|
|
1325
|
-
|
|
1326
|
-
Maintain this exact formatting for consistency, using the emoji and section headers as shown.
|
|
1327
|
-
\`,
|
|
1328
|
-
});
|
|
1652
|
+
const forecastSchema = z.object({
|
|
1653
|
+
date: z.string(),
|
|
1654
|
+
maxTemp: z.number(),
|
|
1655
|
+
minTemp: z.number(),
|
|
1656
|
+
precipitationChance: z.number(),
|
|
1657
|
+
condition: z.string(),
|
|
1658
|
+
location: z.string(),
|
|
1659
|
+
})
|
|
1329
1660
|
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1661
|
+
function getWeatherCondition(code: number): string {
|
|
1662
|
+
const conditions: Record<number, string> = {
|
|
1663
|
+
0: 'Clear sky',
|
|
1664
|
+
1: 'Mainly clear',
|
|
1665
|
+
2: 'Partly cloudy',
|
|
1666
|
+
3: 'Overcast',
|
|
1667
|
+
45: 'Foggy',
|
|
1668
|
+
48: 'Depositing rime fog',
|
|
1669
|
+
51: 'Light drizzle',
|
|
1670
|
+
53: 'Moderate drizzle',
|
|
1671
|
+
55: 'Dense drizzle',
|
|
1672
|
+
61: 'Slight rain',
|
|
1673
|
+
63: 'Moderate rain',
|
|
1674
|
+
65: 'Heavy rain',
|
|
1675
|
+
71: 'Slight snow fall',
|
|
1676
|
+
73: 'Moderate snow fall',
|
|
1677
|
+
75: 'Heavy snow fall',
|
|
1678
|
+
95: 'Thunderstorm',
|
|
1679
|
+
}
|
|
1680
|
+
return conditions[code] || 'Unknown'
|
|
1681
|
+
}
|
|
1340
1682
|
|
|
1341
|
-
const fetchWeather =
|
|
1683
|
+
const fetchWeather = createStep({
|
|
1342
1684
|
id: 'fetch-weather',
|
|
1343
1685
|
description: 'Fetches weather forecast for a given city',
|
|
1344
1686
|
inputSchema: z.object({
|
|
1345
1687
|
city: z.string().describe('The city to get the weather for'),
|
|
1346
1688
|
}),
|
|
1347
1689
|
outputSchema: forecastSchema,
|
|
1348
|
-
execute: async ({
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
if (!triggerData) {
|
|
1352
|
-
throw new Error('Trigger data not found');
|
|
1690
|
+
execute: async ({ inputData }) => {
|
|
1691
|
+
if (!inputData) {
|
|
1692
|
+
throw new Error('Input data not found');
|
|
1353
1693
|
}
|
|
1354
1694
|
|
|
1355
|
-
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(
|
|
1695
|
+
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(inputData.city)}&count=1\`;
|
|
1356
1696
|
const geocodingResponse = await fetch(geocodingUrl);
|
|
1357
1697
|
const geocodingData = (await geocodingResponse.json()) as {
|
|
1358
1698
|
results: { latitude: number; longitude: number; name: string }[];
|
|
1359
1699
|
};
|
|
1360
1700
|
|
|
1361
1701
|
if (!geocodingData.results?.[0]) {
|
|
1362
|
-
throw new Error(\`Location '\${
|
|
1702
|
+
throw new Error(\`Location '\${inputData.city}' not found\`);
|
|
1363
1703
|
}
|
|
1364
1704
|
|
|
1365
1705
|
const { latitude, longitude, name } = geocodingData.results[0];
|
|
1366
1706
|
|
|
1367
|
-
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}&
|
|
1707
|
+
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}¤t=precipitation,weathercode&timezone=auto,&hourly=precipitation_probability,temperature_2m\`;
|
|
1368
1708
|
const response = await fetch(weatherUrl);
|
|
1369
1709
|
const data = (await response.json()) as {
|
|
1370
|
-
|
|
1371
|
-
time: string
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1710
|
+
current: {
|
|
1711
|
+
time: string
|
|
1712
|
+
precipitation: number
|
|
1713
|
+
weathercode: number
|
|
1714
|
+
}
|
|
1715
|
+
hourly: {
|
|
1716
|
+
precipitation_probability: number[]
|
|
1717
|
+
temperature_2m: number[]
|
|
1718
|
+
}
|
|
1719
|
+
}
|
|
1378
1720
|
|
|
1379
|
-
const forecast =
|
|
1380
|
-
date,
|
|
1381
|
-
maxTemp: data.
|
|
1382
|
-
minTemp: data.
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1721
|
+
const forecast = {
|
|
1722
|
+
date: new Date().toISOString(),
|
|
1723
|
+
maxTemp: Math.max(...data.hourly.temperature_2m),
|
|
1724
|
+
minTemp: Math.min(...data.hourly.temperature_2m),
|
|
1725
|
+
condition: getWeatherCondition(data.current.weathercode),
|
|
1726
|
+
precipitationChance: data.hourly.precipitation_probability.reduce(
|
|
1727
|
+
(acc, curr) => Math.max(acc, curr),
|
|
1728
|
+
0
|
|
1729
|
+
),
|
|
1730
|
+
location: name
|
|
1731
|
+
}
|
|
1387
1732
|
|
|
1388
1733
|
return forecast;
|
|
1389
1734
|
},
|
|
1390
1735
|
});
|
|
1391
1736
|
|
|
1392
1737
|
|
|
1393
|
-
const planActivities =
|
|
1738
|
+
const planActivities = createStep({
|
|
1394
1739
|
id: 'plan-activities',
|
|
1395
1740
|
description: 'Suggests activities based on weather conditions',
|
|
1396
|
-
|
|
1397
|
-
|
|
1741
|
+
inputSchema: forecastSchema,
|
|
1742
|
+
outputSchema: z.object({
|
|
1743
|
+
activities: z.string(),
|
|
1744
|
+
}),
|
|
1745
|
+
execute: async ({ inputData, mastra }) => {
|
|
1746
|
+
const forecast = inputData
|
|
1398
1747
|
|
|
1399
|
-
if (!forecast
|
|
1400
|
-
throw new Error('Forecast data not found')
|
|
1748
|
+
if (!forecast) {
|
|
1749
|
+
throw new Error('Forecast data not found')
|
|
1401
1750
|
}
|
|
1402
1751
|
|
|
1403
|
-
const
|
|
1752
|
+
const agent = mastra?.getAgent('weatherAgent');
|
|
1753
|
+
if (!agent) {
|
|
1754
|
+
throw new Error('Weather agent not found');
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
|
|
1404
1758
|
\${JSON.stringify(forecast, null, 2)}
|
|
1405
|
-
|
|
1759
|
+
For each day in the forecast, structure your response exactly as follows:
|
|
1760
|
+
|
|
1761
|
+
\u{1F4C5} [Day, Month Date, Year]
|
|
1762
|
+
\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
|
|
1763
|
+
|
|
1764
|
+
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1765
|
+
\u2022 Conditions: [brief description]
|
|
1766
|
+
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1767
|
+
\u2022 Precipitation: [X% chance]
|
|
1768
|
+
|
|
1769
|
+
\u{1F305} MORNING ACTIVITIES
|
|
1770
|
+
Outdoor:
|
|
1771
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1772
|
+
Best timing: [specific time range]
|
|
1773
|
+
Note: [relevant weather consideration]
|
|
1774
|
+
|
|
1775
|
+
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1776
|
+
Outdoor:
|
|
1777
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1778
|
+
Best timing: [specific time range]
|
|
1779
|
+
Note: [relevant weather consideration]
|
|
1780
|
+
|
|
1781
|
+
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1782
|
+
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1783
|
+
Ideal for: [weather condition that would trigger this alternative]
|
|
1784
|
+
|
|
1785
|
+
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1786
|
+
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1787
|
+
|
|
1788
|
+
Guidelines:
|
|
1789
|
+
- Suggest 2-3 time-specific outdoor activities per day
|
|
1790
|
+
- Include 1-2 indoor backup options
|
|
1791
|
+
- For precipitation >50%, lead with indoor activities
|
|
1792
|
+
- All activities must be specific to the location
|
|
1793
|
+
- Include specific venues, trails, or locations
|
|
1794
|
+
- Consider activity intensity based on temperature
|
|
1795
|
+
- Keep descriptions concise but informative
|
|
1796
|
+
|
|
1797
|
+
Maintain this exact formatting for consistency, using the emoji and section headers as shown.\`;
|
|
1406
1798
|
|
|
1407
1799
|
const response = await agent.stream([
|
|
1408
1800
|
{
|
|
@@ -1412,7 +1804,7 @@ const planActivities = new Step({
|
|
|
1412
1804
|
]);
|
|
1413
1805
|
|
|
1414
1806
|
let activitiesText = '';
|
|
1415
|
-
|
|
1807
|
+
|
|
1416
1808
|
for await (const chunk of response.textStream) {
|
|
1417
1809
|
process.stdout.write(chunk);
|
|
1418
1810
|
activitiesText += chunk;
|
|
@@ -1424,35 +1816,16 @@ const planActivities = new Step({
|
|
|
1424
1816
|
},
|
|
1425
1817
|
});
|
|
1426
1818
|
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
1: 'Mainly clear',
|
|
1431
|
-
2: 'Partly cloudy',
|
|
1432
|
-
3: 'Overcast',
|
|
1433
|
-
45: 'Foggy',
|
|
1434
|
-
48: 'Depositing rime fog',
|
|
1435
|
-
51: 'Light drizzle',
|
|
1436
|
-
53: 'Moderate drizzle',
|
|
1437
|
-
55: 'Dense drizzle',
|
|
1438
|
-
61: 'Slight rain',
|
|
1439
|
-
63: 'Moderate rain',
|
|
1440
|
-
65: 'Heavy rain',
|
|
1441
|
-
71: 'Slight snow fall',
|
|
1442
|
-
73: 'Moderate snow fall',
|
|
1443
|
-
75: 'Heavy snow fall',
|
|
1444
|
-
95: 'Thunderstorm',
|
|
1445
|
-
};
|
|
1446
|
-
return conditions[code] || 'Unknown';
|
|
1447
|
-
}
|
|
1448
|
-
|
|
1449
|
-
const weatherWorkflow = new Workflow({
|
|
1450
|
-
name: 'weather-workflow',
|
|
1451
|
-
triggerSchema: z.object({
|
|
1819
|
+
const weatherWorkflow = createWorkflow({
|
|
1820
|
+
id: 'weather-workflow',
|
|
1821
|
+
inputSchema: z.object({
|
|
1452
1822
|
city: z.string().describe('The city to get the weather for'),
|
|
1453
1823
|
}),
|
|
1824
|
+
outputSchema: z.object({
|
|
1825
|
+
activities: z.string(),
|
|
1826
|
+
})
|
|
1454
1827
|
})
|
|
1455
|
-
.
|
|
1828
|
+
.then(fetchWeather)
|
|
1456
1829
|
.then(planActivities);
|
|
1457
1830
|
|
|
1458
1831
|
weatherWorkflow.commit();
|
|
@@ -1469,41 +1842,138 @@ async function writeToolSample(destPath) {
|
|
|
1469
1842
|
const fileService = new FileService();
|
|
1470
1843
|
await fileService.copyStarterFile("tools.ts", destPath);
|
|
1471
1844
|
}
|
|
1845
|
+
async function writeScorersSample(llmProvider, destPath) {
|
|
1846
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1847
|
+
const content = `import { z } from 'zod';
|
|
1848
|
+
import { createToolCallAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt';
|
|
1849
|
+
import { createCompletenessScorer } from '@mastra/evals/scorers/prebuilt';
|
|
1850
|
+
import { getAssistantMessageFromRunOutput, getUserMessageFromRunInput } from '@mastra/evals/scorers/utils';
|
|
1851
|
+
import { createScorer } from '@mastra/core/evals';
|
|
1852
|
+
|
|
1853
|
+
export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({
|
|
1854
|
+
expectedTool: 'weatherTool',
|
|
1855
|
+
strictMode: false,
|
|
1856
|
+
});
|
|
1857
|
+
|
|
1858
|
+
export const completenessScorer = createCompletenessScorer();
|
|
1859
|
+
|
|
1860
|
+
// Custom LLM-judged scorer: evaluates if non-English locations are translated appropriately
|
|
1861
|
+
export const translationScorer = createScorer({
|
|
1862
|
+
id: 'translation-quality-scorer',
|
|
1863
|
+
name: 'Translation Quality',
|
|
1864
|
+
description: 'Checks that non-English location names are translated and used correctly',
|
|
1865
|
+
type: 'agent',
|
|
1866
|
+
judge: {
|
|
1867
|
+
model: '${modelString}',
|
|
1868
|
+
instructions:
|
|
1869
|
+
'You are an expert evaluator of translation quality for geographic locations. ' +
|
|
1870
|
+
'Determine whether the user text mentions a non-English location and whether the assistant correctly uses an English translation of that location. ' +
|
|
1871
|
+
'Be lenient with transliteration differences and diacritics. ' +
|
|
1872
|
+
'Return only the structured JSON matching the provided schema.',
|
|
1873
|
+
},
|
|
1874
|
+
})
|
|
1875
|
+
.preprocess(({ run }) => {
|
|
1876
|
+
const userText = getUserMessageFromRunInput(run.input) || '';
|
|
1877
|
+
const assistantText = getAssistantMessageFromRunOutput(run.output) || '';
|
|
1878
|
+
return { userText, assistantText };
|
|
1879
|
+
})
|
|
1880
|
+
.analyze({
|
|
1881
|
+
description: 'Extract location names and detect language/translation adequacy',
|
|
1882
|
+
outputSchema: z.object({
|
|
1883
|
+
nonEnglish: z.boolean(),
|
|
1884
|
+
translated: z.boolean(),
|
|
1885
|
+
confidence: z.number().min(0).max(1).default(1),
|
|
1886
|
+
explanation: z.string().default(''),
|
|
1887
|
+
}),
|
|
1888
|
+
createPrompt: ({ results }) => \`
|
|
1889
|
+
You are evaluating if a weather assistant correctly handled translation of a non-English location.
|
|
1890
|
+
User text:
|
|
1891
|
+
"""
|
|
1892
|
+
\${results.preprocessStepResult.userText}
|
|
1893
|
+
"""
|
|
1894
|
+
Assistant response:
|
|
1895
|
+
"""
|
|
1896
|
+
\${results.preprocessStepResult.assistantText}
|
|
1897
|
+
"""
|
|
1898
|
+
Tasks:
|
|
1899
|
+
1) Identify if the user mentioned a location that appears non-English.
|
|
1900
|
+
2) If non-English, check whether the assistant used a correct English translation of that location in its response.
|
|
1901
|
+
3) Be lenient with transliteration differences (e.g., accents/diacritics).
|
|
1902
|
+
Return JSON with fields:
|
|
1903
|
+
{
|
|
1904
|
+
"nonEnglish": boolean,
|
|
1905
|
+
"translated": boolean,
|
|
1906
|
+
"confidence": number, // 0-1
|
|
1907
|
+
"explanation": string
|
|
1908
|
+
}
|
|
1909
|
+
\`,
|
|
1910
|
+
})
|
|
1911
|
+
.generateScore(({ results }) => {
|
|
1912
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1913
|
+
if (!r.nonEnglish) return 1; // If not applicable, full credit
|
|
1914
|
+
if (r.translated) return Math.max(0, Math.min(1, 0.7 + 0.3 * (r.confidence ?? 1)));
|
|
1915
|
+
return 0; // Non-English but not translated
|
|
1916
|
+
})
|
|
1917
|
+
.generateReason(({ results, score }) => {
|
|
1918
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1919
|
+
return \`Translation scoring: nonEnglish=\${r.nonEnglish ?? false}, translated=\${r.translated ?? false}, confidence=\${r.confidence ?? 0}. Score=\${score}. \${r.explanation ?? ''}\`;
|
|
1920
|
+
});
|
|
1921
|
+
|
|
1922
|
+
export const scorers = {
|
|
1923
|
+
toolCallAppropriatenessScorer,
|
|
1924
|
+
completenessScorer,
|
|
1925
|
+
translationScorer,
|
|
1926
|
+
};`;
|
|
1927
|
+
const formattedContent = await prettier.format(content, {
|
|
1928
|
+
parser: "typescript",
|
|
1929
|
+
singleQuote: true
|
|
1930
|
+
});
|
|
1931
|
+
await fs4.writeFile(destPath, formattedContent);
|
|
1932
|
+
}
|
|
1472
1933
|
async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
|
|
1473
1934
|
switch (component) {
|
|
1474
1935
|
case "agents":
|
|
1475
|
-
return writeAgentSample(
|
|
1936
|
+
return writeAgentSample(
|
|
1937
|
+
llmprovider,
|
|
1938
|
+
destPath,
|
|
1939
|
+
importComponents.includes("tools"),
|
|
1940
|
+
importComponents.includes("scorers")
|
|
1941
|
+
);
|
|
1476
1942
|
case "tools":
|
|
1477
1943
|
return writeToolSample(destPath);
|
|
1478
1944
|
case "workflows":
|
|
1479
|
-
return writeWorkflowSample(destPath
|
|
1945
|
+
return writeWorkflowSample(destPath);
|
|
1946
|
+
case "scorers":
|
|
1947
|
+
return writeScorersSample(llmprovider, destPath);
|
|
1480
1948
|
default:
|
|
1481
1949
|
return "";
|
|
1482
1950
|
}
|
|
1483
1951
|
}
|
|
1484
1952
|
var createComponentsDir = async (dirPath, component) => {
|
|
1485
1953
|
const componentPath = dirPath + `/${component}`;
|
|
1486
|
-
await
|
|
1954
|
+
await fsExtra.ensureDir(componentPath);
|
|
1487
1955
|
};
|
|
1488
1956
|
var writeIndexFile = async ({
|
|
1489
1957
|
dirPath,
|
|
1490
1958
|
addAgent,
|
|
1491
1959
|
addExample,
|
|
1492
|
-
addWorkflow
|
|
1960
|
+
addWorkflow,
|
|
1961
|
+
addScorers
|
|
1493
1962
|
}) => {
|
|
1494
1963
|
const indexPath = dirPath + "/index.ts";
|
|
1495
|
-
const destPath =
|
|
1964
|
+
const destPath = path3.join(indexPath);
|
|
1496
1965
|
try {
|
|
1497
1966
|
await fs4.writeFile(destPath, "");
|
|
1498
1967
|
const filteredExports = [
|
|
1499
1968
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1500
|
-
addAgent ? `agents: { weatherAgent },` : ""
|
|
1969
|
+
addAgent ? `agents: { weatherAgent },` : "",
|
|
1970
|
+
addScorers ? `scorers: { toolCallAppropriatenessScorer, completenessScorer, translationScorer },` : ""
|
|
1501
1971
|
].filter(Boolean);
|
|
1502
1972
|
if (!addExample) {
|
|
1503
1973
|
await fs4.writeFile(
|
|
1504
1974
|
destPath,
|
|
1505
1975
|
`
|
|
1506
|
-
import { Mastra } from '@mastra/core';
|
|
1976
|
+
import { Mastra } from '@mastra/core/mastra';
|
|
1507
1977
|
|
|
1508
1978
|
export const mastra = new Mastra()
|
|
1509
1979
|
`
|
|
@@ -1514,21 +1984,38 @@ export const mastra = new Mastra()
|
|
|
1514
1984
|
destPath,
|
|
1515
1985
|
`
|
|
1516
1986
|
import { Mastra } from '@mastra/core/mastra';
|
|
1517
|
-
import {
|
|
1987
|
+
import { PinoLogger } from '@mastra/loggers';
|
|
1518
1988
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1519
|
-
|
|
1520
|
-
${
|
|
1989
|
+
import { Observability, DefaultExporter, CloudExporter, SensitiveDataFilter } from '@mastra/observability';
|
|
1990
|
+
${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
|
|
1991
|
+
${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
|
|
1992
|
+
${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
|
|
1521
1993
|
|
|
1522
1994
|
export const mastra = new Mastra({
|
|
1523
1995
|
${filteredExports.join("\n ")}
|
|
1524
1996
|
storage: new LibSQLStore({
|
|
1525
|
-
|
|
1997
|
+
id: "mastra-storage",
|
|
1998
|
+
// stores observability, scores, ... into memory storage, if it needs to persist, change to file:../mastra.db
|
|
1526
1999
|
url: ":memory:",
|
|
1527
2000
|
}),
|
|
1528
|
-
logger:
|
|
2001
|
+
logger: new PinoLogger({
|
|
1529
2002
|
name: 'Mastra',
|
|
1530
2003
|
level: 'info',
|
|
1531
2004
|
}),
|
|
2005
|
+
observability: new Observability({
|
|
2006
|
+
configs: {
|
|
2007
|
+
default: {
|
|
2008
|
+
serviceName: 'mastra',
|
|
2009
|
+
exporters: [
|
|
2010
|
+
new DefaultExporter(), // Persists traces to storage for Mastra Studio
|
|
2011
|
+
new CloudExporter(), // Sends traces to Mastra Cloud (if MASTRA_CLOUD_ACCESS_TOKEN is set)
|
|
2012
|
+
],
|
|
2013
|
+
spanOutputProcessors: [
|
|
2014
|
+
new SensitiveDataFilter(), // Redacts sensitive data like passwords, tokens, keys
|
|
2015
|
+
],
|
|
2016
|
+
},
|
|
2017
|
+
},
|
|
2018
|
+
}),
|
|
1532
2019
|
});
|
|
1533
2020
|
`
|
|
1534
2021
|
);
|
|
@@ -1536,7 +2023,6 @@ export const mastra = new Mastra({
|
|
|
1536
2023
|
throw err;
|
|
1537
2024
|
}
|
|
1538
2025
|
};
|
|
1539
|
-
yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
|
|
1540
2026
|
var getAPIKey = async (provider) => {
|
|
1541
2027
|
let key = "OPENAI_API_KEY";
|
|
1542
2028
|
switch (provider) {
|
|
@@ -1552,72 +2038,68 @@ var getAPIKey = async (provider) => {
|
|
|
1552
2038
|
case "cerebras":
|
|
1553
2039
|
key = "CEREBRAS_API_KEY";
|
|
1554
2040
|
return key;
|
|
2041
|
+
case "mistral":
|
|
2042
|
+
key = "MISTRAL_API_KEY";
|
|
2043
|
+
return key;
|
|
1555
2044
|
default:
|
|
1556
2045
|
return key;
|
|
1557
2046
|
}
|
|
1558
2047
|
};
|
|
1559
|
-
var writeAPIKey = async ({
|
|
1560
|
-
|
|
1561
|
-
apiKey = "your-api-key"
|
|
1562
|
-
}) => {
|
|
2048
|
+
var writeAPIKey = async ({ provider, apiKey }) => {
|
|
2049
|
+
const envFileName = apiKey ? ".env" : ".env.example";
|
|
1563
2050
|
const key = await getAPIKey(provider);
|
|
1564
|
-
|
|
2051
|
+
const escapedKey = shellQuote2.quote([key]);
|
|
2052
|
+
const escapedApiKey = shellQuote2.quote([apiKey ? apiKey : "your-api-key"]);
|
|
2053
|
+
await exec(`echo ${escapedKey}=${escapedApiKey} >> ${envFileName}`);
|
|
1565
2054
|
};
|
|
1566
2055
|
var createMastraDir = async (directory) => {
|
|
1567
2056
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
1568
|
-
const dirPath =
|
|
2057
|
+
const dirPath = path3.join(process.cwd(), ...dir, "mastra");
|
|
1569
2058
|
try {
|
|
1570
2059
|
await fs4.access(dirPath);
|
|
1571
2060
|
return { ok: false };
|
|
1572
2061
|
} catch {
|
|
1573
|
-
await
|
|
2062
|
+
await fsExtra.ensureDir(dirPath);
|
|
1574
2063
|
return { ok: true, dirPath };
|
|
1575
2064
|
}
|
|
1576
2065
|
};
|
|
1577
2066
|
var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
|
|
1578
|
-
const destPath = dirPath + `/${component}/
|
|
2067
|
+
const destPath = dirPath + `/${component}/weather-${component.slice(0, -1)}.ts`;
|
|
1579
2068
|
try {
|
|
1580
2069
|
await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
|
|
1581
2070
|
} catch (err) {
|
|
1582
2071
|
throw err;
|
|
1583
2072
|
}
|
|
1584
2073
|
};
|
|
1585
|
-
var
|
|
1586
|
-
|
|
1587
|
-
|
|
2074
|
+
var LLM_PROVIDERS = [
|
|
2075
|
+
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
2076
|
+
{ value: "anthropic", label: "Anthropic" },
|
|
2077
|
+
{ value: "groq", label: "Groq" },
|
|
2078
|
+
{ value: "google", label: "Google" },
|
|
2079
|
+
{ value: "cerebras", label: "Cerebras" },
|
|
2080
|
+
{ value: "mistral", label: "Mistral" }
|
|
2081
|
+
];
|
|
2082
|
+
var interactivePrompt = async (args = {}) => {
|
|
2083
|
+
const { skip = {}, options: { showBanner = true } = {} } = args;
|
|
2084
|
+
if (showBanner) {
|
|
2085
|
+
Ie(color2.inverse(" Mastra Init "));
|
|
2086
|
+
}
|
|
2087
|
+
const mastraProject = await Ce(
|
|
1588
2088
|
{
|
|
1589
|
-
directory: () =>
|
|
2089
|
+
directory: () => he({
|
|
1590
2090
|
message: "Where should we create the Mastra files? (default: src/)",
|
|
1591
2091
|
placeholder: "src/",
|
|
1592
2092
|
defaultValue: "src/"
|
|
1593
2093
|
}),
|
|
1594
|
-
|
|
1595
|
-
message: "
|
|
1596
|
-
options:
|
|
1597
|
-
{ value: "agents", label: "Agents", hint: "recommended" },
|
|
1598
|
-
{
|
|
1599
|
-
value: "workflows",
|
|
1600
|
-
label: "Workflows"
|
|
1601
|
-
}
|
|
1602
|
-
]
|
|
1603
|
-
}),
|
|
1604
|
-
shouldAddTools: () => ce({
|
|
1605
|
-
message: "Add tools?",
|
|
1606
|
-
initialValue: false
|
|
1607
|
-
}),
|
|
1608
|
-
llmProvider: () => le({
|
|
1609
|
-
message: "Select default provider:",
|
|
1610
|
-
options: [
|
|
1611
|
-
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1612
|
-
{ value: "anthropic", label: "Anthropic" },
|
|
1613
|
-
{ value: "groq", label: "Groq" },
|
|
1614
|
-
{ value: "google", label: "Google" },
|
|
1615
|
-
{ value: "cerebras", label: "Cerebras" }
|
|
1616
|
-
]
|
|
2094
|
+
llmProvider: () => skip?.llmProvider ? void 0 : ve({
|
|
2095
|
+
message: "Select a default provider:",
|
|
2096
|
+
options: LLM_PROVIDERS
|
|
1617
2097
|
}),
|
|
1618
2098
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
1619
|
-
|
|
1620
|
-
|
|
2099
|
+
if (skip?.llmApiKey) return void 0;
|
|
2100
|
+
const llmName = LLM_PROVIDERS.find((p6) => p6.value === llmProvider)?.label || "provider";
|
|
2101
|
+
const keyChoice = await ve({
|
|
2102
|
+
message: `Enter your ${llmName} API key?`,
|
|
1621
2103
|
options: [
|
|
1622
2104
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1623
2105
|
{ value: "enter", label: "Enter API key" }
|
|
@@ -1625,68 +2107,65 @@ var interactivePrompt = async () => {
|
|
|
1625
2107
|
initialValue: "skip"
|
|
1626
2108
|
});
|
|
1627
2109
|
if (keyChoice === "enter") {
|
|
1628
|
-
return
|
|
2110
|
+
return he({
|
|
1629
2111
|
message: "Enter your API key:",
|
|
1630
|
-
placeholder: "sk-..."
|
|
2112
|
+
placeholder: "sk-...",
|
|
2113
|
+
validate: (value) => {
|
|
2114
|
+
if (value.length === 0) return "API key cannot be empty";
|
|
2115
|
+
}
|
|
1631
2116
|
});
|
|
1632
2117
|
}
|
|
1633
2118
|
return void 0;
|
|
1634
2119
|
},
|
|
1635
|
-
addExample: () => ce({
|
|
1636
|
-
message: "Add example",
|
|
1637
|
-
initialValue: false
|
|
1638
|
-
}),
|
|
1639
2120
|
configureEditorWithDocsMCP: async () => {
|
|
1640
|
-
const
|
|
1641
|
-
|
|
1642
|
-
const editor = await le({
|
|
1643
|
-
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
2121
|
+
const editor = await ve({
|
|
2122
|
+
message: `Make your IDE into a Mastra expert? (Installs Mastra's MCP server)`,
|
|
1644
2123
|
options: [
|
|
1645
2124
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1646
2125
|
{
|
|
1647
2126
|
value: "cursor",
|
|
1648
|
-
label: "Cursor (project only)"
|
|
1649
|
-
hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
|
|
2127
|
+
label: "Cursor (project only)"
|
|
1650
2128
|
},
|
|
1651
2129
|
{
|
|
1652
2130
|
value: "cursor-global",
|
|
1653
|
-
label: "Cursor (global, all projects)"
|
|
1654
|
-
hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
|
|
2131
|
+
label: "Cursor (global, all projects)"
|
|
1655
2132
|
},
|
|
1656
2133
|
{
|
|
1657
2134
|
value: "windsurf",
|
|
1658
|
-
label: "Windsurf"
|
|
1659
|
-
|
|
2135
|
+
label: "Windsurf"
|
|
2136
|
+
},
|
|
2137
|
+
{
|
|
2138
|
+
value: "vscode",
|
|
2139
|
+
label: "VSCode"
|
|
2140
|
+
},
|
|
2141
|
+
{
|
|
2142
|
+
value: "antigravity",
|
|
2143
|
+
label: "Antigravity"
|
|
1660
2144
|
}
|
|
1661
2145
|
]
|
|
1662
2146
|
});
|
|
1663
2147
|
if (editor === `skip`) return void 0;
|
|
1664
|
-
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
1665
|
-
v.message(`
|
|
1666
|
-
Windsurf is already installed, skipping.`);
|
|
1667
|
-
return void 0;
|
|
1668
|
-
}
|
|
1669
2148
|
if (editor === `cursor`) {
|
|
1670
|
-
|
|
2149
|
+
M.message(
|
|
1671
2150
|
`
|
|
1672
2151
|
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1673
2152
|
`
|
|
1674
2153
|
);
|
|
1675
2154
|
}
|
|
1676
2155
|
if (editor === `cursor-global`) {
|
|
1677
|
-
const
|
|
2156
|
+
const confirm3 = await ve({
|
|
1678
2157
|
message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
|
|
1679
2158
|
options: [
|
|
1680
2159
|
{ value: "yes", label: "Yes, I understand" },
|
|
1681
2160
|
{ value: "skip", label: "No, skip for now" }
|
|
1682
2161
|
]
|
|
1683
2162
|
});
|
|
1684
|
-
if (
|
|
2163
|
+
if (confirm3 !== `yes`) {
|
|
1685
2164
|
return void 0;
|
|
1686
2165
|
}
|
|
1687
2166
|
}
|
|
1688
2167
|
if (editor === `windsurf`) {
|
|
1689
|
-
const
|
|
2168
|
+
const confirm3 = await ve({
|
|
1690
2169
|
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
1691
2170
|
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
1692
2171
|
options: [
|
|
@@ -1694,35 +2173,281 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
1694
2173
|
{ value: "skip", label: "No, skip for now" }
|
|
1695
2174
|
]
|
|
1696
2175
|
});
|
|
1697
|
-
if (
|
|
2176
|
+
if (confirm3 !== `yes`) {
|
|
2177
|
+
return void 0;
|
|
2178
|
+
}
|
|
2179
|
+
}
|
|
2180
|
+
if (editor === `antigravity`) {
|
|
2181
|
+
const confirm3 = await ve({
|
|
2182
|
+
message: `Antigravity only supports a global MCP config (at ${antigravityGlobalMCPConfigPath}). Is it ok to add/update that global config?
|
|
2183
|
+
This will make the Mastra docs MCP server available in all Antigravity projects.`,
|
|
2184
|
+
options: [
|
|
2185
|
+
{ value: "yes", label: "Yes, I understand" },
|
|
2186
|
+
{ value: "skip", label: "No, skip for now" }
|
|
2187
|
+
]
|
|
2188
|
+
});
|
|
2189
|
+
if (confirm3 !== `yes`) {
|
|
1698
2190
|
return void 0;
|
|
1699
2191
|
}
|
|
1700
2192
|
}
|
|
1701
2193
|
return editor;
|
|
2194
|
+
},
|
|
2195
|
+
initGit: async () => {
|
|
2196
|
+
if (skip?.gitInit) return false;
|
|
2197
|
+
return ye({
|
|
2198
|
+
message: "Initialize a new git repository?",
|
|
2199
|
+
initialValue: true
|
|
2200
|
+
});
|
|
1702
2201
|
}
|
|
1703
2202
|
},
|
|
1704
2203
|
{
|
|
1705
2204
|
onCancel: () => {
|
|
1706
|
-
|
|
2205
|
+
xe("Operation cancelled.");
|
|
1707
2206
|
process.exit(0);
|
|
1708
2207
|
}
|
|
1709
2208
|
}
|
|
1710
2209
|
);
|
|
1711
|
-
|
|
1712
|
-
const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
|
|
1713
|
-
return { ...rest, components: mastraComponents };
|
|
2210
|
+
return mastraProject;
|
|
1714
2211
|
};
|
|
1715
|
-
|
|
2212
|
+
function getPackageManager() {
|
|
2213
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
2214
|
+
const execPath = process.env.npm_execpath || "";
|
|
2215
|
+
if (userAgent.includes("bun")) {
|
|
2216
|
+
return "bun";
|
|
2217
|
+
}
|
|
2218
|
+
if (userAgent.includes("yarn")) {
|
|
2219
|
+
return "yarn";
|
|
2220
|
+
}
|
|
2221
|
+
if (userAgent.includes("pnpm")) {
|
|
2222
|
+
return "pnpm";
|
|
2223
|
+
}
|
|
2224
|
+
if (userAgent.includes("npm")) {
|
|
2225
|
+
return "npm";
|
|
2226
|
+
}
|
|
2227
|
+
if (execPath.includes("bun")) {
|
|
2228
|
+
return "bun";
|
|
2229
|
+
}
|
|
2230
|
+
if (execPath.includes("yarn")) {
|
|
2231
|
+
return "yarn";
|
|
2232
|
+
}
|
|
2233
|
+
if (execPath.includes("pnpm")) {
|
|
2234
|
+
return "pnpm";
|
|
2235
|
+
}
|
|
2236
|
+
if (execPath.includes("npm")) {
|
|
2237
|
+
return "npm";
|
|
2238
|
+
}
|
|
2239
|
+
return "npm";
|
|
2240
|
+
}
|
|
2241
|
+
async function gitInit({ cwd }) {
|
|
2242
|
+
await execa("git", ["init"], { cwd, stdio: "ignore" });
|
|
2243
|
+
await execa("git", ["add", "-A"], { cwd, stdio: "ignore" });
|
|
2244
|
+
await execa(
|
|
2245
|
+
"git",
|
|
2246
|
+
[
|
|
2247
|
+
"commit",
|
|
2248
|
+
"-m",
|
|
2249
|
+
'"Initial commit from Mastra"',
|
|
2250
|
+
'--author="dane-ai-mastra[bot] <dane-ai-mastra[bot]@users.noreply.github.com>"'
|
|
2251
|
+
],
|
|
2252
|
+
{ cwd, stdio: "ignore" }
|
|
2253
|
+
);
|
|
2254
|
+
}
|
|
2255
|
+
var logger = createLogger(false);
|
|
2256
|
+
function createLogger(debug = false) {
|
|
2257
|
+
return new PinoLogger({
|
|
2258
|
+
name: "Mastra CLI",
|
|
2259
|
+
level: debug ? "debug" : "info"
|
|
2260
|
+
});
|
|
2261
|
+
}
|
|
1716
2262
|
var exec2 = util.promisify(child_process.exec);
|
|
2263
|
+
async function cloneTemplate(options) {
|
|
2264
|
+
const { template, projectName, targetDir, branch, llmProvider } = options;
|
|
2265
|
+
const projectPath = targetDir ? path3.resolve(targetDir, projectName) : path3.resolve(projectName);
|
|
2266
|
+
const spinner4 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
|
|
2267
|
+
try {
|
|
2268
|
+
if (await directoryExists(projectPath)) {
|
|
2269
|
+
spinner4.error(`Directory ${projectName} already exists`);
|
|
2270
|
+
throw new Error(`Directory ${projectName} already exists`);
|
|
2271
|
+
}
|
|
2272
|
+
await cloneRepositoryWithoutGit(template.githubUrl, projectPath, branch);
|
|
2273
|
+
await updatePackageJson(projectPath, projectName);
|
|
2274
|
+
const envExamplePath = path3.join(projectPath, ".env.example");
|
|
2275
|
+
if (await fileExists(envExamplePath)) {
|
|
2276
|
+
const envPath = path3.join(projectPath, ".env");
|
|
2277
|
+
await fs4.copyFile(envExamplePath, envPath);
|
|
2278
|
+
if (llmProvider) {
|
|
2279
|
+
await updateEnvFile(envPath, llmProvider);
|
|
2280
|
+
}
|
|
2281
|
+
}
|
|
2282
|
+
spinner4.success(`Template "${template.title}" cloned successfully to ${projectName}`);
|
|
2283
|
+
return projectPath;
|
|
2284
|
+
} catch (error) {
|
|
2285
|
+
spinner4.error(`Failed to clone template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2286
|
+
throw error;
|
|
2287
|
+
}
|
|
2288
|
+
}
|
|
2289
|
+
async function directoryExists(dirPath) {
|
|
2290
|
+
try {
|
|
2291
|
+
const stat = await fs4.stat(dirPath);
|
|
2292
|
+
return stat.isDirectory();
|
|
2293
|
+
} catch {
|
|
2294
|
+
return false;
|
|
2295
|
+
}
|
|
2296
|
+
}
|
|
2297
|
+
async function fileExists(filePath) {
|
|
2298
|
+
try {
|
|
2299
|
+
const stat = await fs4.stat(filePath);
|
|
2300
|
+
return stat.isFile();
|
|
2301
|
+
} catch {
|
|
2302
|
+
return false;
|
|
2303
|
+
}
|
|
2304
|
+
}
|
|
2305
|
+
async function cloneRepositoryWithoutGit(repoUrl, targetPath, branch) {
|
|
2306
|
+
await fs4.mkdir(targetPath, { recursive: true });
|
|
2307
|
+
try {
|
|
2308
|
+
const degitRepo = repoUrl.replace("https://github.com/", "");
|
|
2309
|
+
const degitRepoWithBranch = branch ? `${degitRepo}#${branch}` : degitRepo;
|
|
2310
|
+
const degitCommand = shellQuote2.quote(["npx", "degit", degitRepoWithBranch, targetPath]);
|
|
2311
|
+
await exec2(degitCommand, {
|
|
2312
|
+
cwd: process.cwd()
|
|
2313
|
+
});
|
|
2314
|
+
} catch {
|
|
2315
|
+
try {
|
|
2316
|
+
const gitArgs = ["git", "clone"];
|
|
2317
|
+
if (branch) {
|
|
2318
|
+
gitArgs.push("--branch", branch);
|
|
2319
|
+
}
|
|
2320
|
+
gitArgs.push(repoUrl, targetPath);
|
|
2321
|
+
const gitCommand = shellQuote2.quote(gitArgs);
|
|
2322
|
+
await exec2(gitCommand, {
|
|
2323
|
+
cwd: process.cwd()
|
|
2324
|
+
});
|
|
2325
|
+
const gitDir = path3.join(targetPath, ".git");
|
|
2326
|
+
if (await directoryExists(gitDir)) {
|
|
2327
|
+
await fs4.rm(gitDir, { recursive: true, force: true });
|
|
2328
|
+
}
|
|
2329
|
+
} catch (gitError) {
|
|
2330
|
+
throw new Error(`Failed to clone repository: ${gitError instanceof Error ? gitError.message : "Unknown error"}`);
|
|
2331
|
+
}
|
|
2332
|
+
}
|
|
2333
|
+
}
|
|
2334
|
+
async function updatePackageJson(projectPath, projectName) {
|
|
2335
|
+
const packageJsonPath = path3.join(projectPath, "package.json");
|
|
2336
|
+
try {
|
|
2337
|
+
const packageJsonContent = await fs4.readFile(packageJsonPath, "utf-8");
|
|
2338
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2339
|
+
packageJson.name = projectName;
|
|
2340
|
+
await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), "utf-8");
|
|
2341
|
+
} catch (error) {
|
|
2342
|
+
logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2343
|
+
}
|
|
2344
|
+
}
|
|
2345
|
+
async function updateEnvFile(envPath, llmProvider) {
|
|
2346
|
+
try {
|
|
2347
|
+
const envContent = await fs4.readFile(envPath, "utf-8");
|
|
2348
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
2349
|
+
if (!modelString) {
|
|
2350
|
+
logger.warn(`Could not get model identifier for provider: ${llmProvider}`);
|
|
2351
|
+
return;
|
|
2352
|
+
}
|
|
2353
|
+
const modelValue = modelString.replace(/'/g, "");
|
|
2354
|
+
const updatedContent = envContent.replace(/^MODEL=.*/m, `MODEL=${modelValue}`);
|
|
2355
|
+
await fs4.writeFile(envPath, updatedContent, "utf-8");
|
|
2356
|
+
logger.info(`Updated MODEL in .env to ${modelValue}`);
|
|
2357
|
+
} catch (error) {
|
|
2358
|
+
logger.warn(`Could not update .env file: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2359
|
+
}
|
|
2360
|
+
}
|
|
2361
|
+
async function installDependencies(projectPath, packageManager) {
|
|
2362
|
+
const spinner4 = yoctoSpinner({ text: "Installing dependencies..." }).start();
|
|
2363
|
+
try {
|
|
2364
|
+
const pm = packageManager || getPackageManager();
|
|
2365
|
+
const installCommand = shellQuote2.quote([pm, "install"]);
|
|
2366
|
+
await exec2(installCommand, {
|
|
2367
|
+
cwd: projectPath
|
|
2368
|
+
});
|
|
2369
|
+
spinner4.success("Dependencies installed successfully");
|
|
2370
|
+
} catch (error) {
|
|
2371
|
+
spinner4.error(`Failed to install dependencies: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2372
|
+
throw error;
|
|
2373
|
+
}
|
|
2374
|
+
}
|
|
2375
|
+
var TEMPLATES_API_URL = process.env.MASTRA_TEMPLATES_API_URL || "https://mastra.ai/api/templates.json";
|
|
2376
|
+
async function loadTemplates() {
|
|
2377
|
+
try {
|
|
2378
|
+
const response = await fetch(TEMPLATES_API_URL);
|
|
2379
|
+
if (!response.ok) {
|
|
2380
|
+
throw new Error(`Failed to fetch templates: ${response.statusText}`);
|
|
2381
|
+
}
|
|
2382
|
+
const templates = await response.json();
|
|
2383
|
+
return templates;
|
|
2384
|
+
} catch (error) {
|
|
2385
|
+
console.error("Error loading templates:", error);
|
|
2386
|
+
throw new Error("Failed to load templates. Please check your internet connection and try again.");
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
2389
|
+
function pluralize(count, singular, plural) {
|
|
2390
|
+
return count === 1 ? singular : plural || `${singular}s`;
|
|
2391
|
+
}
|
|
2392
|
+
async function selectTemplate(templates) {
|
|
2393
|
+
const choices = templates.map((template) => {
|
|
2394
|
+
const parts = [];
|
|
2395
|
+
if (template.agents?.length) {
|
|
2396
|
+
parts.push(`${template.agents.length} ${pluralize(template.agents.length, "agent")}`);
|
|
2397
|
+
}
|
|
2398
|
+
if (template.tools?.length) {
|
|
2399
|
+
parts.push(`${template.tools.length} ${pluralize(template.tools.length, "tool")}`);
|
|
2400
|
+
}
|
|
2401
|
+
if (template.workflows?.length) {
|
|
2402
|
+
parts.push(`${template.workflows.length} ${pluralize(template.workflows.length, "workflow")}`);
|
|
2403
|
+
}
|
|
2404
|
+
if (template.mcp?.length) {
|
|
2405
|
+
parts.push(`${template.mcp.length} ${pluralize(template.mcp.length, "MCP server")}`);
|
|
2406
|
+
}
|
|
2407
|
+
if (template.networks?.length) {
|
|
2408
|
+
parts.push(`${template.networks.length} ${pluralize(template.networks.length, "agent network")}`);
|
|
2409
|
+
}
|
|
2410
|
+
return {
|
|
2411
|
+
value: template,
|
|
2412
|
+
label: template.title,
|
|
2413
|
+
hint: parts.join(", ") || "Template components"
|
|
2414
|
+
};
|
|
2415
|
+
});
|
|
2416
|
+
const selected = await ve({
|
|
2417
|
+
message: "Select a template:",
|
|
2418
|
+
options: choices
|
|
2419
|
+
});
|
|
2420
|
+
if (pD(selected)) {
|
|
2421
|
+
return null;
|
|
2422
|
+
}
|
|
2423
|
+
return selected;
|
|
2424
|
+
}
|
|
2425
|
+
function findTemplateByName(templates, templateName) {
|
|
2426
|
+
let template = templates.find((t) => t.slug === templateName);
|
|
2427
|
+
if (template) return template;
|
|
2428
|
+
const slugWithPrefix = `template-${templateName}`;
|
|
2429
|
+
template = templates.find((t) => t.slug === slugWithPrefix);
|
|
2430
|
+
if (template) return template;
|
|
2431
|
+
template = templates.find((t) => t.title.toLowerCase() === templateName.toLowerCase());
|
|
2432
|
+
if (template) return template;
|
|
2433
|
+
return null;
|
|
2434
|
+
}
|
|
2435
|
+
function getDefaultProjectName(template) {
|
|
2436
|
+
return template.slug.replace(/^template-/, "");
|
|
2437
|
+
}
|
|
2438
|
+
var s = Y();
|
|
1717
2439
|
var init = async ({
|
|
1718
|
-
directory,
|
|
1719
|
-
addExample = false,
|
|
2440
|
+
directory = "src/",
|
|
1720
2441
|
components,
|
|
1721
2442
|
llmProvider = "openai",
|
|
1722
2443
|
llmApiKey,
|
|
1723
|
-
|
|
2444
|
+
addExample = false,
|
|
2445
|
+
configureEditorWithDocsMCP,
|
|
2446
|
+
versionTag,
|
|
2447
|
+
initGit = false
|
|
1724
2448
|
}) => {
|
|
1725
2449
|
s.start("Initializing Mastra");
|
|
2450
|
+
const packageVersionTag = versionTag ? `@${versionTag}` : "";
|
|
1726
2451
|
try {
|
|
1727
2452
|
const result = await createMastraDir(directory);
|
|
1728
2453
|
if (!result.ok) {
|
|
@@ -1735,7 +2460,8 @@ var init = async ({
|
|
|
1735
2460
|
dirPath,
|
|
1736
2461
|
addExample,
|
|
1737
2462
|
addWorkflow: components.includes("workflows"),
|
|
1738
|
-
addAgent: components.includes("agents")
|
|
2463
|
+
addAgent: components.includes("agents"),
|
|
2464
|
+
addScorers: components.includes("scorers")
|
|
1739
2465
|
}),
|
|
1740
2466
|
...components.map((component) => createComponentsDir(dirPath, component)),
|
|
1741
2467
|
writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
|
|
@@ -1749,35 +2475,53 @@ var init = async ({
|
|
|
1749
2475
|
const depService = new DepsService();
|
|
1750
2476
|
const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
|
|
1751
2477
|
if (needsLibsql) {
|
|
1752
|
-
await depService.installPackages([
|
|
2478
|
+
await depService.installPackages([`@mastra/libsql${packageVersionTag}`]);
|
|
1753
2479
|
}
|
|
1754
2480
|
const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
|
|
1755
2481
|
if (needsMemory) {
|
|
1756
|
-
await depService.installPackages([
|
|
2482
|
+
await depService.installPackages([`@mastra/memory${packageVersionTag}`]);
|
|
2483
|
+
}
|
|
2484
|
+
const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
|
|
2485
|
+
if (needsLoggers) {
|
|
2486
|
+
await depService.installPackages([`@mastra/loggers${packageVersionTag}`]);
|
|
2487
|
+
}
|
|
2488
|
+
const needsObservability = await depService.checkDependencies(["@mastra/observability"]) !== `ok`;
|
|
2489
|
+
if (needsObservability) {
|
|
2490
|
+
await depService.installPackages([`@mastra/observability${packageVersionTag}`]);
|
|
2491
|
+
}
|
|
2492
|
+
const needsEvals = components.includes(`scorers`) && await depService.checkDependencies(["@mastra/evals"]) !== `ok`;
|
|
2493
|
+
if (needsEvals) {
|
|
2494
|
+
await depService.installPackages([`@mastra/evals${packageVersionTag}`]);
|
|
1757
2495
|
}
|
|
1758
2496
|
}
|
|
1759
2497
|
const key = await getAPIKey(llmProvider || "openai");
|
|
1760
|
-
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
1761
|
-
const depsService = new DepsService();
|
|
1762
|
-
const pm = depsService.packageManager;
|
|
1763
|
-
const installCommand = getPackageManagerInstallCommand(pm);
|
|
1764
|
-
await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
|
|
1765
2498
|
if (configureEditorWithDocsMCP) {
|
|
1766
2499
|
await installMastraDocsMCPServer({
|
|
1767
2500
|
editor: configureEditorWithDocsMCP,
|
|
1768
|
-
directory: process.cwd()
|
|
2501
|
+
directory: process.cwd(),
|
|
2502
|
+
versionTag
|
|
1769
2503
|
});
|
|
1770
2504
|
}
|
|
1771
2505
|
s.stop();
|
|
2506
|
+
if (initGit) {
|
|
2507
|
+
const s2 = Y();
|
|
2508
|
+
try {
|
|
2509
|
+
s2.start("Initializing git repository");
|
|
2510
|
+
await gitInit({ cwd: process.cwd() });
|
|
2511
|
+
s2.stop("Git repository initialized");
|
|
2512
|
+
} catch {
|
|
2513
|
+
s2.stop();
|
|
2514
|
+
}
|
|
2515
|
+
}
|
|
1772
2516
|
if (!llmApiKey) {
|
|
1773
|
-
|
|
2517
|
+
Me(`
|
|
1774
2518
|
${color2.green("Mastra initialized successfully!")}
|
|
1775
2519
|
|
|
1776
2520
|
Add your ${color2.cyan(key)} as an environment variable
|
|
1777
|
-
in your ${color2.cyan(".env
|
|
2521
|
+
in your ${color2.cyan(".env")} file
|
|
1778
2522
|
`);
|
|
1779
2523
|
} else {
|
|
1780
|
-
|
|
2524
|
+
Me(`
|
|
1781
2525
|
${color2.green("Mastra initialized successfully!")}
|
|
1782
2526
|
`);
|
|
1783
2527
|
}
|
|
@@ -1811,69 +2555,165 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
1811
2555
|
throw error;
|
|
1812
2556
|
}
|
|
1813
2557
|
} catch (error) {
|
|
1814
|
-
console.error(error);
|
|
1815
2558
|
throw error;
|
|
1816
2559
|
}
|
|
1817
2560
|
};
|
|
2561
|
+
async function getInitCommand(pm) {
|
|
2562
|
+
switch (pm) {
|
|
2563
|
+
case "npm":
|
|
2564
|
+
return "npm init -y";
|
|
2565
|
+
case "pnpm":
|
|
2566
|
+
return "pnpm init";
|
|
2567
|
+
case "yarn":
|
|
2568
|
+
return "yarn init -y";
|
|
2569
|
+
case "bun":
|
|
2570
|
+
return "bun init -y";
|
|
2571
|
+
default:
|
|
2572
|
+
return "npm init -y";
|
|
2573
|
+
}
|
|
2574
|
+
}
|
|
2575
|
+
async function initializePackageJson(pm) {
|
|
2576
|
+
const initCommand = await getInitCommand(pm);
|
|
2577
|
+
await exec3(initCommand);
|
|
2578
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
2579
|
+
const packageJson = JSON.parse(await fs4.readFile(packageJsonPath, "utf-8"));
|
|
2580
|
+
packageJson.type = "module";
|
|
2581
|
+
packageJson.engines = {
|
|
2582
|
+
...packageJson.engines,
|
|
2583
|
+
node: ">=22.13.0"
|
|
2584
|
+
};
|
|
2585
|
+
await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
2586
|
+
}
|
|
2587
|
+
var writeReadmeFile = async ({ dirPath, projectName }) => {
|
|
2588
|
+
const packageManager = getPackageManager();
|
|
2589
|
+
const readmePath = path3.join(dirPath, "README.md");
|
|
2590
|
+
const content = `# ${projectName}
|
|
2591
|
+
|
|
2592
|
+
Welcome to your new [Mastra](https://mastra.ai/) project! We're excited to see what you'll build.
|
|
2593
|
+
|
|
2594
|
+
## Getting Started
|
|
2595
|
+
|
|
2596
|
+
Start the development server:
|
|
2597
|
+
|
|
2598
|
+
\`\`\`shell
|
|
2599
|
+
${packageManager} run dev
|
|
2600
|
+
\`\`\`
|
|
2601
|
+
|
|
2602
|
+
Open [http://localhost:4111](http://localhost:4111) in your browser to access [Mastra Studio](https://mastra.ai/docs/v1/getting-started/studio). It provides an interactive UI for building and testing your agents, along with a REST API that exposes your Mastra application as a local service. This lets you start building without worrying about integration right away.
|
|
2603
|
+
|
|
2604
|
+
You can start editing files inside the \`src/mastra\` directory. The development server will automatically reload whenever you make changes.
|
|
2605
|
+
|
|
2606
|
+
## Learn more
|
|
2607
|
+
|
|
2608
|
+
To learn more about Mastra, visit our [documentation](https://mastra.ai/docs/v1/). Your bootstrapped project includes example code for [agents](https://mastra.ai/docs/v1/agents/overview), [tools](https://mastra.ai/docs/v1/agents/using-tools), [workflows](https://mastra.ai/docs/v1/workflows/overview), [scorers](https://mastra.ai/docs/v1/evals/overview), and [observability](https://mastra.ai/docs/v1/observability/overview).
|
|
2609
|
+
|
|
2610
|
+
If you're new to AI agents, check out our [course](https://mastra.ai/course) and [YouTube videos](https://youtube.com/@mastra-ai). You can also join our [Discord](https://discord.gg/BTYqqHKUrf) community to get help and share your projects.
|
|
2611
|
+
|
|
2612
|
+
## Deploy on Mastra Cloud
|
|
2613
|
+
|
|
2614
|
+
[Mastra Cloud](https://cloud.mastra.ai/) gives you a serverless agent environment with atomic deployments. Access your agents from anywhere and monitor performance. Make sure they don't go off the rails with evals and tracing.
|
|
2615
|
+
|
|
2616
|
+
Check out the [deployment guide](https://mastra.ai/docs/v1/deployment/overview) for more details.`;
|
|
2617
|
+
const formattedContent = await prettier.format(content, {
|
|
2618
|
+
parser: "markdown",
|
|
2619
|
+
singleQuote: true
|
|
2620
|
+
});
|
|
2621
|
+
await fs4.writeFile(readmePath, formattedContent);
|
|
2622
|
+
};
|
|
1818
2623
|
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
1819
|
-
let installCommand =
|
|
2624
|
+
let installCommand = getPackageManagerAddCommand(pm);
|
|
1820
2625
|
if (isDev) {
|
|
1821
|
-
installCommand = `${installCommand}
|
|
2626
|
+
installCommand = `${installCommand} -D`;
|
|
1822
2627
|
}
|
|
1823
2628
|
try {
|
|
1824
2629
|
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
1825
2630
|
} catch (err) {
|
|
1826
|
-
console.log("err", err);
|
|
1827
2631
|
if (versionTag === "@latest") {
|
|
1828
|
-
throw
|
|
2632
|
+
throw new Error(
|
|
2633
|
+
`Failed to install ${dependency}@latest: ${err instanceof Error ? err.message : "Unknown error"}`
|
|
2634
|
+
);
|
|
2635
|
+
}
|
|
2636
|
+
try {
|
|
2637
|
+
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
2638
|
+
} catch (fallbackErr) {
|
|
2639
|
+
throw new Error(
|
|
2640
|
+
`Failed to install ${dependency} (tried ${versionTag} and @latest): ${fallbackErr instanceof Error ? fallbackErr.message : "Unknown error"}`
|
|
2641
|
+
);
|
|
1829
2642
|
}
|
|
1830
|
-
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
1831
2643
|
}
|
|
1832
2644
|
}
|
|
1833
2645
|
var createMastraProject = async ({
|
|
1834
2646
|
projectName: name,
|
|
1835
2647
|
createVersionTag,
|
|
1836
|
-
timeout
|
|
2648
|
+
timeout,
|
|
2649
|
+
llmProvider,
|
|
2650
|
+
llmApiKey,
|
|
2651
|
+
needsInteractive
|
|
1837
2652
|
}) => {
|
|
1838
|
-
|
|
1839
|
-
const projectName = name ?? await
|
|
2653
|
+
Ie(color2.inverse(" Mastra Create "));
|
|
2654
|
+
const projectName = name ?? await he({
|
|
1840
2655
|
message: "What do you want to name your project?",
|
|
1841
2656
|
placeholder: "my-mastra-app",
|
|
1842
|
-
defaultValue: "my-mastra-app"
|
|
2657
|
+
defaultValue: "my-mastra-app",
|
|
2658
|
+
validate: (value) => {
|
|
2659
|
+
if (value.length === 0) return "Project name cannot be empty";
|
|
2660
|
+
if (fs3__default__default.existsSync(value)) {
|
|
2661
|
+
return `A directory named "${value}" already exists. Please choose a different name.`;
|
|
2662
|
+
}
|
|
2663
|
+
}
|
|
1843
2664
|
});
|
|
1844
|
-
if (
|
|
1845
|
-
|
|
2665
|
+
if (pD(projectName)) {
|
|
2666
|
+
xe("Operation cancelled");
|
|
1846
2667
|
process.exit(0);
|
|
1847
2668
|
}
|
|
1848
|
-
|
|
1849
|
-
|
|
2669
|
+
let result = void 0;
|
|
2670
|
+
if (needsInteractive) {
|
|
2671
|
+
result = await interactivePrompt({
|
|
2672
|
+
options: { showBanner: false },
|
|
2673
|
+
skip: { llmProvider: llmProvider !== void 0, llmApiKey: llmApiKey !== void 0 }
|
|
2674
|
+
});
|
|
2675
|
+
}
|
|
2676
|
+
const s2 = Y();
|
|
2677
|
+
const originalCwd = process.cwd();
|
|
2678
|
+
let projectPath = null;
|
|
1850
2679
|
try {
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
2680
|
+
s2.start("Creating project");
|
|
2681
|
+
try {
|
|
2682
|
+
await fs4.mkdir(projectName);
|
|
2683
|
+
projectPath = path3.resolve(originalCwd, projectName);
|
|
2684
|
+
} catch (error) {
|
|
2685
|
+
if (error instanceof Error && "code" in error && error.code === "EEXIST") {
|
|
2686
|
+
s2.stop(`A directory named "${projectName}" already exists. Please choose a different name.`);
|
|
2687
|
+
process.exit(1);
|
|
2688
|
+
}
|
|
2689
|
+
throw new Error(
|
|
2690
|
+
`Failed to create project directory: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
1856
2691
|
);
|
|
1857
|
-
process.exit(1);
|
|
1858
2692
|
}
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
2693
|
+
process.chdir(projectName);
|
|
2694
|
+
const pm = getPackageManager();
|
|
2695
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
2696
|
+
s2.message("Initializing project structure");
|
|
2697
|
+
try {
|
|
2698
|
+
await initializePackageJson(pm);
|
|
2699
|
+
const depsService = new DepsService();
|
|
2700
|
+
await depsService.addScriptsToPackageJson({
|
|
2701
|
+
dev: "mastra dev",
|
|
2702
|
+
build: "mastra build",
|
|
2703
|
+
start: "mastra start"
|
|
2704
|
+
});
|
|
2705
|
+
await writeReadmeFile({ dirPath: process.cwd(), projectName });
|
|
2706
|
+
} catch (error) {
|
|
2707
|
+
throw new Error(
|
|
2708
|
+
`Failed to initialize project structure: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2709
|
+
);
|
|
2710
|
+
}
|
|
2711
|
+
s2.stop("Project structure created");
|
|
2712
|
+
s2.start(`Installing ${pm} dependencies`);
|
|
2713
|
+
try {
|
|
2714
|
+
await exec3(`${pm} ${installCommand} zod@^4`);
|
|
2715
|
+
await exec3(`${pm} ${installCommand} -D typescript @types/node`);
|
|
2716
|
+
await exec3(`echo '{
|
|
1877
2717
|
"compilerOptions": {
|
|
1878
2718
|
"target": "ES2022",
|
|
1879
2719
|
"module": "ES2022",
|
|
@@ -1889,78 +2729,340 @@ var createMastraProject = async ({
|
|
|
1889
2729
|
"src/**/*"
|
|
1890
2730
|
]
|
|
1891
2731
|
}' > tsconfig.json`);
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
2732
|
+
} catch (error) {
|
|
2733
|
+
throw new Error(
|
|
2734
|
+
`Failed to install basic dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2735
|
+
);
|
|
2736
|
+
}
|
|
2737
|
+
s2.stop(`${pm} dependencies installed`);
|
|
2738
|
+
s2.start("Installing Mastra CLI");
|
|
2739
|
+
const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
|
|
2740
|
+
try {
|
|
2741
|
+
await installMastraDependency(pm, "mastra", versionTag, true, timeout);
|
|
2742
|
+
} catch (error) {
|
|
2743
|
+
throw new Error(`Failed to install Mastra CLI: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2744
|
+
}
|
|
2745
|
+
s2.stop("Mastra CLI installed");
|
|
2746
|
+
s2.start("Installing Mastra dependencies");
|
|
2747
|
+
try {
|
|
2748
|
+
await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
|
|
2749
|
+
await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
|
|
2750
|
+
await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
|
|
2751
|
+
} catch (error) {
|
|
2752
|
+
throw new Error(
|
|
2753
|
+
`Failed to install Mastra dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2754
|
+
);
|
|
2755
|
+
}
|
|
2756
|
+
s2.stop("Mastra dependencies installed");
|
|
2757
|
+
s2.start("Adding .gitignore");
|
|
2758
|
+
try {
|
|
2759
|
+
await exec3(`echo output.txt >> .gitignore`);
|
|
2760
|
+
await exec3(`echo node_modules >> .gitignore`);
|
|
2761
|
+
await exec3(`echo dist >> .gitignore`);
|
|
2762
|
+
await exec3(`echo .mastra >> .gitignore`);
|
|
2763
|
+
await exec3(`echo .env.development >> .gitignore`);
|
|
2764
|
+
await exec3(`echo .env >> .gitignore`);
|
|
2765
|
+
await exec3(`echo *.db >> .gitignore`);
|
|
2766
|
+
await exec3(`echo *.db-* >> .gitignore`);
|
|
2767
|
+
} catch (error) {
|
|
2768
|
+
throw new Error(`Failed to create .gitignore: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2769
|
+
}
|
|
2770
|
+
s2.stop(".gitignore added");
|
|
2771
|
+
Se("Project created successfully");
|
|
2772
|
+
console.info("");
|
|
2773
|
+
return { projectName, result };
|
|
2774
|
+
} catch (error) {
|
|
2775
|
+
s2.stop();
|
|
2776
|
+
const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred";
|
|
2777
|
+
xe(`Project creation failed: ${errorMessage}`);
|
|
2778
|
+
if (projectPath && fs3__default__default.existsSync(projectPath)) {
|
|
2779
|
+
try {
|
|
2780
|
+
process.chdir(originalCwd);
|
|
2781
|
+
await fs4.rm(projectPath, { recursive: true, force: true });
|
|
2782
|
+
} catch (cleanupError) {
|
|
2783
|
+
console.error(
|
|
2784
|
+
`Warning: Failed to clean up project directory: ${cleanupError instanceof Error ? cleanupError.message : "Unknown error"}`
|
|
2785
|
+
);
|
|
2786
|
+
}
|
|
2787
|
+
}
|
|
2788
|
+
process.exit(1);
|
|
2789
|
+
}
|
|
1915
2790
|
};
|
|
1916
|
-
var
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
2791
|
+
var version$1 = package_default.version;
|
|
2792
|
+
var create = async (args) => {
|
|
2793
|
+
if (args.template !== void 0) {
|
|
2794
|
+
await createFromTemplate({
|
|
2795
|
+
projectName: args.projectName,
|
|
2796
|
+
template: args.template,
|
|
2797
|
+
timeout: args.timeout,
|
|
2798
|
+
injectedAnalytics: args.analytics,
|
|
2799
|
+
llmProvider: args.llmProvider
|
|
2800
|
+
});
|
|
2801
|
+
return;
|
|
2802
|
+
}
|
|
2803
|
+
const needsInteractive = args.components === void 0 || args.llmProvider === void 0 || args.addExample === void 0;
|
|
2804
|
+
const { projectName, result } = await createMastraProject({
|
|
2805
|
+
projectName: args?.projectName,
|
|
2806
|
+
createVersionTag: args?.createVersionTag,
|
|
2807
|
+
timeout: args?.timeout,
|
|
2808
|
+
llmProvider: args?.llmProvider,
|
|
2809
|
+
llmApiKey: args?.llmApiKey,
|
|
2810
|
+
needsInteractive
|
|
1921
2811
|
});
|
|
1922
|
-
const directory =
|
|
1923
|
-
if (
|
|
1924
|
-
const result = await interactivePrompt();
|
|
2812
|
+
const directory = args.directory || "src/";
|
|
2813
|
+
if (needsInteractive && result) {
|
|
1925
2814
|
await init({
|
|
1926
2815
|
...result,
|
|
1927
|
-
llmApiKey: result?.llmApiKey
|
|
2816
|
+
llmApiKey: result?.llmApiKey,
|
|
2817
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
2818
|
+
addExample: true,
|
|
2819
|
+
versionTag: args.createVersionTag
|
|
1928
2820
|
});
|
|
1929
2821
|
postCreate({ projectName });
|
|
1930
2822
|
return;
|
|
1931
2823
|
}
|
|
1932
|
-
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } =
|
|
2824
|
+
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
|
|
1933
2825
|
await init({
|
|
1934
2826
|
directory,
|
|
1935
2827
|
components,
|
|
1936
2828
|
llmProvider,
|
|
1937
2829
|
addExample,
|
|
1938
|
-
llmApiKey
|
|
2830
|
+
llmApiKey,
|
|
2831
|
+
configureEditorWithDocsMCP: args.mcpServer,
|
|
2832
|
+
versionTag: args.createVersionTag
|
|
1939
2833
|
});
|
|
1940
2834
|
postCreate({ projectName });
|
|
1941
2835
|
};
|
|
1942
2836
|
var postCreate = ({ projectName }) => {
|
|
1943
|
-
|
|
2837
|
+
const packageManager = getPackageManager();
|
|
2838
|
+
Se(`
|
|
1944
2839
|
${color2.green("To start your project:")}
|
|
1945
2840
|
|
|
1946
2841
|
${color2.cyan("cd")} ${projectName}
|
|
1947
|
-
${color2.cyan(
|
|
2842
|
+
${color2.cyan(`${packageManager} run dev`)}
|
|
1948
2843
|
`);
|
|
1949
2844
|
};
|
|
2845
|
+
function isGitHubUrl(url) {
|
|
2846
|
+
try {
|
|
2847
|
+
const parsedUrl = new URL(url);
|
|
2848
|
+
return parsedUrl.hostname === "github.com" && parsedUrl.pathname.split("/").length >= 3;
|
|
2849
|
+
} catch {
|
|
2850
|
+
return false;
|
|
2851
|
+
}
|
|
2852
|
+
}
|
|
2853
|
+
async function validateGitHubProject(githubUrl) {
|
|
2854
|
+
const errors = [];
|
|
2855
|
+
try {
|
|
2856
|
+
const urlParts = new URL(githubUrl).pathname.split("/").filter(Boolean);
|
|
2857
|
+
const owner = urlParts[0];
|
|
2858
|
+
const repo = urlParts[1]?.replace(".git", "");
|
|
2859
|
+
if (!owner || !repo) {
|
|
2860
|
+
throw new Error("Invalid GitHub URL format");
|
|
2861
|
+
}
|
|
2862
|
+
const branches = ["main", "master"];
|
|
2863
|
+
let packageJsonContent = null;
|
|
2864
|
+
let indexContent = null;
|
|
2865
|
+
for (const branch of branches) {
|
|
2866
|
+
try {
|
|
2867
|
+
const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/package.json`;
|
|
2868
|
+
const packageJsonResponse = await fetch(packageJsonUrl);
|
|
2869
|
+
if (packageJsonResponse.ok) {
|
|
2870
|
+
packageJsonContent = await packageJsonResponse.text();
|
|
2871
|
+
const indexUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/src/mastra/index.ts`;
|
|
2872
|
+
const indexResponse = await fetch(indexUrl);
|
|
2873
|
+
if (indexResponse.ok) {
|
|
2874
|
+
indexContent = await indexResponse.text();
|
|
2875
|
+
}
|
|
2876
|
+
break;
|
|
2877
|
+
}
|
|
2878
|
+
} catch {
|
|
2879
|
+
}
|
|
2880
|
+
}
|
|
2881
|
+
if (!packageJsonContent) {
|
|
2882
|
+
errors.push("Could not fetch package.json from repository");
|
|
2883
|
+
return { isValid: false, errors };
|
|
2884
|
+
}
|
|
2885
|
+
try {
|
|
2886
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2887
|
+
const hasMastraCore = packageJson.dependencies?.["@mastra/core"] || packageJson.devDependencies?.["@mastra/core"] || packageJson.peerDependencies?.["@mastra/core"];
|
|
2888
|
+
if (!hasMastraCore) {
|
|
2889
|
+
errors.push("Missing @mastra/core dependency in package.json");
|
|
2890
|
+
}
|
|
2891
|
+
} catch {
|
|
2892
|
+
errors.push("Invalid package.json format");
|
|
2893
|
+
}
|
|
2894
|
+
if (!indexContent) {
|
|
2895
|
+
errors.push("Missing src/mastra/index.ts file");
|
|
2896
|
+
} else {
|
|
2897
|
+
const hasMastraExport = indexContent.includes("export") && (indexContent.includes("new Mastra") || indexContent.includes("Mastra("));
|
|
2898
|
+
if (!hasMastraExport) {
|
|
2899
|
+
errors.push("src/mastra/index.ts does not export a Mastra instance");
|
|
2900
|
+
}
|
|
2901
|
+
}
|
|
2902
|
+
return { isValid: errors.length === 0, errors };
|
|
2903
|
+
} catch (error) {
|
|
2904
|
+
errors.push(`Failed to validate GitHub repository: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2905
|
+
return { isValid: false, errors };
|
|
2906
|
+
}
|
|
2907
|
+
}
|
|
2908
|
+
async function createFromGitHubUrl(url) {
|
|
2909
|
+
const urlParts = new URL(url).pathname.split("/").filter(Boolean);
|
|
2910
|
+
const owner = urlParts[0] || "unknown";
|
|
2911
|
+
const repo = urlParts[1] || "unknown";
|
|
2912
|
+
return {
|
|
2913
|
+
githubUrl: url,
|
|
2914
|
+
title: `${owner}/${repo}`,
|
|
2915
|
+
slug: repo,
|
|
2916
|
+
agents: [],
|
|
2917
|
+
mcp: [],
|
|
2918
|
+
tools: [],
|
|
2919
|
+
networks: [],
|
|
2920
|
+
workflows: []
|
|
2921
|
+
};
|
|
2922
|
+
}
|
|
2923
|
+
async function createFromTemplate(args) {
|
|
2924
|
+
let selectedTemplate;
|
|
2925
|
+
if (args.template === true) {
|
|
2926
|
+
const templates = await loadTemplates();
|
|
2927
|
+
const selected = await selectTemplate(templates);
|
|
2928
|
+
if (!selected) {
|
|
2929
|
+
M.info("No template selected. Exiting.");
|
|
2930
|
+
return;
|
|
2931
|
+
}
|
|
2932
|
+
selectedTemplate = selected;
|
|
2933
|
+
} else if (args.template && typeof args.template === "string") {
|
|
2934
|
+
if (isGitHubUrl(args.template)) {
|
|
2935
|
+
const spinner4 = Y();
|
|
2936
|
+
spinner4.start("Validating GitHub repository...");
|
|
2937
|
+
const validation = await validateGitHubProject(args.template);
|
|
2938
|
+
if (!validation.isValid) {
|
|
2939
|
+
spinner4.stop("Validation failed");
|
|
2940
|
+
M.error("This does not appear to be a valid Mastra project:");
|
|
2941
|
+
validation.errors.forEach((error) => M.error(` - ${error}`));
|
|
2942
|
+
throw new Error("Invalid Mastra project");
|
|
2943
|
+
}
|
|
2944
|
+
spinner4.stop("Valid Mastra project \u2713");
|
|
2945
|
+
selectedTemplate = await createFromGitHubUrl(args.template);
|
|
2946
|
+
} else {
|
|
2947
|
+
const templates = await loadTemplates();
|
|
2948
|
+
const found = findTemplateByName(templates, args.template);
|
|
2949
|
+
if (!found) {
|
|
2950
|
+
M.error(`Template "${args.template}" not found. Available templates:`);
|
|
2951
|
+
templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
|
|
2952
|
+
throw new Error(`Template "${args.template}" not found`);
|
|
2953
|
+
}
|
|
2954
|
+
selectedTemplate = found;
|
|
2955
|
+
}
|
|
2956
|
+
}
|
|
2957
|
+
if (!selectedTemplate) {
|
|
2958
|
+
throw new Error("No template selected");
|
|
2959
|
+
}
|
|
2960
|
+
let projectName = args.projectName;
|
|
2961
|
+
if (!projectName) {
|
|
2962
|
+
const defaultName = getDefaultProjectName(selectedTemplate);
|
|
2963
|
+
const response = await he({
|
|
2964
|
+
message: "What is your project name?",
|
|
2965
|
+
defaultValue: defaultName,
|
|
2966
|
+
placeholder: defaultName
|
|
2967
|
+
});
|
|
2968
|
+
if (pD(response)) {
|
|
2969
|
+
M.info("Project creation cancelled.");
|
|
2970
|
+
return;
|
|
2971
|
+
}
|
|
2972
|
+
projectName = response;
|
|
2973
|
+
}
|
|
2974
|
+
let llmProvider = args.llmProvider;
|
|
2975
|
+
if (!llmProvider) {
|
|
2976
|
+
const providerResponse = await ve({
|
|
2977
|
+
message: "Select a default provider:",
|
|
2978
|
+
options: LLM_PROVIDERS
|
|
2979
|
+
});
|
|
2980
|
+
if (pD(providerResponse)) {
|
|
2981
|
+
M.info("Project creation cancelled.");
|
|
2982
|
+
return;
|
|
2983
|
+
}
|
|
2984
|
+
llmProvider = providerResponse;
|
|
2985
|
+
}
|
|
2986
|
+
let initGit = false;
|
|
2987
|
+
const gitConfirmResult = await ye({
|
|
2988
|
+
message: "Initialize a new git repository?",
|
|
2989
|
+
initialValue: true
|
|
2990
|
+
});
|
|
2991
|
+
if (!pD(gitConfirmResult)) {
|
|
2992
|
+
initGit = gitConfirmResult;
|
|
2993
|
+
}
|
|
2994
|
+
let projectPath = null;
|
|
2995
|
+
try {
|
|
2996
|
+
const analytics = args.injectedAnalytics || getAnalytics();
|
|
2997
|
+
if (analytics) {
|
|
2998
|
+
analytics.trackEvent("cli_template_used", {
|
|
2999
|
+
template_slug: selectedTemplate.slug,
|
|
3000
|
+
template_title: selectedTemplate.title
|
|
3001
|
+
});
|
|
3002
|
+
if (llmProvider) {
|
|
3003
|
+
analytics.trackEvent("cli_model_provider_selected", {
|
|
3004
|
+
provider: llmProvider,
|
|
3005
|
+
selection_method: args.llmProvider ? "cli_args" : "interactive"
|
|
3006
|
+
});
|
|
3007
|
+
}
|
|
3008
|
+
}
|
|
3009
|
+
const isBeta = version$1?.includes("beta") ?? false;
|
|
3010
|
+
const isMastraTemplate = selectedTemplate.githubUrl.includes("github.com/mastra-ai/");
|
|
3011
|
+
const branch = isBeta && isMastraTemplate ? "beta" : void 0;
|
|
3012
|
+
projectPath = await cloneTemplate({
|
|
3013
|
+
template: selectedTemplate,
|
|
3014
|
+
projectName,
|
|
3015
|
+
branch,
|
|
3016
|
+
llmProvider
|
|
3017
|
+
});
|
|
3018
|
+
await installDependencies(projectPath);
|
|
3019
|
+
if (initGit) {
|
|
3020
|
+
const s2 = Y();
|
|
3021
|
+
try {
|
|
3022
|
+
s2.start("Initializing git repository");
|
|
3023
|
+
await gitInit({ cwd: projectPath });
|
|
3024
|
+
s2.stop("Git repository initialized");
|
|
3025
|
+
} catch {
|
|
3026
|
+
s2.stop();
|
|
3027
|
+
}
|
|
3028
|
+
}
|
|
3029
|
+
Me(`
|
|
3030
|
+
${color2.green("Mastra template installed!")}
|
|
3031
|
+
|
|
3032
|
+
Add the necessary environment
|
|
3033
|
+
variables in your ${color2.cyan(".env")} file
|
|
3034
|
+
`);
|
|
3035
|
+
postCreate({ projectName });
|
|
3036
|
+
} catch (error) {
|
|
3037
|
+
if (projectPath) {
|
|
3038
|
+
try {
|
|
3039
|
+
if (fs3__default__default.existsSync(projectPath)) {
|
|
3040
|
+
await fs4.rm(projectPath, { recursive: true, force: true });
|
|
3041
|
+
}
|
|
3042
|
+
} catch (cleanupError) {
|
|
3043
|
+
console.error(
|
|
3044
|
+
`Warning: Failed to clean up project directory: ${cleanupError instanceof Error ? cleanupError.message : "Unknown error"}`
|
|
3045
|
+
);
|
|
3046
|
+
}
|
|
3047
|
+
}
|
|
3048
|
+
M.error(`Failed to create project from template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
3049
|
+
throw error;
|
|
3050
|
+
}
|
|
3051
|
+
}
|
|
1950
3052
|
|
|
1951
3053
|
async function getPackageVersion() {
|
|
1952
3054
|
const __filename = fileURLToPath(import.meta.url);
|
|
1953
3055
|
const __dirname = dirname(__filename);
|
|
1954
|
-
const pkgJsonPath =
|
|
1955
|
-
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
3056
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
3057
|
+
const content = await fsExtra$1.readJSON(pkgJsonPath);
|
|
1956
3058
|
return content.version;
|
|
1957
3059
|
}
|
|
1958
3060
|
async function getCreateVersionTag() {
|
|
1959
3061
|
try {
|
|
1960
3062
|
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
1961
|
-
const json = await fsExtra.readJSON(pkgPath);
|
|
3063
|
+
const json = await fsExtra$1.readJSON(pkgPath);
|
|
1962
3064
|
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
1963
|
-
const tagLine = stdout.split("\n").find((distLine) => distLine.
|
|
3065
|
+
const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
|
|
1964
3066
|
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
1965
3067
|
return tag;
|
|
1966
3068
|
} catch {
|
|
@@ -1982,23 +3084,30 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
1982
3084
|
analytics.trackCommand({
|
|
1983
3085
|
command: "version"
|
|
1984
3086
|
});
|
|
1985
|
-
console.
|
|
3087
|
+
console.info(`create-mastra ${version}`);
|
|
1986
3088
|
} catch {
|
|
1987
3089
|
}
|
|
1988
3090
|
});
|
|
1989
3091
|
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
1990
3092
|
"-p, --project-name <string>",
|
|
1991
3093
|
"Project name that will be used in package.json and as the project directory name."
|
|
1992
|
-
).option("--default", "Quick start with defaults(src, OpenAI,
|
|
3094
|
+
).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(
|
|
3095
|
+
"--template [template-name]",
|
|
3096
|
+
"Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
|
|
3097
|
+
).action(async (projectNameArg, args) => {
|
|
1993
3098
|
const projectName = projectNameArg || args.projectName;
|
|
1994
3099
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
1995
3100
|
if (args.default) {
|
|
1996
3101
|
await create({
|
|
1997
|
-
components: ["agents", "tools", "workflows"],
|
|
3102
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
1998
3103
|
llmProvider: "openai",
|
|
1999
|
-
addExample:
|
|
3104
|
+
addExample: true,
|
|
2000
3105
|
createVersionTag,
|
|
2001
|
-
timeout
|
|
3106
|
+
timeout,
|
|
3107
|
+
mcpServer: args.mcp,
|
|
3108
|
+
directory: "src/",
|
|
3109
|
+
template: args.template,
|
|
3110
|
+
analytics
|
|
2002
3111
|
});
|
|
2003
3112
|
return;
|
|
2004
3113
|
}
|
|
@@ -2006,11 +3115,14 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2006
3115
|
components: args.components ? args.components.split(",") : [],
|
|
2007
3116
|
llmProvider: args.llm,
|
|
2008
3117
|
addExample: args.example,
|
|
2009
|
-
llmApiKey: args
|
|
3118
|
+
llmApiKey: args.llmApiKey,
|
|
2010
3119
|
createVersionTag,
|
|
2011
3120
|
timeout,
|
|
2012
3121
|
projectName,
|
|
2013
|
-
directory: args.dir
|
|
3122
|
+
directory: args.dir,
|
|
3123
|
+
mcpServer: args.mcp,
|
|
3124
|
+
template: args.template,
|
|
3125
|
+
analytics
|
|
2014
3126
|
});
|
|
2015
3127
|
});
|
|
2016
3128
|
program.parse(process.argv);
|