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