create-mastra 0.1.0-alpha.8 → 0.1.0

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 CHANGED
@@ -1,47 +1,1503 @@
1
1
  #! /usr/bin/env node
2
2
  import { Command } from 'commander';
3
- import { PosthogAnalytics } from 'mastra';
4
- import { create } from 'mastra';
5
- import { getPackageVersion } from './utils.js';
6
- const version = await getPackageVersion();
7
- const analytics = new PosthogAnalytics({
8
- apiKey: 'phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT',
9
- host: 'https://us.posthog.com',
10
- version: version,
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();
79
+ });
80
+ }
81
+ isTelemetryEnabled() {
82
+ if (process.env.NO_MASTRA_TELEMETRY) {
83
+ return false;
84
+ }
85
+ return true;
86
+ }
87
+ getDistinctId() {
88
+ const machineId = os.hostname();
89
+ return `mastra-${machineId}`;
90
+ }
91
+ getSystemProperties() {
92
+ return {
93
+ os: process.platform,
94
+ os_version: os.release(),
95
+ node_version: process.version,
96
+ platform: process.arch,
97
+ session_id: this.sessionId,
98
+ cli_version: this.version || "unknown",
99
+ machine_id: os.hostname()
100
+ };
101
+ }
102
+ captureSessionStart() {
103
+ if (!this.client) {
104
+ return;
105
+ }
106
+ this.client.capture({
107
+ distinctId: this.distinctId,
108
+ event: "cli_session_start",
109
+ properties: {
110
+ ...this.getSystemProperties()
111
+ }
112
+ });
113
+ }
114
+ trackCommand(options) {
115
+ try {
116
+ if (!this.client) {
117
+ return;
118
+ }
119
+ const commandData = {
120
+ command: options.command,
121
+ status: options.status || "success"
122
+ };
123
+ if (options.args) {
124
+ commandData.args = options.args;
125
+ }
126
+ if (options.durationMs) {
127
+ commandData.durationMs = options.durationMs;
128
+ }
129
+ if (options.error) {
130
+ commandData.error = options.error;
131
+ }
132
+ this.client.capture({
133
+ distinctId: this.distinctId,
134
+ event: "cli_command",
135
+ properties: {
136
+ ...this.getSystemProperties(),
137
+ ...commandData
138
+ }
139
+ });
140
+ } catch (e) {
141
+ }
142
+ }
143
+ // Helper method to wrap command execution with timing
144
+ async trackCommandExecution({
145
+ command,
146
+ args,
147
+ execution
148
+ }) {
149
+ const startTime = process.hrtime();
150
+ try {
151
+ const result = await execution();
152
+ const [seconds, nanoseconds] = process.hrtime(startTime);
153
+ const durationMs = seconds * 1e3 + nanoseconds / 1e6;
154
+ this.trackCommand({
155
+ command,
156
+ args,
157
+ durationMs,
158
+ status: "success"
159
+ });
160
+ return result;
161
+ } catch (error) {
162
+ const [seconds, nanoseconds] = process.hrtime(startTime);
163
+ const durationMs = seconds * 1e3 + nanoseconds / 1e6;
164
+ this.trackCommand({
165
+ command,
166
+ args,
167
+ durationMs,
168
+ status: "error",
169
+ error: error instanceof Error ? error.message : String(error)
170
+ });
171
+ throw error;
172
+ }
173
+ }
174
+ // Ensure PostHog client is shutdown properly
175
+ async shutdown() {
176
+ if (!this.client) {
177
+ return;
178
+ }
179
+ try {
180
+ await this.client.shutdown();
181
+ } catch (e) {
182
+ }
183
+ }
184
+ };
185
+
186
+ function getDefaultExportFromCjs (x) {
187
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
188
+ }
189
+
190
+ var src;
191
+ var hasRequiredSrc;
192
+
193
+ function requireSrc () {
194
+ if (hasRequiredSrc) return src;
195
+ hasRequiredSrc = 1;
196
+
197
+ const ESC = '\x1B';
198
+ const CSI = `${ESC}[`;
199
+ const beep = '\u0007';
200
+
201
+ const cursor = {
202
+ to(x, y) {
203
+ if (!y) return `${CSI}${x + 1}G`;
204
+ return `${CSI}${y + 1};${x + 1}H`;
205
+ },
206
+ move(x, y) {
207
+ let ret = '';
208
+
209
+ if (x < 0) ret += `${CSI}${-x}D`;
210
+ else if (x > 0) ret += `${CSI}${x}C`;
211
+
212
+ if (y < 0) ret += `${CSI}${-y}A`;
213
+ else if (y > 0) ret += `${CSI}${y}B`;
214
+
215
+ return ret;
216
+ },
217
+ up: (count = 1) => `${CSI}${count}A`,
218
+ down: (count = 1) => `${CSI}${count}B`,
219
+ forward: (count = 1) => `${CSI}${count}C`,
220
+ backward: (count = 1) => `${CSI}${count}D`,
221
+ nextLine: (count = 1) => `${CSI}E`.repeat(count),
222
+ prevLine: (count = 1) => `${CSI}F`.repeat(count),
223
+ left: `${CSI}G`,
224
+ hide: `${CSI}?25l`,
225
+ show: `${CSI}?25h`,
226
+ save: `${ESC}7`,
227
+ restore: `${ESC}8`
228
+ };
229
+
230
+ const scroll = {
231
+ up: (count = 1) => `${CSI}S`.repeat(count),
232
+ down: (count = 1) => `${CSI}T`.repeat(count)
233
+ };
234
+
235
+ const erase = {
236
+ screen: `${CSI}2J`,
237
+ up: (count = 1) => `${CSI}1J`.repeat(count),
238
+ down: (count = 1) => `${CSI}J`.repeat(count),
239
+ line: `${CSI}2K`,
240
+ lineEnd: `${CSI}K`,
241
+ lineStart: `${CSI}1K`,
242
+ lines(count) {
243
+ let clear = '';
244
+ for (let i = 0; i < count; i++)
245
+ clear += this.line + (i < count - 1 ? cursor.up() : '');
246
+ if (count)
247
+ clear += cursor.left;
248
+ return clear;
249
+ }
250
+ };
251
+
252
+ src = { cursor, scroll, erase, beep };
253
+ return src;
254
+ }
255
+
256
+ var srcExports = requireSrc();
257
+
258
+ var picocolors = {exports: {}};
259
+
260
+ var hasRequiredPicocolors;
261
+
262
+ function requirePicocolors () {
263
+ if (hasRequiredPicocolors) return picocolors.exports;
264
+ hasRequiredPicocolors = 1;
265
+ let p = process || {}, argv = p.argv || [], env = p.env || {};
266
+ let isColorSupported =
267
+ !(!!env.NO_COLOR || argv.includes("--no-color")) &&
268
+ (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI);
269
+
270
+ let formatter = (open, close, replace = open) =>
271
+ input => {
272
+ let string = "" + input, index = string.indexOf(close, open.length);
273
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close
274
+ };
275
+
276
+ let replaceClose = (string, close, replace, index) => {
277
+ let result = "", cursor = 0;
278
+ do {
279
+ result += string.substring(cursor, index) + replace;
280
+ cursor = index + close.length;
281
+ index = string.indexOf(close, cursor);
282
+ } while (~index)
283
+ return result + string.substring(cursor)
284
+ };
285
+
286
+ let createColors = (enabled = isColorSupported) => {
287
+ let f = enabled ? formatter : () => String;
288
+ return {
289
+ isColorSupported: enabled,
290
+ reset: f("\x1b[0m", "\x1b[0m"),
291
+ bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"),
292
+ dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"),
293
+ italic: f("\x1b[3m", "\x1b[23m"),
294
+ underline: f("\x1b[4m", "\x1b[24m"),
295
+ inverse: f("\x1b[7m", "\x1b[27m"),
296
+ hidden: f("\x1b[8m", "\x1b[28m"),
297
+ strikethrough: f("\x1b[9m", "\x1b[29m"),
298
+
299
+ black: f("\x1b[30m", "\x1b[39m"),
300
+ red: f("\x1b[31m", "\x1b[39m"),
301
+ green: f("\x1b[32m", "\x1b[39m"),
302
+ yellow: f("\x1b[33m", "\x1b[39m"),
303
+ blue: f("\x1b[34m", "\x1b[39m"),
304
+ magenta: f("\x1b[35m", "\x1b[39m"),
305
+ cyan: f("\x1b[36m", "\x1b[39m"),
306
+ white: f("\x1b[37m", "\x1b[39m"),
307
+ gray: f("\x1b[90m", "\x1b[39m"),
308
+
309
+ bgBlack: f("\x1b[40m", "\x1b[49m"),
310
+ bgRed: f("\x1b[41m", "\x1b[49m"),
311
+ bgGreen: f("\x1b[42m", "\x1b[49m"),
312
+ bgYellow: f("\x1b[43m", "\x1b[49m"),
313
+ bgBlue: f("\x1b[44m", "\x1b[49m"),
314
+ bgMagenta: f("\x1b[45m", "\x1b[49m"),
315
+ bgCyan: f("\x1b[46m", "\x1b[49m"),
316
+ bgWhite: f("\x1b[47m", "\x1b[49m"),
317
+
318
+ blackBright: f("\x1b[90m", "\x1b[39m"),
319
+ redBright: f("\x1b[91m", "\x1b[39m"),
320
+ greenBright: f("\x1b[92m", "\x1b[39m"),
321
+ yellowBright: f("\x1b[93m", "\x1b[39m"),
322
+ blueBright: f("\x1b[94m", "\x1b[39m"),
323
+ magentaBright: f("\x1b[95m", "\x1b[39m"),
324
+ cyanBright: f("\x1b[96m", "\x1b[39m"),
325
+ whiteBright: f("\x1b[97m", "\x1b[39m"),
326
+
327
+ bgBlackBright: f("\x1b[100m", "\x1b[49m"),
328
+ bgRedBright: f("\x1b[101m", "\x1b[49m"),
329
+ bgGreenBright: f("\x1b[102m", "\x1b[49m"),
330
+ bgYellowBright: f("\x1b[103m", "\x1b[49m"),
331
+ bgBlueBright: f("\x1b[104m", "\x1b[49m"),
332
+ bgMagentaBright: f("\x1b[105m", "\x1b[49m"),
333
+ bgCyanBright: f("\x1b[106m", "\x1b[49m"),
334
+ bgWhiteBright: f("\x1b[107m", "\x1b[49m"),
335
+ }
336
+ };
337
+
338
+ picocolors.exports = createColors();
339
+ picocolors.exports.createColors = createColors;
340
+ return picocolors.exports;
341
+ }
342
+
343
+ var picocolorsExports = /*@__PURE__*/ requirePicocolors();
344
+ var color2 = /*@__PURE__*/getDefaultExportFromCjs(picocolorsExports);
345
+
346
+ 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?undefined:"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(`
347
+ `)];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!==undefined){const p=Number.parseFloat(B.code);s=p===CD?undefined:p;}else B.uri!==undefined&&(C=B.uri.length===0?undefined:B.uri);}const o=sD.codes.get(Number(s));n[E+1]===`
348
+ `?(C&&(t+=L("")),s&&o&&(t+=N(o))):h===`
349
+ `&&(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,`
350
+ `).split(`
351
+ `).map(t=>oD(t,u,F)).join(`
352
+ `)}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(`
353
+ `),t=u.split(`
354
+ `),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!==undefined&&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(`
355
+ `),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(`
356
+ `).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(`
357
+ `);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(`
358
+ `).slice(t);this.output.write(s.join(`
359
+ `)),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();}}
360
+
361
+ 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)}
362
+ ${y(this.state)} ${s.message}
363
+ `,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()}
364
+ ${color2.yellow(a)} ${i}
365
+ ${color2.yellow($)} ${color2.yellow(this.error)}
366
+ `;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()?`
367
+ `+color2.gray(a):""}`;default:return `${n}${color2.cyan(a)} ${i}
368
+ ${color2.cyan($)}
369
+ `}}}).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)}
370
+ ${y(this.state)} ${s.message}
371
+ `,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))}
372
+ ${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}`}
373
+ ${color2.cyan($)}
374
+ `}}}).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)}
375
+ ${y(this.state)} ${s.message}
376
+ `;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")}
377
+ ${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(`
378
+ ${color2.cyan(a)} `)}
379
+ ${color2.cyan($)}
380
+ `}}}).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.
381
+ ${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)}
382
+ ${y(this.state)} ${s.message}
383
+ `;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}
384
+ ${color2.gray(a)}`:""}`}case "error":{const r=this.error.split(`
385
+ `).map((o,c)=>c===0?`${color2.yellow($)} ${color2.yellow(o)}`:` ${o}`).join(`
386
+ `);return t+color2.yellow(a)+" "+E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
387
+ ${color2.yellow(a)} `)+`
388
+ `+r+`
389
+ `}default:return `${t}${color2.cyan(a)} ${E({options:this.options,cursor:this.cursor,maxItems:s.maxItems,style:i}).join(`
390
+ ${color2.cyan(a)} `)}
391
+ ${color2.cyan($)}
392
+ `}}}).prompt()},R=s=>s.replace(ye(),""),me=(s="",n="")=>{const t=`
393
+ ${s}
394
+ `.split(`
395
+ `),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(`
396
+ `);process.stdout.write(`${color2.gray(a)}
397
+ ${color2.green(M)} ${color2.reset(n)} ${color2.gray(G.repeat(Math.max(r-i-1,1))+H)}
398
+ ${o}
399
+ ${color2.gray(ee+G.repeat(r+2)+te)}
400
+ `);},he=(s="")=>{process.stdout.write(`${color2.gray($)} ${color2.red(s)}
401
+
402
+ `);},pe=(s="")=>{process.stdout.write(`${color2.gray(Q)} ${s}
403
+ `);},ge=(s="")=>{process.stdout.write(`${color2.gray(a)}
404
+ ${color2.gray($)} ${s}
405
+
406
+ `);},_=()=>{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)}
407
+ `);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}
408
+ `),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};
409
+
410
+ // eslint-disable-next-line no-warning-comments
411
+ // TODO: Use a better method when it's added to Node.js (https://github.com/nodejs/node/pull/40240)
412
+ // Lots of optionals here to support Deno.
413
+ const hasColors = tty?.WriteStream?.prototype?.hasColors?.() ?? false;
414
+
415
+ const format = (open, close) => {
416
+ if (!hasColors) {
417
+ return input => input;
418
+ }
419
+
420
+ const openCode = `\u001B[${open}m`;
421
+ const closeCode = `\u001B[${close}m`;
422
+
423
+ return input => {
424
+ const string = input + ''; // eslint-disable-line no-implicit-coercion -- This is faster.
425
+ let index = string.indexOf(closeCode);
426
+
427
+ if (index === -1) {
428
+ // Note: Intentionally not using string interpolation for performance reasons.
429
+ return openCode + string + closeCode;
430
+ }
431
+
432
+ // Handle nested colors.
433
+
434
+ // We could have done this, but it's too slow (as of Node.js 22).
435
+ // return openCode + string.replaceAll(closeCode, openCode) + closeCode;
436
+
437
+ let result = openCode;
438
+ let lastIndex = 0;
439
+
440
+ while (index !== -1) {
441
+ result += string.slice(lastIndex, index) + openCode;
442
+ lastIndex = index + closeCode.length;
443
+ index = string.indexOf(closeCode, lastIndex);
444
+ }
445
+
446
+ result += string.slice(lastIndex) + closeCode;
447
+
448
+ return result;
449
+ };
450
+ };
451
+
452
+ const reset = format(0, 0);
453
+ const bold = format(1, 22);
454
+ const dim = format(2, 22);
455
+ const italic = format(3, 23);
456
+ const underline = format(4, 24);
457
+ const overline = format(53, 55);
458
+ const inverse = format(7, 27);
459
+ const hidden = format(8, 28);
460
+ const strikethrough = format(9, 29);
461
+
462
+ const black = format(30, 39);
463
+ const red = format(31, 39);
464
+ const green = format(32, 39);
465
+ const yellow = format(33, 39);
466
+ const blue = format(34, 39);
467
+ const magenta = format(35, 39);
468
+ const cyan = format(36, 39);
469
+ const white = format(37, 39);
470
+ const gray = format(90, 39);
471
+
472
+ const bgBlack = format(40, 49);
473
+ const bgRed = format(41, 49);
474
+ const bgGreen = format(42, 49);
475
+ const bgYellow = format(43, 49);
476
+ const bgBlue = format(44, 49);
477
+ const bgMagenta = format(45, 49);
478
+ const bgCyan = format(46, 49);
479
+ const bgWhite = format(47, 49);
480
+ const bgGray = format(100, 49);
481
+
482
+ const redBright = format(91, 39);
483
+ const greenBright = format(92, 39);
484
+ const yellowBright = format(93, 39);
485
+ const blueBright = format(94, 39);
486
+ const magentaBright = format(95, 39);
487
+ const cyanBright = format(96, 39);
488
+ const whiteBright = format(97, 39);
489
+
490
+ const bgRedBright = format(101, 49);
491
+ const bgGreenBright = format(102, 49);
492
+ const bgYellowBright = format(103, 49);
493
+ const bgBlueBright = format(104, 49);
494
+ const bgMagentaBright = format(105, 49);
495
+ const bgCyanBright = format(106, 49);
496
+ const bgWhiteBright = format(107, 49);
497
+
498
+ var yoctocolors = /*#__PURE__*/Object.freeze({
499
+ __proto__: null,
500
+ bgBlack: bgBlack,
501
+ bgBlue: bgBlue,
502
+ bgBlueBright: bgBlueBright,
503
+ bgCyan: bgCyan,
504
+ bgCyanBright: bgCyanBright,
505
+ bgGray: bgGray,
506
+ bgGreen: bgGreen,
507
+ bgGreenBright: bgGreenBright,
508
+ bgMagenta: bgMagenta,
509
+ bgMagentaBright: bgMagentaBright,
510
+ bgRed: bgRed,
511
+ bgRedBright: bgRedBright,
512
+ bgWhite: bgWhite,
513
+ bgWhiteBright: bgWhiteBright,
514
+ bgYellow: bgYellow,
515
+ bgYellowBright: bgYellowBright,
516
+ black: black,
517
+ blue: blue,
518
+ blueBright: blueBright,
519
+ bold: bold,
520
+ cyan: cyan,
521
+ cyanBright: cyanBright,
522
+ dim: dim,
523
+ gray: gray,
524
+ green: green,
525
+ greenBright: greenBright,
526
+ hidden: hidden,
527
+ inverse: inverse,
528
+ italic: italic,
529
+ magenta: magenta,
530
+ magentaBright: magentaBright,
531
+ overline: overline,
532
+ red: red,
533
+ redBright: redBright,
534
+ reset: reset,
535
+ strikethrough: strikethrough,
536
+ underline: underline,
537
+ white: white,
538
+ whiteBright: whiteBright,
539
+ yellow: yellow,
540
+ yellowBright: yellowBright
11
541
  });
12
- const program = new Command();
13
- program
14
- .version(`${version}`, '-v, --version')
15
- .description(`create-mastra ${version}`)
16
- .action(async () => {
542
+
543
+ const isUnicodeSupported = h.platform !== 'win32' || Boolean(h.env.WT_SESSION);
544
+
545
+ const isInteractive = stream => Boolean(
546
+ stream.isTTY
547
+ && h.env.TERM !== 'dumb'
548
+ && !('CI' in h.env),
549
+ );
550
+
551
+ const infoSymbol = blue(isUnicodeSupported ? 'ℹ' : 'i');
552
+ const successSymbol = green(isUnicodeSupported ? '✔' : '√');
553
+ const warningSymbol = yellow(isUnicodeSupported ? '⚠' : '‼');
554
+ const errorSymbol = red(isUnicodeSupported ? '✖️' : '×');
555
+
556
+ const defaultSpinner = {
557
+ frames: isUnicodeSupported
558
+ ? [
559
+ '⠋',
560
+ '⠙',
561
+ '⠹',
562
+ '⠸',
563
+ '⠼',
564
+ '⠴',
565
+ '⠦',
566
+ '⠧',
567
+ '⠇',
568
+ '⠏',
569
+ ]
570
+ : [
571
+ '-',
572
+ '\\',
573
+ '|',
574
+ '/',
575
+ ],
576
+ interval: 80,
577
+ };
578
+
579
+ class YoctoSpinner {
580
+ #frames;
581
+ #interval;
582
+ #currentFrame = -1;
583
+ #timer;
584
+ #text;
585
+ #stream;
586
+ #color;
587
+ #lines = 0;
588
+ #exitHandlerBound;
589
+ #isInteractive;
590
+ #lastSpinnerFrameTime = 0;
591
+
592
+ constructor(options = {}) {
593
+ const spinner = options.spinner ?? defaultSpinner;
594
+ this.#frames = spinner.frames;
595
+ this.#interval = spinner.interval;
596
+ this.#text = options.text ?? '';
597
+ this.#stream = options.stream ?? h.stderr;
598
+ this.#color = options.color ?? 'cyan';
599
+ this.#isInteractive = isInteractive(this.#stream);
600
+ this.#exitHandlerBound = this.#exitHandler.bind(this);
601
+ }
602
+
603
+ start(text) {
604
+ if (text) {
605
+ this.#text = text;
606
+ }
607
+
608
+ if (this.isSpinning) {
609
+ return this;
610
+ }
611
+
612
+ this.#hideCursor();
613
+ this.#render();
614
+ this.#subscribeToProcessEvents();
615
+
616
+ this.#timer = setInterval(() => {
617
+ this.#render();
618
+ }, this.#interval);
619
+
620
+ return this;
621
+ }
622
+
623
+ stop(finalText) {
624
+ if (!this.isSpinning) {
625
+ return this;
626
+ }
627
+
628
+ clearInterval(this.#timer);
629
+ this.#timer = undefined;
630
+ this.#showCursor();
631
+ this.clear();
632
+ this.#unsubscribeFromProcessEvents();
633
+
634
+ if (finalText) {
635
+ this.#stream.write(`${finalText}\n`);
636
+ }
637
+
638
+ return this;
639
+ }
640
+
641
+ #symbolStop(symbol, text) {
642
+ return this.stop(`${symbol} ${text ?? this.#text}`);
643
+ }
644
+
645
+ success(text) {
646
+ return this.#symbolStop(successSymbol, text);
647
+ }
648
+
649
+ error(text) {
650
+ return this.#symbolStop(errorSymbol, text);
651
+ }
652
+
653
+ warning(text) {
654
+ return this.#symbolStop(warningSymbol, text);
655
+ }
656
+
657
+ info(text) {
658
+ return this.#symbolStop(infoSymbol, text);
659
+ }
660
+
661
+ get isSpinning() {
662
+ return this.#timer !== undefined;
663
+ }
664
+
665
+ get text() {
666
+ return this.#text;
667
+ }
668
+
669
+ set text(value = '') {
670
+ this.#text = value;
671
+ this.#render();
672
+ }
673
+
674
+ get color() {
675
+ return this.#color;
676
+ }
677
+
678
+ set color(value) {
679
+ this.#color = value;
680
+ this.#render();
681
+ }
682
+
683
+ clear() {
684
+ if (!this.#isInteractive) {
685
+ return this;
686
+ }
687
+
688
+ this.#stream.cursorTo(0);
689
+
690
+ for (let index = 0; index < this.#lines; index++) {
691
+ if (index > 0) {
692
+ this.#stream.moveCursor(0, -1);
693
+ }
694
+
695
+ this.#stream.clearLine(1);
696
+ }
697
+
698
+ this.#lines = 0;
699
+
700
+ return this;
701
+ }
702
+
703
+ #render() {
704
+ // Ensure we only update the spinner frame at the wanted interval,
705
+ // even if the frame method is called more often.
706
+ const now = Date.now();
707
+ if (this.#currentFrame === -1 || now - this.#lastSpinnerFrameTime >= this.#interval) {
708
+ this.#currentFrame = ++this.#currentFrame % this.#frames.length;
709
+ this.#lastSpinnerFrameTime = now;
710
+ }
711
+
712
+ const applyColor = yoctocolors[this.#color] ?? cyan;
713
+ const frame = this.#frames[this.#currentFrame];
714
+ let string = `${applyColor(frame)} ${this.#text}`;
715
+
716
+ if (!this.#isInteractive) {
717
+ string += '\n';
718
+ }
719
+
720
+ this.clear();
721
+ this.#write(string);
722
+
723
+ if (this.#isInteractive) {
724
+ this.#lines = this.#lineCount(string);
725
+ }
726
+ }
727
+
728
+ #write(text) {
729
+ this.#stream.write(text);
730
+ }
731
+
732
+ #lineCount(text) {
733
+ const width = this.#stream.columns ?? 80;
734
+ const lines = text.split('\n');
735
+
736
+ let lineCount = 0;
737
+ for (const line of lines) {
738
+ lineCount += Math.max(1, Math.ceil(line.length / width));
739
+ }
740
+
741
+ return lineCount;
742
+ }
743
+
744
+ #hideCursor() {
745
+ if (this.#isInteractive) {
746
+ this.#write('\u001B[?25l');
747
+ }
748
+ }
749
+
750
+ #showCursor() {
751
+ if (this.#isInteractive) {
752
+ this.#write('\u001B[?25h');
753
+ }
754
+ }
755
+
756
+ #subscribeToProcessEvents() {
757
+ h.once('SIGINT', this.#exitHandlerBound);
758
+ h.once('SIGTERM', this.#exitHandlerBound);
759
+ }
760
+
761
+ #unsubscribeFromProcessEvents() {
762
+ h.off('SIGINT', this.#exitHandlerBound);
763
+ h.off('SIGTERM', this.#exitHandlerBound);
764
+ }
765
+
766
+ #exitHandler(signal) {
767
+ if (this.isSpinning) {
768
+ this.stop();
769
+ }
770
+
771
+ // SIGINT: 128 + 2
772
+ // SIGTERM: 128 + 15
773
+ const exitCode = signal === 'SIGINT' ? 130 : (signal === 'SIGTERM' ? 143 : 1);
774
+ h.exit(exitCode);
775
+ }
776
+ }
777
+
778
+ function yoctoSpinner(options) {
779
+ return new YoctoSpinner(options);
780
+ }
781
+
782
+ var LogLevel = {
783
+ DEBUG: "debug",
784
+ INFO: "info",
785
+ WARN: "warn",
786
+ ERROR: "error",
787
+ NONE: "silent"
788
+ };
789
+ var Logger = class {
790
+ logger;
791
+ transports;
792
+ constructor(options = {}) {
793
+ this.transports = options.transports || {};
794
+ const transportsAry = Object.entries(this.transports);
795
+ this.logger = pino(
796
+ {
797
+ name: options.name || "app",
798
+ level: options.level || LogLevel.INFO
799
+ },
800
+ options.overrideDefaultTransports ? options?.transports?.default : transportsAry.length === 0 ? pretty({
801
+ colorize: true,
802
+ levelFirst: true,
803
+ ignore: "pid,hostname",
804
+ colorizeObjects: true,
805
+ translateTime: "SYS:standard",
806
+ singleLine: false
807
+ }) : pino.multistream([
808
+ ...transportsAry.map(([_, transport]) => ({
809
+ stream: transport,
810
+ level: options.level || LogLevel.INFO
811
+ })),
812
+ {
813
+ stream: pretty({
814
+ colorize: true,
815
+ levelFirst: true,
816
+ ignore: "pid,hostname",
817
+ colorizeObjects: true,
818
+ translateTime: "SYS:standard",
819
+ singleLine: false
820
+ }),
821
+ level: options.level || LogLevel.INFO
822
+ }
823
+ ])
824
+ );
825
+ }
826
+ debug(message, args = {}) {
827
+ this.logger.debug(args, message);
828
+ }
829
+ info(message, args = {}) {
830
+ this.logger.info(args, message);
831
+ }
832
+ warn(message, args = {}) {
833
+ this.logger.warn(args, message);
834
+ }
835
+ error(message, args = {}) {
836
+ this.logger.error(args, message);
837
+ }
838
+ // Stream creation for process output handling
839
+ createStream() {
840
+ return new Transform({
841
+ transform: (chunk, _encoding, callback) => {
842
+ const line = chunk.toString().trim();
843
+ if (line) {
844
+ this.info(line);
845
+ }
846
+ callback(null, chunk);
847
+ }
848
+ });
849
+ }
850
+ async getLogs(transportId) {
851
+ if (!transportId || !this.transports[transportId]) {
852
+ return [];
853
+ }
854
+ return this.transports[transportId].getLogs();
855
+ }
856
+ async getLogsByRunId({ runId, transportId }) {
857
+ return this.transports[transportId]?.getLogsByRunId({ runId });
858
+ }
859
+ };
860
+ function createLogger(options) {
861
+ return new Logger(options);
862
+ }
863
+
864
+ var DepsService = class {
865
+ packageManager;
866
+ constructor() {
867
+ this.packageManager = this.getPackageManager();
868
+ }
869
+ findLockFile(dir) {
870
+ const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lock"];
871
+ for (const file of lockFiles) {
872
+ if (fs3__default__default.existsSync(path.join(dir, file))) {
873
+ return file;
874
+ }
875
+ }
876
+ const parentDir = path.resolve(dir, "..");
877
+ if (parentDir !== dir) {
878
+ return this.findLockFile(parentDir);
879
+ }
880
+ return null;
881
+ }
882
+ getPackageManager() {
883
+ const lockFile = this.findLockFile(process.cwd());
884
+ switch (lockFile) {
885
+ case "pnpm-lock.yaml":
886
+ return "pnpm";
887
+ case "package-lock.json":
888
+ return "npm";
889
+ case "yarn.lock":
890
+ return "yarn";
891
+ case "bun.lock":
892
+ return "bun";
893
+ default:
894
+ return "npm";
895
+ }
896
+ }
897
+ async installPackages(packages) {
898
+ let runCommand = this.packageManager;
899
+ if (this.packageManager === "npm") {
900
+ runCommand = `${this.packageManager} i`;
901
+ } else {
902
+ runCommand = `${this.packageManager} add`;
903
+ }
904
+ const packageList = packages.join(" ");
905
+ return execa(`${runCommand} ${packageList}`, {
906
+ all: true,
907
+ shell: true,
908
+ stdio: "inherit"
909
+ });
910
+ }
911
+ async checkDependencies(dependencies) {
17
912
  try {
18
- analytics.trackCommand({
19
- command: 'version',
20
- });
21
- console.log(`create-mastra ${version}`);
913
+ const packageJsonPath = path.join(process.cwd(), "package.json");
914
+ try {
915
+ await fs4.access(packageJsonPath);
916
+ } catch {
917
+ return "No package.json file found in the current directory";
918
+ }
919
+ const packageJson = JSON.parse(await fs4.readFile(packageJsonPath, "utf-8"));
920
+ for (const dependency of dependencies) {
921
+ if (!packageJson.dependencies || !packageJson.dependencies[dependency]) {
922
+ return `Please install ${dependency} before running this command (${this.packageManager} install ${dependency})`;
923
+ }
924
+ }
925
+ return "ok";
926
+ } catch (err) {
927
+ console.error(err);
928
+ return "Could not check dependencies";
22
929
  }
23
- catch (e) { }
930
+ }
931
+ async getProjectName() {
932
+ try {
933
+ const packageJsonPath = path.join(process.cwd(), "package.json");
934
+ const packageJson = await fs4.readFile(packageJsonPath, "utf-8");
935
+ const pkg = JSON.parse(packageJson);
936
+ return pkg.name;
937
+ } catch (err) {
938
+ throw err;
939
+ }
940
+ }
941
+ async getPackageVersion() {
942
+ const __filename = fileURLToPath(import.meta.url);
943
+ const __dirname = dirname(__filename);
944
+ const pkgJsonPath = path.join(__dirname, "..", "package.json");
945
+ const content = await fsExtra3.readJSON(pkgJsonPath);
946
+ return content.version;
947
+ }
948
+ async addScriptsToPackageJson(scripts) {
949
+ const packageJson = JSON.parse(await fs4.readFile("package.json", "utf-8"));
950
+ packageJson.scripts = {
951
+ ...packageJson.scripts,
952
+ ...scripts
953
+ };
954
+ await fs4.writeFile("package.json", JSON.stringify(packageJson, null, 2));
955
+ }
956
+ };
957
+ var EnvService = class {
958
+ };
959
+ var FileEnvService = class extends EnvService {
960
+ filePath;
961
+ constructor(filePath) {
962
+ super();
963
+ this.filePath = filePath;
964
+ }
965
+ readFile(filePath) {
966
+ return new Promise((resolve, reject) => {
967
+ fs3__default.readFile(filePath, "utf8", (err, data) => {
968
+ if (err) reject(err);
969
+ else resolve(data);
970
+ });
971
+ });
972
+ }
973
+ writeFile({ filePath, data }) {
974
+ return new Promise((resolve, reject) => {
975
+ fs3__default.writeFile(filePath, data, "utf8", (err) => {
976
+ if (err) reject(err);
977
+ else resolve();
978
+ });
979
+ });
980
+ }
981
+ async updateEnvData({
982
+ key,
983
+ value,
984
+ filePath = this.filePath,
985
+ data
986
+ }) {
987
+ const regex = new RegExp(`^${key}=.*$`, "m");
988
+ if (data.match(regex)) {
989
+ data = data.replace(regex, `${key}=${value}`);
990
+ } else {
991
+ data += `
992
+ ${key}=${value}`;
993
+ }
994
+ await this.writeFile({ filePath, data });
995
+ console.log(`${key} set to ${value} in ENV file.`);
996
+ return data;
997
+ }
998
+ async getEnvValue(key) {
999
+ try {
1000
+ const data = await this.readFile(this.filePath);
1001
+ const regex = new RegExp(`^${key}=(.*)$`, "m");
1002
+ const match = data.match(regex);
1003
+ return match?.[1] || null;
1004
+ } catch (err) {
1005
+ console.error(`Error reading ENV value: ${err}`);
1006
+ return null;
1007
+ }
1008
+ }
1009
+ async setEnvValue(key, value) {
1010
+ try {
1011
+ const data = await this.readFile(this.filePath);
1012
+ await this.updateEnvData({ key, value, data });
1013
+ } catch (err) {
1014
+ console.error(`Error writing ENV value: ${err}`);
1015
+ }
1016
+ }
1017
+ };
1018
+ var FileService = class {
1019
+ /**
1020
+ *
1021
+ * @param inputFile the file in the starter files directory to copy
1022
+ * @param outputFilePath the destination path
1023
+ * @param replaceIfExists flag to replace if it exists
1024
+ * @returns
1025
+ */
1026
+ async copyStarterFile(inputFile, outputFilePath, replaceIfExists) {
1027
+ const __filename = fileURLToPath(import.meta.url);
1028
+ const __dirname = path.dirname(__filename);
1029
+ const filePath = path.resolve(__dirname, "starter-files", inputFile);
1030
+ const fileString = fs3__default__default.readFileSync(filePath, "utf8");
1031
+ if (fs3__default__default.existsSync(outputFilePath) && !replaceIfExists) {
1032
+ console.log(`${outputFilePath} already exists`);
1033
+ return false;
1034
+ }
1035
+ await fsExtra3.outputFile(outputFilePath, fileString);
1036
+ return true;
1037
+ }
1038
+ async setupEnvFile({ dbUrl }) {
1039
+ const envPath = path.join(process.cwd(), ".env.development");
1040
+ await fsExtra3.ensureFile(envPath);
1041
+ const fileEnvService = new FileEnvService(envPath);
1042
+ await fileEnvService.setEnvValue("DB_URL", dbUrl);
1043
+ }
1044
+ getFirstExistingFile(files) {
1045
+ for (const f of files) {
1046
+ if (fs3__default__default.existsSync(f)) {
1047
+ return f;
1048
+ }
1049
+ }
1050
+ throw new Error("Missing required file, checked the following paths: " + files.join(", "));
1051
+ }
1052
+ replaceValuesInFile({
1053
+ filePath,
1054
+ replacements
1055
+ }) {
1056
+ let fileContent = fs3__default__default.readFileSync(filePath, "utf8");
1057
+ replacements.forEach(({ search, replace }) => {
1058
+ fileContent = fileContent.replaceAll(search, replace);
1059
+ });
1060
+ fs3__default__default.writeFileSync(filePath, fileContent);
1061
+ }
1062
+ };
1063
+ createLogger({
1064
+ name: "Mastra CLI",
1065
+ level: "debug"
1066
+ });
1067
+ var exec = util.promisify(child_process.exec);
1068
+ var getAISDKPackage = (llmProvider) => {
1069
+ switch (llmProvider) {
1070
+ case "openai":
1071
+ return "@ai-sdk/openai";
1072
+ case "anthropic":
1073
+ return "@ai-sdk/anthropic";
1074
+ case "groq":
1075
+ return "@ai-sdk/groq";
1076
+ default:
1077
+ return "@ai-sdk/openai";
1078
+ }
1079
+ };
1080
+ async function writeAgentSample(llmProvider, destPath, addExampleTool) {
1081
+ let providerImport = "";
1082
+ let modelItem = "";
1083
+ if (llmProvider === "openai") {
1084
+ providerImport = `import { openai } from '${getAISDKPackage(llmProvider)}';`;
1085
+ modelItem = `openai('gpt-4o')`;
1086
+ } else if (llmProvider === "anthropic") {
1087
+ providerImport = `import { anthropic } from '${getAISDKPackage(llmProvider)}';`;
1088
+ modelItem = `anthropic('claude-3-5-sonnet-20241022')`;
1089
+ } else if (llmProvider === "groq") {
1090
+ providerImport = `import { groq } from '${getAISDKPackage(llmProvider)}';`;
1091
+ modelItem = `groq('llama3-groq-70b-8192-tool-use-preview')`;
1092
+ }
1093
+ const instructions = `
1094
+ You are a helpful weather assistant that provides accurate weather information.
1095
+
1096
+ Your primary function is to help users get weather details for specific locations. When responding:
1097
+ - Always ask for a location if none is provided
1098
+ - If giving a location with multiple parts (e.g. "New York, NY"), use the most relevant part (e.g. "New York")
1099
+ - Include relevant details like humidity, wind conditions, and precipitation
1100
+ - Keep responses concise but informative
1101
+
1102
+ ${addExampleTool ? "Use the weatherTool to fetch current weather data." : ""}
1103
+ `;
1104
+ const content = `
1105
+ ${providerImport}
1106
+ import { Agent } from '@mastra/core/agent';
1107
+ ${addExampleTool ? `import { weatherTool } from '../tools';` : ""}
1108
+
1109
+ export const weatherAgent = new Agent({
1110
+ name: 'Weather Agent',
1111
+ instructions: \`${instructions}\`,
1112
+ model: ${modelItem},
1113
+ ${addExampleTool ? "tools: { weatherTool }," : ""}
24
1114
  });
25
- program
26
- .name('create-mastra')
27
- .description('Create a new Mastra project')
28
- .option('--default', 'Quick start with defaults(src, OpenAI, no examples)')
29
- .option('-c, --components <components>', 'Comma-separated list of components (agents, tools, workflows)')
30
- .option('-l, --llm <model-provider>', 'Default model provider (openai, anthropic, or groq)')
31
- .option('-e, --example', 'Include example code')
32
- .action(async (args) => {
33
- if (args.default) {
34
- await create({
35
- components: ['agents', 'tools', 'workflows'],
36
- llmProvider: 'openai',
37
- addExample: false,
1115
+ `;
1116
+ const formattedContent = await prettier.format(content, {
1117
+ parser: "typescript",
1118
+ singleQuote: true
1119
+ });
1120
+ await fs4.writeFile(destPath, "");
1121
+ await fs4.writeFile(destPath, formattedContent);
1122
+ }
1123
+ async function writeWorkflowSample(destPath) {
1124
+ const fileService = new FileService();
1125
+ await fileService.copyStarterFile("workflow.ts", destPath);
1126
+ }
1127
+ async function writeToolSample(destPath) {
1128
+ const fileService = new FileService();
1129
+ await fileService.copyStarterFile("tools.ts", destPath);
1130
+ }
1131
+ async function writeCodeSampleForComponents(llmprovider, component, destPath, importComponents) {
1132
+ switch (component) {
1133
+ case "agents":
1134
+ return writeAgentSample(llmprovider, destPath, importComponents.includes("tools"));
1135
+ case "tools":
1136
+ return writeToolSample(destPath);
1137
+ case "workflows":
1138
+ return writeWorkflowSample(destPath);
1139
+ default:
1140
+ return "";
1141
+ }
1142
+ }
1143
+ var createComponentsDir = async (dirPath, component) => {
1144
+ const componentPath = dirPath + `/${component}`;
1145
+ await fsExtra3.ensureDir(componentPath);
1146
+ };
1147
+ var writeIndexFile = async ({
1148
+ dirPath,
1149
+ addAgent,
1150
+ addExample,
1151
+ addWorkflow
1152
+ }) => {
1153
+ const indexPath = dirPath + "/index.ts";
1154
+ const destPath = path.join(indexPath);
1155
+ try {
1156
+ await fs4.writeFile(destPath, "");
1157
+ const filteredExports = [
1158
+ addWorkflow ? `workflows: { weatherWorkflow },` : "",
1159
+ addAgent ? `agents: { weatherAgent },` : ""
1160
+ ].filter(Boolean);
1161
+ if (!addExample) {
1162
+ await fs4.writeFile(
1163
+ destPath,
1164
+ `
1165
+ import { Mastra } from '@mastra/core';
1166
+
1167
+ export const mastra = new Mastra()
1168
+ `
1169
+ );
1170
+ return;
1171
+ }
1172
+ await fs4.writeFile(
1173
+ destPath,
1174
+ `
1175
+ import { Mastra } from '@mastra/core/mastra';
1176
+ import { createLogger } from '@mastra/core/logger';
1177
+ ${addWorkflow ? `import { weatherWorkflow } from './workflows';` : ""}
1178
+ ${addAgent ? `import { weatherAgent } from './agents';` : ""}
1179
+
1180
+ export const mastra = new Mastra({
1181
+ ${filteredExports.join("\n ")}
1182
+ logger: createLogger({
1183
+ name: 'Mastra',
1184
+ level: 'info',
1185
+ }),
1186
+ });
1187
+ `
1188
+ );
1189
+ } catch (err) {
1190
+ throw err;
1191
+ }
1192
+ };
1193
+ yoctoSpinner({ text: "Installing Mastra core dependencies\n" });
1194
+ var getAPIKey = async (provider) => {
1195
+ let key = "OPENAI_API_KEY";
1196
+ switch (provider) {
1197
+ case "anthropic":
1198
+ key = "ANTHROPIC_API_KEY";
1199
+ return key;
1200
+ case "groq":
1201
+ key = "GROQ_API_KEY";
1202
+ return key;
1203
+ default:
1204
+ return key;
1205
+ }
1206
+ };
1207
+ var writeAPIKey = async ({
1208
+ provider,
1209
+ apiKey = "your-api-key"
1210
+ }) => {
1211
+ const key = await getAPIKey(provider);
1212
+ await exec(`echo ${key}=${apiKey} >> .env.development`);
1213
+ };
1214
+ var createMastraDir = async (directory) => {
1215
+ let dir = directory.trim().split("/").filter((item) => item !== "");
1216
+ const dirPath = path.join(process.cwd(), ...dir, "mastra");
1217
+ try {
1218
+ await fs4.access(dirPath);
1219
+ return { ok: false };
1220
+ } catch {
1221
+ await fsExtra3.ensureDir(dirPath);
1222
+ return { ok: true, dirPath };
1223
+ }
1224
+ };
1225
+ var writeCodeSample = async (dirPath, component, llmProvider, importComponents) => {
1226
+ const destPath = dirPath + `/${component}/index.ts`;
1227
+ try {
1228
+ await writeCodeSampleForComponents(llmProvider, component, destPath, importComponents);
1229
+ } catch (err) {
1230
+ throw err;
1231
+ }
1232
+ };
1233
+ var interactivePrompt = async () => {
1234
+ pe(color2.inverse("Mastra Init"));
1235
+ const mastraProject = await ve(
1236
+ {
1237
+ directory: () => ae({
1238
+ message: "Where should we create the Mastra files? (default: src/)",
1239
+ placeholder: "src/",
1240
+ defaultValue: "src/"
1241
+ }),
1242
+ components: () => $e({
1243
+ message: "Choose components to install:",
1244
+ options: [
1245
+ { value: "agents", label: "Agents", hint: "recommended" },
1246
+ {
1247
+ value: "workflows",
1248
+ label: "Workflows"
1249
+ }
1250
+ ]
1251
+ }),
1252
+ shouldAddTools: () => ce({
1253
+ message: "Add tools?",
1254
+ initialValue: false
1255
+ }),
1256
+ llmProvider: () => le({
1257
+ message: "Select default provider:",
1258
+ options: [
1259
+ { value: "openai", label: "OpenAI", hint: "recommended" },
1260
+ { value: "anthropic", label: "Anthropic" },
1261
+ { value: "groq", label: "Groq" }
1262
+ ]
1263
+ }),
1264
+ llmApiKey: async ({ results: { llmProvider } }) => {
1265
+ const keyChoice = await le({
1266
+ message: `Enter your ${llmProvider} API key?`,
1267
+ options: [
1268
+ { value: "skip", label: "Skip for now", hint: "default" },
1269
+ { value: "enter", label: "Enter API key" }
1270
+ ],
1271
+ initialValue: "skip"
38
1272
  });
39
- return;
1273
+ if (keyChoice === "enter") {
1274
+ return ae({
1275
+ message: "Enter your API key:",
1276
+ placeholder: "sk-..."
1277
+ });
1278
+ }
1279
+ return undefined;
1280
+ },
1281
+ addExample: () => ce({
1282
+ message: "Add example",
1283
+ initialValue: false
1284
+ })
1285
+ },
1286
+ {
1287
+ onCancel: () => {
1288
+ he("Operation cancelled.");
1289
+ process.exit(0);
1290
+ }
1291
+ }
1292
+ );
1293
+ const { shouldAddTools, components, ...rest } = mastraProject;
1294
+ const mastraComponents = shouldAddTools ? [...components, "tools"] : components;
1295
+ return { ...rest, components: mastraComponents };
1296
+ };
1297
+ var s = _();
1298
+ var exec2 = util.promisify(child_process.exec);
1299
+ var init = async ({
1300
+ directory,
1301
+ addExample = false,
1302
+ components,
1303
+ llmProvider = "openai",
1304
+ llmApiKey
1305
+ }) => {
1306
+ s.start("Initializing Mastra");
1307
+ try {
1308
+ const result = await createMastraDir(directory);
1309
+ if (!result.ok) {
1310
+ s.stop(color2.inverse(" Mastra already initialized "));
1311
+ return { success: false };
1312
+ }
1313
+ const dirPath = result.dirPath;
1314
+ await Promise.all([
1315
+ writeIndexFile({
1316
+ dirPath,
1317
+ addExample,
1318
+ addWorkflow: components.includes("workflows"),
1319
+ addAgent: components.includes("agents")
1320
+ }),
1321
+ ...components.map((component) => createComponentsDir(dirPath, component)),
1322
+ writeAPIKey({ provider: llmProvider, apiKey: llmApiKey })
1323
+ ]);
1324
+ if (addExample) {
1325
+ await Promise.all([
1326
+ ...components.map(
1327
+ (component) => writeCodeSample(dirPath, component, llmProvider, components)
1328
+ )
1329
+ ]);
40
1330
  }
1331
+ const key = await getAPIKey(llmProvider || "openai");
1332
+ const aiSdkPackage = getAISDKPackage(llmProvider);
1333
+ await exec2(`npm i ${aiSdkPackage}`);
1334
+ s.stop();
1335
+ if (!llmApiKey) {
1336
+ me(`
1337
+ ${color2.green("Mastra initialized successfully!")}
1338
+
1339
+ Add your ${color2.cyan(key)} as an environment variable
1340
+ in your ${color2.cyan(".env.development")} file
1341
+ `);
1342
+ } else {
1343
+ me(`
1344
+ ${color2.green("Mastra initialized successfully!")}
1345
+ `);
1346
+ }
1347
+ return { success: true };
1348
+ } catch (err) {
1349
+ s.stop(color2.inverse("An error occurred while initializing Mastra"));
1350
+ console.error(err);
1351
+ return { success: false };
1352
+ }
1353
+ };
1354
+ var exec3 = util.promisify(child_process.exec);
1355
+ var createMastraProject = async () => {
1356
+ pe(color2.inverse("Mastra Create"));
1357
+ const projectName = await ae({
1358
+ message: "What do you want to name your project?",
1359
+ placeholder: "my-mastra-app",
1360
+ defaultValue: "my-mastra-app"
1361
+ });
1362
+ if (lD(projectName)) {
1363
+ he("Operation cancelled");
1364
+ process.exit(0);
1365
+ }
1366
+ const s2 = _();
1367
+ s2.start("Creating project");
1368
+ try {
1369
+ await fs4.mkdir(projectName);
1370
+ } catch (error) {
1371
+ if (error instanceof Error && "code" in error && error.code === "EEXIST") {
1372
+ s2.stop(
1373
+ `A directory named "${projectName}" already exists. Please choose a different name or delete the existing directory.`
1374
+ );
1375
+ process.exit(1);
1376
+ }
1377
+ throw error;
1378
+ }
1379
+ process.chdir(projectName);
1380
+ s2.message("Creating project");
1381
+ await exec3(`npm init -y`);
1382
+ await exec3(`npm pkg set type="module"`);
1383
+ const depsService = new DepsService();
1384
+ await depsService.addScriptsToPackageJson({
1385
+ dev: "mastra dev"
1386
+ });
1387
+ s2.stop("Project created");
1388
+ s2.start("Installing npm dependencies");
1389
+ await exec3(`npm i zod`);
1390
+ await exec3(`npm i typescript tsx @types/node --save-dev`);
1391
+ await exec3(`echo '{
1392
+ "compilerOptions": {
1393
+ "target": "ES2022",
1394
+ "module": "ES2022",
1395
+ "moduleResolution": "bundler",
1396
+ "esModuleInterop": true,
1397
+ "forceConsistentCasingInFileNames": true,
1398
+ "strict": true,
1399
+ "skipLibCheck": true,
1400
+ "outDir": "dist"
1401
+ },
1402
+ "include": [
1403
+ "src/**/*"
1404
+ ],
1405
+ "exclude": [
1406
+ "node_modules",
1407
+ "dist",
1408
+ ".mastra"
1409
+ ]
1410
+ }' > tsconfig.json`);
1411
+ s2.stop("NPM dependencies installed");
1412
+ s2.start("Installing mastra");
1413
+ await exec3(`npm i -D mastra`);
1414
+ s2.stop("mastra installed");
1415
+ s2.start("Installing @mastra/core");
1416
+ await exec3(`npm i @mastra/core@alpha`);
1417
+ s2.stop("@mastra/core installed");
1418
+ s2.start("Adding .gitignore");
1419
+ await exec3(`echo output.txt >> .gitignore`);
1420
+ await exec3(`echo node_modules >> .gitignore`);
1421
+ await exec3(`echo dist >> .gitignore`);
1422
+ await exec3(`echo .mastra >> .gitignore`);
1423
+ await exec3(`echo .env.development >> .gitignore`);
1424
+ await exec3(`echo .env >> .gitignore`);
1425
+ await exec3(`echo *.db >> .gitignore`);
1426
+ s2.stop(".gitignore added");
1427
+ ge("Project created successfully");
1428
+ console.log("");
1429
+ return { projectName };
1430
+ };
1431
+ var create = async (args) => {
1432
+ const { projectName } = await createMastraProject();
1433
+ const directory = "/src";
1434
+ if (!args.components || !args.llmProvider || !args.addExample) {
1435
+ const result = await interactivePrompt();
1436
+ await init({
1437
+ ...result,
1438
+ llmApiKey: result?.llmApiKey
1439
+ });
1440
+ postCreate({ projectName });
1441
+ return;
1442
+ }
1443
+ const { components = [], llmProvider = "openai", addExample = false, llmApiKey } = args;
1444
+ await init({
1445
+ directory,
1446
+ components,
1447
+ llmProvider,
1448
+ addExample,
1449
+ llmApiKey
1450
+ });
1451
+ postCreate({ projectName });
1452
+ };
1453
+ var postCreate = ({ projectName }) => {
1454
+ ge(`
1455
+ ${color2.green("To start your project:")}
1456
+
1457
+ ${color2.cyan("cd")} ${projectName}
1458
+ ${color2.cyan("npm run dev")}
1459
+ `);
1460
+ };
1461
+
1462
+ async function getPackageVersion() {
1463
+ const __filename = fileURLToPath(import.meta.url);
1464
+ const __dirname = dirname(__filename);
1465
+ const pkgJsonPath = path.join(__dirname, "..", "package.json");
1466
+ const content = await fsExtra.readJSON(pkgJsonPath);
1467
+ return content.version;
1468
+ }
1469
+
1470
+ const version = await getPackageVersion();
1471
+ const analytics = new PosthogAnalytics({
1472
+ apiKey: "phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT",
1473
+ host: "https://us.posthog.com",
1474
+ version
1475
+ });
1476
+ const program = new Command();
1477
+ program.version(`${version}`, "-v, --version").description(`create-mastra ${version}`).action(async () => {
1478
+ try {
1479
+ analytics.trackCommand({
1480
+ command: "version"
1481
+ });
1482
+ console.log(`create-mastra ${version}`);
1483
+ } catch (e) {
1484
+ }
1485
+ });
1486
+ 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) => {
1487
+ if (args.default) {
41
1488
  await create({
42
- components: args.components,
43
- llmProvider: args.llm,
44
- addExample: args.example,
1489
+ components: ["agents", "tools", "workflows"],
1490
+ llmProvider: "openai",
1491
+ addExample: false
45
1492
  });
1493
+ return;
1494
+ }
1495
+ await create({
1496
+ components: args.components ? args.components.split(",") : [],
1497
+ llmProvider: args.llm,
1498
+ addExample: args.example,
1499
+ llmApiKey: args["llm-api-key"]
1500
+ });
46
1501
  });
47
1502
  program.parse(process.argv);
1503
+ //# sourceMappingURL=index.js.map