create-mastra 0.0.0-cli-debug-2-20250611100354 → 0.0.0-client-js-listmessages-agentid-fix-20251119175531
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2135 -0
- package/LICENSE.md +11 -42
- package/README.md +11 -39
- package/dist/index.js +1104 -570
- 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 path3, { 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 = path3.dirname(__filename);
|
|
27
|
+
var analyticsInstance = null;
|
|
28
|
+
function getAnalytics() {
|
|
29
|
+
return analyticsInstance;
|
|
30
|
+
}
|
|
26
31
|
var PosthogAnalytics = class {
|
|
27
32
|
sessionId;
|
|
28
33
|
client;
|
|
@@ -34,7 +39,7 @@ var PosthogAnalytics = class {
|
|
|
34
39
|
host = "https://app.posthog.com"
|
|
35
40
|
}) {
|
|
36
41
|
this.version = version;
|
|
37
|
-
const cliConfigPath =
|
|
42
|
+
const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
|
|
38
43
|
if (existsSync(cliConfigPath)) {
|
|
39
44
|
try {
|
|
40
45
|
const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
|
|
@@ -62,7 +67,7 @@ var PosthogAnalytics = class {
|
|
|
62
67
|
}
|
|
63
68
|
writeCliConfig({ distinctId, sessionId }) {
|
|
64
69
|
try {
|
|
65
|
-
writeFileSync(
|
|
70
|
+
writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
66
71
|
} catch {
|
|
67
72
|
}
|
|
68
73
|
}
|
|
@@ -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
|
|
@@ -873,13 +887,14 @@ class YoctoSpinner {
|
|
|
873
887
|
#exitHandlerBound;
|
|
874
888
|
#isInteractive;
|
|
875
889
|
#lastSpinnerFrameTime = 0;
|
|
890
|
+
#isSpinning = false;
|
|
876
891
|
|
|
877
892
|
constructor(options = {}) {
|
|
878
893
|
const spinner = options.spinner ?? defaultSpinner;
|
|
879
894
|
this.#frames = spinner.frames;
|
|
880
895
|
this.#interval = spinner.interval;
|
|
881
896
|
this.#text = options.text ?? '';
|
|
882
|
-
this.#stream = options.stream ??
|
|
897
|
+
this.#stream = options.stream ?? y$1.stderr;
|
|
883
898
|
this.#color = options.color ?? 'cyan';
|
|
884
899
|
this.#isInteractive = isInteractive(this.#stream);
|
|
885
900
|
this.#exitHandlerBound = this.#exitHandler.bind(this);
|
|
@@ -894,13 +909,17 @@ class YoctoSpinner {
|
|
|
894
909
|
return this;
|
|
895
910
|
}
|
|
896
911
|
|
|
912
|
+
this.#isSpinning = true;
|
|
897
913
|
this.#hideCursor();
|
|
898
914
|
this.#render();
|
|
899
915
|
this.#subscribeToProcessEvents();
|
|
900
916
|
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
917
|
+
// Only start the timer in interactive mode
|
|
918
|
+
if (this.#isInteractive) {
|
|
919
|
+
this.#timer = setInterval(() => {
|
|
920
|
+
this.#render();
|
|
921
|
+
}, this.#interval);
|
|
922
|
+
}
|
|
904
923
|
|
|
905
924
|
return this;
|
|
906
925
|
}
|
|
@@ -910,8 +929,12 @@ class YoctoSpinner {
|
|
|
910
929
|
return this;
|
|
911
930
|
}
|
|
912
931
|
|
|
913
|
-
|
|
914
|
-
this.#timer
|
|
932
|
+
this.#isSpinning = false;
|
|
933
|
+
if (this.#timer) {
|
|
934
|
+
clearInterval(this.#timer);
|
|
935
|
+
this.#timer = undefined;
|
|
936
|
+
}
|
|
937
|
+
|
|
915
938
|
this.#showCursor();
|
|
916
939
|
this.clear();
|
|
917
940
|
this.#unsubscribeFromProcessEvents();
|
|
@@ -944,15 +967,15 @@ class YoctoSpinner {
|
|
|
944
967
|
}
|
|
945
968
|
|
|
946
969
|
get isSpinning() {
|
|
947
|
-
return this.#
|
|
970
|
+
return this.#isSpinning;
|
|
948
971
|
}
|
|
949
972
|
|
|
950
973
|
get text() {
|
|
951
974
|
return this.#text;
|
|
952
975
|
}
|
|
953
976
|
|
|
954
|
-
set text(value
|
|
955
|
-
this.#text = value;
|
|
977
|
+
set text(value) {
|
|
978
|
+
this.#text = value ?? '';
|
|
956
979
|
this.#render();
|
|
957
980
|
}
|
|
958
981
|
|
|
@@ -1016,7 +1039,7 @@ class YoctoSpinner {
|
|
|
1016
1039
|
|
|
1017
1040
|
#lineCount(text) {
|
|
1018
1041
|
const width = this.#stream.columns ?? 80;
|
|
1019
|
-
const lines = text.split('\n');
|
|
1042
|
+
const lines = stripVTControlCharacters(text).split('\n');
|
|
1020
1043
|
|
|
1021
1044
|
let lineCount = 0;
|
|
1022
1045
|
for (const line of lines) {
|
|
@@ -1039,13 +1062,13 @@ class YoctoSpinner {
|
|
|
1039
1062
|
}
|
|
1040
1063
|
|
|
1041
1064
|
#subscribeToProcessEvents() {
|
|
1042
|
-
|
|
1043
|
-
|
|
1065
|
+
y$1.once('SIGINT', this.#exitHandlerBound);
|
|
1066
|
+
y$1.once('SIGTERM', this.#exitHandlerBound);
|
|
1044
1067
|
}
|
|
1045
1068
|
|
|
1046
1069
|
#unsubscribeFromProcessEvents() {
|
|
1047
|
-
|
|
1048
|
-
|
|
1070
|
+
y$1.off('SIGINT', this.#exitHandlerBound);
|
|
1071
|
+
y$1.off('SIGTERM', this.#exitHandlerBound);
|
|
1049
1072
|
}
|
|
1050
1073
|
|
|
1051
1074
|
#exitHandler(signal) {
|
|
@@ -1056,7 +1079,7 @@ class YoctoSpinner {
|
|
|
1056
1079
|
// SIGINT: 128 + 2
|
|
1057
1080
|
// SIGTERM: 128 + 15
|
|
1058
1081
|
const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
|
|
1059
|
-
|
|
1082
|
+
y$1.exit(exitCode);
|
|
1060
1083
|
}
|
|
1061
1084
|
}
|
|
1062
1085
|
|
|
@@ -1081,11 +1104,11 @@ var MastraLogger = class {
|
|
|
1081
1104
|
}
|
|
1082
1105
|
trackException(_error) {
|
|
1083
1106
|
}
|
|
1084
|
-
async
|
|
1107
|
+
async listLogs(transportId, params) {
|
|
1085
1108
|
if (!transportId || !this.transports.has(transportId)) {
|
|
1086
1109
|
return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
|
|
1087
1110
|
}
|
|
1088
|
-
return this.transports.get(transportId).
|
|
1111
|
+
return this.transports.get(transportId).listLogs(params) ?? {
|
|
1089
1112
|
logs: [],
|
|
1090
1113
|
total: 0,
|
|
1091
1114
|
page: params?.page ?? 1,
|
|
@@ -1093,7 +1116,7 @@ var MastraLogger = class {
|
|
|
1093
1116
|
hasMore: false
|
|
1094
1117
|
};
|
|
1095
1118
|
}
|
|
1096
|
-
async
|
|
1119
|
+
async listLogsByRunId({
|
|
1097
1120
|
transportId,
|
|
1098
1121
|
runId,
|
|
1099
1122
|
fromDate,
|
|
@@ -1106,7 +1129,7 @@ var MastraLogger = class {
|
|
|
1106
1129
|
if (!transportId || !this.transports.has(transportId) || !runId) {
|
|
1107
1130
|
return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
|
|
1108
1131
|
}
|
|
1109
|
-
return this.transports.get(transportId).
|
|
1132
|
+
return this.transports.get(transportId).listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
|
|
1110
1133
|
logs: [],
|
|
1111
1134
|
total: 0,
|
|
1112
1135
|
page: page ?? 1,
|
|
@@ -1136,9 +1159,7 @@ var PinoLogger = class extends MastraLogger {
|
|
|
1136
1159
|
{
|
|
1137
1160
|
name: options.name || "app",
|
|
1138
1161
|
level: options.level || LogLevel.INFO,
|
|
1139
|
-
formatters:
|
|
1140
|
-
level: (label) => ({ level: label })
|
|
1141
|
-
}
|
|
1162
|
+
formatters: options.formatters
|
|
1142
1163
|
},
|
|
1143
1164
|
options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
|
|
1144
1165
|
...transportsAry.map(([, transport]) => ({
|
|
@@ -1166,6 +1187,22 @@ var PinoLogger = class extends MastraLogger {
|
|
|
1166
1187
|
}
|
|
1167
1188
|
};
|
|
1168
1189
|
|
|
1190
|
+
var package_default = {
|
|
1191
|
+
version: "1.0.0-beta.2"};
|
|
1192
|
+
function getPackageManagerAddCommand(pm) {
|
|
1193
|
+
switch (pm) {
|
|
1194
|
+
case "npm":
|
|
1195
|
+
return "install --audit=false --fund=false --loglevel=error --progress=false --update-notifier=false";
|
|
1196
|
+
case "yarn":
|
|
1197
|
+
return "add";
|
|
1198
|
+
case "pnpm":
|
|
1199
|
+
return "add --loglevel=error";
|
|
1200
|
+
case "bun":
|
|
1201
|
+
return "add";
|
|
1202
|
+
default:
|
|
1203
|
+
return "add";
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1169
1206
|
var DepsService = class {
|
|
1170
1207
|
packageManager;
|
|
1171
1208
|
constructor() {
|
|
@@ -1174,11 +1211,11 @@ var DepsService = class {
|
|
|
1174
1211
|
findLockFile(dir) {
|
|
1175
1212
|
const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
|
|
1176
1213
|
for (const file of lockFiles) {
|
|
1177
|
-
if (fs3__default__default.existsSync(
|
|
1214
|
+
if (fs3__default__default.existsSync(path3.join(dir, file))) {
|
|
1178
1215
|
return file;
|
|
1179
1216
|
}
|
|
1180
1217
|
}
|
|
1181
|
-
const parentDir =
|
|
1218
|
+
const parentDir = path3.resolve(dir, "..");
|
|
1182
1219
|
if (parentDir !== dir) {
|
|
1183
1220
|
return this.findLockFile(parentDir);
|
|
1184
1221
|
}
|
|
@@ -1200,14 +1237,10 @@ var DepsService = class {
|
|
|
1200
1237
|
}
|
|
1201
1238
|
}
|
|
1202
1239
|
async installPackages(packages) {
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
runCommand = `${this.packageManager} i`;
|
|
1206
|
-
} else {
|
|
1207
|
-
runCommand = `${this.packageManager} add`;
|
|
1208
|
-
}
|
|
1240
|
+
const pm = this.packageManager;
|
|
1241
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
1209
1242
|
const packageList = packages.join(" ");
|
|
1210
|
-
return execa(`${
|
|
1243
|
+
return execa(`${pm} ${installCommand} ${packageList}`, {
|
|
1211
1244
|
all: true,
|
|
1212
1245
|
shell: true,
|
|
1213
1246
|
stdio: "inherit"
|
|
@@ -1215,7 +1248,7 @@ var DepsService = class {
|
|
|
1215
1248
|
}
|
|
1216
1249
|
async checkDependencies(dependencies) {
|
|
1217
1250
|
try {
|
|
1218
|
-
const packageJsonPath =
|
|
1251
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
1219
1252
|
try {
|
|
1220
1253
|
await fs4.access(packageJsonPath);
|
|
1221
1254
|
} catch {
|
|
@@ -1235,7 +1268,7 @@ var DepsService = class {
|
|
|
1235
1268
|
}
|
|
1236
1269
|
async getProjectName() {
|
|
1237
1270
|
try {
|
|
1238
|
-
const packageJsonPath =
|
|
1271
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
1239
1272
|
const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
|
|
1240
1273
|
const pkg = JSON.parse(packageJson);
|
|
1241
1274
|
return pkg.name;
|
|
@@ -1243,13 +1276,6 @@ var DepsService = class {
|
|
|
1243
1276
|
throw err;
|
|
1244
1277
|
}
|
|
1245
1278
|
}
|
|
1246
|
-
async getPackageVersion() {
|
|
1247
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
1248
|
-
const __dirname = dirname(__filename);
|
|
1249
|
-
const pkgJsonPath = path2.join(__dirname, "..", "package.json");
|
|
1250
|
-
const content = await fsExtra3.readJSON(pkgJsonPath);
|
|
1251
|
-
return content.version;
|
|
1252
|
-
}
|
|
1253
1279
|
async addScriptsToPackageJson(scripts) {
|
|
1254
1280
|
const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
|
|
1255
1281
|
packageJson.scripts = {
|
|
@@ -1259,153 +1285,6 @@ var DepsService = class {
|
|
|
1259
1285
|
await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
1260
1286
|
}
|
|
1261
1287
|
};
|
|
1262
|
-
function getPackageManager() {
|
|
1263
|
-
const userAgent = process.env.npm_config_user_agent || "";
|
|
1264
|
-
const execPath = process.env.npm_execpath || "";
|
|
1265
|
-
if (userAgent.includes("yarn")) {
|
|
1266
|
-
return "yarn";
|
|
1267
|
-
}
|
|
1268
|
-
if (userAgent.includes("pnpm")) {
|
|
1269
|
-
return "pnpm";
|
|
1270
|
-
}
|
|
1271
|
-
if (userAgent.includes("npm")) {
|
|
1272
|
-
return "npm";
|
|
1273
|
-
}
|
|
1274
|
-
if (execPath.includes("yarn")) {
|
|
1275
|
-
return "yarn";
|
|
1276
|
-
}
|
|
1277
|
-
if (execPath.includes("pnpm")) {
|
|
1278
|
-
return "pnpm";
|
|
1279
|
-
}
|
|
1280
|
-
if (execPath.includes("npm")) {
|
|
1281
|
-
return "npm";
|
|
1282
|
-
}
|
|
1283
|
-
return "npm";
|
|
1284
|
-
}
|
|
1285
|
-
function getPackageManagerInstallCommand(pm) {
|
|
1286
|
-
switch (pm) {
|
|
1287
|
-
case "npm":
|
|
1288
|
-
return "install";
|
|
1289
|
-
case "yarn":
|
|
1290
|
-
return "add";
|
|
1291
|
-
case "pnpm":
|
|
1292
|
-
return "add";
|
|
1293
|
-
default:
|
|
1294
|
-
return "install";
|
|
1295
|
-
}
|
|
1296
|
-
}
|
|
1297
|
-
var args = ["-y", "@mastra/mcp-docs-server"];
|
|
1298
|
-
var createMcpConfig = (editor) => {
|
|
1299
|
-
if (editor === "vscode") {
|
|
1300
|
-
return {
|
|
1301
|
-
servers: {
|
|
1302
|
-
mastra: process.platform === `win32` ? {
|
|
1303
|
-
command: "cmd",
|
|
1304
|
-
args: ["/c", "npx", ...args],
|
|
1305
|
-
type: "stdio"
|
|
1306
|
-
} : {
|
|
1307
|
-
command: "npx",
|
|
1308
|
-
args,
|
|
1309
|
-
type: "stdio"
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
};
|
|
1313
|
-
}
|
|
1314
|
-
return {
|
|
1315
|
-
mcpServers: {
|
|
1316
|
-
mastra: {
|
|
1317
|
-
command: "npx",
|
|
1318
|
-
args
|
|
1319
|
-
}
|
|
1320
|
-
}
|
|
1321
|
-
};
|
|
1322
|
-
};
|
|
1323
|
-
function makeConfig(original, editor) {
|
|
1324
|
-
if (editor === "vscode") {
|
|
1325
|
-
return {
|
|
1326
|
-
...original,
|
|
1327
|
-
servers: {
|
|
1328
|
-
...original?.servers || {},
|
|
1329
|
-
...createMcpConfig(editor).servers
|
|
1330
|
-
}
|
|
1331
|
-
};
|
|
1332
|
-
}
|
|
1333
|
-
return {
|
|
1334
|
-
...original,
|
|
1335
|
-
mcpServers: {
|
|
1336
|
-
...original?.mcpServers || {},
|
|
1337
|
-
...createMcpConfig(editor).mcpServers
|
|
1338
|
-
}
|
|
1339
|
-
};
|
|
1340
|
-
}
|
|
1341
|
-
async function writeMergedConfig(configPath, editor) {
|
|
1342
|
-
const configExists = existsSync(configPath);
|
|
1343
|
-
const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor);
|
|
1344
|
-
await ensureFile(configPath);
|
|
1345
|
-
await writeJSON(configPath, config, {
|
|
1346
|
-
spaces: 2
|
|
1347
|
-
});
|
|
1348
|
-
}
|
|
1349
|
-
var windsurfGlobalMCPConfigPath = path2.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1350
|
-
var cursorGlobalMCPConfigPath = path2.join(os.homedir(), ".cursor", "mcp.json");
|
|
1351
|
-
path2.join(process.cwd(), ".vscode", "mcp.json");
|
|
1352
|
-
var vscodeGlobalMCPConfigPath = path2.join(
|
|
1353
|
-
os.homedir(),
|
|
1354
|
-
process.platform === "win32" ? path2.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path2.join("Library", "Application Support", "Code", "User", "settings.json") : path2.join(".config", "Code", "User", "settings.json")
|
|
1355
|
-
);
|
|
1356
|
-
async function installMastraDocsMCPServer({ editor, directory }) {
|
|
1357
|
-
if (editor === `cursor`) {
|
|
1358
|
-
await writeMergedConfig(path2.join(directory, ".cursor", "mcp.json"), "cursor");
|
|
1359
|
-
}
|
|
1360
|
-
if (editor === `vscode`) {
|
|
1361
|
-
await writeMergedConfig(path2.join(directory, ".vscode", "mcp.json"), "vscode");
|
|
1362
|
-
}
|
|
1363
|
-
if (editor === `cursor-global`) {
|
|
1364
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1365
|
-
if (alreadyInstalled) {
|
|
1366
|
-
return;
|
|
1367
|
-
}
|
|
1368
|
-
await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global");
|
|
1369
|
-
}
|
|
1370
|
-
if (editor === `windsurf`) {
|
|
1371
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1372
|
-
if (alreadyInstalled) {
|
|
1373
|
-
return;
|
|
1374
|
-
}
|
|
1375
|
-
await writeMergedConfig(windsurfGlobalMCPConfigPath, editor);
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
|
-
async function globalMCPIsAlreadyInstalled(editor) {
|
|
1379
|
-
let configPath = ``;
|
|
1380
|
-
if (editor === "windsurf") {
|
|
1381
|
-
configPath = windsurfGlobalMCPConfigPath;
|
|
1382
|
-
} else if (editor === "cursor-global") {
|
|
1383
|
-
configPath = cursorGlobalMCPConfigPath;
|
|
1384
|
-
} else if (editor === "vscode") {
|
|
1385
|
-
configPath = vscodeGlobalMCPConfigPath;
|
|
1386
|
-
}
|
|
1387
|
-
if (!configPath || !existsSync(configPath)) {
|
|
1388
|
-
return false;
|
|
1389
|
-
}
|
|
1390
|
-
try {
|
|
1391
|
-
const configContents = await readJSON(configPath);
|
|
1392
|
-
if (editor === "vscode") {
|
|
1393
|
-
if (!configContents?.servers) return false;
|
|
1394
|
-
const hasMastraMCP2 = Object.values(configContents.servers).some(
|
|
1395
|
-
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1396
|
-
);
|
|
1397
|
-
return hasMastraMCP2;
|
|
1398
|
-
}
|
|
1399
|
-
if (!configContents?.mcpServers) return false;
|
|
1400
|
-
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1401
|
-
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1402
|
-
);
|
|
1403
|
-
return hasMastraMCP;
|
|
1404
|
-
} catch (e) {
|
|
1405
|
-
console.error(e);
|
|
1406
|
-
return false;
|
|
1407
|
-
}
|
|
1408
|
-
}
|
|
1409
1288
|
var EnvService = class {
|
|
1410
1289
|
};
|
|
1411
1290
|
var FileEnvService = class extends EnvService {
|
|
@@ -1444,7 +1323,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1444
1323
|
${key}=${value}`;
|
|
1445
1324
|
}
|
|
1446
1325
|
await this.writeFile({ filePath, data });
|
|
1447
|
-
console.
|
|
1326
|
+
console.info(`${key} set to ${value} in ENV file.`);
|
|
1448
1327
|
return data;
|
|
1449
1328
|
}
|
|
1450
1329
|
async getEnvValue(key) {
|
|
@@ -1477,19 +1356,19 @@ var FileService = class {
|
|
|
1477
1356
|
*/
|
|
1478
1357
|
async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
|
|
1479
1358
|
const __filename = fileURLToPath(import.meta.url);
|
|
1480
|
-
const __dirname =
|
|
1481
|
-
const filePath =
|
|
1359
|
+
const __dirname = path3.dirname(__filename);
|
|
1360
|
+
const filePath = path3.resolve(__dirname, "starter-files", inputFile);
|
|
1482
1361
|
const fileString = fs3__default__default.readFileSync(filePath, "utf8");
|
|
1483
1362
|
if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
|
|
1484
|
-
console.
|
|
1363
|
+
console.info(`${outputFilePath} already exists`);
|
|
1485
1364
|
return false;
|
|
1486
1365
|
}
|
|
1487
|
-
await
|
|
1366
|
+
await fsExtra.outputFile(outputFilePath, fileString);
|
|
1488
1367
|
return true;
|
|
1489
1368
|
}
|
|
1490
1369
|
async setupEnvFile({ dbUrl }) {
|
|
1491
|
-
const envPath =
|
|
1492
|
-
await
|
|
1370
|
+
const envPath = path3.join(process.cwd(), ".env.development");
|
|
1371
|
+
await fsExtra.ensureFile(envPath);
|
|
1493
1372
|
const fileEnvService = new FileEnvService(envPath);
|
|
1494
1373
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1495
1374
|
}
|
|
@@ -1512,76 +1391,198 @@ var FileService = class {
|
|
|
1512
1391
|
fs3__default__default.writeFileSync(filePath, fileContent);
|
|
1513
1392
|
}
|
|
1514
1393
|
};
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
}
|
|
1519
|
-
var
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1394
|
+
var createArgs = (versionTag) => {
|
|
1395
|
+
const packageName = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
|
|
1396
|
+
return ["-y", packageName];
|
|
1397
|
+
};
|
|
1398
|
+
var createMcpConfig = (editor, versionTag) => {
|
|
1399
|
+
const args = createArgs(versionTag);
|
|
1400
|
+
if (editor === "vscode") {
|
|
1401
|
+
return {
|
|
1402
|
+
servers: {
|
|
1403
|
+
mastra: process.platform === `win32` ? {
|
|
1404
|
+
command: "cmd",
|
|
1405
|
+
args: ["/c", "npx", ...args],
|
|
1406
|
+
type: "stdio"
|
|
1407
|
+
} : {
|
|
1408
|
+
command: "npx",
|
|
1409
|
+
args,
|
|
1410
|
+
type: "stdio"
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
};
|
|
1534
1414
|
}
|
|
1415
|
+
return {
|
|
1416
|
+
mcpServers: {
|
|
1417
|
+
mastra: {
|
|
1418
|
+
command: "npx",
|
|
1419
|
+
args
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
};
|
|
1535
1423
|
};
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1424
|
+
function makeConfig(original, editor, versionTag) {
|
|
1425
|
+
if (editor === "vscode") {
|
|
1426
|
+
return {
|
|
1427
|
+
...original,
|
|
1428
|
+
servers: {
|
|
1429
|
+
...original?.servers || {},
|
|
1430
|
+
...createMcpConfig(editor, versionTag).servers
|
|
1431
|
+
}
|
|
1432
|
+
};
|
|
1433
|
+
}
|
|
1434
|
+
return {
|
|
1435
|
+
...original,
|
|
1436
|
+
mcpServers: {
|
|
1437
|
+
...original?.mcpServers || {},
|
|
1438
|
+
...createMcpConfig(editor, versionTag).mcpServers
|
|
1439
|
+
}
|
|
1440
|
+
};
|
|
1441
|
+
}
|
|
1442
|
+
async function writeMergedConfig(configPath, editor, versionTag) {
|
|
1443
|
+
const configExists = existsSync(configPath);
|
|
1444
|
+
const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor, versionTag);
|
|
1445
|
+
await ensureFile(configPath);
|
|
1446
|
+
await writeJSON(configPath, config, {
|
|
1447
|
+
spaces: 2
|
|
1448
|
+
});
|
|
1449
|
+
}
|
|
1450
|
+
var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1451
|
+
var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
|
|
1452
|
+
path3.join(process.cwd(), ".vscode", "mcp.json");
|
|
1453
|
+
var vscodeGlobalMCPConfigPath = path3.join(
|
|
1454
|
+
os.homedir(),
|
|
1455
|
+
process.platform === "win32" ? path3.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path3.join("Library", "Application Support", "Code", "User", "settings.json") : path3.join(".config", "Code", "User", "settings.json")
|
|
1456
|
+
);
|
|
1457
|
+
async function installMastraDocsMCPServer({
|
|
1458
|
+
editor,
|
|
1459
|
+
directory,
|
|
1460
|
+
versionTag
|
|
1461
|
+
}) {
|
|
1462
|
+
if (editor === `cursor`) {
|
|
1463
|
+
await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor", versionTag);
|
|
1464
|
+
}
|
|
1465
|
+
if (editor === `vscode`) {
|
|
1466
|
+
await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode", versionTag);
|
|
1467
|
+
}
|
|
1468
|
+
if (editor === `cursor-global`) {
|
|
1469
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1470
|
+
if (alreadyInstalled) {
|
|
1471
|
+
return;
|
|
1472
|
+
}
|
|
1473
|
+
await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global", versionTag);
|
|
1474
|
+
}
|
|
1475
|
+
if (editor === `windsurf`) {
|
|
1476
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor, versionTag);
|
|
1477
|
+
if (alreadyInstalled) {
|
|
1478
|
+
return;
|
|
1479
|
+
}
|
|
1480
|
+
await writeMergedConfig(windsurfGlobalMCPConfigPath, editor, versionTag);
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
async function globalMCPIsAlreadyInstalled(editor, versionTag) {
|
|
1484
|
+
let configPath = ``;
|
|
1485
|
+
if (editor === "windsurf") {
|
|
1486
|
+
configPath = windsurfGlobalMCPConfigPath;
|
|
1487
|
+
} else if (editor === "cursor-global") {
|
|
1488
|
+
configPath = cursorGlobalMCPConfigPath;
|
|
1489
|
+
} else if (editor === "vscode") {
|
|
1490
|
+
configPath = vscodeGlobalMCPConfigPath;
|
|
1491
|
+
}
|
|
1492
|
+
if (!configPath || !existsSync(configPath)) {
|
|
1493
|
+
return false;
|
|
1494
|
+
}
|
|
1495
|
+
try {
|
|
1496
|
+
const configContents = await readJSON(configPath);
|
|
1497
|
+
if (!configContents) return false;
|
|
1498
|
+
const expectedPackage = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
|
|
1499
|
+
if (editor === "vscode") {
|
|
1500
|
+
if (!configContents.servers) return false;
|
|
1501
|
+
const hasMastraMCP2 = Object.values(configContents.servers).some(
|
|
1502
|
+
(server) => server?.args?.find((arg) => arg === expectedPackage)
|
|
1503
|
+
);
|
|
1504
|
+
return hasMastraMCP2;
|
|
1505
|
+
}
|
|
1506
|
+
if (!configContents?.mcpServers) return false;
|
|
1507
|
+
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1508
|
+
(server) => server?.args?.find((arg) => arg === expectedPackage)
|
|
1509
|
+
);
|
|
1510
|
+
return hasMastraMCP;
|
|
1511
|
+
} catch {
|
|
1512
|
+
return false;
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1515
|
+
var exec = util.promisify(child_process.exec);
|
|
1516
|
+
var getModelIdentifier = (llmProvider) => {
|
|
1517
|
+
let model = "openai/gpt-4o";
|
|
1518
|
+
if (llmProvider === "anthropic") {
|
|
1519
|
+
model = "anthropic/claude-sonnet-4-5";
|
|
1545
1520
|
} else if (llmProvider === "groq") {
|
|
1546
|
-
|
|
1547
|
-
modelItem = `groq('llama-3.3-70b-versatile')`;
|
|
1521
|
+
model = "groq/llama-3.3-70b-versatile";
|
|
1548
1522
|
} else if (llmProvider === "google") {
|
|
1549
|
-
|
|
1550
|
-
modelItem = `google('gemini-1.5-pro-latest')`;
|
|
1523
|
+
model = "google/gemini-2.5-pro";
|
|
1551
1524
|
} else if (llmProvider === "cerebras") {
|
|
1552
|
-
|
|
1553
|
-
|
|
1525
|
+
model = "cerebras/llama-3.3-70b";
|
|
1526
|
+
} else if (llmProvider === "mistral") {
|
|
1527
|
+
model = "mistral/mistral-medium-2508";
|
|
1554
1528
|
}
|
|
1555
|
-
return
|
|
1529
|
+
return model;
|
|
1556
1530
|
};
|
|
1557
|
-
async function writeAgentSample(llmProvider, destPath, addExampleTool) {
|
|
1558
|
-
const
|
|
1531
|
+
async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorers) {
|
|
1532
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1559
1533
|
const instructions = `
|
|
1560
|
-
You are a helpful weather assistant that provides accurate weather information.
|
|
1534
|
+
You are a helpful weather assistant that provides accurate weather information and can help planning activities based on the weather.
|
|
1561
1535
|
|
|
1562
1536
|
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1563
1537
|
- Always ask for a location if none is provided
|
|
1564
|
-
- If the location name isn
|
|
1538
|
+
- If the location name isn't in English, please translate it
|
|
1565
1539
|
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1566
1540
|
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1567
1541
|
- Keep responses concise but informative
|
|
1542
|
+
- If the user asks for activities and provides the weather forecast, suggest activities based on the weather forecast.
|
|
1543
|
+
- If the user asks for activities, respond in the format they request.
|
|
1568
1544
|
|
|
1569
1545
|
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1570
1546
|
`;
|
|
1571
1547
|
const content = `
|
|
1572
|
-
${providerImport}
|
|
1573
1548
|
import { Agent } from '@mastra/core/agent';
|
|
1574
1549
|
import { Memory } from '@mastra/memory';
|
|
1575
1550
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1576
1551
|
${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
|
|
1552
|
+
${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
|
|
1577
1553
|
|
|
1578
1554
|
export const weatherAgent = new Agent({
|
|
1555
|
+
id: 'weather-agent',
|
|
1579
1556
|
name: 'Weather Agent',
|
|
1580
1557
|
instructions: \`${instructions}\`,
|
|
1581
|
-
model: ${
|
|
1558
|
+
model: '${modelString}',
|
|
1582
1559
|
${addExampleTool ? "tools: { weatherTool }," : ""}
|
|
1560
|
+
${addScorers ? `scorers: {
|
|
1561
|
+
toolCallAppropriateness: {
|
|
1562
|
+
scorer: scorers.toolCallAppropriatenessScorer,
|
|
1563
|
+
sampling: {
|
|
1564
|
+
type: 'ratio',
|
|
1565
|
+
rate: 1,
|
|
1566
|
+
},
|
|
1567
|
+
},
|
|
1568
|
+
completeness: {
|
|
1569
|
+
scorer: scorers.completenessScorer,
|
|
1570
|
+
sampling: {
|
|
1571
|
+
type: 'ratio',
|
|
1572
|
+
rate: 1,
|
|
1573
|
+
},
|
|
1574
|
+
},
|
|
1575
|
+
translation: {
|
|
1576
|
+
scorer: scorers.translationScorer,
|
|
1577
|
+
sampling: {
|
|
1578
|
+
type: 'ratio',
|
|
1579
|
+
rate: 1,
|
|
1580
|
+
},
|
|
1581
|
+
},
|
|
1582
|
+
},` : ""}
|
|
1583
1583
|
memory: new Memory({
|
|
1584
1584
|
storage: new LibSQLStore({
|
|
1585
|
+
id: "memory-storage",
|
|
1585
1586
|
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
1586
1587
|
})
|
|
1587
1588
|
})
|
|
@@ -1594,63 +1595,10 @@ export const weatherAgent = new Agent({
|
|
|
1594
1595
|
await fs4.writeFile(destPath, "");
|
|
1595
1596
|
await fs4.writeFile(destPath, formattedContent);
|
|
1596
1597
|
}
|
|
1597
|
-
async function writeWorkflowSample(destPath
|
|
1598
|
-
const {
|
|
1599
|
-
const content = `${providerImport}
|
|
1600
|
-
import { Agent } from '@mastra/core/agent';
|
|
1601
|
-
import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1598
|
+
async function writeWorkflowSample(destPath) {
|
|
1599
|
+
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1602
1600
|
import { z } from 'zod';
|
|
1603
1601
|
|
|
1604
|
-
const llm = ${modelItem};
|
|
1605
|
-
|
|
1606
|
-
const agent = new Agent({
|
|
1607
|
-
name: 'Weather Agent',
|
|
1608
|
-
model: llm,
|
|
1609
|
-
instructions: \`
|
|
1610
|
-
You are a local activities and travel expert who excels at weather-based planning. Analyze the weather data and provide practical activity recommendations.
|
|
1611
|
-
|
|
1612
|
-
For each day in the forecast, structure your response exactly as follows:
|
|
1613
|
-
|
|
1614
|
-
\u{1F4C5} [Day, Month Date, Year]
|
|
1615
|
-
\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
|
|
1616
|
-
|
|
1617
|
-
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1618
|
-
\u2022 Conditions: [brief description]
|
|
1619
|
-
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1620
|
-
\u2022 Precipitation: [X% chance]
|
|
1621
|
-
|
|
1622
|
-
\u{1F305} MORNING ACTIVITIES
|
|
1623
|
-
Outdoor:
|
|
1624
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1625
|
-
Best timing: [specific time range]
|
|
1626
|
-
Note: [relevant weather consideration]
|
|
1627
|
-
|
|
1628
|
-
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1629
|
-
Outdoor:
|
|
1630
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1631
|
-
Best timing: [specific time range]
|
|
1632
|
-
Note: [relevant weather consideration]
|
|
1633
|
-
|
|
1634
|
-
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1635
|
-
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1636
|
-
Ideal for: [weather condition that would trigger this alternative]
|
|
1637
|
-
|
|
1638
|
-
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1639
|
-
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1640
|
-
|
|
1641
|
-
Guidelines:
|
|
1642
|
-
- Suggest 2-3 time-specific outdoor activities per day
|
|
1643
|
-
- Include 1-2 indoor backup options
|
|
1644
|
-
- For precipitation >50%, lead with indoor activities
|
|
1645
|
-
- All activities must be specific to the location
|
|
1646
|
-
- Include specific venues, trails, or locations
|
|
1647
|
-
- Consider activity intensity based on temperature
|
|
1648
|
-
- Keep descriptions concise but informative
|
|
1649
|
-
|
|
1650
|
-
Maintain this exact formatting for consistency, using the emoji and section headers as shown.
|
|
1651
|
-
\`,
|
|
1652
|
-
});
|
|
1653
|
-
|
|
1654
1602
|
const forecastSchema = z.object({
|
|
1655
1603
|
date: z.string(),
|
|
1656
1604
|
maxTemp: z.number(),
|
|
@@ -1744,16 +1692,59 @@ const planActivities = createStep({
|
|
|
1744
1692
|
outputSchema: z.object({
|
|
1745
1693
|
activities: z.string(),
|
|
1746
1694
|
}),
|
|
1747
|
-
execute: async ({ inputData }) => {
|
|
1695
|
+
execute: async ({ inputData, mastra }) => {
|
|
1748
1696
|
const forecast = inputData
|
|
1749
1697
|
|
|
1750
1698
|
if (!forecast) {
|
|
1751
1699
|
throw new Error('Forecast data not found')
|
|
1752
1700
|
}
|
|
1753
1701
|
|
|
1702
|
+
const agent = mastra?.getAgent('weatherAgent');
|
|
1703
|
+
if (!agent) {
|
|
1704
|
+
throw new Error('Weather agent not found');
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1754
1707
|
const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
|
|
1755
1708
|
\${JSON.stringify(forecast, null, 2)}
|
|
1756
|
-
|
|
1709
|
+
For each day in the forecast, structure your response exactly as follows:
|
|
1710
|
+
|
|
1711
|
+
\u{1F4C5} [Day, Month Date, Year]
|
|
1712
|
+
\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
|
|
1713
|
+
|
|
1714
|
+
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1715
|
+
\u2022 Conditions: [brief description]
|
|
1716
|
+
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1717
|
+
\u2022 Precipitation: [X% chance]
|
|
1718
|
+
|
|
1719
|
+
\u{1F305} MORNING ACTIVITIES
|
|
1720
|
+
Outdoor:
|
|
1721
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1722
|
+
Best timing: [specific time range]
|
|
1723
|
+
Note: [relevant weather consideration]
|
|
1724
|
+
|
|
1725
|
+
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1726
|
+
Outdoor:
|
|
1727
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1728
|
+
Best timing: [specific time range]
|
|
1729
|
+
Note: [relevant weather consideration]
|
|
1730
|
+
|
|
1731
|
+
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1732
|
+
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1733
|
+
Ideal for: [weather condition that would trigger this alternative]
|
|
1734
|
+
|
|
1735
|
+
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1736
|
+
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1737
|
+
|
|
1738
|
+
Guidelines:
|
|
1739
|
+
- Suggest 2-3 time-specific outdoor activities per day
|
|
1740
|
+
- Include 1-2 indoor backup options
|
|
1741
|
+
- For precipitation >50%, lead with indoor activities
|
|
1742
|
+
- All activities must be specific to the location
|
|
1743
|
+
- Include specific venues, trails, or locations
|
|
1744
|
+
- Consider activity intensity based on temperature
|
|
1745
|
+
- Keep descriptions concise but informative
|
|
1746
|
+
|
|
1747
|
+
Maintain this exact formatting for consistency, using the emoji and section headers as shown.\`;
|
|
1757
1748
|
|
|
1758
1749
|
const response = await agent.stream([
|
|
1759
1750
|
{
|
|
@@ -1801,41 +1792,138 @@ async function writeToolSample(destPath) {
|
|
|
1801
1792
|
const fileService = new FileService();
|
|
1802
1793
|
await fileService.copyStarterFile("tools.ts", destPath);
|
|
1803
1794
|
}
|
|
1795
|
+
async function writeScorersSample(llmProvider, destPath) {
|
|
1796
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1797
|
+
const content = `import { z } from 'zod';
|
|
1798
|
+
import { createToolCallAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt';
|
|
1799
|
+
import { createCompletenessScorer } from '@mastra/evals/scorers/prebuilt';
|
|
1800
|
+
import { getAssistantMessageFromRunOutput, getUserMessageFromRunInput } from '@mastra/evals/scorers/utils';
|
|
1801
|
+
import { createScorer } from '@mastra/core/evals';
|
|
1802
|
+
|
|
1803
|
+
export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({
|
|
1804
|
+
expectedTool: 'weatherTool',
|
|
1805
|
+
strictMode: false,
|
|
1806
|
+
});
|
|
1807
|
+
|
|
1808
|
+
export const completenessScorer = createCompletenessScorer();
|
|
1809
|
+
|
|
1810
|
+
// Custom LLM-judged scorer: evaluates if non-English locations are translated appropriately
|
|
1811
|
+
export const translationScorer = createScorer({
|
|
1812
|
+
id: 'translation-quality-scorer',
|
|
1813
|
+
name: 'Translation Quality',
|
|
1814
|
+
description: 'Checks that non-English location names are translated and used correctly',
|
|
1815
|
+
type: 'agent',
|
|
1816
|
+
judge: {
|
|
1817
|
+
model: '${modelString}',
|
|
1818
|
+
instructions:
|
|
1819
|
+
'You are an expert evaluator of translation quality for geographic locations. ' +
|
|
1820
|
+
'Determine whether the user text mentions a non-English location and whether the assistant correctly uses an English translation of that location. ' +
|
|
1821
|
+
'Be lenient with transliteration differences and diacritics. ' +
|
|
1822
|
+
'Return only the structured JSON matching the provided schema.',
|
|
1823
|
+
},
|
|
1824
|
+
})
|
|
1825
|
+
.preprocess(({ run }) => {
|
|
1826
|
+
const userText = getUserMessageFromRunInput(run.input) || '';
|
|
1827
|
+
const assistantText = getAssistantMessageFromRunOutput(run.output) || '';
|
|
1828
|
+
return { userText, assistantText };
|
|
1829
|
+
})
|
|
1830
|
+
.analyze({
|
|
1831
|
+
description: 'Extract location names and detect language/translation adequacy',
|
|
1832
|
+
outputSchema: z.object({
|
|
1833
|
+
nonEnglish: z.boolean(),
|
|
1834
|
+
translated: z.boolean(),
|
|
1835
|
+
confidence: z.number().min(0).max(1).default(1),
|
|
1836
|
+
explanation: z.string().default(''),
|
|
1837
|
+
}),
|
|
1838
|
+
createPrompt: ({ results }) => \`
|
|
1839
|
+
You are evaluating if a weather assistant correctly handled translation of a non-English location.
|
|
1840
|
+
User text:
|
|
1841
|
+
"""
|
|
1842
|
+
\${results.preprocessStepResult.userText}
|
|
1843
|
+
"""
|
|
1844
|
+
Assistant response:
|
|
1845
|
+
"""
|
|
1846
|
+
\${results.preprocessStepResult.assistantText}
|
|
1847
|
+
"""
|
|
1848
|
+
Tasks:
|
|
1849
|
+
1) Identify if the user mentioned a location that appears non-English.
|
|
1850
|
+
2) If non-English, check whether the assistant used a correct English translation of that location in its response.
|
|
1851
|
+
3) Be lenient with transliteration differences (e.g., accents/diacritics).
|
|
1852
|
+
Return JSON with fields:
|
|
1853
|
+
{
|
|
1854
|
+
"nonEnglish": boolean,
|
|
1855
|
+
"translated": boolean,
|
|
1856
|
+
"confidence": number, // 0-1
|
|
1857
|
+
"explanation": string
|
|
1858
|
+
}
|
|
1859
|
+
\`,
|
|
1860
|
+
})
|
|
1861
|
+
.generateScore(({ results }) => {
|
|
1862
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1863
|
+
if (!r.nonEnglish) return 1; // If not applicable, full credit
|
|
1864
|
+
if (r.translated) return Math.max(0, Math.min(1, 0.7 + 0.3 * (r.confidence ?? 1)));
|
|
1865
|
+
return 0; // Non-English but not translated
|
|
1866
|
+
})
|
|
1867
|
+
.generateReason(({ results, score }) => {
|
|
1868
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1869
|
+
return \`Translation scoring: nonEnglish=\${r.nonEnglish ?? false}, translated=\${r.translated ?? false}, confidence=\${r.confidence ?? 0}. Score=\${score}. \${r.explanation ?? ''}\`;
|
|
1870
|
+
});
|
|
1871
|
+
|
|
1872
|
+
export const scorers = {
|
|
1873
|
+
toolCallAppropriatenessScorer,
|
|
1874
|
+
completenessScorer,
|
|
1875
|
+
translationScorer,
|
|
1876
|
+
};`;
|
|
1877
|
+
const formattedContent = await prettier.format(content, {
|
|
1878
|
+
parser: "typescript",
|
|
1879
|
+
singleQuote: true
|
|
1880
|
+
});
|
|
1881
|
+
await fs4.writeFile(destPath, formattedContent);
|
|
1882
|
+
}
|
|
1804
1883
|
async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
|
|
1805
1884
|
switch (component) {
|
|
1806
1885
|
case "agents":
|
|
1807
|
-
return writeAgentSample(
|
|
1886
|
+
return writeAgentSample(
|
|
1887
|
+
llmprovider,
|
|
1888
|
+
destPath,
|
|
1889
|
+
importComponents.includes("tools"),
|
|
1890
|
+
importComponents.includes("scorers")
|
|
1891
|
+
);
|
|
1808
1892
|
case "tools":
|
|
1809
1893
|
return writeToolSample(destPath);
|
|
1810
1894
|
case "workflows":
|
|
1811
|
-
return writeWorkflowSample(destPath
|
|
1895
|
+
return writeWorkflowSample(destPath);
|
|
1896
|
+
case "scorers":
|
|
1897
|
+
return writeScorersSample(llmprovider, destPath);
|
|
1812
1898
|
default:
|
|
1813
1899
|
return "";
|
|
1814
1900
|
}
|
|
1815
1901
|
}
|
|
1816
1902
|
var createComponentsDir = async (dirPath, component) => {
|
|
1817
1903
|
const componentPath = dirPath + `/${component}`;
|
|
1818
|
-
await
|
|
1904
|
+
await fsExtra.ensureDir(componentPath);
|
|
1819
1905
|
};
|
|
1820
1906
|
var writeIndexFile = async ({
|
|
1821
1907
|
dirPath,
|
|
1822
1908
|
addAgent,
|
|
1823
1909
|
addExample,
|
|
1824
|
-
addWorkflow
|
|
1910
|
+
addWorkflow,
|
|
1911
|
+
addScorers
|
|
1825
1912
|
}) => {
|
|
1826
1913
|
const indexPath = dirPath + "/index.ts";
|
|
1827
|
-
const destPath =
|
|
1914
|
+
const destPath = path3.join(indexPath);
|
|
1828
1915
|
try {
|
|
1829
1916
|
await fs4.writeFile(destPath, "");
|
|
1830
1917
|
const filteredExports = [
|
|
1831
1918
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1832
|
-
addAgent ? `agents: { weatherAgent },` : ""
|
|
1919
|
+
addAgent ? `agents: { weatherAgent },` : "",
|
|
1920
|
+
addScorers ? `scorers: { toolCallAppropriatenessScorer, completenessScorer, translationScorer },` : ""
|
|
1833
1921
|
].filter(Boolean);
|
|
1834
1922
|
if (!addExample) {
|
|
1835
1923
|
await fs4.writeFile(
|
|
1836
1924
|
destPath,
|
|
1837
1925
|
`
|
|
1838
|
-
import { Mastra } from '@mastra/core';
|
|
1926
|
+
import { Mastra } from '@mastra/core/mastra';
|
|
1839
1927
|
|
|
1840
1928
|
export const mastra = new Mastra()
|
|
1841
1929
|
`
|
|
@@ -1848,19 +1936,26 @@ export const mastra = new Mastra()
|
|
|
1848
1936
|
import { Mastra } from '@mastra/core/mastra';
|
|
1849
1937
|
import { PinoLogger } from '@mastra/loggers';
|
|
1850
1938
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1939
|
+
import { Observability } from '@mastra/observability';
|
|
1851
1940
|
${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
|
|
1852
1941
|
${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
|
|
1942
|
+
${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
|
|
1853
1943
|
|
|
1854
1944
|
export const mastra = new Mastra({
|
|
1855
1945
|
${filteredExports.join("\n ")}
|
|
1856
1946
|
storage: new LibSQLStore({
|
|
1857
|
-
|
|
1947
|
+
id: "mastra-storage",
|
|
1948
|
+
// stores observability, scores, ... into memory storage, if it needs to persist, change to file:../mastra.db
|
|
1858
1949
|
url: ":memory:",
|
|
1859
1950
|
}),
|
|
1860
1951
|
logger: new PinoLogger({
|
|
1861
1952
|
name: 'Mastra',
|
|
1862
1953
|
level: 'info',
|
|
1863
1954
|
}),
|
|
1955
|
+
observability: new Observability({
|
|
1956
|
+
// Enables DefaultExporter and CloudExporter for tracing
|
|
1957
|
+
default: { enabled: true },
|
|
1958
|
+
}),
|
|
1864
1959
|
});
|
|
1865
1960
|
`
|
|
1866
1961
|
);
|
|
@@ -1868,7 +1963,6 @@ export const mastra = new Mastra({
|
|
|
1868
1963
|
throw err;
|
|
1869
1964
|
}
|
|
1870
1965
|
};
|
|
1871
|
-
yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
|
|
1872
1966
|
var getAPIKey = async (provider) => {
|
|
1873
1967
|
let key = "OPENAI_API_KEY";
|
|
1874
1968
|
switch (provider) {
|
|
@@ -1884,27 +1978,28 @@ var getAPIKey = async (provider) => {
|
|
|
1884
1978
|
case "cerebras":
|
|
1885
1979
|
key = "CEREBRAS_API_KEY";
|
|
1886
1980
|
return key;
|
|
1981
|
+
case "mistral":
|
|
1982
|
+
key = "MISTRAL_API_KEY";
|
|
1983
|
+
return key;
|
|
1887
1984
|
default:
|
|
1888
1985
|
return key;
|
|
1889
1986
|
}
|
|
1890
1987
|
};
|
|
1891
|
-
var writeAPIKey = async ({
|
|
1892
|
-
|
|
1893
|
-
apiKey = "your-api-key"
|
|
1894
|
-
}) => {
|
|
1988
|
+
var writeAPIKey = async ({ provider, apiKey }) => {
|
|
1989
|
+
const envFileName = apiKey ? ".env" : ".env.example";
|
|
1895
1990
|
const key = await getAPIKey(provider);
|
|
1896
|
-
const escapedKey =
|
|
1897
|
-
const escapedApiKey =
|
|
1898
|
-
await exec(`echo ${escapedKey}=${escapedApiKey} >>
|
|
1991
|
+
const escapedKey = shellQuote2.quote([key]);
|
|
1992
|
+
const escapedApiKey = shellQuote2.quote([apiKey ? apiKey : "your-api-key"]);
|
|
1993
|
+
await exec(`echo ${escapedKey}=${escapedApiKey} >> ${envFileName}`);
|
|
1899
1994
|
};
|
|
1900
1995
|
var createMastraDir = async (directory) => {
|
|
1901
1996
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
1902
|
-
const dirPath =
|
|
1997
|
+
const dirPath = path3.join(process.cwd(), ...dir, "mastra");
|
|
1903
1998
|
try {
|
|
1904
1999
|
await fs4.access(dirPath);
|
|
1905
2000
|
return { ok: false };
|
|
1906
2001
|
} catch {
|
|
1907
|
-
await
|
|
2002
|
+
await fsExtra.ensureDir(dirPath);
|
|
1908
2003
|
return { ok: true, dirPath };
|
|
1909
2004
|
}
|
|
1910
2005
|
};
|
|
@@ -1916,42 +2011,35 @@ var writeCodeSample = async (dirPath, component, llmProvider, importComponents)
|
|
|
1916
2011
|
throw err;
|
|
1917
2012
|
}
|
|
1918
2013
|
};
|
|
1919
|
-
var
|
|
1920
|
-
|
|
1921
|
-
|
|
2014
|
+
var LLM_PROVIDERS = [
|
|
2015
|
+
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
2016
|
+
{ value: "anthropic", label: "Anthropic" },
|
|
2017
|
+
{ value: "groq", label: "Groq" },
|
|
2018
|
+
{ value: "google", label: "Google" },
|
|
2019
|
+
{ value: "cerebras", label: "Cerebras" },
|
|
2020
|
+
{ value: "mistral", label: "Mistral" }
|
|
2021
|
+
];
|
|
2022
|
+
var interactivePrompt = async (args = {}) => {
|
|
2023
|
+
const { skip = {}, options: { showBanner = true } = {} } = args;
|
|
2024
|
+
if (showBanner) {
|
|
2025
|
+
Ie(color2.inverse(" Mastra Init "));
|
|
2026
|
+
}
|
|
2027
|
+
const mastraProject = await Ce(
|
|
1922
2028
|
{
|
|
1923
|
-
directory: () =>
|
|
2029
|
+
directory: () => he({
|
|
1924
2030
|
message: "Where should we create the Mastra files? (default: src/)",
|
|
1925
2031
|
placeholder: "src/",
|
|
1926
2032
|
defaultValue: "src/"
|
|
1927
2033
|
}),
|
|
1928
|
-
|
|
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
|
-
]
|
|
2034
|
+
llmProvider: () => skip?.llmProvider ? void 0 : ve({
|
|
2035
|
+
message: "Select a default provider:",
|
|
2036
|
+
options: LLM_PROVIDERS
|
|
1951
2037
|
}),
|
|
1952
2038
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
1953
|
-
|
|
1954
|
-
|
|
2039
|
+
if (skip?.llmApiKey) return void 0;
|
|
2040
|
+
const llmName = LLM_PROVIDERS.find((p6) => p6.value === llmProvider)?.label || "provider";
|
|
2041
|
+
const keyChoice = await ve({
|
|
2042
|
+
message: `Enter your ${llmName} API key?`,
|
|
1955
2043
|
options: [
|
|
1956
2044
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1957
2045
|
{ value: "enter", label: "Enter API key" }
|
|
@@ -1959,79 +2047,61 @@ var interactivePrompt = async () => {
|
|
|
1959
2047
|
initialValue: "skip"
|
|
1960
2048
|
});
|
|
1961
2049
|
if (keyChoice === "enter") {
|
|
1962
|
-
return
|
|
2050
|
+
return he({
|
|
1963
2051
|
message: "Enter your API key:",
|
|
1964
|
-
placeholder: "sk-..."
|
|
2052
|
+
placeholder: "sk-...",
|
|
2053
|
+
validate: (value) => {
|
|
2054
|
+
if (value.length === 0) return "API key cannot be empty";
|
|
2055
|
+
}
|
|
1965
2056
|
});
|
|
1966
2057
|
}
|
|
1967
2058
|
return void 0;
|
|
1968
2059
|
},
|
|
1969
|
-
addExample: () => ce({
|
|
1970
|
-
message: "Add example",
|
|
1971
|
-
initialValue: false
|
|
1972
|
-
}),
|
|
1973
2060
|
configureEditorWithDocsMCP: async () => {
|
|
1974
|
-
const
|
|
1975
|
-
|
|
1976
|
-
const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
|
|
1977
|
-
const editor = await le({
|
|
1978
|
-
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
2061
|
+
const editor = await ve({
|
|
2062
|
+
message: `Make your IDE into a Mastra expert? (Installs Mastra's MCP server)`,
|
|
1979
2063
|
options: [
|
|
1980
2064
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1981
2065
|
{
|
|
1982
2066
|
value: "cursor",
|
|
1983
|
-
label: "Cursor (project only)"
|
|
1984
|
-
hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
|
|
2067
|
+
label: "Cursor (project only)"
|
|
1985
2068
|
},
|
|
1986
2069
|
{
|
|
1987
2070
|
value: "cursor-global",
|
|
1988
|
-
label: "Cursor (global, all projects)"
|
|
1989
|
-
hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
|
|
2071
|
+
label: "Cursor (global, all projects)"
|
|
1990
2072
|
},
|
|
1991
2073
|
{
|
|
1992
2074
|
value: "windsurf",
|
|
1993
|
-
label: "Windsurf"
|
|
1994
|
-
hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
|
|
2075
|
+
label: "Windsurf"
|
|
1995
2076
|
},
|
|
1996
2077
|
{
|
|
1997
2078
|
value: "vscode",
|
|
1998
|
-
label: "VSCode"
|
|
1999
|
-
hint: vscodeIsAlreadyInstalled ? `Already installed` : void 0
|
|
2079
|
+
label: "VSCode"
|
|
2000
2080
|
}
|
|
2001
2081
|
]
|
|
2002
2082
|
});
|
|
2003
2083
|
if (editor === `skip`) return void 0;
|
|
2004
|
-
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
2005
|
-
v.message(`
|
|
2006
|
-
Windsurf is already installed, skipping.`);
|
|
2007
|
-
return void 0;
|
|
2008
|
-
}
|
|
2009
|
-
if (editor === `vscode` && vscodeIsAlreadyInstalled) {
|
|
2010
|
-
v.message(`
|
|
2011
|
-
VSCode is already installed, skipping.`);
|
|
2012
|
-
return void 0;
|
|
2013
|
-
}
|
|
2014
2084
|
if (editor === `cursor`) {
|
|
2015
|
-
|
|
2085
|
+
M.message(
|
|
2016
2086
|
`
|
|
2017
2087
|
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
2018
2088
|
`
|
|
2019
2089
|
);
|
|
2020
2090
|
}
|
|
2021
2091
|
if (editor === `cursor-global`) {
|
|
2022
|
-
const
|
|
2092
|
+
const confirm = await ve({
|
|
2023
2093
|
message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
|
|
2024
2094
|
options: [
|
|
2025
2095
|
{ value: "yes", label: "Yes, I understand" },
|
|
2026
2096
|
{ value: "skip", label: "No, skip for now" }
|
|
2027
2097
|
]
|
|
2028
2098
|
});
|
|
2029
|
-
if (
|
|
2099
|
+
if (confirm !== `yes`) {
|
|
2030
2100
|
return void 0;
|
|
2031
2101
|
}
|
|
2032
2102
|
}
|
|
2033
2103
|
if (editor === `windsurf`) {
|
|
2034
|
-
const
|
|
2104
|
+
const confirm = await ve({
|
|
2035
2105
|
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
2036
2106
|
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
2037
2107
|
options: [
|
|
@@ -2039,7 +2109,7 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
2039
2109
|
{ value: "skip", label: "No, skip for now" }
|
|
2040
2110
|
]
|
|
2041
2111
|
});
|
|
2042
|
-
if (
|
|
2112
|
+
if (confirm !== `yes`) {
|
|
2043
2113
|
return void 0;
|
|
2044
2114
|
}
|
|
2045
2115
|
}
|
|
@@ -2048,26 +2118,231 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
2048
2118
|
},
|
|
2049
2119
|
{
|
|
2050
2120
|
onCancel: () => {
|
|
2051
|
-
|
|
2121
|
+
xe("Operation cancelled.");
|
|
2052
2122
|
process.exit(0);
|
|
2053
2123
|
}
|
|
2054
2124
|
}
|
|
2055
2125
|
);
|
|
2056
|
-
|
|
2057
|
-
const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
|
|
2058
|
-
return { ...rest, components: mastraComponents };
|
|
2126
|
+
return mastraProject;
|
|
2059
2127
|
};
|
|
2060
|
-
|
|
2128
|
+
function getPackageManager() {
|
|
2129
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
2130
|
+
const execPath = process.env.npm_execpath || "";
|
|
2131
|
+
if (userAgent.includes("yarn")) {
|
|
2132
|
+
return "yarn";
|
|
2133
|
+
}
|
|
2134
|
+
if (userAgent.includes("pnpm")) {
|
|
2135
|
+
return "pnpm";
|
|
2136
|
+
}
|
|
2137
|
+
if (userAgent.includes("npm")) {
|
|
2138
|
+
return "npm";
|
|
2139
|
+
}
|
|
2140
|
+
if (execPath.includes("yarn")) {
|
|
2141
|
+
return "yarn";
|
|
2142
|
+
}
|
|
2143
|
+
if (execPath.includes("pnpm")) {
|
|
2144
|
+
return "pnpm";
|
|
2145
|
+
}
|
|
2146
|
+
if (execPath.includes("npm")) {
|
|
2147
|
+
return "npm";
|
|
2148
|
+
}
|
|
2149
|
+
return "npm";
|
|
2150
|
+
}
|
|
2151
|
+
var logger = createLogger(false);
|
|
2152
|
+
function createLogger(debug = false) {
|
|
2153
|
+
return new PinoLogger({
|
|
2154
|
+
name: "Mastra CLI",
|
|
2155
|
+
level: debug ? "debug" : "info"
|
|
2156
|
+
});
|
|
2157
|
+
}
|
|
2061
2158
|
var exec2 = util.promisify(child_process.exec);
|
|
2159
|
+
async function cloneTemplate(options) {
|
|
2160
|
+
const { template, projectName, targetDir, branch, llmProvider } = options;
|
|
2161
|
+
const projectPath = targetDir ? path3.resolve(targetDir, projectName) : path3.resolve(projectName);
|
|
2162
|
+
const spinner4 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
|
|
2163
|
+
try {
|
|
2164
|
+
if (await directoryExists(projectPath)) {
|
|
2165
|
+
spinner4.error(`Directory ${projectName} already exists`);
|
|
2166
|
+
throw new Error(`Directory ${projectName} already exists`);
|
|
2167
|
+
}
|
|
2168
|
+
await cloneRepositoryWithoutGit(template.githubUrl, projectPath, branch);
|
|
2169
|
+
await updatePackageJson(projectPath, projectName);
|
|
2170
|
+
const envExamplePath = path3.join(projectPath, ".env.example");
|
|
2171
|
+
if (await fileExists(envExamplePath)) {
|
|
2172
|
+
const envPath = path3.join(projectPath, ".env");
|
|
2173
|
+
await fs4.copyFile(envExamplePath, envPath);
|
|
2174
|
+
if (llmProvider) {
|
|
2175
|
+
await updateEnvFile(envPath, llmProvider);
|
|
2176
|
+
}
|
|
2177
|
+
}
|
|
2178
|
+
spinner4.success(`Template "${template.title}" cloned successfully to ${projectName}`);
|
|
2179
|
+
return projectPath;
|
|
2180
|
+
} catch (error) {
|
|
2181
|
+
spinner4.error(`Failed to clone template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2182
|
+
throw error;
|
|
2183
|
+
}
|
|
2184
|
+
}
|
|
2185
|
+
async function directoryExists(dirPath) {
|
|
2186
|
+
try {
|
|
2187
|
+
const stat = await fs4.stat(dirPath);
|
|
2188
|
+
return stat.isDirectory();
|
|
2189
|
+
} catch {
|
|
2190
|
+
return false;
|
|
2191
|
+
}
|
|
2192
|
+
}
|
|
2193
|
+
async function fileExists(filePath) {
|
|
2194
|
+
try {
|
|
2195
|
+
const stat = await fs4.stat(filePath);
|
|
2196
|
+
return stat.isFile();
|
|
2197
|
+
} catch {
|
|
2198
|
+
return false;
|
|
2199
|
+
}
|
|
2200
|
+
}
|
|
2201
|
+
async function cloneRepositoryWithoutGit(repoUrl, targetPath, branch) {
|
|
2202
|
+
await fs4.mkdir(targetPath, { recursive: true });
|
|
2203
|
+
try {
|
|
2204
|
+
const degitRepo = repoUrl.replace("https://github.com/", "");
|
|
2205
|
+
const degitRepoWithBranch = branch ? `${degitRepo}#${branch}` : degitRepo;
|
|
2206
|
+
const degitCommand = shellQuote2.quote(["npx", "degit", degitRepoWithBranch, targetPath]);
|
|
2207
|
+
await exec2(degitCommand, {
|
|
2208
|
+
cwd: process.cwd()
|
|
2209
|
+
});
|
|
2210
|
+
} catch {
|
|
2211
|
+
try {
|
|
2212
|
+
const gitArgs = ["git", "clone"];
|
|
2213
|
+
if (branch) {
|
|
2214
|
+
gitArgs.push("--branch", branch);
|
|
2215
|
+
}
|
|
2216
|
+
gitArgs.push(repoUrl, targetPath);
|
|
2217
|
+
const gitCommand = shellQuote2.quote(gitArgs);
|
|
2218
|
+
await exec2(gitCommand, {
|
|
2219
|
+
cwd: process.cwd()
|
|
2220
|
+
});
|
|
2221
|
+
const gitDir = path3.join(targetPath, ".git");
|
|
2222
|
+
if (await directoryExists(gitDir)) {
|
|
2223
|
+
await fs4.rm(gitDir, { recursive: true, force: true });
|
|
2224
|
+
}
|
|
2225
|
+
} catch (gitError) {
|
|
2226
|
+
throw new Error(`Failed to clone repository: ${gitError instanceof Error ? gitError.message : "Unknown error"}`);
|
|
2227
|
+
}
|
|
2228
|
+
}
|
|
2229
|
+
}
|
|
2230
|
+
async function updatePackageJson(projectPath, projectName) {
|
|
2231
|
+
const packageJsonPath = path3.join(projectPath, "package.json");
|
|
2232
|
+
try {
|
|
2233
|
+
const packageJsonContent = await fs4.readFile(packageJsonPath, "utf-8");
|
|
2234
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2235
|
+
packageJson.name = projectName;
|
|
2236
|
+
await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), "utf-8");
|
|
2237
|
+
} catch (error) {
|
|
2238
|
+
logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2239
|
+
}
|
|
2240
|
+
}
|
|
2241
|
+
async function updateEnvFile(envPath, llmProvider) {
|
|
2242
|
+
try {
|
|
2243
|
+
const envContent = await fs4.readFile(envPath, "utf-8");
|
|
2244
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
2245
|
+
if (!modelString) {
|
|
2246
|
+
logger.warn(`Could not get model identifier for provider: ${llmProvider}`);
|
|
2247
|
+
return;
|
|
2248
|
+
}
|
|
2249
|
+
const modelValue = modelString.replace(/'/g, "");
|
|
2250
|
+
const updatedContent = envContent.replace(/^MODEL=.*/m, `MODEL=${modelValue}`);
|
|
2251
|
+
await fs4.writeFile(envPath, updatedContent, "utf-8");
|
|
2252
|
+
logger.info(`Updated MODEL in .env to ${modelValue}`);
|
|
2253
|
+
} catch (error) {
|
|
2254
|
+
logger.warn(`Could not update .env file: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2255
|
+
}
|
|
2256
|
+
}
|
|
2257
|
+
async function installDependencies(projectPath, packageManager) {
|
|
2258
|
+
const spinner4 = yoctoSpinner({ text: "Installing dependencies..." }).start();
|
|
2259
|
+
try {
|
|
2260
|
+
const pm = packageManager || getPackageManager();
|
|
2261
|
+
const installCommand = shellQuote2.quote([pm, "install"]);
|
|
2262
|
+
await exec2(installCommand, {
|
|
2263
|
+
cwd: projectPath
|
|
2264
|
+
});
|
|
2265
|
+
spinner4.success("Dependencies installed successfully");
|
|
2266
|
+
} catch (error) {
|
|
2267
|
+
spinner4.error(`Failed to install dependencies: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2268
|
+
throw error;
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
var TEMPLATES_API_URL = process.env.MASTRA_TEMPLATES_API_URL || "https://mastra.ai/api/templates.json";
|
|
2272
|
+
async function loadTemplates() {
|
|
2273
|
+
try {
|
|
2274
|
+
const response = await fetch(TEMPLATES_API_URL);
|
|
2275
|
+
if (!response.ok) {
|
|
2276
|
+
throw new Error(`Failed to fetch templates: ${response.statusText}`);
|
|
2277
|
+
}
|
|
2278
|
+
const templates = await response.json();
|
|
2279
|
+
return templates;
|
|
2280
|
+
} catch (error) {
|
|
2281
|
+
console.error("Error loading templates:", error);
|
|
2282
|
+
throw new Error("Failed to load templates. Please check your internet connection and try again.");
|
|
2283
|
+
}
|
|
2284
|
+
}
|
|
2285
|
+
function pluralize(count, singular, plural) {
|
|
2286
|
+
return count === 1 ? singular : plural || `${singular}s`;
|
|
2287
|
+
}
|
|
2288
|
+
async function selectTemplate(templates) {
|
|
2289
|
+
const choices = templates.map((template) => {
|
|
2290
|
+
const parts = [];
|
|
2291
|
+
if (template.agents?.length) {
|
|
2292
|
+
parts.push(`${template.agents.length} ${pluralize(template.agents.length, "agent")}`);
|
|
2293
|
+
}
|
|
2294
|
+
if (template.tools?.length) {
|
|
2295
|
+
parts.push(`${template.tools.length} ${pluralize(template.tools.length, "tool")}`);
|
|
2296
|
+
}
|
|
2297
|
+
if (template.workflows?.length) {
|
|
2298
|
+
parts.push(`${template.workflows.length} ${pluralize(template.workflows.length, "workflow")}`);
|
|
2299
|
+
}
|
|
2300
|
+
if (template.mcp?.length) {
|
|
2301
|
+
parts.push(`${template.mcp.length} ${pluralize(template.mcp.length, "MCP server")}`);
|
|
2302
|
+
}
|
|
2303
|
+
if (template.networks?.length) {
|
|
2304
|
+
parts.push(`${template.networks.length} ${pluralize(template.networks.length, "agent network")}`);
|
|
2305
|
+
}
|
|
2306
|
+
return {
|
|
2307
|
+
value: template,
|
|
2308
|
+
label: template.title,
|
|
2309
|
+
hint: parts.join(", ") || "Template components"
|
|
2310
|
+
};
|
|
2311
|
+
});
|
|
2312
|
+
const selected = await ve({
|
|
2313
|
+
message: "Select a template:",
|
|
2314
|
+
options: choices
|
|
2315
|
+
});
|
|
2316
|
+
if (pD(selected)) {
|
|
2317
|
+
return null;
|
|
2318
|
+
}
|
|
2319
|
+
return selected;
|
|
2320
|
+
}
|
|
2321
|
+
function findTemplateByName(templates, templateName) {
|
|
2322
|
+
let template = templates.find((t) => t.slug === templateName);
|
|
2323
|
+
if (template) return template;
|
|
2324
|
+
const slugWithPrefix = `template-${templateName}`;
|
|
2325
|
+
template = templates.find((t) => t.slug === slugWithPrefix);
|
|
2326
|
+
if (template) return template;
|
|
2327
|
+
template = templates.find((t) => t.title.toLowerCase() === templateName.toLowerCase());
|
|
2328
|
+
if (template) return template;
|
|
2329
|
+
return null;
|
|
2330
|
+
}
|
|
2331
|
+
function getDefaultProjectName(template) {
|
|
2332
|
+
return template.slug.replace(/^template-/, "");
|
|
2333
|
+
}
|
|
2334
|
+
var s = Y();
|
|
2062
2335
|
var init = async ({
|
|
2063
|
-
directory,
|
|
2064
|
-
addExample = false,
|
|
2336
|
+
directory = "src/",
|
|
2065
2337
|
components,
|
|
2066
2338
|
llmProvider = "openai",
|
|
2067
2339
|
llmApiKey,
|
|
2068
|
-
|
|
2340
|
+
addExample = false,
|
|
2341
|
+
configureEditorWithDocsMCP,
|
|
2342
|
+
versionTag
|
|
2069
2343
|
}) => {
|
|
2070
2344
|
s.start("Initializing Mastra");
|
|
2345
|
+
const packageVersionTag = versionTag ? `@${versionTag}` : "";
|
|
2071
2346
|
try {
|
|
2072
2347
|
const result = await createMastraDir(directory);
|
|
2073
2348
|
if (!result.ok) {
|
|
@@ -2080,7 +2355,8 @@ var init = async ({
|
|
|
2080
2355
|
dirPath,
|
|
2081
2356
|
addExample,
|
|
2082
2357
|
addWorkflow: components.includes("workflows"),
|
|
2083
|
-
addAgent: components.includes("agents")
|
|
2358
|
+
addAgent: components.includes("agents"),
|
|
2359
|
+
addScorers: components.includes("scorers")
|
|
2084
2360
|
}),
|
|
2085
2361
|
...components.map((component) => createComponentsDir(dirPath, component)),
|
|
2086
2362
|
writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
|
|
@@ -2094,39 +2370,43 @@ var init = async ({
|
|
|
2094
2370
|
const depService = new DepsService();
|
|
2095
2371
|
const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
|
|
2096
2372
|
if (needsLibsql) {
|
|
2097
|
-
await depService.installPackages([
|
|
2373
|
+
await depService.installPackages([`@mastra/libsql${packageVersionTag}`]);
|
|
2098
2374
|
}
|
|
2099
2375
|
const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
|
|
2100
2376
|
if (needsMemory) {
|
|
2101
|
-
await depService.installPackages([
|
|
2377
|
+
await depService.installPackages([`@mastra/memory${packageVersionTag}`]);
|
|
2102
2378
|
}
|
|
2103
2379
|
const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
|
|
2104
2380
|
if (needsLoggers) {
|
|
2105
|
-
await depService.installPackages([
|
|
2381
|
+
await depService.installPackages([`@mastra/loggers${packageVersionTag}`]);
|
|
2382
|
+
}
|
|
2383
|
+
const needsObservability = await depService.checkDependencies(["@mastra/observability"]) !== `ok`;
|
|
2384
|
+
if (needsObservability) {
|
|
2385
|
+
await depService.installPackages([`@mastra/observability${packageVersionTag}`]);
|
|
2386
|
+
}
|
|
2387
|
+
const needsEvals = components.includes(`scorers`) && await depService.checkDependencies(["@mastra/evals"]) !== `ok`;
|
|
2388
|
+
if (needsEvals) {
|
|
2389
|
+
await depService.installPackages([`@mastra/evals${packageVersionTag}`]);
|
|
2106
2390
|
}
|
|
2107
2391
|
}
|
|
2108
2392
|
const key = await getAPIKey(llmProvider || "openai");
|
|
2109
|
-
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
2110
|
-
const depsService = new DepsService();
|
|
2111
|
-
const pm = depsService.packageManager;
|
|
2112
|
-
const installCommand = getPackageManagerInstallCommand(pm);
|
|
2113
|
-
await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
|
|
2114
2393
|
if (configureEditorWithDocsMCP) {
|
|
2115
2394
|
await installMastraDocsMCPServer({
|
|
2116
2395
|
editor: configureEditorWithDocsMCP,
|
|
2117
|
-
directory: process.cwd()
|
|
2396
|
+
directory: process.cwd(),
|
|
2397
|
+
versionTag
|
|
2118
2398
|
});
|
|
2119
2399
|
}
|
|
2120
2400
|
s.stop();
|
|
2121
2401
|
if (!llmApiKey) {
|
|
2122
|
-
|
|
2402
|
+
Me(`
|
|
2123
2403
|
${color2.green("Mastra initialized successfully!")}
|
|
2124
2404
|
|
|
2125
2405
|
Add your ${color2.cyan(key)} as an environment variable
|
|
2126
2406
|
in your ${color2.cyan(".env")} file
|
|
2127
2407
|
`);
|
|
2128
2408
|
} else {
|
|
2129
|
-
|
|
2409
|
+
Me(`
|
|
2130
2410
|
${color2.green("Mastra initialized successfully!")}
|
|
2131
2411
|
`);
|
|
2132
2412
|
}
|
|
@@ -2160,71 +2440,101 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
2160
2440
|
throw error;
|
|
2161
2441
|
}
|
|
2162
2442
|
} catch (error) {
|
|
2163
|
-
console.error(error);
|
|
2164
2443
|
throw error;
|
|
2165
2444
|
}
|
|
2166
2445
|
};
|
|
2167
2446
|
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
2168
|
-
let installCommand =
|
|
2447
|
+
let installCommand = getPackageManagerAddCommand(pm);
|
|
2169
2448
|
if (isDev) {
|
|
2170
|
-
installCommand = `${installCommand}
|
|
2449
|
+
installCommand = `${installCommand} -D`;
|
|
2171
2450
|
}
|
|
2172
2451
|
try {
|
|
2173
2452
|
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
2174
2453
|
} catch (err) {
|
|
2175
|
-
console.log("err", err);
|
|
2176
2454
|
if (versionTag === "@latest") {
|
|
2177
|
-
throw
|
|
2455
|
+
throw new Error(
|
|
2456
|
+
`Failed to install ${dependency}@latest: ${err instanceof Error ? err.message : "Unknown error"}`
|
|
2457
|
+
);
|
|
2458
|
+
}
|
|
2459
|
+
try {
|
|
2460
|
+
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
2461
|
+
} catch (fallbackErr) {
|
|
2462
|
+
throw new Error(
|
|
2463
|
+
`Failed to install ${dependency} (tried ${versionTag} and @latest): ${fallbackErr instanceof Error ? fallbackErr.message : "Unknown error"}`
|
|
2464
|
+
);
|
|
2178
2465
|
}
|
|
2179
|
-
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
2180
2466
|
}
|
|
2181
2467
|
}
|
|
2182
2468
|
var createMastraProject = async ({
|
|
2183
2469
|
projectName: name,
|
|
2184
2470
|
createVersionTag,
|
|
2185
|
-
timeout
|
|
2471
|
+
timeout,
|
|
2472
|
+
llmProvider,
|
|
2473
|
+
llmApiKey,
|
|
2474
|
+
needsInteractive
|
|
2186
2475
|
}) => {
|
|
2187
|
-
|
|
2188
|
-
const projectName = name ?? await
|
|
2476
|
+
Ie(color2.inverse(" Mastra Create "));
|
|
2477
|
+
const projectName = name ?? await he({
|
|
2189
2478
|
message: "What do you want to name your project?",
|
|
2190
2479
|
placeholder: "my-mastra-app",
|
|
2191
|
-
defaultValue: "my-mastra-app"
|
|
2480
|
+
defaultValue: "my-mastra-app",
|
|
2481
|
+
validate: (value) => {
|
|
2482
|
+
if (value.length === 0) return "Project name cannot be empty";
|
|
2483
|
+
if (fs3__default__default.existsSync(value)) {
|
|
2484
|
+
return `A directory named "${value}" already exists. Please choose a different name.`;
|
|
2485
|
+
}
|
|
2486
|
+
}
|
|
2192
2487
|
});
|
|
2193
|
-
if (
|
|
2194
|
-
|
|
2488
|
+
if (pD(projectName)) {
|
|
2489
|
+
xe("Operation cancelled");
|
|
2195
2490
|
process.exit(0);
|
|
2196
2491
|
}
|
|
2197
|
-
|
|
2198
|
-
|
|
2492
|
+
let result;
|
|
2493
|
+
if (needsInteractive) {
|
|
2494
|
+
result = await interactivePrompt({
|
|
2495
|
+
options: { showBanner: false },
|
|
2496
|
+
skip: { llmProvider: llmProvider !== void 0, llmApiKey: llmApiKey !== void 0 }
|
|
2497
|
+
});
|
|
2498
|
+
}
|
|
2499
|
+
const s2 = Y();
|
|
2199
2500
|
try {
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2501
|
+
s2.start("Creating project");
|
|
2502
|
+
try {
|
|
2503
|
+
await fs4.mkdir(projectName);
|
|
2504
|
+
} catch (error) {
|
|
2505
|
+
if (error instanceof Error && "code" in error && error.code === "EEXIST") {
|
|
2506
|
+
s2.stop(`A directory named "${projectName}" already exists. Please choose a different name.`);
|
|
2507
|
+
process.exit(1);
|
|
2508
|
+
}
|
|
2509
|
+
throw new Error(
|
|
2510
|
+
`Failed to create project directory: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2205
2511
|
);
|
|
2206
|
-
process.exit(1);
|
|
2207
2512
|
}
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2513
|
+
process.chdir(projectName);
|
|
2514
|
+
const pm = getPackageManager();
|
|
2515
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
2516
|
+
s2.message("Initializing project structure");
|
|
2517
|
+
try {
|
|
2518
|
+
await exec3(`npm init -y`);
|
|
2519
|
+
await exec3(`npm pkg set type="module"`);
|
|
2520
|
+
await exec3(`npm pkg set engines.node=">=20.9.0"`);
|
|
2521
|
+
const depsService = new DepsService();
|
|
2522
|
+
await depsService.addScriptsToPackageJson({
|
|
2523
|
+
dev: "mastra dev",
|
|
2524
|
+
build: "mastra build",
|
|
2525
|
+
start: "mastra start"
|
|
2526
|
+
});
|
|
2527
|
+
} catch (error) {
|
|
2528
|
+
throw new Error(
|
|
2529
|
+
`Failed to initialize project structure: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2530
|
+
);
|
|
2531
|
+
}
|
|
2532
|
+
s2.stop("Project structure created");
|
|
2533
|
+
s2.start(`Installing ${pm} dependencies`);
|
|
2534
|
+
try {
|
|
2535
|
+
await exec3(`${pm} ${installCommand} zod@^4`);
|
|
2536
|
+
await exec3(`${pm} ${installCommand} -D typescript @types/node`);
|
|
2537
|
+
await exec3(`echo '{
|
|
2228
2538
|
"compilerOptions": {
|
|
2229
2539
|
"target": "ES2022",
|
|
2230
2540
|
"module": "ES2022",
|
|
@@ -2240,81 +2550,298 @@ var createMastraProject = async ({
|
|
|
2240
2550
|
"src/**/*"
|
|
2241
2551
|
]
|
|
2242
2552
|
}' > tsconfig.json`);
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2553
|
+
} catch (error) {
|
|
2554
|
+
throw new Error(
|
|
2555
|
+
`Failed to install basic dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2556
|
+
);
|
|
2557
|
+
}
|
|
2558
|
+
s2.stop(`${pm} dependencies installed`);
|
|
2559
|
+
s2.start("Installing Mastra CLI");
|
|
2560
|
+
const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
|
|
2561
|
+
try {
|
|
2562
|
+
await installMastraDependency(pm, "mastra", versionTag, true, timeout);
|
|
2563
|
+
} catch (error) {
|
|
2564
|
+
throw new Error(`Failed to install Mastra CLI: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2565
|
+
}
|
|
2566
|
+
s2.stop("Mastra CLI installed");
|
|
2567
|
+
s2.start("Installing Mastra dependencies");
|
|
2568
|
+
try {
|
|
2569
|
+
await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
|
|
2570
|
+
await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
|
|
2571
|
+
await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
|
|
2572
|
+
} catch (error) {
|
|
2573
|
+
throw new Error(
|
|
2574
|
+
`Failed to install Mastra dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2575
|
+
);
|
|
2576
|
+
}
|
|
2577
|
+
s2.stop("Mastra dependencies installed");
|
|
2578
|
+
s2.start("Adding .gitignore");
|
|
2579
|
+
try {
|
|
2580
|
+
await exec3(`echo output.txt >> .gitignore`);
|
|
2581
|
+
await exec3(`echo node_modules >> .gitignore`);
|
|
2582
|
+
await exec3(`echo dist >> .gitignore`);
|
|
2583
|
+
await exec3(`echo .mastra >> .gitignore`);
|
|
2584
|
+
await exec3(`echo .env.development >> .gitignore`);
|
|
2585
|
+
await exec3(`echo .env >> .gitignore`);
|
|
2586
|
+
await exec3(`echo *.db >> .gitignore`);
|
|
2587
|
+
await exec3(`echo *.db-* >> .gitignore`);
|
|
2588
|
+
} catch (error) {
|
|
2589
|
+
throw new Error(`Failed to create .gitignore: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2590
|
+
}
|
|
2591
|
+
s2.stop(".gitignore added");
|
|
2592
|
+
Se("Project created successfully");
|
|
2593
|
+
console.info("");
|
|
2594
|
+
return { projectName, result };
|
|
2595
|
+
} catch (error) {
|
|
2596
|
+
s2.stop();
|
|
2597
|
+
const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred";
|
|
2598
|
+
xe(`Project creation failed: ${errorMessage}`);
|
|
2599
|
+
process.exit(1);
|
|
2600
|
+
}
|
|
2266
2601
|
};
|
|
2267
|
-
var
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2602
|
+
var version$1 = package_default.version;
|
|
2603
|
+
var create = async (args) => {
|
|
2604
|
+
if (args.template !== void 0) {
|
|
2605
|
+
await createFromTemplate({
|
|
2606
|
+
projectName: args.projectName,
|
|
2607
|
+
template: args.template,
|
|
2608
|
+
timeout: args.timeout,
|
|
2609
|
+
injectedAnalytics: args.analytics,
|
|
2610
|
+
llmProvider: args.llmProvider
|
|
2611
|
+
});
|
|
2612
|
+
return;
|
|
2613
|
+
}
|
|
2614
|
+
const needsInteractive = args.components === void 0 || args.llmProvider === void 0 || args.addExample === void 0;
|
|
2615
|
+
const { projectName, result } = await createMastraProject({
|
|
2616
|
+
projectName: args?.projectName,
|
|
2617
|
+
createVersionTag: args?.createVersionTag,
|
|
2618
|
+
timeout: args?.timeout,
|
|
2619
|
+
llmProvider: args?.llmProvider,
|
|
2620
|
+
llmApiKey: args?.llmApiKey,
|
|
2621
|
+
needsInteractive
|
|
2272
2622
|
});
|
|
2273
|
-
const directory =
|
|
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();
|
|
2623
|
+
const directory = args.directory || "src/";
|
|
2624
|
+
if (needsInteractive && result) {
|
|
2278
2625
|
await init({
|
|
2279
2626
|
...result,
|
|
2280
|
-
llmApiKey: result?.llmApiKey
|
|
2627
|
+
llmApiKey: result?.llmApiKey,
|
|
2628
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
2629
|
+
addExample: true,
|
|
2630
|
+
versionTag: args.createVersionTag
|
|
2281
2631
|
});
|
|
2282
2632
|
postCreate({ projectName });
|
|
2283
|
-
console.log("done with interactive prompt");
|
|
2284
2633
|
return;
|
|
2285
2634
|
}
|
|
2286
|
-
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } =
|
|
2635
|
+
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
|
|
2287
2636
|
await init({
|
|
2288
2637
|
directory,
|
|
2289
2638
|
components,
|
|
2290
2639
|
llmProvider,
|
|
2291
2640
|
addExample,
|
|
2292
2641
|
llmApiKey,
|
|
2293
|
-
configureEditorWithDocsMCP:
|
|
2642
|
+
configureEditorWithDocsMCP: args.mcpServer,
|
|
2643
|
+
versionTag: args.createVersionTag
|
|
2294
2644
|
});
|
|
2295
2645
|
postCreate({ projectName });
|
|
2296
2646
|
};
|
|
2297
2647
|
var postCreate = ({ projectName }) => {
|
|
2298
2648
|
const packageManager = getPackageManager();
|
|
2299
|
-
|
|
2649
|
+
Se(`
|
|
2300
2650
|
${color2.green("To start your project:")}
|
|
2301
2651
|
|
|
2302
2652
|
${color2.cyan("cd")} ${projectName}
|
|
2303
2653
|
${color2.cyan(`${packageManager} run dev`)}
|
|
2304
2654
|
`);
|
|
2305
2655
|
};
|
|
2656
|
+
function isGitHubUrl(url) {
|
|
2657
|
+
try {
|
|
2658
|
+
const parsedUrl = new URL(url);
|
|
2659
|
+
return parsedUrl.hostname === "github.com" && parsedUrl.pathname.split("/").length >= 3;
|
|
2660
|
+
} catch {
|
|
2661
|
+
return false;
|
|
2662
|
+
}
|
|
2663
|
+
}
|
|
2664
|
+
async function validateGitHubProject(githubUrl) {
|
|
2665
|
+
const errors = [];
|
|
2666
|
+
try {
|
|
2667
|
+
const urlParts = new URL(githubUrl).pathname.split("/").filter(Boolean);
|
|
2668
|
+
const owner = urlParts[0];
|
|
2669
|
+
const repo = urlParts[1]?.replace(".git", "");
|
|
2670
|
+
if (!owner || !repo) {
|
|
2671
|
+
throw new Error("Invalid GitHub URL format");
|
|
2672
|
+
}
|
|
2673
|
+
const branches = ["main", "master"];
|
|
2674
|
+
let packageJsonContent = null;
|
|
2675
|
+
let indexContent = null;
|
|
2676
|
+
for (const branch of branches) {
|
|
2677
|
+
try {
|
|
2678
|
+
const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/package.json`;
|
|
2679
|
+
const packageJsonResponse = await fetch(packageJsonUrl);
|
|
2680
|
+
if (packageJsonResponse.ok) {
|
|
2681
|
+
packageJsonContent = await packageJsonResponse.text();
|
|
2682
|
+
const indexUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/src/mastra/index.ts`;
|
|
2683
|
+
const indexResponse = await fetch(indexUrl);
|
|
2684
|
+
if (indexResponse.ok) {
|
|
2685
|
+
indexContent = await indexResponse.text();
|
|
2686
|
+
}
|
|
2687
|
+
break;
|
|
2688
|
+
}
|
|
2689
|
+
} catch {
|
|
2690
|
+
}
|
|
2691
|
+
}
|
|
2692
|
+
if (!packageJsonContent) {
|
|
2693
|
+
errors.push("Could not fetch package.json from repository");
|
|
2694
|
+
return { isValid: false, errors };
|
|
2695
|
+
}
|
|
2696
|
+
try {
|
|
2697
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2698
|
+
const hasMastraCore = packageJson.dependencies?.["@mastra/core"] || packageJson.devDependencies?.["@mastra/core"] || packageJson.peerDependencies?.["@mastra/core"];
|
|
2699
|
+
if (!hasMastraCore) {
|
|
2700
|
+
errors.push("Missing @mastra/core dependency in package.json");
|
|
2701
|
+
}
|
|
2702
|
+
} catch {
|
|
2703
|
+
errors.push("Invalid package.json format");
|
|
2704
|
+
}
|
|
2705
|
+
if (!indexContent) {
|
|
2706
|
+
errors.push("Missing src/mastra/index.ts file");
|
|
2707
|
+
} else {
|
|
2708
|
+
const hasMastraExport = indexContent.includes("export") && (indexContent.includes("new Mastra") || indexContent.includes("Mastra("));
|
|
2709
|
+
if (!hasMastraExport) {
|
|
2710
|
+
errors.push("src/mastra/index.ts does not export a Mastra instance");
|
|
2711
|
+
}
|
|
2712
|
+
}
|
|
2713
|
+
return { isValid: errors.length === 0, errors };
|
|
2714
|
+
} catch (error) {
|
|
2715
|
+
errors.push(`Failed to validate GitHub repository: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2716
|
+
return { isValid: false, errors };
|
|
2717
|
+
}
|
|
2718
|
+
}
|
|
2719
|
+
async function createFromGitHubUrl(url) {
|
|
2720
|
+
const urlParts = new URL(url).pathname.split("/").filter(Boolean);
|
|
2721
|
+
const owner = urlParts[0] || "unknown";
|
|
2722
|
+
const repo = urlParts[1] || "unknown";
|
|
2723
|
+
return {
|
|
2724
|
+
githubUrl: url,
|
|
2725
|
+
title: `${owner}/${repo}`,
|
|
2726
|
+
slug: repo,
|
|
2727
|
+
agents: [],
|
|
2728
|
+
mcp: [],
|
|
2729
|
+
tools: [],
|
|
2730
|
+
networks: [],
|
|
2731
|
+
workflows: []
|
|
2732
|
+
};
|
|
2733
|
+
}
|
|
2734
|
+
async function createFromTemplate(args) {
|
|
2735
|
+
let selectedTemplate;
|
|
2736
|
+
if (args.template === true) {
|
|
2737
|
+
const templates = await loadTemplates();
|
|
2738
|
+
const selected = await selectTemplate(templates);
|
|
2739
|
+
if (!selected) {
|
|
2740
|
+
M.info("No template selected. Exiting.");
|
|
2741
|
+
return;
|
|
2742
|
+
}
|
|
2743
|
+
selectedTemplate = selected;
|
|
2744
|
+
} else if (args.template && typeof args.template === "string") {
|
|
2745
|
+
if (isGitHubUrl(args.template)) {
|
|
2746
|
+
const spinner4 = Y();
|
|
2747
|
+
spinner4.start("Validating GitHub repository...");
|
|
2748
|
+
const validation = await validateGitHubProject(args.template);
|
|
2749
|
+
if (!validation.isValid) {
|
|
2750
|
+
spinner4.stop("Validation failed");
|
|
2751
|
+
M.error("This does not appear to be a valid Mastra project:");
|
|
2752
|
+
validation.errors.forEach((error) => M.error(` - ${error}`));
|
|
2753
|
+
throw new Error("Invalid Mastra project");
|
|
2754
|
+
}
|
|
2755
|
+
spinner4.stop("Valid Mastra project \u2713");
|
|
2756
|
+
selectedTemplate = await createFromGitHubUrl(args.template);
|
|
2757
|
+
} else {
|
|
2758
|
+
const templates = await loadTemplates();
|
|
2759
|
+
const found = findTemplateByName(templates, args.template);
|
|
2760
|
+
if (!found) {
|
|
2761
|
+
M.error(`Template "${args.template}" not found. Available templates:`);
|
|
2762
|
+
templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
|
|
2763
|
+
throw new Error(`Template "${args.template}" not found`);
|
|
2764
|
+
}
|
|
2765
|
+
selectedTemplate = found;
|
|
2766
|
+
}
|
|
2767
|
+
}
|
|
2768
|
+
if (!selectedTemplate) {
|
|
2769
|
+
throw new Error("No template selected");
|
|
2770
|
+
}
|
|
2771
|
+
let projectName = args.projectName;
|
|
2772
|
+
if (!projectName) {
|
|
2773
|
+
const defaultName = getDefaultProjectName(selectedTemplate);
|
|
2774
|
+
const response = await he({
|
|
2775
|
+
message: "What is your project name?",
|
|
2776
|
+
defaultValue: defaultName,
|
|
2777
|
+
placeholder: defaultName
|
|
2778
|
+
});
|
|
2779
|
+
if (pD(response)) {
|
|
2780
|
+
M.info("Project creation cancelled.");
|
|
2781
|
+
return;
|
|
2782
|
+
}
|
|
2783
|
+
projectName = response;
|
|
2784
|
+
}
|
|
2785
|
+
let llmProvider = args.llmProvider;
|
|
2786
|
+
if (!llmProvider) {
|
|
2787
|
+
const providerResponse = await ve({
|
|
2788
|
+
message: "Select a default provider:",
|
|
2789
|
+
options: LLM_PROVIDERS
|
|
2790
|
+
});
|
|
2791
|
+
if (pD(providerResponse)) {
|
|
2792
|
+
M.info("Project creation cancelled.");
|
|
2793
|
+
return;
|
|
2794
|
+
}
|
|
2795
|
+
llmProvider = providerResponse;
|
|
2796
|
+
}
|
|
2797
|
+
try {
|
|
2798
|
+
const analytics = args.injectedAnalytics || getAnalytics();
|
|
2799
|
+
if (analytics) {
|
|
2800
|
+
analytics.trackEvent("cli_template_used", {
|
|
2801
|
+
template_slug: selectedTemplate.slug,
|
|
2802
|
+
template_title: selectedTemplate.title
|
|
2803
|
+
});
|
|
2804
|
+
if (llmProvider) {
|
|
2805
|
+
analytics.trackEvent("cli_model_provider_selected", {
|
|
2806
|
+
provider: llmProvider,
|
|
2807
|
+
selection_method: args.llmProvider ? "cli_args" : "interactive"
|
|
2808
|
+
});
|
|
2809
|
+
}
|
|
2810
|
+
}
|
|
2811
|
+
const isBeta = version$1?.includes("beta") ?? false;
|
|
2812
|
+
const isMastraTemplate = selectedTemplate.githubUrl.includes("github.com/mastra-ai/");
|
|
2813
|
+
const branch = isBeta && isMastraTemplate ? "beta" : void 0;
|
|
2814
|
+
const projectPath = await cloneTemplate({
|
|
2815
|
+
template: selectedTemplate,
|
|
2816
|
+
projectName,
|
|
2817
|
+
branch,
|
|
2818
|
+
llmProvider
|
|
2819
|
+
});
|
|
2820
|
+
await installDependencies(projectPath);
|
|
2821
|
+
Me(`
|
|
2822
|
+
${color2.green("Mastra template installed!")}
|
|
2823
|
+
|
|
2824
|
+
Add the necessary environment
|
|
2825
|
+
variables in your ${color2.cyan(".env")} file
|
|
2826
|
+
`);
|
|
2827
|
+
postCreate({ projectName });
|
|
2828
|
+
} catch (error) {
|
|
2829
|
+
M.error(`Failed to create project from template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2830
|
+
throw error;
|
|
2831
|
+
}
|
|
2832
|
+
}
|
|
2306
2833
|
|
|
2307
2834
|
async function getPackageVersion() {
|
|
2308
2835
|
const __filename = fileURLToPath(import.meta.url);
|
|
2309
2836
|
const __dirname = dirname(__filename);
|
|
2310
|
-
const pkgJsonPath =
|
|
2311
|
-
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
2837
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
2838
|
+
const content = await fsExtra$1.readJSON(pkgJsonPath);
|
|
2312
2839
|
return content.version;
|
|
2313
2840
|
}
|
|
2314
2841
|
async function getCreateVersionTag() {
|
|
2315
2842
|
try {
|
|
2316
2843
|
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
2317
|
-
const json = await fsExtra.readJSON(pkgPath);
|
|
2844
|
+
const json = await fsExtra$1.readJSON(pkgPath);
|
|
2318
2845
|
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
2319
2846
|
const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
|
|
2320
2847
|
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
@@ -2338,25 +2865,30 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
2338
2865
|
analytics.trackCommand({
|
|
2339
2866
|
command: "version"
|
|
2340
2867
|
});
|
|
2341
|
-
console.
|
|
2868
|
+
console.info(`create-mastra ${version}`);
|
|
2342
2869
|
} catch {
|
|
2343
2870
|
}
|
|
2344
2871
|
});
|
|
2345
2872
|
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
2346
2873
|
"-p, --project-name <string>",
|
|
2347
2874
|
"Project name that will be used in package.json and as the project directory name."
|
|
2348
|
-
).option("--default", "Quick start with defaults(src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-n, --no-example", "Do not include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").option("-d, --dir <directory>", "Target directory for Mastra source code (default: src/)").option("-m, --mcp <mcp>", "MCP Server for code editor (cursor, cursor-global, windsurf, vscode)").
|
|
2875
|
+
).option("--default", "Quick start with defaults (src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows, scorers)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-n, --no-example", "Do not include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").option("-d, --dir <directory>", "Target directory for Mastra source code (default: src/)").option("-m, --mcp <mcp>", "MCP Server for code editor (cursor, cursor-global, windsurf, vscode)").option(
|
|
2876
|
+
"--template [template-name]",
|
|
2877
|
+
"Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
|
|
2878
|
+
).action(async (projectNameArg, args) => {
|
|
2349
2879
|
const projectName = projectNameArg || args.projectName;
|
|
2350
2880
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
2351
2881
|
if (args.default) {
|
|
2352
2882
|
await create({
|
|
2353
|
-
components: ["agents", "tools", "workflows"],
|
|
2883
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
2354
2884
|
llmProvider: "openai",
|
|
2355
2885
|
addExample: true,
|
|
2356
2886
|
createVersionTag,
|
|
2357
2887
|
timeout,
|
|
2358
2888
|
mcpServer: args.mcp,
|
|
2359
|
-
directory: "src/"
|
|
2889
|
+
directory: "src/",
|
|
2890
|
+
template: args.template,
|
|
2891
|
+
analytics
|
|
2360
2892
|
});
|
|
2361
2893
|
return;
|
|
2362
2894
|
}
|
|
@@ -2364,12 +2896,14 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2364
2896
|
components: args.components ? args.components.split(",") : [],
|
|
2365
2897
|
llmProvider: args.llm,
|
|
2366
2898
|
addExample: args.example,
|
|
2367
|
-
llmApiKey: args
|
|
2899
|
+
llmApiKey: args.llmApiKey,
|
|
2368
2900
|
createVersionTag,
|
|
2369
2901
|
timeout,
|
|
2370
2902
|
projectName,
|
|
2371
2903
|
directory: args.dir,
|
|
2372
|
-
mcpServer: args.mcp
|
|
2904
|
+
mcpServer: args.mcp,
|
|
2905
|
+
template: args.template,
|
|
2906
|
+
analytics
|
|
2373
2907
|
});
|
|
2374
2908
|
});
|
|
2375
2909
|
program.parse(process.argv);
|