create-mastra 0.0.0-vector-sources-20250516175436 → 0.0.0-vector-extension-schema-20250922130418
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 +1747 -0
- package/LICENSE.md +11 -42
- package/README.md +2 -8
- package/dist/index.js +1163 -495
- package/dist/index.js.map +1 -1
- package/dist/templates/dev.entry.js +7 -7
- 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 fs5 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';
|
|
23
|
-
import
|
|
20
|
+
import { execa } from 'execa';
|
|
21
|
+
import fsExtra, { readJSON, ensureFile, writeJSON } from 'fs-extra/esm';
|
|
22
|
+
import prettier from 'prettier';
|
|
23
|
+
import fsExtra$1 from 'fs-extra';
|
|
24
24
|
|
|
25
25
|
var __filename = fileURLToPath(import.meta.url);
|
|
26
|
-
var __dirname =
|
|
26
|
+
var __dirname = path3.dirname(__filename);
|
|
27
|
+
var analyticsInstance = null;
|
|
28
|
+
function getAnalytics() {
|
|
29
|
+
return analyticsInstance;
|
|
30
|
+
}
|
|
27
31
|
var PosthogAnalytics = class {
|
|
28
32
|
sessionId;
|
|
29
33
|
client;
|
|
@@ -35,7 +39,7 @@ var PosthogAnalytics = class {
|
|
|
35
39
|
host = "https://app.posthog.com"
|
|
36
40
|
}) {
|
|
37
41
|
this.version = version;
|
|
38
|
-
const cliConfigPath =
|
|
42
|
+
const cliConfigPath = path3.join(__dirname, "mastra-cli.json");
|
|
39
43
|
if (existsSync(cliConfigPath)) {
|
|
40
44
|
try {
|
|
41
45
|
const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
|
|
@@ -63,7 +67,7 @@ var PosthogAnalytics = class {
|
|
|
63
67
|
}
|
|
64
68
|
writeCliConfig({ distinctId, sessionId }) {
|
|
65
69
|
try {
|
|
66
|
-
writeFileSync(
|
|
70
|
+
writeFileSync(path3.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
|
|
67
71
|
} catch {
|
|
68
72
|
}
|
|
69
73
|
}
|
|
@@ -113,6 +117,22 @@ var PosthogAnalytics = class {
|
|
|
113
117
|
}
|
|
114
118
|
});
|
|
115
119
|
}
|
|
120
|
+
trackEvent(eventName, properties) {
|
|
121
|
+
try {
|
|
122
|
+
if (!this.client) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.client.capture({
|
|
126
|
+
distinctId: this.distinctId,
|
|
127
|
+
event: eventName,
|
|
128
|
+
properties: {
|
|
129
|
+
...this.getSystemProperties(),
|
|
130
|
+
...properties
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
} catch {
|
|
134
|
+
}
|
|
135
|
+
}
|
|
116
136
|
trackCommand(options) {
|
|
117
137
|
try {
|
|
118
138
|
if (!this.client) {
|
|
@@ -349,72 +369,335 @@ function requirePicocolors () {
|
|
|
349
369
|
var picocolorsExports = /*@__PURE__*/ requirePicocolors();
|
|
350
370
|
var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
|
|
351
371
|
|
|
352
|
-
function q({onlyFirst:e=false}={}){const F=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(F,e?void 0:"g")}const J=q();function S(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(J,"")}function T$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var j$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(t){var s=t.charCodeAt(0),C=t.length==2?t.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=C&&C<=57343&&(s&=1023,C&=1023,D=s<<10|C,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(t){var s=this.eastAsianWidth(t);return s=="F"||s=="W"||s=="A"?2:1};function F(t){return t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(t){for(var s=F(t),C=0,D=0;D<s.length;D++)C=C+this.characterLength(s[D]);return C},u.slice=function(t,s,C){textLen=u.length(t),s=s||0,C=C||1,s<0&&(s=textLen+s),C<0&&(C=textLen+C);for(var D="",i=0,n=F(t),E=0;E<n.length;E++){var h=n[E],o=u.length(h);if(i>=s-(o==2?1:0))if(i+o<=C)D+=h;else break;i+=o;}return D};})(j$1);var Q$1=j$1.exports;const X=T$1(Q$1);var DD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const uD=T$1(DD);function A(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=S(e),e.length===0))return 0;e=e.replace(uD()," ");const F=u.ambiguousIsNarrow?1:2;let t=0;for(const s of e){const C=s.codePointAt(0);if(C<=31||C>=127&&C<=159||C>=768&&C<=879)continue;switch(X.eastAsianWidth(s)){case "F":case "W":t+=2;break;case "A":t+=F;break;default:t+=1;}}return t}const d=10,M$1=(e=0)=>u=>`\x1B[${u+e}m`,P$1=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,W=(e=0)=>(u,F,t)=>`\x1B[${38+e};2;${u};${F};${t}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const FD=Object.keys(r.color),eD=Object.keys(r.bgColor);[...FD,...eD];function tD(){const e=new Map;for(const[u,F]of Object.entries(r)){for(const[t,s]of Object.entries(F))r[t]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},F[t]=r[t],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:F,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=M$1(),r.color.ansi256=P$1(),r.color.ansi16m=W(),r.bgColor.ansi=M$1(d),r.bgColor.ansi256=P$1(d),r.bgColor.ansi16m=W(d),Object.defineProperties(r,{rgbToAnsi256:{value:(u,F,t)=>u===F&&F===t?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(F/255*5)+Math.round(t/255*5),enumerable:false},hexToRgb:{value:u=>{const F=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!F)return [0,0,0];let[t]=F;t.length===3&&(t=[...t].map(C=>C+C).join(""));const s=Number.parseInt(t,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let F,t,s;if(u>=232)F=((u-232)*10+8)/255,t=F,s=F;else {u-=16;const i=u%36;F=Math.floor(u/36)/5,t=Math.floor(i/6)/5,s=i%6/5;}const C=Math.max(F,t,s)*2;if(C===0)return 30;let D=30+(Math.round(s)<<2|Math.round(t)<<1|Math.round(F));return C===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,F,t)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,F,t)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const sD=tD(),g=new Set(["\x1B","\x9B"]),CD=39,b$1="\x07",O="[",iD="]",I$1="m",w=`${iD}8;;`,N=e=>`${g.values().next().value}${O}${e}${I$1}`,L=e=>`${g.values().next().value}${w}${e}${b$1}`,rD=e=>e.split(" ").map(u=>A(u)),y$1=(e,u,F)=>{const t=[...u];let s=false,C=false,D=A(S(e[e.length-1]));for(const[i,n]of t.entries()){const E=A(n);if(D+E<=F?e[e.length-1]+=n:(e.push(n),D=0),g.has(n)&&(s=true,C=t.slice(i+1).join("").startsWith(w)),s){C?n===b$1&&(s=false,C=false):n===I$1&&(s=false);continue}D+=E,D===F&&i<t.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},ED=e=>{const u=e.split(" ");let F=u.length;for(;F>0&&!(A(u[F-1])>0);)F--;return F===u.length?e:u.slice(0,F).join(" ")+u.slice(F).join("")},oD=(e,u,F={})=>{if(F.trim!==false&&e.trim()==="")return "";let t="",s,C;const D=rD(e);let i=[""];for(const[E,h]of e.split(" ").entries()){F.trim!==false&&(i[i.length-1]=i[i.length-1].trimStart());let o=A(i[i.length-1]);if(E!==0&&(o>=u&&(F.wordWrap===false||F.trim===false)&&(i.push(""),o=0),(o>0||F.trim===false)&&(i[i.length-1]+=" ",o++)),F.hard&&D[E]>u){const B=u-o,p=1+Math.floor((D[E]-B-1)/u);Math.floor((D[E]-1)/u)<p&&i.push(""),y$1(i,h,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(F.wordWrap===false&&o<u){y$1(i,h,u);continue}i.push("");}if(o+D[E]>u&&F.wordWrap===false){y$1(i,h,u);continue}i[i.length-1]+=h;}F.trim!==false&&(i=i.map(E=>ED(E)));const n=[...i.join(`
|
|
353
|
-
`)];for(const[E,
|
|
354
|
-
`?(
|
|
355
|
-
`&&(s&&o&&(
|
|
372
|
+
function DD({onlyFirst:e=false}={}){const t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(t,e?void 0:"g")}const uD=DD();function P$1(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return e.replace(uD,"")}function L$1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var W$1={exports:{}};(function(e){var u={};e.exports=u,u.eastAsianWidth=function(F){var s=F.charCodeAt(0),i=F.length==2?F.charCodeAt(1):0,D=s;return 55296<=s&&s<=56319&&56320<=i&&i<=57343&&(s&=1023,i&=1023,D=s<<10|i,D+=65536),D==12288||65281<=D&&D<=65376||65504<=D&&D<=65510?"F":D==8361||65377<=D&&D<=65470||65474<=D&&D<=65479||65482<=D&&D<=65487||65490<=D&&D<=65495||65498<=D&&D<=65500||65512<=D&&D<=65518?"H":4352<=D&&D<=4447||4515<=D&&D<=4519||4602<=D&&D<=4607||9001<=D&&D<=9002||11904<=D&&D<=11929||11931<=D&&D<=12019||12032<=D&&D<=12245||12272<=D&&D<=12283||12289<=D&&D<=12350||12353<=D&&D<=12438||12441<=D&&D<=12543||12549<=D&&D<=12589||12593<=D&&D<=12686||12688<=D&&D<=12730||12736<=D&&D<=12771||12784<=D&&D<=12830||12832<=D&&D<=12871||12880<=D&&D<=13054||13056<=D&&D<=19903||19968<=D&&D<=42124||42128<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||55216<=D&&D<=55238||55243<=D&&D<=55291||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65106||65108<=D&&D<=65126||65128<=D&&D<=65131||110592<=D&&D<=110593||127488<=D&&D<=127490||127504<=D&&D<=127546||127552<=D&&D<=127560||127568<=D&&D<=127569||131072<=D&&D<=194367||177984<=D&&D<=196605||196608<=D&&D<=262141?"W":32<=D&&D<=126||162<=D&&D<=163||165<=D&&D<=166||D==172||D==175||10214<=D&&D<=10221||10629<=D&&D<=10630?"Na":D==161||D==164||167<=D&&D<=168||D==170||173<=D&&D<=174||176<=D&&D<=180||182<=D&&D<=186||188<=D&&D<=191||D==198||D==208||215<=D&&D<=216||222<=D&&D<=225||D==230||232<=D&&D<=234||236<=D&&D<=237||D==240||242<=D&&D<=243||247<=D&&D<=250||D==252||D==254||D==257||D==273||D==275||D==283||294<=D&&D<=295||D==299||305<=D&&D<=307||D==312||319<=D&&D<=322||D==324||328<=D&&D<=331||D==333||338<=D&&D<=339||358<=D&&D<=359||D==363||D==462||D==464||D==466||D==468||D==470||D==472||D==474||D==476||D==593||D==609||D==708||D==711||713<=D&&D<=715||D==717||D==720||728<=D&&D<=731||D==733||D==735||768<=D&&D<=879||913<=D&&D<=929||931<=D&&D<=937||945<=D&&D<=961||963<=D&&D<=969||D==1025||1040<=D&&D<=1103||D==1105||D==8208||8211<=D&&D<=8214||8216<=D&&D<=8217||8220<=D&&D<=8221||8224<=D&&D<=8226||8228<=D&&D<=8231||D==8240||8242<=D&&D<=8243||D==8245||D==8251||D==8254||D==8308||D==8319||8321<=D&&D<=8324||D==8364||D==8451||D==8453||D==8457||D==8467||D==8470||8481<=D&&D<=8482||D==8486||D==8491||8531<=D&&D<=8532||8539<=D&&D<=8542||8544<=D&&D<=8555||8560<=D&&D<=8569||D==8585||8592<=D&&D<=8601||8632<=D&&D<=8633||D==8658||D==8660||D==8679||D==8704||8706<=D&&D<=8707||8711<=D&&D<=8712||D==8715||D==8719||D==8721||D==8725||D==8730||8733<=D&&D<=8736||D==8739||D==8741||8743<=D&&D<=8748||D==8750||8756<=D&&D<=8759||8764<=D&&D<=8765||D==8776||D==8780||D==8786||8800<=D&&D<=8801||8804<=D&&D<=8807||8810<=D&&D<=8811||8814<=D&&D<=8815||8834<=D&&D<=8835||8838<=D&&D<=8839||D==8853||D==8857||D==8869||D==8895||D==8978||9312<=D&&D<=9449||9451<=D&&D<=9547||9552<=D&&D<=9587||9600<=D&&D<=9615||9618<=D&&D<=9621||9632<=D&&D<=9633||9635<=D&&D<=9641||9650<=D&&D<=9651||9654<=D&&D<=9655||9660<=D&&D<=9661||9664<=D&&D<=9665||9670<=D&&D<=9672||D==9675||9678<=D&&D<=9681||9698<=D&&D<=9701||D==9711||9733<=D&&D<=9734||D==9737||9742<=D&&D<=9743||9748<=D&&D<=9749||D==9756||D==9758||D==9792||D==9794||9824<=D&&D<=9825||9827<=D&&D<=9829||9831<=D&&D<=9834||9836<=D&&D<=9837||D==9839||9886<=D&&D<=9887||9918<=D&&D<=9919||9924<=D&&D<=9933||9935<=D&&D<=9953||D==9955||9960<=D&&D<=9983||D==10045||D==10071||10102<=D&&D<=10111||11093<=D&&D<=11097||12872<=D&&D<=12879||57344<=D&&D<=63743||65024<=D&&D<=65039||D==65533||127232<=D&&D<=127242||127248<=D&&D<=127277||127280<=D&&D<=127337||127344<=D&&D<=127386||917760<=D&&D<=917999||983040<=D&&D<=1048573||1048576<=D&&D<=1114109?"A":"N"},u.characterLength=function(F){var s=this.eastAsianWidth(F);return s=="F"||s=="W"||s=="A"?2:1};function t(F){return F.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g)||[]}u.length=function(F){for(var s=t(F),i=0,D=0;D<s.length;D++)i=i+this.characterLength(s[D]);return i},u.slice=function(F,s,i){textLen=u.length(F),s=s||0,i=i||1,s<0&&(s=textLen+s),i<0&&(i=textLen+i);for(var D="",C=0,n=t(F),E=0;E<n.length;E++){var a=n[E],o=u.length(a);if(C>=s-(o==2?1:0))if(C+o<=i)D+=a;else break;C+=o;}return D};})(W$1);var tD=W$1.exports;const eD=L$1(tD);var FD=function(){return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g};const sD=L$1(FD);function p(e,u={}){if(typeof e!="string"||e.length===0||(u={ambiguousIsNarrow:true,...u},e=P$1(e),e.length===0))return 0;e=e.replace(sD()," ");const t=u.ambiguousIsNarrow?1:2;let F=0;for(const s of e){const i=s.codePointAt(0);if(i<=31||i>=127&&i<=159||i>=768&&i<=879)continue;switch(eD.eastAsianWidth(s)){case "F":case "W":F+=2;break;case "A":F+=t;break;default:F+=1;}}return F}const w=10,N=(e=0)=>u=>`\x1B[${u+e}m`,I=(e=0)=>u=>`\x1B[${38+e};5;${u}m`,R=(e=0)=>(u,t,F)=>`\x1B[${38+e};2;${u};${t};${F}m`,r={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(r.modifier);const iD=Object.keys(r.color),CD=Object.keys(r.bgColor);[...iD,...CD];function rD(){const e=new Map;for(const[u,t]of Object.entries(r)){for(const[F,s]of Object.entries(t))r[F]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},t[F]=r[F],e.set(s[0],s[1]);Object.defineProperty(r,u,{value:t,enumerable:false});}return Object.defineProperty(r,"codes",{value:e,enumerable:false}),r.color.close="\x1B[39m",r.bgColor.close="\x1B[49m",r.color.ansi=N(),r.color.ansi256=I(),r.color.ansi16m=R(),r.bgColor.ansi=N(w),r.bgColor.ansi256=I(w),r.bgColor.ansi16m=R(w),Object.defineProperties(r,{rgbToAnsi256:{value:(u,t,F)=>u===t&&t===F?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(t/255*5)+Math.round(F/255*5),enumerable:false},hexToRgb:{value:u=>{const t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));if(!t)return [0,0,0];let[F]=t;F.length===3&&(F=[...F].map(i=>i+i).join(""));const s=Number.parseInt(F,16);return [s>>16&255,s>>8&255,s&255]},enumerable:false},hexToAnsi256:{value:u=>r.rgbToAnsi256(...r.hexToRgb(u)),enumerable:false},ansi256ToAnsi:{value:u=>{if(u<8)return 30+u;if(u<16)return 90+(u-8);let t,F,s;if(u>=232)t=((u-232)*10+8)/255,F=t,s=t;else {u-=16;const C=u%36;t=Math.floor(u/36)/5,F=Math.floor(C/6)/5,s=C%6/5;}const i=Math.max(t,F,s)*2;if(i===0)return 30;let D=30+(Math.round(s)<<2|Math.round(F)<<1|Math.round(t));return i===2&&(D+=60),D},enumerable:false},rgbToAnsi:{value:(u,t,F)=>r.ansi256ToAnsi(r.rgbToAnsi256(u,t,F)),enumerable:false},hexToAnsi:{value:u=>r.ansi256ToAnsi(r.hexToAnsi256(u)),enumerable:false}}),r}const ED=rD(),d$1=new Set(["\x1B","\x9B"]),oD=39,y="\x07",V$1="[",nD="]",G$1="m",_$1=`${nD}8;;`,z=e=>`${d$1.values().next().value}${V$1}${e}${G$1}`,K$1=e=>`${d$1.values().next().value}${_$1}${e}${y}`,aD=e=>e.split(" ").map(u=>p(u)),k$1=(e,u,t)=>{const F=[...u];let s=false,i=false,D=p(P$1(e[e.length-1]));for(const[C,n]of F.entries()){const E=p(n);if(D+E<=t?e[e.length-1]+=n:(e.push(n),D=0),d$1.has(n)&&(s=true,i=F.slice(C+1).join("").startsWith(_$1)),s){i?n===y&&(s=false,i=false):n===G$1&&(s=false);continue}D+=E,D===t&&C<F.length-1&&(e.push(""),D=0);}!D&&e[e.length-1].length>0&&e.length>1&&(e[e.length-2]+=e.pop());},hD=e=>{const u=e.split(" ");let t=u.length;for(;t>0&&!(p(u[t-1])>0);)t--;return t===u.length?e:u.slice(0,t).join(" ")+u.slice(t).join("")},lD=(e,u,t={})=>{if(t.trim!==false&&e.trim()==="")return "";let F="",s,i;const D=aD(e);let C=[""];for(const[E,a]of e.split(" ").entries()){t.trim!==false&&(C[C.length-1]=C[C.length-1].trimStart());let o=p(C[C.length-1]);if(E!==0&&(o>=u&&(t.wordWrap===false||t.trim===false)&&(C.push(""),o=0),(o>0||t.trim===false)&&(C[C.length-1]+=" ",o++)),t.hard&&D[E]>u){const c=u-o,f=1+Math.floor((D[E]-c-1)/u);Math.floor((D[E]-1)/u)<f&&C.push(""),k$1(C,a,u);continue}if(o+D[E]>u&&o>0&&D[E]>0){if(t.wordWrap===false&&o<u){k$1(C,a,u);continue}C.push("");}if(o+D[E]>u&&t.wordWrap===false){k$1(C,a,u);continue}C[C.length-1]+=a;}t.trim!==false&&(C=C.map(E=>hD(E)));const n=[...C.join(`
|
|
373
|
+
`)];for(const[E,a]of n.entries()){if(F+=a,d$1.has(a)){const{groups:c}=new RegExp(`(?:\\${V$1}(?<code>\\d+)m|\\${_$1}(?<uri>.*)${y})`).exec(n.slice(E).join(""))||{groups:{}};if(c.code!==void 0){const f=Number.parseFloat(c.code);s=f===oD?void 0:f;}else c.uri!==void 0&&(i=c.uri.length===0?void 0:c.uri);}const o=ED.codes.get(Number(s));n[E+1]===`
|
|
374
|
+
`?(i&&(F+=K$1("")),s&&o&&(F+=z(o))):a===`
|
|
375
|
+
`&&(s&&o&&(F+=z(s)),i&&(F+=K$1(i)));}return F};function Y$1(e,u,t){return String(e).normalize().replace(/\r\n/g,`
|
|
356
376
|
`).split(`
|
|
357
|
-
`).map(
|
|
358
|
-
`)}
|
|
359
|
-
`),
|
|
360
|
-
`),s=[];for(let
|
|
361
|
-
`),
|
|
362
|
-
`).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=
|
|
363
|
-
`);this.output.write(s[
|
|
364
|
-
`).slice(
|
|
365
|
-
`)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}
|
|
366
|
-
|
|
367
|
-
function
|
|
368
|
-
${
|
|
369
|
-
`,t
|
|
370
|
-
${color2.yellow(
|
|
371
|
-
${color2.yellow(
|
|
372
|
-
`;case "submit":return `${n}${color2.gray(
|
|
373
|
-
|
|
374
|
-
${color2.cyan(
|
|
375
|
-
`}}}).prompt(),
|
|
376
|
-
${
|
|
377
|
-
|
|
378
|
-
${color2.gray(
|
|
379
|
-
${color2.cyan(
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
${color2.gray(a)}`;default:return `${t}${color2.cyan(a)} ${E({cursor:this.cursor,options:this.options,maxItems:s.maxItems,style:(i,r)=>n(i,r?"active":"inactive")}).join(`
|
|
384
|
-
${color2.cyan(a)} `)}
|
|
385
|
-
${color2.cyan($)}
|
|
386
|
-
`}}}).prompt()},$e=s=>{const n=(t,i)=>{const r=t.label??String(t.value);return i==="active"?`${color2.cyan(j)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`:i==="selected"?`${color2.green(b)} ${color2.dim(r)}`:i==="cancelled"?`${color2.strikethrough(color2.dim(r))}`:i==="active-selected"?`${color2.green(b)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`:i==="submitted"?`${color2.dim(r)}`:`${color2.dim(B)} ${color2.dim(r)}`};return new vD({options:s.options,initialValues:s.initialValues,required:s.required??true,cursorAt:s.cursorAt,validate(t){if(this.required&&t.length===0)return `Please select at least one option.
|
|
387
|
-
${color2.reset(color2.dim(`Press ${color2.gray(color2.bgWhite(color2.inverse(" space ")))} to select, ${color2.gray(color2.bgWhite(color2.inverse(" enter ")))} to submit`))}`},render(){let t=`${color2.gray(a)}
|
|
388
|
-
${y(this.state)} ${s.message}
|
|
389
|
-
`;const i=(r,o)=>{const c=this.value.includes(r.value);return o&&c?n(r,"active-selected"):c?n(r,"selected"):n(r,o?"active":"inactive")};switch(this.state){case "submit":return `${t}${color2.gray(a)} ${this.options.filter(({value:r})=>this.value.includes(r)).map(r=>n(r,"submitted")).join(color2.dim(", "))||color2.dim("none")}`;case "cancel":{const r=this.options.filter(({value:o})=>this.value.includes(o)).map(o=>n(o,"cancelled")).join(color2.dim(", "));return `${t}${color2.gray(a)} ${r.trim()?`${r}
|
|
390
|
-
${color2.gray(a)}`:""}`}case "error":{const r=this.error.split(`
|
|
391
|
-
`).map((o,c)=>c===0?`${color2.yellow($)} ${color2.yellow(o)}`:` ${o}`).join(`
|
|
392
|
-
`);return t+color2.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
393
|
-
${color2.yellow(a)} `)+`
|
|
394
|
-
`+r+`
|
|
395
|
-
`}default:return `${t}${color2.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
|
|
396
|
-
${color2.cyan(a)} `)}
|
|
397
|
-
${color2.cyan($)}
|
|
398
|
-
`}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
|
|
399
|
-
${s}
|
|
377
|
+
`).map(F=>lD(F,u,t)).join(`
|
|
378
|
+
`)}const xD=["up","down","left","right","space","enter","cancel"],B={actions:new Set(xD),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]])};function $(e,u){if(typeof e=="string")return B.aliases.get(e)===u;for(const t of e)if(t!==void 0&&$(t,u))return true;return false}function BD(e,u){if(e===u)return;const t=e.split(`
|
|
379
|
+
`),F=u.split(`
|
|
380
|
+
`),s=[];for(let i=0;i<Math.max(t.length,F.length);i++)t[i]!==F[i]&&s.push(i);return s}const AD=globalThis.process.platform.startsWith("win"),S=Symbol("clack:cancel");function pD(e){return e===S}function m(e,u){const t=e;t.isTTY&&t.setRawMode(u);}function fD({input:e=stdin,output:u=stdout,overwrite:t=true,hideCursor:F=true}={}){const s=g.createInterface({input:e,output:u,prompt:"",tabSize:1});g.emitKeypressEvents(e,s),e.isTTY&&e.setRawMode(true);const i=(D,{name:C,sequence:n})=>{const E=String(D);if($([E,C,n],"cancel")){F&&u.write(srcExports.cursor.show),process.exit(0);return}if(!t)return;const a=C==="return"?0:-1,o=C==="return"?-1:0;g.moveCursor(u,a,o,()=>{g.clearLine(u,1,()=>{e.once("keypress",i);});});};return F&&u.write(srcExports.cursor.hide),e.once("keypress",i),()=>{e.off("keypress",i),F&&u.write(srcExports.cursor.show),e.isTTY&&!AD&&e.setRawMode(false),s.terminal=false,s.close();}}var gD=Object.defineProperty,vD=(e,u,t)=>u in e?gD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,h=(e,u,t)=>(vD(e,typeof u!="symbol"?u+"":u,t),t);class x{constructor(u,t=true){h(this,"input"),h(this,"output"),h(this,"_abortSignal"),h(this,"rl"),h(this,"opts"),h(this,"_render"),h(this,"_track",false),h(this,"_prevFrame",""),h(this,"_subscribers",new Map),h(this,"_cursor",0),h(this,"state","initial"),h(this,"error",""),h(this,"value");const{input:F=stdin,output:s=stdout,render:i,signal:D,...C}=u;this.opts=C,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=t,this._abortSignal=D,this.input=F,this.output=s;}unsubscribe(){this._subscribers.clear();}setSubscriber(u,t){const F=this._subscribers.get(u)??[];F.push(t),this._subscribers.set(u,F);}on(u,t){this.setSubscriber(u,{cb:t});}once(u,t){this.setSubscriber(u,{cb:t,once:true});}emit(u,...t){const F=this._subscribers.get(u)??[],s=[];for(const i of F)i.cb(...t),i.once&&s.push(()=>F.splice(F.indexOf(i),1));for(const i of s)i();}prompt(){return new Promise((u,t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),u(S);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close();},{once:true});}const F=new Writable;F._write=(s,i,D)=>{this._track&&(this.value=this.rl?.line.replace(/\t/g,""),this._cursor=this.rl?.cursor??0,this.emit("value",this.value)),D();},this.input.pipe(F),this.rl=g__default.createInterface({input:this.input,output:F,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:true}),g__default.emitKeypressEvents(this.input,this.rl),this.rl.prompt(),this.opts.initialValue!==void 0&&this._track&&this.rl.write(this.opts.initialValue),this.input.on("keypress",this.onKeypress),m(this.input,true),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),m(this.input,false),u(this.value);}),this.once("cancel",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),m(this.input,false),u(S);});})}onKeypress(u,t){if(this.state==="error"&&(this.state="active"),t?.name&&(!this._track&&B.aliases.has(t.name)&&this.emit("cursor",B.aliases.get(t.name)),B.actions.has(t.name)&&this.emit("cursor",t.name)),u&&(u.toLowerCase()==="y"||u.toLowerCase()==="n")&&this.emit("confirm",u.toLowerCase()==="y"),u===" "&&this.opts.placeholder&&(this.value||(this.rl?.write(this.opts.placeholder),this.emit("value",this.opts.placeholder))),u&&this.emit("key",u.toLowerCase()),t?.name==="return"){if(this.opts.validate){const F=this.opts.validate(this.value);F&&(this.error=F instanceof Error?F.message:F,this.state="error",this.rl?.write(this.value));}this.state!=="error"&&(this.state="submit");}$([u,t?.name,t?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close();}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
381
|
+
`),m(this.input,false),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe();}restoreCursor(){const u=Y$1(this._prevFrame,process.stdout.columns,{hard:true}).split(`
|
|
382
|
+
`).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=Y$1(this._render(this)??"",process.stdout.columns,{hard:true});if(u!==this._prevFrame){if(this.state==="initial")this.output.write(srcExports.cursor.hide);else {const t=BD(this._prevFrame,u);if(this.restoreCursor(),t&&t?.length===1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.lines(1));const s=u.split(`
|
|
383
|
+
`);this.output.write(s[F]),this._prevFrame=u,this.output.write(srcExports.cursor.move(0,s.length-F-1));return}if(t&&t?.length>1){const F=t[0];this.output.write(srcExports.cursor.move(0,F)),this.output.write(srcExports.erase.down());const s=u.split(`
|
|
384
|
+
`).slice(F);this.output.write(s.join(`
|
|
385
|
+
`)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}var OD=Object.defineProperty,PD=(e,u,t)=>u in e?OD(e,u,{enumerable:true,configurable:true,writable:true,value:t}):e[u]=t,J=(e,u,t)=>(PD(e,typeof u!="symbol"?u+"":u,t),t);class LD extends x{constructor(u){super(u,false),J(this,"options"),J(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:t})=>t===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",t=>{switch(t){case "left":case "up":this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;break;case "down":case "right":this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;break}this.changeValue();});}get _value(){return this.options[this.cursor]}changeValue(){this.value=this._value.value;}}class RD extends x{get valueWithCursor(){if(this.state==="submit")return this.value;if(this.cursor>=this.value.length)return `${this.value}\u2588`;const u=this.value.slice(0,this.cursor),[t,...F]=this.value.slice(this.cursor);return `${u}${color2.inverse(t)}${F.join("")}`}get cursor(){return this._cursor}constructor(u){super(u),this.on("finalize",()=>{this.value||(this.value=u.defaultValue);});}}
|
|
386
|
+
|
|
387
|
+
function ce(){return y$1.platform!=="win32"?y$1.env.TERM!=="linux":!!y$1.env.CI||!!y$1.env.WT_SESSION||!!y$1.env.TERMINUS_SUBLIME||y$1.env.ConEmuTask==="{cmd::Cmder}"||y$1.env.TERM_PROGRAM==="Terminus-Sublime"||y$1.env.TERM_PROGRAM==="vscode"||y$1.env.TERM==="xterm-256color"||y$1.env.TERM==="alacritty"||y$1.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const V=ce(),u=(t,n)=>V?t:n,le=u("\u25C6","*"),L=u("\u25A0","x"),W=u("\u25B2","x"),C=u("\u25C7","o"),ue=u("\u250C","T"),o=u("\u2502","|"),d=u("\u2514","\u2014"),k=u("\u25CF",">"),P=u("\u25CB"," "),_=u("\u2500","-"),me=u("\u256E","+"),de=u("\u251C","+"),pe=u("\u256F","+"),q=u("\u25CF","\u2022"),D=u("\u25C6","*"),U=u("\u25B2","!"),K=u("\u25A0","x"),b=t=>{switch(t){case "initial":case "active":return color2.cyan(le);case "cancel":return color2.red(L);case "error":return color2.yellow(W);case "submit":return color2.green(C)}},G=t=>{const{cursor:n,options:r,style:i}=t,s=t.maxItems??Number.POSITIVE_INFINITY,c=Math.max(process.stdout.rows-4,0),a=Math.min(c,Math.max(s,5));let l=0;n>=l+a-3?l=Math.max(Math.min(n-a+3,r.length-a),0):n<l+2&&(l=Math.max(n-2,0));const $=a<r.length&&l>0,g=a<r.length&&l+a<r.length;return r.slice(l,l+a).map((p,v,f)=>{const j=v===0&&$,E=v===f.length-1&&g;return j||E?color2.dim("..."):i(p,v+l===n)})},he=t=>new RD({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,render(){const n=`${color2.gray(o)}
|
|
388
|
+
${b(this.state)} ${t.message}
|
|
389
|
+
`,r=t.placeholder?color2.inverse(t.placeholder[0])+color2.dim(t.placeholder.slice(1)):color2.inverse(color2.hidden("_")),i=this.value?this.valueWithCursor:r;switch(this.state){case "error":return `${n.trim()}
|
|
390
|
+
${color2.yellow(o)} ${i}
|
|
391
|
+
${color2.yellow(d)} ${color2.yellow(this.error)}
|
|
392
|
+
`;case "submit":return `${n}${color2.gray(o)} ${color2.dim(this.value||t.placeholder)}`;case "cancel":return `${n}${color2.gray(o)} ${color2.strikethrough(color2.dim(this.value??""))}${this.value?.trim()?`
|
|
393
|
+
${color2.gray(o)}`:""}`;default:return `${n}${color2.cyan(o)} ${i}
|
|
394
|
+
${color2.cyan(d)}
|
|
395
|
+
`}}}).prompt(),ve=t=>{const n=(r,i)=>{const s=r.label??String(r.value);switch(i){case "selected":return `${color2.dim(s)}`;case "active":return `${color2.green(k)} ${s} ${r.hint?color2.dim(`(${r.hint})`):""}`;case "cancelled":return `${color2.strikethrough(color2.dim(s))}`;default:return `${color2.dim(P)} ${color2.dim(s)}`}};return new LD({options:t.options,initialValue:t.initialValue,render(){const r=`${color2.gray(o)}
|
|
396
|
+
${b(this.state)} ${t.message}
|
|
397
|
+
`;switch(this.state){case "submit":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"selected")}`;case "cancel":return `${r}${color2.gray(o)} ${n(this.options[this.cursor],"cancelled")}
|
|
398
|
+
${color2.gray(o)}`;default:return `${r}${color2.cyan(o)} ${G({cursor:this.cursor,options:this.options,maxItems:t.maxItems,style:(i,s)=>n(i,s?"active":"inactive")}).join(`
|
|
399
|
+
${color2.cyan(o)} `)}
|
|
400
|
+
${color2.cyan(d)}
|
|
401
|
+
`}}}).prompt()},Me=(t="",n="")=>{const r=`
|
|
402
|
+
${t}
|
|
400
403
|
`.split(`
|
|
401
|
-
`),i=
|
|
402
|
-
`);process.stdout.write(`${color2.gray(
|
|
403
|
-
${color2.green(
|
|
404
|
-
${
|
|
405
|
-
${color2.gray(
|
|
406
|
-
`);},
|
|
407
|
-
|
|
408
|
-
`);},
|
|
409
|
-
`);},
|
|
410
|
-
${color2.gray(
|
|
411
|
-
|
|
412
|
-
`);},
|
|
413
|
-
`);
|
|
404
|
+
`),i=stripVTControlCharacters(n).length,s=Math.max(r.reduce((a,l)=>{const $=stripVTControlCharacters(l);return $.length>a?$.length:a},0),i)+2,c=r.map(a=>`${color2.gray(o)} ${color2.dim(a)}${" ".repeat(s-stripVTControlCharacters(a).length)}${color2.gray(o)}`).join(`
|
|
405
|
+
`);process.stdout.write(`${color2.gray(o)}
|
|
406
|
+
${color2.green(C)} ${color2.reset(n)} ${color2.gray(_.repeat(Math.max(s-i-1,1))+me)}
|
|
407
|
+
${c}
|
|
408
|
+
${color2.gray(de+_.repeat(s+2)+pe)}
|
|
409
|
+
`);},xe=(t="")=>{process.stdout.write(`${color2.gray(d)} ${color2.red(t)}
|
|
410
|
+
|
|
411
|
+
`);},Ie=(t="")=>{process.stdout.write(`${color2.gray(ue)} ${t}
|
|
412
|
+
`);},Se=(t="")=>{process.stdout.write(`${color2.gray(o)}
|
|
413
|
+
${color2.gray(d)} ${t}
|
|
414
|
+
|
|
415
|
+
`);},M={message:(t="",{symbol:n=color2.gray(o)}={})=>{const r=[`${color2.gray(o)}`];if(t){const[i,...s]=t.split(`
|
|
416
|
+
`);r.push(`${n} ${i}`,...s.map(c=>`${color2.gray(o)} ${c}`));}process.stdout.write(`${r.join(`
|
|
414
417
|
`)}
|
|
415
|
-
`);},info:
|
|
416
|
-
`);
|
|
417
|
-
`),
|
|
418
|
+
`);},info:t=>{M.message(t,{symbol:color2.blue(q)});},success:t=>{M.message(t,{symbol:color2.green(D)});},step:t=>{M.message(t,{symbol:color2.green(C)});},warn:t=>{M.message(t,{symbol:color2.yellow(U)});},warning:t=>{M.warn(t);},error:t=>{M.message(t,{symbol:color2.red(K)});}};`${color2.gray(o)} `;const Y=({indicator:t="dots"}={})=>{const n=V?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],r=V?80:120,i=process.env.CI==="true";let s,c,a=false,l="",$,g=performance.now();const p=m=>{const h=m>1?"Something went wrong":"Canceled";a&&N(h,m);},v=()=>p(2),f=()=>p(1),j=()=>{process.on("uncaughtExceptionMonitor",v),process.on("unhandledRejection",v),process.on("SIGINT",f),process.on("SIGTERM",f),process.on("exit",p);},E=()=>{process.removeListener("uncaughtExceptionMonitor",v),process.removeListener("unhandledRejection",v),process.removeListener("SIGINT",f),process.removeListener("SIGTERM",f),process.removeListener("exit",p);},B=()=>{if($===void 0)return;i&&process.stdout.write(`
|
|
419
|
+
`);const m=$.split(`
|
|
420
|
+
`);process.stdout.write(srcExports.cursor.move(-999,m.length-1)),process.stdout.write(srcExports.erase.down(m.length));},R=m=>m.replace(/\.+$/,""),O=m=>{const h=(performance.now()-m)/1e3,w=Math.floor(h/60),I=Math.floor(h%60);return w>0?`[${w}m ${I}s]`:`[${I}s]`},H=(m="")=>{a=true,s=fD(),l=R(m),g=performance.now(),process.stdout.write(`${color2.gray(o)}
|
|
421
|
+
`);let h=0,w=0;j(),c=setInterval(()=>{if(i&&l===$)return;B(),$=l;const I=color2.magenta(n[h]);if(i)process.stdout.write(`${I} ${l}...`);else if(t==="timer")process.stdout.write(`${I} ${l} ${O(g)}`);else {const z=".".repeat(Math.floor(w)).slice(0,3);process.stdout.write(`${I} ${l}${z}`);}h=h+1<n.length?h+1:0,w=w<n.length?w+.125:0;},r);},N=(m="",h=0)=>{a=false,clearInterval(c),B();const w=h===0?color2.green(C):h===1?color2.red(L):color2.red(W);l=R(m??l),t==="timer"?process.stdout.write(`${w} ${l} ${O(g)}
|
|
422
|
+
`):process.stdout.write(`${w} ${l}
|
|
423
|
+
`),E(),s();};return {start:H,stop:N,message:(m="")=>{l=R(m??l);}}},Ce=async(t,n)=>{const r={},i=Object.keys(t);for(const s of i){const c=t[s],a=await c({results:r})?.catch(l=>{throw l});if(typeof n?.onCancel=="function"&&pD(a)){r[s]="canceled",n.onCancel({results:r});continue}r[s]=a;}return r};
|
|
424
|
+
|
|
425
|
+
var shellQuote$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 fs5.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 fs5.stat(dirPath);
|
|
1229
|
+
return stat.isDirectory();
|
|
1230
|
+
} catch {
|
|
1231
|
+
return false;
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
async function fileExists(filePath) {
|
|
1235
|
+
try {
|
|
1236
|
+
const stat = await fs5.stat(filePath);
|
|
1237
|
+
return stat.isFile();
|
|
1238
|
+
} catch {
|
|
1239
|
+
return false;
|
|
1240
|
+
}
|
|
1241
|
+
}
|
|
1242
|
+
async function cloneRepositoryWithoutGit(repoUrl, targetPath) {
|
|
1243
|
+
await fs5.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 fs5.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 fs5.readFile(packageJsonPath, "utf-8");
|
|
1269
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
1270
|
+
packageJson.name = projectName;
|
|
1271
|
+
await fs5.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 fs5.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 fs5.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,66 +1429,24 @@ 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 fs5.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 fs5.readFile("package.json", "utf-8"));
|
|
961
1442
|
packageJson.scripts = {
|
|
962
1443
|
...packageJson.scripts,
|
|
963
1444
|
...scripts
|
|
964
1445
|
};
|
|
965
|
-
await
|
|
1446
|
+
await fs5.writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
966
1447
|
}
|
|
967
1448
|
};
|
|
968
|
-
|
|
969
|
-
const userAgent = process.env.npm_config_user_agent || "";
|
|
970
|
-
const execPath = process.env.npm_execpath || "";
|
|
971
|
-
if (userAgent.includes("yarn")) {
|
|
972
|
-
return "yarn";
|
|
973
|
-
}
|
|
974
|
-
if (userAgent.includes("pnpm")) {
|
|
975
|
-
return "pnpm";
|
|
976
|
-
}
|
|
977
|
-
if (userAgent.includes("npm")) {
|
|
978
|
-
return "npm";
|
|
979
|
-
}
|
|
980
|
-
if (execPath.includes("yarn")) {
|
|
981
|
-
return "yarn";
|
|
982
|
-
}
|
|
983
|
-
if (execPath.includes("pnpm")) {
|
|
984
|
-
return "pnpm";
|
|
985
|
-
}
|
|
986
|
-
if (execPath.includes("npm")) {
|
|
987
|
-
return "npm";
|
|
988
|
-
}
|
|
989
|
-
return "npm";
|
|
990
|
-
}
|
|
991
|
-
function getPackageManagerInstallCommand(pm) {
|
|
992
|
-
switch (pm) {
|
|
993
|
-
case "npm":
|
|
994
|
-
return "install";
|
|
995
|
-
case "yarn":
|
|
996
|
-
return "add";
|
|
997
|
-
case "pnpm":
|
|
998
|
-
return "add";
|
|
999
|
-
default:
|
|
1000
|
-
return "install";
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
var args = ["-y", "@mastra/mcp-docs-server@latest"];
|
|
1449
|
+
var args = ["-y", "@mastra/mcp-docs-server"];
|
|
1004
1450
|
var createMcpConfig = (editor) => {
|
|
1005
1451
|
if (editor === "vscode") {
|
|
1006
1452
|
return {
|
|
@@ -1019,10 +1465,7 @@ var createMcpConfig = (editor) => {
|
|
|
1019
1465
|
}
|
|
1020
1466
|
return {
|
|
1021
1467
|
mcpServers: {
|
|
1022
|
-
mastra:
|
|
1023
|
-
command: "cmd",
|
|
1024
|
-
args: ["/c", "npx", ...args]
|
|
1025
|
-
} : {
|
|
1468
|
+
mastra: {
|
|
1026
1469
|
command: "npx",
|
|
1027
1470
|
args
|
|
1028
1471
|
}
|
|
@@ -1055,15 +1498,19 @@ async function writeMergedConfig(configPath, editor) {
|
|
|
1055
1498
|
spaces: 2
|
|
1056
1499
|
});
|
|
1057
1500
|
}
|
|
1058
|
-
var windsurfGlobalMCPConfigPath =
|
|
1059
|
-
var cursorGlobalMCPConfigPath =
|
|
1060
|
-
|
|
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
|
+
);
|
|
1061
1508
|
async function installMastraDocsMCPServer({ editor, directory }) {
|
|
1062
1509
|
if (editor === `cursor`) {
|
|
1063
|
-
await writeMergedConfig(
|
|
1510
|
+
await writeMergedConfig(path3.join(directory, ".cursor", "mcp.json"), "cursor");
|
|
1064
1511
|
}
|
|
1065
1512
|
if (editor === `vscode`) {
|
|
1066
|
-
await writeMergedConfig(
|
|
1513
|
+
await writeMergedConfig(path3.join(directory, ".vscode", "mcp.json"), "vscode");
|
|
1067
1514
|
}
|
|
1068
1515
|
if (editor === `cursor-global`) {
|
|
1069
1516
|
const alreadyInstalled = await globalMCPIsAlreadyInstalled(editor);
|
|
@@ -1086,19 +1533,28 @@ async function globalMCPIsAlreadyInstalled(editor) {
|
|
|
1086
1533
|
configPath = windsurfGlobalMCPConfigPath;
|
|
1087
1534
|
} else if (editor === "cursor-global") {
|
|
1088
1535
|
configPath = cursorGlobalMCPConfigPath;
|
|
1536
|
+
} else if (editor === "vscode") {
|
|
1537
|
+
configPath = vscodeGlobalMCPConfigPath;
|
|
1089
1538
|
}
|
|
1090
1539
|
if (!configPath || !existsSync(configPath)) {
|
|
1091
1540
|
return false;
|
|
1092
1541
|
}
|
|
1093
1542
|
try {
|
|
1094
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
|
+
}
|
|
1095
1552
|
if (!configContents?.mcpServers) return false;
|
|
1096
1553
|
const hasMastraMCP = Object.values(configContents.mcpServers).some(
|
|
1097
1554
|
(server) => server?.args?.find((arg) => arg?.includes(`@mastra/mcp-docs-server`))
|
|
1098
1555
|
);
|
|
1099
1556
|
return hasMastraMCP;
|
|
1100
|
-
} catch
|
|
1101
|
-
console.error(e);
|
|
1557
|
+
} catch {
|
|
1102
1558
|
return false;
|
|
1103
1559
|
}
|
|
1104
1560
|
}
|
|
@@ -1112,7 +1568,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1112
1568
|
}
|
|
1113
1569
|
readFile(filePath) {
|
|
1114
1570
|
return new Promise((resolve, reject) => {
|
|
1115
|
-
|
|
1571
|
+
fs4__default.readFile(filePath, "utf8", (err, data) => {
|
|
1116
1572
|
if (err) reject(err);
|
|
1117
1573
|
else resolve(data);
|
|
1118
1574
|
});
|
|
@@ -1120,7 +1576,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1120
1576
|
}
|
|
1121
1577
|
writeFile({ filePath, data }) {
|
|
1122
1578
|
return new Promise((resolve, reject) => {
|
|
1123
|
-
|
|
1579
|
+
fs4__default.writeFile(filePath, data, "utf8", (err) => {
|
|
1124
1580
|
if (err) reject(err);
|
|
1125
1581
|
else resolve();
|
|
1126
1582
|
});
|
|
@@ -1140,7 +1596,7 @@ var FileEnvService = class extends EnvService {
|
|
|
1140
1596
|
${key}=${value}`;
|
|
1141
1597
|
}
|
|
1142
1598
|
await this.writeFile({ filePath, data });
|
|
1143
|
-
console.
|
|
1599
|
+
console.info(`${key} set to ${value} in ENV file.`);
|
|
1144
1600
|
return data;
|
|
1145
1601
|
}
|
|
1146
1602
|
async getEnvValue(key) {
|
|
@@ -1173,25 +1629,25 @@ var FileService = class {
|
|
|
1173
1629
|
*/
|
|
1174
1630
|
async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
|
|
1175
1631
|
const __filename = fileURLToPath(import.meta.url);
|
|
1176
|
-
const __dirname =
|
|
1177
|
-
const filePath =
|
|
1178
|
-
const fileString =
|
|
1179
|
-
if (
|
|
1180
|
-
console.
|
|
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) {
|
|
1636
|
+
console.info(`${outputFilePath} already exists`);
|
|
1181
1637
|
return false;
|
|
1182
1638
|
}
|
|
1183
|
-
await
|
|
1639
|
+
await fsExtra.outputFile(outputFilePath, fileString);
|
|
1184
1640
|
return true;
|
|
1185
1641
|
}
|
|
1186
1642
|
async setupEnvFile({ dbUrl }) {
|
|
1187
|
-
const envPath =
|
|
1188
|
-
await
|
|
1643
|
+
const envPath = path3.join(process.cwd(), ".env.development");
|
|
1644
|
+
await fsExtra.ensureFile(envPath);
|
|
1189
1645
|
const fileEnvService = new FileEnvService(envPath);
|
|
1190
1646
|
await fileEnvService.setEnvValue("DB_URL", dbUrl);
|
|
1191
1647
|
}
|
|
1192
1648
|
getFirstExistingFile(files) {
|
|
1193
1649
|
for (const f of files) {
|
|
1194
|
-
if (
|
|
1650
|
+
if (fs4__default__default.existsSync(f)) {
|
|
1195
1651
|
return f;
|
|
1196
1652
|
}
|
|
1197
1653
|
}
|
|
@@ -1201,18 +1657,22 @@ var FileService = class {
|
|
|
1201
1657
|
filePath,
|
|
1202
1658
|
replacements
|
|
1203
1659
|
}) {
|
|
1204
|
-
let fileContent =
|
|
1660
|
+
let fileContent = fs4__default__default.readFileSync(filePath, "utf8");
|
|
1205
1661
|
replacements.forEach(({ search, replace }) => {
|
|
1206
1662
|
fileContent = fileContent.replaceAll(search, replace);
|
|
1207
1663
|
});
|
|
1208
|
-
|
|
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";
|
|
1209
1674
|
}
|
|
1210
1675
|
};
|
|
1211
|
-
createLogger({
|
|
1212
|
-
name: "Mastra CLI",
|
|
1213
|
-
level: "debug"
|
|
1214
|
-
});
|
|
1215
|
-
var exec = util.promisify(child_process.exec);
|
|
1216
1676
|
var getAISDKPackage = (llmProvider) => {
|
|
1217
1677
|
switch (llmProvider) {
|
|
1218
1678
|
case "openai":
|
|
@@ -1225,6 +1685,8 @@ var getAISDKPackage = (llmProvider) => {
|
|
|
1225
1685
|
return "@ai-sdk/google";
|
|
1226
1686
|
case "cerebras":
|
|
1227
1687
|
return "@ai-sdk/cerebras";
|
|
1688
|
+
case "mistral":
|
|
1689
|
+
return "@ai-sdk/mistral";
|
|
1228
1690
|
default:
|
|
1229
1691
|
return "@ai-sdk/openai";
|
|
1230
1692
|
}
|
|
@@ -1234,7 +1696,7 @@ var getProviderImportAndModelItem = (llmProvider) => {
|
|
|
1234
1696
|
let modelItem = "";
|
|
1235
1697
|
if (llmProvider === "openai") {
|
|
1236
1698
|
providerImport = `import { openai } from '${getAISDKPackage(llmProvider)}';`;
|
|
1237
|
-
modelItem = `openai('gpt-4o')`;
|
|
1699
|
+
modelItem = `openai('gpt-4o-mini')`;
|
|
1238
1700
|
} else if (llmProvider === "anthropic") {
|
|
1239
1701
|
providerImport = `import { anthropic } from '${getAISDKPackage(llmProvider)}';`;
|
|
1240
1702
|
modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
|
|
@@ -1243,24 +1705,29 @@ var getProviderImportAndModelItem = (llmProvider) => {
|
|
|
1243
1705
|
modelItem = `groq('llama-3.3-70b-versatile')`;
|
|
1244
1706
|
} else if (llmProvider === "google") {
|
|
1245
1707
|
providerImport = `import { google } from '${getAISDKPackage(llmProvider)}';`;
|
|
1246
|
-
modelItem = `google('gemini-
|
|
1708
|
+
modelItem = `google('gemini-2.5-pro')`;
|
|
1247
1709
|
} else if (llmProvider === "cerebras") {
|
|
1248
1710
|
providerImport = `import { cerebras } from '${getAISDKPackage(llmProvider)}';`;
|
|
1249
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')`;
|
|
1250
1715
|
}
|
|
1251
1716
|
return { providerImport, modelItem };
|
|
1252
1717
|
};
|
|
1253
1718
|
async function writeAgentSample(llmProvider, destPath, addExampleTool) {
|
|
1254
1719
|
const { providerImport, modelItem } = getProviderImportAndModelItem(llmProvider);
|
|
1255
1720
|
const instructions = `
|
|
1256
|
-
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.
|
|
1257
1722
|
|
|
1258
1723
|
Your primary function is to help users get weather details for specific locations. When responding:
|
|
1259
1724
|
- Always ask for a location if none is provided
|
|
1260
|
-
- If the location name isn
|
|
1725
|
+
- If the location name isn't in English, please translate it
|
|
1261
1726
|
- If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
|
|
1262
1727
|
- Include relevant details like humidity, wind conditions, and precipitation
|
|
1263
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.
|
|
1264
1731
|
|
|
1265
1732
|
${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
|
|
1266
1733
|
`;
|
|
@@ -1269,7 +1736,7 @@ ${providerImport}
|
|
|
1269
1736
|
import { Agent } from '@mastra/core/agent';
|
|
1270
1737
|
import { Memory } from '@mastra/memory';
|
|
1271
1738
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1272
|
-
${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
|
|
1739
|
+
${addExampleTool ? `import { weatherTool } from '../tools/weather-tool';` : ""}
|
|
1273
1740
|
|
|
1274
1741
|
export const weatherAgent = new Agent({
|
|
1275
1742
|
name: 'Weather Agent',
|
|
@@ -1279,14 +1746,7 @@ export const weatherAgent = new Agent({
|
|
|
1279
1746
|
memory: new Memory({
|
|
1280
1747
|
storage: new LibSQLStore({
|
|
1281
1748
|
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
1282
|
-
})
|
|
1283
|
-
options: {
|
|
1284
|
-
lastMessages: 10,
|
|
1285
|
-
semanticRecall: false,
|
|
1286
|
-
threads: {
|
|
1287
|
-
generateTitle: false
|
|
1288
|
-
}
|
|
1289
|
-
}
|
|
1749
|
+
})
|
|
1290
1750
|
})
|
|
1291
1751
|
});
|
|
1292
1752
|
`;
|
|
@@ -1294,142 +1754,159 @@ export const weatherAgent = new Agent({
|
|
|
1294
1754
|
parser: "typescript",
|
|
1295
1755
|
singleQuote: true
|
|
1296
1756
|
});
|
|
1297
|
-
await
|
|
1298
|
-
await
|
|
1757
|
+
await fs5.writeFile(destPath, "");
|
|
1758
|
+
await fs5.writeFile(destPath, formattedContent);
|
|
1299
1759
|
}
|
|
1300
|
-
async function writeWorkflowSample(destPath
|
|
1301
|
-
const {
|
|
1302
|
-
const content = `${providerImport}
|
|
1303
|
-
import { Agent } from '@mastra/core/agent';
|
|
1304
|
-
import { Step, Workflow } from '@mastra/core/workflows';
|
|
1760
|
+
async function writeWorkflowSample(destPath) {
|
|
1761
|
+
const content = `import { createStep, createWorkflow } from '@mastra/core/workflows';
|
|
1305
1762
|
import { z } from 'zod';
|
|
1306
1763
|
|
|
1307
|
-
const
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
For each day in the forecast, structure your response exactly as follows:
|
|
1316
|
-
|
|
1317
|
-
\u{1F4C5} [Day, Month Date, Year]
|
|
1318
|
-
\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
|
|
1319
|
-
|
|
1320
|
-
\u{1F321}\uFE0F WEATHER SUMMARY
|
|
1321
|
-
\u2022 Conditions: [brief description]
|
|
1322
|
-
\u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
|
|
1323
|
-
\u2022 Precipitation: [X% chance]
|
|
1324
|
-
|
|
1325
|
-
\u{1F305} MORNING ACTIVITIES
|
|
1326
|
-
Outdoor:
|
|
1327
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1328
|
-
Best timing: [specific time range]
|
|
1329
|
-
Note: [relevant weather consideration]
|
|
1330
|
-
|
|
1331
|
-
\u{1F31E} AFTERNOON ACTIVITIES
|
|
1332
|
-
Outdoor:
|
|
1333
|
-
\u2022 [Activity Name] - [Brief description including specific location/route]
|
|
1334
|
-
Best timing: [specific time range]
|
|
1335
|
-
Note: [relevant weather consideration]
|
|
1336
|
-
|
|
1337
|
-
\u{1F3E0} INDOOR ALTERNATIVES
|
|
1338
|
-
\u2022 [Activity Name] - [Brief description including specific venue]
|
|
1339
|
-
Ideal for: [weather condition that would trigger this alternative]
|
|
1340
|
-
|
|
1341
|
-
\u26A0\uFE0F SPECIAL CONSIDERATIONS
|
|
1342
|
-
\u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
|
|
1343
|
-
|
|
1344
|
-
Guidelines:
|
|
1345
|
-
- Suggest 2-3 time-specific outdoor activities per day
|
|
1346
|
-
- Include 1-2 indoor backup options
|
|
1347
|
-
- For precipitation >50%, lead with indoor activities
|
|
1348
|
-
- All activities must be specific to the location
|
|
1349
|
-
- Include specific venues, trails, or locations
|
|
1350
|
-
- Consider activity intensity based on temperature
|
|
1351
|
-
- Keep descriptions concise but informative
|
|
1352
|
-
|
|
1353
|
-
Maintain this exact formatting for consistency, using the emoji and section headers as shown.
|
|
1354
|
-
\`,
|
|
1355
|
-
});
|
|
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
|
+
})
|
|
1356
1772
|
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
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
|
+
}
|
|
1367
1794
|
|
|
1368
|
-
const fetchWeather =
|
|
1795
|
+
const fetchWeather = createStep({
|
|
1369
1796
|
id: 'fetch-weather',
|
|
1370
1797
|
description: 'Fetches weather forecast for a given city',
|
|
1371
1798
|
inputSchema: z.object({
|
|
1372
1799
|
city: z.string().describe('The city to get the weather for'),
|
|
1373
1800
|
}),
|
|
1374
1801
|
outputSchema: forecastSchema,
|
|
1375
|
-
execute: async ({
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
if (!triggerData) {
|
|
1379
|
-
throw new Error('Trigger data not found');
|
|
1802
|
+
execute: async ({ inputData }) => {
|
|
1803
|
+
if (!inputData) {
|
|
1804
|
+
throw new Error('Input data not found');
|
|
1380
1805
|
}
|
|
1381
1806
|
|
|
1382
|
-
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\`;
|
|
1383
1808
|
const geocodingResponse = await fetch(geocodingUrl);
|
|
1384
1809
|
const geocodingData = (await geocodingResponse.json()) as {
|
|
1385
1810
|
results: { latitude: number; longitude: number; name: string }[];
|
|
1386
1811
|
};
|
|
1387
1812
|
|
|
1388
1813
|
if (!geocodingData.results?.[0]) {
|
|
1389
|
-
throw new Error(\`Location '\${
|
|
1814
|
+
throw new Error(\`Location '\${inputData.city}' not found\`);
|
|
1390
1815
|
}
|
|
1391
1816
|
|
|
1392
1817
|
const { latitude, longitude, name } = geocodingData.results[0];
|
|
1393
1818
|
|
|
1394
|
-
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\`;
|
|
1395
1820
|
const response = await fetch(weatherUrl);
|
|
1396
1821
|
const data = (await response.json()) as {
|
|
1397
|
-
|
|
1398
|
-
time: string
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1822
|
+
current: {
|
|
1823
|
+
time: string
|
|
1824
|
+
precipitation: number
|
|
1825
|
+
weathercode: number
|
|
1826
|
+
}
|
|
1827
|
+
hourly: {
|
|
1828
|
+
precipitation_probability: number[]
|
|
1829
|
+
temperature_2m: number[]
|
|
1830
|
+
}
|
|
1831
|
+
}
|
|
1405
1832
|
|
|
1406
|
-
const forecast =
|
|
1407
|
-
date,
|
|
1408
|
-
maxTemp: data.
|
|
1409
|
-
minTemp: data.
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
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
|
+
}
|
|
1414
1844
|
|
|
1415
1845
|
return forecast;
|
|
1416
1846
|
},
|
|
1417
1847
|
});
|
|
1418
1848
|
|
|
1419
1849
|
|
|
1420
|
-
const planActivities =
|
|
1850
|
+
const planActivities = createStep({
|
|
1421
1851
|
id: 'plan-activities',
|
|
1422
1852
|
description: 'Suggests activities based on weather conditions',
|
|
1423
|
-
|
|
1424
|
-
|
|
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
|
+
}
|
|
1425
1863
|
|
|
1426
|
-
|
|
1427
|
-
|
|
1864
|
+
const agent = mastra?.getAgent('weatherAgent');
|
|
1865
|
+
if (!agent) {
|
|
1866
|
+
throw new Error('Weather agent not found');
|
|
1428
1867
|
}
|
|
1429
1868
|
|
|
1430
|
-
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:
|
|
1431
1870
|
\${JSON.stringify(forecast, null, 2)}
|
|
1432
|
-
|
|
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.\`;
|
|
1433
1910
|
|
|
1434
1911
|
const response = await agent.stream([
|
|
1435
1912
|
{
|
|
@@ -1439,7 +1916,7 @@ const planActivities = new Step({
|
|
|
1439
1916
|
]);
|
|
1440
1917
|
|
|
1441
1918
|
let activitiesText = '';
|
|
1442
|
-
|
|
1919
|
+
|
|
1443
1920
|
for await (const chunk of response.textStream) {
|
|
1444
1921
|
process.stdout.write(chunk);
|
|
1445
1922
|
activitiesText += chunk;
|
|
@@ -1451,35 +1928,16 @@ const planActivities = new Step({
|
|
|
1451
1928
|
},
|
|
1452
1929
|
});
|
|
1453
1930
|
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
1: 'Mainly clear',
|
|
1458
|
-
2: 'Partly cloudy',
|
|
1459
|
-
3: 'Overcast',
|
|
1460
|
-
45: 'Foggy',
|
|
1461
|
-
48: 'Depositing rime fog',
|
|
1462
|
-
51: 'Light drizzle',
|
|
1463
|
-
53: 'Moderate drizzle',
|
|
1464
|
-
55: 'Dense drizzle',
|
|
1465
|
-
61: 'Slight rain',
|
|
1466
|
-
63: 'Moderate rain',
|
|
1467
|
-
65: 'Heavy rain',
|
|
1468
|
-
71: 'Slight snow fall',
|
|
1469
|
-
73: 'Moderate snow fall',
|
|
1470
|
-
75: 'Heavy snow fall',
|
|
1471
|
-
95: 'Thunderstorm',
|
|
1472
|
-
};
|
|
1473
|
-
return conditions[code] || 'Unknown';
|
|
1474
|
-
}
|
|
1475
|
-
|
|
1476
|
-
const weatherWorkflow = new Workflow({
|
|
1477
|
-
name: 'weather-workflow',
|
|
1478
|
-
triggerSchema: z.object({
|
|
1931
|
+
const weatherWorkflow = createWorkflow({
|
|
1932
|
+
id: 'weather-workflow',
|
|
1933
|
+
inputSchema: z.object({
|
|
1479
1934
|
city: z.string().describe('The city to get the weather for'),
|
|
1480
1935
|
}),
|
|
1936
|
+
outputSchema: z.object({
|
|
1937
|
+
activities: z.string(),
|
|
1938
|
+
})
|
|
1481
1939
|
})
|
|
1482
|
-
.
|
|
1940
|
+
.then(fetchWeather)
|
|
1483
1941
|
.then(planActivities);
|
|
1484
1942
|
|
|
1485
1943
|
weatherWorkflow.commit();
|
|
@@ -1490,7 +1948,7 @@ export { weatherWorkflow };`;
|
|
|
1490
1948
|
semi: true,
|
|
1491
1949
|
singleQuote: true
|
|
1492
1950
|
});
|
|
1493
|
-
await
|
|
1951
|
+
await fs5.writeFile(destPath, formattedContent);
|
|
1494
1952
|
}
|
|
1495
1953
|
async function writeToolSample(destPath) {
|
|
1496
1954
|
const fileService = new FileService();
|
|
@@ -1503,14 +1961,14 @@ async function writeCodeSampleForComponents(llmprovider, component, destPath, im
|
|
|
1503
1961
|
case "tools":
|
|
1504
1962
|
return writeToolSample(destPath);
|
|
1505
1963
|
case "workflows":
|
|
1506
|
-
return writeWorkflowSample(destPath
|
|
1964
|
+
return writeWorkflowSample(destPath);
|
|
1507
1965
|
default:
|
|
1508
1966
|
return "";
|
|
1509
1967
|
}
|
|
1510
1968
|
}
|
|
1511
1969
|
var createComponentsDir = async (dirPath, component) => {
|
|
1512
1970
|
const componentPath = dirPath + `/${component}`;
|
|
1513
|
-
await
|
|
1971
|
+
await fsExtra.ensureDir(componentPath);
|
|
1514
1972
|
};
|
|
1515
1973
|
var writeIndexFile = async ({
|
|
1516
1974
|
dirPath,
|
|
@@ -1519,15 +1977,15 @@ var writeIndexFile = async ({
|
|
|
1519
1977
|
addWorkflow
|
|
1520
1978
|
}) => {
|
|
1521
1979
|
const indexPath = dirPath + "/index.ts";
|
|
1522
|
-
const destPath =
|
|
1980
|
+
const destPath = path3.join(indexPath);
|
|
1523
1981
|
try {
|
|
1524
|
-
await
|
|
1982
|
+
await fs5.writeFile(destPath, "");
|
|
1525
1983
|
const filteredExports = [
|
|
1526
1984
|
addWorkflow ? `workflows: { weatherWorkflow },` : "",
|
|
1527
1985
|
addAgent ? `agents: { weatherAgent },` : ""
|
|
1528
1986
|
].filter(Boolean);
|
|
1529
1987
|
if (!addExample) {
|
|
1530
|
-
await
|
|
1988
|
+
await fs5.writeFile(
|
|
1531
1989
|
destPath,
|
|
1532
1990
|
`
|
|
1533
1991
|
import { Mastra } from '@mastra/core';
|
|
@@ -1537,14 +1995,14 @@ export const mastra = new Mastra()
|
|
|
1537
1995
|
);
|
|
1538
1996
|
return;
|
|
1539
1997
|
}
|
|
1540
|
-
await
|
|
1998
|
+
await fs5.writeFile(
|
|
1541
1999
|
destPath,
|
|
1542
2000
|
`
|
|
1543
2001
|
import { Mastra } from '@mastra/core/mastra';
|
|
1544
|
-
import {
|
|
2002
|
+
import { PinoLogger } from '@mastra/loggers';
|
|
1545
2003
|
import { LibSQLStore } from '@mastra/libsql';
|
|
1546
|
-
${addWorkflow ? `import { weatherWorkflow } from './workflows';` : ""}
|
|
1547
|
-
${addAgent ? `import { weatherAgent } from './agents';` : ""}
|
|
2004
|
+
${addWorkflow ? `import { weatherWorkflow } from './workflows/weather-workflow';` : ""}
|
|
2005
|
+
${addAgent ? `import { weatherAgent } from './agents/weather-agent';` : ""}
|
|
1548
2006
|
|
|
1549
2007
|
export const mastra = new Mastra({
|
|
1550
2008
|
${filteredExports.join("\n ")}
|
|
@@ -1552,7 +2010,7 @@ export const mastra = new Mastra({
|
|
|
1552
2010
|
// stores telemetry, evals, ... into memory storage, if it needs to persist, change to file:../mastra.db
|
|
1553
2011
|
url: ":memory:",
|
|
1554
2012
|
}),
|
|
1555
|
-
logger:
|
|
2013
|
+
logger: new PinoLogger({
|
|
1556
2014
|
name: 'Mastra',
|
|
1557
2015
|
level: 'info',
|
|
1558
2016
|
}),
|
|
@@ -1579,6 +2037,9 @@ var getAPIKey = async (provider) => {
|
|
|
1579
2037
|
case "cerebras":
|
|
1580
2038
|
key = "CEREBRAS_API_KEY";
|
|
1581
2039
|
return key;
|
|
2040
|
+
case "mistral":
|
|
2041
|
+
key = "MISTRAL_API_KEY";
|
|
2042
|
+
return key;
|
|
1582
2043
|
default:
|
|
1583
2044
|
return key;
|
|
1584
2045
|
}
|
|
@@ -1588,21 +2049,23 @@ var writeAPIKey = async ({
|
|
|
1588
2049
|
apiKey = "your-api-key"
|
|
1589
2050
|
}) => {
|
|
1590
2051
|
const key = await getAPIKey(provider);
|
|
1591
|
-
|
|
2052
|
+
const escapedKey = shellQuote.quote([key]);
|
|
2053
|
+
const escapedApiKey = shellQuote.quote([apiKey]);
|
|
2054
|
+
await exec2(`echo ${escapedKey}=${escapedApiKey} >> .env`);
|
|
1592
2055
|
};
|
|
1593
2056
|
var createMastraDir = async (directory) => {
|
|
1594
2057
|
let dir = directory.trim().split("/").filter((item) => item !== "");
|
|
1595
|
-
const dirPath =
|
|
2058
|
+
const dirPath = path3.join(process.cwd(), ...dir, "mastra");
|
|
1596
2059
|
try {
|
|
1597
|
-
await
|
|
2060
|
+
await fs5.access(dirPath);
|
|
1598
2061
|
return { ok: false };
|
|
1599
2062
|
} catch {
|
|
1600
|
-
await
|
|
2063
|
+
await fsExtra.ensureDir(dirPath);
|
|
1601
2064
|
return { ok: true, dirPath };
|
|
1602
2065
|
}
|
|
1603
2066
|
};
|
|
1604
2067
|
var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
|
|
1605
|
-
const destPath = dirPath + `/${component}/
|
|
2068
|
+
const destPath = dirPath + `/${component}/weather-${component.slice(0, -1)}.ts`;
|
|
1606
2069
|
try {
|
|
1607
2070
|
await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
|
|
1608
2071
|
} catch (err) {
|
|
@@ -1610,40 +2073,27 @@ var writeCodeSample = async (dirPath, component, llmProvider, importComponents)
|
|
|
1610
2073
|
}
|
|
1611
2074
|
};
|
|
1612
2075
|
var interactivePrompt = async () => {
|
|
1613
|
-
|
|
1614
|
-
const mastraProject = await
|
|
2076
|
+
Ie(color2.inverse(" Mastra Init "));
|
|
2077
|
+
const mastraProject = await Ce(
|
|
1615
2078
|
{
|
|
1616
|
-
directory: () =>
|
|
2079
|
+
directory: () => he({
|
|
1617
2080
|
message: "Where should we create the Mastra files? (default: src/)",
|
|
1618
2081
|
placeholder: "src/",
|
|
1619
2082
|
defaultValue: "src/"
|
|
1620
2083
|
}),
|
|
1621
|
-
|
|
1622
|
-
message: "Choose components to install:",
|
|
1623
|
-
options: [
|
|
1624
|
-
{ value: "agents", label: "Agents", hint: "recommended" },
|
|
1625
|
-
{
|
|
1626
|
-
value: "workflows",
|
|
1627
|
-
label: "Workflows"
|
|
1628
|
-
}
|
|
1629
|
-
]
|
|
1630
|
-
}),
|
|
1631
|
-
shouldAddTools: () => ce({
|
|
1632
|
-
message: "Add tools?",
|
|
1633
|
-
initialValue: false
|
|
1634
|
-
}),
|
|
1635
|
-
llmProvider: () => le({
|
|
2084
|
+
llmProvider: () => ve({
|
|
1636
2085
|
message: "Select default provider:",
|
|
1637
2086
|
options: [
|
|
1638
2087
|
{ value: "openai", label: "OpenAI", hint: "recommended" },
|
|
1639
2088
|
{ value: "anthropic", label: "Anthropic" },
|
|
1640
2089
|
{ value: "groq", label: "Groq" },
|
|
1641
2090
|
{ value: "google", label: "Google" },
|
|
1642
|
-
{ value: "cerebras", label: "Cerebras" }
|
|
2091
|
+
{ value: "cerebras", label: "Cerebras" },
|
|
2092
|
+
{ value: "mistral", label: "Mistral" }
|
|
1643
2093
|
]
|
|
1644
2094
|
}),
|
|
1645
2095
|
llmApiKey: async ({ results: { llmProvider } }) => {
|
|
1646
|
-
const keyChoice = await
|
|
2096
|
+
const keyChoice = await ve({
|
|
1647
2097
|
message: `Enter your ${llmProvider} API key?`,
|
|
1648
2098
|
options: [
|
|
1649
2099
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
@@ -1652,21 +2102,18 @@ var interactivePrompt = async () => {
|
|
|
1652
2102
|
initialValue: "skip"
|
|
1653
2103
|
});
|
|
1654
2104
|
if (keyChoice === "enter") {
|
|
1655
|
-
return
|
|
2105
|
+
return he({
|
|
1656
2106
|
message: "Enter your API key:",
|
|
1657
2107
|
placeholder: "sk-..."
|
|
1658
2108
|
});
|
|
1659
2109
|
}
|
|
1660
2110
|
return void 0;
|
|
1661
2111
|
},
|
|
1662
|
-
addExample: () => ce({
|
|
1663
|
-
message: "Add example",
|
|
1664
|
-
initialValue: false
|
|
1665
|
-
}),
|
|
1666
2112
|
configureEditorWithDocsMCP: async () => {
|
|
1667
2113
|
const windsurfIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`windsurf`);
|
|
1668
2114
|
const cursorIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`cursor`);
|
|
1669
|
-
const
|
|
2115
|
+
const vscodeIsAlreadyInstalled = await globalMCPIsAlreadyInstalled(`vscode`);
|
|
2116
|
+
const editor = await ve({
|
|
1670
2117
|
message: `Make your AI IDE into a Mastra expert? (installs Mastra docs MCP server)`,
|
|
1671
2118
|
options: [
|
|
1672
2119
|
{ value: "skip", label: "Skip for now", hint: "default" },
|
|
@@ -1684,24 +2131,34 @@ var interactivePrompt = async () => {
|
|
|
1684
2131
|
value: "windsurf",
|
|
1685
2132
|
label: "Windsurf",
|
|
1686
2133
|
hint: windsurfIsAlreadyInstalled ? `Already installed` : void 0
|
|
2134
|
+
},
|
|
2135
|
+
{
|
|
2136
|
+
value: "vscode",
|
|
2137
|
+
label: "VSCode",
|
|
2138
|
+
hint: vscodeIsAlreadyInstalled ? `Already installed` : void 0
|
|
1687
2139
|
}
|
|
1688
2140
|
]
|
|
1689
2141
|
});
|
|
1690
2142
|
if (editor === `skip`) return void 0;
|
|
1691
2143
|
if (editor === `windsurf` && windsurfIsAlreadyInstalled) {
|
|
1692
|
-
|
|
2144
|
+
M.message(`
|
|
1693
2145
|
Windsurf is already installed, skipping.`);
|
|
1694
2146
|
return void 0;
|
|
1695
2147
|
}
|
|
2148
|
+
if (editor === `vscode` && vscodeIsAlreadyInstalled) {
|
|
2149
|
+
M.message(`
|
|
2150
|
+
VSCode is already installed, skipping.`);
|
|
2151
|
+
return void 0;
|
|
2152
|
+
}
|
|
1696
2153
|
if (editor === `cursor`) {
|
|
1697
|
-
|
|
2154
|
+
M.message(
|
|
1698
2155
|
`
|
|
1699
2156
|
Note: you will need to go into Cursor Settings -> MCP Settings and manually enable the installed Mastra MCP server.
|
|
1700
2157
|
`
|
|
1701
2158
|
);
|
|
1702
2159
|
}
|
|
1703
2160
|
if (editor === `cursor-global`) {
|
|
1704
|
-
const confirm2 = await
|
|
2161
|
+
const confirm2 = await ve({
|
|
1705
2162
|
message: `Global install will add/update ${cursorGlobalMCPConfigPath} and make the Mastra docs MCP server available in all your Cursor projects. Continue?`,
|
|
1706
2163
|
options: [
|
|
1707
2164
|
{ value: "yes", label: "Yes, I understand" },
|
|
@@ -1713,7 +2170,7 @@ Note: you will need to go into Cursor Settings -> MCP Settings and manually enab
|
|
|
1713
2170
|
}
|
|
1714
2171
|
}
|
|
1715
2172
|
if (editor === `windsurf`) {
|
|
1716
|
-
const confirm2 = await
|
|
2173
|
+
const confirm2 = await ve({
|
|
1717
2174
|
message: `Windsurf only supports a global MCP config (at ${windsurfGlobalMCPConfigPath}) is it ok to add/update that global config?
|
|
1718
2175
|
This means the Mastra docs MCP server will be available in all your Windsurf projects.`,
|
|
1719
2176
|
options: [
|
|
@@ -1730,17 +2187,15 @@ This means the Mastra docs MCP server will be available in all your Windsurf pro
|
|
|
1730
2187
|
},
|
|
1731
2188
|
{
|
|
1732
2189
|
onCancel: () => {
|
|
1733
|
-
|
|
2190
|
+
xe("Operation cancelled.");
|
|
1734
2191
|
process.exit(0);
|
|
1735
2192
|
}
|
|
1736
2193
|
}
|
|
1737
2194
|
);
|
|
1738
|
-
|
|
1739
|
-
const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
|
|
1740
|
-
return { ...rest, components: mastraComponents };
|
|
2195
|
+
return mastraProject;
|
|
1741
2196
|
};
|
|
1742
|
-
var s =
|
|
1743
|
-
var
|
|
2197
|
+
var s = Y();
|
|
2198
|
+
var exec3 = util.promisify(child_process.exec);
|
|
1744
2199
|
var init = async ({
|
|
1745
2200
|
directory,
|
|
1746
2201
|
addExample = false,
|
|
@@ -1782,13 +2237,18 @@ var init = async ({
|
|
|
1782
2237
|
if (needsMemory) {
|
|
1783
2238
|
await depService.installPackages(["@mastra/memory"]);
|
|
1784
2239
|
}
|
|
2240
|
+
const needsLoggers = await depService.checkDependencies(["@mastra/loggers"]) !== `ok`;
|
|
2241
|
+
if (needsLoggers) {
|
|
2242
|
+
await depService.installPackages(["@mastra/loggers"]);
|
|
2243
|
+
}
|
|
1785
2244
|
}
|
|
1786
2245
|
const key = await getAPIKey(llmProvider || "openai");
|
|
1787
2246
|
const aiSdkPackage = getAISDKPackage(llmProvider);
|
|
2247
|
+
const aiSdkPackageVersion = getAISDKPackageVersion(llmProvider);
|
|
1788
2248
|
const depsService = new DepsService();
|
|
1789
2249
|
const pm = depsService.packageManager;
|
|
1790
|
-
const installCommand =
|
|
1791
|
-
await
|
|
2250
|
+
const installCommand = getPackageManagerAddCommand(pm);
|
|
2251
|
+
await exec3(`${pm} ${installCommand} ${aiSdkPackage}@${aiSdkPackageVersion}`);
|
|
1792
2252
|
if (configureEditorWithDocsMCP) {
|
|
1793
2253
|
await installMastraDocsMCPServer({
|
|
1794
2254
|
editor: configureEditorWithDocsMCP,
|
|
@@ -1797,14 +2257,14 @@ var init = async ({
|
|
|
1797
2257
|
}
|
|
1798
2258
|
s.stop();
|
|
1799
2259
|
if (!llmApiKey) {
|
|
1800
|
-
|
|
2260
|
+
Me(`
|
|
1801
2261
|
${color2.green("Mastra initialized successfully!")}
|
|
1802
2262
|
|
|
1803
2263
|
Add your ${color2.cyan(key)} as an environment variable
|
|
1804
|
-
in your ${color2.cyan(".env
|
|
2264
|
+
in your ${color2.cyan(".env")} file
|
|
1805
2265
|
`);
|
|
1806
2266
|
} else {
|
|
1807
|
-
|
|
2267
|
+
Me(`
|
|
1808
2268
|
${color2.green("Mastra initialized successfully!")}
|
|
1809
2269
|
`);
|
|
1810
2270
|
}
|
|
@@ -1815,10 +2275,10 @@ var init = async ({
|
|
|
1815
2275
|
return { success: false };
|
|
1816
2276
|
}
|
|
1817
2277
|
};
|
|
1818
|
-
var
|
|
2278
|
+
var exec4 = util.promisify(child_process.exec);
|
|
1819
2279
|
var execWithTimeout = async (command, timeoutMs) => {
|
|
1820
2280
|
try {
|
|
1821
|
-
const promise =
|
|
2281
|
+
const promise = exec4(command, { killSignal: "SIGTERM" });
|
|
1822
2282
|
if (!timeoutMs) {
|
|
1823
2283
|
return await promise;
|
|
1824
2284
|
}
|
|
@@ -1838,23 +2298,29 @@ var execWithTimeout = async (command, timeoutMs) => {
|
|
|
1838
2298
|
throw error;
|
|
1839
2299
|
}
|
|
1840
2300
|
} catch (error) {
|
|
1841
|
-
console.error(error);
|
|
1842
2301
|
throw error;
|
|
1843
2302
|
}
|
|
1844
2303
|
};
|
|
1845
2304
|
async function installMastraDependency(pm, dependency, versionTag, isDev, timeout) {
|
|
1846
|
-
let installCommand =
|
|
2305
|
+
let installCommand = getPackageManagerAddCommand(pm);
|
|
1847
2306
|
if (isDev) {
|
|
1848
|
-
installCommand = `${installCommand}
|
|
2307
|
+
installCommand = `${installCommand} -D`;
|
|
1849
2308
|
}
|
|
1850
2309
|
try {
|
|
1851
2310
|
await execWithTimeout(`${pm} ${installCommand} ${dependency}${versionTag}`, timeout);
|
|
1852
2311
|
} catch (err) {
|
|
1853
|
-
console.log("err", err);
|
|
1854
2312
|
if (versionTag === "@latest") {
|
|
1855
|
-
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
|
+
);
|
|
1856
2323
|
}
|
|
1857
|
-
await execWithTimeout(`${pm} ${installCommand} ${dependency}@latest`, timeout);
|
|
1858
2324
|
}
|
|
1859
2325
|
}
|
|
1860
2326
|
var createMastraProject = async ({
|
|
@@ -1862,46 +2328,55 @@ var createMastraProject = async ({
|
|
|
1862
2328
|
createVersionTag,
|
|
1863
2329
|
timeout
|
|
1864
2330
|
}) => {
|
|
1865
|
-
|
|
1866
|
-
const projectName = name ?? await
|
|
2331
|
+
Ie(color2.inverse(" Mastra Create "));
|
|
2332
|
+
const projectName = name ?? await he({
|
|
1867
2333
|
message: "What do you want to name your project?",
|
|
1868
2334
|
placeholder: "my-mastra-app",
|
|
1869
2335
|
defaultValue: "my-mastra-app"
|
|
1870
2336
|
});
|
|
1871
|
-
if (
|
|
1872
|
-
|
|
2337
|
+
if (pD(projectName)) {
|
|
2338
|
+
xe("Operation cancelled");
|
|
1873
2339
|
process.exit(0);
|
|
1874
2340
|
}
|
|
1875
|
-
const s2 =
|
|
1876
|
-
s2.start("Creating project");
|
|
2341
|
+
const s2 = Y();
|
|
1877
2342
|
try {
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
2343
|
+
s2.start("Creating project");
|
|
2344
|
+
try {
|
|
2345
|
+
await fs5.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"}`
|
|
1883
2353
|
);
|
|
1884
|
-
process.exit(1);
|
|
1885
2354
|
}
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
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 '{
|
|
1905
2380
|
"compilerOptions": {
|
|
1906
2381
|
"target": "ES2022",
|
|
1907
2382
|
"module": "ES2022",
|
|
@@ -1917,31 +2392,60 @@ var createMastraProject = async ({
|
|
|
1917
2392
|
"src/**/*"
|
|
1918
2393
|
]
|
|
1919
2394
|
}' > tsconfig.json`);
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
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.info("");
|
|
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
|
+
}
|
|
1943
2443
|
};
|
|
1944
2444
|
var create = async (args2) => {
|
|
2445
|
+
if (args2.template !== void 0) {
|
|
2446
|
+
await createFromTemplate({ ...args2, injectedAnalytics: args2.analytics });
|
|
2447
|
+
return;
|
|
2448
|
+
}
|
|
1945
2449
|
const { projectName } = await createMastraProject({
|
|
1946
2450
|
projectName: args2?.projectName,
|
|
1947
2451
|
createVersionTag: args2?.createVersionTag,
|
|
@@ -1952,7 +2456,9 @@ var create = async (args2) => {
|
|
|
1952
2456
|
const result = await interactivePrompt();
|
|
1953
2457
|
await init({
|
|
1954
2458
|
...result,
|
|
1955
|
-
llmApiKey: result?.llmApiKey
|
|
2459
|
+
llmApiKey: result?.llmApiKey,
|
|
2460
|
+
components: ["agents", "tools", "workflows"],
|
|
2461
|
+
addExample: true
|
|
1956
2462
|
});
|
|
1957
2463
|
postCreate({ projectName });
|
|
1958
2464
|
return;
|
|
@@ -1970,27 +2476,181 @@ var create = async (args2) => {
|
|
|
1970
2476
|
};
|
|
1971
2477
|
var postCreate = ({ projectName }) => {
|
|
1972
2478
|
const packageManager = getPackageManager();
|
|
1973
|
-
|
|
2479
|
+
Se(`
|
|
1974
2480
|
${color2.green("To start your project:")}
|
|
1975
2481
|
|
|
1976
2482
|
${color2.cyan("cd")} ${projectName}
|
|
1977
2483
|
${color2.cyan(`${packageManager} run dev`)}
|
|
1978
2484
|
`);
|
|
1979
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
|
+
}
|
|
1980
2640
|
|
|
1981
2641
|
async function getPackageVersion() {
|
|
1982
2642
|
const __filename = fileURLToPath(import.meta.url);
|
|
1983
2643
|
const __dirname = dirname(__filename);
|
|
1984
|
-
const pkgJsonPath =
|
|
1985
|
-
const content = await fsExtra.readJSON(pkgJsonPath);
|
|
2644
|
+
const pkgJsonPath = path3.join(__dirname, "..", "package.json");
|
|
2645
|
+
const content = await fsExtra$1.readJSON(pkgJsonPath);
|
|
1986
2646
|
return content.version;
|
|
1987
2647
|
}
|
|
1988
2648
|
async function getCreateVersionTag() {
|
|
1989
2649
|
try {
|
|
1990
2650
|
const pkgPath = fileURLToPath(import.meta.resolve("create-mastra/package.json"));
|
|
1991
|
-
const json = await fsExtra.readJSON(pkgPath);
|
|
2651
|
+
const json = await fsExtra$1.readJSON(pkgPath);
|
|
1992
2652
|
const { stdout } = await execa("npm", ["dist-tag", "create-mastra"]);
|
|
1993
|
-
const tagLine = stdout.split("\n").find((distLine) => distLine.
|
|
2653
|
+
const tagLine = stdout.split("\n").find((distLine) => distLine.endsWith(`: ${json.version}`));
|
|
1994
2654
|
const tag = tagLine ? tagLine.split(":")[0].trim() : "latest";
|
|
1995
2655
|
return tag;
|
|
1996
2656
|
} catch {
|
|
@@ -2012,14 +2672,17 @@ program.version(`${version}`, "-v, --version").description(`create-mastra ${vers
|
|
|
2012
2672
|
analytics.trackCommand({
|
|
2013
2673
|
command: "version"
|
|
2014
2674
|
});
|
|
2015
|
-
console.
|
|
2675
|
+
console.info(`create-mastra ${version}`);
|
|
2016
2676
|
} catch {
|
|
2017
2677
|
}
|
|
2018
2678
|
});
|
|
2019
2679
|
program.name("create-mastra").description("Create a new Mastra project").argument("[project-name]", "Directory name of the project").option(
|
|
2020
2680
|
"-p, --project-name <string>",
|
|
2021
2681
|
"Project name that will be used in package.json and as the project directory name."
|
|
2022
|
-
).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) => {
|
|
2023
2686
|
const projectName = projectNameArg || args.projectName;
|
|
2024
2687
|
const timeout = args?.timeout ? args?.timeout === true ? 6e4 : parseInt(args?.timeout, 10) : void 0;
|
|
2025
2688
|
if (args.default) {
|
|
@@ -2029,7 +2692,10 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2029
2692
|
addExample: true,
|
|
2030
2693
|
createVersionTag,
|
|
2031
2694
|
timeout,
|
|
2032
|
-
mcpServer: args.mcp
|
|
2695
|
+
mcpServer: args.mcp,
|
|
2696
|
+
directory: "src/",
|
|
2697
|
+
template: args.template,
|
|
2698
|
+
analytics
|
|
2033
2699
|
});
|
|
2034
2700
|
return;
|
|
2035
2701
|
}
|
|
@@ -2042,7 +2708,9 @@ program.name("create-mastra").description("Create a new Mastra project").argumen
|
|
|
2042
2708
|
timeout,
|
|
2043
2709
|
projectName,
|
|
2044
2710
|
directory: args.dir,
|
|
2045
|
-
mcpServer: args.mcp
|
|
2711
|
+
mcpServer: args.mcp,
|
|
2712
|
+
template: args.template,
|
|
2713
|
+
analytics
|
|
2046
2714
|
});
|
|
2047
2715
|
});
|
|
2048
2716
|
program.parse(process.argv);
|