create-mastra 0.0.0-redis-cloud-transporter-20250508203756 → 0.0.0-remove-unused-import-20250909212718
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 +1661 -0
- package/LICENSE.md +11 -42
- package/README.md +2 -8
- package/dist/index.js +1203 -503
- package/dist/index.js.map +1 -1
- package/dist/templates/dev.entry.js +7 -7
- package/dist/templates/scorers/answer-relevancy-scorer.ts +15 -0
- package/dist/templates/scorers/bias-detection-scorer.ts +16 -0
- package/dist/templates/scorers/completeness-scorer.ts +16 -0
- package/dist/templates/scorers/content-similarity-scorer.ts +15 -0
- package/dist/templates/scorers/faithfulness-scorer.ts +21 -0
- package/dist/templates/scorers/hallucination-scorer.ts +21 -0
- package/dist/templates/scorers/keyword-coverage-scorer.ts +15 -0
- package/dist/templates/scorers/textual-difference-scorer.ts +16 -0
- package/dist/templates/scorers/tone-consistency-scorer.ts +16 -0
- package/dist/templates/scorers/toxicity-detection-scorer.ts +16 -0
- package/package.json +28 -20
- package/dist/starter-files/config.ts +0 -25
- package/dist/starter-files/mastra-pg.docker-compose.yaml +0 -15
package/dist/index.js
CHANGED
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
#! /usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
|
-
import * as
|
|
5
|
-
import
|
|
4
|
+
import * as fs4__default from 'node:fs';
|
|
5
|
+
import fs4__default__default, { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
6
6
|
import os from 'node:os';
|
|
7
|
-
import
|
|
7
|
+
import path3, { dirname } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { PostHog } from 'posthog-node';
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
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';
|
|
15
|
+
import fs from 'node:fs/promises';
|
|
14
16
|
import child_process from 'node:child_process';
|
|
15
|
-
import
|
|
16
|
-
import fs4 from 'node:fs/promises';
|
|
17
|
-
import { execa } from 'execa';
|
|
18
|
-
import fsExtra3, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
19
|
-
import prettier from 'prettier';
|
|
20
|
-
import { Transform } from 'node:stream';
|
|
17
|
+
import tty from 'node:tty';
|
|
21
18
|
import pino from 'pino';
|
|
22
19
|
import pretty from 'pino-pretty';
|
|
20
|
+
import { execa } from 'execa';
|
|
21
|
+
import fsExtra2, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
22
|
+
import prettier from 'prettier';
|
|
23
23
|
import fsExtra from 'fs-extra';
|
|
24
24
|
|
|
25
25
|
var __filename = fileURLToPath(import.meta.url);
|
|
26
|
-
var __dirname =
|
|
26
|
+
var __dirname = path3.dirname(__filename);
|
|
27
|
+
var analyticsInstance = null;
|
|
28
|
+
function getAnalytics() {
|
|
29
|
+
return analyticsInstance;
|
|
30
|
+
}
|
|
27
31
|
var PosthogAnalytics = class {
|
|
28
32
|
sessionId;
|
|
29
33
|
client;
|
|
@@ -35,7 +39,7 @@ var PosthogAnalytics = class {
|
|
|
35
39
|
host = "https://app.posthog.com"
|
|
36
40
|
}) {
|
|
37
41
|
this.version = version;
|
|
38
|
-
const cliConfigPath =
|
|
42
|
+
const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
|
|
39
43
|
if (existsSync(cliConfigPath)) {
|
|
40
44
|
try {
|
|
41
45
|
const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
|
|
@@ -63,7 +67,7 @@ var PosthogAnalytics = class {
|
|
|
63
67
|
}
|
|
64
68
|
writeCliConfig({ distinctId, sessionId }) {
|
|
65
69
|
try {
|
|
66
|
-
writeFileSync(
|
|
70
|
+
writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
67
71
|
} catch {
|
|
68
72
|
}
|
|
69
73
|
}
|
|
@@ -113,6 +117,22 @@ var PosthogAnalytics = class {
|
|
|
113
117
|
}
|
|
114
118
|
});
|
|
115
119
|
}
|
|
120
|
+
trackEvent(eventName, properties) {
|
|
121
|
+
try {
|
|
122
|
+
if (!this.client) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.client.capture({
|
|
126
|
+
distinctId: this.distinctId,
|
|
127
|
+
event: eventName,
|
|
128
|
+
properties: {
|
|
129
|
+
...this.getSystemProperties(),
|
|
130
|
+
...properties
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
} catch {
|
|
134
|
+
}
|
|
135
|
+
}
|
|
116
136
|
trackCommand(options) {
|
|
117
137
|
try {
|
|
118
138
|
if (!this.client) {
|
|
@@ -349,72 +369,335 @@ function requirePicocolors () {
|
|
|
349
369
|
var picocolorsExports = /*@__PURE__*/ requirePicocolors();
|
|
350
370
|
var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
|
|
351
371
|
|
|
352
|
-
function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(F,e?void 0:"g")}const J=q();function S(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(J,"")}function T$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var j$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(t){var s=t.charCodeAt(0),C=t.length==2?t.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=C&&C<=57343&&(s&=1023,C&=1023,D=s<<10|C,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(t){var s=this.eastAsianWidth(t);return s=="F"||s=="W"||s=="A"?2:1};function F(t){return t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(t){for(var s=F(t),C=0,D=0;D<s.length;D++)C=C+this.characterLength(s[D]);return C},u.slice=function(t,s,C){textLen=u.length(t),s=s||0,C=C||1,s<0&&(s=textLen+s),C<0&&(C=textLen+C);for(var D="",i=0,n=F(t),E=0;E<n.length;E++){var h=n[E],o=u.length(h);if(i>=s-(o==2?1:0))if(i+o<=C)D+=h;else break;i+=o;}return D};})(j$1);var Q$1=j$1.exports;const X=T$1(Q$1);var DD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const uD=T$1(DD);function A(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=S(e),e.length===0))return 0;e=e.replace(uD()," ");const F=u.ambiguousIsNarrow?1:2;let t=0;for(const s of e){const C=s.codePointAt(0);if(C<=31||C>=127&&C<=159||C>=768&&C<=879)continue;switch(X.eastAsianWidth(s)){case "F":case "W":t+=2;break;case "A":t+=F;break;default:t+=1;}}return t}const d=10,M$1=(e=0)=>u=>`\x1B[${u+e}m`,P$1=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,W=(e=0)=>(u,F,t)=>`\x1B[${38+e};2;${u};${F};${t}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const FD=Object.keys(r.color),eD=Object.keys(r.bgColor);[...FD,...eD];function tD(){const e=new Map;for(const[u,F]of Object.entries(r)){for(const[t,s]of Object.entries(F))r[t]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},F[t]=r[t],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:F,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=M$1(),r.color.ansi256=P$1(),r.color.ansi16m=W(),r.bgColor.ansi=M$1(d),r.bgColor.ansi256=P$1(d),r.bgColor.ansi16m=W(d),Object.defineProperties(r,{rgbToAnsi256:{value:(u,F,t)=>u===F&&F===t?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(F/255*5)+Math.round(t/255*5),enumerable:false},hexToRgb:{value:u=>{const F=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!F)return [0,0,0];let[t]=F;t.length===3&&(t=[...t].map(C=>C+C).join(""));const s=Number.parseInt(t,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let F,t,s;if(u>=232)F=((u-232)*10+8)/255,t=F,s=F;else {u-=16;const i=u%36;F=Math.floor(u/36)/5,t=Math.floor(i/6)/5,s=i%6/5;}const C=Math.max(F,t,s)*2;if(C===0)return 30;let D=30+(Math.round(s)<<2|Math.round(t)<<1|Math.round(F));return C===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,F,t)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,F,t)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const sD=tD(),g=new Set(["\x1B","\x9B"]),CD=39,b$1="\x07",O="[",iD="]",I$1="m",w=`${iD}8;;`,N=e=>`${g.values().next().value}${O}${e}${I$1}`,L=e=>`${g.values().next().value}${w}${e}${b$1}`,rD=e=>e.split(" ").map(u=>A(u)),y$1=(e,u,F)=>{const t=[...u];let s=false,C=false,D=A(S(e[e.length-1]));for(const[i,n]of t.entries()){const E=A(n);if(D+E<=F?e[e.length-1]+=n:(e.push(n),D=0),g.has(n)&&(s=true,C=t.slice(i+1).join("").startsWith(w)),s){C?n===b$1&&(s=false,C=false):n===I$1&&(s=false);continue}D+=E,D===F&&i<t.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},ED=e=>{const u=e.split(" ");let F=u.length;for(;F>0&&!(A(u[F-1])>0);)F--;return F===u.length?e:u.slice(0,F).join(" ")+u.slice(F).join("")},oD=(e,u,F={})=>{if(F.trim!==false&&e.trim()==="")return "";let t="",s,C;const D=rD(e);let i=[""];for(const[E,h]of e.split(" ").entries()){F.trim!==false&&(i[i.length-1]=i[i.length-1].trimStart());let o=A(i[i.length-1]);if(E!==0&&(o>=u&&(F.wordWrap===false||F.trim===false)&&(i.push(""),o=0),(o>0||F.trim===false)&&(i[i.length-1]+=" ",o++)),F.hard&&D[E]>u){const B=u-o,p=1+Math.floor((D[E]-B-1)/u);Math.floor((D[E]-1)/u)<p&&i.push(""),y$1(i,h,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(F.wordWrap===false&&o<u){y$1(i,h,u);continue}i.push("");}if(o+D[E]>u&&F.wordWrap===false){y$1(i,h,u);continue}i[i.length-1]+=h;}F.trim!==false&&(i=i.map(E=>ED(E)));const n=[...i.join(`
|
|
353
|
-
`)];for(const[E,
|
|
354
|
-
`?(
|
|
355
|
-
`&&(s&&o&&(
|
|
372
|
+
function DD({onlyFirst:e=false}={}){const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}const uD=DD();function P$1(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(uD,"")}function L$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var W$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(F){var s=F.charCodeAt(0),i=F.length==2?F.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=i&&i<=57343&&(s&=1023,i&=1023,D=s<<10|i,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(F){var s=this.eastAsianWidth(F);return s=="F"||s=="W"||s=="A"?2:1};function t(F){return F.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(F){for(var s=t(F),i=0,D=0;D<s.length;D++)i=i+this.characterLength(s[D]);return i},u.slice=function(F,s,i){textLen=u.length(F),s=s||0,i=i||1,s<0&&(s=textLen+s),i<0&&(i=textLen+i);for(var D="",C=0,n=t(F),E=0;E<n.length;E++){var a=n[E],o=u.length(a);if(C>=s-(o==2?1:0))if(C+o<=i)D+=a;else break;C+=o;}return D};})(W$1);var tD=W$1.exports;const eD=L$1(tD);var FD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const sD=L$1(FD);function p(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=P$1(e),e.length===0))return 0;e=e.replace(sD()," ");const t=u.ambiguousIsNarrow?1:2;let F=0;for(const s of e){const i=s.codePointAt(0);if(i<=31||i>=127&&i<=159||i>=768&&i<=879)continue;switch(eD.eastAsianWidth(s)){case "F":case "W":F+=2;break;case "A":F+=t;break;default:F+=1;}}return F}const w=10,N=(e=0)=>u=>`\x1B[${u+e}m`,I=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,R=(e=0)=>(u,t,F)=>`\x1B[${38+e};2;${u};${t};${F}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const iD=Object.keys(r.color),CD=Object.keys(r.bgColor);[...iD,...CD];function rD(){const e=new Map;for(const[u,t]of Object.entries(r)){for(const[F,s]of Object.entries(t))r[F]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},t[F]=r[F],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:t,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=N(),r.color.ansi256=I(),r.color.ansi16m=R(),r.bgColor.ansi=N(w),r.bgColor.ansi256=I(w),r.bgColor.ansi16m=R(w),Object.defineProperties(r,{rgbToAnsi256:{value:(u,t,F)=>u===t&&t===F?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(t/255*5)+Math.round(F/255*5),enumerable:false},hexToRgb:{value:u=>{const t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!t)return [0,0,0];let[F]=t;F.length===3&&(F=[...F].map(i=>i+i).join(""));const s=Number.parseInt(F,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let t,F,s;if(u>=232)t=((u-232)*10+8)/255,F=t,s=t;else {u-=16;const C=u%36;t=Math.floor(u/36)/5,F=Math.floor(C/6)/5,s=C%6/5;}const i=Math.max(t,F,s)*2;if(i===0)return 30;let D=30+(Math.round(s)<<2|Math.round(F)<<1|Math.round(t));return i===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,t,F)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,t,F)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const ED=rD(),d$1=new Set(["\x1B","\x9B"]),oD=39,y="\x07",V$1="[",nD="]",G$1="m",_$1=`${nD}8;;`,z=e=>`${d$1.values().next().value}${V$1}${e}${G$1}`,K$1=e=>`${d$1.values().next().value}${_$1}${e}${y}`,aD=e=>e.split(" ").map(u=>p(u)),k$1=(e,u,t)=>{const F=[...u];let s=false,i=false,D=p(P$1(e[e.length-1]));for(const[C,n]of F.entries()){const E=p(n);if(D+E<=t?e[e.length-1]+=n:(e.push(n),D=0),d$1.has(n)&&(s=true,i=F.slice(C+1).join("").startsWith(_$1)),s){i?n===y&&(s=false,i=false):n===G$1&&(s=false);continue}D+=E,D===t&&C<F.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},hD=e=>{const u=e.split(" ");let t=u.length;for(;t>0&&!(p(u[t-1])>0);)t--;return t===u.length?e:u.slice(0,t).join(" ")+u.slice(t).join("")},lD=(e,u,t={})=>{if(t.trim!==false&&e.trim()==="")return "";let F="",s,i;const D=aD(e);let C=[""];for(const[E,a]of e.split(" ").entries()){t.trim!==false&&(C[C.length-1]=C[C.length-1].trimStart());let o=p(C[C.length-1]);if(E!==0&&(o>=u&&(t.wordWrap===false||t.trim===false)&&(C.push(""),o=0),(o>0||t.trim===false)&&(C[C.length-1]+=" ",o++)),t.hard&&D[E]>u){const c=u-o,f=1+Math.floor((D[E]-c-1)/u);Math.floor((D[E]-1)/u)<f&&C.push(""),k$1(C,a,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(t.wordWrap===false&&o<u){k$1(C,a,u);continue}C.push("");}if(o+D[E]>u&&t.wordWrap===false){k$1(C,a,u);continue}C[C.length-1]+=a;}t.trim!==false&&(C=C.map(E=>hD(E)));const n=[...C.join(`
|
|
373
|
+
`)];for(const[E,a]of n.entries()){if(F+=a,d$1.has(a)){const{groups:c}=new RegExp(`(?:\\${V$1}(?<code>\\d+)m|\\${_$1}(?<uri>.*)${y})`).exec(n.slice(E).join(""))||{groups:{}};if(c.code!==void 0){const f=Number.parseFloat(c.code);s=f===oD?void 0:f;}else c.uri!==void 0&&(i=c.uri.length===0?void 0:c.uri);}const o=ED.codes.get(Number(s));n[E+1]===`
|
|
374
|
+
`?(i&&(F+=K$1("")),s&&o&&(F+=z(o))):a===`
|
|
375
|
+
`&&(s&&o&&(F+=z(s)),i&&(F+=K$1(i)));}return F};function Y$1(e,u,t){return String(e).normalize().replace(/\r\n/g,`
|
|
356
376
|
`).split(`
|
|
357
|
-
`).map(
|
|
358
|
-
`)}
|
|
359
|
-
`),
|
|
360
|
-
`),s=[];for(let
|
|
361
|
-
`),
|
|
362
|
-
`).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=
|
|
363
|
-
`);this.output.write(s[
|
|
364
|
-
`).slice(
|
|
365
|
-
`)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}
|
|
366
|
-
|
|
367
|
-
function
|
|
368
|
-
${
|
|
369
|
-
`,t
|
|
370
|
-
${color2.yellow(
|
|
371
|
-
${color2.yellow(
|
|
372
|
-
`;case "submit":return `${n}${color2.gray(
|
|
373
|
-
|
|
374
|
-
${color2.cyan(
|
|
375
|
-
`}}}).prompt(),
|
|
376
|
-
${
|
|
377
|
-
|
|
378
|
-
${color2.gray(
|
|
379
|
-
${color2.cyan(
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
${color2.gray(a)}`;default:return `${t}${color2.cyan(a)} ${E({cursor:this.cursor,options:this.options,maxItems:s.maxItems,style:(i,r)=>n(i,r?"active":"inactive")}).join(`
|
|
384
|
-
${color2.cyan(a)} `)}
|
|
385
|
-
${color2.cyan($)}
|
|
386
|
-
`}}}).prompt()},$e=s=>{const n=(t,i)=>{const r=t.label??String(t.value);return i==="active"?`${color2.cyan(j)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`:i==="selected"?`${color2.green(b)} ${color2.dim(r)}`:i==="cancelled"?`${color2.strikethrough(color2.dim(r))}`:i==="active-selected"?`${color2.green(b)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`:i==="submitted"?`${color2.dim(r)}`:`${color2.dim(B)} ${color2.dim(r)}`};return new vD({options:s.options,initialValues:s.initialValues,required:s.required??true,cursorAt:s.cursorAt,validate(t){if(this.required&&t.length===0)return `Please select at least one option.
|
|
387
|
-
${color2.reset(color2.dim(`Press ${color2.gray(color2.bgWhite(color2.inverse(" space ")))} to select, ${color2.gray(color2.bgWhite(color2.inverse(" enter ")))} to submit`))}`},render(){let t=`${color2.gray(a)}
|
|
388
|
-
${y(this.state)} ${s.message}
|
|
389
|
-
`;const i=(r,o)=>{const c=this.value.includes(r.value);return o&&c?n(r,"active-selected"):c?n(r,"selected"):n(r,o?"active":"inactive")};switch(this.state){case "submit":return `${t}${color2.gray(a)} ${this.options.filter(({value:r})=>this.value.includes(r)).map(r=>n(r,"submitted")).join(color2.dim(", "))||color2.dim("none")}`;case "cancel":{const r=this.options.filter(({value:o})=>this.value.includes(o)).map(o=>n(o,"cancelled")).join(color2.dim(", "));return `${t}${color2.gray(a)} ${r.trim()?`${r}
|
|
390
|
-
${color2.gray(a)}`:""}`}case "error":{const r=this.error.split(`
|
|
391
|
-
`).map((o,c)=>c===0?`${color2.yellow($)} ${color2.yellow(o)}`:` ${o}`).join(`
|
|
392
|
-
`);return t+color2.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
393
|
-
${color2.yellow(a)} `)+`
|
|
394
|
-
`+r+`
|
|
395
|
-
`}default:return `${t}${color2.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
396
|
-
${color2.cyan(a)} `)}
|
|
397
|
-
${color2.cyan($)}
|
|
398
|
-
`}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
|
|
399
|
-
${s}
|
|
377
|
+
`).map(F=>lD(F,u,t)).join(`
|
|
378
|
+
`)}const xD=["up","down","left","right","space","enter","cancel"],B={actions:new Set(xD),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]])};function $(e,u){if(typeof e=="string")return B.aliases.get(e)===u;for(const t of e)if(t!==void 0&&$(t,u))return true;return false}function BD(e,u){if(e===u)return;const t=e.split(`
|
|
379
|
+
`),F=u.split(`
|
|
380
|
+
`),s=[];for(let i=0;i<Math.max(t.length,F.length);i++)t[i]!==F[i]&&s.push(i);return s}const AD=globalThis.process.platform.startsWith("win"),S=Symbol("clack:cancel");function pD(e){return e===S}function m(e,u){const t=e;t.isTTY&&t.setRawMode(u);}function fD({input:e=stdin,output:u=stdout,overwrite:t=true,hideCursor:F=true}={}){const s=g.createInterface({input:e,output:u,prompt:"",tabSize:1});g.emitKeypressEvents(e,s),e.isTTY&&e.setRawMode(true);const i=(D,{name:C,sequence:n})=>{const E=String(D);if($([E,C,n],"cancel")){F&&u.write(srcExports.cursor.show),process.exit(0);return}if(!t)return;const a=C==="return"?0:-1,o=C==="return"?-1:0;g.moveCursor(u,a,o,()=>{g.clearLine(u,1,()=>{e.once("keypress",i);});});};return F&&u.write(srcExports.cursor.hide),e.once("keypress",i),()=>{e.off("keypress",i),F&&u.write(srcExports.cursor.show),e.isTTY&&!AD&&e.setRawMode(false),s.terminal=false,s.close();}}var gD=Object.defineProperty,vD=(e,u,t)=>u in e?gD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,h=(e,u,t)=>(vD(e,typeof u!="symbol"?u+"":u,t),t);class x{constructor(u,t=true){h(this,"input"),h(this,"output"),h(this,"_abortSignal"),h(this,"rl"),h(this,"opts"),h(this,"_render"),h(this,"_track",false),h(this,"_prevFrame",""),h(this,"_subscribers",new Map),h(this,"_cursor",0),h(this,"state","initial"),h(this,"error",""),h(this,"value");const{input:F=stdin,output:s=stdout,render:i,signal:D,...C}=u;this.opts=C,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=t,this._abortSignal=D,this.input=F,this.output=s;}unsubscribe(){this._subscribers.clear();}setSubscriber(u,t){const F=this._subscribers.get(u)??[];F.push(t),this._subscribers.set(u,F);}on(u,t){this.setSubscriber(u,{cb:t});}once(u,t){this.setSubscriber(u,{cb:t,once:true});}emit(u,...t){const F=this._subscribers.get(u)??[],s=[];for(const i of F)i.cb(...t),i.once&&s.push(()=>F.splice(F.indexOf(i),1));for(const i of s)i();}prompt(){return new Promise((u,t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),u(S);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close();},{once:true});}const F=new Writable;F._write=(s,i,D)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),D();},this.input.pipe(F),this.rl=g__default.createInterface({input:this.input,output:F,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:true}),g__default.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),m(this.input,true),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),m(this.input,false),u(this.value);}),this.once("cancel",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),m(this.input,false),u(S);});})}onKeypress(u,t){if(this.state==="error"&&(this.state="active"),t?.name&&(!this._track&&B.aliases.has(t.name)&&this.emit("cursor",B.aliases.get(t.name)),B.actions.has(t.name)&&this.emit("cursor",t.name)),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),t?.name==="return"){if(this.opts.validate){const F=this.opts.validate(this.value);F&&(this.error=F instanceof Error?F.message:F,this.state="error",this.rl?.write(this.value));}this.state!=="error"&&(this.state="submit");}$([u,t?.name,t?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close();}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
381
|
+
`),m(this.input,false),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe();}restoreCursor(){const u=Y$1(this._prevFrame,process.stdout.columns,{hard:true}).split(`
|
|
382
|
+
`).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=Y$1(this._render(this)??"",process.stdout.columns,{hard:true});if(u!==this._prevFrame){if(this.state==="initial")this.output.write(srcExports.cursor.hide);else {const t=BD(this._prevFrame,u);if(this.restoreCursor(),t&&t?.length===1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.lines(1));const s=u.split(`
|
|
383
|
+
`);this.output.write(s[F]),this._prevFrame=u,this.output.write(srcExports.cursor.move(0,s.length-F-1));return}if(t&&t?.length>1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.down());const s=u.split(`
|
|
384
|
+
`).slice(F);this.output.write(s.join(`
|
|
385
|
+
`)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}var OD=Object.defineProperty,PD=(e,u,t)=>u in e?OD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,J=(e,u,t)=>(PD(e,typeof u!="symbol"?u+"":u,t),t);class LD extends x{constructor(u){super(u,false),J(this,"options"),J(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case "left":case "up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case "down":case "right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue();});}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value;}}class RD extends x{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return `${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...F]=this.value.slice(this.cursor);return `${u}${color2.inverse(t)}${F.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue);});}}
|
|
386
|
+
|
|
387
|
+
function ce(){return y$1.platform!=="win32"?y$1.env.TERM!=="linux":!!y$1.env.CI||!!y$1.env.WT_SESSION||!!y$1.env.TERMINUS_SUBLIME||y$1.env.ConEmuTask==="{cmd::Cmder}"||y$1.env.TERM_PROGRAM==="Terminus-Sublime"||y$1.env.TERM_PROGRAM==="vscode"||y$1.env.TERM==="xterm-256color"||y$1.env.TERM==="alacritty"||y$1.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const V=ce(),u=(t,n)=>V?t:n,le=u("\u25C6","*"),L=u("\u25A0","x"),W=u("\u25B2","x"),C=u("\u25C7","o"),ue=u("\u250C","T"),o=u("\u2502","|"),d=u("\u2514","\u2014"),k=u("\u25CF",">"),P=u("\u25CB"," "),_=u("\u2500","-"),me=u("\u256E","+"),de=u("\u251C","+"),pe=u("\u256F","+"),q=u("\u25CF","\u2022"),D=u("\u25C6","*"),U=u("\u25B2","!"),K=u("\u25A0","x"),b=t=>{switch(t){case "initial":case "active":return color2.cyan(le);case "cancel":return color2.red(L);case "error":return color2.yellow(W);case "submit":return color2.green(C)}},G=t=>{const{cursor:n,options:r,style:i}=t,s=t.maxItems??Number.POSITIVE_INFINITY,c=Math.max(process.stdout.rows-4,0),a=Math.min(c,Math.max(s,5));let l=0;n>=l+a-3?l=Math.max(Math.min(n-a+3,r.length-a),0):n<l+2&&(l=Math.max(n-2,0));const $=a<r.length&&l>0,g=a<r.length&&l+a<r.length;return r.slice(l,l+a).map((p,v,f)=>{const j=v===0&&$,E=v===f.length-1&&g;return j||E?color2.dim("..."):i(p,v+l===n)})},he=t=>new RD({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,render(){const n=`${color2.gray(o)}
|
|
388
|
+
${b(this.state)} ${t.message}
|
|
389
|
+
`,r=t.placeholder?color2.inverse(t.placeholder[0])+color2.dim(t.placeholder.slice(1)):color2.inverse(color2.hidden("_")),i=this.value?this.valueWithCursor:r;switch(this.state){case "error":return `${n.trim()}
|
|
390
|
+
${color2.yellow(o)} ${i}
|
|
391
|
+
${color2.yellow(d)} ${color2.yellow(this.error)}
|
|
392
|
+
`;case "submit":return `${n}${color2.gray(o)} ${color2.dim(this.value||t.placeholder)}`;case "cancel":return `${n}${color2.gray(o)} ${color2.strikethrough(color2.dim(this.value??""))}${this.value?.trim()?`
|
|
393
|
+
${color2.gray(o)}`:""}`;default:return `${n}${color2.cyan(o)} ${i}
|
|
394
|
+
${color2.cyan(d)}
|
|
395
|
+
`}}}).prompt(),ve=t=>{const n=(r,i)=>{const s=r.label??String(r.value);switch(i){case "selected":return `${color2.dim(s)}`;case "active":return `${color2.green(k)} ${s} ${r.hint?color2.dim(`(${r.hint})`):""}`;case "cancelled":return `${color2.strikethrough(color2.dim(s))}`;default:return `${color2.dim(P)} ${color2.dim(s)}`}};return new LD({options:t.options,initialValue:t.initialValue,render(){const r=`${color2.gray(o)}
|
|
396
|
+
${b(this.state)} ${t.message}
|
|
397
|
+
`;switch(this.state){case "submit":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"selected")}`;case "cancel":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"cancelled")}
|
|
398
|
+
${color2.gray(o)}`;default:return `${r}${color2.cyan(o)} ${G({cursor:this.cursor,options:this.options,maxItems:t.maxItems,style:(i,s)=>n(i,s?"active":"inactive")}).join(`
|
|
399
|
+
${color2.cyan(o)} `)}
|
|
400
|
+
${color2.cyan(d)}
|
|
401
|
+
`}}}).prompt()},Me=(t="",n="")=>{const r=`
|
|
402
|
+
${t}
|
|
400
403
|
`.split(`
|
|
401
|
-
`),i=
|
|
402
|
-
`);process.stdout.write(`${color2.gray(
|
|
403
|
-
${color2.green(
|
|
404
|
-
${
|
|
405
|
-
${color2.gray(
|
|
406
|
-
`);},
|
|
407
|
-
|
|
408
|
-
`);},
|
|
409
|
-
`);},
|
|
410
|
-
${color2.gray(
|
|
411
|
-
|
|
412
|
-
`);},
|
|
413
|
-
`);
|
|
404
|
+
`),i=stripVTControlCharacters(n).length,s=Math.max(r.reduce((a,l)=>{const $=stripVTControlCharacters(l);return $.length>a?$.length:a},0),i)+2,c=r.map(a=>`${color2.gray(o)} ${color2.dim(a)}${" ".repeat(s-stripVTControlCharacters(a).length)}${color2.gray(o)}`).join(`
|
|
405
|
+
`);process.stdout.write(`${color2.gray(o)}
|
|
406
|
+
${color2.green(C)} ${color2.reset(n)} ${color2.gray(_.repeat(Math.max(s-i-1,1))+me)}
|
|
407
|
+
${c}
|
|
408
|
+
${color2.gray(de+_.repeat(s+2)+pe)}
|
|
409
|
+
`);},xe=(t="")=>{process.stdout.write(`${color2.gray(d)} ${color2.red(t)}
|
|
410
|
+
|
|
411
|
+
`);},Ie=(t="")=>{process.stdout.write(`${color2.gray(ue)} ${t}
|
|
412
|
+
`);},Se=(t="")=>{process.stdout.write(`${color2.gray(o)}
|
|
413
|
+
${color2.gray(d)} ${t}
|
|
414
|
+
|
|
415
|
+
`);},M={message:(t="",{symbol:n=color2.gray(o)}={})=>{const r=[`${color2.gray(o)}`];if(t){const[i,...s]=t.split(`
|
|
416
|
+
`);r.push(`${n} ${i}`,...s.map(c=>`${color2.gray(o)} ${c}`));}process.stdout.write(`${r.join(`
|
|
414
417
|
`)}
|
|
415
|
-
`);},info:
|
|
416
|
-
`);
|
|
417
|
-
`),
|
|
418
|
+
`);},info:t=>{M.message(t,{symbol:color2.blue(q)});},success:t=>{M.message(t,{symbol:color2.green(D)});},step:t=>{M.message(t,{symbol:color2.green(C)});},warn:t=>{M.message(t,{symbol:color2.yellow(U)});},warning:t=>{M.warn(t);},error:t=>{M.message(t,{symbol:color2.red(K)});}};`${color2.gray(o)} `;const Y=({indicator:t="dots"}={})=>{const n=V?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],r=V?80:120,i=process.env.CI==="true";let s,c,a=false,l="",$,g=performance.now();const p=m=>{const h=m>1?"Something went wrong":"Canceled";a&&N(h,m);},v=()=>p(2),f=()=>p(1),j=()=>{process.on("uncaughtExceptionMonitor",v),process.on("unhandledRejection",v),process.on("SIGINT",f),process.on("SIGTERM",f),process.on("exit",p);},E=()=>{process.removeListener("uncaughtExceptionMonitor",v),process.removeListener("unhandledRejection",v),process.removeListener("SIGINT",f),process.removeListener("SIGTERM",f),process.removeListener("exit",p);},B=()=>{if($===void 0)return;i&&process.stdout.write(`
|
|
419
|
+
`);const m=$.split(`
|
|
420
|
+
`);process.stdout.write(srcExports.cursor.move(-999,m.length-1)),process.stdout.write(srcExports.erase.down(m.length));},R=m=>m.replace(/\.+$/,""),O=m=>{const h=(performance.now()-m)/1e3,w=Math.floor(h/60),I=Math.floor(h%60);return w>0?`[${w}m ${I}s]`:`[${I}s]`},H=(m="")=>{a=true,s=fD(),l=R(m),g=performance.now(),process.stdout.write(`${color2.gray(o)}
|
|
421
|
+
`);let h=0,w=0;j(),c=setInterval(()=>{if(i&&l===$)return;B(),$=l;const I=color2.magenta(n[h]);if(i)process.stdout.write(`${I} ${l}...`);else if(t==="timer")process.stdout.write(`${I} ${l} ${O(g)}`);else {const z=".".repeat(Math.floor(w)).slice(0,3);process.stdout.write(`${I} ${l}${z}`);}h=h+1<n.length?h+1:0,w=w<n.length?w+.125:0;},r);},N=(m="",h=0)=>{a=false,clearInterval(c),B();const w=h===0?color2.green(C):h===1?color2.red(L):color2.red(W);l=R(m??l),t==="timer"?process.stdout.write(`${w} ${l} ${O(g)}
|
|
422
|
+
`):process.stdout.write(`${w} ${l}
|
|
423
|
+
`),E(),s();};return {start:H,stop:N,message:(m="")=>{l=R(m??l);}}},Ce=async(t,n)=>{const r={},i=Object.keys(t);for(const s of i){const c=t[s],a=await c({results:r})?.catch(l=>{throw l});if(typeof n?.onCancel=="function"&&pD(a)){r[s]="canceled",n.onCancel({results:r});continue}r[s]=a;}return r};
|
|
424
|
+
|
|
425
|
+
var shellQuote$1 = {};
|
|
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$1;
|
|
692
|
+
hasRequiredShellQuote = 1;
|
|
693
|
+
|
|
694
|
+
shellQuote$1.quote = requireQuote();
|
|
695
|
+
shellQuote$1.parse = requireParse();
|
|
696
|
+
return shellQuote$1;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
var shellQuoteExports = requireShellQuote();
|
|
700
|
+
var shellQuote = /*@__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)
|
|
@@ -549,18 +832,20 @@ var yoctocolors = /*#__PURE__*/Object.freeze({
|
|
|
549
832
|
yellowBright: yellowBright
|
|
550
833
|
});
|
|
551
834
|
|
|
552
|
-
const isUnicodeSupported =
|
|
835
|
+
const isUnicodeSupported = y$1.platform !== 'win32'
|
|
836
|
+
|| Boolean(y$1.env.WT_SESSION) // Windows Terminal
|
|
837
|
+
|| y$1.env.TERM_PROGRAM === 'vscode';
|
|
553
838
|
|
|
554
839
|
const isInteractive = stream => Boolean(
|
|
555
840
|
stream.isTTY
|
|
556
|
-
&&
|
|
557
|
-
&& !('CI' in
|
|
841
|
+
&& y$1.env.TERM !== 'dumb'
|
|
842
|
+
&& !('CI' in y$1.env),
|
|
558
843
|
);
|
|
559
844
|
|
|
560
845
|
const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
|
|
561
846
|
const successSymbol = green(isUnicodeSupported ? '✔' : '√');
|
|
562
847
|
const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
|
|
563
|
-
const errorSymbol = red(isUnicodeSupported ? '
|
|
848
|
+
const errorSymbol = red(isUnicodeSupported ? '✖' : '×');
|
|
564
849
|
|
|
565
850
|
const defaultSpinner = {
|
|
566
851
|
frames: isUnicodeSupported
|
|
@@ -603,7 +888,7 @@ class YoctoSpinner {
|
|
|
603
888
|
this.#frames = spinner.frames;
|
|
604
889
|
this.#interval = spinner.interval;
|
|
605
890
|
this.#text = options.text ?? '';
|
|
606
|
-
this.#stream = options.stream ??
|
|
891
|
+
this.#stream = options.stream ?? y$1.stderr;
|
|
607
892
|
this.#color = options.color ?? 'cyan';
|
|
608
893
|
this.#isInteractive = isInteractive(this.#stream);
|
|
609
894
|
this.#exitHandlerBound = this.#exitHandler.bind(this);
|
|
@@ -675,8 +960,8 @@ class YoctoSpinner {
|
|
|
675
960
|
return this.#text;
|
|
676
961
|
}
|
|
677
962
|
|
|
678
|
-
set text(value
|
|
679
|
-
this.#text = value;
|
|
963
|
+
set text(value) {
|
|
964
|
+
this.#text = value ?? '';
|
|
680
965
|
this.#render();
|
|
681
966
|
}
|
|
682
967
|
|
|
@@ -740,7 +1025,7 @@ class YoctoSpinner {
|
|
|
740
1025
|
|
|
741
1026
|
#lineCount(text) {
|
|
742
1027
|
const width = this.#stream.columns ?? 80;
|
|
743
|
-
const lines = text.split('\n');
|
|
1028
|
+
const lines = stripVTControlCharacters(text).split('\n');
|
|
744
1029
|
|
|
745
1030
|
let lineCount = 0;
|
|
746
1031
|
for (const line of lines) {
|
|
@@ -763,13 +1048,13 @@ class YoctoSpinner {
|
|
|
763
1048
|
}
|
|
764
1049
|
|
|
765
1050
|
#subscribeToProcessEvents() {
|
|
766
|
-
|
|
767
|
-
|
|
1051
|
+
y$1.once('SIGINT', this.#exitHandlerBound);
|
|
1052
|
+
y$1.once('SIGTERM', this.#exitHandlerBound);
|
|
768
1053
|
}
|
|
769
1054
|
|
|
770
1055
|
#unsubscribeFromProcessEvents() {
|
|
771
|
-
|
|
772
|
-
|
|
1056
|
+
y$1.off('SIGINT', this.#exitHandlerBound);
|
|
1057
|
+
y$1.off('SIGTERM', this.#exitHandlerBound);
|
|
773
1058
|
}
|
|
774
1059
|
|
|
775
1060
|
#exitHandler(signal) {
|
|
@@ -780,7 +1065,7 @@ class YoctoSpinner {
|
|
|
780
1065
|
// SIGINT: 128 + 2
|
|
781
1066
|
// SIGTERM: 128 + 15
|
|
782
1067
|
const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
|
|
783
|
-
|
|
1068
|
+
y$1.exit(exitCode);
|
|
784
1069
|
}
|
|
785
1070
|
}
|
|
786
1071
|
|
|
@@ -789,46 +1074,86 @@ function yoctoSpinner(options) {
|
|
|
789
1074
|
}
|
|
790
1075
|
|
|
791
1076
|
var LogLevel = {
|
|
792
|
-
INFO: "info"
|
|
793
|
-
|
|
794
|
-
|
|
1077
|
+
INFO: "info",
|
|
1078
|
+
ERROR: "error"};
|
|
1079
|
+
var MastraLogger = class {
|
|
1080
|
+
name;
|
|
1081
|
+
level;
|
|
795
1082
|
transports;
|
|
796
1083
|
constructor(options = {}) {
|
|
797
|
-
this.
|
|
798
|
-
|
|
799
|
-
this.
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
1084
|
+
this.name = options.name || "Mastra";
|
|
1085
|
+
this.level = options.level || LogLevel.ERROR;
|
|
1086
|
+
this.transports = new Map(Object.entries(options.transports || {}));
|
|
1087
|
+
}
|
|
1088
|
+
getTransports() {
|
|
1089
|
+
return this.transports;
|
|
1090
|
+
}
|
|
1091
|
+
trackException(_error) {
|
|
1092
|
+
}
|
|
1093
|
+
async getLogs(transportId, params) {
|
|
1094
|
+
if (!transportId || !this.transports.has(transportId)) {
|
|
1095
|
+
return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
|
|
1096
|
+
}
|
|
1097
|
+
return this.transports.get(transportId).getLogs(params) ?? {
|
|
1098
|
+
logs: [],
|
|
1099
|
+
total: 0,
|
|
1100
|
+
page: params?.page ?? 1,
|
|
1101
|
+
perPage: params?.perPage ?? 100,
|
|
1102
|
+
hasMore: false
|
|
1103
|
+
};
|
|
1104
|
+
}
|
|
1105
|
+
async getLogsByRunId({
|
|
1106
|
+
transportId,
|
|
1107
|
+
runId,
|
|
1108
|
+
fromDate,
|
|
1109
|
+
toDate,
|
|
1110
|
+
logLevel,
|
|
1111
|
+
filters,
|
|
1112
|
+
page,
|
|
1113
|
+
perPage
|
|
1114
|
+
}) {
|
|
1115
|
+
if (!transportId || !this.transports.has(transportId) || !runId) {
|
|
1116
|
+
return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
|
|
1117
|
+
}
|
|
1118
|
+
return this.transports.get(transportId).getLogsByRunId({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
|
|
1119
|
+
logs: [],
|
|
1120
|
+
total: 0,
|
|
1121
|
+
page: page ?? 1,
|
|
1122
|
+
perPage: perPage ?? 100,
|
|
1123
|
+
hasMore: false
|
|
1124
|
+
};
|
|
1125
|
+
}
|
|
1126
|
+
};
|
|
1127
|
+
|
|
1128
|
+
var PinoLogger = class extends MastraLogger {
|
|
1129
|
+
logger;
|
|
1130
|
+
constructor(options = {}) {
|
|
1131
|
+
super(options);
|
|
1132
|
+
let prettyStream = void 0;
|
|
1133
|
+
if (!options.overrideDefaultTransports) {
|
|
1134
|
+
prettyStream = pretty({
|
|
812
1135
|
colorize: true,
|
|
813
1136
|
levelFirst: true,
|
|
814
1137
|
ignore: "pid,hostname",
|
|
815
1138
|
colorizeObjects: true,
|
|
816
1139
|
translateTime: "SYS:standard",
|
|
817
1140
|
singleLine: false
|
|
818
|
-
})
|
|
1141
|
+
});
|
|
1142
|
+
}
|
|
1143
|
+
const transportsAry = [...this.getTransports().entries()];
|
|
1144
|
+
this.logger = pino(
|
|
1145
|
+
{
|
|
1146
|
+
name: options.name || "app",
|
|
1147
|
+
level: options.level || LogLevel.INFO,
|
|
1148
|
+
formatters: options.formatters
|
|
1149
|
+
},
|
|
1150
|
+
options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? prettyStream : pino.multistream([
|
|
819
1151
|
...transportsAry.map(([, transport]) => ({
|
|
820
1152
|
stream: transport,
|
|
821
1153
|
level: options.level || LogLevel.INFO
|
|
822
1154
|
})),
|
|
823
1155
|
{
|
|
824
|
-
stream:
|
|
825
|
-
colorize: true,
|
|
826
|
-
levelFirst: true,
|
|
827
|
-
ignore: "pid,hostname",
|
|
828
|
-
colorizeObjects: true,
|
|
829
|
-
translateTime: "SYS:standard",
|
|
830
|
-
singleLine: false
|
|
831
|
-
}),
|
|
1156
|
+
stream: prettyStream,
|
|
832
1157
|
level: options.level || LogLevel.INFO
|
|
833
1158
|
}
|
|
834
1159
|
])
|
|
@@ -846,32 +1171,199 @@ var Logger = class {
|
|
|
846
1171
|
error(message, args = {}) {
|
|
847
1172
|
this.logger.error(args, message);
|
|
848
1173
|
}
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
1174
|
+
};
|
|
1175
|
+
|
|
1176
|
+
function getPackageManager() {
|
|
1177
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
1178
|
+
const execPath = process.env.npm_execpath || "";
|
|
1179
|
+
if (userAgent.includes("yarn")) {
|
|
1180
|
+
return "yarn";
|
|
1181
|
+
}
|
|
1182
|
+
if (userAgent.includes("pnpm")) {
|
|
1183
|
+
return "pnpm";
|
|
1184
|
+
}
|
|
1185
|
+
if (userAgent.includes("npm")) {
|
|
1186
|
+
return "npm";
|
|
1187
|
+
}
|
|
1188
|
+
if (execPath.includes("yarn")) {
|
|
1189
|
+
return "yarn";
|
|
1190
|
+
}
|
|
1191
|
+
if (execPath.includes("pnpm")) {
|
|
1192
|
+
return "pnpm";
|
|
1193
|
+
}
|
|
1194
|
+
if (execPath.includes("npm")) {
|
|
1195
|
+
return "npm";
|
|
1196
|
+
}
|
|
1197
|
+
return "npm";
|
|
1198
|
+
}
|
|
1199
|
+
var logger = new PinoLogger({
|
|
1200
|
+
name: "Mastra CLI",
|
|
1201
|
+
level: "info"
|
|
1202
|
+
});
|
|
1203
|
+
var exec = util.promisify(child_process.exec);
|
|
1204
|
+
async function cloneTemplate(options) {
|
|
1205
|
+
const { template, projectName, targetDir } = options;
|
|
1206
|
+
const projectPath = targetDir ? path3.resolve(targetDir, projectName) : path3.resolve(projectName);
|
|
1207
|
+
const spinner5 = yoctoSpinner({ text: `Cloning template "${template.title}"...` }).start();
|
|
1208
|
+
try {
|
|
1209
|
+
if (await directoryExists(projectPath)) {
|
|
1210
|
+
spinner5.error(`Directory ${projectName} already exists`);
|
|
1211
|
+
throw new Error(`Directory ${projectName} already exists`);
|
|
1212
|
+
}
|
|
1213
|
+
await cloneRepositoryWithoutGit(template.githubUrl, projectPath);
|
|
1214
|
+
await updatePackageJson(projectPath, projectName);
|
|
1215
|
+
const envExamplePath = path3.join(projectPath, ".env.example");
|
|
1216
|
+
if (await fileExists(envExamplePath)) {
|
|
1217
|
+
await fs.copyFile(envExamplePath, path3.join(projectPath, ".env"));
|
|
1218
|
+
}
|
|
1219
|
+
spinner5.success(`Template "${template.title}" cloned successfully to ${projectName}`);
|
|
1220
|
+
return projectPath;
|
|
1221
|
+
} catch (error) {
|
|
1222
|
+
spinner5.error(`Failed to clone template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1223
|
+
throw error;
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
async function directoryExists(dirPath) {
|
|
1227
|
+
try {
|
|
1228
|
+
const stat = await fs.stat(dirPath);
|
|
1229
|
+
return stat.isDirectory();
|
|
1230
|
+
} catch {
|
|
1231
|
+
return false;
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
async function fileExists(filePath) {
|
|
1235
|
+
try {
|
|
1236
|
+
const stat = await fs.stat(filePath);
|
|
1237
|
+
return stat.isFile();
|
|
1238
|
+
} catch {
|
|
1239
|
+
return false;
|
|
1240
|
+
}
|
|
1241
|
+
}
|
|
1242
|
+
async function cloneRepositoryWithoutGit(repoUrl, targetPath) {
|
|
1243
|
+
await fs.mkdir(targetPath, { recursive: true });
|
|
1244
|
+
try {
|
|
1245
|
+
const degitRepo = repoUrl.replace("https://github.com/", "");
|
|
1246
|
+
const degitCommand = shellQuote.quote(["npx", "degit", degitRepo, targetPath]);
|
|
1247
|
+
await exec(degitCommand, {
|
|
1248
|
+
cwd: process.cwd()
|
|
1249
|
+
});
|
|
1250
|
+
} catch {
|
|
1251
|
+
try {
|
|
1252
|
+
const gitCommand = shellQuote.quote(["git", "clone", repoUrl, targetPath]);
|
|
1253
|
+
await exec(gitCommand, {
|
|
1254
|
+
cwd: process.cwd()
|
|
1255
|
+
});
|
|
1256
|
+
const gitDir = path3.join(targetPath, ".git");
|
|
1257
|
+
if (await directoryExists(gitDir)) {
|
|
1258
|
+
await fs.rm(gitDir, { recursive: true, force: true });
|
|
858
1259
|
}
|
|
1260
|
+
} catch (gitError) {
|
|
1261
|
+
throw new Error(`Failed to clone repository: ${gitError instanceof Error ? gitError.message : "Unknown error"}`);
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
async function updatePackageJson(projectPath, projectName) {
|
|
1266
|
+
const packageJsonPath = path3.join(projectPath, "package.json");
|
|
1267
|
+
try {
|
|
1268
|
+
const packageJsonContent = await fs.readFile(packageJsonPath, "utf-8");
|
|
1269
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
1270
|
+
packageJson.name = projectName;
|
|
1271
|
+
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), "utf-8");
|
|
1272
|
+
} catch (error) {
|
|
1273
|
+
logger.warn(`Could not update package.json: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
async function installDependencies(projectPath, packageManager) {
|
|
1277
|
+
const spinner5 = yoctoSpinner({ text: "Installing dependencies..." }).start();
|
|
1278
|
+
try {
|
|
1279
|
+
const pm = packageManager || getPackageManager();
|
|
1280
|
+
const installCommand = shellQuote.quote([pm, "install"]);
|
|
1281
|
+
await exec(installCommand, {
|
|
1282
|
+
cwd: projectPath
|
|
859
1283
|
});
|
|
1284
|
+
spinner5.success("Dependencies installed successfully");
|
|
1285
|
+
} catch (error) {
|
|
1286
|
+
spinner5.error(`Failed to install dependencies: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
1287
|
+
throw error;
|
|
860
1288
|
}
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
1289
|
+
}
|
|
1290
|
+
var TEMPLATES_API_URL = process.env.MASTRA_TEMPLATES_API_URL || "https://mastra.ai/api/templates.json";
|
|
1291
|
+
async function loadTemplates() {
|
|
1292
|
+
try {
|
|
1293
|
+
const response = await fetch(TEMPLATES_API_URL);
|
|
1294
|
+
if (!response.ok) {
|
|
1295
|
+
throw new Error(`Failed to fetch templates: ${response.statusText}`);
|
|
864
1296
|
}
|
|
865
|
-
|
|
1297
|
+
const templates = await response.json();
|
|
1298
|
+
return templates;
|
|
1299
|
+
} catch (error) {
|
|
1300
|
+
console.error("Error loading templates:", error);
|
|
1301
|
+
throw new Error("Failed to load templates. Please check your internet connection and try again.");
|
|
866
1302
|
}
|
|
867
|
-
|
|
868
|
-
|
|
1303
|
+
}
|
|
1304
|
+
function pluralize(count, singular, plural) {
|
|
1305
|
+
return count === 1 ? singular : plural || `${singular}s`;
|
|
1306
|
+
}
|
|
1307
|
+
async function selectTemplate(templates) {
|
|
1308
|
+
const choices = templates.map((template) => {
|
|
1309
|
+
const parts = [];
|
|
1310
|
+
if (template.agents?.length) {
|
|
1311
|
+
parts.push(`${template.agents.length} ${pluralize(template.agents.length, "agent")}`);
|
|
1312
|
+
}
|
|
1313
|
+
if (template.tools?.length) {
|
|
1314
|
+
parts.push(`${template.tools.length} ${pluralize(template.tools.length, "tool")}`);
|
|
1315
|
+
}
|
|
1316
|
+
if (template.workflows?.length) {
|
|
1317
|
+
parts.push(`${template.workflows.length} ${pluralize(template.workflows.length, "workflow")}`);
|
|
1318
|
+
}
|
|
1319
|
+
if (template.mcp?.length) {
|
|
1320
|
+
parts.push(`${template.mcp.length} ${pluralize(template.mcp.length, "MCP server")}`);
|
|
1321
|
+
}
|
|
1322
|
+
if (template.networks?.length) {
|
|
1323
|
+
parts.push(`${template.networks.length} ${pluralize(template.networks.length, "agent network")}`);
|
|
1324
|
+
}
|
|
1325
|
+
return {
|
|
1326
|
+
value: template,
|
|
1327
|
+
label: template.title,
|
|
1328
|
+
hint: parts.join(", ") || "Template components"
|
|
1329
|
+
};
|
|
1330
|
+
});
|
|
1331
|
+
const selected = await ve({
|
|
1332
|
+
message: "Select a template:",
|
|
1333
|
+
options: choices
|
|
1334
|
+
});
|
|
1335
|
+
if (pD(selected)) {
|
|
1336
|
+
return null;
|
|
1337
|
+
}
|
|
1338
|
+
return selected;
|
|
1339
|
+
}
|
|
1340
|
+
function findTemplateByName(templates, templateName) {
|
|
1341
|
+
let template = templates.find((t) => t.slug === templateName);
|
|
1342
|
+
if (template) return template;
|
|
1343
|
+
const slugWithPrefix = `template-${templateName}`;
|
|
1344
|
+
template = templates.find((t) => t.slug === slugWithPrefix);
|
|
1345
|
+
if (template) return template;
|
|
1346
|
+
template = templates.find((t) => t.title.toLowerCase() === templateName.toLowerCase());
|
|
1347
|
+
if (template) return template;
|
|
1348
|
+
return null;
|
|
1349
|
+
}
|
|
1350
|
+
function getDefaultProjectName(template) {
|
|
1351
|
+
return template.slug.replace(/^template-/, "");
|
|
1352
|
+
}
|
|
1353
|
+
function getPackageManagerAddCommand(pm) {
|
|
1354
|
+
switch (pm) {
|
|
1355
|
+
case "npm":
|
|
1356
|
+
return "install --audit=false --fund=false --loglevel=error --progress=false --update-notifier=false";
|
|
1357
|
+
case "yarn":
|
|
1358
|
+
return "add";
|
|
1359
|
+
case "pnpm":
|
|
1360
|
+
return "add --loglevel=error";
|
|
1361
|
+
case "bun":
|
|
1362
|
+
return "add";
|
|
1363
|
+
default:
|
|
1364
|
+
return "add";
|
|
869
1365
|
}
|
|
870
|
-
};
|
|
871
|
-
function createLogger(options) {
|
|
872
|
-
return new Logger(options);
|
|
873
1366
|
}
|
|
874
|
-
|
|
875
1367
|
var DepsService = class {
|
|
876
1368
|
packageManager;
|
|
877
1369
|
constructor() {
|
|
@@ -880,11 +1372,11 @@ var DepsService = class {
|
|
|
880
1372
|
findLockFile(dir) {
|
|
881
1373
|
const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
|
|
882
1374
|
for (const file of lockFiles) {
|
|
883
|
-
if (
|
|
1375
|
+
if (fs4__default__default.existsSync(path3.join(dir, file))) {
|
|
884
1376
|
return file;
|
|
885
1377
|
}
|
|
886
1378
|
}
|
|
887
|
-
const parentDir =
|
|
1379
|
+
const parentDir = path3.resolve(dir, "..");
|
|
888
1380
|
if (parentDir !== dir) {
|
|
889
1381
|
return this.findLockFile(parentDir);
|
|
890
1382
|
}
|
|
@@ -906,14 +1398,10 @@ var DepsService = class {
|
|
|
906
1398
|
}
|
|
907
1399
|
}
|
|
908
1400
|
async installPackages(packages) {
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
runCommand = `${this.packageManager} i`;
|
|
912
|
-
} else {
|
|
913
|
-
runCommand = `${this.packageManager} add`;
|
|
914
|
-
}
|
|
1401
|
+
const pm = this.packageManager;
|
|
1402
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
915
1403
|
const packageList = packages.join(" ");
|
|
916
|
-
return execa(`${
|
|
1404
|
+
return execa(`${pm} ${installCommand} ${packageList}`, {
|
|
917
1405
|
all: true,
|
|
918
1406
|
shell: true,
|
|
919
1407
|
stdio: "inherit"
|
|
@@ -921,13 +1409,13 @@ var DepsService = class {
|
|
|
921
1409
|
}
|
|
922
1410
|
async checkDependencies(dependencies) {
|
|
923
1411
|
try {
|
|
924
|
-
const packageJsonPath =
|
|
1412
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
925
1413
|
try {
|
|
926
|
-
await
|
|
1414
|
+
await fs.access(packageJsonPath);
|
|
927
1415
|
} catch {
|
|
928
1416
|
return "No package.json file found in the current directory";
|
|
929
1417
|
}
|
|
930
|
-
const packageJson = JSON.parse(await
|
|
1418
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf-8"));
|
|
931
1419
|
for (const dependency of dependencies) {
|
|
932
1420
|
if (!packageJson.dependencies || !packageJson.dependencies[dependency]) {
|
|
933
1421
|
return `Please install ${dependency} before running this command (${this.packageManager} install ${dependency})`;
|
|
@@ -941,116 +1429,102 @@ var DepsService = class {
|
|
|
941
1429
|
}
|
|
942
1430
|
async getProjectName() {
|
|
943
1431
|
try {
|
|
944
|
-
const packageJsonPath =
|
|
945
|
-
const packageJson = await
|
|
1432
|
+
const packageJsonPath = path3.join(process.cwd(), "package.json");
|
|
1433
|
+
const packageJson = await fs.readFile(packageJsonPath, "utf-8");
|
|
946
1434
|
const pkg = JSON.parse(packageJson);
|
|
947
1435
|
return pkg.name;
|
|
948
1436
|
} catch (err) {
|
|
949
1437
|
throw err;
|
|
950
1438
|
}
|
|
951
1439
|
}
|
|
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
1440
|
async addScriptsToPackageJson(scripts) {
|
|
960
|
-
const packageJson = JSON.parse(await
|
|
1441
|
+
const packageJson = JSON.parse(await fs.readFile("package.json", "utf-8"));
|
|
961
1442
|
packageJson.scripts = {
|
|
962
1443
|
...packageJson.scripts,
|
|
963
1444
|
...scripts
|
|
964
1445
|
};
|
|
965
|
-
await
|
|
1446
|
+
await fs.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
966
1447
|
}
|
|
967
1448
|
};
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
return "pnpm";
|
|
985
|
-
}
|
|
986
|
-
if (execPath.includes("npm")) {
|
|
987
|
-
return "npm";
|
|
988
|
-
}
|
|
989
|
-
return "npm";
|
|
990
|
-
}
|
|
991
|
-
function getPackageManagerInstallCommand(pm) {
|
|
992
|
-
switch (pm) {
|
|
993
|
-
case "npm":
|
|
994
|
-
return "install";
|
|
995
|
-
case "yarn":
|
|
996
|
-
return "add";
|
|
997
|
-
case "pnpm":
|
|
998
|
-
return "add";
|
|
999
|
-
default:
|
|
1000
|
-
return "install";
|
|
1449
|
+
var args = ["-y", "@mastra/mcp-docs-server"];
|
|
1450
|
+
var createMcpConfig = (editor) => {
|
|
1451
|
+
if (editor === "vscode") {
|
|
1452
|
+
return {
|
|
1453
|
+
servers: {
|
|
1454
|
+
mastra: process.platform === `win32` ? {
|
|
1455
|
+
command: "cmd",
|
|
1456
|
+
args: ["/c", "npx", ...args],
|
|
1457
|
+
type: "stdio"
|
|
1458
|
+
} : {
|
|
1459
|
+
command: "npx",
|
|
1460
|
+
args,
|
|
1461
|
+
type: "stdio"
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
};
|
|
1001
1465
|
}
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
args: ["/c", "npx", ...args]
|
|
1009
|
-
} : {
|
|
1010
|
-
command: "npx",
|
|
1011
|
-
args
|
|
1466
|
+
return {
|
|
1467
|
+
mcpServers: {
|
|
1468
|
+
mastra: {
|
|
1469
|
+
command: "npx",
|
|
1470
|
+
args
|
|
1471
|
+
}
|
|
1012
1472
|
}
|
|
1013
|
-
}
|
|
1473
|
+
};
|
|
1014
1474
|
};
|
|
1015
|
-
function makeConfig(original) {
|
|
1475
|
+
function makeConfig(original, editor) {
|
|
1476
|
+
if (editor === "vscode") {
|
|
1477
|
+
return {
|
|
1478
|
+
...original,
|
|
1479
|
+
servers: {
|
|
1480
|
+
...original?.servers || {},
|
|
1481
|
+
...createMcpConfig(editor).servers
|
|
1482
|
+
}
|
|
1483
|
+
};
|
|
1484
|
+
}
|
|
1016
1485
|
return {
|
|
1017
1486
|
...original,
|
|
1018
1487
|
mcpServers: {
|
|
1019
1488
|
...original?.mcpServers || {},
|
|
1020
|
-
...
|
|
1489
|
+
...createMcpConfig(editor).mcpServers
|
|
1021
1490
|
}
|
|
1022
1491
|
};
|
|
1023
1492
|
}
|
|
1024
|
-
async function writeMergedConfig(configPath) {
|
|
1493
|
+
async function writeMergedConfig(configPath, editor) {
|
|
1025
1494
|
const configExists = existsSync(configPath);
|
|
1026
|
-
const config = makeConfig(configExists ? await readJSON(configPath) : {});
|
|
1495
|
+
const config = makeConfig(configExists ? await readJSON(configPath) : {}, editor);
|
|
1027
1496
|
await ensureFile(configPath);
|
|
1028
1497
|
await writeJSON(configPath, config, {
|
|
1029
1498
|
spaces: 2
|
|
1030
1499
|
});
|
|
1031
1500
|
}
|
|
1032
|
-
var windsurfGlobalMCPConfigPath =
|
|
1033
|
-
var cursorGlobalMCPConfigPath =
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1501
|
+
var windsurfGlobalMCPConfigPath = path3.join(os.homedir(), ".codeium", "windsurf", "mcp_config.json");
|
|
1502
|
+
var cursorGlobalMCPConfigPath = path3.join(os.homedir(), ".cursor", "mcp.json");
|
|
1503
|
+
path3.join(process.cwd(), ".vscode", "mcp.json");
|
|
1504
|
+
var vscodeGlobalMCPConfigPath = path3.join(
|
|
1505
|
+
os.homedir(),
|
|
1506
|
+
process.platform === "win32" ? path3.join("AppData", "Roaming", "Code", "User", "settings.json") : process.platform === "darwin" ? path3.join("Library", "Application Support", "Code", "User", "settings.json") : path3.join(".config", "Code", "User", "settings.json")
|
|
1507
|
+
);
|
|
1508
|
+
async function installMastraDocsMCPServer({ editor, directory }) {
|
|
1038
1509
|
if (editor === `cursor`) {
|
|
1039
|
-
await writeMergedConfig(
|
|
1510
|
+
await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor");
|
|
1511
|
+
}
|
|
1512
|
+
if (editor === `vscode`) {
|
|
1513
|
+
await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode");
|
|
1040
1514
|
}
|
|
1041
1515
|
if (editor === `cursor-global`) {
|
|
1042
1516
|
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1043
1517
|
if (alreadyInstalled) {
|
|
1044
1518
|
return;
|
|
1045
1519
|
}
|
|
1046
|
-
await writeMergedConfig(cursorGlobalMCPConfigPath);
|
|
1520
|
+
await writeMergedConfig(cursorGlobalMCPConfigPath, "cursor-global");
|
|
1047
1521
|
}
|
|
1048
1522
|
if (editor === `windsurf`) {
|
|
1049
1523
|
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
1050
1524
|
if (alreadyInstalled) {
|
|
1051
1525
|
return;
|
|
1052
1526
|
}
|
|
1053
|
-
await writeMergedConfig(windsurfGlobalMCPConfigPath);
|
|
1527
|
+
await writeMergedConfig(windsurfGlobalMCPConfigPath, editor);
|
|
1054
1528
|
}
|
|
1055
1529
|
}
|
|
1056
1530
|
async function globalMCPIsAlreadyInstalled(editor) {
|
|
@@ -1059,19 +1533,28 @@ async function globalMCPIsAlreadyInstalled(editor) {
|
|
|
1059
1533
|
configPath = windsurfGlobalMCPConfigPath;
|
|
1060
1534
|
} else if (editor === "cursor-global") {
|
|
1061
1535
|
configPath = cursorGlobalMCPConfigPath;
|
|
1536
|
+
} else if (editor === "vscode") {
|
|
1537
|
+
configPath = vscodeGlobalMCPConfigPath;
|
|
1062
1538
|
}
|
|
1063
1539
|
if (!configPath || !existsSync(configPath)) {
|
|
1064
1540
|
return false;
|
|
1065
1541
|
}
|
|
1066
1542
|
try {
|
|
1067
1543
|
const configContents = await readJSON(configPath);
|
|
1544
|
+
if (!configContents) return false;
|
|
1545
|
+
if (editor === "vscode") {
|
|
1546
|
+
if (!configContents.servers) return false;
|
|
1547
|
+
const hasMastraMCP2 = Object.values(configContents.servers).some(
|
|
1548
|
+
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1549
|
+
);
|
|
1550
|
+
return hasMastraMCP2;
|
|
1551
|
+
}
|
|
1068
1552
|
if (!configContents?.mcpServers) return false;
|
|
1069
1553
|
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1070
1554
|
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1071
1555
|
);
|
|
1072
1556
|
return hasMastraMCP;
|
|
1073
|
-
} catch
|
|
1074
|
-
console.error(e);
|
|
1557
|
+
} catch {
|
|
1075
1558
|
return false;
|
|
1076
1559
|
}
|
|
1077
1560
|
}
|
|
@@ -1085,7 +1568,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1085
1568
|
}
|
|
1086
1569
|
readFile(filePath) {
|
|
1087
1570
|
return new Promise((resolve, reject) => {
|
|
1088
|
-
|
|
1571
|
+
fs4__default.readFile(filePath, "utf8", (err, data) => {
|
|
1089
1572
|
if (err) reject(err);
|
|
1090
1573
|
else resolve(data);
|
|
1091
1574
|
});
|
|
@@ -1093,7 +1576,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1093
1576
|
}
|
|
1094
1577
|
writeFile({ filePath, data }) {
|
|
1095
1578
|
return new Promise((resolve, reject) => {
|
|
1096
|
-
|
|
1579
|
+
fs4__default.writeFile(filePath, data, "utf8", (err) => {
|
|
1097
1580
|
if (err) reject(err);
|
|
1098
1581
|
else resolve();
|
|
1099
1582
|
});
|
|
@@ -1146,25 +1629,25 @@ var FileService = class {
|
|
|
1146
1629
|
*/
|
|
1147
1630
|
async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
|
|
1148
1631
|
const __filename = fileURLToPath(import.meta.url);
|
|
1149
|
-
const __dirname =
|
|
1150
|
-
const filePath =
|
|
1151
|
-
const fileString =
|
|
1152
|
-
if (
|
|
1632
|
+
const __dirname = path3.dirname(__filename);
|
|
1633
|
+
const filePath = path3.resolve(__dirname, "starter-files", inputFile);
|
|
1634
|
+
const fileString = fs4__default__default.readFileSync(filePath, "utf8");
|
|
1635
|
+
if (fs4__default__default.existsSync(outputFilePath) && !replaceIfExists) {
|
|
1153
1636
|
console.log(`${outputFilePath} already exists`);
|
|
1154
1637
|
return false;
|
|
1155
1638
|
}
|
|
1156
|
-
await
|
|
1639
|
+
await fsExtra2.outputFile(outputFilePath, fileString);
|
|
1157
1640
|
return true;
|
|
1158
1641
|
}
|
|
1159
1642
|
async setupEnvFile({ dbUrl }) {
|
|
1160
|
-
const envPath =
|
|
1161
|
-
await
|
|
1643
|
+
const envPath = path3.join(process.cwd(), ".env.development");
|
|
1644
|
+
await fsExtra2.ensureFile(envPath);
|
|
1162
1645
|
const fileEnvService = new FileEnvService(envPath);
|
|
1163
1646
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1164
1647
|
}
|
|
1165
1648
|
getFirstExistingFile(files) {
|
|
1166
1649
|
for (const f of files) {
|
|
1167
|
-
if (
|
|
1650
|
+
if (fs4__default__default.existsSync(f)) {
|
|
1168
1651
|
return f;
|
|
1169
1652
|
}
|
|
1170
1653
|
}
|
|
@@ -1174,18 +1657,22 @@ var FileService = class {
|
|
|
1174
1657
|
filePath,
|
|
1175
1658
|
replacements
|
|
1176
1659
|
}) {
|
|
1177
|
-
let fileContent =
|
|
1660
|
+
let fileContent = fs4__default__default.readFileSync(filePath, "utf8");
|
|
1178
1661
|
replacements.forEach(({ search, replace }) => {
|
|
1179
1662
|
fileContent = fileContent.replaceAll(search, replace);
|
|
1180
1663
|
});
|
|
1181
|
-
|
|
1664
|
+
fs4__default__default.writeFileSync(filePath, fileContent);
|
|
1665
|
+
}
|
|
1666
|
+
};
|
|
1667
|
+
var exec2 = util.promisify(child_process.exec);
|
|
1668
|
+
var getAISDKPackageVersion = (llmProvider) => {
|
|
1669
|
+
switch (llmProvider) {
|
|
1670
|
+
case "cerebras":
|
|
1671
|
+
return "^0.2.14";
|
|
1672
|
+
default:
|
|
1673
|
+
return "^1.0.0";
|
|
1182
1674
|
}
|
|
1183
1675
|
};
|
|
1184
|
-
createLogger({
|
|
1185
|
-
name: "Mastra CLI",
|
|
1186
|
-
level: "debug"
|
|
1187
|
-
});
|
|
1188
|
-
var exec = util.promisify(child_process.exec);
|
|
1189
1676
|
var getAISDKPackage = (llmProvider) => {
|
|
1190
1677
|
switch (llmProvider) {
|
|
1191
1678
|
case "openai":
|
|
@@ -1198,6 +1685,8 @@ var getAISDKPackage = (llmProvider) => {
|
|
|
1198
1685
|
return "@ai-sdk/google";
|
|
1199
1686
|
case "cerebras":
|
|
1200
1687
|
return "@ai-sdk/cerebras";
|
|
1688
|
+
case "mistral":
|
|
1689
|
+
return "@ai-sdk/mistral";
|
|
1201
1690
|
default:
|
|
1202
1691
|
return "@ai-sdk/openai";
|
|
1203
1692
|
}
|
|
@@ -1207,7 +1696,7 @@ var getProviderImportAndModelItem = (llmProvider) => {
|
|
|
1207
1696
|
let modelItem = "";
|
|
1208
1697
|
if (llmProvider === "openai") {
|
|
1209
1698
|
providerImport = `import { openai } from '${getAISDKPackage(llmProvider)}';`;
|
|
1210
|
-
modelItem = `openai('gpt-4o')`;
|
|
1699
|
+
modelItem = `openai('gpt-4o-mini')`;
|
|
1211
1700
|
} else if (llmProvider === "anthropic") {
|
|
1212
1701
|
providerImport = `import { anthropic } from '${getAISDKPackage(llmProvider)}';`;
|
|
1213
1702
|
modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
|
|
@@ -1216,24 +1705,29 @@ var getProviderImportAndModelItem = (llmProvider) => {
|
|
|
1216
1705
|
modelItem = `groq('llama-3.3-70b-versatile')`;
|
|
1217
1706
|
} else if (llmProvider === "google") {
|
|
1218
1707
|
providerImport = `import { google } from '${getAISDKPackage(llmProvider)}';`;
|
|
1219
|
-
modelItem = `google('gemini-
|
|
1708
|
+
modelItem = `google('gemini-2.5-pro')`;
|
|
1220
1709
|
} else if (llmProvider === "cerebras") {
|
|
1221
1710
|
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1222
1711
|
modelItem = `cerebras('llama-3.3-70b')`;
|
|
1712
|
+
} else if (llmProvider === "mistral") {
|
|
1713
|
+
providerImport = `import { mistral } from '${getAISDKPackage(llmProvider)}';`;
|
|
1714
|
+
modelItem = `mistral('mistral-medium-2508')`;
|
|
1223
1715
|
}
|
|
1224
1716
|
return { providerImport, modelItem };
|
|
1225
1717
|
};
|
|
1226
1718
|
async function writeAgentSample(llmProvider, destPath, addExampleTool) {
|
|
1227
1719
|
const { providerImport, modelItem } = getProviderImportAndModelItem(llmProvider);
|
|
1228
1720
|
const instructions = `
|
|
1229
|
-
You are a helpful weather assistant that provides accurate weather information.
|
|
1721
|
+
You are a helpful weather assistant that provides accurate weather information and can help planning activities based on the weather.
|
|
1230
1722
|
|
|
1231
1723
|
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1232
1724
|
- Always ask for a location if none is provided
|
|
1233
|
-
- If the location name isn
|
|
1725
|
+
- If the location name isn't in English, please translate it
|
|
1234
1726
|
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1235
1727
|
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1236
1728
|
- Keep responses concise but informative
|
|
1729
|
+
- If the user asks for activities and provides the weather forecast, suggest activities based on the weather forecast.
|
|
1730
|
+
- If the user asks for activities, respond in the format they request.
|
|
1237
1731
|
|
|
1238
1732
|
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1239
1733
|
`;
|
|
@@ -1242,7 +1736,7 @@ ${providerImport}
|
|
|
1242
1736
|
import { Agent } from '@mastra/core/agent';
|
|
1243
1737
|
import { Memory } from '@mastra/memory';
|
|
1244
1738
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1245
|
-
${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
|
|
1739
|
+
${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
|
|
1246
1740
|
|
|
1247
1741
|
export const weatherAgent = new Agent({
|
|
1248
1742
|
name: 'Weather Agent',
|
|
@@ -1252,14 +1746,7 @@ export const weatherAgent = new Agent({
|
|
|
1252
1746
|
memory: new Memory({
|
|
1253
1747
|
storage: new LibSQLStore({
|
|
1254
1748
|
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
|
-
}
|
|
1749
|
+
})
|
|
1263
1750
|
})
|
|
1264
1751
|
});
|
|
1265
1752
|
`;
|
|
@@ -1267,142 +1754,159 @@ export const weatherAgent = new Agent({
|
|
|
1267
1754
|
parser: "typescript",
|
|
1268
1755
|
singleQuote: true
|
|
1269
1756
|
});
|
|
1270
|
-
await
|
|
1271
|
-
await
|
|
1757
|
+
await fs.writeFile(destPath, "");
|
|
1758
|
+
await fs.writeFile(destPath, formattedContent);
|
|
1272
1759
|
}
|
|
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';
|
|
1760
|
+
async function writeWorkflowSample(destPath) {
|
|
1761
|
+
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1278
1762
|
import { z } from 'zod';
|
|
1279
1763
|
|
|
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
|
-
});
|
|
1764
|
+
const forecastSchema = z.object({
|
|
1765
|
+
date: z.string(),
|
|
1766
|
+
maxTemp: z.number(),
|
|
1767
|
+
minTemp: z.number(),
|
|
1768
|
+
precipitationChance: z.number(),
|
|
1769
|
+
condition: z.string(),
|
|
1770
|
+
location: z.string(),
|
|
1771
|
+
})
|
|
1329
1772
|
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1773
|
+
function getWeatherCondition(code: number): string {
|
|
1774
|
+
const conditions: Record<number, string> = {
|
|
1775
|
+
0: 'Clear sky',
|
|
1776
|
+
1: 'Mainly clear',
|
|
1777
|
+
2: 'Partly cloudy',
|
|
1778
|
+
3: 'Overcast',
|
|
1779
|
+
45: 'Foggy',
|
|
1780
|
+
48: 'Depositing rime fog',
|
|
1781
|
+
51: 'Light drizzle',
|
|
1782
|
+
53: 'Moderate drizzle',
|
|
1783
|
+
55: 'Dense drizzle',
|
|
1784
|
+
61: 'Slight rain',
|
|
1785
|
+
63: 'Moderate rain',
|
|
1786
|
+
65: 'Heavy rain',
|
|
1787
|
+
71: 'Slight snow fall',
|
|
1788
|
+
73: 'Moderate snow fall',
|
|
1789
|
+
75: 'Heavy snow fall',
|
|
1790
|
+
95: 'Thunderstorm',
|
|
1791
|
+
}
|
|
1792
|
+
return conditions[code] || 'Unknown'
|
|
1793
|
+
}
|
|
1340
1794
|
|
|
1341
|
-
const fetchWeather =
|
|
1795
|
+
const fetchWeather = createStep({
|
|
1342
1796
|
id: 'fetch-weather',
|
|
1343
1797
|
description: 'Fetches weather forecast for a given city',
|
|
1344
1798
|
inputSchema: z.object({
|
|
1345
1799
|
city: z.string().describe('The city to get the weather for'),
|
|
1346
1800
|
}),
|
|
1347
1801
|
outputSchema: forecastSchema,
|
|
1348
|
-
execute: async ({
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
if (!triggerData) {
|
|
1352
|
-
throw new Error('Trigger data not found');
|
|
1802
|
+
execute: async ({ inputData }) => {
|
|
1803
|
+
if (!inputData) {
|
|
1804
|
+
throw new Error('Input data not found');
|
|
1353
1805
|
}
|
|
1354
1806
|
|
|
1355
|
-
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(
|
|
1807
|
+
const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(inputData.city)}&count=1\`;
|
|
1356
1808
|
const geocodingResponse = await fetch(geocodingUrl);
|
|
1357
1809
|
const geocodingData = (await geocodingResponse.json()) as {
|
|
1358
1810
|
results: { latitude: number; longitude: number; name: string }[];
|
|
1359
1811
|
};
|
|
1360
1812
|
|
|
1361
1813
|
if (!geocodingData.results?.[0]) {
|
|
1362
|
-
throw new Error(\`Location '\${
|
|
1814
|
+
throw new Error(\`Location '\${inputData.city}' not found\`);
|
|
1363
1815
|
}
|
|
1364
1816
|
|
|
1365
1817
|
const { latitude, longitude, name } = geocodingData.results[0];
|
|
1366
1818
|
|
|
1367
|
-
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}&
|
|
1819
|
+
const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}¤t=precipitation,weathercode&timezone=auto,&hourly=precipitation_probability,temperature_2m\`;
|
|
1368
1820
|
const response = await fetch(weatherUrl);
|
|
1369
1821
|
const data = (await response.json()) as {
|
|
1370
|
-
|
|
1371
|
-
time: string
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1822
|
+
current: {
|
|
1823
|
+
time: string
|
|
1824
|
+
precipitation: number
|
|
1825
|
+
weathercode: number
|
|
1826
|
+
}
|
|
1827
|
+
hourly: {
|
|
1828
|
+
precipitation_probability: number[]
|
|
1829
|
+
temperature_2m: number[]
|
|
1830
|
+
}
|
|
1831
|
+
}
|
|
1378
1832
|
|
|
1379
|
-
const forecast =
|
|
1380
|
-
date,
|
|
1381
|
-
maxTemp: data.
|
|
1382
|
-
minTemp: data.
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1833
|
+
const forecast = {
|
|
1834
|
+
date: new Date().toISOString(),
|
|
1835
|
+
maxTemp: Math.max(...data.hourly.temperature_2m),
|
|
1836
|
+
minTemp: Math.min(...data.hourly.temperature_2m),
|
|
1837
|
+
condition: getWeatherCondition(data.current.weathercode),
|
|
1838
|
+
precipitationChance: data.hourly.precipitation_probability.reduce(
|
|
1839
|
+
(acc, curr) => Math.max(acc, curr),
|
|
1840
|
+
0
|
|
1841
|
+
),
|
|
1842
|
+
location: name
|
|
1843
|
+
}
|
|
1387
1844
|
|
|
1388
1845
|
return forecast;
|
|
1389
1846
|
},
|
|
1390
1847
|
});
|
|
1391
1848
|
|
|
1392
1849
|
|
|
1393
|
-
const planActivities =
|
|
1850
|
+
const planActivities = createStep({
|
|
1394
1851
|
id: 'plan-activities',
|
|
1395
1852
|
description: 'Suggests activities based on weather conditions',
|
|
1396
|
-
|
|
1397
|
-
|
|
1853
|
+
inputSchema: forecastSchema,
|
|
1854
|
+
outputSchema: z.object({
|
|
1855
|
+
activities: z.string(),
|
|
1856
|
+
}),
|
|
1857
|
+
execute: async ({ inputData, mastra }) => {
|
|
1858
|
+
const forecast = inputData
|
|
1859
|
+
|
|
1860
|
+
if (!forecast) {
|
|
1861
|
+
throw new Error('Forecast data not found')
|
|
1862
|
+
}
|
|
1398
1863
|
|
|
1399
|
-
|
|
1400
|
-
|
|
1864
|
+
const agent = mastra?.getAgent('weatherAgent');
|
|
1865
|
+
if (!agent) {
|
|
1866
|
+
throw new Error('Weather agent not found');
|
|
1401
1867
|
}
|
|
1402
1868
|
|
|
1403
|
-
const prompt = \`Based on the following weather forecast for \${forecast
|
|
1869
|
+
const prompt = \`Based on the following weather forecast for \${forecast.location}, suggest appropriate activities:
|
|
1404
1870
|
\${JSON.stringify(forecast, null, 2)}
|
|
1405
|
-
|
|
1871
|
+
For each day in the forecast, structure your response exactly as follows:
|
|
1872
|
+
|
|
1873
|
+
\u{1F4C5} [Day, Month Date, Year]
|
|
1874
|
+
\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
|
|
1875
|
+
|
|
1876
|
+
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1877
|
+
\u2022 Conditions: [brief description]
|
|
1878
|
+
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1879
|
+
\u2022 Precipitation: [X% chance]
|
|
1880
|
+
|
|
1881
|
+
\u{1F305} MORNING ACTIVITIES
|
|
1882
|
+
Outdoor:
|
|
1883
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1884
|
+
Best timing: [specific time range]
|
|
1885
|
+
Note: [relevant weather consideration]
|
|
1886
|
+
|
|
1887
|
+
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1888
|
+
Outdoor:
|
|
1889
|
+
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1890
|
+
Best timing: [specific time range]
|
|
1891
|
+
Note: [relevant weather consideration]
|
|
1892
|
+
|
|
1893
|
+
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1894
|
+
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1895
|
+
Ideal for: [weather condition that would trigger this alternative]
|
|
1896
|
+
|
|
1897
|
+
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1898
|
+
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1899
|
+
|
|
1900
|
+
Guidelines:
|
|
1901
|
+
- Suggest 2-3 time-specific outdoor activities per day
|
|
1902
|
+
- Include 1-2 indoor backup options
|
|
1903
|
+
- For precipitation >50%, lead with indoor activities
|
|
1904
|
+
- All activities must be specific to the location
|
|
1905
|
+
- Include specific venues, trails, or locations
|
|
1906
|
+
- Consider activity intensity based on temperature
|
|
1907
|
+
- Keep descriptions concise but informative
|
|
1908
|
+
|
|
1909
|
+
Maintain this exact formatting for consistency, using the emoji and section headers as shown.\`;
|
|
1406
1910
|
|
|
1407
1911
|
const response = await agent.stream([
|
|
1408
1912
|
{
|
|
@@ -1412,7 +1916,7 @@ const planActivities = new Step({
|
|
|
1412
1916
|
]);
|
|
1413
1917
|
|
|
1414
1918
|
let activitiesText = '';
|
|
1415
|
-
|
|
1919
|
+
|
|
1416
1920
|
for await (const chunk of response.textStream) {
|
|
1417
1921
|
process.stdout.write(chunk);
|
|
1418
1922
|
activitiesText += chunk;
|
|
@@ -1424,35 +1928,16 @@ const planActivities = new Step({
|
|
|
1424
1928
|
},
|
|
1425
1929
|
});
|
|
1426
1930
|
|
|
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({
|
|
1931
|
+
const weatherWorkflow = createWorkflow({
|
|
1932
|
+
id: 'weather-workflow',
|
|
1933
|
+
inputSchema: z.object({
|
|
1452
1934
|
city: z.string().describe('The city to get the weather for'),
|
|
1453
1935
|
}),
|
|
1936
|
+
outputSchema: z.object({
|
|
1937
|
+
activities: z.string(),
|
|
1938
|
+
})
|
|
1454
1939
|
})
|
|
1455
|
-
.
|
|
1940
|
+
.then(fetchWeather)
|
|
1456
1941
|
.then(planActivities);
|
|
1457
1942
|
|
|
1458
1943
|
weatherWorkflow.commit();
|
|
@@ -1463,7 +1948,7 @@ export { weatherWorkflow };`;
|
|
|
1463
1948
|
semi: true,
|
|
1464
1949
|
singleQuote: true
|
|
1465
1950
|
});
|
|
1466
|
-
await
|
|
1951
|
+
await fs.writeFile(destPath, formattedContent);
|
|
1467
1952
|
}
|
|
1468
1953
|
async function writeToolSample(destPath) {
|
|
1469
1954
|
const fileService = new FileService();
|
|
@@ -1476,14 +1961,14 @@ async function writeCodeSampleForComponents(llmprovider, component, destPath, im
|
|
|
1476
1961
|
case "tools":
|
|
1477
1962
|
return writeToolSample(destPath);
|
|
1478
1963
|
case "workflows":
|
|
1479
|
-
return writeWorkflowSample(destPath
|
|
1964
|
+
return writeWorkflowSample(destPath);
|
|
1480
1965
|
default:
|
|
1481
1966
|
return "";
|
|
1482
1967
|
}
|
|
1483
1968
|
}
|
|
1484
1969
|
var createComponentsDir = async (dirPath, component) => {
|
|
1485
1970
|
const componentPath = dirPath + `/${component}`;
|
|
1486
|
-
await
|
|
1971
|
+
await fsExtra2.ensureDir(componentPath);
|
|
1487
1972
|
};
|
|
1488
1973
|
var writeIndexFile = async ({
|
|
1489
1974
|
dirPath,
|
|
@@ -1492,15 +1977,15 @@ var writeIndexFile = async ({
|
|
|
1492
1977
|
addWorkflow
|
|
1493
1978
|
}) => {
|
|
1494
1979
|
const indexPath = dirPath + "/index.ts";
|
|
1495
|
-
const destPath =
|
|
1980
|
+
const destPath = path3.join(indexPath);
|
|
1496
1981
|
try {
|
|
1497
|
-
await
|
|
1982
|
+
await fs.writeFile(destPath, "");
|
|
1498
1983
|
const filteredExports = [
|
|
1499
1984
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1500
1985
|
addAgent ? `agents: { weatherAgent },` : ""
|
|
1501
1986
|
].filter(Boolean);
|
|
1502
1987
|
if (!addExample) {
|
|
1503
|
-
await
|
|
1988
|
+
await fs.writeFile(
|
|
1504
1989
|
destPath,
|
|
1505
1990
|
`
|
|
1506
1991
|
import { Mastra } from '@mastra/core';
|
|
@@ -1510,14 +1995,14 @@ export const mastra = new Mastra()
|
|
|
1510
1995
|
);
|
|
1511
1996
|
return;
|
|
1512
1997
|
}
|
|
1513
|
-
await
|
|
1998
|
+
await fs.writeFile(
|
|
1514
1999
|
destPath,
|
|
1515
2000
|
`
|
|
1516
2001
|
import { Mastra } from '@mastra/core/mastra';
|
|
1517
|
-
import {
|
|
2002
|
+
import { PinoLogger } from '@mastra/loggers';
|
|
1518
2003
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1519
|
-
${addWorkflow ? `import { weatherWorkflow } from './workflows';` : ""}
|
|
1520
|
-
${addAgent ? `import { weatherAgent } from './agents';` : ""}
|
|
2004
|
+
${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
|
|
2005
|
+
${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
|
|
1521
2006
|
|
|
1522
2007
|
export const mastra = new Mastra({
|
|
1523
2008
|
${filteredExports.join("\n ")}
|
|
@@ -1525,7 +2010,7 @@ export const mastra = new Mastra({
|
|
|
1525
2010
|
// stores telemetry, evals, ... into memory storage, if it needs to persist, change to file:../mastra.db
|
|
1526
2011
|
url: ":memory:",
|
|
1527
2012
|
}),
|
|
1528
|
-
logger:
|
|
2013
|
+
logger: new PinoLogger({
|
|
1529
2014
|
name: 'Mastra',
|
|
1530
2015
|
level: 'info',
|
|
1531
2016
|
}),
|
|
@@ -1552,6 +2037,9 @@ var getAPIKey = async (provider) => {
|
|
|
1552
2037
|
case "cerebras":
|
|
1553
2038
|
key = "CEREBRAS_API_KEY";
|
|
1554
2039
|
return key;
|
|
2040
|
+
case "mistral":
|
|
2041
|
+
key = "MISTRAL_API_KEY";
|
|
2042
|
+
return key;
|
|
1555
2043
|
default:
|
|
1556
2044
|
return key;
|
|
1557
2045
|
}
|
|
@@ -1561,21 +2049,23 @@ var writeAPIKey = async ({
|
|
|
1561
2049
|
apiKey = "your-api-key"
|
|
1562
2050
|
}) => {
|
|
1563
2051
|
const key = await getAPIKey(provider);
|
|
1564
|
-
|
|
2052
|
+
const escapedKey = shellQuote.quote([key]);
|
|
2053
|
+
const escapedApiKey = shellQuote.quote([apiKey]);
|
|
2054
|
+
await exec2(`echo ${escapedKey}=${escapedApiKey} >> .env`);
|
|
1565
2055
|
};
|
|
1566
2056
|
var createMastraDir = async (directory) => {
|
|
1567
2057
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
1568
|
-
const dirPath =
|
|
2058
|
+
const dirPath = path3.join(process.cwd(), ...dir, "mastra");
|
|
1569
2059
|
try {
|
|
1570
|
-
await
|
|
2060
|
+
await fs.access(dirPath);
|
|
1571
2061
|
return { ok: false };
|
|
1572
2062
|
} catch {
|
|
1573
|
-
await
|
|
2063
|
+
await fsExtra2.ensureDir(dirPath);
|
|
1574
2064
|
return { ok: true, dirPath };
|
|
1575
2065
|
}
|
|
1576
2066
|
};
|
|
1577
2067
|
var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
|
|
1578
|
-
const destPath = dirPath + `/${component}/
|
|
2068
|
+
const destPath = dirPath + `/${component}/weather-${component.slice(0, -1)}.ts`;
|
|
1579
2069
|
try {
|
|
1580
2070
|
await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
|
|
1581
2071
|
} catch (err) {
|
|
@@ -1583,40 +2073,27 @@ var writeCodeSample = async (dirPath, component, llmProvider, importComponents)
|
|
|
1583
2073
|
}
|
|
1584
2074
|
};
|
|
1585
2075
|
var interactivePrompt = async () => {
|
|
1586
|
-
|
|
1587
|
-
const mastraProject = await
|
|
2076
|
+
Ie(color2.inverse(" Mastra Init "));
|
|
2077
|
+
const mastraProject = await Ce(
|
|
1588
2078
|
{
|
|
1589
|
-
directory: () =>
|
|
2079
|
+
directory: () => he({
|
|
1590
2080
|
message: "Where should we create the Mastra files? (default: src/)",
|
|
1591
2081
|
placeholder: "src/",
|
|
1592
2082
|
defaultValue: "src/"
|
|
1593
2083
|
}),
|
|
1594
|
-
|
|
1595
|
-
message: "Choose components to install:",
|
|
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({
|
|
2084
|
+
llmProvider: () => ve({
|
|
1609
2085
|
message: "Select default provider:",
|
|
1610
2086
|
options: [
|
|
1611
2087
|
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1612
2088
|
{ value: "anthropic", label: "Anthropic" },
|
|
1613
2089
|
{ value: "groq", label: "Groq" },
|
|
1614
2090
|
{ value: "google", label: "Google" },
|
|
1615
|
-
{ value: "cerebras", label: "Cerebras" }
|
|
2091
|
+
{ value: "cerebras", label: "Cerebras" },
|
|
2092
|
+
{ value: "mistral", label: "Mistral" }
|
|
1616
2093
|
]
|
|
1617
2094
|
}),
|
|
1618
2095
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
1619
|
-
const keyChoice = await
|
|
2096
|
+
const keyChoice = await ve({
|
|
1620
2097
|
message: `Enter your ${llmProvider} API key?`,
|
|
1621
2098
|
options: [
|
|
1622
2099
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
@@ -1625,21 +2102,18 @@ var interactivePrompt = async () => {
|
|
|
1625
2102
|
initialValue: "skip"
|
|
1626
2103
|
});
|
|
1627
2104
|
if (keyChoice === "enter") {
|
|
1628
|
-
return
|
|
2105
|
+
return he({
|
|
1629
2106
|
message: "Enter your API key:",
|
|
1630
2107
|
placeholder: "sk-..."
|
|
1631
2108
|
});
|
|
1632
2109
|
}
|
|
1633
2110
|
return void 0;
|
|
1634
2111
|
},
|
|
1635
|
-
addExample: () => ce({
|
|
1636
|
-
message: "Add example",
|
|
1637
|
-
initialValue: false
|
|
1638
|
-
}),
|
|
1639
2112
|
configureEditorWithDocsMCP: async () => {
|
|
1640
2113
|
const windsurfIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`windsurf`);
|
|
1641
2114
|
const cursorIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`cursor`);
|
|
1642
|
-
const
|
|
2115
|
+
const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
|
|
2116
|
+
const editor = await ve({
|
|
1643
2117
|
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
1644
2118
|
options: [
|
|
1645
2119
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
@@ -1657,24 +2131,34 @@ var interactivePrompt = async () => {
|
|
|
1657
2131
|
value: "windsurf",
|
|
1658
2132
|
label: "Windsurf",
|
|
1659
2133
|
hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
|
|
2134
|
+
},
|
|
2135
|
+
{
|
|
2136
|
+
value: "vscode",
|
|
2137
|
+
label: "VSCode",
|
|
2138
|
+
hint: vscodeIsAlreadyInstalled ? `Already installed` : void 0
|
|
1660
2139
|
}
|
|
1661
2140
|
]
|
|
1662
2141
|
});
|
|
1663
2142
|
if (editor === `skip`) return void 0;
|
|
1664
2143
|
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
1665
|
-
|
|
2144
|
+
M.message(`
|
|
1666
2145
|
Windsurf is already installed, skipping.`);
|
|
1667
2146
|
return void 0;
|
|
1668
2147
|
}
|
|
2148
|
+
if (editor === `vscode` && vscodeIsAlreadyInstalled) {
|
|
2149
|
+
M.message(`
|
|
2150
|
+
VSCode is already installed, skipping.`);
|
|
2151
|
+
return void 0;
|
|
2152
|
+
}
|
|
1669
2153
|
if (editor === `cursor`) {
|
|
1670
|
-
|
|
2154
|
+
M.message(
|
|
1671
2155
|
`
|
|
1672
2156
|
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1673
2157
|
`
|
|
1674
2158
|
);
|
|
1675
2159
|
}
|
|
1676
2160
|
if (editor === `cursor-global`) {
|
|
1677
|
-
const confirm2 = await
|
|
2161
|
+
const confirm2 = await ve({
|
|
1678
2162
|
message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
|
|
1679
2163
|
options: [
|
|
1680
2164
|
{ value: "yes", label: "Yes, I understand" },
|
|
@@ -1686,7 +2170,7 @@ Note: you will need to go into Cursor Settings -> MCP Settings and manually enab
|
|
|
1686
2170
|
}
|
|
1687
2171
|
}
|
|
1688
2172
|
if (editor === `windsurf`) {
|
|
1689
|
-
const confirm2 = await
|
|
2173
|
+
const confirm2 = await ve({
|
|
1690
2174
|
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
1691
2175
|
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
1692
2176
|
options: [
|
|
@@ -1703,17 +2187,15 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
1703
2187
|
},
|
|
1704
2188
|
{
|
|
1705
2189
|
onCancel: () => {
|
|
1706
|
-
|
|
2190
|
+
xe("Operation cancelled.");
|
|
1707
2191
|
process.exit(0);
|
|
1708
2192
|
}
|
|
1709
2193
|
}
|
|
1710
2194
|
);
|
|
1711
|
-
|
|
1712
|
-
const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
|
|
1713
|
-
return { ...rest, components: mastraComponents };
|
|
2195
|
+
return mastraProject;
|
|
1714
2196
|
};
|
|
1715
|
-
var s =
|
|
1716
|
-
var
|
|
2197
|
+
var s = Y();
|
|
2198
|
+
var exec3 = util.promisify(child_process.exec);
|
|
1717
2199
|
var init = async ({
|
|
1718
2200
|
directory,
|
|
1719
2201
|
addExample = false,
|
|
@@ -1755,13 +2237,18 @@ var init = async ({
|
|
|
1755
2237
|
if (needsMemory) {
|
|
1756
2238
|
await depService.installPackages(["@mastra/memory"]);
|
|
1757
2239
|
}
|
|
2240
|
+
const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
|
|
2241
|
+
if (needsLoggers) {
|
|
2242
|
+
await depService.installPackages(["@mastra/loggers"]);
|
|
2243
|
+
}
|
|
1758
2244
|
}
|
|
1759
2245
|
const key = await getAPIKey(llmProvider || "openai");
|
|
1760
2246
|
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
2247
|
+
const aiSdkPackageVersion = getAISDKPackageVersion(llmProvider);
|
|
1761
2248
|
const depsService = new DepsService();
|
|
1762
2249
|
const pm = depsService.packageManager;
|
|
1763
|
-
const installCommand =
|
|
1764
|
-
await
|
|
2250
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
2251
|
+
await exec3(`${pm} ${installCommand} ${aiSdkPackage}@${aiSdkPackageVersion}`);
|
|
1765
2252
|
if (configureEditorWithDocsMCP) {
|
|
1766
2253
|
await installMastraDocsMCPServer({
|
|
1767
2254
|
editor: configureEditorWithDocsMCP,
|
|
@@ -1770,14 +2257,14 @@ var init = async ({
|
|
|
1770
2257
|
}
|
|
1771
2258
|
s.stop();
|
|
1772
2259
|
if (!llmApiKey) {
|
|
1773
|
-
|
|
2260
|
+
Me(`
|
|
1774
2261
|
${color2.green("Mastra initialized successfully!")}
|
|
1775
2262
|
|
|
1776
2263
|
Add your ${color2.cyan(key)} as an environment variable
|
|
1777
|
-
in your ${color2.cyan(".env
|
|
2264
|
+
in your ${color2.cyan(".env")} file
|
|
1778
2265
|
`);
|
|
1779
2266
|
} else {
|
|
1780
|
-
|
|
2267
|
+
Me(`
|
|
1781
2268
|
${color2.green("Mastra initialized successfully!")}
|
|
1782
2269
|
`);
|
|
1783
2270
|
}
|
|
@@ -1788,10 +2275,10 @@ var init = async ({
|
|
|
1788
2275
|
return { success: false };
|
|
1789
2276
|
}
|
|
1790
2277
|
};
|
|
1791
|
-
var
|
|
2278
|
+
var exec4 = util.promisify(child_process.exec);
|
|
1792
2279
|
var execWithTimeout = async (command, timeoutMs) => {
|
|
1793
2280
|
try {
|
|
1794
|
-
const promise =
|
|
2281
|
+
const promise = exec4(command, { killSignal: "SIGTERM" });
|
|
1795
2282
|
if (!timeoutMs) {
|
|
1796
2283
|
return await promise;
|
|
1797
2284
|
}
|
|
@@ -1811,23 +2298,29 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
1811
2298
|
throw error;
|
|
1812
2299
|
}
|
|
1813
2300
|
} catch (error) {
|
|
1814
|
-
console.error(error);
|
|
1815
2301
|
throw error;
|
|
1816
2302
|
}
|
|
1817
2303
|
};
|
|
1818
2304
|
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
1819
|
-
let installCommand =
|
|
2305
|
+
let installCommand = getPackageManagerAddCommand(pm);
|
|
1820
2306
|
if (isDev) {
|
|
1821
|
-
installCommand = `${installCommand}
|
|
2307
|
+
installCommand = `${installCommand} -D`;
|
|
1822
2308
|
}
|
|
1823
2309
|
try {
|
|
1824
2310
|
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
1825
2311
|
} catch (err) {
|
|
1826
|
-
console.log("err", err);
|
|
1827
2312
|
if (versionTag === "@latest") {
|
|
1828
|
-
throw
|
|
2313
|
+
throw new Error(
|
|
2314
|
+
`Failed to install ${dependency}@latest: ${err instanceof Error ? err.message : "Unknown error"}`
|
|
2315
|
+
);
|
|
2316
|
+
}
|
|
2317
|
+
try {
|
|
2318
|
+
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
2319
|
+
} catch (fallbackErr) {
|
|
2320
|
+
throw new Error(
|
|
2321
|
+
`Failed to install ${dependency} (tried ${versionTag} and @latest): ${fallbackErr instanceof Error ? fallbackErr.message : "Unknown error"}`
|
|
2322
|
+
);
|
|
1829
2323
|
}
|
|
1830
|
-
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
1831
2324
|
}
|
|
1832
2325
|
}
|
|
1833
2326
|
var createMastraProject = async ({
|
|
@@ -1835,45 +2328,55 @@ var createMastraProject = async ({
|
|
|
1835
2328
|
createVersionTag,
|
|
1836
2329
|
timeout
|
|
1837
2330
|
}) => {
|
|
1838
|
-
|
|
1839
|
-
const projectName = name ?? await
|
|
2331
|
+
Ie(color2.inverse(" Mastra Create "));
|
|
2332
|
+
const projectName = name ?? await he({
|
|
1840
2333
|
message: "What do you want to name your project?",
|
|
1841
2334
|
placeholder: "my-mastra-app",
|
|
1842
2335
|
defaultValue: "my-mastra-app"
|
|
1843
2336
|
});
|
|
1844
|
-
if (
|
|
1845
|
-
|
|
2337
|
+
if (pD(projectName)) {
|
|
2338
|
+
xe("Operation cancelled");
|
|
1846
2339
|
process.exit(0);
|
|
1847
2340
|
}
|
|
1848
|
-
const s2 =
|
|
1849
|
-
s2.start("Creating project");
|
|
2341
|
+
const s2 = Y();
|
|
1850
2342
|
try {
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
2343
|
+
s2.start("Creating project");
|
|
2344
|
+
try {
|
|
2345
|
+
await fs.mkdir(projectName);
|
|
2346
|
+
} catch (error) {
|
|
2347
|
+
if (error instanceof Error && "code" in error && error.code === "EEXIST") {
|
|
2348
|
+
s2.stop(`A directory named "${projectName}" already exists. Please choose a different name.`);
|
|
2349
|
+
process.exit(1);
|
|
2350
|
+
}
|
|
2351
|
+
throw new Error(
|
|
2352
|
+
`Failed to create project directory: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
1856
2353
|
);
|
|
1857
|
-
process.exit(1);
|
|
1858
2354
|
}
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
2355
|
+
process.chdir(projectName);
|
|
2356
|
+
const pm = getPackageManager();
|
|
2357
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
2358
|
+
s2.message("Initializing project structure");
|
|
2359
|
+
try {
|
|
2360
|
+
await exec4(`npm init -y`);
|
|
2361
|
+
await exec4(`npm pkg set type="module"`);
|
|
2362
|
+
await exec4(`npm pkg set engines.node=">=20.9.0"`);
|
|
2363
|
+
const depsService = new DepsService();
|
|
2364
|
+
await depsService.addScriptsToPackageJson({
|
|
2365
|
+
dev: "mastra dev",
|
|
2366
|
+
build: "mastra build",
|
|
2367
|
+
start: "mastra start"
|
|
2368
|
+
});
|
|
2369
|
+
} catch (error) {
|
|
2370
|
+
throw new Error(
|
|
2371
|
+
`Failed to initialize project structure: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2372
|
+
);
|
|
2373
|
+
}
|
|
2374
|
+
s2.stop("Project structure created");
|
|
2375
|
+
s2.start(`Installing ${pm} dependencies`);
|
|
2376
|
+
try {
|
|
2377
|
+
await exec4(`${pm} ${installCommand} zod@^3`);
|
|
2378
|
+
await exec4(`${pm} ${installCommand} typescript @types/node --save-dev`);
|
|
2379
|
+
await exec4(`echo '{
|
|
1877
2380
|
"compilerOptions": {
|
|
1878
2381
|
"target": "ES2022",
|
|
1879
2382
|
"module": "ES2022",
|
|
@@ -1889,31 +2392,60 @@ var createMastraProject = async ({
|
|
|
1889
2392
|
"src/**/*"
|
|
1890
2393
|
]
|
|
1891
2394
|
}' > 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
|
-
|
|
2395
|
+
} catch (error) {
|
|
2396
|
+
throw new Error(
|
|
2397
|
+
`Failed to install basic dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2398
|
+
);
|
|
2399
|
+
}
|
|
2400
|
+
s2.stop(`${pm} dependencies installed`);
|
|
2401
|
+
s2.start("Installing mastra");
|
|
2402
|
+
const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
|
|
2403
|
+
try {
|
|
2404
|
+
await installMastraDependency(pm, "mastra", versionTag, true, timeout);
|
|
2405
|
+
} catch (error) {
|
|
2406
|
+
throw new Error(`Failed to install Mastra CLI: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2407
|
+
}
|
|
2408
|
+
s2.stop("mastra installed");
|
|
2409
|
+
s2.start("Installing dependencies");
|
|
2410
|
+
try {
|
|
2411
|
+
await installMastraDependency(pm, "@mastra/core", versionTag, false, timeout);
|
|
2412
|
+
await installMastraDependency(pm, "@mastra/libsql", versionTag, false, timeout);
|
|
2413
|
+
await installMastraDependency(pm, "@mastra/memory", versionTag, false, timeout);
|
|
2414
|
+
} catch (error) {
|
|
2415
|
+
throw new Error(
|
|
2416
|
+
`Failed to install Mastra dependencies: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
2417
|
+
);
|
|
2418
|
+
}
|
|
2419
|
+
s2.stop("Mastra dependencies installed");
|
|
2420
|
+
s2.start("Adding .gitignore");
|
|
2421
|
+
try {
|
|
2422
|
+
await exec4(`echo output.txt >> .gitignore`);
|
|
2423
|
+
await exec4(`echo node_modules >> .gitignore`);
|
|
2424
|
+
await exec4(`echo dist >> .gitignore`);
|
|
2425
|
+
await exec4(`echo .mastra >> .gitignore`);
|
|
2426
|
+
await exec4(`echo .env.development >> .gitignore`);
|
|
2427
|
+
await exec4(`echo .env >> .gitignore`);
|
|
2428
|
+
await exec4(`echo *.db >> .gitignore`);
|
|
2429
|
+
await exec4(`echo *.db-* >> .gitignore`);
|
|
2430
|
+
} catch (error) {
|
|
2431
|
+
throw new Error(`Failed to create .gitignore: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2432
|
+
}
|
|
2433
|
+
s2.stop(".gitignore added");
|
|
2434
|
+
Se("Project created successfully");
|
|
2435
|
+
console.log("");
|
|
2436
|
+
return { projectName };
|
|
2437
|
+
} catch (error) {
|
|
2438
|
+
s2.stop();
|
|
2439
|
+
const errorMessage = error instanceof Error ? error.message : "An unexpected error occurred";
|
|
2440
|
+
xe(`Project creation failed: ${errorMessage}`);
|
|
2441
|
+
process.exit(1);
|
|
2442
|
+
}
|
|
1915
2443
|
};
|
|
1916
2444
|
var create = async (args2) => {
|
|
2445
|
+
if (args2.template !== void 0) {
|
|
2446
|
+
await createFromTemplate({ ...args2, injectedAnalytics: args2.analytics });
|
|
2447
|
+
return;
|
|
2448
|
+
}
|
|
1917
2449
|
const { projectName } = await createMastraProject({
|
|
1918
2450
|
projectName: args2?.projectName,
|
|
1919
2451
|
createVersionTag: args2?.createVersionTag,
|
|
@@ -1924,7 +2456,9 @@ var create = async (args2) => {
|
|
|
1924
2456
|
const result = await interactivePrompt();
|
|
1925
2457
|
await init({
|
|
1926
2458
|
...result,
|
|
1927
|
-
llmApiKey: result?.llmApiKey
|
|
2459
|
+
llmApiKey: result?.llmApiKey,
|
|
2460
|
+
components: ["agents", "tools", "workflows"],
|
|
2461
|
+
addExample: true
|
|
1928
2462
|
});
|
|
1929
2463
|
postCreate({ projectName });
|
|
1930
2464
|
return;
|
|
@@ -1935,23 +2469,179 @@ var create = async (args2) => {
|
|
|
1935
2469
|
components,
|
|
1936
2470
|
llmProvider,
|
|
1937
2471
|
addExample,
|
|
1938
|
-
llmApiKey
|
|
2472
|
+
llmApiKey,
|
|
2473
|
+
configureEditorWithDocsMCP: args2.mcpServer
|
|
1939
2474
|
});
|
|
1940
2475
|
postCreate({ projectName });
|
|
1941
2476
|
};
|
|
1942
2477
|
var postCreate = ({ projectName }) => {
|
|
1943
|
-
|
|
2478
|
+
const packageManager = getPackageManager();
|
|
2479
|
+
Se(`
|
|
1944
2480
|
${color2.green("To start your project:")}
|
|
1945
2481
|
|
|
1946
2482
|
${color2.cyan("cd")} ${projectName}
|
|
1947
|
-
${color2.cyan(
|
|
2483
|
+
${color2.cyan(`${packageManager} run dev`)}
|
|
1948
2484
|
`);
|
|
1949
2485
|
};
|
|
2486
|
+
function isGitHubUrl(url) {
|
|
2487
|
+
try {
|
|
2488
|
+
const parsedUrl = new URL(url);
|
|
2489
|
+
return parsedUrl.hostname === "github.com" && parsedUrl.pathname.split("/").length >= 3;
|
|
2490
|
+
} catch {
|
|
2491
|
+
return false;
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
async function validateGitHubProject(githubUrl) {
|
|
2495
|
+
const errors = [];
|
|
2496
|
+
try {
|
|
2497
|
+
const urlParts = new URL(githubUrl).pathname.split("/").filter(Boolean);
|
|
2498
|
+
const owner = urlParts[0];
|
|
2499
|
+
const repo = urlParts[1]?.replace(".git", "");
|
|
2500
|
+
if (!owner || !repo) {
|
|
2501
|
+
throw new Error("Invalid GitHub URL format");
|
|
2502
|
+
}
|
|
2503
|
+
const branches = ["main", "master"];
|
|
2504
|
+
let packageJsonContent = null;
|
|
2505
|
+
let indexContent = null;
|
|
2506
|
+
for (const branch of branches) {
|
|
2507
|
+
try {
|
|
2508
|
+
const packageJsonUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/package.json`;
|
|
2509
|
+
const packageJsonResponse = await fetch(packageJsonUrl);
|
|
2510
|
+
if (packageJsonResponse.ok) {
|
|
2511
|
+
packageJsonContent = await packageJsonResponse.text();
|
|
2512
|
+
const indexUrl = `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/src/mastra/index.ts`;
|
|
2513
|
+
const indexResponse = await fetch(indexUrl);
|
|
2514
|
+
if (indexResponse.ok) {
|
|
2515
|
+
indexContent = await indexResponse.text();
|
|
2516
|
+
}
|
|
2517
|
+
break;
|
|
2518
|
+
}
|
|
2519
|
+
} catch {
|
|
2520
|
+
}
|
|
2521
|
+
}
|
|
2522
|
+
if (!packageJsonContent) {
|
|
2523
|
+
errors.push("Could not fetch package.json from repository");
|
|
2524
|
+
return { isValid: false, errors };
|
|
2525
|
+
}
|
|
2526
|
+
try {
|
|
2527
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
2528
|
+
const hasMastraCore = packageJson.dependencies?.["@mastra/core"] || packageJson.devDependencies?.["@mastra/core"] || packageJson.peerDependencies?.["@mastra/core"];
|
|
2529
|
+
if (!hasMastraCore) {
|
|
2530
|
+
errors.push("Missing @mastra/core dependency in package.json");
|
|
2531
|
+
}
|
|
2532
|
+
} catch {
|
|
2533
|
+
errors.push("Invalid package.json format");
|
|
2534
|
+
}
|
|
2535
|
+
if (!indexContent) {
|
|
2536
|
+
errors.push("Missing src/mastra/index.ts file");
|
|
2537
|
+
} else {
|
|
2538
|
+
const hasMastraExport = indexContent.includes("export") && (indexContent.includes("new Mastra") || indexContent.includes("Mastra("));
|
|
2539
|
+
if (!hasMastraExport) {
|
|
2540
|
+
errors.push("src/mastra/index.ts does not export a Mastra instance");
|
|
2541
|
+
}
|
|
2542
|
+
}
|
|
2543
|
+
return { isValid: errors.length === 0, errors };
|
|
2544
|
+
} catch (error) {
|
|
2545
|
+
errors.push(`Failed to validate GitHub repository: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2546
|
+
return { isValid: false, errors };
|
|
2547
|
+
}
|
|
2548
|
+
}
|
|
2549
|
+
async function createFromGitHubUrl(url) {
|
|
2550
|
+
const urlParts = new URL(url).pathname.split("/").filter(Boolean);
|
|
2551
|
+
const owner = urlParts[0] || "unknown";
|
|
2552
|
+
const repo = urlParts[1] || "unknown";
|
|
2553
|
+
return {
|
|
2554
|
+
githubUrl: url,
|
|
2555
|
+
title: `${owner}/${repo}`,
|
|
2556
|
+
slug: repo,
|
|
2557
|
+
agents: [],
|
|
2558
|
+
mcp: [],
|
|
2559
|
+
tools: [],
|
|
2560
|
+
networks: [],
|
|
2561
|
+
workflows: []
|
|
2562
|
+
};
|
|
2563
|
+
}
|
|
2564
|
+
async function createFromTemplate(args2) {
|
|
2565
|
+
let selectedTemplate;
|
|
2566
|
+
if (args2.template === true) {
|
|
2567
|
+
const templates = await loadTemplates();
|
|
2568
|
+
const selected = await selectTemplate(templates);
|
|
2569
|
+
if (!selected) {
|
|
2570
|
+
M.info("No template selected. Exiting.");
|
|
2571
|
+
return;
|
|
2572
|
+
}
|
|
2573
|
+
selectedTemplate = selected;
|
|
2574
|
+
} else if (args2.template && typeof args2.template === "string") {
|
|
2575
|
+
if (isGitHubUrl(args2.template)) {
|
|
2576
|
+
const spinner5 = Y();
|
|
2577
|
+
spinner5.start("Validating GitHub repository...");
|
|
2578
|
+
const validation = await validateGitHubProject(args2.template);
|
|
2579
|
+
if (!validation.isValid) {
|
|
2580
|
+
spinner5.stop("Validation failed");
|
|
2581
|
+
M.error("This does not appear to be a valid Mastra project:");
|
|
2582
|
+
validation.errors.forEach((error) => M.error(` - ${error}`));
|
|
2583
|
+
throw new Error("Invalid Mastra project");
|
|
2584
|
+
}
|
|
2585
|
+
spinner5.stop("Valid Mastra project \u2713");
|
|
2586
|
+
selectedTemplate = await createFromGitHubUrl(args2.template);
|
|
2587
|
+
} else {
|
|
2588
|
+
const templates = await loadTemplates();
|
|
2589
|
+
const found = findTemplateByName(templates, args2.template);
|
|
2590
|
+
if (!found) {
|
|
2591
|
+
M.error(`Template "${args2.template}" not found. Available templates:`);
|
|
2592
|
+
templates.forEach((t) => M.info(` - ${t.title} (use: ${t.slug.replace("template-", "")})`));
|
|
2593
|
+
throw new Error(`Template "${args2.template}" not found`);
|
|
2594
|
+
}
|
|
2595
|
+
selectedTemplate = found;
|
|
2596
|
+
}
|
|
2597
|
+
}
|
|
2598
|
+
if (!selectedTemplate) {
|
|
2599
|
+
throw new Error("No template selected");
|
|
2600
|
+
}
|
|
2601
|
+
let projectName = args2.projectName;
|
|
2602
|
+
if (!projectName) {
|
|
2603
|
+
const defaultName = getDefaultProjectName(selectedTemplate);
|
|
2604
|
+
const response = await he({
|
|
2605
|
+
message: "What is your project name?",
|
|
2606
|
+
defaultValue: defaultName,
|
|
2607
|
+
placeholder: defaultName
|
|
2608
|
+
});
|
|
2609
|
+
if (pD(response)) {
|
|
2610
|
+
M.info("Project creation cancelled.");
|
|
2611
|
+
return;
|
|
2612
|
+
}
|
|
2613
|
+
projectName = response;
|
|
2614
|
+
}
|
|
2615
|
+
try {
|
|
2616
|
+
const analytics = args2.injectedAnalytics || getAnalytics();
|
|
2617
|
+
if (analytics) {
|
|
2618
|
+
analytics.trackEvent("cli_template_used", {
|
|
2619
|
+
template_slug: selectedTemplate.slug,
|
|
2620
|
+
template_title: selectedTemplate.title
|
|
2621
|
+
});
|
|
2622
|
+
}
|
|
2623
|
+
const projectPath = await cloneTemplate({
|
|
2624
|
+
template: selectedTemplate,
|
|
2625
|
+
projectName
|
|
2626
|
+
});
|
|
2627
|
+
await installDependencies(projectPath);
|
|
2628
|
+
Me(`
|
|
2629
|
+
${color2.green("Mastra template installed!")}
|
|
2630
|
+
|
|
2631
|
+
Add the necessary environment
|
|
2632
|
+
variables in your ${color2.cyan(".env")} file
|
|
2633
|
+
`);
|
|
2634
|
+
postCreate({ projectName });
|
|
2635
|
+
} catch (error) {
|
|
2636
|
+
M.error(`Failed to create project from template: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2637
|
+
throw error;
|
|
2638
|
+
}
|
|
2639
|
+
}
|
|
1950
2640
|
|
|
1951
2641
|
async function getPackageVersion() {
|
|
1952
2642
|
const __filename = fileURLToPath(import.meta.url);
|
|
1953
2643
|
const __dirname = dirname(__filename);
|
|
1954
|
-
const pkgJsonPath =
|
|
2644
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
1955
2645
|
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
1956
2646
|
return content.version;
|
|
1957
2647
|
}
|
|
@@ -1960,7 +2650,7 @@ async function getCreateVersionTag() {
|
|
|
1960
2650
|
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
1961
2651
|
const json = await fsExtra.readJSON(pkgPath);
|
|
1962
2652
|
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
1963
|
-
const tagLine = stdout.split("\n").find((distLine) => distLine.
|
|
2653
|
+
const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
|
|
1964
2654
|
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
1965
2655
|
return tag;
|
|
1966
2656
|
} catch {
|
|
@@ -1989,16 +2679,23 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
1989
2679
|
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
1990
2680
|
"-p, --project-name <string>",
|
|
1991
2681
|
"Project name that will be used in package.json and as the project directory name."
|
|
1992
|
-
).option("--default", "Quick start with defaults(src, OpenAI,
|
|
2682
|
+
).option("--default", "Quick start with defaults(src, OpenAI, examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, groq, google, or cerebras)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").option("-n, --no-example", "Do not include example code").option("-t, --timeout [timeout]", "Configurable timeout for package installation, defaults to 60000 ms").option("-d, --dir <directory>", "Target directory for Mastra source code (default: src/)").option("-m, --mcp <mcp>", "MCP Server for code editor (cursor, cursor-global, windsurf, vscode)").option(
|
|
2683
|
+
"--template [template-name]",
|
|
2684
|
+
"Create project from a template (use template name, public GitHub URL, or leave blank to select from list)"
|
|
2685
|
+
).action(async (projectNameArg, args) => {
|
|
1993
2686
|
const projectName = projectNameArg || args.projectName;
|
|
1994
2687
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
1995
2688
|
if (args.default) {
|
|
1996
2689
|
await create({
|
|
1997
2690
|
components: ["agents", "tools", "workflows"],
|
|
1998
2691
|
llmProvider: "openai",
|
|
1999
|
-
addExample:
|
|
2692
|
+
addExample: true,
|
|
2000
2693
|
createVersionTag,
|
|
2001
|
-
timeout
|
|
2694
|
+
timeout,
|
|
2695
|
+
mcpServer: args.mcp,
|
|
2696
|
+
directory: "src/",
|
|
2697
|
+
template: args.template,
|
|
2698
|
+
analytics
|
|
2002
2699
|
});
|
|
2003
2700
|
return;
|
|
2004
2701
|
}
|
|
@@ -2010,7 +2707,10 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2010
2707
|
createVersionTag,
|
|
2011
2708
|
timeout,
|
|
2012
2709
|
projectName,
|
|
2013
|
-
directory: args.dir
|
|
2710
|
+
directory: args.dir,
|
|
2711
|
+
mcpServer: args.mcp,
|
|
2712
|
+
template: args.template,
|
|
2713
|
+
analytics
|
|
2014
2714
|
});
|
|
2015
2715
|
});
|
|
2016
2716
|
program.parse(process.argv);
|