create-mastra 0.0.0-revert-schema-20250416221206 → 0.0.0-safe-stringify-telemetry-20251205024938
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 +2159 -0
- package/LICENSE.md +11 -42
- package/README.md +11 -40
- package/dist/index.js +1523 -567
- package/dist/index.js.map +1 -1
- package/dist/templates/dev.entry.js +9 -4
- package/package.json +36 -21
- package/dist/starter-files/config.ts +0 -25
- package/dist/starter-files/mastra-pg.docker-compose.yaml +0 -15
package/dist/index.js
CHANGED
|
@@ -7,23 +7,27 @@ import os from 'node:os';
|
|
|
7
7
|
import path, { dirname } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { PostHog } from 'posthog-node';
|
|
10
|
-
import h, { stdin, stdout } from 'node:process';
|
|
11
|
-
import * as f from 'node:readline';
|
|
12
|
-
import f__default from 'node:readline';
|
|
13
|
-
import tty, { WriteStream } from 'node:tty';
|
|
14
|
-
import child_process from 'node:child_process';
|
|
15
|
-
import util from 'node:util';
|
|
16
10
|
import fs4 from 'node:fs/promises';
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
11
|
+
import util, { stripVTControlCharacters } from 'node:util';
|
|
12
|
+
import y$1, { stdout, stdin } from 'node:process';
|
|
13
|
+
import * as g from 'node:readline';
|
|
14
|
+
import g__default from 'node:readline';
|
|
15
|
+
import { Writable } from 'node:stream';
|
|
16
|
+
import child_process from 'node:child_process';
|
|
17
|
+
import tty from 'node:tty';
|
|
18
|
+
import fsExtra, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
19
19
|
import prettier from 'prettier';
|
|
20
|
-
import {
|
|
20
|
+
import { execa } from 'execa';
|
|
21
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
26
|
var __dirname = path.dirname(__filename);
|
|
27
|
+
var analyticsInstance = null;
|
|
28
|
+
function getAnalytics() {
|
|
29
|
+
return analyticsInstance;
|
|
30
|
+
}
|
|
27
31
|
var PosthogAnalytics = class {
|
|
28
32
|
sessionId;
|
|
29
33
|
client;
|
|
@@ -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
|
|
@@ -603,7 +893,7 @@ class YoctoSpinner {
|
|
|
603
893
|
this.#frames = spinner.frames;
|
|
604
894
|
this.#interval = spinner.interval;
|
|
605
895
|
this.#text = options.text ?? '';
|
|
606
|
-
this.#stream = options.stream ??
|
|
896
|
+
this.#stream = options.stream ?? y$1.stderr;
|
|
607
897
|
this.#color = options.color ?? 'cyan';
|
|
608
898
|
this.#isInteractive = isInteractive(this.#stream);
|
|
609
899
|
this.#exitHandlerBound = this.#exitHandler.bind(this);
|
|
@@ -675,8 +965,8 @@ class YoctoSpinner {
|
|
|
675
965
|
return this.#text;
|
|
676
966
|
}
|
|
677
967
|
|
|
678
|
-
set text(value
|
|
679
|
-
this.#text = value;
|
|
968
|
+
set text(value) {
|
|
969
|
+
this.#text = value ?? '';
|
|
680
970
|
this.#render();
|
|
681
971
|
}
|
|
682
972
|
|
|
@@ -740,7 +1030,7 @@ class YoctoSpinner {
|
|
|
740
1030
|
|
|
741
1031
|
#lineCount(text) {
|
|
742
1032
|
const width = this.#stream.columns ?? 80;
|
|
743
|
-
const lines = text.split('\n');
|
|
1033
|
+
const lines = stripVTControlCharacters(text).split('\n');
|
|
744
1034
|
|
|
745
1035
|
let lineCount = 0;
|
|
746
1036
|
for (const line of lines) {
|
|
@@ -763,13 +1053,13 @@ class YoctoSpinner {
|
|
|
763
1053
|
}
|
|
764
1054
|
|
|
765
1055
|
#subscribeToProcessEvents() {
|
|
766
|
-
|
|
767
|
-
|
|
1056
|
+
y$1.once('SIGINT', this.#exitHandlerBound);
|
|
1057
|
+
y$1.once('SIGTERM', this.#exitHandlerBound);
|
|
768
1058
|
}
|
|
769
1059
|
|
|
770
1060
|
#unsubscribeFromProcessEvents() {
|
|
771
|
-
|
|
772
|
-
|
|
1061
|
+
y$1.off('SIGINT', this.#exitHandlerBound);
|
|
1062
|
+
y$1.off('SIGTERM', this.#exitHandlerBound);
|
|
773
1063
|
}
|
|
774
1064
|
|
|
775
1065
|
#exitHandler(signal) {
|
|
@@ -780,7 +1070,7 @@ class YoctoSpinner {
|
|
|
780
1070
|
// SIGINT: 128 + 2
|
|
781
1071
|
// SIGTERM: 128 + 15
|
|
782
1072
|
const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
|
|
783
|
-
|
|
1073
|
+
y$1.exit(exitCode);
|
|
784
1074
|
}
|
|
785
1075
|
}
|
|
786
1076
|
|
|
@@ -789,46 +1079,86 @@ function yoctoSpinner(options) {
|
|
|
789
1079
|
}
|
|
790
1080
|
|
|
791
1081
|
var LogLevel = {
|
|
792
|
-
INFO: "info"
|
|
793
|
-
|
|
794
|
-
|
|
1082
|
+
INFO: "info",
|
|
1083
|
+
ERROR: "error"};
|
|
1084
|
+
var MastraLogger = class {
|
|
1085
|
+
name;
|
|
1086
|
+
level;
|
|
795
1087
|
transports;
|
|
796
1088
|
constructor(options = {}) {
|
|
797
|
-
this.
|
|
798
|
-
|
|
799
|
-
this.
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
1089
|
+
this.name = options.name || "Mastra";
|
|
1090
|
+
this.level = options.level || LogLevel.ERROR;
|
|
1091
|
+
this.transports = new Map(Object.entries(options.transports || {}));
|
|
1092
|
+
}
|
|
1093
|
+
getTransports() {
|
|
1094
|
+
return this.transports;
|
|
1095
|
+
}
|
|
1096
|
+
trackException(_error) {
|
|
1097
|
+
}
|
|
1098
|
+
async getLogs(transportId, params) {
|
|
1099
|
+
if (!transportId || !this.transports.has(transportId)) {
|
|
1100
|
+
return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
|
|
1101
|
+
}
|
|
1102
|
+
return this.transports.get(transportId).getLogs(params) ?? {
|
|
1103
|
+
logs: [],
|
|
1104
|
+
total: 0,
|
|
1105
|
+
page: params?.page ?? 1,
|
|
1106
|
+
perPage: params?.perPage ?? 100,
|
|
1107
|
+
hasMore: false
|
|
1108
|
+
};
|
|
1109
|
+
}
|
|
1110
|
+
async getLogsByRunId({
|
|
1111
|
+
transportId,
|
|
1112
|
+
runId,
|
|
1113
|
+
fromDate,
|
|
1114
|
+
toDate,
|
|
1115
|
+
logLevel,
|
|
1116
|
+
filters,
|
|
1117
|
+
page,
|
|
1118
|
+
perPage
|
|
1119
|
+
}) {
|
|
1120
|
+
if (!transportId || !this.transports.has(transportId) || !runId) {
|
|
1121
|
+
return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
|
|
1122
|
+
}
|
|
1123
|
+
return this.transports.get(transportId).getLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
|
|
1124
|
+
logs: [],
|
|
1125
|
+
total: 0,
|
|
1126
|
+
page: page ?? 1,
|
|
1127
|
+
perPage: perPage ?? 100,
|
|
1128
|
+
hasMore: false
|
|
1129
|
+
};
|
|
1130
|
+
}
|
|
1131
|
+
};
|
|
1132
|
+
|
|
1133
|
+
var PinoLogger = class extends MastraLogger {
|
|
1134
|
+
logger;
|
|
1135
|
+
constructor(options = {}) {
|
|
1136
|
+
super(options);
|
|
1137
|
+
let prettyStream = void 0;
|
|
1138
|
+
if (!options.overrideDefaultTransports) {
|
|
1139
|
+
prettyStream = pretty({
|
|
812
1140
|
colorize: true,
|
|
813
1141
|
levelFirst: true,
|
|
814
1142
|
ignore: "pid,hostname",
|
|
815
1143
|
colorizeObjects: true,
|
|
816
1144
|
translateTime: "SYS:standard",
|
|
817
1145
|
singleLine: false
|
|
818
|
-
})
|
|
1146
|
+
});
|
|
1147
|
+
}
|
|
1148
|
+
const transportsAry = [...this.getTransports().entries()];
|
|
1149
|
+
this.logger = pino(
|
|
1150
|
+
{
|
|
1151
|
+
name: options.name || "app",
|
|
1152
|
+
level: options.level || LogLevel.INFO,
|
|
1153
|
+
formatters: options.formatters
|
|
1154
|
+
},
|
|
1155
|
+
options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
|
|
819
1156
|
...transportsAry.map(([, transport]) => ({
|
|
820
1157
|
stream: transport,
|
|
821
1158
|
level: options.level || LogLevel.INFO
|
|
822
1159
|
})),
|
|
823
1160
|
{
|
|
824
|
-
stream:
|
|
825
|
-
colorize: true,
|
|
826
|
-
levelFirst: true,
|
|
827
|
-
ignore: "pid,hostname",
|
|
828
|
-
colorizeObjects: true,
|
|
829
|
-
translateTime: "SYS:standard",
|
|
830
|
-
singleLine: false
|
|
831
|
-
}),
|
|
1161
|
+
stream: prettyStream,
|
|
832
1162
|
level: options.level || LogLevel.INFO
|
|
833
1163
|
}
|
|
834
1164
|
])
|
|
@@ -846,32 +1176,134 @@ var Logger = class {
|
|
|
846
1176
|
error(message, args = {}) {
|
|
847
1177
|
this.logger.error(args, message);
|
|
848
1178
|
}
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
1179
|
+
};
|
|
1180
|
+
|
|
1181
|
+
var args = ["-y", "@mastra/mcp-docs-server"];
|
|
1182
|
+
var createMcpConfig = (editor) => {
|
|
1183
|
+
if (editor === "vscode") {
|
|
1184
|
+
return {
|
|
1185
|
+
servers: {
|
|
1186
|
+
mastra: process.platform === `win32` ? {
|
|
1187
|
+
command: "cmd",
|
|
1188
|
+
args: ["/c", "npx", ...args],
|
|
1189
|
+
type: "stdio"
|
|
1190
|
+
} : {
|
|
1191
|
+
command: "npx",
|
|
1192
|
+
args,
|
|
1193
|
+
type: "stdio"
|
|
856
1194
|
}
|
|
857
|
-
callback(null, chunk);
|
|
858
1195
|
}
|
|
859
|
-
}
|
|
1196
|
+
};
|
|
860
1197
|
}
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
1198
|
+
return {
|
|
1199
|
+
mcpServers: {
|
|
1200
|
+
mastra: {
|
|
1201
|
+
command: "npx",
|
|
1202
|
+
args
|
|
1203
|
+
}
|
|
864
1204
|
}
|
|
865
|
-
|
|
1205
|
+
};
|
|
1206
|
+
};
|
|
1207
|
+
function makeConfig(original, editor) {
|
|
1208
|
+
if (editor === "vscode") {
|
|
1209
|
+
return {
|
|
1210
|
+
...original,
|
|
1211
|
+
servers: {
|
|
1212
|
+
...original?.servers || {},
|
|
1213
|
+
...createMcpConfig(editor).servers
|
|
1214
|
+
}
|
|
1215
|
+
};
|
|
866
1216
|
}
|
|
867
|
-
|
|
868
|
-
|
|
1217
|
+
return {
|
|
1218
|
+
...original,
|
|
1219
|
+
mcpServers: {
|
|
1220
|
+
...original?.mcpServers || {},
|
|
1221
|
+
...createMcpConfig(editor).mcpServers
|
|
1222
|
+
}
|
|
1223
|
+
};
|
|
1224
|
+
}
|
|
1225
|
+
async function writeMergedConfig(configPath, editor) {
|
|
1226
|
+
const configExists = existsSync(configPath);
|
|
1227
|
+
const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor);
|
|
1228
|
+
await ensureFile(configPath);
|
|
1229
|
+
await writeJSON(configPath, config, {
|
|
1230
|
+
spaces: 2
|
|
1231
|
+
});
|
|
1232
|
+
}
|
|
1233
|
+
var windsurfGlobalMCPConfigPath = path.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1234
|
+
var cursorGlobalMCPConfigPath = path.join(os.homedir(), ".cursor", "mcp.json");
|
|
1235
|
+
path.join(process.cwd(), ".vscode", "mcp.json");
|
|
1236
|
+
var vscodeGlobalMCPConfigPath = path.join(
|
|
1237
|
+
os.homedir(),
|
|
1238
|
+
process.platform === "win32" ? path.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path.join("Library", "Application Support", "Code", "User", "settings.json") : path.join(".config", "Code", "User", "settings.json")
|
|
1239
|
+
);
|
|
1240
|
+
async function installMastraDocsMCPServer({ editor, directory }) {
|
|
1241
|
+
if (editor === `cursor`) {
|
|
1242
|
+
await writeMergedConfig(path.join(directory, ".cursor", "mcp.json"), "cursor");
|
|
1243
|
+
}
|
|
1244
|
+
if (editor === `vscode`) {
|
|
1245
|
+
await writeMergedConfig(path.join(directory, ".vscode", "mcp.json"), "vscode");
|
|
1246
|
+
}
|
|
1247
|
+
if (editor === `cursor-global`) {
|
|
1248
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1249
|
+
if (alreadyInstalled) {
|
|
1250
|
+
return;
|
|
1251
|
+
}
|
|
1252
|
+
await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global");
|
|
1253
|
+
}
|
|
1254
|
+
if (editor === `windsurf`) {
|
|
1255
|
+
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1256
|
+
if (alreadyInstalled) {
|
|
1257
|
+
return;
|
|
1258
|
+
}
|
|
1259
|
+
await writeMergedConfig(windsurfGlobalMCPConfigPath, editor);
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
async function globalMCPIsAlreadyInstalled(editor) {
|
|
1263
|
+
let configPath = ``;
|
|
1264
|
+
if (editor === "windsurf") {
|
|
1265
|
+
configPath = windsurfGlobalMCPConfigPath;
|
|
1266
|
+
} else if (editor === "cursor-global") {
|
|
1267
|
+
configPath = cursorGlobalMCPConfigPath;
|
|
1268
|
+
} else if (editor === "vscode") {
|
|
1269
|
+
configPath = vscodeGlobalMCPConfigPath;
|
|
1270
|
+
}
|
|
1271
|
+
if (!configPath || !existsSync(configPath)) {
|
|
1272
|
+
return false;
|
|
1273
|
+
}
|
|
1274
|
+
try {
|
|
1275
|
+
const configContents = await readJSON(configPath);
|
|
1276
|
+
if (!configContents) return false;
|
|
1277
|
+
if (editor === "vscode") {
|
|
1278
|
+
if (!configContents.servers) return false;
|
|
1279
|
+
const hasMastraMCP2 = Object.values(configContents.servers).some(
|
|
1280
|
+
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1281
|
+
);
|
|
1282
|
+
return hasMastraMCP2;
|
|
1283
|
+
}
|
|
1284
|
+
if (!configContents?.mcpServers) return false;
|
|
1285
|
+
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1286
|
+
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1287
|
+
);
|
|
1288
|
+
return hasMastraMCP;
|
|
1289
|
+
} catch {
|
|
1290
|
+
return false;
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
function getPackageManagerAddCommand(pm) {
|
|
1294
|
+
switch (pm) {
|
|
1295
|
+
case "npm":
|
|
1296
|
+
return "install --audit=false --fund=false --loglevel=error --progress=false --update-notifier=false";
|
|
1297
|
+
case "yarn":
|
|
1298
|
+
return "add";
|
|
1299
|
+
case "pnpm":
|
|
1300
|
+
return "add --loglevel=error";
|
|
1301
|
+
case "bun":
|
|
1302
|
+
return "add";
|
|
1303
|
+
default:
|
|
1304
|
+
return "add";
|
|
869
1305
|
}
|
|
870
|
-
};
|
|
871
|
-
function createLogger(options) {
|
|
872
|
-
return new Logger(options);
|
|
873
1306
|
}
|
|
874
|
-
|
|
875
1307
|
var DepsService = class {
|
|
876
1308
|
packageManager;
|
|
877
1309
|
constructor() {
|
|
@@ -906,14 +1338,10 @@ var DepsService = class {
|
|
|
906
1338
|
}
|
|
907
1339
|
}
|
|
908
1340
|
async installPackages(packages) {
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
runCommand = `${this.packageManager} i`;
|
|
912
|
-
} else {
|
|
913
|
-
runCommand = `${this.packageManager} add`;
|
|
914
|
-
}
|
|
1341
|
+
const pm = this.packageManager;
|
|
1342
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
915
1343
|
const packageList = packages.join(" ");
|
|
916
|
-
return execa(`${
|
|
1344
|
+
return execa(`${pm} ${installCommand} ${packageList}`, {
|
|
917
1345
|
all: true,
|
|
918
1346
|
shell: true,
|
|
919
1347
|
stdio: "inherit"
|
|
@@ -949,13 +1377,6 @@ var DepsService = class {
|
|
|
949
1377
|
throw err;
|
|
950
1378
|
}
|
|
951
1379
|
}
|
|
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
1380
|
async addScriptsToPackageJson(scripts) {
|
|
960
1381
|
const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
|
|
961
1382
|
packageJson.scripts = {
|
|
@@ -965,95 +1386,6 @@ var DepsService = class {
|
|
|
965
1386
|
await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
966
1387
|
}
|
|
967
1388
|
};
|
|
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
|
-
async function installMastraDocsMCPServer({
|
|
1034
|
-
editor,
|
|
1035
|
-
directory
|
|
1036
|
-
}) {
|
|
1037
|
-
if (editor === `cursor`) await writeMergedConfig(path.join(directory, ".cursor", "mcp.json"));
|
|
1038
|
-
const windsurfIsInstalled = await globalWindsurfMCPIsAlreadyInstalled();
|
|
1039
|
-
if (editor === `windsurf` && !windsurfIsInstalled) await writeMergedConfig(windsurfGlobalMCPConfigPath);
|
|
1040
|
-
}
|
|
1041
|
-
async function globalWindsurfMCPIsAlreadyInstalled() {
|
|
1042
|
-
if (!existsSync(windsurfGlobalMCPConfigPath)) {
|
|
1043
|
-
return false;
|
|
1044
|
-
}
|
|
1045
|
-
try {
|
|
1046
|
-
const configContents = await readJSON(windsurfGlobalMCPConfigPath);
|
|
1047
|
-
if (!configContents?.mcpServers) return false;
|
|
1048
|
-
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1049
|
-
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1050
|
-
);
|
|
1051
|
-
return hasMastraMCP;
|
|
1052
|
-
} catch (e) {
|
|
1053
|
-
console.error(e);
|
|
1054
|
-
return false;
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
1389
|
var EnvService = class {
|
|
1058
1390
|
};
|
|
1059
1391
|
var FileEnvService = class extends EnvService {
|
|
@@ -1092,7 +1424,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1092
1424
|
${key}=${value}`;
|
|
1093
1425
|
}
|
|
1094
1426
|
await this.writeFile({ filePath, data });
|
|
1095
|
-
console.
|
|
1427
|
+
console.info(`${key} set to ${value} in ENV file.`);
|
|
1096
1428
|
return data;
|
|
1097
1429
|
}
|
|
1098
1430
|
async getEnvValue(key) {
|
|
@@ -1129,15 +1461,15 @@ var FileService = class {
|
|
|
1129
1461
|
const filePath = path.resolve(__dirname, "starter-files", inputFile);
|
|
1130
1462
|
const fileString = fs3__default__default.readFileSync(filePath, "utf8");
|
|
1131
1463
|
if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
|
|
1132
|
-
console.
|
|
1464
|
+
console.info(`${outputFilePath} already exists`);
|
|
1133
1465
|
return false;
|
|
1134
1466
|
}
|
|
1135
|
-
await
|
|
1467
|
+
await fsExtra.outputFile(outputFilePath, fileString);
|
|
1136
1468
|
return true;
|
|
1137
1469
|
}
|
|
1138
1470
|
async setupEnvFile({ dbUrl }) {
|
|
1139
1471
|
const envPath = path.join(process.cwd(), ".env.development");
|
|
1140
|
-
await
|
|
1472
|
+
await fsExtra.ensureFile(envPath);
|
|
1141
1473
|
const fileEnvService = new FileEnvService(envPath);
|
|
1142
1474
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1143
1475
|
}
|
|
@@ -1160,72 +1492,78 @@ var FileService = class {
|
|
|
1160
1492
|
fs3__default__default.writeFileSync(filePath, fileContent);
|
|
1161
1493
|
}
|
|
1162
1494
|
};
|
|
1163
|
-
createLogger({
|
|
1164
|
-
name: "Mastra CLI",
|
|
1165
|
-
level: "debug"
|
|
1166
|
-
});
|
|
1167
1495
|
var exec = util.promisify(child_process.exec);
|
|
1168
|
-
var
|
|
1169
|
-
switch (llmProvider) {
|
|
1170
|
-
case "openai":
|
|
1171
|
-
return "@ai-sdk/openai";
|
|
1172
|
-
case "anthropic":
|
|
1173
|
-
return "@ai-sdk/anthropic";
|
|
1174
|
-
case "groq":
|
|
1175
|
-
return "@ai-sdk/groq";
|
|
1176
|
-
case "google":
|
|
1177
|
-
return "@ai-sdk/google";
|
|
1178
|
-
case "cerebras":
|
|
1179
|
-
return "@ai-sdk/cerebras";
|
|
1180
|
-
default:
|
|
1181
|
-
return "@ai-sdk/openai";
|
|
1182
|
-
}
|
|
1183
|
-
};
|
|
1184
|
-
var getProviderImportAndModelItem = (llmProvider) => {
|
|
1185
|
-
let providerImport = "";
|
|
1186
|
-
let modelItem = "";
|
|
1496
|
+
var getModelIdentifier = (llmProvider) => {
|
|
1187
1497
|
if (llmProvider === "openai") {
|
|
1188
|
-
|
|
1189
|
-
modelItem = `openai('gpt-4o')`;
|
|
1498
|
+
return `'openai/gpt-4o-mini'`;
|
|
1190
1499
|
} else if (llmProvider === "anthropic") {
|
|
1191
|
-
|
|
1192
|
-
modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
|
|
1500
|
+
return `'anthropic/claude-sonnet-4-5-20250929'`;
|
|
1193
1501
|
} else if (llmProvider === "groq") {
|
|
1194
|
-
|
|
1195
|
-
modelItem = `groq('llama-3.3-70b-versatile')`;
|
|
1502
|
+
return `'groq/llama-3.3-70b-versatile'`;
|
|
1196
1503
|
} else if (llmProvider === "google") {
|
|
1197
|
-
|
|
1198
|
-
modelItem = `google('gemini-1.5-pro-latest')`;
|
|
1504
|
+
return `'google/gemini-2.5-pro'`;
|
|
1199
1505
|
} else if (llmProvider === "cerebras") {
|
|
1200
|
-
|
|
1201
|
-
|
|
1506
|
+
return `'cerebras/llama-3.3-70b'`;
|
|
1507
|
+
} else if (llmProvider === "mistral") {
|
|
1508
|
+
return `'mistral/mistral-medium-2508'`;
|
|
1202
1509
|
}
|
|
1203
|
-
return { providerImport, modelItem };
|
|
1204
1510
|
};
|
|
1205
|
-
async function writeAgentSample(llmProvider, destPath, addExampleTool) {
|
|
1206
|
-
const
|
|
1511
|
+
async function writeAgentSample(llmProvider, destPath, addExampleTool, addScorers) {
|
|
1512
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1207
1513
|
const instructions = `
|
|
1208
|
-
You are a helpful weather assistant that provides accurate weather information.
|
|
1514
|
+
You are a helpful weather assistant that provides accurate weather information and can help planning activities based on the weather.
|
|
1209
1515
|
|
|
1210
1516
|
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1211
1517
|
- Always ask for a location if none is provided
|
|
1212
|
-
- If the location name isn
|
|
1518
|
+
- If the location name isn't in English, please translate it
|
|
1213
1519
|
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1214
1520
|
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1215
1521
|
- Keep responses concise but informative
|
|
1522
|
+
- If the user asks for activities and provides the weather forecast, suggest activities based on the weather forecast.
|
|
1523
|
+
- If the user asks for activities, respond in the format they request.
|
|
1216
1524
|
|
|
1217
1525
|
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1218
1526
|
`;
|
|
1219
1527
|
const content = `
|
|
1220
|
-
${providerImport}
|
|
1221
1528
|
import { Agent } from '@mastra/core/agent';
|
|
1222
|
-
|
|
1529
|
+
import { Memory } from '@mastra/memory';
|
|
1530
|
+
import { LibSQLStore } from '@mastra/libsql';
|
|
1531
|
+
${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
|
|
1532
|
+
${addScorers ? `import { scorers } from '../scorers/weather-scorer';` : ""}
|
|
1223
1533
|
|
|
1224
1534
|
export const weatherAgent = new Agent({
|
|
1225
1535
|
name: 'Weather Agent',
|
|
1226
1536
|
instructions: \`${instructions}\`,
|
|
1227
|
-
model: ${
|
|
1537
|
+
model: ${modelString},
|
|
1228
1538
|
${addExampleTool ? "tools: { weatherTool }," : ""}
|
|
1539
|
+
${addScorers ? `scorers: {
|
|
1540
|
+
toolCallAppropriateness: {
|
|
1541
|
+
scorer: scorers.toolCallAppropriatenessScorer,
|
|
1542
|
+
sampling: {
|
|
1543
|
+
type: 'ratio',
|
|
1544
|
+
rate: 1,
|
|
1545
|
+
},
|
|
1546
|
+
},
|
|
1547
|
+
completeness: {
|
|
1548
|
+
scorer: scorers.completenessScorer,
|
|
1549
|
+
sampling: {
|
|
1550
|
+
type: 'ratio',
|
|
1551
|
+
rate: 1,
|
|
1552
|
+
},
|
|
1553
|
+
},
|
|
1554
|
+
translation: {
|
|
1555
|
+
scorer: scorers.translationScorer,
|
|
1556
|
+
sampling: {
|
|
1557
|
+
type: 'ratio',
|
|
1558
|
+
rate: 1,
|
|
1559
|
+
},
|
|
1560
|
+
},
|
|
1561
|
+
},` : ""}
|
|
1562
|
+
memory: new Memory({
|
|
1563
|
+
storage: new LibSQLStore({
|
|
1564
|
+
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
1565
|
+
})
|
|
1566
|
+
})
|
|
1229
1567
|
});
|
|
1230
1568
|
`;
|
|
1231
1569
|
const formattedContent = await prettier.format(content, {
|
|
@@ -1235,139 +1573,156 @@ export const weatherAgent = new Agent({
|
|
|
1235
1573
|
await fs4.writeFile(destPath, "");
|
|
1236
1574
|
await fs4.writeFile(destPath, formattedContent);
|
|
1237
1575
|
}
|
|
1238
|
-
async function writeWorkflowSample(destPath
|
|
1239
|
-
const {
|
|
1240
|
-
const content = `${providerImport}
|
|
1241
|
-
import { Agent } from '@mastra/core/agent';
|
|
1242
|
-
import { Step, Workflow } from '@mastra/core/workflows';
|
|
1576
|
+
async function writeWorkflowSample(destPath) {
|
|
1577
|
+
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1243
1578
|
import { z } from 'zod';
|
|
1244
1579
|
|
|
1245
|
-
const
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
For each day in the forecast, structure your response exactly as follows:
|
|
1254
|
-
|
|
1255
|
-
\u{1F4C5} [Day, Month Date, Year]
|
|
1256
|
-
\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
|
|
1257
|
-
|
|
1258
|
-
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1259
|
-
\u2022 Conditions: [brief description]
|
|
1260
|
-
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1261
|
-
\u2022 Precipitation: [X% chance]
|
|
1262
|
-
|
|
1263
|
-
\u{1F305} MORNING ACTIVITIES
|
|
1264
|
-
Outdoor:
|
|
1265
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1266
|
-
Best timing: [specific time range]
|
|
1267
|
-
Note: [relevant weather consideration]
|
|
1268
|
-
|
|
1269
|
-
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1270
|
-
Outdoor:
|
|
1271
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1272
|
-
Best timing: [specific time range]
|
|
1273
|
-
Note: [relevant weather consideration]
|
|
1274
|
-
|
|
1275
|
-
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1276
|
-
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1277
|
-
Ideal for: [weather condition that would trigger this alternative]
|
|
1278
|
-
|
|
1279
|
-
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1280
|
-
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1281
|
-
|
|
1282
|
-
Guidelines:
|
|
1283
|
-
- Suggest 2-3 time-specific outdoor activities per day
|
|
1284
|
-
- Include 1-2 indoor backup options
|
|
1285
|
-
- For precipitation >50%, lead with indoor activities
|
|
1286
|
-
- All activities must be specific to the location
|
|
1287
|
-
- Include specific venues, trails, or locations
|
|
1288
|
-
- Consider activity intensity based on temperature
|
|
1289
|
-
- Keep descriptions concise but informative
|
|
1290
|
-
|
|
1291
|
-
Maintain this exact formatting for consistency, using the emoji and section headers as shown.
|
|
1292
|
-
\`,
|
|
1293
|
-
});
|
|
1294
|
-
|
|
1295
|
-
const forecastSchema = z.array(
|
|
1296
|
-
z.object({
|
|
1297
|
-
date: z.string(),
|
|
1298
|
-
maxTemp: z.number(),
|
|
1299
|
-
minTemp: z.number(),
|
|
1300
|
-
precipitationChance: z.number(),
|
|
1301
|
-
condition: z.string(),
|
|
1302
|
-
location: z.string(),
|
|
1303
|
-
}),
|
|
1304
|
-
);
|
|
1305
|
-
|
|
1306
|
-
const fetchWeather = new Step({
|
|
1307
|
-
id: 'fetch-weather',
|
|
1308
|
-
description: 'Fetches weather forecast for a given city',
|
|
1309
|
-
inputSchema: z.object({
|
|
1310
|
-
city: z.string().describe('The city to get the weather for'),
|
|
1311
|
-
}),
|
|
1312
|
-
outputSchema: forecastSchema,
|
|
1313
|
-
execute: async ({ context }) => {
|
|
1314
|
-
const triggerData = context?.getStepResult<{ city: string }>('trigger');
|
|
1580
|
+
const forecastSchema = z.object({
|
|
1581
|
+
date: z.string(),
|
|
1582
|
+
maxTemp: z.number(),
|
|
1583
|
+
minTemp: z.number(),
|
|
1584
|
+
precipitationChance: z.number(),
|
|
1585
|
+
condition: z.string(),
|
|
1586
|
+
location: z.string(),
|
|
1587
|
+
})
|
|
1315
1588
|
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1589
|
+
function getWeatherCondition(code: number): string {
|
|
1590
|
+
const conditions: Record<number, string> = {
|
|
1591
|
+
0: 'Clear sky',
|
|
1592
|
+
1: 'Mainly clear',
|
|
1593
|
+
2: 'Partly cloudy',
|
|
1594
|
+
3: 'Overcast',
|
|
1595
|
+
45: 'Foggy',
|
|
1596
|
+
48: 'Depositing rime fog',
|
|
1597
|
+
51: 'Light drizzle',
|
|
1598
|
+
53: 'Moderate drizzle',
|
|
1599
|
+
55: 'Dense drizzle',
|
|
1600
|
+
61: 'Slight rain',
|
|
1601
|
+
63: 'Moderate rain',
|
|
1602
|
+
65: 'Heavy rain',
|
|
1603
|
+
71: 'Slight snow fall',
|
|
1604
|
+
73: 'Moderate snow fall',
|
|
1605
|
+
75: 'Heavy snow fall',
|
|
1606
|
+
95: 'Thunderstorm',
|
|
1607
|
+
}
|
|
1608
|
+
return conditions[code] || 'Unknown'
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
const fetchWeather = createStep({
|
|
1612
|
+
id: 'fetch-weather',
|
|
1613
|
+
description: 'Fetches weather forecast for a given city',
|
|
1614
|
+
inputSchema: z.object({
|
|
1615
|
+
city: z.string().describe('The city to get the weather for'),
|
|
1616
|
+
}),
|
|
1617
|
+
outputSchema: forecastSchema,
|
|
1618
|
+
execute: async ({ inputData }) => {
|
|
1619
|
+
if (!inputData) {
|
|
1620
|
+
throw new Error('Input data not found');
|
|
1621
|
+
}
|
|
1319
1622
|
|
|
1320
|
-
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(
|
|
1623
|
+
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(inputData.city)}&count=1\`;
|
|
1321
1624
|
const geocodingResponse = await fetch(geocodingUrl);
|
|
1322
1625
|
const geocodingData = (await geocodingResponse.json()) as {
|
|
1323
1626
|
results: { latitude: number; longitude: number; name: string }[];
|
|
1324
1627
|
};
|
|
1325
1628
|
|
|
1326
1629
|
if (!geocodingData.results?.[0]) {
|
|
1327
|
-
throw new Error(\`Location '\${
|
|
1630
|
+
throw new Error(\`Location '\${inputData.city}' not found\`);
|
|
1328
1631
|
}
|
|
1329
1632
|
|
|
1330
1633
|
const { latitude, longitude, name } = geocodingData.results[0];
|
|
1331
1634
|
|
|
1332
|
-
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}&
|
|
1635
|
+
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}¤t=precipitation,weathercode&timezone=auto,&hourly=precipitation_probability,temperature_2m\`;
|
|
1333
1636
|
const response = await fetch(weatherUrl);
|
|
1334
1637
|
const data = (await response.json()) as {
|
|
1335
|
-
|
|
1336
|
-
time: string
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1638
|
+
current: {
|
|
1639
|
+
time: string
|
|
1640
|
+
precipitation: number
|
|
1641
|
+
weathercode: number
|
|
1642
|
+
}
|
|
1643
|
+
hourly: {
|
|
1644
|
+
precipitation_probability: number[]
|
|
1645
|
+
temperature_2m: number[]
|
|
1646
|
+
}
|
|
1647
|
+
}
|
|
1343
1648
|
|
|
1344
|
-
const forecast =
|
|
1345
|
-
date,
|
|
1346
|
-
maxTemp: data.
|
|
1347
|
-
minTemp: data.
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1649
|
+
const forecast = {
|
|
1650
|
+
date: new Date().toISOString(),
|
|
1651
|
+
maxTemp: Math.max(...data.hourly.temperature_2m),
|
|
1652
|
+
minTemp: Math.min(...data.hourly.temperature_2m),
|
|
1653
|
+
condition: getWeatherCondition(data.current.weathercode),
|
|
1654
|
+
precipitationChance: data.hourly.precipitation_probability.reduce(
|
|
1655
|
+
(acc, curr) => Math.max(acc, curr),
|
|
1656
|
+
0
|
|
1657
|
+
),
|
|
1658
|
+
location: name
|
|
1659
|
+
}
|
|
1352
1660
|
|
|
1353
1661
|
return forecast;
|
|
1354
1662
|
},
|
|
1355
1663
|
});
|
|
1356
1664
|
|
|
1357
1665
|
|
|
1358
|
-
const planActivities =
|
|
1666
|
+
const planActivities = createStep({
|
|
1359
1667
|
id: 'plan-activities',
|
|
1360
1668
|
description: 'Suggests activities based on weather conditions',
|
|
1361
|
-
|
|
1362
|
-
|
|
1669
|
+
inputSchema: forecastSchema,
|
|
1670
|
+
outputSchema: z.object({
|
|
1671
|
+
activities: z.string(),
|
|
1672
|
+
}),
|
|
1673
|
+
execute: async ({ inputData, mastra }) => {
|
|
1674
|
+
const forecast = inputData
|
|
1675
|
+
|
|
1676
|
+
if (!forecast) {
|
|
1677
|
+
throw new Error('Forecast data not found')
|
|
1678
|
+
}
|
|
1363
1679
|
|
|
1364
|
-
|
|
1365
|
-
|
|
1680
|
+
const agent = mastra?.getAgent('weatherAgent');
|
|
1681
|
+
if (!agent) {
|
|
1682
|
+
throw new Error('Weather agent not found');
|
|
1366
1683
|
}
|
|
1367
1684
|
|
|
1368
|
-
const prompt = \`Based on the following weather forecast for \${forecast
|
|
1685
|
+
const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
|
|
1369
1686
|
\${JSON.stringify(forecast, null, 2)}
|
|
1370
|
-
|
|
1687
|
+
For each day in the forecast, structure your response exactly as follows:
|
|
1688
|
+
|
|
1689
|
+
\u{1F4C5} [Day, Month Date, Year]
|
|
1690
|
+
\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
|
|
1691
|
+
|
|
1692
|
+
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1693
|
+
\u2022 Conditions: [brief description]
|
|
1694
|
+
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1695
|
+
\u2022 Precipitation: [X% chance]
|
|
1696
|
+
|
|
1697
|
+
\u{1F305} MORNING ACTIVITIES
|
|
1698
|
+
Outdoor:
|
|
1699
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1700
|
+
Best timing: [specific time range]
|
|
1701
|
+
Note: [relevant weather consideration]
|
|
1702
|
+
|
|
1703
|
+
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1704
|
+
Outdoor:
|
|
1705
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1706
|
+
Best timing: [specific time range]
|
|
1707
|
+
Note: [relevant weather consideration]
|
|
1708
|
+
|
|
1709
|
+
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1710
|
+
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1711
|
+
Ideal for: [weather condition that would trigger this alternative]
|
|
1712
|
+
|
|
1713
|
+
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1714
|
+
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1715
|
+
|
|
1716
|
+
Guidelines:
|
|
1717
|
+
- Suggest 2-3 time-specific outdoor activities per day
|
|
1718
|
+
- Include 1-2 indoor backup options
|
|
1719
|
+
- For precipitation >50%, lead with indoor activities
|
|
1720
|
+
- All activities must be specific to the location
|
|
1721
|
+
- Include specific venues, trails, or locations
|
|
1722
|
+
- Consider activity intensity based on temperature
|
|
1723
|
+
- Keep descriptions concise but informative
|
|
1724
|
+
|
|
1725
|
+
Maintain this exact formatting for consistency, using the emoji and section headers as shown.\`;
|
|
1371
1726
|
|
|
1372
1727
|
const response = await agent.stream([
|
|
1373
1728
|
{
|
|
@@ -1377,7 +1732,7 @@ const planActivities = new Step({
|
|
|
1377
1732
|
]);
|
|
1378
1733
|
|
|
1379
1734
|
let activitiesText = '';
|
|
1380
|
-
|
|
1735
|
+
|
|
1381
1736
|
for await (const chunk of response.textStream) {
|
|
1382
1737
|
process.stdout.write(chunk);
|
|
1383
1738
|
activitiesText += chunk;
|
|
@@ -1389,35 +1744,16 @@ const planActivities = new Step({
|
|
|
1389
1744
|
},
|
|
1390
1745
|
});
|
|
1391
1746
|
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
1: 'Mainly clear',
|
|
1396
|
-
2: 'Partly cloudy',
|
|
1397
|
-
3: 'Overcast',
|
|
1398
|
-
45: 'Foggy',
|
|
1399
|
-
48: 'Depositing rime fog',
|
|
1400
|
-
51: 'Light drizzle',
|
|
1401
|
-
53: 'Moderate drizzle',
|
|
1402
|
-
55: 'Dense drizzle',
|
|
1403
|
-
61: 'Slight rain',
|
|
1404
|
-
63: 'Moderate rain',
|
|
1405
|
-
65: 'Heavy rain',
|
|
1406
|
-
71: 'Slight snow fall',
|
|
1407
|
-
73: 'Moderate snow fall',
|
|
1408
|
-
75: 'Heavy snow fall',
|
|
1409
|
-
95: 'Thunderstorm',
|
|
1410
|
-
};
|
|
1411
|
-
return conditions[code] || 'Unknown';
|
|
1412
|
-
}
|
|
1413
|
-
|
|
1414
|
-
const weatherWorkflow = new Workflow({
|
|
1415
|
-
name: 'weather-workflow',
|
|
1416
|
-
triggerSchema: z.object({
|
|
1747
|
+
const weatherWorkflow = createWorkflow({
|
|
1748
|
+
id: 'weather-workflow',
|
|
1749
|
+
inputSchema: z.object({
|
|
1417
1750
|
city: z.string().describe('The city to get the weather for'),
|
|
1418
1751
|
}),
|
|
1752
|
+
outputSchema: z.object({
|
|
1753
|
+
activities: z.string(),
|
|
1754
|
+
})
|
|
1419
1755
|
})
|
|
1420
|
-
.
|
|
1756
|
+
.then(fetchWeather)
|
|
1421
1757
|
.then(planActivities);
|
|
1422
1758
|
|
|
1423
1759
|
weatherWorkflow.commit();
|
|
@@ -1434,27 +1770,121 @@ async function writeToolSample(destPath) {
|
|
|
1434
1770
|
const fileService = new FileService();
|
|
1435
1771
|
await fileService.copyStarterFile("tools.ts", destPath);
|
|
1436
1772
|
}
|
|
1773
|
+
async function writeScorersSample(llmProvider, destPath) {
|
|
1774
|
+
const modelString = getModelIdentifier(llmProvider);
|
|
1775
|
+
const content = `import { z } from 'zod';
|
|
1776
|
+
import { createToolCallAccuracyScorerCode } from '@mastra/evals/scorers/code';
|
|
1777
|
+
import { createCompletenessScorer } from '@mastra/evals/scorers/code';
|
|
1778
|
+
import { createScorer } from '@mastra/core/scores';
|
|
1779
|
+
|
|
1780
|
+
export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({
|
|
1781
|
+
expectedTool: 'weatherTool',
|
|
1782
|
+
strictMode: false,
|
|
1783
|
+
});
|
|
1784
|
+
|
|
1785
|
+
export const completenessScorer = createCompletenessScorer();
|
|
1786
|
+
|
|
1787
|
+
// Custom LLM-judged scorer: evaluates if non-English locations are translated appropriately
|
|
1788
|
+
export const translationScorer = createScorer({
|
|
1789
|
+
name: 'Translation Quality',
|
|
1790
|
+
description: 'Checks that non-English location names are translated and used correctly',
|
|
1791
|
+
type: 'agent',
|
|
1792
|
+
judge: {
|
|
1793
|
+
model: ${modelString},
|
|
1794
|
+
instructions:
|
|
1795
|
+
'You are an expert evaluator of translation quality for geographic locations. ' +
|
|
1796
|
+
'Determine whether the user text mentions a non-English location and whether the assistant correctly uses an English translation of that location. ' +
|
|
1797
|
+
'Be lenient with transliteration differences and diacritics. ' +
|
|
1798
|
+
'Return only the structured JSON matching the provided schema.',
|
|
1799
|
+
},
|
|
1800
|
+
})
|
|
1801
|
+
.preprocess(({ run }) => {
|
|
1802
|
+
const userText = (run.input?.inputMessages?.[0]?.content as string) || '';
|
|
1803
|
+
const assistantText = (run.output?.[0]?.content as string) || '';
|
|
1804
|
+
return { userText, assistantText };
|
|
1805
|
+
})
|
|
1806
|
+
.analyze({
|
|
1807
|
+
description: 'Extract location names and detect language/translation adequacy',
|
|
1808
|
+
outputSchema: z.object({
|
|
1809
|
+
nonEnglish: z.boolean(),
|
|
1810
|
+
translated: z.boolean(),
|
|
1811
|
+
confidence: z.number().min(0).max(1).default(1),
|
|
1812
|
+
explanation: z.string().default(''),
|
|
1813
|
+
}),
|
|
1814
|
+
createPrompt: ({ results }) => \`
|
|
1815
|
+
You are evaluating if a weather assistant correctly handled translation of a non-English location.
|
|
1816
|
+
User text:
|
|
1817
|
+
"""
|
|
1818
|
+
\${results.preprocessStepResult.userText}
|
|
1819
|
+
"""
|
|
1820
|
+
Assistant response:
|
|
1821
|
+
"""
|
|
1822
|
+
\${results.preprocessStepResult.assistantText}
|
|
1823
|
+
"""
|
|
1824
|
+
Tasks:
|
|
1825
|
+
1) Identify if the user mentioned a location that appears non-English.
|
|
1826
|
+
2) If non-English, check whether the assistant used a correct English translation of that location in its response.
|
|
1827
|
+
3) Be lenient with transliteration differences (e.g., accents/diacritics).
|
|
1828
|
+
Return JSON with fields:
|
|
1829
|
+
{
|
|
1830
|
+
"nonEnglish": boolean,
|
|
1831
|
+
"translated": boolean,
|
|
1832
|
+
"confidence": number, // 0-1
|
|
1833
|
+
"explanation": string
|
|
1834
|
+
}
|
|
1835
|
+
\`,
|
|
1836
|
+
})
|
|
1837
|
+
.generateScore(({ results }) => {
|
|
1838
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1839
|
+
if (!r.nonEnglish) return 1; // If not applicable, full credit
|
|
1840
|
+
if (r.translated) return Math.max(0, Math.min(1, 0.7 + 0.3 * (r.confidence ?? 1)));
|
|
1841
|
+
return 0; // Non-English but not translated
|
|
1842
|
+
})
|
|
1843
|
+
.generateReason(({ results, score }) => {
|
|
1844
|
+
const r = (results as any)?.analyzeStepResult || {};
|
|
1845
|
+
return \`Translation scoring: nonEnglish=\${r.nonEnglish ?? false}, translated=\${r.translated ?? false}, confidence=\${r.confidence ?? 0}. Score=\${score}. \${r.explanation ?? ''}\`;
|
|
1846
|
+
});
|
|
1847
|
+
|
|
1848
|
+
export const scorers = {
|
|
1849
|
+
toolCallAppropriatenessScorer,
|
|
1850
|
+
completenessScorer,
|
|
1851
|
+
translationScorer,
|
|
1852
|
+
};`;
|
|
1853
|
+
const formattedContent = await prettier.format(content, {
|
|
1854
|
+
parser: "typescript",
|
|
1855
|
+
singleQuote: true
|
|
1856
|
+
});
|
|
1857
|
+
await fs4.writeFile(destPath, formattedContent);
|
|
1858
|
+
}
|
|
1437
1859
|
async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
|
|
1438
1860
|
switch (component) {
|
|
1439
1861
|
case "agents":
|
|
1440
|
-
return writeAgentSample(
|
|
1862
|
+
return writeAgentSample(
|
|
1863
|
+
llmprovider,
|
|
1864
|
+
destPath,
|
|
1865
|
+
importComponents.includes("tools"),
|
|
1866
|
+
importComponents.includes("scorers")
|
|
1867
|
+
);
|
|
1441
1868
|
case "tools":
|
|
1442
1869
|
return writeToolSample(destPath);
|
|
1443
1870
|
case "workflows":
|
|
1444
|
-
return writeWorkflowSample(destPath
|
|
1871
|
+
return writeWorkflowSample(destPath);
|
|
1872
|
+
case "scorers":
|
|
1873
|
+
return writeScorersSample(llmprovider, destPath);
|
|
1445
1874
|
default:
|
|
1446
1875
|
return "";
|
|
1447
1876
|
}
|
|
1448
1877
|
}
|
|
1449
1878
|
var createComponentsDir = async (dirPath, component) => {
|
|
1450
1879
|
const componentPath = dirPath + `/${component}`;
|
|
1451
|
-
await
|
|
1880
|
+
await fsExtra.ensureDir(componentPath);
|
|
1452
1881
|
};
|
|
1453
1882
|
var writeIndexFile = async ({
|
|
1454
1883
|
dirPath,
|
|
1455
1884
|
addAgent,
|
|
1456
1885
|
addExample,
|
|
1457
|
-
addWorkflow
|
|
1886
|
+
addWorkflow,
|
|
1887
|
+
addScorers
|
|
1458
1888
|
}) => {
|
|
1459
1889
|
const indexPath = dirPath + "/index.ts";
|
|
1460
1890
|
const destPath = path.join(indexPath);
|
|
@@ -1462,7 +1892,8 @@ var writeIndexFile = async ({
|
|
|
1462
1892
|
await fs4.writeFile(destPath, "");
|
|
1463
1893
|
const filteredExports = [
|
|
1464
1894
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1465
|
-
addAgent ? `agents: { weatherAgent },` : ""
|
|
1895
|
+
addAgent ? `agents: { weatherAgent },` : "",
|
|
1896
|
+
addScorers ? `scorers: { toolCallAppropriatenessScorer, completenessScorer, translationScorer },` : ""
|
|
1466
1897
|
].filter(Boolean);
|
|
1467
1898
|
if (!addExample) {
|
|
1468
1899
|
await fs4.writeFile(
|
|
@@ -1479,16 +1910,30 @@ export const mastra = new Mastra()
|
|
|
1479
1910
|
destPath,
|
|
1480
1911
|
`
|
|
1481
1912
|
import { Mastra } from '@mastra/core/mastra';
|
|
1482
|
-
import {
|
|
1483
|
-
|
|
1484
|
-
${
|
|
1913
|
+
import { PinoLogger } from '@mastra/loggers';
|
|
1914
|
+
import { LibSQLStore } from '@mastra/libsql';
|
|
1915
|
+
${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
|
|
1916
|
+
${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
|
|
1917
|
+
${addScorers ? `import { toolCallAppropriatenessScorer, completenessScorer, translationScorer } from './scorers/weather-scorer';` : ""}
|
|
1485
1918
|
|
|
1486
1919
|
export const mastra = new Mastra({
|
|
1487
1920
|
${filteredExports.join("\n ")}
|
|
1488
|
-
|
|
1921
|
+
storage: new LibSQLStore({
|
|
1922
|
+
// stores observability, scores, ... into memory storage, if it needs to persist, change to file:../mastra.db
|
|
1923
|
+
url: ":memory:",
|
|
1924
|
+
}),
|
|
1925
|
+
logger: new PinoLogger({
|
|
1489
1926
|
name: 'Mastra',
|
|
1490
1927
|
level: 'info',
|
|
1491
1928
|
}),
|
|
1929
|
+
telemetry: {
|
|
1930
|
+
// Telemetry is deprecated and will be removed in the Nov 4th release
|
|
1931
|
+
enabled: false,
|
|
1932
|
+
},
|
|
1933
|
+
observability: {
|
|
1934
|
+
// Enables DefaultExporter and CloudExporter for AI tracing
|
|
1935
|
+
default: { enabled: true },
|
|
1936
|
+
},
|
|
1492
1937
|
});
|
|
1493
1938
|
`
|
|
1494
1939
|
);
|
|
@@ -1496,7 +1941,6 @@ export const mastra = new Mastra({
|
|
|
1496
1941
|
throw err;
|
|
1497
1942
|
}
|
|
1498
1943
|
};
|
|
1499
|
-
yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
|
|
1500
1944
|
var getAPIKey = async (provider) => {
|
|
1501
1945
|
let key = "OPENAI_API_KEY";
|
|
1502
1946
|
switch (provider) {
|
|
@@ -1512,16 +1956,19 @@ var getAPIKey = async (provider) => {
|
|
|
1512
1956
|
case "cerebras":
|
|
1513
1957
|
key = "CEREBRAS_API_KEY";
|
|
1514
1958
|
return key;
|
|
1959
|
+
case "mistral":
|
|
1960
|
+
key = "MISTRAL_API_KEY";
|
|
1961
|
+
return key;
|
|
1515
1962
|
default:
|
|
1516
1963
|
return key;
|
|
1517
1964
|
}
|
|
1518
1965
|
};
|
|
1519
|
-
var writeAPIKey = async ({
|
|
1520
|
-
|
|
1521
|
-
apiKey = "your-api-key"
|
|
1522
|
-
}) => {
|
|
1966
|
+
var writeAPIKey = async ({ provider, apiKey }) => {
|
|
1967
|
+
const envFileName = apiKey ? ".env" : ".env.example";
|
|
1523
1968
|
const key = await getAPIKey(provider);
|
|
1524
|
-
|
|
1969
|
+
const escapedKey = shellQuote2.quote([key]);
|
|
1970
|
+
const escapedApiKey = shellQuote2.quote([apiKey ? apiKey : "your-api-key"]);
|
|
1971
|
+
await exec(`echo ${escapedKey}=${escapedApiKey} >> ${envFileName}`);
|
|
1525
1972
|
};
|
|
1526
1973
|
var createMastraDir = async (directory) => {
|
|
1527
1974
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
@@ -1530,54 +1977,47 @@ var createMastraDir = async (directory) => {
|
|
|
1530
1977
|
await fs4.access(dirPath);
|
|
1531
1978
|
return { ok: false };
|
|
1532
1979
|
} catch {
|
|
1533
|
-
await
|
|
1980
|
+
await fsExtra.ensureDir(dirPath);
|
|
1534
1981
|
return { ok: true, dirPath };
|
|
1535
1982
|
}
|
|
1536
1983
|
};
|
|
1537
1984
|
var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
|
|
1538
|
-
const destPath = dirPath + `/${component}/
|
|
1985
|
+
const destPath = dirPath + `/${component}/weather-${component.slice(0, -1)}.ts`;
|
|
1539
1986
|
try {
|
|
1540
1987
|
await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
|
|
1541
1988
|
} catch (err) {
|
|
1542
1989
|
throw err;
|
|
1543
1990
|
}
|
|
1544
1991
|
};
|
|
1545
|
-
var
|
|
1546
|
-
|
|
1547
|
-
|
|
1992
|
+
var LLM_PROVIDERS = [
|
|
1993
|
+
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1994
|
+
{ value: "anthropic", label: "Anthropic" },
|
|
1995
|
+
{ value: "groq", label: "Groq" },
|
|
1996
|
+
{ value: "google", label: "Google" },
|
|
1997
|
+
{ value: "cerebras", label: "Cerebras" },
|
|
1998
|
+
{ value: "mistral", label: "Mistral" }
|
|
1999
|
+
];
|
|
2000
|
+
var interactivePrompt = async (args2 = {}) => {
|
|
2001
|
+
const { skip = {}, options: { showBanner = true } = {} } = args2;
|
|
2002
|
+
if (showBanner) {
|
|
2003
|
+
Ie(color2.inverse(" Mastra Init "));
|
|
2004
|
+
}
|
|
2005
|
+
const mastraProject = await Ce(
|
|
1548
2006
|
{
|
|
1549
|
-
directory: () =>
|
|
2007
|
+
directory: () => he({
|
|
1550
2008
|
message: "Where should we create the Mastra files? (default: src/)",
|
|
1551
2009
|
placeholder: "src/",
|
|
1552
2010
|
defaultValue: "src/"
|
|
1553
2011
|
}),
|
|
1554
|
-
|
|
1555
|
-
message: "
|
|
1556
|
-
options:
|
|
1557
|
-
{ value: "agents", label: "Agents", hint: "recommended" },
|
|
1558
|
-
{
|
|
1559
|
-
value: "workflows",
|
|
1560
|
-
label: "Workflows"
|
|
1561
|
-
}
|
|
1562
|
-
]
|
|
1563
|
-
}),
|
|
1564
|
-
shouldAddTools: () => ce({
|
|
1565
|
-
message: "Add tools?",
|
|
1566
|
-
initialValue: false
|
|
1567
|
-
}),
|
|
1568
|
-
llmProvider: () => le({
|
|
1569
|
-
message: "Select default provider:",
|
|
1570
|
-
options: [
|
|
1571
|
-
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1572
|
-
{ value: "anthropic", label: "Anthropic" },
|
|
1573
|
-
{ value: "groq", label: "Groq" },
|
|
1574
|
-
{ value: "google", label: "Google" },
|
|
1575
|
-
{ value: "cerebras", label: "Cerebras" }
|
|
1576
|
-
]
|
|
2012
|
+
llmProvider: () => skip?.llmProvider ? void 0 : ve({
|
|
2013
|
+
message: "Select a default provider:",
|
|
2014
|
+
options: LLM_PROVIDERS
|
|
1577
2015
|
}),
|
|
1578
2016
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
1579
|
-
|
|
1580
|
-
|
|
2017
|
+
if (skip?.llmApiKey) return void 0;
|
|
2018
|
+
const llmName = LLM_PROVIDERS.find((p6) => p6.value === llmProvider)?.label || "provider";
|
|
2019
|
+
const keyChoice = await ve({
|
|
2020
|
+
message: `Enter your ${llmName} API key?`,
|
|
1581
2021
|
options: [
|
|
1582
2022
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1583
2023
|
{ value: "enter", label: "Enter API key" }
|
|
@@ -1585,46 +2025,78 @@ var interactivePrompt = async () => {
|
|
|
1585
2025
|
initialValue: "skip"
|
|
1586
2026
|
});
|
|
1587
2027
|
if (keyChoice === "enter") {
|
|
1588
|
-
return
|
|
2028
|
+
return he({
|
|
1589
2029
|
message: "Enter your API key:",
|
|
1590
|
-
placeholder: "sk-..."
|
|
2030
|
+
placeholder: "sk-...",
|
|
2031
|
+
validate: (value) => {
|
|
2032
|
+
if (value.length === 0) return "API key cannot be empty";
|
|
2033
|
+
}
|
|
1591
2034
|
});
|
|
1592
2035
|
}
|
|
1593
2036
|
return void 0;
|
|
1594
2037
|
},
|
|
1595
|
-
addExample: () => ce({
|
|
1596
|
-
message: "Add example",
|
|
1597
|
-
initialValue: false
|
|
1598
|
-
}),
|
|
1599
2038
|
configureEditorWithDocsMCP: async () => {
|
|
1600
|
-
const windsurfIsAlreadyInstalled = await
|
|
1601
|
-
const
|
|
1602
|
-
|
|
2039
|
+
const windsurfIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`windsurf`);
|
|
2040
|
+
const cursorIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`cursor`);
|
|
2041
|
+
const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
|
|
2042
|
+
const editor = await ve({
|
|
2043
|
+
message: `Make your IDE into a Mastra expert? (Installs Mastra's MCP server)`,
|
|
1603
2044
|
options: [
|
|
1604
2045
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
1605
|
-
{
|
|
2046
|
+
{
|
|
2047
|
+
value: "cursor",
|
|
2048
|
+
label: "Cursor (project only)",
|
|
2049
|
+
hint: cursorIsAlreadyInstalled ? `Already installed globally` : void 0
|
|
2050
|
+
},
|
|
2051
|
+
{
|
|
2052
|
+
value: "cursor-global",
|
|
2053
|
+
label: "Cursor (global, all projects)",
|
|
2054
|
+
hint: cursorIsAlreadyInstalled ? `Already installed` : void 0
|
|
2055
|
+
},
|
|
1606
2056
|
{
|
|
1607
2057
|
value: "windsurf",
|
|
1608
2058
|
label: "Windsurf",
|
|
1609
2059
|
hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
|
|
2060
|
+
},
|
|
2061
|
+
{
|
|
2062
|
+
value: "vscode",
|
|
2063
|
+
label: "VSCode",
|
|
2064
|
+
hint: vscodeIsAlreadyInstalled ? `Already installed` : void 0
|
|
1610
2065
|
}
|
|
1611
2066
|
]
|
|
1612
2067
|
});
|
|
1613
2068
|
if (editor === `skip`) return void 0;
|
|
1614
2069
|
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
1615
|
-
|
|
2070
|
+
M.message(`
|
|
1616
2071
|
Windsurf is already installed, skipping.`);
|
|
1617
2072
|
return void 0;
|
|
1618
2073
|
}
|
|
2074
|
+
if (editor === `vscode` && vscodeIsAlreadyInstalled) {
|
|
2075
|
+
M.message(`
|
|
2076
|
+
VSCode is already installed, skipping.`);
|
|
2077
|
+
return void 0;
|
|
2078
|
+
}
|
|
1619
2079
|
if (editor === `cursor`) {
|
|
1620
|
-
|
|
2080
|
+
M.message(
|
|
1621
2081
|
`
|
|
1622
2082
|
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1623
2083
|
`
|
|
1624
2084
|
);
|
|
1625
2085
|
}
|
|
2086
|
+
if (editor === `cursor-global`) {
|
|
2087
|
+
const confirm = await ve({
|
|
2088
|
+
message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
|
|
2089
|
+
options: [
|
|
2090
|
+
{ value: "yes", label: "Yes, I understand" },
|
|
2091
|
+
{ value: "skip", label: "No, skip for now" }
|
|
2092
|
+
]
|
|
2093
|
+
});
|
|
2094
|
+
if (confirm !== `yes`) {
|
|
2095
|
+
return void 0;
|
|
2096
|
+
}
|
|
2097
|
+
}
|
|
1626
2098
|
if (editor === `windsurf`) {
|
|
1627
|
-
const
|
|
2099
|
+
const confirm = await ve({
|
|
1628
2100
|
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
1629
2101
|
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
1630
2102
|
options: [
|
|
@@ -1632,7 +2104,7 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
1632
2104
|
{ value: "skip", label: "No, skip for now" }
|
|
1633
2105
|
]
|
|
1634
2106
|
});
|
|
1635
|
-
if (
|
|
2107
|
+
if (confirm !== `yes`) {
|
|
1636
2108
|
return void 0;
|
|
1637
2109
|
}
|
|
1638
2110
|
}
|
|
@@ -1641,23 +2113,206 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
1641
2113
|
},
|
|
1642
2114
|
{
|
|
1643
2115
|
onCancel: () => {
|
|
1644
|
-
|
|
2116
|
+
xe("Operation cancelled.");
|
|
1645
2117
|
process.exit(0);
|
|
1646
2118
|
}
|
|
1647
2119
|
}
|
|
1648
2120
|
);
|
|
1649
|
-
|
|
1650
|
-
const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
|
|
1651
|
-
return { ...rest, components: mastraComponents };
|
|
2121
|
+
return mastraProject;
|
|
1652
2122
|
};
|
|
1653
|
-
|
|
2123
|
+
function getPackageManager() {
|
|
2124
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
2125
|
+
const execPath = process.env.npm_execpath || "";
|
|
2126
|
+
if (userAgent.includes("bun")) {
|
|
2127
|
+
return "bun";
|
|
2128
|
+
}
|
|
2129
|
+
if (userAgent.includes("yarn")) {
|
|
2130
|
+
return "yarn";
|
|
2131
|
+
}
|
|
2132
|
+
if (userAgent.includes("pnpm")) {
|
|
2133
|
+
return "pnpm";
|
|
2134
|
+
}
|
|
2135
|
+
if (userAgent.includes("npm")) {
|
|
2136
|
+
return "npm";
|
|
2137
|
+
}
|
|
2138
|
+
if (execPath.includes("bun")) {
|
|
2139
|
+
return "bun";
|
|
2140
|
+
}
|
|
2141
|
+
if (execPath.includes("yarn")) {
|
|
2142
|
+
return "yarn";
|
|
2143
|
+
}
|
|
2144
|
+
if (execPath.includes("pnpm")) {
|
|
2145
|
+
return "pnpm";
|
|
2146
|
+
}
|
|
2147
|
+
if (execPath.includes("npm")) {
|
|
2148
|
+
return "npm";
|
|
2149
|
+
}
|
|
2150
|
+
return "npm";
|
|
2151
|
+
}
|
|
2152
|
+
var logger = createLogger(false);
|
|
2153
|
+
function createLogger(debug = false) {
|
|
2154
|
+
return new PinoLogger({
|
|
2155
|
+
name: "Mastra CLI",
|
|
2156
|
+
level: debug ? "debug" : "info"
|
|
2157
|
+
});
|
|
2158
|
+
}
|
|
1654
2159
|
var exec2 = util.promisify(child_process.exec);
|
|
2160
|
+
async function cloneTemplate(options) {
|
|
2161
|
+
const { template, projectName, targetDir } = options;
|
|
2162
|
+
const projectPath = targetDir ? path.resolve(targetDir, projectName) : path.resolve(projectName);
|
|
2163
|
+
const spinner4 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
|
|
2164
|
+
try {
|
|
2165
|
+
if (await directoryExists(projectPath)) {
|
|
2166
|
+
spinner4.error(`Directory ${projectName} already exists`);
|
|
2167
|
+
throw new Error(`Directory ${projectName} already exists`);
|
|
2168
|
+
}
|
|
2169
|
+
await cloneRepositoryWithoutGit(template.githubUrl, projectPath);
|
|
2170
|
+
await updatePackageJson(projectPath, projectName);
|
|
2171
|
+
const envExamplePath = path.join(projectPath, ".env.example");
|
|
2172
|
+
if (await fileExists(envExamplePath)) {
|
|
2173
|
+
await fs4.copyFile(envExamplePath, path.join(projectPath, ".env"));
|
|
2174
|
+
}
|
|
2175
|
+
spinner4.success(`Template "${template.title}" cloned successfully to ${projectName}`);
|
|
2176
|
+
return projectPath;
|
|
2177
|
+
} catch (error) {
|
|
2178
|
+
spinner4.error(`Failed to clone template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2179
|
+
throw error;
|
|
2180
|
+
}
|
|
2181
|
+
}
|
|
2182
|
+
async function directoryExists(dirPath) {
|
|
2183
|
+
try {
|
|
2184
|
+
const stat = await fs4.stat(dirPath);
|
|
2185
|
+
return stat.isDirectory();
|
|
2186
|
+
} catch {
|
|
2187
|
+
return false;
|
|
2188
|
+
}
|
|
2189
|
+
}
|
|
2190
|
+
async function fileExists(filePath) {
|
|
2191
|
+
try {
|
|
2192
|
+
const stat = await fs4.stat(filePath);
|
|
2193
|
+
return stat.isFile();
|
|
2194
|
+
} catch {
|
|
2195
|
+
return false;
|
|
2196
|
+
}
|
|
2197
|
+
}
|
|
2198
|
+
async function cloneRepositoryWithoutGit(repoUrl, targetPath) {
|
|
2199
|
+
await fs4.mkdir(targetPath, { recursive: true });
|
|
2200
|
+
try {
|
|
2201
|
+
const degitRepo = repoUrl.replace("https://github.com/", "");
|
|
2202
|
+
const degitCommand = shellQuote2.quote(["npx", "degit", degitRepo, targetPath]);
|
|
2203
|
+
await exec2(degitCommand, {
|
|
2204
|
+
cwd: process.cwd()
|
|
2205
|
+
});
|
|
2206
|
+
} catch {
|
|
2207
|
+
try {
|
|
2208
|
+
const gitCommand = shellQuote2.quote(["git", "clone", repoUrl, targetPath]);
|
|
2209
|
+
await exec2(gitCommand, {
|
|
2210
|
+
cwd: process.cwd()
|
|
2211
|
+
});
|
|
2212
|
+
const gitDir = path.join(targetPath, ".git");
|
|
2213
|
+
if (await directoryExists(gitDir)) {
|
|
2214
|
+
await fs4.rm(gitDir, { recursive: true, force: true });
|
|
2215
|
+
}
|
|
2216
|
+
} catch (gitError) {
|
|
2217
|
+
throw new Error(`Failed to clone repository: ${gitError instanceof Error ? gitError.message : "Unknown error"}`);
|
|
2218
|
+
}
|
|
2219
|
+
}
|
|
2220
|
+
}
|
|
2221
|
+
async function updatePackageJson(projectPath, projectName) {
|
|
2222
|
+
const packageJsonPath = path.join(projectPath, "package.json");
|
|
2223
|
+
try {
|
|
2224
|
+
const packageJsonContent = await fs4.readFile(packageJsonPath, "utf-8");
|
|
2225
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2226
|
+
packageJson.name = projectName;
|
|
2227
|
+
await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), "utf-8");
|
|
2228
|
+
} catch (error) {
|
|
2229
|
+
logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2230
|
+
}
|
|
2231
|
+
}
|
|
2232
|
+
async function installDependencies(projectPath, packageManager) {
|
|
2233
|
+
const spinner4 = yoctoSpinner({ text: "Installing dependencies..." }).start();
|
|
2234
|
+
try {
|
|
2235
|
+
const pm = packageManager || getPackageManager();
|
|
2236
|
+
const installCommand = shellQuote2.quote([pm, "install"]);
|
|
2237
|
+
await exec2(installCommand, {
|
|
2238
|
+
cwd: projectPath
|
|
2239
|
+
});
|
|
2240
|
+
spinner4.success("Dependencies installed successfully");
|
|
2241
|
+
} catch (error) {
|
|
2242
|
+
spinner4.error(`Failed to install dependencies: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2243
|
+
throw error;
|
|
2244
|
+
}
|
|
2245
|
+
}
|
|
2246
|
+
var TEMPLATES_API_URL = process.env.MASTRA_TEMPLATES_API_URL || "https://mastra.ai/api/templates.json";
|
|
2247
|
+
async function loadTemplates() {
|
|
2248
|
+
try {
|
|
2249
|
+
const response = await fetch(TEMPLATES_API_URL);
|
|
2250
|
+
if (!response.ok) {
|
|
2251
|
+
throw new Error(`Failed to fetch templates: ${response.statusText}`);
|
|
2252
|
+
}
|
|
2253
|
+
const templates = await response.json();
|
|
2254
|
+
return templates;
|
|
2255
|
+
} catch (error) {
|
|
2256
|
+
console.error("Error loading templates:", error);
|
|
2257
|
+
throw new Error("Failed to load templates. Please check your internet connection and try again.");
|
|
2258
|
+
}
|
|
2259
|
+
}
|
|
2260
|
+
function pluralize(count, singular, plural) {
|
|
2261
|
+
return count === 1 ? singular : plural || `${singular}s`;
|
|
2262
|
+
}
|
|
2263
|
+
async function selectTemplate(templates) {
|
|
2264
|
+
const choices = templates.map((template) => {
|
|
2265
|
+
const parts = [];
|
|
2266
|
+
if (template.agents?.length) {
|
|
2267
|
+
parts.push(`${template.agents.length} ${pluralize(template.agents.length, "agent")}`);
|
|
2268
|
+
}
|
|
2269
|
+
if (template.tools?.length) {
|
|
2270
|
+
parts.push(`${template.tools.length} ${pluralize(template.tools.length, "tool")}`);
|
|
2271
|
+
}
|
|
2272
|
+
if (template.workflows?.length) {
|
|
2273
|
+
parts.push(`${template.workflows.length} ${pluralize(template.workflows.length, "workflow")}`);
|
|
2274
|
+
}
|
|
2275
|
+
if (template.mcp?.length) {
|
|
2276
|
+
parts.push(`${template.mcp.length} ${pluralize(template.mcp.length, "MCP server")}`);
|
|
2277
|
+
}
|
|
2278
|
+
if (template.networks?.length) {
|
|
2279
|
+
parts.push(`${template.networks.length} ${pluralize(template.networks.length, "agent network")}`);
|
|
2280
|
+
}
|
|
2281
|
+
return {
|
|
2282
|
+
value: template,
|
|
2283
|
+
label: template.title,
|
|
2284
|
+
hint: parts.join(", ") || "Template components"
|
|
2285
|
+
};
|
|
2286
|
+
});
|
|
2287
|
+
const selected = await ve({
|
|
2288
|
+
message: "Select a template:",
|
|
2289
|
+
options: choices
|
|
2290
|
+
});
|
|
2291
|
+
if (pD(selected)) {
|
|
2292
|
+
return null;
|
|
2293
|
+
}
|
|
2294
|
+
return selected;
|
|
2295
|
+
}
|
|
2296
|
+
function findTemplateByName(templates, templateName) {
|
|
2297
|
+
let template = templates.find((t) => t.slug === templateName);
|
|
2298
|
+
if (template) return template;
|
|
2299
|
+
const slugWithPrefix = `template-${templateName}`;
|
|
2300
|
+
template = templates.find((t) => t.slug === slugWithPrefix);
|
|
2301
|
+
if (template) return template;
|
|
2302
|
+
template = templates.find((t) => t.title.toLowerCase() === templateName.toLowerCase());
|
|
2303
|
+
if (template) return template;
|
|
2304
|
+
return null;
|
|
2305
|
+
}
|
|
2306
|
+
function getDefaultProjectName(template) {
|
|
2307
|
+
return template.slug.replace(/^template-/, "");
|
|
2308
|
+
}
|
|
2309
|
+
var s = Y();
|
|
1655
2310
|
var init = async ({
|
|
1656
|
-
directory,
|
|
1657
|
-
addExample = false,
|
|
2311
|
+
directory = "src/",
|
|
1658
2312
|
components,
|
|
1659
2313
|
llmProvider = "openai",
|
|
1660
2314
|
llmApiKey,
|
|
2315
|
+
addExample = false,
|
|
1661
2316
|
configureEditorWithDocsMCP
|
|
1662
2317
|
}) => {
|
|
1663
2318
|
s.start("Initializing Mastra");
|
|
@@ -1673,7 +2328,8 @@ var init = async ({
|
|
|
1673
2328
|
dirPath,
|
|
1674
2329
|
addExample,
|
|
1675
2330
|
addWorkflow: components.includes("workflows"),
|
|
1676
|
-
addAgent: components.includes("agents")
|
|
2331
|
+
addAgent: components.includes("agents"),
|
|
2332
|
+
addScorers: components.includes("scorers")
|
|
1677
2333
|
}),
|
|
1678
2334
|
...components.map((component) => createComponentsDir(dirPath, component)),
|
|
1679
2335
|
writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
|
|
@@ -1684,13 +2340,25 @@ var init = async ({
|
|
|
1684
2340
|
(component) => writeCodeSample(dirPath, component, llmProvider, components)
|
|
1685
2341
|
)
|
|
1686
2342
|
]);
|
|
2343
|
+
const depService = new DepsService();
|
|
2344
|
+
const needsLibsql = await depService.checkDependencies(["@mastra/libsql"]) !== `ok`;
|
|
2345
|
+
if (needsLibsql) {
|
|
2346
|
+
await depService.installPackages(["@mastra/libsql"]);
|
|
2347
|
+
}
|
|
2348
|
+
const needsMemory = components.includes(`agents`) && await depService.checkDependencies(["@mastra/memory"]) !== `ok`;
|
|
2349
|
+
if (needsMemory) {
|
|
2350
|
+
await depService.installPackages(["@mastra/memory"]);
|
|
2351
|
+
}
|
|
2352
|
+
const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
|
|
2353
|
+
if (needsLoggers) {
|
|
2354
|
+
await depService.installPackages(["@mastra/loggers"]);
|
|
2355
|
+
}
|
|
2356
|
+
const needsEvals = components.includes(`scorers`) && await depService.checkDependencies(["@mastra/evals"]) !== `ok`;
|
|
2357
|
+
if (needsEvals) {
|
|
2358
|
+
await depService.installPackages(["@mastra/evals"]);
|
|
2359
|
+
}
|
|
1687
2360
|
}
|
|
1688
2361
|
const key = await getAPIKey(llmProvider || "openai");
|
|
1689
|
-
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
1690
|
-
const depsService = new DepsService();
|
|
1691
|
-
const pm = depsService.packageManager;
|
|
1692
|
-
const installCommand = getPackageManagerInstallCommand(pm);
|
|
1693
|
-
await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
|
|
1694
2362
|
if (configureEditorWithDocsMCP) {
|
|
1695
2363
|
await installMastraDocsMCPServer({
|
|
1696
2364
|
editor: configureEditorWithDocsMCP,
|
|
@@ -1699,14 +2367,14 @@ var init = async ({
|
|
|
1699
2367
|
}
|
|
1700
2368
|
s.stop();
|
|
1701
2369
|
if (!llmApiKey) {
|
|
1702
|
-
|
|
2370
|
+
Me(`
|
|
1703
2371
|
${color2.green("Mastra initialized successfully!")}
|
|
1704
2372
|
|
|
1705
2373
|
Add your ${color2.cyan(key)} as an environment variable
|
|
1706
|
-
in your ${color2.cyan(".env
|
|
2374
|
+
in your ${color2.cyan(".env")} file
|
|
1707
2375
|
`);
|
|
1708
2376
|
} else {
|
|
1709
|
-
|
|
2377
|
+
Me(`
|
|
1710
2378
|
${color2.green("Mastra initialized successfully!")}
|
|
1711
2379
|
`);
|
|
1712
2380
|
}
|
|
@@ -1740,69 +2408,128 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
1740
2408
|
throw error;
|
|
1741
2409
|
}
|
|
1742
2410
|
} catch (error) {
|
|
1743
|
-
console.error(error);
|
|
1744
2411
|
throw error;
|
|
1745
2412
|
}
|
|
1746
2413
|
};
|
|
2414
|
+
async function getInitCommand(pm) {
|
|
2415
|
+
switch (pm) {
|
|
2416
|
+
case "npm":
|
|
2417
|
+
return "npm init -y";
|
|
2418
|
+
case "pnpm":
|
|
2419
|
+
return "pnpm init";
|
|
2420
|
+
case "yarn":
|
|
2421
|
+
return "yarn init -y";
|
|
2422
|
+
case "bun":
|
|
2423
|
+
return "bun init -y";
|
|
2424
|
+
default:
|
|
2425
|
+
return "npm init -y";
|
|
2426
|
+
}
|
|
2427
|
+
}
|
|
2428
|
+
async function initializePackageJson(pm) {
|
|
2429
|
+
const initCommand = await getInitCommand(pm);
|
|
2430
|
+
await exec3(initCommand);
|
|
2431
|
+
const packageJsonPath = path.join(process.cwd(), "package.json");
|
|
2432
|
+
const packageJson = JSON.parse(await fs4.readFile(packageJsonPath, "utf-8"));
|
|
2433
|
+
packageJson.type = "module";
|
|
2434
|
+
packageJson.engines = {
|
|
2435
|
+
...packageJson.engines,
|
|
2436
|
+
node: ">=22.13.0"
|
|
2437
|
+
};
|
|
2438
|
+
await fs4.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
2439
|
+
}
|
|
1747
2440
|
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
1748
|
-
let installCommand =
|
|
2441
|
+
let installCommand = getPackageManagerAddCommand(pm);
|
|
1749
2442
|
if (isDev) {
|
|
1750
|
-
installCommand = `${installCommand}
|
|
2443
|
+
installCommand = `${installCommand} -D`;
|
|
1751
2444
|
}
|
|
1752
2445
|
try {
|
|
1753
2446
|
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
1754
2447
|
} catch (err) {
|
|
1755
|
-
console.log("err", err);
|
|
1756
2448
|
if (versionTag === "@latest") {
|
|
1757
|
-
throw
|
|
2449
|
+
throw new Error(
|
|
2450
|
+
`Failed to install ${dependency}@latest: ${err instanceof Error ? err.message : "Unknown error"}`
|
|
2451
|
+
);
|
|
2452
|
+
}
|
|
2453
|
+
try {
|
|
2454
|
+
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
2455
|
+
} catch (fallbackErr) {
|
|
2456
|
+
throw new Error(
|
|
2457
|
+
`Failed to install ${dependency} (tried ${versionTag} and @latest): ${fallbackErr instanceof Error ? fallbackErr.message : "Unknown error"}`
|
|
2458
|
+
);
|
|
1758
2459
|
}
|
|
1759
|
-
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
1760
2460
|
}
|
|
1761
2461
|
}
|
|
1762
2462
|
var createMastraProject = async ({
|
|
1763
2463
|
projectName: name,
|
|
1764
2464
|
createVersionTag,
|
|
1765
|
-
timeout
|
|
2465
|
+
timeout,
|
|
2466
|
+
llmProvider,
|
|
2467
|
+
llmApiKey,
|
|
2468
|
+
needsInteractive
|
|
1766
2469
|
}) => {
|
|
1767
|
-
|
|
1768
|
-
const projectName = name ?? await
|
|
2470
|
+
Ie(color2.inverse(" Mastra Create "));
|
|
2471
|
+
const projectName = name ?? await he({
|
|
1769
2472
|
message: "What do you want to name your project?",
|
|
1770
2473
|
placeholder: "my-mastra-app",
|
|
1771
|
-
defaultValue: "my-mastra-app"
|
|
2474
|
+
defaultValue: "my-mastra-app",
|
|
2475
|
+
validate: (value) => {
|
|
2476
|
+
if (value.length === 0) return "Project name cannot be empty";
|
|
2477
|
+
if (fs3__default__default.existsSync(value)) {
|
|
2478
|
+
return `A directory named "${value}" already exists. Please choose a different name.`;
|
|
2479
|
+
}
|
|
2480
|
+
}
|
|
1772
2481
|
});
|
|
1773
|
-
if (
|
|
1774
|
-
|
|
2482
|
+
if (pD(projectName)) {
|
|
2483
|
+
xe("Operation cancelled");
|
|
1775
2484
|
process.exit(0);
|
|
1776
2485
|
}
|
|
1777
|
-
|
|
1778
|
-
|
|
2486
|
+
let result;
|
|
2487
|
+
if (needsInteractive) {
|
|
2488
|
+
result = await interactivePrompt({
|
|
2489
|
+
options: { showBanner: false },
|
|
2490
|
+
skip: { llmProvider: llmProvider !== void 0, llmApiKey: llmApiKey !== void 0 }
|
|
2491
|
+
});
|
|
2492
|
+
}
|
|
2493
|
+
const s2 = Y();
|
|
2494
|
+
const originalCwd = process.cwd();
|
|
2495
|
+
let projectPath = null;
|
|
1779
2496
|
try {
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
2497
|
+
s2.start("Creating project");
|
|
2498
|
+
try {
|
|
2499
|
+
await fs4.mkdir(projectName);
|
|
2500
|
+
projectPath = path.resolve(originalCwd, projectName);
|
|
2501
|
+
} catch (error) {
|
|
2502
|
+
if (error instanceof Error && "code" in error && error.code === "EEXIST") {
|
|
2503
|
+
s2.stop(`A directory named "${projectName}" already exists. Please choose a different name.`);
|
|
2504
|
+
process.exit(1);
|
|
2505
|
+
}
|
|
2506
|
+
throw new Error(
|
|
2507
|
+
`Failed to create project directory: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
1785
2508
|
);
|
|
1786
|
-
process.exit(1);
|
|
1787
2509
|
}
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
2510
|
+
process.chdir(projectName);
|
|
2511
|
+
const pm = getPackageManager();
|
|
2512
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
2513
|
+
s2.message("Initializing project structure");
|
|
2514
|
+
try {
|
|
2515
|
+
await initializePackageJson(pm);
|
|
2516
|
+
const depsService = new DepsService();
|
|
2517
|
+
await depsService.addScriptsToPackageJson({
|
|
2518
|
+
dev: "mastra dev",
|
|
2519
|
+
build: "mastra build",
|
|
2520
|
+
start: "mastra start"
|
|
2521
|
+
});
|
|
2522
|
+
} catch (error) {
|
|
2523
|
+
throw new Error(
|
|
2524
|
+
`Failed to initialize project structure: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2525
|
+
);
|
|
2526
|
+
}
|
|
2527
|
+
s2.stop("Project structure created");
|
|
2528
|
+
s2.start(`Installing ${pm} dependencies`);
|
|
2529
|
+
try {
|
|
2530
|
+
await exec3(`${pm} ${installCommand} zod@^4`);
|
|
2531
|
+
await exec3(`${pm} ${installCommand} typescript @types/node --save-dev`);
|
|
2532
|
+
await exec3(`echo '{
|
|
1806
2533
|
"compilerOptions": {
|
|
1807
2534
|
"target": "ES2022",
|
|
1808
2535
|
"module": "ES2022",
|
|
@@ -1818,40 +2545,86 @@ var createMastraProject = async ({
|
|
|
1818
2545
|
"src/**/*"
|
|
1819
2546
|
]
|
|
1820
2547
|
}' > tsconfig.json`);
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
2548
|
+
} catch (error) {
|
|
2549
|
+
throw new Error(
|
|
2550
|
+
`Failed to install basic dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2551
|
+
);
|
|
2552
|
+
}
|
|
2553
|
+
s2.stop(`${pm} dependencies installed`);
|
|
2554
|
+
s2.start("Installing Mastra CLI");
|
|
2555
|
+
const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
|
|
2556
|
+
try {
|
|
2557
|
+
await installMastraDependency(pm, "mastra", versionTag, true, timeout);
|
|
2558
|
+
} catch (error) {
|
|
2559
|
+
throw new Error(`Failed to install Mastra CLI: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2560
|
+
}
|
|
2561
|
+
s2.stop("Mastra CLI installed");
|
|
2562
|
+
s2.start("Installing Mastra dependencies");
|
|
2563
|
+
try {
|
|
2564
|
+
await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
|
|
2565
|
+
await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
|
|
2566
|
+
await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
|
|
2567
|
+
} catch (error) {
|
|
2568
|
+
throw new Error(
|
|
2569
|
+
`Failed to install Mastra dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2570
|
+
);
|
|
2571
|
+
}
|
|
2572
|
+
s2.stop("Mastra dependencies installed");
|
|
2573
|
+
s2.start("Adding .gitignore");
|
|
2574
|
+
try {
|
|
2575
|
+
await exec3(`echo output.txt >> .gitignore`);
|
|
2576
|
+
await exec3(`echo node_modules >> .gitignore`);
|
|
2577
|
+
await exec3(`echo dist >> .gitignore`);
|
|
2578
|
+
await exec3(`echo .mastra >> .gitignore`);
|
|
2579
|
+
await exec3(`echo .env.development >> .gitignore`);
|
|
2580
|
+
await exec3(`echo .env >> .gitignore`);
|
|
2581
|
+
await exec3(`echo *.db >> .gitignore`);
|
|
2582
|
+
await exec3(`echo *.db-* >> .gitignore`);
|
|
2583
|
+
} catch (error) {
|
|
2584
|
+
throw new Error(`Failed to create .gitignore: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2585
|
+
}
|
|
2586
|
+
s2.stop(".gitignore added");
|
|
2587
|
+
Se("Project created successfully");
|
|
2588
|
+
console.info("");
|
|
2589
|
+
return { projectName, result };
|
|
2590
|
+
} catch (error) {
|
|
2591
|
+
s2.stop();
|
|
2592
|
+
const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred";
|
|
2593
|
+
xe(`Project creation failed: ${errorMessage}`);
|
|
2594
|
+
if (projectPath && fs3__default__default.existsSync(projectPath)) {
|
|
2595
|
+
try {
|
|
2596
|
+
process.chdir(originalCwd);
|
|
2597
|
+
await fs4.rm(projectPath, { recursive: true, force: true });
|
|
2598
|
+
} catch (cleanupError) {
|
|
2599
|
+
console.error(
|
|
2600
|
+
`Warning: Failed to clean up project directory: ${cleanupError instanceof Error ? cleanupError.message : "Unknown error"}`
|
|
2601
|
+
);
|
|
2602
|
+
}
|
|
2603
|
+
}
|
|
2604
|
+
process.exit(1);
|
|
2605
|
+
}
|
|
1842
2606
|
};
|
|
1843
2607
|
var create = async (args2) => {
|
|
1844
|
-
|
|
2608
|
+
if (args2.template !== void 0) {
|
|
2609
|
+
await createFromTemplate({ ...args2, injectedAnalytics: args2.analytics });
|
|
2610
|
+
return;
|
|
2611
|
+
}
|
|
2612
|
+
const needsInteractive = args2.components === void 0 || args2.llmProvider === void 0 || args2.addExample === void 0;
|
|
2613
|
+
const { projectName, result } = await createMastraProject({
|
|
1845
2614
|
projectName: args2?.projectName,
|
|
1846
2615
|
createVersionTag: args2?.createVersionTag,
|
|
1847
|
-
timeout: args2?.timeout
|
|
2616
|
+
timeout: args2?.timeout,
|
|
2617
|
+
llmProvider: args2?.llmProvider,
|
|
2618
|
+
llmApiKey: args2?.llmApiKey,
|
|
2619
|
+
needsInteractive
|
|
1848
2620
|
});
|
|
1849
|
-
const directory = "/
|
|
1850
|
-
if (
|
|
1851
|
-
const result = await interactivePrompt();
|
|
2621
|
+
const directory = args2.directory || "src/";
|
|
2622
|
+
if (needsInteractive && result) {
|
|
1852
2623
|
await init({
|
|
1853
2624
|
...result,
|
|
1854
|
-
llmApiKey: result?.llmApiKey
|
|
2625
|
+
llmApiKey: result?.llmApiKey,
|
|
2626
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
2627
|
+
addExample: true
|
|
1855
2628
|
});
|
|
1856
2629
|
postCreate({ projectName });
|
|
1857
2630
|
return;
|
|
@@ -1862,32 +2635,200 @@ var create = async (args2) => {
|
|
|
1862
2635
|
components,
|
|
1863
2636
|
llmProvider,
|
|
1864
2637
|
addExample,
|
|
1865
|
-
llmApiKey
|
|
2638
|
+
llmApiKey,
|
|
2639
|
+
configureEditorWithDocsMCP: args2.mcpServer
|
|
1866
2640
|
});
|
|
1867
2641
|
postCreate({ projectName });
|
|
1868
2642
|
};
|
|
1869
2643
|
var postCreate = ({ projectName }) => {
|
|
1870
|
-
|
|
2644
|
+
const packageManager = getPackageManager();
|
|
2645
|
+
Se(`
|
|
1871
2646
|
${color2.green("To start your project:")}
|
|
1872
2647
|
|
|
1873
2648
|
${color2.cyan("cd")} ${projectName}
|
|
1874
|
-
${color2.cyan(
|
|
2649
|
+
${color2.cyan(`${packageManager} run dev`)}
|
|
1875
2650
|
`);
|
|
1876
2651
|
};
|
|
2652
|
+
function isGitHubUrl(url) {
|
|
2653
|
+
try {
|
|
2654
|
+
const parsedUrl = new URL(url);
|
|
2655
|
+
return parsedUrl.hostname === "github.com" && parsedUrl.pathname.split("/").length >= 3;
|
|
2656
|
+
} catch {
|
|
2657
|
+
return false;
|
|
2658
|
+
}
|
|
2659
|
+
}
|
|
2660
|
+
async function validateGitHubProject(githubUrl) {
|
|
2661
|
+
const errors = [];
|
|
2662
|
+
try {
|
|
2663
|
+
const urlParts = new URL(githubUrl).pathname.split("/").filter(Boolean);
|
|
2664
|
+
const owner = urlParts[0];
|
|
2665
|
+
const repo = urlParts[1]?.replace(".git", "");
|
|
2666
|
+
if (!owner || !repo) {
|
|
2667
|
+
throw new Error("Invalid GitHub URL format");
|
|
2668
|
+
}
|
|
2669
|
+
const branches = ["main", "master"];
|
|
2670
|
+
let packageJsonContent = null;
|
|
2671
|
+
let indexContent = null;
|
|
2672
|
+
for (const branch of branches) {
|
|
2673
|
+
try {
|
|
2674
|
+
const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/package.json`;
|
|
2675
|
+
const packageJsonResponse = await fetch(packageJsonUrl);
|
|
2676
|
+
if (packageJsonResponse.ok) {
|
|
2677
|
+
packageJsonContent = await packageJsonResponse.text();
|
|
2678
|
+
const indexUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/src/mastra/index.ts`;
|
|
2679
|
+
const indexResponse = await fetch(indexUrl);
|
|
2680
|
+
if (indexResponse.ok) {
|
|
2681
|
+
indexContent = await indexResponse.text();
|
|
2682
|
+
}
|
|
2683
|
+
break;
|
|
2684
|
+
}
|
|
2685
|
+
} catch {
|
|
2686
|
+
}
|
|
2687
|
+
}
|
|
2688
|
+
if (!packageJsonContent) {
|
|
2689
|
+
errors.push("Could not fetch package.json from repository");
|
|
2690
|
+
return { isValid: false, errors };
|
|
2691
|
+
}
|
|
2692
|
+
try {
|
|
2693
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2694
|
+
const hasMastraCore = packageJson.dependencies?.["@mastra/core"] || packageJson.devDependencies?.["@mastra/core"] || packageJson.peerDependencies?.["@mastra/core"];
|
|
2695
|
+
if (!hasMastraCore) {
|
|
2696
|
+
errors.push("Missing @mastra/core dependency in package.json");
|
|
2697
|
+
}
|
|
2698
|
+
} catch {
|
|
2699
|
+
errors.push("Invalid package.json format");
|
|
2700
|
+
}
|
|
2701
|
+
if (!indexContent) {
|
|
2702
|
+
errors.push("Missing src/mastra/index.ts file");
|
|
2703
|
+
} else {
|
|
2704
|
+
const hasMastraExport = indexContent.includes("export") && (indexContent.includes("new Mastra") || indexContent.includes("Mastra("));
|
|
2705
|
+
if (!hasMastraExport) {
|
|
2706
|
+
errors.push("src/mastra/index.ts does not export a Mastra instance");
|
|
2707
|
+
}
|
|
2708
|
+
}
|
|
2709
|
+
return { isValid: errors.length === 0, errors };
|
|
2710
|
+
} catch (error) {
|
|
2711
|
+
errors.push(`Failed to validate GitHub repository: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2712
|
+
return { isValid: false, errors };
|
|
2713
|
+
}
|
|
2714
|
+
}
|
|
2715
|
+
async function createFromGitHubUrl(url) {
|
|
2716
|
+
const urlParts = new URL(url).pathname.split("/").filter(Boolean);
|
|
2717
|
+
const owner = urlParts[0] || "unknown";
|
|
2718
|
+
const repo = urlParts[1] || "unknown";
|
|
2719
|
+
return {
|
|
2720
|
+
githubUrl: url,
|
|
2721
|
+
title: `${owner}/${repo}`,
|
|
2722
|
+
slug: repo,
|
|
2723
|
+
agents: [],
|
|
2724
|
+
mcp: [],
|
|
2725
|
+
tools: [],
|
|
2726
|
+
networks: [],
|
|
2727
|
+
workflows: []
|
|
2728
|
+
};
|
|
2729
|
+
}
|
|
2730
|
+
async function createFromTemplate(args2) {
|
|
2731
|
+
let selectedTemplate;
|
|
2732
|
+
if (args2.template === true) {
|
|
2733
|
+
const templates = await loadTemplates();
|
|
2734
|
+
const selected = await selectTemplate(templates);
|
|
2735
|
+
if (!selected) {
|
|
2736
|
+
M.info("No template selected. Exiting.");
|
|
2737
|
+
return;
|
|
2738
|
+
}
|
|
2739
|
+
selectedTemplate = selected;
|
|
2740
|
+
} else if (args2.template && typeof args2.template === "string") {
|
|
2741
|
+
if (isGitHubUrl(args2.template)) {
|
|
2742
|
+
const spinner4 = Y();
|
|
2743
|
+
spinner4.start("Validating GitHub repository...");
|
|
2744
|
+
const validation = await validateGitHubProject(args2.template);
|
|
2745
|
+
if (!validation.isValid) {
|
|
2746
|
+
spinner4.stop("Validation failed");
|
|
2747
|
+
M.error("This does not appear to be a valid Mastra project:");
|
|
2748
|
+
validation.errors.forEach((error) => M.error(` - ${error}`));
|
|
2749
|
+
throw new Error("Invalid Mastra project");
|
|
2750
|
+
}
|
|
2751
|
+
spinner4.stop("Valid Mastra project \u2713");
|
|
2752
|
+
selectedTemplate = await createFromGitHubUrl(args2.template);
|
|
2753
|
+
} else {
|
|
2754
|
+
const templates = await loadTemplates();
|
|
2755
|
+
const found = findTemplateByName(templates, args2.template);
|
|
2756
|
+
if (!found) {
|
|
2757
|
+
M.error(`Template "${args2.template}" not found. Available templates:`);
|
|
2758
|
+
templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
|
|
2759
|
+
throw new Error(`Template "${args2.template}" not found`);
|
|
2760
|
+
}
|
|
2761
|
+
selectedTemplate = found;
|
|
2762
|
+
}
|
|
2763
|
+
}
|
|
2764
|
+
if (!selectedTemplate) {
|
|
2765
|
+
throw new Error("No template selected");
|
|
2766
|
+
}
|
|
2767
|
+
let projectName = args2.projectName;
|
|
2768
|
+
if (!projectName) {
|
|
2769
|
+
const defaultName = getDefaultProjectName(selectedTemplate);
|
|
2770
|
+
const response = await he({
|
|
2771
|
+
message: "What is your project name?",
|
|
2772
|
+
defaultValue: defaultName,
|
|
2773
|
+
placeholder: defaultName
|
|
2774
|
+
});
|
|
2775
|
+
if (pD(response)) {
|
|
2776
|
+
M.info("Project creation cancelled.");
|
|
2777
|
+
return;
|
|
2778
|
+
}
|
|
2779
|
+
projectName = response;
|
|
2780
|
+
}
|
|
2781
|
+
let projectPath = null;
|
|
2782
|
+
try {
|
|
2783
|
+
const analytics = args2.injectedAnalytics || getAnalytics();
|
|
2784
|
+
if (analytics) {
|
|
2785
|
+
analytics.trackEvent("cli_template_used", {
|
|
2786
|
+
template_slug: selectedTemplate.slug,
|
|
2787
|
+
template_title: selectedTemplate.title
|
|
2788
|
+
});
|
|
2789
|
+
}
|
|
2790
|
+
projectPath = await cloneTemplate({
|
|
2791
|
+
template: selectedTemplate,
|
|
2792
|
+
projectName
|
|
2793
|
+
});
|
|
2794
|
+
await installDependencies(projectPath);
|
|
2795
|
+
Me(`
|
|
2796
|
+
${color2.green("Mastra template installed!")}
|
|
2797
|
+
|
|
2798
|
+
Add the necessary environment
|
|
2799
|
+
variables in your ${color2.cyan(".env")} file
|
|
2800
|
+
`);
|
|
2801
|
+
postCreate({ projectName });
|
|
2802
|
+
} catch (error) {
|
|
2803
|
+
if (projectPath) {
|
|
2804
|
+
try {
|
|
2805
|
+
if (fs3__default__default.existsSync(projectPath)) {
|
|
2806
|
+
await fs4.rm(projectPath, { recursive: true, force: true });
|
|
2807
|
+
}
|
|
2808
|
+
} catch (cleanupError) {
|
|
2809
|
+
console.error(
|
|
2810
|
+
`Warning: Failed to clean up project directory: ${cleanupError instanceof Error ? cleanupError.message : "Unknown error"}`
|
|
2811
|
+
);
|
|
2812
|
+
}
|
|
2813
|
+
}
|
|
2814
|
+
M.error(`Failed to create project from template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2815
|
+
throw error;
|
|
2816
|
+
}
|
|
2817
|
+
}
|
|
1877
2818
|
|
|
1878
2819
|
async function getPackageVersion() {
|
|
1879
2820
|
const __filename = fileURLToPath(import.meta.url);
|
|
1880
2821
|
const __dirname = dirname(__filename);
|
|
1881
2822
|
const pkgJsonPath = path.join(__dirname, "..", "package.json");
|
|
1882
|
-
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
2823
|
+
const content = await fsExtra$1.readJSON(pkgJsonPath);
|
|
1883
2824
|
return content.version;
|
|
1884
2825
|
}
|
|
1885
2826
|
async function getCreateVersionTag() {
|
|
1886
2827
|
try {
|
|
1887
2828
|
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
1888
|
-
const json = await fsExtra.readJSON(pkgPath);
|
|
2829
|
+
const json = await fsExtra$1.readJSON(pkgPath);
|
|
1889
2830
|
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
1890
|
-
const tagLine = stdout.split("\n").find((distLine) => distLine.
|
|
2831
|
+
const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
|
|
1891
2832
|
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
1892
2833
|
return tag;
|
|
1893
2834
|
} catch {
|
|
@@ -1909,19 +2850,30 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
1909
2850
|
analytics.trackCommand({
|
|
1910
2851
|
command: "version"
|
|
1911
2852
|
});
|
|
1912
|
-
console.
|
|
2853
|
+
console.info(`create-mastra ${version}`);
|
|
1913
2854
|
} catch {
|
|
1914
2855
|
}
|
|
1915
2856
|
});
|
|
1916
|
-
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
2857
|
+
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
2858
|
+
"-p, --project-name <string>",
|
|
2859
|
+
"Project name that will be used in package.json and as the project directory name."
|
|
2860
|
+
).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(
|
|
2861
|
+
"--template [template-name]",
|
|
2862
|
+
"Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
|
|
2863
|
+
).action(async (projectNameArg, args) => {
|
|
2864
|
+
const projectName = projectNameArg || args.projectName;
|
|
1917
2865
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
1918
2866
|
if (args.default) {
|
|
1919
2867
|
await create({
|
|
1920
|
-
components: ["agents", "tools", "workflows"],
|
|
2868
|
+
components: ["agents", "tools", "workflows", "scorers"],
|
|
1921
2869
|
llmProvider: "openai",
|
|
1922
|
-
addExample:
|
|
2870
|
+
addExample: true,
|
|
1923
2871
|
createVersionTag,
|
|
1924
|
-
timeout
|
|
2872
|
+
timeout,
|
|
2873
|
+
mcpServer: args.mcp,
|
|
2874
|
+
directory: "src/",
|
|
2875
|
+
template: args.template,
|
|
2876
|
+
analytics
|
|
1925
2877
|
});
|
|
1926
2878
|
return;
|
|
1927
2879
|
}
|
|
@@ -1929,10 +2881,14 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
1929
2881
|
components: args.components ? args.components.split(",") : [],
|
|
1930
2882
|
llmProvider: args.llm,
|
|
1931
2883
|
addExample: args.example,
|
|
1932
|
-
llmApiKey: args
|
|
2884
|
+
llmApiKey: args.llmApiKey,
|
|
1933
2885
|
createVersionTag,
|
|
1934
2886
|
timeout,
|
|
1935
|
-
projectName
|
|
2887
|
+
projectName,
|
|
2888
|
+
directory: args.dir,
|
|
2889
|
+
mcpServer: args.mcp,
|
|
2890
|
+
template: args.template,
|
|
2891
|
+
analytics
|
|
1936
2892
|
});
|
|
1937
2893
|
});
|
|
1938
2894
|
program.parse(process.argv);
|