create-mastra 0.0.0-vnext-inngest-20250508131921 → 0.0.0-vnext-20251119160359
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 +2121 -0
- package/LICENSE.md +11 -42
- package/README.md +11 -39
- package/dist/index.js +1564 -671
- package/dist/index.js.map +1 -1
- package/dist/starter-files/tools.ts +2 -2
- package/dist/templates/dev.entry.js +9 -47
- package/package.json +30 -22
- package/dist/starter-files/config.ts +0 -25
- package/dist/starter-files/mastra-pg.docker-compose.yaml +0 -15
package/dist/index.js
CHANGED
|
@@ -4,26 +4,30 @@ import { randomUUID } from 'node:crypto';
|
|
|
4
4
|
import * as fs3__default from 'node:fs';
|
|
5
5
|
import fs3__default__default, { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
6
6
|
import os from 'node:os';
|
|
7
|
-
import
|
|
7
|
+
import path3, { dirname } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { PostHog } from 'posthog-node';
|
|
10
|
-
import
|
|
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 {
|
|
20
|
+
import { execa } from 'execa';
|
|
21
21
|
import pino from 'pino';
|
|
22
22
|
import pretty from 'pino-pretty';
|
|
23
|
-
import fsExtra from 'fs-extra';
|
|
23
|
+
import fsExtra$1 from 'fs-extra';
|
|
24
24
|
|
|
25
25
|
var __filename = fileURLToPath(import.meta.url);
|
|
26
|
-
var __dirname =
|
|
26
|
+
var __dirname = path3.dirname(__filename);
|
|
27
|
+
var analyticsInstance = null;
|
|
28
|
+
function getAnalytics() {
|
|
29
|
+
return analyticsInstance;
|
|
30
|
+
}
|
|
27
31
|
var PosthogAnalytics = class {
|
|
28
32
|
sessionId;
|
|
29
33
|
client;
|
|
@@ -35,7 +39,7 @@ var PosthogAnalytics = class {
|
|
|
35
39
|
host = "https://app.posthog.com"
|
|
36
40
|
}) {
|
|
37
41
|
this.version = version;
|
|
38
|
-
const cliConfigPath =
|
|
42
|
+
const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
|
|
39
43
|
if (existsSync(cliConfigPath)) {
|
|
40
44
|
try {
|
|
41
45
|
const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
|
|
@@ -63,7 +67,7 @@ var PosthogAnalytics = class {
|
|
|
63
67
|
}
|
|
64
68
|
writeCliConfig({ distinctId, sessionId }) {
|
|
65
69
|
try {
|
|
66
|
-
writeFileSync(
|
|
70
|
+
writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
67
71
|
} catch {
|
|
68
72
|
}
|
|
69
73
|
}
|
|
@@ -113,6 +117,22 @@ var PosthogAnalytics = class {
|
|
|
113
117
|
}
|
|
114
118
|
});
|
|
115
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
|
+
}
|
|
116
136
|
trackCommand(options) {
|
|
117
137
|
try {
|
|
118
138
|
if (!this.client) {
|
|
@@ -349,72 +369,335 @@ function requirePicocolors () {
|
|
|
349
369
|
var picocolorsExports = /*@__PURE__*/ requirePicocolors();
|
|
350
370
|
var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
|
|
351
371
|
|
|
352
|
-
function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(F,e?void 0:"g")}const J=q();function S(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(J,"")}function T$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var j$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(t){var s=t.charCodeAt(0),C=t.length==2?t.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=C&&C<=57343&&(s&=1023,C&=1023,D=s<<10|C,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(t){var s=this.eastAsianWidth(t);return s=="F"||s=="W"||s=="A"?2:1};function F(t){return t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(t){for(var s=F(t),C=0,D=0;D<s.length;D++)C=C+this.characterLength(s[D]);return C},u.slice=function(t,s,C){textLen=u.length(t),s=s||0,C=C||1,s<0&&(s=textLen+s),C<0&&(C=textLen+C);for(var D="",i=0,n=F(t),E=0;E<n.length;E++){var h=n[E],o=u.length(h);if(i>=s-(o==2?1:0))if(i+o<=C)D+=h;else break;i+=o;}return D};})(j$1);var Q$1=j$1.exports;const X=T$1(Q$1);var DD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const uD=T$1(DD);function A(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=S(e),e.length===0))return 0;e=e.replace(uD()," ");const F=u.ambiguousIsNarrow?1:2;let t=0;for(const s of e){const C=s.codePointAt(0);if(C<=31||C>=127&&C<=159||C>=768&&C<=879)continue;switch(X.eastAsianWidth(s)){case "F":case "W":t+=2;break;case "A":t+=F;break;default:t+=1;}}return t}const d=10,M$1=(e=0)=>u=>`\x1B[${u+e}m`,P$1=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,W=(e=0)=>(u,F,t)=>`\x1B[${38+e};2;${u};${F};${t}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const FD=Object.keys(r.color),eD=Object.keys(r.bgColor);[...FD,...eD];function tD(){const e=new Map;for(const[u,F]of Object.entries(r)){for(const[t,s]of Object.entries(F))r[t]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},F[t]=r[t],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:F,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=M$1(),r.color.ansi256=P$1(),r.color.ansi16m=W(),r.bgColor.ansi=M$1(d),r.bgColor.ansi256=P$1(d),r.bgColor.ansi16m=W(d),Object.defineProperties(r,{rgbToAnsi256:{value:(u,F,t)=>u===F&&F===t?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(F/255*5)+Math.round(t/255*5),enumerable:false},hexToRgb:{value:u=>{const F=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!F)return [0,0,0];let[t]=F;t.length===3&&(t=[...t].map(C=>C+C).join(""));const s=Number.parseInt(t,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let F,t,s;if(u>=232)F=((u-232)*10+8)/255,t=F,s=F;else {u-=16;const i=u%36;F=Math.floor(u/36)/5,t=Math.floor(i/6)/5,s=i%6/5;}const C=Math.max(F,t,s)*2;if(C===0)return 30;let D=30+(Math.round(s)<<2|Math.round(t)<<1|Math.round(F));return C===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,F,t)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,F,t)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const sD=tD(),g=new Set(["\x1B","\x9B"]),CD=39,b$1="\x07",O="[",iD="]",I$1="m",w=`${iD}8;;`,N=e=>`${g.values().next().value}${O}${e}${I$1}`,L=e=>`${g.values().next().value}${w}${e}${b$1}`,rD=e=>e.split(" ").map(u=>A(u)),y$1=(e,u,F)=>{const t=[...u];let s=false,C=false,D=A(S(e[e.length-1]));for(const[i,n]of t.entries()){const E=A(n);if(D+E<=F?e[e.length-1]+=n:(e.push(n),D=0),g.has(n)&&(s=true,C=t.slice(i+1).join("").startsWith(w)),s){C?n===b$1&&(s=false,C=false):n===I$1&&(s=false);continue}D+=E,D===F&&i<t.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},ED=e=>{const u=e.split(" ");let F=u.length;for(;F>0&&!(A(u[F-1])>0);)F--;return F===u.length?e:u.slice(0,F).join(" ")+u.slice(F).join("")},oD=(e,u,F={})=>{if(F.trim!==false&&e.trim()==="")return "";let t="",s,C;const D=rD(e);let i=[""];for(const[E,h]of e.split(" ").entries()){F.trim!==false&&(i[i.length-1]=i[i.length-1].trimStart());let o=A(i[i.length-1]);if(E!==0&&(o>=u&&(F.wordWrap===false||F.trim===false)&&(i.push(""),o=0),(o>0||F.trim===false)&&(i[i.length-1]+=" ",o++)),F.hard&&D[E]>u){const B=u-o,p=1+Math.floor((D[E]-B-1)/u);Math.floor((D[E]-1)/u)<p&&i.push(""),y$1(i,h,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(F.wordWrap===false&&o<u){y$1(i,h,u);continue}i.push("");}if(o+D[E]>u&&F.wordWrap===false){y$1(i,h,u);continue}i[i.length-1]+=h;}F.trim!==false&&(i=i.map(E=>ED(E)));const n=[...i.join(`
|
|
353
|
-
`)];for(const[E,
|
|
354
|
-
`?(
|
|
355
|
-
`&&(s&&o&&(
|
|
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,`
|
|
356
376
|
`).split(`
|
|
357
|
-
`).map(
|
|
358
|
-
`)}
|
|
359
|
-
`),
|
|
360
|
-
`),s=[];for(let
|
|
361
|
-
`),
|
|
362
|
-
`).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=
|
|
363
|
-
`);this.output.write(s[
|
|
364
|
-
`).slice(
|
|
365
|
-
`)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}
|
|
366
|
-
|
|
367
|
-
function
|
|
368
|
-
${
|
|
369
|
-
`,t
|
|
370
|
-
${color2.yellow(
|
|
371
|
-
${color2.yellow(
|
|
372
|
-
`;case "submit":return `${n}${color2.gray(
|
|
373
|
-
|
|
374
|
-
${color2.cyan(
|
|
375
|
-
`}}}).prompt(),
|
|
376
|
-
${
|
|
377
|
-
|
|
378
|
-
${color2.gray(
|
|
379
|
-
${color2.cyan(
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
${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(`
|
|
384
|
-
${color2.cyan(a)} `)}
|
|
385
|
-
${color2.cyan($)}
|
|
386
|
-
`}}}).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.
|
|
387
|
-
${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)}
|
|
388
|
-
${y(this.state)} ${s.message}
|
|
389
|
-
`;const i=(r,o)=>{const c=this.value.includes(r.value);return o&&c?n(r,"active-selected"):c?n(r,"selected"):n(r,o?"active":"inactive")};switch(this.state){case "submit":return `${t}${color2.gray(a)} ${this.options.filter(({value:r})=>this.value.includes(r)).map(r=>n(r,"submitted")).join(color2.dim(", "))||color2.dim("none")}`;case "cancel":{const r=this.options.filter(({value:o})=>this.value.includes(o)).map(o=>n(o,"cancelled")).join(color2.dim(", "));return `${t}${color2.gray(a)} ${r.trim()?`${r}
|
|
390
|
-
${color2.gray(a)}`:""}`}case "error":{const r=this.error.split(`
|
|
391
|
-
`).map((o,c)=>c===0?`${color2.yellow($)} ${color2.yellow(o)}`:` ${o}`).join(`
|
|
392
|
-
`);return t+color2.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
393
|
-
${color2.yellow(a)} `)+`
|
|
394
|
-
`+r+`
|
|
395
|
-
`}default:return `${t}${color2.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
396
|
-
${color2.cyan(a)} `)}
|
|
397
|
-
${color2.cyan($)}
|
|
398
|
-
`}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
|
|
399
|
-
${s}
|
|
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}
|
|
400
403
|
`.split(`
|
|
401
|
-
`),i=
|
|
402
|
-
`);process.stdout.write(`${color2.gray(
|
|
403
|
-
${color2.green(
|
|
404
|
-
${
|
|
405
|
-
${color2.gray(
|
|
406
|
-
`);},
|
|
407
|
-
|
|
408
|
-
`);},
|
|
409
|
-
`);},
|
|
410
|
-
${color2.gray(
|
|
411
|
-
|
|
412
|
-
`);},
|
|
413
|
-
`);
|
|
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(`
|
|
414
417
|
`)}
|
|
415
|
-
`);},info:
|
|
416
|
-
`);
|
|
417
|
-
`),
|
|
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};
|
|
424
|
+
|
|
425
|
+
var shellQuote = {};
|
|
426
|
+
|
|
427
|
+
var quote;
|
|
428
|
+
var hasRequiredQuote;
|
|
429
|
+
|
|
430
|
+
function requireQuote () {
|
|
431
|
+
if (hasRequiredQuote) return quote;
|
|
432
|
+
hasRequiredQuote = 1;
|
|
433
|
+
|
|
434
|
+
quote = function quote(xs) {
|
|
435
|
+
return xs.map(function (s) {
|
|
436
|
+
if (s === '') {
|
|
437
|
+
return '\'\'';
|
|
438
|
+
}
|
|
439
|
+
if (s && typeof s === 'object') {
|
|
440
|
+
return s.op.replace(/(.)/g, '\\$1');
|
|
441
|
+
}
|
|
442
|
+
if ((/["\s\\]/).test(s) && !(/'/).test(s)) {
|
|
443
|
+
return "'" + s.replace(/(['])/g, '\\$1') + "'";
|
|
444
|
+
}
|
|
445
|
+
if ((/["'\s]/).test(s)) {
|
|
446
|
+
return '"' + s.replace(/(["\\$`!])/g, '\\$1') + '"';
|
|
447
|
+
}
|
|
448
|
+
return String(s).replace(/([A-Za-z]:)?([#!"$&'()*,:;<=>?@[\\\]^`{|}])/g, '$1\\$2');
|
|
449
|
+
}).join(' ');
|
|
450
|
+
};
|
|
451
|
+
return quote;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
var parse;
|
|
455
|
+
var hasRequiredParse;
|
|
456
|
+
|
|
457
|
+
function requireParse () {
|
|
458
|
+
if (hasRequiredParse) return parse;
|
|
459
|
+
hasRequiredParse = 1;
|
|
460
|
+
|
|
461
|
+
// '<(' is process substitution operator and
|
|
462
|
+
// can be parsed the same as control operator
|
|
463
|
+
var CONTROL = '(?:' + [
|
|
464
|
+
'\\|\\|',
|
|
465
|
+
'\\&\\&',
|
|
466
|
+
';;',
|
|
467
|
+
'\\|\\&',
|
|
468
|
+
'\\<\\(',
|
|
469
|
+
'\\<\\<\\<',
|
|
470
|
+
'>>',
|
|
471
|
+
'>\\&',
|
|
472
|
+
'<\\&',
|
|
473
|
+
'[&;()|<>]'
|
|
474
|
+
].join('|') + ')';
|
|
475
|
+
var controlRE = new RegExp('^' + CONTROL + '$');
|
|
476
|
+
var META = '|&;()<> \\t';
|
|
477
|
+
var SINGLE_QUOTE = '"((\\\\"|[^"])*?)"';
|
|
478
|
+
var DOUBLE_QUOTE = '\'((\\\\\'|[^\'])*?)\'';
|
|
479
|
+
var hash = /^#$/;
|
|
480
|
+
|
|
481
|
+
var SQ = "'";
|
|
482
|
+
var DQ = '"';
|
|
483
|
+
var DS = '$';
|
|
484
|
+
|
|
485
|
+
var TOKEN = '';
|
|
486
|
+
var mult = 0x100000000; // Math.pow(16, 8);
|
|
487
|
+
for (var i = 0; i < 4; i++) {
|
|
488
|
+
TOKEN += (mult * Math.random()).toString(16);
|
|
489
|
+
}
|
|
490
|
+
var startsWithToken = new RegExp('^' + TOKEN);
|
|
491
|
+
|
|
492
|
+
function matchAll(s, r) {
|
|
493
|
+
var origIndex = r.lastIndex;
|
|
494
|
+
|
|
495
|
+
var matches = [];
|
|
496
|
+
var matchObj;
|
|
497
|
+
|
|
498
|
+
while ((matchObj = r.exec(s))) {
|
|
499
|
+
matches.push(matchObj);
|
|
500
|
+
if (r.lastIndex === matchObj.index) {
|
|
501
|
+
r.lastIndex += 1;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
r.lastIndex = origIndex;
|
|
506
|
+
|
|
507
|
+
return matches;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
function getVar(env, pre, key) {
|
|
511
|
+
var r = typeof env === 'function' ? env(key) : env[key];
|
|
512
|
+
if (typeof r === 'undefined' && key != '') {
|
|
513
|
+
r = '';
|
|
514
|
+
} else if (typeof r === 'undefined') {
|
|
515
|
+
r = '$';
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
if (typeof r === 'object') {
|
|
519
|
+
return pre + TOKEN + JSON.stringify(r) + TOKEN;
|
|
520
|
+
}
|
|
521
|
+
return pre + r;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function parseInternal(string, env, opts) {
|
|
525
|
+
if (!opts) {
|
|
526
|
+
opts = {};
|
|
527
|
+
}
|
|
528
|
+
var BS = opts.escape || '\\';
|
|
529
|
+
var BAREWORD = '(\\' + BS + '[\'"' + META + ']|[^\\s\'"' + META + '])+';
|
|
530
|
+
|
|
531
|
+
var chunker = new RegExp([
|
|
532
|
+
'(' + CONTROL + ')', // control chars
|
|
533
|
+
'(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')+'
|
|
534
|
+
].join('|'), 'g');
|
|
535
|
+
|
|
536
|
+
var matches = matchAll(string, chunker);
|
|
537
|
+
|
|
538
|
+
if (matches.length === 0) {
|
|
539
|
+
return [];
|
|
540
|
+
}
|
|
541
|
+
if (!env) {
|
|
542
|
+
env = {};
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
var commented = false;
|
|
546
|
+
|
|
547
|
+
return matches.map(function (match) {
|
|
548
|
+
var s = match[0];
|
|
549
|
+
if (!s || commented) {
|
|
550
|
+
return void undefined;
|
|
551
|
+
}
|
|
552
|
+
if (controlRE.test(s)) {
|
|
553
|
+
return { op: s };
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
// Hand-written scanner/parser for Bash quoting rules:
|
|
557
|
+
//
|
|
558
|
+
// 1. inside single quotes, all characters are printed literally.
|
|
559
|
+
// 2. inside double quotes, all characters are printed literally
|
|
560
|
+
// except variables prefixed by '$' and backslashes followed by
|
|
561
|
+
// either a double quote or another backslash.
|
|
562
|
+
// 3. outside of any quotes, backslashes are treated as escape
|
|
563
|
+
// characters and not printed (unless they are themselves escaped)
|
|
564
|
+
// 4. quote context can switch mid-token if there is no whitespace
|
|
565
|
+
// between the two quote contexts (e.g. all'one'"token" parses as
|
|
566
|
+
// "allonetoken")
|
|
567
|
+
var quote = false;
|
|
568
|
+
var esc = false;
|
|
569
|
+
var out = '';
|
|
570
|
+
var isGlob = false;
|
|
571
|
+
var i;
|
|
572
|
+
|
|
573
|
+
function parseEnvVar() {
|
|
574
|
+
i += 1;
|
|
575
|
+
var varend;
|
|
576
|
+
var varname;
|
|
577
|
+
var char = s.charAt(i);
|
|
578
|
+
|
|
579
|
+
if (char === '{') {
|
|
580
|
+
i += 1;
|
|
581
|
+
if (s.charAt(i) === '}') {
|
|
582
|
+
throw new Error('Bad substitution: ' + s.slice(i - 2, i + 1));
|
|
583
|
+
}
|
|
584
|
+
varend = s.indexOf('}', i);
|
|
585
|
+
if (varend < 0) {
|
|
586
|
+
throw new Error('Bad substitution: ' + s.slice(i));
|
|
587
|
+
}
|
|
588
|
+
varname = s.slice(i, varend);
|
|
589
|
+
i = varend;
|
|
590
|
+
} else if ((/[*@#?$!_-]/).test(char)) {
|
|
591
|
+
varname = char;
|
|
592
|
+
i += 1;
|
|
593
|
+
} else {
|
|
594
|
+
var slicedFromI = s.slice(i);
|
|
595
|
+
varend = slicedFromI.match(/[^\w\d_]/);
|
|
596
|
+
if (!varend) {
|
|
597
|
+
varname = slicedFromI;
|
|
598
|
+
i = s.length;
|
|
599
|
+
} else {
|
|
600
|
+
varname = slicedFromI.slice(0, varend.index);
|
|
601
|
+
i += varend.index - 1;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
return getVar(env, '', varname);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
for (i = 0; i < s.length; i++) {
|
|
608
|
+
var c = s.charAt(i);
|
|
609
|
+
isGlob = isGlob || (!quote && (c === '*' || c === '?'));
|
|
610
|
+
if (esc) {
|
|
611
|
+
out += c;
|
|
612
|
+
esc = false;
|
|
613
|
+
} else if (quote) {
|
|
614
|
+
if (c === quote) {
|
|
615
|
+
quote = false;
|
|
616
|
+
} else if (quote == SQ) {
|
|
617
|
+
out += c;
|
|
618
|
+
} else { // Double quote
|
|
619
|
+
if (c === BS) {
|
|
620
|
+
i += 1;
|
|
621
|
+
c = s.charAt(i);
|
|
622
|
+
if (c === DQ || c === BS || c === DS) {
|
|
623
|
+
out += c;
|
|
624
|
+
} else {
|
|
625
|
+
out += BS + c;
|
|
626
|
+
}
|
|
627
|
+
} else if (c === DS) {
|
|
628
|
+
out += parseEnvVar();
|
|
629
|
+
} else {
|
|
630
|
+
out += c;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
} else if (c === DQ || c === SQ) {
|
|
634
|
+
quote = c;
|
|
635
|
+
} else if (controlRE.test(c)) {
|
|
636
|
+
return { op: s };
|
|
637
|
+
} else if (hash.test(c)) {
|
|
638
|
+
commented = true;
|
|
639
|
+
var commentObj = { comment: string.slice(match.index + i + 1) };
|
|
640
|
+
if (out.length) {
|
|
641
|
+
return [out, commentObj];
|
|
642
|
+
}
|
|
643
|
+
return [commentObj];
|
|
644
|
+
} else if (c === BS) {
|
|
645
|
+
esc = true;
|
|
646
|
+
} else if (c === DS) {
|
|
647
|
+
out += parseEnvVar();
|
|
648
|
+
} else {
|
|
649
|
+
out += c;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
if (isGlob) {
|
|
654
|
+
return { op: 'glob', pattern: out };
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
return out;
|
|
658
|
+
}).reduce(function (prev, arg) { // finalize parsed arguments
|
|
659
|
+
// TODO: replace this whole reduce with a concat
|
|
660
|
+
return typeof arg === 'undefined' ? prev : prev.concat(arg);
|
|
661
|
+
}, []);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
parse = function parse(s, env, opts) {
|
|
665
|
+
var mapped = parseInternal(s, env, opts);
|
|
666
|
+
if (typeof env !== 'function') {
|
|
667
|
+
return mapped;
|
|
668
|
+
}
|
|
669
|
+
return mapped.reduce(function (acc, s) {
|
|
670
|
+
if (typeof s === 'object') {
|
|
671
|
+
return acc.concat(s);
|
|
672
|
+
}
|
|
673
|
+
var xs = s.split(RegExp('(' + TOKEN + '.*?' + TOKEN + ')', 'g'));
|
|
674
|
+
if (xs.length === 1) {
|
|
675
|
+
return acc.concat(xs[0]);
|
|
676
|
+
}
|
|
677
|
+
return acc.concat(xs.filter(Boolean).map(function (x) {
|
|
678
|
+
if (startsWithToken.test(x)) {
|
|
679
|
+
return JSON.parse(x.split(TOKEN)[1]);
|
|
680
|
+
}
|
|
681
|
+
return x;
|
|
682
|
+
}));
|
|
683
|
+
}, []);
|
|
684
|
+
};
|
|
685
|
+
return parse;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
var hasRequiredShellQuote;
|
|
689
|
+
|
|
690
|
+
function requireShellQuote () {
|
|
691
|
+
if (hasRequiredShellQuote) return shellQuote;
|
|
692
|
+
hasRequiredShellQuote = 1;
|
|
693
|
+
|
|
694
|
+
shellQuote.quote = requireQuote();
|
|
695
|
+
shellQuote.parse = requireParse();
|
|
696
|
+
return shellQuote;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
var shellQuoteExports = requireShellQuote();
|
|
700
|
+
var shellQuote2 = /*@__PURE__*/getDefaultExportFromCjs(shellQuoteExports);
|
|
418
701
|
|
|
419
702
|
// eslint-disable-next-line no-warning-comments
|
|
420
703
|
// TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
|
|
@@ -441,13 +724,18 @@ const format = (open, close) => {
|
|
|
441
724
|
// Handle nested colors.
|
|
442
725
|
|
|
443
726
|
// We could have done this, but it's too slow (as of Node.js 22).
|
|
444
|
-
// return openCode + string.replaceAll(closeCode, openCode) + closeCode;
|
|
727
|
+
// return openCode + string.replaceAll(closeCode, (close === 22 ? closeCode : '') + openCode) + closeCode;
|
|
445
728
|
|
|
446
729
|
let result = openCode;
|
|
447
730
|
let lastIndex = 0;
|
|
448
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
|
+
|
|
449
737
|
while (index !== -1) {
|
|
450
|
-
result += string.slice(lastIndex, index) +
|
|
738
|
+
result += string.slice(lastIndex, index) + replaceCode;
|
|
451
739
|
lastIndex = index + closeCode.length;
|
|
452
740
|
index = string.indexOf(closeCode, lastIndex);
|
|
453
741
|
}
|
|
@@ -549,18 +837,20 @@ var yoctocolors = /*#__PURE__*/Object.freeze({
|
|
|
549
837
|
yellowBright: yellowBright
|
|
550
838
|
});
|
|
551
839
|
|
|
552
|
-
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';
|
|
553
843
|
|
|
554
844
|
const isInteractive = stream => Boolean(
|
|
555
845
|
stream.isTTY
|
|
556
|
-
&&
|
|
557
|
-
&& !('CI' in
|
|
846
|
+
&& y$1.env.TERM !== 'dumb'
|
|
847
|
+
&& !('CI' in y$1.env),
|
|
558
848
|
);
|
|
559
849
|
|
|
560
850
|
const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
|
|
561
851
|
const successSymbol = green(isUnicodeSupported ? '✔' : '√');
|
|
562
852
|
const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
|
|
563
|
-
const errorSymbol = red(isUnicodeSupported ? '
|
|
853
|
+
const errorSymbol = red(isUnicodeSupported ? '✖' : '×');
|
|
564
854
|
|
|
565
855
|
const defaultSpinner = {
|
|
566
856
|
frames: isUnicodeSupported
|
|
@@ -597,13 +887,14 @@ class YoctoSpinner {
|
|
|
597
887
|
#exitHandlerBound;
|
|
598
888
|
#isInteractive;
|
|
599
889
|
#lastSpinnerFrameTime = 0;
|
|
890
|
+
#isSpinning = false;
|
|
600
891
|
|
|
601
892
|
constructor(options = {}) {
|
|
602
893
|
const spinner = options.spinner ?? defaultSpinner;
|
|
603
894
|
this.#frames = spinner.frames;
|
|
604
895
|
this.#interval = spinner.interval;
|
|
605
896
|
this.#text = options.text ?? '';
|
|
606
|
-
this.#stream = options.stream ??
|
|
897
|
+
this.#stream = options.stream ?? y$1.stderr;
|
|
607
898
|
this.#color = options.color ?? 'cyan';
|
|
608
899
|
this.#isInteractive = isInteractive(this.#stream);
|
|
609
900
|
this.#exitHandlerBound = this.#exitHandler.bind(this);
|
|
@@ -618,13 +909,17 @@ class YoctoSpinner {
|
|
|
618
909
|
return this;
|
|
619
910
|
}
|
|
620
911
|
|
|
912
|
+
this.#isSpinning = true;
|
|
621
913
|
this.#hideCursor();
|
|
622
914
|
this.#render();
|
|
623
915
|
this.#subscribeToProcessEvents();
|
|
624
916
|
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
917
|
+
// Only start the timer in interactive mode
|
|
918
|
+
if (this.#isInteractive) {
|
|
919
|
+
this.#timer = setInterval(() => {
|
|
920
|
+
this.#render();
|
|
921
|
+
}, this.#interval);
|
|
922
|
+
}
|
|
628
923
|
|
|
629
924
|
return this;
|
|
630
925
|
}
|
|
@@ -634,8 +929,12 @@ class YoctoSpinner {
|
|
|
634
929
|
return this;
|
|
635
930
|
}
|
|
636
931
|
|
|
637
|
-
|
|
638
|
-
this.#timer
|
|
932
|
+
this.#isSpinning = false;
|
|
933
|
+
if (this.#timer) {
|
|
934
|
+
clearInterval(this.#timer);
|
|
935
|
+
this.#timer = undefined;
|
|
936
|
+
}
|
|
937
|
+
|
|
639
938
|
this.#showCursor();
|
|
640
939
|
this.clear();
|
|
641
940
|
this.#unsubscribeFromProcessEvents();
|
|
@@ -668,15 +967,15 @@ class YoctoSpinner {
|
|
|
668
967
|
}
|
|
669
968
|
|
|
670
969
|
get isSpinning() {
|
|
671
|
-
return this.#
|
|
970
|
+
return this.#isSpinning;
|
|
672
971
|
}
|
|
673
972
|
|
|
674
973
|
get text() {
|
|
675
974
|
return this.#text;
|
|
676
975
|
}
|
|
677
976
|
|
|
678
|
-
set text(value
|
|
679
|
-
this.#text = value;
|
|
977
|
+
set text(value) {
|
|
978
|
+
this.#text = value ?? '';
|
|
680
979
|
this.#render();
|
|
681
980
|
}
|
|
682
981
|
|
|
@@ -740,7 +1039,7 @@ class YoctoSpinner {
|
|
|
740
1039
|
|
|
741
1040
|
#lineCount(text) {
|
|
742
1041
|
const width = this.#stream.columns ?? 80;
|
|
743
|
-
const lines = text.split('\n');
|
|
1042
|
+
const lines = stripVTControlCharacters(text).split('\n');
|
|
744
1043
|
|
|
745
1044
|
let lineCount = 0;
|
|
746
1045
|
for (const line of lines) {
|
|
@@ -763,13 +1062,13 @@ class YoctoSpinner {
|
|
|
763
1062
|
}
|
|
764
1063
|
|
|
765
1064
|
#subscribeToProcessEvents() {
|
|
766
|
-
|
|
767
|
-
|
|
1065
|
+
y$1.once('SIGINT', this.#exitHandlerBound);
|
|
1066
|
+
y$1.once('SIGTERM', this.#exitHandlerBound);
|
|
768
1067
|
}
|
|
769
1068
|
|
|
770
1069
|
#unsubscribeFromProcessEvents() {
|
|
771
|
-
|
|
772
|
-
|
|
1070
|
+
y$1.off('SIGINT', this.#exitHandlerBound);
|
|
1071
|
+
y$1.off('SIGTERM', this.#exitHandlerBound);
|
|
773
1072
|
}
|
|
774
1073
|
|
|
775
1074
|
#exitHandler(signal) {
|
|
@@ -780,7 +1079,7 @@ class YoctoSpinner {
|
|
|
780
1079
|
// SIGINT: 128 + 2
|
|
781
1080
|
// SIGTERM: 128 + 15
|
|
782
1081
|
const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
|
|
783
|
-
|
|
1082
|
+
y$1.exit(exitCode);
|
|
784
1083
|
}
|
|
785
1084
|
}
|
|
786
1085
|
|
|
@@ -789,46 +1088,86 @@ function yoctoSpinner(options) {
|
|
|
789
1088
|
}
|
|
790
1089
|
|
|
791
1090
|
var LogLevel = {
|
|
792
|
-
INFO: "info"
|
|
793
|
-
|
|
794
|
-
|
|
1091
|
+
INFO: "info",
|
|
1092
|
+
ERROR: "error"};
|
|
1093
|
+
var MastraLogger = class {
|
|
1094
|
+
name;
|
|
1095
|
+
level;
|
|
795
1096
|
transports;
|
|
796
1097
|
constructor(options = {}) {
|
|
797
|
-
this.
|
|
798
|
-
|
|
799
|
-
this.
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
1098
|
+
this.name = options.name || "Mastra";
|
|
1099
|
+
this.level = options.level || LogLevel.ERROR;
|
|
1100
|
+
this.transports = new Map(Object.entries(options.transports || {}));
|
|
1101
|
+
}
|
|
1102
|
+
getTransports() {
|
|
1103
|
+
return this.transports;
|
|
1104
|
+
}
|
|
1105
|
+
trackException(_error) {
|
|
1106
|
+
}
|
|
1107
|
+
async listLogs(transportId, params) {
|
|
1108
|
+
if (!transportId || !this.transports.has(transportId)) {
|
|
1109
|
+
return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
|
|
1110
|
+
}
|
|
1111
|
+
return this.transports.get(transportId).listLogs(params) ?? {
|
|
1112
|
+
logs: [],
|
|
1113
|
+
total: 0,
|
|
1114
|
+
page: params?.page ?? 1,
|
|
1115
|
+
perPage: params?.perPage ?? 100,
|
|
1116
|
+
hasMore: false
|
|
1117
|
+
};
|
|
1118
|
+
}
|
|
1119
|
+
async listLogsByRunId({
|
|
1120
|
+
transportId,
|
|
1121
|
+
runId,
|
|
1122
|
+
fromDate,
|
|
1123
|
+
toDate,
|
|
1124
|
+
logLevel,
|
|
1125
|
+
filters,
|
|
1126
|
+
page,
|
|
1127
|
+
perPage
|
|
1128
|
+
}) {
|
|
1129
|
+
if (!transportId || !this.transports.has(transportId) || !runId) {
|
|
1130
|
+
return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
|
|
1131
|
+
}
|
|
1132
|
+
return this.transports.get(transportId).listLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
|
|
1133
|
+
logs: [],
|
|
1134
|
+
total: 0,
|
|
1135
|
+
page: page ?? 1,
|
|
1136
|
+
perPage: perPage ?? 100,
|
|
1137
|
+
hasMore: false
|
|
1138
|
+
};
|
|
1139
|
+
}
|
|
1140
|
+
};
|
|
1141
|
+
|
|
1142
|
+
var PinoLogger = class extends MastraLogger {
|
|
1143
|
+
logger;
|
|
1144
|
+
constructor(options = {}) {
|
|
1145
|
+
super(options);
|
|
1146
|
+
let prettyStream = void 0;
|
|
1147
|
+
if (!options.overrideDefaultTransports) {
|
|
1148
|
+
prettyStream = pretty({
|
|
812
1149
|
colorize: true,
|
|
813
1150
|
levelFirst: true,
|
|
814
1151
|
ignore: "pid,hostname",
|
|
815
1152
|
colorizeObjects: true,
|
|
816
1153
|
translateTime: "SYS:standard",
|
|
817
1154
|
singleLine: false
|
|
818
|
-
})
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1157
|
+
const transportsAry = [...this.getTransports().entries()];
|
|
1158
|
+
this.logger = pino(
|
|
1159
|
+
{
|
|
1160
|
+
name: options.name || "app",
|
|
1161
|
+
level: options.level || LogLevel.INFO,
|
|
1162
|
+
formatters: options.formatters
|
|
1163
|
+
},
|
|
1164
|
+
options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
|
|
819
1165
|
...transportsAry.map(([, transport]) => ({
|
|
820
1166
|
stream: transport,
|
|
821
1167
|
level: options.level || LogLevel.INFO
|
|
822
1168
|
})),
|
|
823
1169
|
{
|
|
824
|
-
stream:
|
|
825
|
-
colorize: true,
|
|
826
|
-
levelFirst: true,
|
|
827
|
-
ignore: "pid,hostname",
|
|
828
|
-
colorizeObjects: true,
|
|
829
|
-
translateTime: "SYS:standard",
|
|
830
|
-
singleLine: false
|
|
831
|
-
}),
|
|
1170
|
+
stream: prettyStream,
|
|
832
1171
|
level: options.level || LogLevel.INFO
|
|
833
1172
|
}
|
|
834
1173
|
])
|
|
@@ -846,32 +1185,24 @@ var Logger = class {
|
|
|
846
1185
|
error(message, args = {}) {
|
|
847
1186
|
this.logger.error(args, message);
|
|
848
1187
|
}
|
|
849
|
-
// Stream creation for process output handling
|
|
850
|
-
createStream() {
|
|
851
|
-
return new Transform({
|
|
852
|
-
transform: (chunk, _encoding, callback) => {
|
|
853
|
-
const line = chunk.toString().trim();
|
|
854
|
-
if (line) {
|
|
855
|
-
this.info(line);
|
|
856
|
-
}
|
|
857
|
-
callback(null, chunk);
|
|
858
|
-
}
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
|
-
async getLogs(transportId) {
|
|
862
|
-
if (!transportId || !this.transports[transportId]) {
|
|
863
|
-
return [];
|
|
864
|
-
}
|
|
865
|
-
return this.transports[transportId].getLogs();
|
|
866
|
-
}
|
|
867
|
-
async getLogsByRunId({ runId, transportId }) {
|
|
868
|
-
return this.transports[transportId]?.getLogsByRunId({ runId });
|
|
869
|
-
}
|
|
870
1188
|
};
|
|
871
|
-
function createLogger(options) {
|
|
872
|
-
return new Logger(options);
|
|
873
|
-
}
|
|
874
1189
|
|
|
1190
|
+
var package_default = {
|
|
1191
|
+
version: "1.0.0-beta.1"};
|
|
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
|
+
}
|
|
875
1206
|
var DepsService = class {
|
|
876
1207
|
packageManager;
|
|
877
1208
|
constructor() {
|
|
@@ -880,11 +1211,11 @@ var DepsService = class {
|
|
|
880
1211
|
findLockFile(dir) {
|
|
881
1212
|
const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
|
|
882
1213
|
for (const file of lockFiles) {
|
|
883
|
-
if (fs3__default__default.existsSync(
|
|
1214
|
+
if (fs3__default__default.existsSync(path3.join(dir, file))) {
|
|
884
1215
|
return file;
|
|
885
1216
|
}
|
|
886
1217
|
}
|
|
887
|
-
const parentDir =
|
|
1218
|
+
const parentDir = path3.resolve(dir, "..");
|
|
888
1219
|
if (parentDir !== dir) {
|
|
889
1220
|
return this.findLockFile(parentDir);
|
|
890
1221
|
}
|
|
@@ -906,14 +1237,10 @@ var DepsService = class {
|
|
|
906
1237
|
}
|
|
907
1238
|
}
|
|
908
1239
|
async installPackages(packages) {
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
runCommand = `${this.packageManager} i`;
|
|
912
|
-
} else {
|
|
913
|
-
runCommand = `${this.packageManager} add`;
|
|
914
|
-
}
|
|
1240
|
+
const pm = this.packageManager;
|
|
1241
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
915
1242
|
const packageList = packages.join(" ");
|
|
916
|
-
return execa(`${
|
|
1243
|
+
return execa(`${pm} ${installCommand} ${packageList}`, {
|
|
917
1244
|
all: true,
|
|
918
1245
|
shell: true,
|
|
919
1246
|
stdio: "inherit"
|
|
@@ -921,7 +1248,7 @@ var DepsService = class {
|
|
|
921
1248
|
}
|
|
922
1249
|
async checkDependencies(dependencies) {
|
|
923
1250
|
try {
|
|
924
|
-
const packageJsonPath =
|
|
1251
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
925
1252
|
try {
|
|
926
1253
|
await fs4.access(packageJsonPath);
|
|
927
1254
|
} catch {
|
|
@@ -941,7 +1268,7 @@ var DepsService = class {
|
|
|
941
1268
|
}
|
|
942
1269
|
async getProjectName() {
|
|
943
1270
|
try {
|
|
944
|
-
const packageJsonPath =
|
|
1271
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
945
1272
|
const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
|
|
946
1273
|
const pkg = JSON.parse(packageJson);
|
|
947
1274
|
return pkg.name;
|
|
@@ -949,13 +1276,6 @@ var DepsService = class {
|
|
|
949
1276
|
throw err;
|
|
950
1277
|
}
|
|
951
1278
|
}
|
|
952
|
-
async getPackageVersion() {
|
|
953
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
954
|
-
const __dirname = dirname(__filename);
|
|
955
|
-
const pkgJsonPath = path.join(__dirname, "..", "package.json");
|
|
956
|
-
const content = await fsExtra3.readJSON(pkgJsonPath);
|
|
957
|
-
return content.version;
|
|
958
|
-
}
|
|
959
1279
|
async addScriptsToPackageJson(scripts) {
|
|
960
1280
|
const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
|
|
961
1281
|
packageJson.scripts = {
|
|
@@ -965,116 +1285,6 @@ var DepsService = class {
|
|
|
965
1285
|
await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
966
1286
|
}
|
|
967
1287
|
};
|
|
968
|
-
function getPackageManager() {
|
|
969
|
-
const userAgent = process.env.npm_config_user_agent || "";
|
|
970
|
-
const execPath = process.env.npm_execpath || "";
|
|
971
|
-
if (userAgent.includes("yarn")) {
|
|
972
|
-
return "yarn";
|
|
973
|
-
}
|
|
974
|
-
if (userAgent.includes("pnpm")) {
|
|
975
|
-
return "pnpm";
|
|
976
|
-
}
|
|
977
|
-
if (userAgent.includes("npm")) {
|
|
978
|
-
return "npm";
|
|
979
|
-
}
|
|
980
|
-
if (execPath.includes("yarn")) {
|
|
981
|
-
return "yarn";
|
|
982
|
-
}
|
|
983
|
-
if (execPath.includes("pnpm")) {
|
|
984
|
-
return "pnpm";
|
|
985
|
-
}
|
|
986
|
-
if (execPath.includes("npm")) {
|
|
987
|
-
return "npm";
|
|
988
|
-
}
|
|
989
|
-
return "npm";
|
|
990
|
-
}
|
|
991
|
-
function getPackageManagerInstallCommand(pm) {
|
|
992
|
-
switch (pm) {
|
|
993
|
-
case "npm":
|
|
994
|
-
return "install";
|
|
995
|
-
case "yarn":
|
|
996
|
-
return "add";
|
|
997
|
-
case "pnpm":
|
|
998
|
-
return "add";
|
|
999
|
-
default:
|
|
1000
|
-
return "install";
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
var args = ["-y", "@mastra/mcp-docs-server@latest"];
|
|
1004
|
-
var mcpConfig = {
|
|
1005
|
-
mcpServers: {
|
|
1006
|
-
mastra: process.platform === `win32` ? {
|
|
1007
|
-
command: "cmd",
|
|
1008
|
-
args: ["/c", "npx", ...args]
|
|
1009
|
-
} : {
|
|
1010
|
-
command: "npx",
|
|
1011
|
-
args
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
};
|
|
1015
|
-
function makeConfig(original) {
|
|
1016
|
-
return {
|
|
1017
|
-
...original,
|
|
1018
|
-
mcpServers: {
|
|
1019
|
-
...original?.mcpServers || {},
|
|
1020
|
-
...mcpConfig.mcpServers
|
|
1021
|
-
}
|
|
1022
|
-
};
|
|
1023
|
-
}
|
|
1024
|
-
async function writeMergedConfig(configPath) {
|
|
1025
|
-
const configExists = existsSync(configPath);
|
|
1026
|
-
const config = makeConfig(configExists ? await readJSON(configPath) : {});
|
|
1027
|
-
await ensureFile(configPath);
|
|
1028
|
-
await writeJSON(configPath, config, {
|
|
1029
|
-
spaces: 2
|
|
1030
|
-
});
|
|
1031
|
-
}
|
|
1032
|
-
var windsurfGlobalMCPConfigPath = path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1033
|
-
var cursorGlobalMCPConfigPath = path.join(os.homedir(), ".cursor", "mcp.json");
|
|
1034
|
-
async function installMastraDocsMCPServer({
|
|
1035
|
-
editor,
|
|
1036
|
-
directory
|
|
1037
|
-
}) {
|
|
1038
|
-
if (editor === `cursor`) {
|
|
1039
|
-
await writeMergedConfig(path.join(directory, ".cursor", "mcp.json"));
|
|
1040
|
-
}
|
|
1041
|
-
if (editor === `cursor-global`) {
|
|
1042
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1043
|
-
if (alreadyInstalled) {
|
|
1044
|
-
return;
|
|
1045
|
-
}
|
|
1046
|
-
await writeMergedConfig(cursorGlobalMCPConfigPath);
|
|
1047
|
-
}
|
|
1048
|
-
if (editor === `windsurf`) {
|
|
1049
|
-
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1050
|
-
if (alreadyInstalled) {
|
|
1051
|
-
return;
|
|
1052
|
-
}
|
|
1053
|
-
await writeMergedConfig(windsurfGlobalMCPConfigPath);
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
async function globalMCPIsAlreadyInstalled(editor) {
|
|
1057
|
-
let configPath = ``;
|
|
1058
|
-
if (editor === "windsurf") {
|
|
1059
|
-
configPath = windsurfGlobalMCPConfigPath;
|
|
1060
|
-
} else if (editor === "cursor-global") {
|
|
1061
|
-
configPath = cursorGlobalMCPConfigPath;
|
|
1062
|
-
}
|
|
1063
|
-
if (!configPath || !existsSync(configPath)) {
|
|
1064
|
-
return false;
|
|
1065
|
-
}
|
|
1066
|
-
try {
|
|
1067
|
-
const configContents = await readJSON(configPath);
|
|
1068
|
-
if (!configContents?.mcpServers) return false;
|
|
1069
|
-
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1070
|
-
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1071
|
-
);
|
|
1072
|
-
return hasMastraMCP;
|
|
1073
|
-
} catch (e) {
|
|
1074
|
-
console.error(e);
|
|
1075
|
-
return false;
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
1288
|
var EnvService = class {
|
|
1079
1289
|
};
|
|
1080
1290
|
var FileEnvService = class extends EnvService {
|
|
@@ -1113,7 +1323,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1113
1323
|
${key}=${value}`;
|
|
1114
1324
|
}
|
|
1115
1325
|
await this.writeFile({ filePath, data });
|
|
1116
|
-
console.
|
|
1326
|
+
console.info(`${key} set to ${value} in ENV file.`);
|
|
1117
1327
|
return data;
|
|
1118
1328
|
}
|
|
1119
1329
|
async getEnvValue(key) {
|
|
@@ -1146,19 +1356,19 @@ var FileService = class {
|
|
|
1146
1356
|
*/
|
|
1147
1357
|
async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
|
|
1148
1358
|
const __filename = fileURLToPath(import.meta.url);
|
|
1149
|
-
const __dirname =
|
|
1150
|
-
const filePath =
|
|
1359
|
+
const __dirname = path3.dirname(__filename);
|
|
1360
|
+
const filePath = path3.resolve(__dirname, "starter-files", inputFile);
|
|
1151
1361
|
const fileString = fs3__default__default.readFileSync(filePath, "utf8");
|
|
1152
1362
|
if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
|
|
1153
|
-
console.
|
|
1363
|
+
console.info(`${outputFilePath} already exists`);
|
|
1154
1364
|
return false;
|
|
1155
1365
|
}
|
|
1156
|
-
await
|
|
1366
|
+
await fsExtra.outputFile(outputFilePath, fileString);
|
|
1157
1367
|
return true;
|
|
1158
1368
|
}
|
|
1159
1369
|
async setupEnvFile({ dbUrl }) {
|
|
1160
|
-
const envPath =
|
|
1161
|
-
await
|
|
1370
|
+
const envPath = path3.join(process.cwd(), ".env.development");
|
|
1371
|
+
await fsExtra.ensureFile(envPath);
|
|
1162
1372
|
const fileEnvService = new FileEnvService(envPath);
|
|
1163
1373
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1164
1374
|
}
|
|
@@ -1181,228 +1391,360 @@ var FileService = class {
|
|
|
1181
1391
|
fs3__default__default.writeFileSync(filePath, fileContent);
|
|
1182
1392
|
}
|
|
1183
1393
|
};
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
});
|
|
1188
|
-
var exec = util.promisify(child_process.exec);
|
|
1189
|
-
var getAISDKPackage = (llmProvider) => {
|
|
1190
|
-
switch (llmProvider) {
|
|
1191
|
-
case "openai":
|
|
1192
|
-
return "@ai-sdk/openai";
|
|
1193
|
-
case "anthropic":
|
|
1194
|
-
return "@ai-sdk/anthropic";
|
|
1195
|
-
case "groq":
|
|
1196
|
-
return "@ai-sdk/groq";
|
|
1197
|
-
case "google":
|
|
1198
|
-
return "@ai-sdk/google";
|
|
1199
|
-
case "cerebras":
|
|
1200
|
-
return "@ai-sdk/cerebras";
|
|
1201
|
-
default:
|
|
1202
|
-
return "@ai-sdk/openai";
|
|
1203
|
-
}
|
|
1394
|
+
var createArgs = (versionTag) => {
|
|
1395
|
+
const packageName = versionTag ? `@mastra/mcp-docs-server@${versionTag}` : "@mastra/mcp-docs-server";
|
|
1396
|
+
return ["-y", packageName];
|
|
1204
1397
|
};
|
|
1205
|
-
var
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1222
|
-
modelItem = `cerebras('llama-3.3-70b')`;
|
|
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
|
+
};
|
|
1223
1414
|
}
|
|
1224
|
-
return {
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1232
|
-
- Always ask for a location if none is provided
|
|
1233
|
-
- If the location name isn\u2019t in English, please translate it
|
|
1234
|
-
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1235
|
-
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1236
|
-
- Keep responses concise but informative
|
|
1237
|
-
|
|
1238
|
-
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1239
|
-
`;
|
|
1240
|
-
const content = `
|
|
1241
|
-
${providerImport}
|
|
1242
|
-
import { Agent } from '@mastra/core/agent';
|
|
1243
|
-
import { Memory } from '@mastra/memory';
|
|
1244
|
-
import { LibSQLStore } from '@mastra/libsql';
|
|
1245
|
-
${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
|
|
1246
|
-
|
|
1247
|
-
export const weatherAgent = new Agent({
|
|
1248
|
-
name: 'Weather Agent',
|
|
1249
|
-
instructions: \`${instructions}\`,
|
|
1250
|
-
model: ${modelItem},
|
|
1251
|
-
${addExampleTool ? "tools: { weatherTool }," : ""}
|
|
1252
|
-
memory: new Memory({
|
|
1253
|
-
storage: new LibSQLStore({
|
|
1254
|
-
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
1255
|
-
}),
|
|
1256
|
-
options: {
|
|
1257
|
-
lastMessages: 10,
|
|
1258
|
-
semanticRecall: false,
|
|
1259
|
-
threads: {
|
|
1260
|
-
generateTitle: false
|
|
1261
|
-
}
|
|
1415
|
+
return {
|
|
1416
|
+
mcpServers: {
|
|
1417
|
+
mastra: {
|
|
1418
|
+
command: "npx",
|
|
1419
|
+
args
|
|
1420
|
+
}
|
|
1262
1421
|
}
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1422
|
+
};
|
|
1423
|
+
};
|
|
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
|
+
};
|
|
1272
1441
|
}
|
|
1273
|
-
async function
|
|
1274
|
-
const
|
|
1275
|
-
const
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
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";
|
|
1520
|
+
} else if (llmProvider === "groq") {
|
|
1521
|
+
model = "groq/llama-3.3-70b-versatile";
|
|
1522
|
+
} else if (llmProvider === "google") {
|
|
1523
|
+
model = "google/gemini-2.5-pro";
|
|
1524
|
+
} else if (llmProvider === "cerebras") {
|
|
1525
|
+
model = "cerebras/llama-3.3-70b";
|
|
1526
|
+
} else if (llmProvider === "mistral") {
|
|
1527
|
+
model = "mistral/mistral-medium-2508";
|
|
1528
|
+
}
|
|
1529
|
+
return model;
|
|
1530
|
+
};
|
|
1531
|
+
async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorers) {
|
|
1532
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1533
|
+
const instructions = `
|
|
1534
|
+
You are a helpful weather assistant that provides accurate weather information and can help planning activities based on the weather.
|
|
1535
|
+
|
|
1536
|
+
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1537
|
+
- Always ask for a location if none is provided
|
|
1538
|
+
- If the location name isn't in English, please translate it
|
|
1539
|
+
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1540
|
+
- Include relevant details like humidity, wind conditions, and precipitation
|
|
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.
|
|
1279
1544
|
|
|
1280
|
-
|
|
1545
|
+
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1546
|
+
`;
|
|
1547
|
+
const content = `
|
|
1548
|
+
import { Agent } from '@mastra/core/agent';
|
|
1549
|
+
import { Memory } from '@mastra/memory';
|
|
1550
|
+
import { LibSQLStore } from '@mastra/libsql';
|
|
1551
|
+
${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
|
|
1552
|
+
${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
|
|
1281
1553
|
|
|
1282
|
-
const
|
|
1554
|
+
export const weatherAgent = new Agent({
|
|
1555
|
+
id: 'weather-agent',
|
|
1283
1556
|
name: 'Weather Agent',
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
Guidelines:
|
|
1318
|
-
- Suggest 2-3 time-specific outdoor activities per day
|
|
1319
|
-
- Include 1-2 indoor backup options
|
|
1320
|
-
- For precipitation >50%, lead with indoor activities
|
|
1321
|
-
- All activities must be specific to the location
|
|
1322
|
-
- Include specific venues, trails, or locations
|
|
1323
|
-
- Consider activity intensity based on temperature
|
|
1324
|
-
- Keep descriptions concise but informative
|
|
1325
|
-
|
|
1326
|
-
Maintain this exact formatting for consistency, using the emoji and section headers as shown.
|
|
1327
|
-
\`,
|
|
1557
|
+
instructions: \`${instructions}\`,
|
|
1558
|
+
model: '${modelString}',
|
|
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
|
+
memory: new Memory({
|
|
1584
|
+
storage: new LibSQLStore({
|
|
1585
|
+
id: "memory-storage",
|
|
1586
|
+
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
1587
|
+
})
|
|
1588
|
+
})
|
|
1328
1589
|
});
|
|
1590
|
+
`;
|
|
1591
|
+
const formattedContent = await prettier.format(content, {
|
|
1592
|
+
parser: "typescript",
|
|
1593
|
+
singleQuote: true
|
|
1594
|
+
});
|
|
1595
|
+
await fs4.writeFile(destPath, "");
|
|
1596
|
+
await fs4.writeFile(destPath, formattedContent);
|
|
1597
|
+
}
|
|
1598
|
+
async function writeWorkflowSample(destPath) {
|
|
1599
|
+
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1600
|
+
import { z } from 'zod';
|
|
1329
1601
|
|
|
1330
|
-
const forecastSchema = z.
|
|
1331
|
-
z.
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
)
|
|
1602
|
+
const forecastSchema = z.object({
|
|
1603
|
+
date: z.string(),
|
|
1604
|
+
maxTemp: z.number(),
|
|
1605
|
+
minTemp: z.number(),
|
|
1606
|
+
precipitationChance: z.number(),
|
|
1607
|
+
condition: z.string(),
|
|
1608
|
+
location: z.string(),
|
|
1609
|
+
})
|
|
1610
|
+
|
|
1611
|
+
function getWeatherCondition(code: number): string {
|
|
1612
|
+
const conditions: Record<number, string> = {
|
|
1613
|
+
0: 'Clear sky',
|
|
1614
|
+
1: 'Mainly clear',
|
|
1615
|
+
2: 'Partly cloudy',
|
|
1616
|
+
3: 'Overcast',
|
|
1617
|
+
45: 'Foggy',
|
|
1618
|
+
48: 'Depositing rime fog',
|
|
1619
|
+
51: 'Light drizzle',
|
|
1620
|
+
53: 'Moderate drizzle',
|
|
1621
|
+
55: 'Dense drizzle',
|
|
1622
|
+
61: 'Slight rain',
|
|
1623
|
+
63: 'Moderate rain',
|
|
1624
|
+
65: 'Heavy rain',
|
|
1625
|
+
71: 'Slight snow fall',
|
|
1626
|
+
73: 'Moderate snow fall',
|
|
1627
|
+
75: 'Heavy snow fall',
|
|
1628
|
+
95: 'Thunderstorm',
|
|
1629
|
+
}
|
|
1630
|
+
return conditions[code] || 'Unknown'
|
|
1631
|
+
}
|
|
1340
1632
|
|
|
1341
|
-
const fetchWeather =
|
|
1633
|
+
const fetchWeather = createStep({
|
|
1342
1634
|
id: 'fetch-weather',
|
|
1343
1635
|
description: 'Fetches weather forecast for a given city',
|
|
1344
1636
|
inputSchema: z.object({
|
|
1345
1637
|
city: z.string().describe('The city to get the weather for'),
|
|
1346
1638
|
}),
|
|
1347
1639
|
outputSchema: forecastSchema,
|
|
1348
|
-
execute: async ({
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
if (!triggerData) {
|
|
1352
|
-
throw new Error('Trigger data not found');
|
|
1640
|
+
execute: async ({ inputData }) => {
|
|
1641
|
+
if (!inputData) {
|
|
1642
|
+
throw new Error('Input data not found');
|
|
1353
1643
|
}
|
|
1354
1644
|
|
|
1355
|
-
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(
|
|
1645
|
+
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(inputData.city)}&count=1\`;
|
|
1356
1646
|
const geocodingResponse = await fetch(geocodingUrl);
|
|
1357
1647
|
const geocodingData = (await geocodingResponse.json()) as {
|
|
1358
1648
|
results: { latitude: number; longitude: number; name: string }[];
|
|
1359
1649
|
};
|
|
1360
1650
|
|
|
1361
1651
|
if (!geocodingData.results?.[0]) {
|
|
1362
|
-
throw new Error(\`Location '\${
|
|
1652
|
+
throw new Error(\`Location '\${inputData.city}' not found\`);
|
|
1363
1653
|
}
|
|
1364
1654
|
|
|
1365
1655
|
const { latitude, longitude, name } = geocodingData.results[0];
|
|
1366
1656
|
|
|
1367
|
-
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}&
|
|
1657
|
+
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}¤t=precipitation,weathercode&timezone=auto,&hourly=precipitation_probability,temperature_2m\`;
|
|
1368
1658
|
const response = await fetch(weatherUrl);
|
|
1369
1659
|
const data = (await response.json()) as {
|
|
1370
|
-
|
|
1371
|
-
time: string
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1660
|
+
current: {
|
|
1661
|
+
time: string
|
|
1662
|
+
precipitation: number
|
|
1663
|
+
weathercode: number
|
|
1664
|
+
}
|
|
1665
|
+
hourly: {
|
|
1666
|
+
precipitation_probability: number[]
|
|
1667
|
+
temperature_2m: number[]
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1378
1670
|
|
|
1379
|
-
const forecast =
|
|
1380
|
-
date,
|
|
1381
|
-
maxTemp: data.
|
|
1382
|
-
minTemp: data.
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1671
|
+
const forecast = {
|
|
1672
|
+
date: new Date().toISOString(),
|
|
1673
|
+
maxTemp: Math.max(...data.hourly.temperature_2m),
|
|
1674
|
+
minTemp: Math.min(...data.hourly.temperature_2m),
|
|
1675
|
+
condition: getWeatherCondition(data.current.weathercode),
|
|
1676
|
+
precipitationChance: data.hourly.precipitation_probability.reduce(
|
|
1677
|
+
(acc, curr) => Math.max(acc, curr),
|
|
1678
|
+
0
|
|
1679
|
+
),
|
|
1680
|
+
location: name
|
|
1681
|
+
}
|
|
1387
1682
|
|
|
1388
1683
|
return forecast;
|
|
1389
1684
|
},
|
|
1390
1685
|
});
|
|
1391
1686
|
|
|
1392
1687
|
|
|
1393
|
-
const planActivities =
|
|
1688
|
+
const planActivities = createStep({
|
|
1394
1689
|
id: 'plan-activities',
|
|
1395
1690
|
description: 'Suggests activities based on weather conditions',
|
|
1396
|
-
|
|
1397
|
-
|
|
1691
|
+
inputSchema: forecastSchema,
|
|
1692
|
+
outputSchema: z.object({
|
|
1693
|
+
activities: z.string(),
|
|
1694
|
+
}),
|
|
1695
|
+
execute: async ({ inputData, mastra }) => {
|
|
1696
|
+
const forecast = inputData
|
|
1697
|
+
|
|
1698
|
+
if (!forecast) {
|
|
1699
|
+
throw new Error('Forecast data not found')
|
|
1700
|
+
}
|
|
1398
1701
|
|
|
1399
|
-
|
|
1400
|
-
|
|
1702
|
+
const agent = mastra?.getAgent('weatherAgent');
|
|
1703
|
+
if (!agent) {
|
|
1704
|
+
throw new Error('Weather agent not found');
|
|
1401
1705
|
}
|
|
1402
1706
|
|
|
1403
|
-
const prompt = \`Based on the following weather forecast for \${forecast
|
|
1707
|
+
const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
|
|
1404
1708
|
\${JSON.stringify(forecast, null, 2)}
|
|
1405
|
-
|
|
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.\`;
|
|
1406
1748
|
|
|
1407
1749
|
const response = await agent.stream([
|
|
1408
1750
|
{
|
|
@@ -1412,7 +1754,7 @@ const planActivities = new Step({
|
|
|
1412
1754
|
]);
|
|
1413
1755
|
|
|
1414
1756
|
let activitiesText = '';
|
|
1415
|
-
|
|
1757
|
+
|
|
1416
1758
|
for await (const chunk of response.textStream) {
|
|
1417
1759
|
process.stdout.write(chunk);
|
|
1418
1760
|
activitiesText += chunk;
|
|
@@ -1424,35 +1766,16 @@ const planActivities = new Step({
|
|
|
1424
1766
|
},
|
|
1425
1767
|
});
|
|
1426
1768
|
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
1: 'Mainly clear',
|
|
1431
|
-
2: 'Partly cloudy',
|
|
1432
|
-
3: 'Overcast',
|
|
1433
|
-
45: 'Foggy',
|
|
1434
|
-
48: 'Depositing rime fog',
|
|
1435
|
-
51: 'Light drizzle',
|
|
1436
|
-
53: 'Moderate drizzle',
|
|
1437
|
-
55: 'Dense drizzle',
|
|
1438
|
-
61: 'Slight rain',
|
|
1439
|
-
63: 'Moderate rain',
|
|
1440
|
-
65: 'Heavy rain',
|
|
1441
|
-
71: 'Slight snow fall',
|
|
1442
|
-
73: 'Moderate snow fall',
|
|
1443
|
-
75: 'Heavy snow fall',
|
|
1444
|
-
95: 'Thunderstorm',
|
|
1445
|
-
};
|
|
1446
|
-
return conditions[code] || 'Unknown';
|
|
1447
|
-
}
|
|
1448
|
-
|
|
1449
|
-
const weatherWorkflow = new Workflow({
|
|
1450
|
-
name: 'weather-workflow',
|
|
1451
|
-
triggerSchema: z.object({
|
|
1769
|
+
const weatherWorkflow = createWorkflow({
|
|
1770
|
+
id: 'weather-workflow',
|
|
1771
|
+
inputSchema: z.object({
|
|
1452
1772
|
city: z.string().describe('The city to get the weather for'),
|
|
1453
1773
|
}),
|
|
1774
|
+
outputSchema: z.object({
|
|
1775
|
+
activities: z.string(),
|
|
1776
|
+
})
|
|
1454
1777
|
})
|
|
1455
|
-
.
|
|
1778
|
+
.then(fetchWeather)
|
|
1456
1779
|
.then(planActivities);
|
|
1457
1780
|
|
|
1458
1781
|
weatherWorkflow.commit();
|
|
@@ -1469,41 +1792,138 @@ async function writeToolSample(destPath) {
|
|
|
1469
1792
|
const fileService = new FileService();
|
|
1470
1793
|
await fileService.copyStarterFile("tools.ts", destPath);
|
|
1471
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
|
+
}
|
|
1472
1883
|
async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
|
|
1473
1884
|
switch (component) {
|
|
1474
1885
|
case "agents":
|
|
1475
|
-
return writeAgentSample(
|
|
1886
|
+
return writeAgentSample(
|
|
1887
|
+
llmprovider,
|
|
1888
|
+
destPath,
|
|
1889
|
+
importComponents.includes("tools"),
|
|
1890
|
+
importComponents.includes("scorers")
|
|
1891
|
+
);
|
|
1476
1892
|
case "tools":
|
|
1477
1893
|
return writeToolSample(destPath);
|
|
1478
1894
|
case "workflows":
|
|
1479
|
-
return writeWorkflowSample(destPath
|
|
1895
|
+
return writeWorkflowSample(destPath);
|
|
1896
|
+
case "scorers":
|
|
1897
|
+
return writeScorersSample(llmprovider, destPath);
|
|
1480
1898
|
default:
|
|
1481
1899
|
return "";
|
|
1482
1900
|
}
|
|
1483
1901
|
}
|
|
1484
1902
|
var createComponentsDir = async (dirPath, component) => {
|
|
1485
1903
|
const componentPath = dirPath + `/${component}`;
|
|
1486
|
-
await
|
|
1904
|
+
await fsExtra.ensureDir(componentPath);
|
|
1487
1905
|
};
|
|
1488
1906
|
var writeIndexFile = async ({
|
|
1489
1907
|
dirPath,
|
|
1490
1908
|
addAgent,
|
|
1491
1909
|
addExample,
|
|
1492
|
-
addWorkflow
|
|
1910
|
+
addWorkflow,
|
|
1911
|
+
addScorers
|
|
1493
1912
|
}) => {
|
|
1494
1913
|
const indexPath = dirPath + "/index.ts";
|
|
1495
|
-
const destPath =
|
|
1914
|
+
const destPath = path3.join(indexPath);
|
|
1496
1915
|
try {
|
|
1497
1916
|
await fs4.writeFile(destPath, "");
|
|
1498
1917
|
const filteredExports = [
|
|
1499
1918
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1500
|
-
addAgent ? `agents: { weatherAgent },` : ""
|
|
1919
|
+
addAgent ? `agents: { weatherAgent },` : "",
|
|
1920
|
+
addScorers ? `scorers: { toolCallAppropriatenessScorer, completenessScorer, translationScorer },` : ""
|
|
1501
1921
|
].filter(Boolean);
|
|
1502
1922
|
if (!addExample) {
|
|
1503
1923
|
await fs4.writeFile(
|
|
1504
1924
|
destPath,
|
|
1505
1925
|
`
|
|
1506
|
-
import { Mastra } from '@mastra/core';
|
|
1926
|
+
import { Mastra } from '@mastra/core/mastra';
|
|
1507
1927
|
|
|
1508
1928
|
export const mastra = new Mastra()
|
|
1509
1929
|
`
|
|
@@ -1514,21 +1934,28 @@ export const mastra = new Mastra()
|
|
|
1514
1934
|
destPath,
|
|
1515
1935
|
`
|
|
1516
1936
|
import { Mastra } from '@mastra/core/mastra';
|
|
1517
|
-
import {
|
|
1937
|
+
import { PinoLogger } from '@mastra/loggers';
|
|
1518
1938
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1519
|
-
|
|
1520
|
-
${
|
|
1939
|
+
import { Observability } from '@mastra/observability';
|
|
1940
|
+
${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
|
|
1941
|
+
${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
|
|
1942
|
+
${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
|
|
1521
1943
|
|
|
1522
1944
|
export const mastra = new Mastra({
|
|
1523
1945
|
${filteredExports.join("\n ")}
|
|
1524
1946
|
storage: new LibSQLStore({
|
|
1525
|
-
|
|
1947
|
+
id: "mastra-storage",
|
|
1948
|
+
// stores observability, scores, ... into memory storage, if it needs to persist, change to file:../mastra.db
|
|
1526
1949
|
url: ":memory:",
|
|
1527
1950
|
}),
|
|
1528
|
-
logger:
|
|
1951
|
+
logger: new PinoLogger({
|
|
1529
1952
|
name: 'Mastra',
|
|
1530
1953
|
level: 'info',
|
|
1531
1954
|
}),
|
|
1955
|
+
observability: new Observability({
|
|
1956
|
+
// Enables DefaultExporter and CloudExporter for tracing
|
|
1957
|
+
default: { enabled: true },
|
|
1958
|
+
}),
|
|
1532
1959
|
});
|
|
1533
1960
|
`
|
|
1534
1961
|
);
|
|
@@ -1536,7 +1963,6 @@ export const mastra = new Mastra({
|
|
|
1536
1963
|
throw err;
|
|
1537
1964
|
}
|
|
1538
1965
|
};
|
|
1539
|
-
yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
|
|
1540
1966
|
var getAPIKey = async (provider) => {
|
|
1541
1967
|
let key = "OPENAI_API_KEY";
|
|
1542
1968
|
switch (provider) {
|
|
@@ -1552,72 +1978,68 @@ var getAPIKey = async (provider) => {
|
|
|
1552
1978
|
case "cerebras":
|
|
1553
1979
|
key = "CEREBRAS_API_KEY";
|
|
1554
1980
|
return key;
|
|
1981
|
+
case "mistral":
|
|
1982
|
+
key = "MISTRAL_API_KEY";
|
|
1983
|
+
return key;
|
|
1555
1984
|
default:
|
|
1556
1985
|
return key;
|
|
1557
1986
|
}
|
|
1558
1987
|
};
|
|
1559
|
-
var writeAPIKey = async ({
|
|
1560
|
-
|
|
1561
|
-
apiKey = "your-api-key"
|
|
1562
|
-
}) => {
|
|
1988
|
+
var writeAPIKey = async ({ provider, apiKey }) => {
|
|
1989
|
+
const envFileName = apiKey ? ".env" : ".env.example";
|
|
1563
1990
|
const key = await getAPIKey(provider);
|
|
1564
|
-
|
|
1991
|
+
const escapedKey = shellQuote2.quote([key]);
|
|
1992
|
+
const escapedApiKey = shellQuote2.quote([apiKey ? apiKey : "your-api-key"]);
|
|
1993
|
+
await exec(`echo ${escapedKey}=${escapedApiKey} >> ${envFileName}`);
|
|
1565
1994
|
};
|
|
1566
1995
|
var createMastraDir = async (directory) => {
|
|
1567
1996
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
1568
|
-
const dirPath =
|
|
1997
|
+
const dirPath = path3.join(process.cwd(), ...dir, "mastra");
|
|
1569
1998
|
try {
|
|
1570
1999
|
await fs4.access(dirPath);
|
|
1571
2000
|
return { ok: false };
|
|
1572
2001
|
} catch {
|
|
1573
|
-
await
|
|
2002
|
+
await fsExtra.ensureDir(dirPath);
|
|
1574
2003
|
return { ok: true, dirPath };
|
|
1575
2004
|
}
|
|
1576
2005
|
};
|
|
1577
2006
|
var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
|
|
1578
|
-
const destPath = dirPath + `/${component}/
|
|
2007
|
+
const destPath = dirPath + `/${component}/weather-${component.slice(0, -1)}.ts`;
|
|
1579
2008
|
try {
|
|
1580
2009
|
await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
|
|
1581
2010
|
} catch (err) {
|
|
1582
2011
|
throw err;
|
|
1583
2012
|
}
|
|
1584
2013
|
};
|
|
1585
|
-
var
|
|
1586
|
-
|
|
1587
|
-
|
|
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(
|
|
1588
2028
|
{
|
|
1589
|
-
directory: () =>
|
|
2029
|
+
directory: () => he({
|
|
1590
2030
|
message: "Where should we create the Mastra files? (default: src/)",
|
|
1591
2031
|
placeholder: "src/",
|
|
1592
2032
|
defaultValue: "src/"
|
|
1593
2033
|
}),
|
|
1594
|
-
|
|
1595
|
-
message: "
|
|
1596
|
-
options:
|
|
1597
|
-
{ value: "agents", label: "Agents", hint: "recommended" },
|
|
1598
|
-
{
|
|
1599
|
-
value: "workflows",
|
|
1600
|
-
label: "Workflows"
|
|
1601
|
-
}
|
|
1602
|
-
]
|
|
1603
|
-
}),
|
|
1604
|
-
shouldAddTools: () => ce({
|
|
1605
|
-
message: "Add tools?",
|
|
1606
|
-
initialValue: false
|
|
1607
|
-
}),
|
|
1608
|
-
llmProvider: () => le({
|
|
1609
|
-
message: "Select default provider:",
|
|
1610
|
-
options: [
|
|
1611
|
-
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1612
|
-
{ value: "anthropic", label: "Anthropic" },
|
|
1613
|
-
{ value: "groq", label: "Groq" },
|
|
1614
|
-
{ value: "google", label: "Google" },
|
|
1615
|
-
{ value: "cerebras", label: "Cerebras" }
|
|
1616
|
-
]
|
|
2034
|
+
llmProvider: () => skip?.llmProvider ? void 0 : ve({
|
|
2035
|
+
message: "Select a default provider:",
|
|
2036
|
+
options: LLM_PROVIDERS
|
|
1617
2037
|
}),
|
|
1618
2038
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
1619
|
-
|
|
1620
|
-
|
|
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?`,
|
|
1621
2043
|
options: [
|
|
1622
2044
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1623
2045
|
{ value: "enter", label: "Enter API key" }
|
|
@@ -1625,68 +2047,61 @@ var interactivePrompt = async () => {
|
|
|
1625
2047
|
initialValue: "skip"
|
|
1626
2048
|
});
|
|
1627
2049
|
if (keyChoice === "enter") {
|
|
1628
|
-
return
|
|
2050
|
+
return he({
|
|
1629
2051
|
message: "Enter your API key:",
|
|
1630
|
-
placeholder: "sk-..."
|
|
2052
|
+
placeholder: "sk-...",
|
|
2053
|
+
validate: (value) => {
|
|
2054
|
+
if (value.length === 0) return "API key cannot be empty";
|
|
2055
|
+
}
|
|
1631
2056
|
});
|
|
1632
2057
|
}
|
|
1633
2058
|
return void 0;
|
|
1634
2059
|
},
|
|
1635
|
-
addExample: () => ce({
|
|
1636
|
-
message: "Add example",
|
|
1637
|
-
initialValue: false
|
|
1638
|
-
}),
|
|
1639
2060
|
configureEditorWithDocsMCP: async () => {
|
|
1640
|
-
const
|
|
1641
|
-
|
|
1642
|
-
const editor = await le({
|
|
1643
|
-
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
2061
|
+
const editor = await ve({
|
|
2062
|
+
message: `Make your IDE into a Mastra expert? (Installs Mastra's MCP server)`,
|
|
1644
2063
|
options: [
|
|
1645
2064
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1646
2065
|
{
|
|
1647
2066
|
value: "cursor",
|
|
1648
|
-
label: "Cursor (project only)"
|
|
1649
|
-
hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
|
|
2067
|
+
label: "Cursor (project only)"
|
|
1650
2068
|
},
|
|
1651
2069
|
{
|
|
1652
2070
|
value: "cursor-global",
|
|
1653
|
-
label: "Cursor (global, all projects)"
|
|
1654
|
-
hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
|
|
2071
|
+
label: "Cursor (global, all projects)"
|
|
1655
2072
|
},
|
|
1656
2073
|
{
|
|
1657
2074
|
value: "windsurf",
|
|
1658
|
-
label: "Windsurf"
|
|
1659
|
-
|
|
2075
|
+
label: "Windsurf"
|
|
2076
|
+
},
|
|
2077
|
+
{
|
|
2078
|
+
value: "vscode",
|
|
2079
|
+
label: "VSCode"
|
|
1660
2080
|
}
|
|
1661
2081
|
]
|
|
1662
2082
|
});
|
|
1663
2083
|
if (editor === `skip`) return void 0;
|
|
1664
|
-
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
1665
|
-
v.message(`
|
|
1666
|
-
Windsurf is already installed, skipping.`);
|
|
1667
|
-
return void 0;
|
|
1668
|
-
}
|
|
1669
2084
|
if (editor === `cursor`) {
|
|
1670
|
-
|
|
2085
|
+
M.message(
|
|
1671
2086
|
`
|
|
1672
2087
|
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1673
2088
|
`
|
|
1674
2089
|
);
|
|
1675
2090
|
}
|
|
1676
2091
|
if (editor === `cursor-global`) {
|
|
1677
|
-
const
|
|
2092
|
+
const confirm = await ve({
|
|
1678
2093
|
message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
|
|
1679
2094
|
options: [
|
|
1680
2095
|
{ value: "yes", label: "Yes, I understand" },
|
|
1681
2096
|
{ value: "skip", label: "No, skip for now" }
|
|
1682
2097
|
]
|
|
1683
2098
|
});
|
|
1684
|
-
if (
|
|
2099
|
+
if (confirm !== `yes`) {
|
|
1685
2100
|
return void 0;
|
|
1686
2101
|
}
|
|
1687
2102
|
}
|
|
1688
2103
|
if (editor === `windsurf`) {
|
|
1689
|
-
const
|
|
2104
|
+
const confirm = await ve({
|
|
1690
2105
|
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
1691
2106
|
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
1692
2107
|
options: [
|
|
@@ -1694,7 +2109,7 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
1694
2109
|
{ value: "skip", label: "No, skip for now" }
|
|
1695
2110
|
]
|
|
1696
2111
|
});
|
|
1697
|
-
if (
|
|
2112
|
+
if (confirm !== `yes`) {
|
|
1698
2113
|
return void 0;
|
|
1699
2114
|
}
|
|
1700
2115
|
}
|
|
@@ -1703,26 +2118,231 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
1703
2118
|
},
|
|
1704
2119
|
{
|
|
1705
2120
|
onCancel: () => {
|
|
1706
|
-
|
|
2121
|
+
xe("Operation cancelled.");
|
|
1707
2122
|
process.exit(0);
|
|
1708
2123
|
}
|
|
1709
2124
|
}
|
|
1710
2125
|
);
|
|
1711
|
-
|
|
1712
|
-
const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
|
|
1713
|
-
return { ...rest, components: mastraComponents };
|
|
2126
|
+
return mastraProject;
|
|
1714
2127
|
};
|
|
1715
|
-
|
|
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
|
+
}
|
|
1716
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();
|
|
1717
2335
|
var init = async ({
|
|
1718
|
-
directory,
|
|
1719
|
-
addExample = false,
|
|
2336
|
+
directory = "src/",
|
|
1720
2337
|
components,
|
|
1721
2338
|
llmProvider = "openai",
|
|
1722
2339
|
llmApiKey,
|
|
1723
|
-
|
|
2340
|
+
addExample = false,
|
|
2341
|
+
configureEditorWithDocsMCP,
|
|
2342
|
+
versionTag
|
|
1724
2343
|
}) => {
|
|
1725
2344
|
s.start("Initializing Mastra");
|
|
2345
|
+
const packageVersionTag = versionTag ? `@${versionTag}` : "";
|
|
1726
2346
|
try {
|
|
1727
2347
|
const result = await createMastraDir(directory);
|
|
1728
2348
|
if (!result.ok) {
|
|
@@ -1735,7 +2355,8 @@ var init = async ({
|
|
|
1735
2355
|
dirPath,
|
|
1736
2356
|
addExample,
|
|
1737
2357
|
addWorkflow: components.includes("workflows"),
|
|
1738
|
-
addAgent: components.includes("agents")
|
|
2358
|
+
addAgent: components.includes("agents"),
|
|
2359
|
+
addScorers: components.includes("scorers")
|
|
1739
2360
|
}),
|
|
1740
2361
|
...components.map((component) => createComponentsDir(dirPath, component)),
|
|
1741
2362
|
writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
|
|
@@ -1749,35 +2370,43 @@ var init = async ({
|
|
|
1749
2370
|
const depService = new DepsService();
|
|
1750
2371
|
const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
|
|
1751
2372
|
if (needsLibsql) {
|
|
1752
|
-
await depService.installPackages([
|
|
2373
|
+
await depService.installPackages([`@mastra/libsql${packageVersionTag}`]);
|
|
1753
2374
|
}
|
|
1754
2375
|
const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
|
|
1755
2376
|
if (needsMemory) {
|
|
1756
|
-
await depService.installPackages([
|
|
2377
|
+
await depService.installPackages([`@mastra/memory${packageVersionTag}`]);
|
|
2378
|
+
}
|
|
2379
|
+
const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
|
|
2380
|
+
if (needsLoggers) {
|
|
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}`]);
|
|
1757
2390
|
}
|
|
1758
2391
|
}
|
|
1759
2392
|
const key = await getAPIKey(llmProvider || "openai");
|
|
1760
|
-
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
1761
|
-
const depsService = new DepsService();
|
|
1762
|
-
const pm = depsService.packageManager;
|
|
1763
|
-
const installCommand = getPackageManagerInstallCommand(pm);
|
|
1764
|
-
await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
|
|
1765
2393
|
if (configureEditorWithDocsMCP) {
|
|
1766
2394
|
await installMastraDocsMCPServer({
|
|
1767
2395
|
editor: configureEditorWithDocsMCP,
|
|
1768
|
-
directory: process.cwd()
|
|
2396
|
+
directory: process.cwd(),
|
|
2397
|
+
versionTag
|
|
1769
2398
|
});
|
|
1770
2399
|
}
|
|
1771
2400
|
s.stop();
|
|
1772
2401
|
if (!llmApiKey) {
|
|
1773
|
-
|
|
2402
|
+
Me(`
|
|
1774
2403
|
${color2.green("Mastra initialized successfully!")}
|
|
1775
2404
|
|
|
1776
2405
|
Add your ${color2.cyan(key)} as an environment variable
|
|
1777
|
-
in your ${color2.cyan(".env
|
|
2406
|
+
in your ${color2.cyan(".env")} file
|
|
1778
2407
|
`);
|
|
1779
2408
|
} else {
|
|
1780
|
-
|
|
2409
|
+
Me(`
|
|
1781
2410
|
${color2.green("Mastra initialized successfully!")}
|
|
1782
2411
|
`);
|
|
1783
2412
|
}
|
|
@@ -1811,69 +2440,101 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
1811
2440
|
throw error;
|
|
1812
2441
|
}
|
|
1813
2442
|
} catch (error) {
|
|
1814
|
-
console.error(error);
|
|
1815
2443
|
throw error;
|
|
1816
2444
|
}
|
|
1817
2445
|
};
|
|
1818
2446
|
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
1819
|
-
let installCommand =
|
|
2447
|
+
let installCommand = getPackageManagerAddCommand(pm);
|
|
1820
2448
|
if (isDev) {
|
|
1821
|
-
installCommand = `${installCommand}
|
|
2449
|
+
installCommand = `${installCommand} -D`;
|
|
1822
2450
|
}
|
|
1823
2451
|
try {
|
|
1824
2452
|
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
1825
2453
|
} catch (err) {
|
|
1826
|
-
console.log("err", err);
|
|
1827
2454
|
if (versionTag === "@latest") {
|
|
1828
|
-
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
|
+
);
|
|
1829
2465
|
}
|
|
1830
|
-
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
1831
2466
|
}
|
|
1832
2467
|
}
|
|
1833
2468
|
var createMastraProject = async ({
|
|
1834
2469
|
projectName: name,
|
|
1835
2470
|
createVersionTag,
|
|
1836
|
-
timeout
|
|
2471
|
+
timeout,
|
|
2472
|
+
llmProvider,
|
|
2473
|
+
llmApiKey,
|
|
2474
|
+
needsInteractive
|
|
1837
2475
|
}) => {
|
|
1838
|
-
|
|
1839
|
-
const projectName = name ?? await
|
|
2476
|
+
Ie(color2.inverse(" Mastra Create "));
|
|
2477
|
+
const projectName = name ?? await he({
|
|
1840
2478
|
message: "What do you want to name your project?",
|
|
1841
2479
|
placeholder: "my-mastra-app",
|
|
1842
|
-
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
|
+
}
|
|
1843
2487
|
});
|
|
1844
|
-
if (
|
|
1845
|
-
|
|
2488
|
+
if (pD(projectName)) {
|
|
2489
|
+
xe("Operation cancelled");
|
|
1846
2490
|
process.exit(0);
|
|
1847
2491
|
}
|
|
1848
|
-
|
|
1849
|
-
|
|
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();
|
|
1850
2500
|
try {
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
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"}`
|
|
1856
2511
|
);
|
|
1857
|
-
process.exit(1);
|
|
1858
2512
|
}
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
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 '{
|
|
1877
2538
|
"compilerOptions": {
|
|
1878
2539
|
"target": "ES2022",
|
|
1879
2540
|
"module": "ES2022",
|
|
@@ -1889,78 +2550,300 @@ var createMastraProject = async ({
|
|
|
1889
2550
|
"src/**/*"
|
|
1890
2551
|
]
|
|
1891
2552
|
}' > tsconfig.json`);
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
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
|
+
}
|
|
1915
2601
|
};
|
|
1916
|
-
var
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
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
|
|
1921
2622
|
});
|
|
1922
|
-
const directory =
|
|
1923
|
-
if (
|
|
1924
|
-
const result = await interactivePrompt();
|
|
2623
|
+
const directory = args.directory || "src/";
|
|
2624
|
+
if (needsInteractive && result) {
|
|
1925
2625
|
await init({
|
|
1926
2626
|
...result,
|
|
1927
|
-
llmApiKey: result?.llmApiKey
|
|
2627
|
+
llmApiKey: result?.llmApiKey,
|
|
2628
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
2629
|
+
addExample: true,
|
|
2630
|
+
versionTag: args.createVersionTag
|
|
1928
2631
|
});
|
|
1929
2632
|
postCreate({ projectName });
|
|
1930
2633
|
return;
|
|
1931
2634
|
}
|
|
1932
|
-
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } =
|
|
2635
|
+
const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
|
|
1933
2636
|
await init({
|
|
1934
2637
|
directory,
|
|
1935
2638
|
components,
|
|
1936
2639
|
llmProvider,
|
|
1937
2640
|
addExample,
|
|
1938
|
-
llmApiKey
|
|
2641
|
+
llmApiKey,
|
|
2642
|
+
configureEditorWithDocsMCP: args.mcpServer,
|
|
2643
|
+
versionTag: args.createVersionTag
|
|
1939
2644
|
});
|
|
1940
2645
|
postCreate({ projectName });
|
|
1941
2646
|
};
|
|
1942
2647
|
var postCreate = ({ projectName }) => {
|
|
1943
|
-
|
|
2648
|
+
const packageManager = getPackageManager();
|
|
2649
|
+
Se(`
|
|
1944
2650
|
${color2.green("To start your project:")}
|
|
1945
2651
|
|
|
1946
2652
|
${color2.cyan("cd")} ${projectName}
|
|
1947
|
-
${color2.cyan(
|
|
2653
|
+
${color2.cyan(`${packageManager} run dev`)}
|
|
1948
2654
|
`);
|
|
1949
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
|
+
}
|
|
1950
2833
|
|
|
1951
2834
|
async function getPackageVersion() {
|
|
1952
2835
|
const __filename = fileURLToPath(import.meta.url);
|
|
1953
2836
|
const __dirname = dirname(__filename);
|
|
1954
|
-
const pkgJsonPath =
|
|
1955
|
-
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
2837
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
2838
|
+
const content = await fsExtra$1.readJSON(pkgJsonPath);
|
|
1956
2839
|
return content.version;
|
|
1957
2840
|
}
|
|
1958
2841
|
async function getCreateVersionTag() {
|
|
1959
2842
|
try {
|
|
1960
2843
|
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
1961
|
-
const json = await fsExtra.readJSON(pkgPath);
|
|
2844
|
+
const json = await fsExtra$1.readJSON(pkgPath);
|
|
1962
2845
|
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
1963
|
-
const tagLine = stdout.split("\n").find((distLine) => distLine.
|
|
2846
|
+
const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
|
|
1964
2847
|
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
1965
2848
|
return tag;
|
|
1966
2849
|
} catch {
|
|
@@ -1982,23 +2865,30 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
1982
2865
|
analytics.trackCommand({
|
|
1983
2866
|
command: "version"
|
|
1984
2867
|
});
|
|
1985
|
-
console.
|
|
2868
|
+
console.info(`create-mastra ${version}`);
|
|
1986
2869
|
} catch {
|
|
1987
2870
|
}
|
|
1988
2871
|
});
|
|
1989
2872
|
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
1990
2873
|
"-p, --project-name <string>",
|
|
1991
2874
|
"Project name that will be used in package.json and as the project directory name."
|
|
1992
|
-
).option("--default", "Quick start with defaults(src, OpenAI,
|
|
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) => {
|
|
1993
2879
|
const projectName = projectNameArg || args.projectName;
|
|
1994
2880
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
1995
2881
|
if (args.default) {
|
|
1996
2882
|
await create({
|
|
1997
|
-
components: ["agents", "tools", "workflows"],
|
|
2883
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
1998
2884
|
llmProvider: "openai",
|
|
1999
|
-
addExample:
|
|
2885
|
+
addExample: true,
|
|
2000
2886
|
createVersionTag,
|
|
2001
|
-
timeout
|
|
2887
|
+
timeout,
|
|
2888
|
+
mcpServer: args.mcp,
|
|
2889
|
+
directory: "src/",
|
|
2890
|
+
template: args.template,
|
|
2891
|
+
analytics
|
|
2002
2892
|
});
|
|
2003
2893
|
return;
|
|
2004
2894
|
}
|
|
@@ -2006,11 +2896,14 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2006
2896
|
components: args.components ? args.components.split(",") : [],
|
|
2007
2897
|
llmProvider: args.llm,
|
|
2008
2898
|
addExample: args.example,
|
|
2009
|
-
llmApiKey: args
|
|
2899
|
+
llmApiKey: args.llmApiKey,
|
|
2010
2900
|
createVersionTag,
|
|
2011
2901
|
timeout,
|
|
2012
2902
|
projectName,
|
|
2013
|
-
directory: args.dir
|
|
2903
|
+
directory: args.dir,
|
|
2904
|
+
mcpServer: args.mcp,
|
|
2905
|
+
template: args.template,
|
|
2906
|
+
analytics
|
|
2014
2907
|
});
|
|
2015
2908
|
});
|
|
2016
2909
|
program.parse(process.argv);
|