create-mastra 0.0.0-storage-20250225005900

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/dist/index.js ADDED
@@ -0,0 +1,1805 @@
1
+ #! /usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { randomUUID } from 'node:crypto';
4
+ import * as fs3__default from 'node:fs';
5
+ import fs3__default__default, { existsSync, readFileSync, writeFileSync } from 'node:fs';
6
+ import os from 'node:os';
7
+ import path, { dirname } from 'node:path';
8
+ import { PostHog } from 'posthog-node';
9
+ import { fileURLToPath } from 'node:url';
10
+ import h, { stdin, stdout } from 'node:process';
11
+ import * as f from 'node:readline';
12
+ import f__default from 'node:readline';
13
+ import tty, { WriteStream } from 'node:tty';
14
+ import child_process from 'node:child_process';
15
+ import util from 'node:util';
16
+ import prettier from 'prettier';
17
+ import fsExtra3 from 'fs-extra/esm';
18
+ import fs4 from 'node:fs/promises';
19
+ import { execa } from 'execa';
20
+ import pino from 'pino';
21
+ import pretty from 'pino-pretty';
22
+ import { Transform } from 'node:stream';
23
+ import fsExtra from 'fs-extra';
24
+
25
+ var __filename = fileURLToPath(import.meta.url);
26
+ var __dirname = path.dirname(__filename);
27
+ var PosthogAnalytics = class {
28
+ sessionId;
29
+ client;
30
+ distinctId;
31
+ version;
32
+ constructor({
33
+ version,
34
+ apiKey,
35
+ host = "https://app.posthog.com"
36
+ }) {
37
+ this.version = version;
38
+ const cliConfigPath = path.join(__dirname, "mastra-cli.json");
39
+ if (existsSync(cliConfigPath)) {
40
+ try {
41
+ const { distinctId, sessionId } = JSON.parse(readFileSync(cliConfigPath, "utf-8"));
42
+ this.distinctId = distinctId;
43
+ this.sessionId = sessionId;
44
+ } catch (e) {
45
+ this.sessionId = randomUUID();
46
+ this.distinctId = this.getDistinctId();
47
+ }
48
+ this.writeCliConfig({
49
+ distinctId: this.distinctId,
50
+ sessionId: this.sessionId
51
+ });
52
+ } else {
53
+ this.sessionId = randomUUID();
54
+ this.distinctId = this.getDistinctId();
55
+ this.writeCliConfig({
56
+ distinctId: this.distinctId,
57
+ sessionId: this.sessionId
58
+ });
59
+ }
60
+ if (this.isTelemetryEnabled()) {
61
+ this.initializePostHog(apiKey, host);
62
+ }
63
+ }
64
+ writeCliConfig({ distinctId, sessionId }) {
65
+ try {
66
+ writeFileSync(path.join(__dirname, "mastra-cli.json"), JSON.stringify({ distinctId, sessionId }));
67
+ } catch (e) {
68
+ }
69
+ }
70
+ initializePostHog(apiKey, host) {
71
+ this.client = new PostHog(apiKey, {
72
+ host,
73
+ flushAt: 1,
74
+ flushInterval: 0
75
+ });
76
+ this.captureSessionStart();
77
+ process.on("exit", () => {
78
+ this.client?.flush().catch(() => {
79
+ });
80
+ });
81
+ }
82
+ isTelemetryEnabled() {
83
+ if (process.env.NO_MASTRA_TELEMETRY) {
84
+ return false;
85
+ }
86
+ return true;
87
+ }
88
+ getDistinctId() {
89
+ const machineId = os.hostname();
90
+ return `mastra-${machineId}`;
91
+ }
92
+ getSystemProperties() {
93
+ return {
94
+ os: process.platform,
95
+ os_version: os.release(),
96
+ node_version: process.version,
97
+ platform: process.arch,
98
+ session_id: this.sessionId,
99
+ cli_version: this.version || "unknown",
100
+ machine_id: os.hostname()
101
+ };
102
+ }
103
+ captureSessionStart() {
104
+ if (!this.client) {
105
+ return;
106
+ }
107
+ this.client.capture({
108
+ distinctId: this.distinctId,
109
+ event: "cli_session_start",
110
+ properties: {
111
+ ...this.getSystemProperties()
112
+ }
113
+ });
114
+ }
115
+ trackCommand(options) {
116
+ try {
117
+ if (!this.client) {
118
+ return;
119
+ }
120
+ const commandData = {
121
+ command: options.command,
122
+ status: options.status || "success"
123
+ };
124
+ if (options.args) {
125
+ commandData.args = options.args;
126
+ }
127
+ if (options.durationMs) {
128
+ commandData.durationMs = options.durationMs;
129
+ }
130
+ if (options.error) {
131
+ commandData.error = options.error;
132
+ }
133
+ this.client.capture({
134
+ distinctId: this.distinctId,
135
+ event: "cli_command",
136
+ properties: {
137
+ ...this.getSystemProperties(),
138
+ ...commandData
139
+ }
140
+ });
141
+ } catch (e) {
142
+ }
143
+ }
144
+ // Helper method to wrap command execution with timing
145
+ async trackCommandExecution({
146
+ command,
147
+ args,
148
+ execution
149
+ }) {
150
+ const startTime = process.hrtime();
151
+ try {
152
+ const result = await execution();
153
+ const [seconds, nanoseconds] = process.hrtime(startTime);
154
+ const durationMs = seconds * 1e3 + nanoseconds / 1e6;
155
+ this.trackCommand({
156
+ command,
157
+ args,
158
+ durationMs,
159
+ status: "success"
160
+ });
161
+ return result;
162
+ } catch (error) {
163
+ const [seconds, nanoseconds] = process.hrtime(startTime);
164
+ const durationMs = seconds * 1e3 + nanoseconds / 1e6;
165
+ this.trackCommand({
166
+ command,
167
+ args,
168
+ durationMs,
169
+ status: "error",
170
+ error: error instanceof Error ? error.message : String(error)
171
+ });
172
+ throw error;
173
+ }
174
+ }
175
+ // Ensure PostHog client is shutdown properly
176
+ async shutdown() {
177
+ if (!this.client) {
178
+ return;
179
+ }
180
+ try {
181
+ await this.client.shutdown();
182
+ } catch (e) {
183
+ }
184
+ }
185
+ };
186
+
187
+ function getDefaultExportFromCjs (x) {
188
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
189
+ }
190
+
191
+ var src;
192
+ var hasRequiredSrc;
193
+
194
+ function requireSrc () {
195
+ if (hasRequiredSrc) return src;
196
+ hasRequiredSrc = 1;
197
+
198
+ const ESC = '\x1B';
199
+ const CSI = `${ESC}[`;
200
+ const beep = '\u0007';
201
+
202
+ const cursor = {
203
+ to(x, y) {
204
+ if (!y) return `${CSI}${x + 1}G`;
205
+ return `${CSI}${y + 1};${x + 1}H`;
206
+ },
207
+ move(x, y) {
208
+ let ret = '';
209
+
210
+ if (x < 0) ret += `${CSI}${-x}D`;
211
+ else if (x > 0) ret += `${CSI}${x}C`;
212
+
213
+ if (y < 0) ret += `${CSI}${-y}A`;
214
+ else if (y > 0) ret += `${CSI}${y}B`;
215
+
216
+ return ret;
217
+ },
218
+ up: (count = 1) => `${CSI}${count}A`,
219
+ down: (count = 1) => `${CSI}${count}B`,
220
+ forward: (count = 1) => `${CSI}${count}C`,
221
+ backward: (count = 1) => `${CSI}${count}D`,
222
+ nextLine: (count = 1) => `${CSI}E`.repeat(count),
223
+ prevLine: (count = 1) => `${CSI}F`.repeat(count),
224
+ left: `${CSI}G`,
225
+ hide: `${CSI}?25l`,
226
+ show: `${CSI}?25h`,
227
+ save: `${ESC}7`,
228
+ restore: `${ESC}8`
229
+ };
230
+
231
+ const scroll = {
232
+ up: (count = 1) => `${CSI}S`.repeat(count),
233
+ down: (count = 1) => `${CSI}T`.repeat(count)
234
+ };
235
+
236
+ const erase = {
237
+ screen: `${CSI}2J`,
238
+ up: (count = 1) => `${CSI}1J`.repeat(count),
239
+ down: (count = 1) => `${CSI}J`.repeat(count),
240
+ line: `${CSI}2K`,
241
+ lineEnd: `${CSI}K`,
242
+ lineStart: `${CSI}1K`,
243
+ lines(count) {
244
+ let clear = '';
245
+ for (let i = 0; i < count; i++)
246
+ clear += this.line + (i < count - 1 ? cursor.up() : '');
247
+ if (count)
248
+ clear += cursor.left;
249
+ return clear;
250
+ }
251
+ };
252
+
253
+ src = { cursor, scroll, erase, beep };
254
+ return src;
255
+ }
256
+
257
+ var srcExports = requireSrc();
258
+
259
+ var picocolors = {exports: {}};
260
+
261
+ var hasRequiredPicocolors;
262
+
263
+ function requirePicocolors () {
264
+ if (hasRequiredPicocolors) return picocolors.exports;
265
+ hasRequiredPicocolors = 1;
266
+ let p = process || {}, argv = p.argv || [], env = p.env || {};
267
+ let isColorSupported =
268
+ !(!!env.NO_COLOR || argv.includes("--no-color")) &&
269
+ (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI);
270
+
271
+ let formatter = (open, close, replace = open) =>
272
+ input => {
273
+ let string = "" + input, index = string.indexOf(close, open.length);
274
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close
275
+ };
276
+
277
+ let replaceClose = (string, close, replace, index) => {
278
+ let result = "", cursor = 0;
279
+ do {
280
+ result += string.substring(cursor, index) + replace;
281
+ cursor = index + close.length;
282
+ index = string.indexOf(close, cursor);
283
+ } while (~index)
284
+ return result + string.substring(cursor)
285
+ };
286
+
287
+ let createColors = (enabled = isColorSupported) => {
288
+ let f = enabled ? formatter : () => String;
289
+ return {
290
+ isColorSupported: enabled,
291
+ reset: f("\x1b[0m", "\x1b[0m"),
292
+ bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"),
293
+ dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"),
294
+ italic: f("\x1b[3m", "\x1b[23m"),
295
+ underline: f("\x1b[4m", "\x1b[24m"),
296
+ inverse: f("\x1b[7m", "\x1b[27m"),
297
+ hidden: f("\x1b[8m", "\x1b[28m"),
298
+ strikethrough: f("\x1b[9m", "\x1b[29m"),
299
+
300
+ black: f("\x1b[30m", "\x1b[39m"),
301
+ red: f("\x1b[31m", "\x1b[39m"),
302
+ green: f("\x1b[32m", "\x1b[39m"),
303
+ yellow: f("\x1b[33m", "\x1b[39m"),
304
+ blue: f("\x1b[34m", "\x1b[39m"),
305
+ magenta: f("\x1b[35m", "\x1b[39m"),
306
+ cyan: f("\x1b[36m", "\x1b[39m"),
307
+ white: f("\x1b[37m", "\x1b[39m"),
308
+ gray: f("\x1b[90m", "\x1b[39m"),
309
+
310
+ bgBlack: f("\x1b[40m", "\x1b[49m"),
311
+ bgRed: f("\x1b[41m", "\x1b[49m"),
312
+ bgGreen: f("\x1b[42m", "\x1b[49m"),
313
+ bgYellow: f("\x1b[43m", "\x1b[49m"),
314
+ bgBlue: f("\x1b[44m", "\x1b[49m"),
315
+ bgMagenta: f("\x1b[45m", "\x1b[49m"),
316
+ bgCyan: f("\x1b[46m", "\x1b[49m"),
317
+ bgWhite: f("\x1b[47m", "\x1b[49m"),
318
+
319
+ blackBright: f("\x1b[90m", "\x1b[39m"),
320
+ redBright: f("\x1b[91m", "\x1b[39m"),
321
+ greenBright: f("\x1b[92m", "\x1b[39m"),
322
+ yellowBright: f("\x1b[93m", "\x1b[39m"),
323
+ blueBright: f("\x1b[94m", "\x1b[39m"),
324
+ magentaBright: f("\x1b[95m", "\x1b[39m"),
325
+ cyanBright: f("\x1b[96m", "\x1b[39m"),
326
+ whiteBright: f("\x1b[97m", "\x1b[39m"),
327
+
328
+ bgBlackBright: f("\x1b[100m", "\x1b[49m"),
329
+ bgRedBright: f("\x1b[101m", "\x1b[49m"),
330
+ bgGreenBright: f("\x1b[102m", "\x1b[49m"),
331
+ bgYellowBright: f("\x1b[103m", "\x1b[49m"),
332
+ bgBlueBright: f("\x1b[104m", "\x1b[49m"),
333
+ bgMagentaBright: f("\x1b[105m", "\x1b[49m"),
334
+ bgCyanBright: f("\x1b[106m", "\x1b[49m"),
335
+ bgWhiteBright: f("\x1b[107m", "\x1b[49m"),
336
+ }
337
+ };
338
+
339
+ picocolors.exports = createColors();
340
+ picocolors.exports.createColors = createColors;
341
+ return picocolors.exports;
342
+ }
343
+
344
+ var picocolorsExports = /*@__PURE__*/ requirePicocolors();
345
+ var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
346
+
347
+ 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(`
348
+ `)];for(const[E,h]of n.entries()){if(t+=h,g.has(h)){const{groups:B}=new RegExp(`(?:\\${O}(?<code>\\d+)m|\\${w}(?<uri>.*)${b$1})`).exec(n.slice(E).join(""))||{groups:{}};if(B.code!==void 0){const p=Number.parseFloat(B.code);s=p===CD?void 0:p;}else B.uri!==void 0&&(C=B.uri.length===0?void 0:B.uri);}const o=sD.codes.get(Number(s));n[E+1]===`
349
+ `?(C&&(t+=L("")),s&&o&&(t+=N(o))):h===`
350
+ `&&(s&&o&&(t+=N(s)),C&&(t+=L(C)));}return t};function R$1(e,u,F){return String(e).normalize().replace(/\r\n/g,`
351
+ `).split(`
352
+ `).map(t=>oD(t,u,F)).join(`
353
+ `)}var nD=Object.defineProperty,aD=(e,u,F)=>u in e?nD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,a$1=(e,u,F)=>(aD(e,typeof u!="symbol"?u+"":u,F),F);function hD(e,u){if(e===u)return;const F=e.split(`
354
+ `),t=u.split(`
355
+ `),s=[];for(let C=0;C<Math.max(F.length,t.length);C++)F[C]!==t[C]&&s.push(C);return s}const V$1=Symbol("clack:cancel");function lD(e){return e===V$1}function v(e,u){e.isTTY&&e.setRawMode(u);}const z=new Map([["k","up"],["j","down"],["h","left"],["l","right"]]),xD=new Set(["up","down","left","right","space","enter"]);class x{constructor({render:u,input:F=stdin,output:t=stdout,...s},C=true){a$1(this,"input"),a$1(this,"output"),a$1(this,"rl"),a$1(this,"opts"),a$1(this,"_track",false),a$1(this,"_render"),a$1(this,"_cursor",0),a$1(this,"state","initial"),a$1(this,"value"),a$1(this,"error",""),a$1(this,"subscribers",new Map),a$1(this,"_prevFrame",""),this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=u.bind(this),this._track=C,this.input=F,this.output=t;}prompt(){const u=new WriteStream(0);return u._write=(F,t,s)=>{this._track&&(this.value=this.rl.line.replace(/\t/g,""),this._cursor=this.rl.cursor,this.emit("value",this.value)),s();},this.input.pipe(u),this.rl=f__default.createInterface({input:this.input,output:u,tabSize:2,prompt:"",escapeCodeTimeout:50}),f__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),v(this.input,true),this.output.on("resize",this.render),this.render(),new Promise((F,t)=>{this.once("submit",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v(this.input,false),F(this.value);}),this.once("cancel",()=>{this.output.write(srcExports.cursor.show),this.output.off("resize",this.render),v(this.input,false),F(V$1);});})}on(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F}),this.subscribers.set(u,t);}once(u,F){const t=this.subscribers.get(u)??[];t.push({cb:F,once:true}),this.subscribers.set(u,t);}emit(u,...F){const t=this.subscribers.get(u)??[],s=[];for(const C of t)C.cb(...F),C.once&&s.push(()=>t.splice(t.indexOf(C),1));for(const C of s)C();}unsubscribe(){this.subscribers.clear();}onKeypress(u,F){if(this.state==="error"&&(this.state="active"),F?.name&&!this._track&&z.has(F.name)&&this.emit("cursor",z.get(F.name)),F?.name&&xD.has(F.name)&&this.emit("cursor",F.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()),F?.name==="return"){if(this.opts.validate){const t=this.opts.validate(this.value);t&&(this.error=t,this.state="error",this.rl.write(this.value));}this.state!=="error"&&(this.state="submit");}u===""&&(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(`
356
+ `),v(this.input,false),this.rl.close(),this.emit(`${this.state}`,this.value),this.unsubscribe();}restoreCursor(){const u=R$1(this._prevFrame,process.stdout.columns,{hard:true}).split(`
357
+ `).length-1;this.output.write(srcExports.cursor.move(-999,u*-1));}render(){const u=R$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 F=hD(this._prevFrame,u);if(this.restoreCursor(),F&&F?.length===1){const t=F[0];this.output.write(srcExports.cursor.move(0,t)),this.output.write(srcExports.erase.lines(1));const s=u.split(`
358
+ `);this.output.write(s[t]),this._prevFrame=u,this.output.write(srcExports.cursor.move(0,s.length-t-1));return}else if(F&&F?.length>1){const t=F[0];this.output.write(srcExports.cursor.move(0,t)),this.output.write(srcExports.erase.down());const s=u.split(`
359
+ `).slice(t);this.output.write(s.join(`
360
+ `)),this._prevFrame=u;return}this.output.write(srcExports.erase.down());}this.output.write(u),this.state==="initial"&&(this.state="active"),this._prevFrame=u;}}}class BD extends x{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(u){super(u,false),this.value=!!u.initialValue,this.on("value",()=>{this.value=this._value;}),this.on("confirm",F=>{this.output.write(srcExports.cursor.move(0,-1)),this.value=F,this.state="submit",this.close();}),this.on("cursor",()=>{this.value=!this.value;});}}var fD=Object.defineProperty,gD=(e,u,F)=>u in e?fD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,K$1=(e,u,F)=>(gD(e,typeof u!="symbol"?u+"":u,F),F);let vD=class extends x{constructor(u){super(u,false),K$1(this,"options"),K$1(this,"cursor",0),this.options=u.options,this.value=[...u.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:F})=>F===u.cursorAt),0),this.on("key",F=>{F==="a"&&this.toggleAll();}),this.on("cursor",F=>{switch(F){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;case "space":this.toggleValue();break}});}get _value(){return this.options[this.cursor].value}toggleAll(){const u=this.value.length===this.options.length;this.value=u?[]:this.options.map(F=>F.value);}toggleValue(){const u=this.value.includes(this._value);this.value=u?this.value.filter(F=>F!==this._value):[...this.value,this._value];}};var wD=Object.defineProperty,yD=(e,u,F)=>u in e?wD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,Z=(e,u,F)=>(yD(e,typeof u!="symbol"?u+"":u,F),F);let $D=class extends x{constructor(u){super(u,false),Z(this,"options"),Z(this,"cursor",0),this.options=u.options,this.cursor=this.options.findIndex(({value:F})=>F===u.initialValue),this.cursor===-1&&(this.cursor=0),this.changeValue(),this.on("cursor",F=>{switch(F){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;}};var TD=Object.defineProperty,jD=(e,u,F)=>u in e?TD(e,u,{enumerable:true,configurable:true,writable:true,value:F}):e[u]=F,MD=(e,u,F)=>(jD(e,u+"",F),F);class PD extends x{constructor(u){super(u),MD(this,"valueWithCursor",""),this.on("finalize",()=>{this.value||(this.value=u.defaultValue),this.valueWithCursor=this.value;}),this.on("value",()=>{if(this.cursor>=this.value.length)this.valueWithCursor=`${this.value}${color2.inverse(color2.hidden("_"))}`;else {const F=this.value.slice(0,this.cursor),t=this.value.slice(this.cursor);this.valueWithCursor=`${F}${color2.inverse(t[0])}${t.slice(1)}`;}});}get cursor(){return this._cursor}}const WD=globalThis.process.platform.startsWith("win");function OD({input:e=stdin,output:u=stdout,overwrite:F=true,hideCursor:t=true}={}){const s=f.createInterface({input:e,output:u,prompt:"",tabSize:1});f.emitKeypressEvents(e,s),e.isTTY&&e.setRawMode(true);const C=(D,{name:i})=>{if(String(D)===""){t&&u.write(srcExports.cursor.show),process.exit(0);return}if(!F)return;let n=i==="return"?0:-1,E=i==="return"?-1:0;f.moveCursor(u,n,E,()=>{f.clearLine(u,1,()=>{e.once("keypress",C);});});};return t&&u.write(srcExports.cursor.hide),e.once("keypress",C),()=>{e.off("keypress",C),t&&u.write(srcExports.cursor.show),e.isTTY&&!WD&&e.setRawMode(false),s.terminal=false,s.close();}}
361
+
362
+ function K(){return h.platform!=="win32"?h.env.TERM!=="linux":!!h.env.CI||!!h.env.WT_SESSION||!!h.env.TERMINUS_SUBLIME||h.env.ConEmuTask==="{cmd::Cmder}"||h.env.TERM_PROGRAM==="Terminus-Sublime"||h.env.TERM_PROGRAM==="vscode"||h.env.TERM==="xterm-256color"||h.env.TERM==="alacritty"||h.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}const C=K(),u=(s,n)=>C?s:n,Y=u("\u25C6","*"),P=u("\u25A0","x"),V=u("\u25B2","x"),M=u("\u25C7","o"),Q=u("\u250C","T"),a=u("\u2502","|"),$=u("\u2514","\u2014"),I=u("\u25CF",">"),T=u("\u25CB"," "),j=u("\u25FB","[\u2022]"),b=u("\u25FC","[+]"),B=u("\u25FB","[ ]"),G=u("\u2500","-"),H=u("\u256E","+"),ee=u("\u251C","+"),te=u("\u256F","+"),y=s=>{switch(s){case "initial":case "active":return color2.cyan(Y);case "cancel":return color2.red(P);case "error":return color2.yellow(V);case "submit":return color2.green(M)}},E=s=>{const{cursor:n,options:t,style:i}=s,r=s.maxItems??1/0,o=Math.max(process.stdout.rows-4,0),c=Math.min(o,Math.max(r,5));let l=0;n>=l+c-3?l=Math.max(Math.min(n-c+3,t.length-c),0):n<l+2&&(l=Math.max(n-2,0));const d=c<t.length&&l>0,p=c<t.length&&l+c<t.length;return t.slice(l,l+c).map((S,f,x)=>{const g=f===0&&d,m=f===x.length-1&&p;return g||m?color2.dim("..."):i(S,f+l===n)})},ae=s=>new PD({validate:s.validate,placeholder:s.placeholder,defaultValue:s.defaultValue,initialValue:s.initialValue,render(){const n=`${color2.gray(a)}
363
+ ${y(this.state)} ${s.message}
364
+ `,t=s.placeholder?color2.inverse(s.placeholder[0])+color2.dim(s.placeholder.slice(1)):color2.inverse(color2.hidden("_")),i=this.value?this.valueWithCursor:t;switch(this.state){case "error":return `${n.trim()}
365
+ ${color2.yellow(a)} ${i}
366
+ ${color2.yellow($)} ${color2.yellow(this.error)}
367
+ `;case "submit":return `${n}${color2.gray(a)} ${color2.dim(this.value||s.placeholder)}`;case "cancel":return `${n}${color2.gray(a)} ${color2.strikethrough(color2.dim(this.value??""))}${this.value?.trim()?`
368
+ `+color2.gray(a):""}`;default:return `${n}${color2.cyan(a)} ${i}
369
+ ${color2.cyan($)}
370
+ `}}}).prompt(),ce=s=>{const n=s.active??"Yes",t=s.inactive??"No";return new BD({active:n,inactive:t,initialValue:s.initialValue??true,render(){const i=`${color2.gray(a)}
371
+ ${y(this.state)} ${s.message}
372
+ `,r=this.value?n:t;switch(this.state){case "submit":return `${i}${color2.gray(a)} ${color2.dim(r)}`;case "cancel":return `${i}${color2.gray(a)} ${color2.strikethrough(color2.dim(r))}
373
+ ${color2.gray(a)}`;default:return `${i}${color2.cyan(a)} ${this.value?`${color2.green(I)} ${n}`:`${color2.dim(T)} ${color2.dim(n)}`} ${color2.dim("/")} ${this.value?`${color2.dim(T)} ${color2.dim(t)}`:`${color2.green(I)} ${t}`}
374
+ ${color2.cyan($)}
375
+ `}}}).prompt()},le=s=>{const n=(t,i)=>{const r=t.label??String(t.value);switch(i){case "selected":return `${color2.dim(r)}`;case "active":return `${color2.green(I)} ${r} ${t.hint?color2.dim(`(${t.hint})`):""}`;case "cancelled":return `${color2.strikethrough(color2.dim(r))}`;default:return `${color2.dim(T)} ${color2.dim(r)}`}};return new $D({options:s.options,initialValue:s.initialValue,render(){const t=`${color2.gray(a)}
376
+ ${y(this.state)} ${s.message}
377
+ `;switch(this.state){case "submit":return `${t}${color2.gray(a)} ${n(this.options[this.cursor],"selected")}`;case "cancel":return `${t}${color2.gray(a)} ${n(this.options[this.cursor],"cancelled")}
378
+ ${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(`
379
+ ${color2.cyan(a)} `)}
380
+ ${color2.cyan($)}
381
+ `}}}).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.
382
+ ${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)}
383
+ ${y(this.state)} ${s.message}
384
+ `;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}
385
+ ${color2.gray(a)}`:""}`}case "error":{const r=this.error.split(`
386
+ `).map((o,c)=>c===0?`${color2.yellow($)} ${color2.yellow(o)}`:` ${o}`).join(`
387
+ `);return t+color2.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
388
+ ${color2.yellow(a)} `)+`
389
+ `+r+`
390
+ `}default:return `${t}${color2.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
391
+ ${color2.cyan(a)} `)}
392
+ ${color2.cyan($)}
393
+ `}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
394
+ ${s}
395
+ `.split(`
396
+ `),i=R(n).length,r=Math.max(t.reduce((c,l)=>(l=R(l),l.length>c?l.length:c),0),i)+2,o=t.map(c=>`${color2.gray(a)} ${color2.dim(c)}${" ".repeat(r-R(c).length)}${color2.gray(a)}`).join(`
397
+ `);process.stdout.write(`${color2.gray(a)}
398
+ ${color2.green(M)} ${color2.reset(n)} ${color2.gray(G.repeat(Math.max(r-i-1,1))+H)}
399
+ ${o}
400
+ ${color2.gray(ee+G.repeat(r+2)+te)}
401
+ `);},he=(s="")=>{process.stdout.write(`${color2.gray($)} ${color2.red(s)}
402
+
403
+ `);},pe=(s="")=>{process.stdout.write(`${color2.gray(Q)} ${s}
404
+ `);},ge=(s="")=>{process.stdout.write(`${color2.gray(a)}
405
+ ${color2.gray($)} ${s}
406
+
407
+ `);},_=()=>{const s=C?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],n=C?80:120;let t,i,r=false,o="";const c=g=>{const m=g>1?"Something went wrong":"Canceled";r&&x(m,g);},l=()=>c(2),d=()=>c(1),p=()=>{process.on("uncaughtExceptionMonitor",l),process.on("unhandledRejection",l),process.on("SIGINT",d),process.on("SIGTERM",d),process.on("exit",c);},S=()=>{process.removeListener("uncaughtExceptionMonitor",l),process.removeListener("unhandledRejection",l),process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d),process.removeListener("exit",c);},f=(g="")=>{r=true,t=OD(),o=g.replace(/\.+$/,""),process.stdout.write(`${color2.gray(a)}
408
+ `);let m=0,w=0;p(),i=setInterval(()=>{const L=color2.magenta(s[m]),O=".".repeat(Math.floor(w)).slice(0,3);process.stdout.write(srcExports.cursor.move(-999,0)),process.stdout.write(srcExports.erase.down(1)),process.stdout.write(`${L} ${o}${O}`),m=m+1<s.length?m+1:0,w=w<s.length?w+.125:0;},n);},x=(g="",m=0)=>{o=g??o,r=false,clearInterval(i);const w=m===0?color2.green(M):m===1?color2.red(P):color2.red(V);process.stdout.write(srcExports.cursor.move(-999,0)),process.stdout.write(srcExports.erase.down(1)),process.stdout.write(`${w} ${o}
409
+ `),S(),t();};return {start:f,stop:x,message:(g="")=>{o=g??o;}}};function ye(){const s=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(s,"g")}const ve=async(s,n)=>{const t={},i=Object.keys(s);for(const r of i){const o=s[r],c=await o({results:t})?.catch(l=>{throw l});if(typeof n?.onCancel=="function"&&lD(c)){t[r]="canceled",n.onCancel({results:t});continue}t[r]=c;}return t};
410
+
411
+ // eslint-disable-next-line no-warning-comments
412
+ // TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
413
+ // Lots of optionals here to support Deno.
414
+ const hasColors = tty?.WriteStream?.prototype?.hasColors?.() ?? false;
415
+
416
+ const format = (open, close) => {
417
+ if (!hasColors) {
418
+ return input => input;
419
+ }
420
+
421
+ const openCode = `\u001B[${open}m`;
422
+ const closeCode = `\u001B[${close}m`;
423
+
424
+ return input => {
425
+ const string = input + ''; // eslint-disable-line no-implicit-coercion -- This is faster.
426
+ let index = string.indexOf(closeCode);
427
+
428
+ if (index === -1) {
429
+ // Note: Intentionally not using string interpolation for performance reasons.
430
+ return openCode + string + closeCode;
431
+ }
432
+
433
+ // Handle nested colors.
434
+
435
+ // We could have done this, but it's too slow (as of Node.js 22).
436
+ // return openCode + string.replaceAll(closeCode, openCode) + closeCode;
437
+
438
+ let result = openCode;
439
+ let lastIndex = 0;
440
+
441
+ while (index !== -1) {
442
+ result += string.slice(lastIndex, index) + openCode;
443
+ lastIndex = index + closeCode.length;
444
+ index = string.indexOf(closeCode, lastIndex);
445
+ }
446
+
447
+ result += string.slice(lastIndex) + closeCode;
448
+
449
+ return result;
450
+ };
451
+ };
452
+
453
+ const reset = format(0, 0);
454
+ const bold = format(1, 22);
455
+ const dim = format(2, 22);
456
+ const italic = format(3, 23);
457
+ const underline = format(4, 24);
458
+ const overline = format(53, 55);
459
+ const inverse = format(7, 27);
460
+ const hidden = format(8, 28);
461
+ const strikethrough = format(9, 29);
462
+
463
+ const black = format(30, 39);
464
+ const red = format(31, 39);
465
+ const green = format(32, 39);
466
+ const yellow = format(33, 39);
467
+ const blue = format(34, 39);
468
+ const magenta = format(35, 39);
469
+ const cyan = format(36, 39);
470
+ const white = format(37, 39);
471
+ const gray = format(90, 39);
472
+
473
+ const bgBlack = format(40, 49);
474
+ const bgRed = format(41, 49);
475
+ const bgGreen = format(42, 49);
476
+ const bgYellow = format(43, 49);
477
+ const bgBlue = format(44, 49);
478
+ const bgMagenta = format(45, 49);
479
+ const bgCyan = format(46, 49);
480
+ const bgWhite = format(47, 49);
481
+ const bgGray = format(100, 49);
482
+
483
+ const redBright = format(91, 39);
484
+ const greenBright = format(92, 39);
485
+ const yellowBright = format(93, 39);
486
+ const blueBright = format(94, 39);
487
+ const magentaBright = format(95, 39);
488
+ const cyanBright = format(96, 39);
489
+ const whiteBright = format(97, 39);
490
+
491
+ const bgRedBright = format(101, 49);
492
+ const bgGreenBright = format(102, 49);
493
+ const bgYellowBright = format(103, 49);
494
+ const bgBlueBright = format(104, 49);
495
+ const bgMagentaBright = format(105, 49);
496
+ const bgCyanBright = format(106, 49);
497
+ const bgWhiteBright = format(107, 49);
498
+
499
+ var yoctocolors = /*#__PURE__*/Object.freeze({
500
+ __proto__: null,
501
+ bgBlack: bgBlack,
502
+ bgBlue: bgBlue,
503
+ bgBlueBright: bgBlueBright,
504
+ bgCyan: bgCyan,
505
+ bgCyanBright: bgCyanBright,
506
+ bgGray: bgGray,
507
+ bgGreen: bgGreen,
508
+ bgGreenBright: bgGreenBright,
509
+ bgMagenta: bgMagenta,
510
+ bgMagentaBright: bgMagentaBright,
511
+ bgRed: bgRed,
512
+ bgRedBright: bgRedBright,
513
+ bgWhite: bgWhite,
514
+ bgWhiteBright: bgWhiteBright,
515
+ bgYellow: bgYellow,
516
+ bgYellowBright: bgYellowBright,
517
+ black: black,
518
+ blue: blue,
519
+ blueBright: blueBright,
520
+ bold: bold,
521
+ cyan: cyan,
522
+ cyanBright: cyanBright,
523
+ dim: dim,
524
+ gray: gray,
525
+ green: green,
526
+ greenBright: greenBright,
527
+ hidden: hidden,
528
+ inverse: inverse,
529
+ italic: italic,
530
+ magenta: magenta,
531
+ magentaBright: magentaBright,
532
+ overline: overline,
533
+ red: red,
534
+ redBright: redBright,
535
+ reset: reset,
536
+ strikethrough: strikethrough,
537
+ underline: underline,
538
+ white: white,
539
+ whiteBright: whiteBright,
540
+ yellow: yellow,
541
+ yellowBright: yellowBright
542
+ });
543
+
544
+ const isUnicodeSupported = h.platform !== 'win32' || Boolean(h.env.WT_SESSION);
545
+
546
+ const isInteractive = stream => Boolean(
547
+ stream.isTTY
548
+ && h.env.TERM !== 'dumb'
549
+ && !('CI' in h.env),
550
+ );
551
+
552
+ const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
553
+ const successSymbol = green(isUnicodeSupported ? '✔' : '√');
554
+ const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
555
+ const errorSymbol = red(isUnicodeSupported ? '✖️' : '×');
556
+
557
+ const defaultSpinner = {
558
+ frames: isUnicodeSupported
559
+ ? [
560
+ '⠋',
561
+ '⠙',
562
+ '⠹',
563
+ '⠸',
564
+ '⠼',
565
+ '⠴',
566
+ '⠦',
567
+ '⠧',
568
+ '⠇',
569
+ '⠏',
570
+ ]
571
+ : [
572
+ '-',
573
+ '\\',
574
+ '|',
575
+ '/',
576
+ ],
577
+ interval: 80,
578
+ };
579
+
580
+ class YoctoSpinner {
581
+ #frames;
582
+ #interval;
583
+ #currentFrame = -1;
584
+ #timer;
585
+ #text;
586
+ #stream;
587
+ #color;
588
+ #lines = 0;
589
+ #exitHandlerBound;
590
+ #isInteractive;
591
+ #lastSpinnerFrameTime = 0;
592
+
593
+ constructor(options = {}) {
594
+ const spinner = options.spinner ?? defaultSpinner;
595
+ this.#frames = spinner.frames;
596
+ this.#interval = spinner.interval;
597
+ this.#text = options.text ?? '';
598
+ this.#stream = options.stream ?? h.stderr;
599
+ this.#color = options.color ?? 'cyan';
600
+ this.#isInteractive = isInteractive(this.#stream);
601
+ this.#exitHandlerBound = this.#exitHandler.bind(this);
602
+ }
603
+
604
+ start(text) {
605
+ if (text) {
606
+ this.#text = text;
607
+ }
608
+
609
+ if (this.isSpinning) {
610
+ return this;
611
+ }
612
+
613
+ this.#hideCursor();
614
+ this.#render();
615
+ this.#subscribeToProcessEvents();
616
+
617
+ this.#timer = setInterval(() => {
618
+ this.#render();
619
+ }, this.#interval);
620
+
621
+ return this;
622
+ }
623
+
624
+ stop(finalText) {
625
+ if (!this.isSpinning) {
626
+ return this;
627
+ }
628
+
629
+ clearInterval(this.#timer);
630
+ this.#timer = undefined;
631
+ this.#showCursor();
632
+ this.clear();
633
+ this.#unsubscribeFromProcessEvents();
634
+
635
+ if (finalText) {
636
+ this.#stream.write(`${finalText}\n`);
637
+ }
638
+
639
+ return this;
640
+ }
641
+
642
+ #symbolStop(symbol, text) {
643
+ return this.stop(`${symbol} ${text ?? this.#text}`);
644
+ }
645
+
646
+ success(text) {
647
+ return this.#symbolStop(successSymbol, text);
648
+ }
649
+
650
+ error(text) {
651
+ return this.#symbolStop(errorSymbol, text);
652
+ }
653
+
654
+ warning(text) {
655
+ return this.#symbolStop(warningSymbol, text);
656
+ }
657
+
658
+ info(text) {
659
+ return this.#symbolStop(infoSymbol, text);
660
+ }
661
+
662
+ get isSpinning() {
663
+ return this.#timer !== undefined;
664
+ }
665
+
666
+ get text() {
667
+ return this.#text;
668
+ }
669
+
670
+ set text(value = '') {
671
+ this.#text = value;
672
+ this.#render();
673
+ }
674
+
675
+ get color() {
676
+ return this.#color;
677
+ }
678
+
679
+ set color(value) {
680
+ this.#color = value;
681
+ this.#render();
682
+ }
683
+
684
+ clear() {
685
+ if (!this.#isInteractive) {
686
+ return this;
687
+ }
688
+
689
+ this.#stream.cursorTo(0);
690
+
691
+ for (let index = 0; index < this.#lines; index++) {
692
+ if (index > 0) {
693
+ this.#stream.moveCursor(0, -1);
694
+ }
695
+
696
+ this.#stream.clearLine(1);
697
+ }
698
+
699
+ this.#lines = 0;
700
+
701
+ return this;
702
+ }
703
+
704
+ #render() {
705
+ // Ensure we only update the spinner frame at the wanted interval,
706
+ // even if the frame method is called more often.
707
+ const now = Date.now();
708
+ if (this.#currentFrame === -1 || now - this.#lastSpinnerFrameTime >= this.#interval) {
709
+ this.#currentFrame = ++this.#currentFrame % this.#frames.length;
710
+ this.#lastSpinnerFrameTime = now;
711
+ }
712
+
713
+ const applyColor = yoctocolors[this.#color] ?? cyan;
714
+ const frame = this.#frames[this.#currentFrame];
715
+ let string = `${applyColor(frame)} ${this.#text}`;
716
+
717
+ if (!this.#isInteractive) {
718
+ string += '\n';
719
+ }
720
+
721
+ this.clear();
722
+ this.#write(string);
723
+
724
+ if (this.#isInteractive) {
725
+ this.#lines = this.#lineCount(string);
726
+ }
727
+ }
728
+
729
+ #write(text) {
730
+ this.#stream.write(text);
731
+ }
732
+
733
+ #lineCount(text) {
734
+ const width = this.#stream.columns ?? 80;
735
+ const lines = text.split('\n');
736
+
737
+ let lineCount = 0;
738
+ for (const line of lines) {
739
+ lineCount += Math.max(1, Math.ceil(line.length / width));
740
+ }
741
+
742
+ return lineCount;
743
+ }
744
+
745
+ #hideCursor() {
746
+ if (this.#isInteractive) {
747
+ this.#write('\u001B[?25l');
748
+ }
749
+ }
750
+
751
+ #showCursor() {
752
+ if (this.#isInteractive) {
753
+ this.#write('\u001B[?25h');
754
+ }
755
+ }
756
+
757
+ #subscribeToProcessEvents() {
758
+ h.once('SIGINT', this.#exitHandlerBound);
759
+ h.once('SIGTERM', this.#exitHandlerBound);
760
+ }
761
+
762
+ #unsubscribeFromProcessEvents() {
763
+ h.off('SIGINT', this.#exitHandlerBound);
764
+ h.off('SIGTERM', this.#exitHandlerBound);
765
+ }
766
+
767
+ #exitHandler(signal) {
768
+ if (this.isSpinning) {
769
+ this.stop();
770
+ }
771
+
772
+ // SIGINT: 128 + 2
773
+ // SIGTERM: 128 + 15
774
+ const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
775
+ h.exit(exitCode);
776
+ }
777
+ }
778
+
779
+ function yoctoSpinner(options) {
780
+ return new YoctoSpinner(options);
781
+ }
782
+
783
+ var LogLevel = {
784
+ INFO: "info"};
785
+ var Logger = class {
786
+ logger;
787
+ transports;
788
+ constructor(options = {}) {
789
+ this.transports = options.transports || {};
790
+ const transportsAry = Object.entries(this.transports);
791
+ this.logger = pino(
792
+ {
793
+ name: options.name || "app",
794
+ level: options.level || LogLevel.INFO
795
+ },
796
+ options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? pretty({
797
+ colorize: true,
798
+ levelFirst: true,
799
+ ignore: "pid,hostname",
800
+ colorizeObjects: true,
801
+ translateTime: "SYS:standard",
802
+ singleLine: false
803
+ }) : pino.multistream([
804
+ ...transportsAry.map(([_, transport]) => ({
805
+ stream: transport,
806
+ level: options.level || LogLevel.INFO
807
+ })),
808
+ {
809
+ stream: pretty({
810
+ colorize: true,
811
+ levelFirst: true,
812
+ ignore: "pid,hostname",
813
+ colorizeObjects: true,
814
+ translateTime: "SYS:standard",
815
+ singleLine: false
816
+ }),
817
+ level: options.level || LogLevel.INFO
818
+ }
819
+ ])
820
+ );
821
+ }
822
+ debug(message, args = {}) {
823
+ this.logger.debug(args, message);
824
+ }
825
+ info(message, args = {}) {
826
+ this.logger.info(args, message);
827
+ }
828
+ warn(message, args = {}) {
829
+ this.logger.warn(args, message);
830
+ }
831
+ error(message, args = {}) {
832
+ this.logger.error(args, message);
833
+ }
834
+ // Stream creation for process output handling
835
+ createStream() {
836
+ return new Transform({
837
+ transform: (chunk, _encoding, callback) => {
838
+ const line = chunk.toString().trim();
839
+ if (line) {
840
+ this.info(line);
841
+ }
842
+ callback(null, chunk);
843
+ }
844
+ });
845
+ }
846
+ async getLogs(transportId) {
847
+ if (!transportId || !this.transports[transportId]) {
848
+ return [];
849
+ }
850
+ return this.transports[transportId].getLogs();
851
+ }
852
+ async getLogsByRunId({ runId, transportId }) {
853
+ return this.transports[transportId]?.getLogsByRunId({ runId });
854
+ }
855
+ };
856
+ function createLogger(options) {
857
+ return new Logger(options);
858
+ }
859
+
860
+ function getPackageManager() {
861
+ const userAgent = process.env.npm_config_user_agent || "";
862
+ const execPath = process.env.npm_execpath || "";
863
+ if (userAgent.includes("yarn")) {
864
+ return "yarn";
865
+ }
866
+ if (userAgent.includes("pnpm")) {
867
+ return "pnpm";
868
+ }
869
+ if (userAgent.includes("npm")) {
870
+ return "npm";
871
+ }
872
+ if (execPath.includes("yarn")) {
873
+ return "yarn";
874
+ }
875
+ if (execPath.includes("pnpm")) {
876
+ return "pnpm";
877
+ }
878
+ if (execPath.includes("npm")) {
879
+ return "npm";
880
+ }
881
+ return "npm";
882
+ }
883
+ function getPackageManagerInstallCommand(pm) {
884
+ switch (pm) {
885
+ case "npm":
886
+ return "install";
887
+ case "yarn":
888
+ return "add";
889
+ case "pnpm":
890
+ return "add";
891
+ default:
892
+ return "install";
893
+ }
894
+ }
895
+ var DepsService = class {
896
+ packageManager;
897
+ constructor() {
898
+ this.packageManager = this.getPackageManager();
899
+ }
900
+ findLockFile(dir) {
901
+ const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
902
+ for (const file of lockFiles) {
903
+ if (fs3__default__default.existsSync(path.join(dir, file))) {
904
+ return file;
905
+ }
906
+ }
907
+ const parentDir = path.resolve(dir, "..");
908
+ if (parentDir !== dir) {
909
+ return this.findLockFile(parentDir);
910
+ }
911
+ return null;
912
+ }
913
+ getPackageManager() {
914
+ const lockFile = this.findLockFile(process.cwd());
915
+ switch (lockFile) {
916
+ case "pnpm-lock.yaml":
917
+ return "pnpm";
918
+ case "package-lock.json":
919
+ return "npm";
920
+ case "yarn.lock":
921
+ return "yarn";
922
+ case "bun.lock":
923
+ return "bun";
924
+ default:
925
+ return "npm";
926
+ }
927
+ }
928
+ async installPackages(packages) {
929
+ let runCommand = this.packageManager;
930
+ if (this.packageManager === "npm") {
931
+ runCommand = `${this.packageManager} i`;
932
+ } else {
933
+ runCommand = `${this.packageManager} add`;
934
+ }
935
+ const packageList = packages.join(" ");
936
+ return execa(`${runCommand} ${packageList}`, {
937
+ all: true,
938
+ shell: true,
939
+ stdio: "inherit"
940
+ });
941
+ }
942
+ async checkDependencies(dependencies) {
943
+ try {
944
+ const packageJsonPath = path.join(process.cwd(), "package.json");
945
+ try {
946
+ await fs4.access(packageJsonPath);
947
+ } catch {
948
+ return "No package.json file found in the current directory";
949
+ }
950
+ const packageJson = JSON.parse(await fs4.readFile(packageJsonPath, "utf-8"));
951
+ for (const dependency of dependencies) {
952
+ if (!packageJson.dependencies || !packageJson.dependencies[dependency]) {
953
+ return `Please install ${dependency} before running this command (${this.packageManager} install ${dependency})`;
954
+ }
955
+ }
956
+ return "ok";
957
+ } catch (err) {
958
+ console.error(err);
959
+ return "Could not check dependencies";
960
+ }
961
+ }
962
+ async getProjectName() {
963
+ try {
964
+ const packageJsonPath = path.join(process.cwd(), "package.json");
965
+ const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
966
+ const pkg = JSON.parse(packageJson);
967
+ return pkg.name;
968
+ } catch (err) {
969
+ throw err;
970
+ }
971
+ }
972
+ async getPackageVersion() {
973
+ const __filename = fileURLToPath(import.meta.url);
974
+ const __dirname = dirname(__filename);
975
+ const pkgJsonPath = path.join(__dirname, "..", "package.json");
976
+ const content = await fsExtra3.readJSON(pkgJsonPath);
977
+ return content.version;
978
+ }
979
+ async addScriptsToPackageJson(scripts) {
980
+ const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
981
+ packageJson.scripts = {
982
+ ...packageJson.scripts,
983
+ ...scripts
984
+ };
985
+ await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
986
+ }
987
+ };
988
+ var EnvService = class {
989
+ };
990
+ var FileEnvService = class extends EnvService {
991
+ filePath;
992
+ constructor(filePath) {
993
+ super();
994
+ this.filePath = filePath;
995
+ }
996
+ readFile(filePath) {
997
+ return new Promise((resolve, reject) => {
998
+ fs3__default.readFile(filePath, "utf8", (err, data) => {
999
+ if (err) reject(err);
1000
+ else resolve(data);
1001
+ });
1002
+ });
1003
+ }
1004
+ writeFile({ filePath, data }) {
1005
+ return new Promise((resolve, reject) => {
1006
+ fs3__default.writeFile(filePath, data, "utf8", (err) => {
1007
+ if (err) reject(err);
1008
+ else resolve();
1009
+ });
1010
+ });
1011
+ }
1012
+ async updateEnvData({
1013
+ key,
1014
+ value,
1015
+ filePath = this.filePath,
1016
+ data
1017
+ }) {
1018
+ const regex = new RegExp(`^${key}=.*$`, "m");
1019
+ if (data.match(regex)) {
1020
+ data = data.replace(regex, `${key}=${value}`);
1021
+ } else {
1022
+ data += `
1023
+ ${key}=${value}`;
1024
+ }
1025
+ await this.writeFile({ filePath, data });
1026
+ console.log(`${key} set to ${value} in ENV file.`);
1027
+ return data;
1028
+ }
1029
+ async getEnvValue(key) {
1030
+ try {
1031
+ const data = await this.readFile(this.filePath);
1032
+ const regex = new RegExp(`^${key}=(.*)$`, "m");
1033
+ const match = data.match(regex);
1034
+ return match?.[1] || null;
1035
+ } catch (err) {
1036
+ console.error(`Error reading ENV value: ${err}`);
1037
+ return null;
1038
+ }
1039
+ }
1040
+ async setEnvValue(key, value) {
1041
+ try {
1042
+ const data = await this.readFile(this.filePath);
1043
+ await this.updateEnvData({ key, value, data });
1044
+ } catch (err) {
1045
+ console.error(`Error writing ENV value: ${err}`);
1046
+ }
1047
+ }
1048
+ };
1049
+ var FileService = class {
1050
+ /**
1051
+ *
1052
+ * @param inputFile the file in the starter files directory to copy
1053
+ * @param outputFilePath the destination path
1054
+ * @param replaceIfExists flag to replace if it exists
1055
+ * @returns
1056
+ */
1057
+ async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
1058
+ const __filename = fileURLToPath(import.meta.url);
1059
+ const __dirname = path.dirname(__filename);
1060
+ const filePath = path.resolve(__dirname, "starter-files", inputFile);
1061
+ const fileString = fs3__default__default.readFileSync(filePath, "utf8");
1062
+ if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
1063
+ console.log(`${outputFilePath} already exists`);
1064
+ return false;
1065
+ }
1066
+ await fsExtra3.outputFile(outputFilePath, fileString);
1067
+ return true;
1068
+ }
1069
+ async setupEnvFile({ dbUrl }) {
1070
+ const envPath = path.join(process.cwd(), ".env.development");
1071
+ await fsExtra3.ensureFile(envPath);
1072
+ const fileEnvService = new FileEnvService(envPath);
1073
+ await fileEnvService.setEnvValue("DB_URL", dbUrl);
1074
+ }
1075
+ getFirstExistingFile(files) {
1076
+ for (const f of files) {
1077
+ if (fs3__default__default.existsSync(f)) {
1078
+ return f;
1079
+ }
1080
+ }
1081
+ throw new Error("Missing required file, checked the following paths: " + files.join(", "));
1082
+ }
1083
+ replaceValuesInFile({
1084
+ filePath,
1085
+ replacements
1086
+ }) {
1087
+ let fileContent = fs3__default__default.readFileSync(filePath, "utf8");
1088
+ replacements.forEach(({ search, replace }) => {
1089
+ fileContent = fileContent.replaceAll(search, replace);
1090
+ });
1091
+ fs3__default__default.writeFileSync(filePath, fileContent);
1092
+ }
1093
+ };
1094
+ createLogger({
1095
+ name: "Mastra CLI",
1096
+ level: "debug"
1097
+ });
1098
+ var exec = util.promisify(child_process.exec);
1099
+ var getAISDKPackage = (llmProvider) => {
1100
+ switch (llmProvider) {
1101
+ case "openai":
1102
+ return "@ai-sdk/openai";
1103
+ case "anthropic":
1104
+ return "@ai-sdk/anthropic";
1105
+ case "groq":
1106
+ return "@ai-sdk/groq";
1107
+ default:
1108
+ return "@ai-sdk/openai";
1109
+ }
1110
+ };
1111
+ var getProviderImportAndModelItem = (llmProvider) => {
1112
+ let providerImport = "";
1113
+ let modelItem = "";
1114
+ if (llmProvider === "openai") {
1115
+ providerImport = `import { openai } from '${getAISDKPackage(llmProvider)}';`;
1116
+ modelItem = `openai('gpt-4o')`;
1117
+ } else if (llmProvider === "anthropic") {
1118
+ providerImport = `import { anthropic } from '${getAISDKPackage(llmProvider)}';`;
1119
+ modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
1120
+ } else if (llmProvider === "groq") {
1121
+ providerImport = `import { groq } from '${getAISDKPackage(llmProvider)}';`;
1122
+ modelItem = `groq('llama3-groq-70b-8192-tool-use-preview')`;
1123
+ }
1124
+ return { providerImport, modelItem };
1125
+ };
1126
+ async function writeAgentSample(llmProvider, destPath, addExampleTool) {
1127
+ const { providerImport, modelItem } = getProviderImportAndModelItem(llmProvider);
1128
+ const instructions = `
1129
+ You are a helpful weather assistant that provides accurate weather information.
1130
+
1131
+ Your primary function is to help users get weather details for specific locations. When responding:
1132
+ - Always ask for a location if none is provided
1133
+ - If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
1134
+ - Include relevant details like humidity, wind conditions, and precipitation
1135
+ - Keep responses concise but informative
1136
+
1137
+ ${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
1138
+ `;
1139
+ const content = `
1140
+ ${providerImport}
1141
+ import { Agent } from '@mastra/core/agent';
1142
+ ${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
1143
+
1144
+ export const weatherAgent = new Agent({
1145
+ name: 'Weather Agent',
1146
+ instructions: \`${instructions}\`,
1147
+ model: ${modelItem},
1148
+ ${addExampleTool ? "tools: { weatherTool }," : ""}
1149
+ });
1150
+ `;
1151
+ const formattedContent = await prettier.format(content, {
1152
+ parser: "typescript",
1153
+ singleQuote: true
1154
+ });
1155
+ await fs4.writeFile(destPath, "");
1156
+ await fs4.writeFile(destPath, formattedContent);
1157
+ }
1158
+ async function writeWorkflowSample(destPath, llmProvider) {
1159
+ const { providerImport, modelItem } = getProviderImportAndModelItem(llmProvider);
1160
+ const content = `${providerImport}
1161
+ import { Agent } from '@mastra/core/agent';
1162
+ import { Step, Workflow } from '@mastra/core/workflows';
1163
+ import { z } from 'zod';
1164
+
1165
+ const llm = ${modelItem};
1166
+
1167
+ const agent = new Agent({
1168
+ name: 'Weather Agent',
1169
+ model: llm,
1170
+ instructions: \`
1171
+ You are a local activities and travel expert who excels at weather-based planning. Analyze the weather data and provide practical activity recommendations.
1172
+
1173
+ For each day in the forecast, structure your response exactly as follows:
1174
+
1175
+ \u{1F4C5} [Day, Month Date, Year]
1176
+ \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
1177
+
1178
+ \u{1F321}\uFE0F WEATHER SUMMARY
1179
+ \u2022 Conditions: [brief description]
1180
+ \u2022 Temperature: [X\xB0C/Y\xB0F to A\xB0C/B\xB0F]
1181
+ \u2022 Precipitation: [X% chance]
1182
+
1183
+ \u{1F305} MORNING ACTIVITIES
1184
+ Outdoor:
1185
+ \u2022 [Activity Name] - [Brief description including specific location/route]
1186
+ Best timing: [specific time range]
1187
+ Note: [relevant weather consideration]
1188
+
1189
+ \u{1F31E} AFTERNOON ACTIVITIES
1190
+ Outdoor:
1191
+ \u2022 [Activity Name] - [Brief description including specific location/route]
1192
+ Best timing: [specific time range]
1193
+ Note: [relevant weather consideration]
1194
+
1195
+ \u{1F3E0} INDOOR ALTERNATIVES
1196
+ \u2022 [Activity Name] - [Brief description including specific venue]
1197
+ Ideal for: [weather condition that would trigger this alternative]
1198
+
1199
+ \u26A0\uFE0F SPECIAL CONSIDERATIONS
1200
+ \u2022 [Any relevant weather warnings, UV index, wind conditions, etc.]
1201
+
1202
+ Guidelines:
1203
+ - Suggest 2-3 time-specific outdoor activities per day
1204
+ - Include 1-2 indoor backup options
1205
+ - For precipitation >50%, lead with indoor activities
1206
+ - All activities must be specific to the location
1207
+ - Include specific venues, trails, or locations
1208
+ - Consider activity intensity based on temperature
1209
+ - Keep descriptions concise but informative
1210
+
1211
+ Maintain this exact formatting for consistency, using the emoji and section headers as shown.
1212
+ \`,
1213
+ });
1214
+
1215
+ const fetchWeather = new Step({
1216
+ id: 'fetch-weather',
1217
+ description: 'Fetches weather forecast for a given city',
1218
+ inputSchema: z.object({
1219
+ city: z.string().describe('The city to get the weather for'),
1220
+ }),
1221
+ execute: async ({ context }) => {
1222
+ const triggerData = context?.getStepPayload<{ city: string }>('trigger');
1223
+
1224
+ if (!triggerData) {
1225
+ throw new Error('Trigger data not found');
1226
+ }
1227
+
1228
+ const geocodingUrl = \`https://geocoding-api.open-meteo.com/v1/search?name=\${encodeURIComponent(triggerData.city)}&count=1\`;
1229
+ const geocodingResponse = await fetch(geocodingUrl);
1230
+ const geocodingData = (await geocodingResponse.json()) as {
1231
+ results: { latitude: number; longitude: number; name: string }[];
1232
+ };
1233
+
1234
+ if (!geocodingData.results?.[0]) {
1235
+ throw new Error(\`Location '\${triggerData.city}' not found\`);
1236
+ }
1237
+
1238
+ const { latitude, longitude, name } = geocodingData.results[0];
1239
+
1240
+ const weatherUrl = \`https://api.open-meteo.com/v1/forecast?latitude=\${latitude}&longitude=\${longitude}&daily=temperature_2m_max,temperature_2m_min,precipitation_probability_mean,weathercode&timezone=auto\`;
1241
+ const response = await fetch(weatherUrl);
1242
+ const data = (await response.json()) as {
1243
+ daily: {
1244
+ time: string[];
1245
+ temperature_2m_max: number[];
1246
+ temperature_2m_min: number[];
1247
+ precipitation_probability_mean: number[];
1248
+ weathercode: number[];
1249
+ };
1250
+ };
1251
+
1252
+ const forecast = data.daily.time.map((date: string, index: number) => ({
1253
+ date,
1254
+ maxTemp: data.daily.temperature_2m_max[index],
1255
+ minTemp: data.daily.temperature_2m_min[index],
1256
+ precipitationChance: data.daily.precipitation_probability_mean[index],
1257
+ condition: getWeatherCondition(data.daily.weathercode[index]!),
1258
+ location: name,
1259
+ }));
1260
+
1261
+ return forecast;
1262
+ },
1263
+ });
1264
+
1265
+ const forecastSchema = z.array(
1266
+ z.object({
1267
+ date: z.string(),
1268
+ maxTemp: z.number(),
1269
+ minTemp: z.number(),
1270
+ precipitationChance: z.number(),
1271
+ condition: z.string(),
1272
+ location: z.string(),
1273
+ }),
1274
+ );
1275
+
1276
+ const planActivities = new Step({
1277
+ id: 'plan-activities',
1278
+ description: 'Suggests activities based on weather conditions',
1279
+ inputSchema: forecastSchema,
1280
+ execute: async ({ context, mastra }) => {
1281
+ const forecast = context?.getStepPayload<z.infer<typeof forecastSchema>>('fetch-weather');
1282
+
1283
+ if (!forecast || forecast.length === 0) {
1284
+ throw new Error('Forecast data not found');
1285
+ }
1286
+
1287
+ const prompt = \`Based on the following weather forecast for \${forecast[0]?.location}, suggest appropriate activities:
1288
+ \${JSON.stringify(forecast, null, 2)}
1289
+ \`;
1290
+
1291
+ const response = await agent.stream([
1292
+ {
1293
+ role: 'user',
1294
+ content: prompt,
1295
+ },
1296
+ ]);
1297
+
1298
+ for await (const chunk of response.textStream) {
1299
+ process.stdout.write(chunk);
1300
+ }
1301
+
1302
+ return {
1303
+ activities: response.text,
1304
+ };
1305
+ },
1306
+ });
1307
+
1308
+ function getWeatherCondition(code: number): string {
1309
+ const conditions: Record<number, string> = {
1310
+ 0: 'Clear sky',
1311
+ 1: 'Mainly clear',
1312
+ 2: 'Partly cloudy',
1313
+ 3: 'Overcast',
1314
+ 45: 'Foggy',
1315
+ 48: 'Depositing rime fog',
1316
+ 51: 'Light drizzle',
1317
+ 53: 'Moderate drizzle',
1318
+ 55: 'Dense drizzle',
1319
+ 61: 'Slight rain',
1320
+ 63: 'Moderate rain',
1321
+ 65: 'Heavy rain',
1322
+ 71: 'Slight snow fall',
1323
+ 73: 'Moderate snow fall',
1324
+ 75: 'Heavy snow fall',
1325
+ 95: 'Thunderstorm',
1326
+ };
1327
+ return conditions[code] || 'Unknown';
1328
+ }
1329
+
1330
+ const weatherWorkflow = new Workflow({
1331
+ name: 'weather-workflow',
1332
+ triggerSchema: z.object({
1333
+ city: z.string().describe('The city to get the weather for'),
1334
+ }),
1335
+ })
1336
+ .step(fetchWeather)
1337
+ .then(planActivities);
1338
+
1339
+ weatherWorkflow.commit();
1340
+
1341
+ export { weatherWorkflow };`;
1342
+ const formattedContent = await prettier.format(content, {
1343
+ parser: "typescript",
1344
+ semi: true,
1345
+ singleQuote: true
1346
+ });
1347
+ await fs4.writeFile(destPath, formattedContent);
1348
+ }
1349
+ async function writeToolSample(destPath) {
1350
+ const fileService = new FileService();
1351
+ await fileService.copyStarterFile("tools.ts", destPath);
1352
+ }
1353
+ async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
1354
+ switch (component) {
1355
+ case "agents":
1356
+ return writeAgentSample(llmprovider, destPath, importComponents.includes("tools"));
1357
+ case "tools":
1358
+ return writeToolSample(destPath);
1359
+ case "workflows":
1360
+ return writeWorkflowSample(destPath, llmprovider);
1361
+ default:
1362
+ return "";
1363
+ }
1364
+ }
1365
+ var createComponentsDir = async (dirPath, component) => {
1366
+ const componentPath = dirPath + `/${component}`;
1367
+ await fsExtra3.ensureDir(componentPath);
1368
+ };
1369
+ var writeIndexFile = async ({
1370
+ dirPath,
1371
+ addAgent,
1372
+ addExample,
1373
+ addWorkflow
1374
+ }) => {
1375
+ const indexPath = dirPath + "/index.ts";
1376
+ const destPath = path.join(indexPath);
1377
+ try {
1378
+ await fs4.writeFile(destPath, "");
1379
+ const filteredExports = [
1380
+ addWorkflow ? `workflows: { weatherWorkflow },` : "",
1381
+ addAgent ? `agents: { weatherAgent },` : ""
1382
+ ].filter(Boolean);
1383
+ if (!addExample) {
1384
+ await fs4.writeFile(
1385
+ destPath,
1386
+ `
1387
+ import { Mastra } from '@mastra/core';
1388
+
1389
+ export const mastra = new Mastra()
1390
+ `
1391
+ );
1392
+ return;
1393
+ }
1394
+ await fs4.writeFile(
1395
+ destPath,
1396
+ `
1397
+ import { Mastra } from '@mastra/core/mastra';
1398
+ import { createLogger } from '@mastra/core/logger';
1399
+ ${addWorkflow ? `import { weatherWorkflow } from './workflows';` : ""}
1400
+ ${addAgent ? `import { weatherAgent } from './agents';` : ""}
1401
+
1402
+ export const mastra = new Mastra({
1403
+ ${filteredExports.join("\n ")}
1404
+ logger: createLogger({
1405
+ name: 'Mastra',
1406
+ level: 'info',
1407
+ }),
1408
+ });
1409
+ `
1410
+ );
1411
+ } catch (err) {
1412
+ throw err;
1413
+ }
1414
+ };
1415
+ yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
1416
+ var getAPIKey = async (provider) => {
1417
+ let key = "OPENAI_API_KEY";
1418
+ switch (provider) {
1419
+ case "anthropic":
1420
+ key = "ANTHROPIC_API_KEY";
1421
+ return key;
1422
+ case "groq":
1423
+ key = "GROQ_API_KEY";
1424
+ return key;
1425
+ default:
1426
+ return key;
1427
+ }
1428
+ };
1429
+ var writeAPIKey = async ({
1430
+ provider,
1431
+ apiKey = "your-api-key"
1432
+ }) => {
1433
+ const key = await getAPIKey(provider);
1434
+ await exec(`echo ${key}=${apiKey} >> .env.development`);
1435
+ };
1436
+ var createMastraDir = async (directory) => {
1437
+ let dir = directory.trim().split("/").filter((item) => item !== "");
1438
+ const dirPath = path.join(process.cwd(), ...dir, "mastra");
1439
+ try {
1440
+ await fs4.access(dirPath);
1441
+ return { ok: false };
1442
+ } catch {
1443
+ await fsExtra3.ensureDir(dirPath);
1444
+ return { ok: true, dirPath };
1445
+ }
1446
+ };
1447
+ var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
1448
+ const destPath = dirPath + `/${component}/index.ts`;
1449
+ try {
1450
+ await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
1451
+ } catch (err) {
1452
+ throw err;
1453
+ }
1454
+ };
1455
+ var interactivePrompt = async () => {
1456
+ pe(color2.inverse("Mastra Init"));
1457
+ const mastraProject = await ve(
1458
+ {
1459
+ directory: () => ae({
1460
+ message: "Where should we create the Mastra files? (default: src/)",
1461
+ placeholder: "src/",
1462
+ defaultValue: "src/"
1463
+ }),
1464
+ components: () => $e({
1465
+ message: "Choose components to install:",
1466
+ options: [
1467
+ { value: "agents", label: "Agents", hint: "recommended" },
1468
+ {
1469
+ value: "workflows",
1470
+ label: "Workflows"
1471
+ }
1472
+ ]
1473
+ }),
1474
+ shouldAddTools: () => ce({
1475
+ message: "Add tools?",
1476
+ initialValue: false
1477
+ }),
1478
+ llmProvider: () => le({
1479
+ message: "Select default provider:",
1480
+ options: [
1481
+ { value: "openai", label: "OpenAI", hint: "recommended" },
1482
+ { value: "anthropic", label: "Anthropic" },
1483
+ { value: "groq", label: "Groq" }
1484
+ ]
1485
+ }),
1486
+ llmApiKey: async ({ results: { llmProvider } }) => {
1487
+ const keyChoice = await le({
1488
+ message: `Enter your ${llmProvider} API key?`,
1489
+ options: [
1490
+ { value: "skip", label: "Skip for now", hint: "default" },
1491
+ { value: "enter", label: "Enter API key" }
1492
+ ],
1493
+ initialValue: "skip"
1494
+ });
1495
+ if (keyChoice === "enter") {
1496
+ return ae({
1497
+ message: "Enter your API key:",
1498
+ placeholder: "sk-..."
1499
+ });
1500
+ }
1501
+ return void 0;
1502
+ },
1503
+ addExample: () => ce({
1504
+ message: "Add example",
1505
+ initialValue: false
1506
+ })
1507
+ },
1508
+ {
1509
+ onCancel: () => {
1510
+ he("Operation cancelled.");
1511
+ process.exit(0);
1512
+ }
1513
+ }
1514
+ );
1515
+ const { shouldAddTools, components, ...rest } = mastraProject;
1516
+ const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
1517
+ return { ...rest, components: mastraComponents };
1518
+ };
1519
+ var s = _();
1520
+ var exec2 = util.promisify(child_process.exec);
1521
+ var init = async ({
1522
+ directory,
1523
+ addExample = false,
1524
+ components,
1525
+ llmProvider = "openai",
1526
+ llmApiKey
1527
+ }) => {
1528
+ s.start("Initializing Mastra");
1529
+ try {
1530
+ const result = await createMastraDir(directory);
1531
+ if (!result.ok) {
1532
+ s.stop(color2.inverse(" Mastra already initialized "));
1533
+ return { success: false };
1534
+ }
1535
+ const dirPath = result.dirPath;
1536
+ await Promise.all([
1537
+ writeIndexFile({
1538
+ dirPath,
1539
+ addExample,
1540
+ addWorkflow: components.includes("workflows"),
1541
+ addAgent: components.includes("agents")
1542
+ }),
1543
+ ...components.map((component) => createComponentsDir(dirPath, component)),
1544
+ writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
1545
+ ]);
1546
+ if (addExample) {
1547
+ await Promise.all([
1548
+ ...components.map(
1549
+ (component) => writeCodeSample(dirPath, component, llmProvider, components)
1550
+ )
1551
+ ]);
1552
+ }
1553
+ const key = await getAPIKey(llmProvider || "openai");
1554
+ const aiSdkPackage = getAISDKPackage(llmProvider);
1555
+ const pm = getPackageManager();
1556
+ const installCommand = getPackageManagerInstallCommand(pm);
1557
+ await exec2(`${pm} ${installCommand} ${aiSdkPackage}`);
1558
+ s.stop();
1559
+ if (!llmApiKey) {
1560
+ me(`
1561
+ ${color2.green("Mastra initialized successfully!")}
1562
+
1563
+ Add your ${color2.cyan(key)} as an environment variable
1564
+ in your ${color2.cyan(".env.development")} file
1565
+ `);
1566
+ } else {
1567
+ me(`
1568
+ ${color2.green("Mastra initialized successfully!")}
1569
+ `);
1570
+ }
1571
+ return { success: true };
1572
+ } catch (err) {
1573
+ s.stop(color2.inverse("An error occurred while initializing Mastra"));
1574
+ console.error(err);
1575
+ return { success: false };
1576
+ }
1577
+ };
1578
+ var exec3 = util.promisify(child_process.exec);
1579
+ var execWithTimeout = async (command, timeoutMs = 18e4) => {
1580
+ try {
1581
+ const promise = exec3(command, { killSignal: "SIGTERM" });
1582
+ let timeoutId;
1583
+ const timeout = new Promise((_, reject) => {
1584
+ timeoutId = setTimeout(() => reject(new Error("Command timed out")), timeoutMs);
1585
+ });
1586
+ try {
1587
+ const result = await Promise.race([promise, timeout]);
1588
+ clearTimeout(timeoutId);
1589
+ return result;
1590
+ } catch (error) {
1591
+ clearTimeout(timeoutId);
1592
+ if (error instanceof Error && error.message === "Command timed out") {
1593
+ throw new Error("Something went wrong during installation, please try again.");
1594
+ }
1595
+ throw error;
1596
+ }
1597
+ } catch (error) {
1598
+ console.error(error);
1599
+ throw error;
1600
+ }
1601
+ };
1602
+ var createMastraProject = async ({ createVersionTag }) => {
1603
+ pe(color2.inverse("Mastra Create"));
1604
+ const projectName = await ae({
1605
+ message: "What do you want to name your project?",
1606
+ placeholder: "my-mastra-app",
1607
+ defaultValue: "my-mastra-app"
1608
+ });
1609
+ if (lD(projectName)) {
1610
+ he("Operation cancelled");
1611
+ process.exit(0);
1612
+ }
1613
+ const s2 = _();
1614
+ s2.start("Creating project");
1615
+ try {
1616
+ await fs4.mkdir(projectName);
1617
+ } catch (error) {
1618
+ if (error instanceof Error && "code" in error && error.code === "EEXIST") {
1619
+ s2.stop(
1620
+ `A directory named "${projectName}" already exists. Please choose a different name or delete the existing directory.`
1621
+ );
1622
+ process.exit(1);
1623
+ }
1624
+ throw error;
1625
+ }
1626
+ process.chdir(projectName);
1627
+ const pm = getPackageManager();
1628
+ const installCommand = getPackageManagerInstallCommand(pm);
1629
+ s2.message("Creating project");
1630
+ await exec3(`npm init -y`);
1631
+ await exec3(`npm pkg set type="module"`);
1632
+ const depsService = new DepsService();
1633
+ await depsService.addScriptsToPackageJson({
1634
+ dev: "mastra dev"
1635
+ });
1636
+ s2.stop("Project created");
1637
+ s2.start(`Installing ${pm} dependencies`);
1638
+ await exec3(`${pm} ${installCommand} zod`);
1639
+ await exec3(`${pm} ${installCommand} typescript tsx @types/node --save-dev`);
1640
+ await exec3(`echo '{
1641
+ "compilerOptions": {
1642
+ "target": "ES2022",
1643
+ "module": "ES2022",
1644
+ "moduleResolution": "bundler",
1645
+ "esModuleInterop": true,
1646
+ "forceConsistentCasingInFileNames": true,
1647
+ "strict": true,
1648
+ "skipLibCheck": true,
1649
+ "outDir": "dist"
1650
+ },
1651
+ "include": [
1652
+ "src/**/*"
1653
+ ],
1654
+ "exclude": [
1655
+ "node_modules",
1656
+ "dist",
1657
+ ".mastra"
1658
+ ]
1659
+ }' > tsconfig.json`);
1660
+ s2.stop(`${pm} dependencies installed`);
1661
+ s2.start("Installing mastra");
1662
+ const versionTag = createVersionTag ? `@${createVersionTag}` : "@latest";
1663
+ await execWithTimeout(`${pm} ${installCommand} mastra${versionTag}`);
1664
+ s2.stop("mastra installed");
1665
+ s2.start("Installing @mastra/core");
1666
+ await execWithTimeout(`${pm} ${installCommand} @mastra/core${versionTag}`);
1667
+ s2.stop("@mastra/core installed");
1668
+ s2.start("Adding .gitignore");
1669
+ await exec3(`echo output.txt >> .gitignore`);
1670
+ await exec3(`echo node_modules >> .gitignore`);
1671
+ await exec3(`echo dist >> .gitignore`);
1672
+ await exec3(`echo .mastra >> .gitignore`);
1673
+ await exec3(`echo .env.development >> .gitignore`);
1674
+ await exec3(`echo .env >> .gitignore`);
1675
+ await exec3(`echo *.db >> .gitignore`);
1676
+ s2.stop(".gitignore added");
1677
+ ge("Project created successfully");
1678
+ console.log("");
1679
+ return { projectName };
1680
+ };
1681
+ var create = async (args) => {
1682
+ const { projectName } = await createMastraProject({
1683
+ createVersionTag: args?.createVersionTag
1684
+ });
1685
+ const directory = "/src";
1686
+ if (!args.components || !args.llmProvider || !args.addExample) {
1687
+ const result = await interactivePrompt();
1688
+ await init({
1689
+ ...result,
1690
+ llmApiKey: result?.llmApiKey
1691
+ });
1692
+ postCreate({ projectName });
1693
+ return;
1694
+ }
1695
+ const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
1696
+ await init({
1697
+ directory,
1698
+ components,
1699
+ llmProvider,
1700
+ addExample,
1701
+ llmApiKey
1702
+ });
1703
+ postCreate({ projectName });
1704
+ };
1705
+ var postCreate = ({ projectName }) => {
1706
+ ge(`
1707
+ ${color2.green("To start your project:")}
1708
+
1709
+ ${color2.cyan("cd")} ${projectName}
1710
+ ${color2.cyan("npm run dev")}
1711
+ `);
1712
+ };
1713
+
1714
+ async function getPackageVersion() {
1715
+ const __filename = fileURLToPath(import.meta.url);
1716
+ const __dirname = dirname(__filename);
1717
+ const pkgJsonPath = path.join(__dirname, "..", "package.json");
1718
+ const content = await fsExtra.readJSON(pkgJsonPath);
1719
+ return content.version;
1720
+ }
1721
+ async function tryReadPackageJson(paths) {
1722
+ let lastError;
1723
+ for (const path2 of paths) {
1724
+ try {
1725
+ const content = await fsExtra.readJSON(path2);
1726
+ if (content.name === "create-mastra") {
1727
+ return content;
1728
+ }
1729
+ } catch (err) {
1730
+ lastError = err;
1731
+ continue;
1732
+ }
1733
+ }
1734
+ throw lastError || new Error("Could not find create-mastra package.json in any of the expected locations");
1735
+ }
1736
+ async function getCreateVersionTag() {
1737
+ try {
1738
+ const binPath = process.argv[1];
1739
+ const binDir = dirname(binPath);
1740
+ const possiblePaths = [
1741
+ // Direct parent paths
1742
+ path.join(binDir, "..", "package.json"),
1743
+ path.join(binDir, "..", "..", "package.json"),
1744
+ path.join(binDir, "..", "..", "..", "package.json"),
1745
+ path.join(binDir, "..", "..", "..", "..", "package.json"),
1746
+ // Standard node_modules paths
1747
+ path.join(binDir, "..", "create-mastra", "package.json"),
1748
+ path.join(binDir, "..", "..", "create-mastra", "package.json"),
1749
+ path.join(binDir, "..", "..", "..", "create-mastra", "package.json"),
1750
+ path.join(binDir, "..", "..", "..", "..", "create-mastra", "package.json"),
1751
+ // pnpm specific paths (.pnpm directory)
1752
+ path.join(binDir, "..", ".pnpm", "create-mastra@*", "node_modules", "create-mastra", "package.json"),
1753
+ path.join(binDir, "..", "..", ".pnpm", "create-mastra@*", "node_modules", "create-mastra", "package.json"),
1754
+ // pnpm dlx specific path
1755
+ path.join(binDir, "..", "..", "package.json"),
1756
+ path.join(binDir, "..", "..", "node_modules", "create-mastra", "package.json")
1757
+ ];
1758
+ const content = await tryReadPackageJson(possiblePaths);
1759
+ if (content.version?.includes("-")) {
1760
+ const tag = content.version.split("-")[1].split(".")[0];
1761
+ return tag;
1762
+ }
1763
+ } catch (error) {
1764
+ console.error('We could not resolve the create-mastra version tag, falling back to "latest"');
1765
+ }
1766
+ return "latest";
1767
+ }
1768
+
1769
+ const version = await getPackageVersion();
1770
+ const createVersionTag = await getCreateVersionTag();
1771
+ const analytics = new PosthogAnalytics({
1772
+ apiKey: "phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT",
1773
+ host: "https://us.posthog.com",
1774
+ version
1775
+ });
1776
+ const program = new Command();
1777
+ program.version(`${version}`, "-v, --version").description(`create-mastra ${version}`).action(async () => {
1778
+ try {
1779
+ analytics.trackCommand({
1780
+ command: "version"
1781
+ });
1782
+ console.log(`create-mastra ${version}`);
1783
+ } catch (e) {
1784
+ }
1785
+ });
1786
+ program.name("create-mastra").description("Create a new Mastra project").option("--default", "Quick start with defaults(src, OpenAI, no examples)").option("-c, --components <components>", "Comma-separated list of components (agents, tools, workflows)").option("-l, --llm <model-provider>", "Default model provider (openai, anthropic, or groq)").option("-k, --llm-api-key <api-key>", "API key for the model provider").option("-e, --example", "Include example code").action(async (args) => {
1787
+ if (args.default) {
1788
+ await create({
1789
+ components: ["agents", "tools", "workflows"],
1790
+ llmProvider: "openai",
1791
+ addExample: false,
1792
+ createVersionTag
1793
+ });
1794
+ return;
1795
+ }
1796
+ await create({
1797
+ components: args.components ? args.components.split(",") : [],
1798
+ llmProvider: args.llm,
1799
+ addExample: args.example,
1800
+ llmApiKey: args["llm-api-key"],
1801
+ createVersionTag
1802
+ });
1803
+ });
1804
+ program.parse(process.argv);
1805
+ //# sourceMappingURL=index.js.map