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