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