@mesh-tech/mesh-cli 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.
Files changed (140) hide show
  1. package/dist/bin/mesh.d.ts +16 -0
  2. package/dist/bin/mesh.d.ts.map +1 -0
  3. package/dist/bin/mesh.js +40 -0
  4. package/dist/bin/mesh.js.map +1 -0
  5. package/dist/src/commands/create-app.d.ts +10 -0
  6. package/dist/src/commands/create-app.d.ts.map +1 -0
  7. package/dist/src/commands/create-app.js +176 -0
  8. package/dist/src/commands/create-app.js.map +1 -0
  9. package/dist/src/commands/db/connect.d.ts +13 -0
  10. package/dist/src/commands/db/connect.d.ts.map +1 -0
  11. package/dist/src/commands/db/connect.js +68 -0
  12. package/dist/src/commands/db/connect.js.map +1 -0
  13. package/dist/src/commands/db/credentials.d.ts +16 -0
  14. package/dist/src/commands/db/credentials.d.ts.map +1 -0
  15. package/dist/src/commands/db/credentials.js +56 -0
  16. package/dist/src/commands/db/credentials.js.map +1 -0
  17. package/dist/src/commands/db/env.d.ts +15 -0
  18. package/dist/src/commands/db/env.d.ts.map +1 -0
  19. package/dist/src/commands/db/env.js +50 -0
  20. package/dist/src/commands/db/env.js.map +1 -0
  21. package/dist/src/commands/db/exec.d.ts +54 -0
  22. package/dist/src/commands/db/exec.d.ts.map +1 -0
  23. package/dist/src/commands/db/exec.js +331 -0
  24. package/dist/src/commands/db/exec.js.map +1 -0
  25. package/dist/src/commands/db/index.d.ts +12 -0
  26. package/dist/src/commands/db/index.d.ts.map +1 -0
  27. package/dist/src/commands/db/index.js +62 -0
  28. package/dist/src/commands/db/index.js.map +1 -0
  29. package/dist/src/commands/db/psql.d.ts +16 -0
  30. package/dist/src/commands/db/psql.d.ts.map +1 -0
  31. package/dist/src/commands/db/psql.js +133 -0
  32. package/dist/src/commands/db/psql.js.map +1 -0
  33. package/dist/src/commands/deploy.d.ts +24 -0
  34. package/dist/src/commands/deploy.d.ts.map +1 -0
  35. package/dist/src/commands/deploy.js +228 -0
  36. package/dist/src/commands/deploy.js.map +1 -0
  37. package/dist/src/commands/dev.d.ts +17 -0
  38. package/dist/src/commands/dev.d.ts.map +1 -0
  39. package/dist/src/commands/dev.js +1248 -0
  40. package/dist/src/commands/dev.js.map +1 -0
  41. package/dist/src/commands/devbox.d.ts +22 -0
  42. package/dist/src/commands/devbox.d.ts.map +1 -0
  43. package/dist/src/commands/devbox.js +463 -0
  44. package/dist/src/commands/devbox.js.map +1 -0
  45. package/dist/src/commands/login.d.ts +47 -0
  46. package/dist/src/commands/login.d.ts.map +1 -0
  47. package/dist/src/commands/login.js +344 -0
  48. package/dist/src/commands/login.js.map +1 -0
  49. package/dist/src/commands/registry.d.ts +20 -0
  50. package/dist/src/commands/registry.d.ts.map +1 -0
  51. package/dist/src/commands/registry.js +336 -0
  52. package/dist/src/commands/registry.js.map +1 -0
  53. package/dist/src/commands/secrets/exec.d.ts +17 -0
  54. package/dist/src/commands/secrets/exec.d.ts.map +1 -0
  55. package/dist/src/commands/secrets/exec.js +132 -0
  56. package/dist/src/commands/secrets/exec.js.map +1 -0
  57. package/dist/src/commands/secrets/index.d.ts +10 -0
  58. package/dist/src/commands/secrets/index.d.ts.map +1 -0
  59. package/dist/src/commands/secrets/index.js +35 -0
  60. package/dist/src/commands/secrets/index.js.map +1 -0
  61. package/dist/src/commands/secrets/set.d.ts +22 -0
  62. package/dist/src/commands/secrets/set.d.ts.map +1 -0
  63. package/dist/src/commands/secrets/set.js +234 -0
  64. package/dist/src/commands/secrets/set.js.map +1 -0
  65. package/dist/src/commands/stack.d.ts +17 -0
  66. package/dist/src/commands/stack.d.ts.map +1 -0
  67. package/dist/src/commands/stack.js +175 -0
  68. package/dist/src/commands/stack.js.map +1 -0
  69. package/dist/src/commands/tunnel/index.d.ts +14 -0
  70. package/dist/src/commands/tunnel/index.d.ts.map +1 -0
  71. package/dist/src/commands/tunnel/index.js +217 -0
  72. package/dist/src/commands/tunnel/index.js.map +1 -0
  73. package/dist/src/index.d.ts +7 -0
  74. package/dist/src/index.d.ts.map +1 -0
  75. package/dist/src/index.js +7 -0
  76. package/dist/src/index.js.map +1 -0
  77. package/dist/src/utils/bastion.d.ts +43 -0
  78. package/dist/src/utils/bastion.d.ts.map +1 -0
  79. package/dist/src/utils/bastion.js +77 -0
  80. package/dist/src/utils/bastion.js.map +1 -0
  81. package/dist/src/utils/context.d.ts +29 -0
  82. package/dist/src/utils/context.d.ts.map +1 -0
  83. package/dist/src/utils/context.js +132 -0
  84. package/dist/src/utils/context.js.map +1 -0
  85. package/dist/src/utils/credentials.d.ts +61 -0
  86. package/dist/src/utils/credentials.d.ts.map +1 -0
  87. package/dist/src/utils/credentials.js +145 -0
  88. package/dist/src/utils/credentials.js.map +1 -0
  89. package/dist/src/utils/index.d.ts +9 -0
  90. package/dist/src/utils/index.d.ts.map +1 -0
  91. package/dist/src/utils/index.js +9 -0
  92. package/dist/src/utils/index.js.map +1 -0
  93. package/dist/src/utils/log.d.ts +8 -0
  94. package/dist/src/utils/log.d.ts.map +1 -0
  95. package/dist/src/utils/log.js +17 -0
  96. package/dist/src/utils/log.js.map +1 -0
  97. package/dist/src/utils/pulumi.d.ts +24 -0
  98. package/dist/src/utils/pulumi.d.ts.map +1 -0
  99. package/dist/src/utils/pulumi.js +63 -0
  100. package/dist/src/utils/pulumi.js.map +1 -0
  101. package/package.json +50 -0
  102. package/templates/api-web-db/api/.dockerignore +2 -0
  103. package/templates/api-web-db/api/Dockerfile +16 -0
  104. package/templates/api-web-db/api/package.json.hbs +21 -0
  105. package/templates/api-web-db/api/src/index.ts.hbs +123 -0
  106. package/templates/api-web-db/api/tsconfig.json +13 -0
  107. package/templates/api-web-db/package.json.hbs +27 -0
  108. package/templates/api-web-db/sst.config.ts.hbs +151 -0
  109. package/templates/api-web-db/tsconfig.json +11 -0
  110. package/templates/api-web-db/web/.dockerignore +3 -0
  111. package/templates/api-web-db/web/Dockerfile +17 -0
  112. package/templates/api-web-db/web/app/lib/db.server.ts +36 -0
  113. package/templates/api-web-db/web/app/root.tsx +29 -0
  114. package/templates/api-web-db/web/app/routes/home.tsx.hbs +114 -0
  115. package/templates/api-web-db/web/app/routes.ts +3 -0
  116. package/templates/api-web-db/web/package.json.hbs +30 -0
  117. package/templates/api-web-db/web/prisma/schema.prisma +25 -0
  118. package/templates/api-web-db/web/prisma.config.ts +18 -0
  119. package/templates/api-web-db/web/react-router.config.ts +5 -0
  120. package/templates/api-web-db/web/tsconfig.json +19 -0
  121. package/templates/api-web-db/web/vite.config.ts +9 -0
  122. package/templates/temporal-api-worker/README.md.hbs +133 -0
  123. package/templates/temporal-api-worker/api/.dockerignore +4 -0
  124. package/templates/temporal-api-worker/api/Dockerfile +13 -0
  125. package/templates/temporal-api-worker/api/package.json.hbs +23 -0
  126. package/templates/temporal-api-worker/api/src/encryption-codec.ts +133 -0
  127. package/templates/temporal-api-worker/api/src/index.ts.hbs +145 -0
  128. package/templates/temporal-api-worker/api/tsconfig.json +14 -0
  129. package/templates/temporal-api-worker/package.json.hbs +29 -0
  130. package/templates/temporal-api-worker/sst.config.ts.hbs +161 -0
  131. package/templates/temporal-api-worker/tsconfig.json +10 -0
  132. package/templates/temporal-api-worker/worker/.dockerignore +4 -0
  133. package/templates/temporal-api-worker/worker/Dockerfile +11 -0
  134. package/templates/temporal-api-worker/worker/package.json.hbs +25 -0
  135. package/templates/temporal-api-worker/worker/src/activities.ts.hbs +49 -0
  136. package/templates/temporal-api-worker/worker/src/bundle-workflows.ts +38 -0
  137. package/templates/temporal-api-worker/worker/src/encryption-codec.ts +156 -0
  138. package/templates/temporal-api-worker/worker/src/worker.ts.hbs +93 -0
  139. package/templates/temporal-api-worker/worker/src/workflows.ts.hbs +60 -0
  140. package/templates/temporal-api-worker/worker/tsconfig.json +14 -0
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mesh - CLI for Mesh Lab development utilities
4
+ *
5
+ * Commands:
6
+ * mesh create-app Scaffold a new tenant application
7
+ * mesh dev Start DB tunnel and run sst dev
8
+ * mesh tunnel Start SSM tunnel to platform services
9
+ * mesh db connect Start DB tunnel for manual access
10
+ * mesh db credentials Print database credentials
11
+ * mesh db env Export DATABASE_URL for shell
12
+ * mesh db psql Connect to database with psql
13
+ * mesh secrets exec Run command with secrets as env vars
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=mesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh.d.ts","sourceRoot":"","sources":["../../bin/mesh.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mesh - CLI for Mesh Lab development utilities
4
+ *
5
+ * Commands:
6
+ * mesh create-app Scaffold a new tenant application
7
+ * mesh dev Start DB tunnel and run sst dev
8
+ * mesh tunnel Start SSM tunnel to platform services
9
+ * mesh db connect Start DB tunnel for manual access
10
+ * mesh db credentials Print database credentials
11
+ * mesh db env Export DATABASE_URL for shell
12
+ * mesh db psql Connect to database with psql
13
+ * mesh secrets exec Run command with secrets as env vars
14
+ */
15
+ import { program } from "commander";
16
+ import { registerDbCommands } from "../src/commands/db/index.js";
17
+ import { registerDeployCommand } from "../src/commands/deploy.js";
18
+ import { registerDevCommand } from "../src/commands/dev.js";
19
+ import { registerCreateAppCommand } from "../src/commands/create-app.js";
20
+ import { registerLoginCommand } from "../src/commands/login.js";
21
+ import { registerRegistryCommands } from "../src/commands/registry.js";
22
+ import { registerStackCommand } from "../src/commands/stack.js";
23
+ import { registerTunnelCommands } from "../src/commands/tunnel/index.js";
24
+ import { registerSecretsCommands } from "../src/commands/secrets/index.js";
25
+ program
26
+ .name("mesh")
27
+ .description("CLI for Mesh Lab development utilities")
28
+ .version("0.0.1");
29
+ // Register command groups
30
+ registerLoginCommand(program);
31
+ registerRegistryCommands(program);
32
+ registerDbCommands(program);
33
+ registerDeployCommand(program);
34
+ registerDevCommand(program);
35
+ registerCreateAppCommand(program);
36
+ registerStackCommand(program);
37
+ registerTunnelCommands(program);
38
+ registerSecretsCommands(program);
39
+ program.parse();
40
+ //# sourceMappingURL=mesh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh.js","sourceRoot":"","sources":["../../bin/mesh.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,0BAA0B;AAC1B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * mesh create-app - Scaffold a new tenant application
3
+ *
4
+ * Creates a new application using one of the available templates:
5
+ * - api-web-db: API + Web + Database (default)
6
+ * - temporal-api-worker: Temporal Worker + API for workflows
7
+ */
8
+ import { Command } from "commander";
9
+ export declare function registerCreateAppCommand(program: Command): void;
10
+ //# sourceMappingURL=create-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../../../src/commands/create-app.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyEpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuI/D"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * mesh create-app - Scaffold a new tenant application
3
+ *
4
+ * Creates a new application using one of the available templates:
5
+ * - api-web-db: API + Web + Database (default)
6
+ * - temporal-api-worker: Temporal Worker + API for workflows
7
+ */
8
+ import * as fs from "fs";
9
+ import * as path from "path";
10
+ import { fileURLToPath } from "url";
11
+ import Handlebars from "handlebars";
12
+ import { logInfo, logSuccess, logError, logWarn } from "../utils/index.js";
13
+ // Get package root (works from both src/ and dist/)
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = path.dirname(__filename);
16
+ // Navigate from dist/src/commands/ or src/commands/ to package root
17
+ const packageRoot = path.resolve(__dirname, "..", "..", "..");
18
+ // Available templates
19
+ const TEMPLATES = {
20
+ "api-web-db": "API + Web + Database application",
21
+ "temporal-api-worker": "Temporal Worker + API for workflow orchestration",
22
+ };
23
+ // Register Handlebars helpers
24
+ Handlebars.registerHelper("titleCase", (str) => {
25
+ return str
26
+ .split("-")
27
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
28
+ .join(" ");
29
+ });
30
+ /**
31
+ * Recursively copy a directory, processing .hbs templates
32
+ */
33
+ function copyTemplate(srcDir, destDir, context) {
34
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
35
+ for (const entry of entries) {
36
+ const srcPath = path.join(srcDir, entry.name);
37
+ let destName = entry.name;
38
+ // Remove .hbs extension for template files
39
+ if (destName.endsWith(".hbs")) {
40
+ destName = destName.slice(0, -4);
41
+ }
42
+ const destPath = path.join(destDir, destName);
43
+ if (entry.isDirectory()) {
44
+ fs.mkdirSync(destPath, { recursive: true });
45
+ copyTemplate(srcPath, destPath, context);
46
+ }
47
+ else if (entry.name.endsWith(".hbs")) {
48
+ // Process Handlebars template
49
+ const templateContent = fs.readFileSync(srcPath, "utf-8");
50
+ const template = Handlebars.compile(templateContent);
51
+ const output = template(context);
52
+ fs.writeFileSync(destPath, output);
53
+ }
54
+ else {
55
+ // Copy file as-is
56
+ fs.copyFileSync(srcPath, destPath);
57
+ }
58
+ }
59
+ }
60
+ export function registerCreateAppCommand(program) {
61
+ program
62
+ .command("create-app")
63
+ .description("Scaffold a new tenant application")
64
+ .requiredOption("--tenant <tenant>", "Tenant name (e.g., acme)")
65
+ .requiredOption("--name <name>", "Application name (e.g., billing)")
66
+ .option("--template <template>", `Template to use: ${Object.keys(TEMPLATES).join(", ")}`, "api-web-db")
67
+ .option("--test", "Create in tests/tenants/ directory", false)
68
+ .action(async (options) => {
69
+ const { tenant, name, template, test } = options;
70
+ // Validate template
71
+ if (!Object.keys(TEMPLATES).includes(template)) {
72
+ logError(`Unknown template: ${template}`);
73
+ logInfo(`Available templates:`);
74
+ for (const [name, desc] of Object.entries(TEMPLATES)) {
75
+ console.log(` ${name.padEnd(20)} - ${desc}`);
76
+ }
77
+ process.exit(1);
78
+ }
79
+ logInfo(`Creating app '${name}' for tenant '${tenant}'...`);
80
+ logInfo(`Template: ${template} (${TEMPLATES[template]})`);
81
+ if (test) {
82
+ logInfo("Creating in tests/ directory");
83
+ }
84
+ // Determine output directory
85
+ const cwd = process.cwd();
86
+ let appsDir;
87
+ // Base directory depends on --test flag
88
+ const baseDir = test ? "tests/tenants" : "tenants";
89
+ // Check common locations
90
+ const possiblePaths = [
91
+ path.join(cwd, baseDir, tenant, "apps"),
92
+ path.join(cwd, "..", tenant, "apps"),
93
+ path.join(cwd, "apps"),
94
+ ];
95
+ const foundPath = possiblePaths.find((p) => fs.existsSync(p));
96
+ if (foundPath) {
97
+ appsDir = foundPath;
98
+ }
99
+ else {
100
+ // Default to {baseDir}/{tenant}/apps relative to cwd
101
+ appsDir = path.join(cwd, baseDir, tenant, "apps");
102
+ if (!fs.existsSync(path.join(cwd, baseDir, tenant))) {
103
+ logError(`Tenant directory not found: ${baseDir}/${tenant}/`);
104
+ logInfo("Create the tenant directory first, or run from within it.");
105
+ process.exit(1);
106
+ }
107
+ if (!fs.existsSync(appsDir)) {
108
+ logInfo(`Creating apps directory: ${appsDir}`);
109
+ fs.mkdirSync(appsDir, { recursive: true });
110
+ }
111
+ }
112
+ const appDir = path.join(appsDir, name);
113
+ // Check if app already exists
114
+ if (fs.existsSync(appDir)) {
115
+ logError(`App directory already exists: ${appDir}`);
116
+ logInfo("Choose a different name or remove the existing directory.");
117
+ process.exit(1);
118
+ }
119
+ // Find template directory (at package root, not in dist)
120
+ const templateDir = path.join(packageRoot, "templates", template);
121
+ if (!fs.existsSync(templateDir)) {
122
+ logError(`Template not found: ${templateDir}`);
123
+ logInfo("Make sure the mesh-cli package is installed correctly.");
124
+ process.exit(1);
125
+ }
126
+ // Create context for templates
127
+ const context = {
128
+ name,
129
+ tenant,
130
+ };
131
+ // Create app directory
132
+ logInfo(`Creating app at ${appDir}...`);
133
+ fs.mkdirSync(appDir, { recursive: true });
134
+ // Copy and process templates
135
+ try {
136
+ copyTemplate(templateDir, appDir, context);
137
+ logSuccess(`Created app structure at ${appDir}`);
138
+ }
139
+ catch (error) {
140
+ logError(`Failed to create app: ${error}`);
141
+ // Clean up on failure
142
+ fs.rmSync(appDir, { recursive: true, force: true });
143
+ process.exit(1);
144
+ }
145
+ // Check if config.ts exists in parent apps directory
146
+ const configPath = path.join(appsDir, "config.ts");
147
+ if (!fs.existsSync(configPath)) {
148
+ logWarn(`No config.ts found at ${configPath}`);
149
+ logInfo("You may need to create a shared config.ts for tenant apps.");
150
+ logInfo("See existing apps for an example.");
151
+ }
152
+ // Print next steps
153
+ console.log("");
154
+ logSuccess("App created successfully!");
155
+ console.log("");
156
+ console.log("Next steps:");
157
+ console.log(` cd ${appDir}`);
158
+ console.log(" pnpm install");
159
+ if (template === "temporal-api-worker") {
160
+ console.log("");
161
+ console.log("For development:");
162
+ console.log(" 1. Start dev server: pnpm mesh dev");
163
+ console.log(" (auto-starts tunnel to Temporal + DB)");
164
+ console.log(" 2. Start worker manually in SST dev UI");
165
+ console.log(" 3. Open Temporal Web UI: http://localhost:8080");
166
+ }
167
+ else {
168
+ console.log(" pnpm mesh dev");
169
+ }
170
+ console.log("");
171
+ console.log("To deploy:");
172
+ console.log(" pnpm deploy --stage dev");
173
+ console.log("");
174
+ });
175
+ }
176
+ //# sourceMappingURL=create-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.js","sourceRoot":"","sources":["../../../src/commands/create-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * mesh db connect - Start DB tunnel for manual psql access
3
+ *
4
+ * Usage:
5
+ * mesh db connect --tenant mesh --env dev-temporal
6
+ */
7
+ interface ConnectOptions {
8
+ tenant?: string;
9
+ env?: string;
10
+ }
11
+ export declare function connectCommand(options: ConnectOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../../src/commands/db/connect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE3E"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * mesh db connect - Start DB tunnel for manual psql access
3
+ *
4
+ * Usage:
5
+ * mesh db connect --tenant mesh --env dev-temporal
6
+ */
7
+ import { spawn } from "child_process";
8
+ import { detectContext, getPlatformBastionInfo, logInfo, logError, } from "../../utils/index.js";
9
+ export async function connectCommand(options) {
10
+ // Resolve tenant/env - explicit or auto-detect
11
+ let tenant;
12
+ let platformEnv;
13
+ if (options.tenant && options.env) {
14
+ tenant = options.tenant;
15
+ platformEnv = options.env;
16
+ logInfo(`Explicit mode: Tenant=${tenant}, Env=${platformEnv}`);
17
+ }
18
+ else if (options.tenant || options.env) {
19
+ logError("Both --tenant and --env are required");
20
+ logInfo("Usage: mesh db connect --tenant mesh --env dev-temporal");
21
+ process.exit(1);
22
+ }
23
+ else {
24
+ const ctx = detectContext();
25
+ tenant = ctx.tenant;
26
+ platformEnv = ctx.platformEnv;
27
+ logInfo(`Auto-detected: Tenant=${tenant}, Env=${platformEnv}`);
28
+ }
29
+ const bastion = await getPlatformBastionInfo(tenant, platformEnv);
30
+ const rdsService = bastion.services.rds;
31
+ if (!rdsService) {
32
+ logError("RDS service not available in platform bastion");
33
+ process.exit(1);
34
+ }
35
+ console.log("");
36
+ logInfo(`Tunnel will forward localhost:5432 → ${rdsService.host}:${rdsService.port}`);
37
+ console.log("");
38
+ logInfo("In another terminal, connect with:");
39
+ console.log(" psql -h localhost -p 5432 -U <username> -d <database>");
40
+ console.log("");
41
+ logInfo("Or use: mesh db credentials --tenant ... --env ... --app ...");
42
+ console.log("");
43
+ logInfo("Press Ctrl+C to stop the tunnel");
44
+ console.log("");
45
+ // Start SSM tunnel
46
+ const tunnel = spawn("aws", [
47
+ "ssm",
48
+ "start-session",
49
+ "--target",
50
+ bastion.instanceId,
51
+ "--document-name",
52
+ "AWS-StartPortForwardingSessionToRemoteHost",
53
+ "--parameters",
54
+ JSON.stringify({
55
+ host: [rdsService.host],
56
+ portNumber: [String(rdsService.port)],
57
+ localPortNumber: ["5432"],
58
+ }),
59
+ ], { stdio: "inherit" });
60
+ tunnel.on("error", (err) => {
61
+ console.error("Failed to start tunnel:", err.message);
62
+ process.exit(1);
63
+ });
64
+ tunnel.on("exit", (code) => {
65
+ process.exit(code ?? 0);
66
+ });
67
+ }
68
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../src/commands/db/connect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,OAAO,EACP,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAO9B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,+CAA+C;IAC/C,IAAI,MAAc,CAAC;IACnB,IAAI,WAAmB,CAAC;IAExB,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACxB,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;QAC1B,OAAO,CAAC,yBAAyB,MAAM,SAAS,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACzC,QAAQ,CAAC,sCAAsC,CAAC,CAAC;QACjD,OAAO,CAAC,yDAAyD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACpB,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QAC9B,OAAO,CAAC,yBAAyB,MAAM,SAAS,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAExC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,QAAQ,CAAC,+CAA+C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,wCAAwC,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,8DAA8D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,mBAAmB;IACnB,MAAM,MAAM,GAAG,KAAK,CAClB,KAAK,EACL;QACE,KAAK;QACL,eAAe;QACf,UAAU;QACV,OAAO,CAAC,UAAU;QAClB,iBAAiB;QACjB,4CAA4C;QAC5C,cAAc;QACd,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YACvB,UAAU,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACrC,eAAe,EAAE,CAAC,MAAM,CAAC;SAC1B,CAAC;KACH,EACD,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * mesh db credentials - Print database credentials
3
+ *
4
+ * Usage:
5
+ * mesh db credentials --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev
6
+ */
7
+ interface CredentialsOptions {
8
+ tenant?: string;
9
+ env?: string;
10
+ app?: string;
11
+ appTenant?: string;
12
+ appStage?: string;
13
+ }
14
+ export declare function credentialsCommand(options: CredentialsOptions): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../../src/commands/db/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkDf"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * mesh db credentials - Print database credentials
3
+ *
4
+ * Usage:
5
+ * mesh db credentials --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev
6
+ */
7
+ import { detectContext, getDatabaseUrl, logInfo, logError, } from "../../utils/index.js";
8
+ export async function credentialsCommand(options) {
9
+ // Resolve platform tenant/env
10
+ let platformTenant;
11
+ let platformEnv;
12
+ if (options.tenant && options.env) {
13
+ platformTenant = options.tenant;
14
+ platformEnv = options.env;
15
+ logInfo(`Platform: Tenant=${platformTenant}, Env=${platformEnv}`);
16
+ }
17
+ else if (options.tenant || options.env) {
18
+ logError("Both --tenant and --env are required");
19
+ logInfo("Usage: mesh db credentials --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev");
20
+ process.exit(1);
21
+ }
22
+ else {
23
+ const ctx = detectContext();
24
+ platformTenant = ctx.tenant;
25
+ platformEnv = ctx.platformEnv;
26
+ logInfo(`Auto-detected: Tenant=${platformTenant}, Env=${platformEnv}`);
27
+ }
28
+ // Resolve app credentials
29
+ const appTenant = options.appTenant ?? platformTenant;
30
+ const appStage = options.appStage ?? platformEnv;
31
+ const appName = options.app;
32
+ if (appName) {
33
+ logInfo(`App credentials: tenant=${appTenant}, stage=${appStage}, app=${appName}`);
34
+ }
35
+ // Get DATABASE_URL
36
+ const databaseUrl = await getDatabaseUrl(appTenant, appStage, { app: appName });
37
+ const parsed = new URL(databaseUrl);
38
+ console.log("");
39
+ console.log("Database Credentials:");
40
+ console.log(` Host: ${parsed.hostname}`);
41
+ console.log(` Port: ${parsed.port || 5432}`);
42
+ console.log(` Database: ${parsed.pathname.slice(1)}`);
43
+ console.log(` Username: ${parsed.username}`);
44
+ console.log(` Password: ${decodeURIComponent(parsed.password)}`);
45
+ console.log("");
46
+ console.log("DATABASE_URL:");
47
+ console.log(` ${databaseUrl}`);
48
+ console.log("");
49
+ console.log("For tunnel usage (localhost:5432):");
50
+ const tunnelUrl = new URL(databaseUrl);
51
+ tunnelUrl.hostname = "localhost";
52
+ tunnelUrl.port = "5432";
53
+ console.log(` ${tunnelUrl.toString()}`);
54
+ console.log("");
55
+ }
56
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../../src/commands/db/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * mesh db env - Export DATABASE_URL for shell
3
+ *
4
+ * Usage: eval $(mesh db env --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev)
5
+ */
6
+ interface EnvOptions {
7
+ tenant?: string;
8
+ env?: string;
9
+ app?: string;
10
+ appTenant?: string;
11
+ appStage?: string;
12
+ }
13
+ export declare function envCommand(options: EnvOptions): Promise<void>;
14
+ export {};
15
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/commands/db/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CnE"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * mesh db env - Export DATABASE_URL for shell
3
+ *
4
+ * Usage: eval $(mesh db env --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev)
5
+ */
6
+ import { detectContext, getDatabaseUrl, rewriteDatabaseUrl, logInfo, logError, } from "../../utils/index.js";
7
+ export async function envCommand(options) {
8
+ // Resolve platform tenant/env
9
+ let platformTenant;
10
+ let platformEnv;
11
+ if (options.tenant && options.env) {
12
+ platformTenant = options.tenant;
13
+ platformEnv = options.env;
14
+ // Use stderr for info so stdout is clean for eval
15
+ console.error(`ℹ Platform: Tenant=${platformTenant}, Env=${platformEnv}`);
16
+ }
17
+ else if (options.tenant || options.env) {
18
+ logError("Both --tenant and --env are required");
19
+ logInfo("Usage: eval $(mesh db env --tenant mesh --env dev-temporal --app rdc --app-tenant encore --app-stage dev)");
20
+ process.exit(1);
21
+ }
22
+ else {
23
+ const ctx = detectContext();
24
+ platformTenant = ctx.tenant;
25
+ platformEnv = ctx.platformEnv;
26
+ console.error(`ℹ Auto-detected: Tenant=${platformTenant}, Env=${platformEnv}`);
27
+ }
28
+ // Resolve app credentials
29
+ const appTenant = options.appTenant ?? platformTenant;
30
+ const appStage = options.appStage ?? platformEnv;
31
+ const appName = options.app;
32
+ if (appName) {
33
+ console.error(`ℹ App credentials: tenant=${appTenant}, stage=${appStage}, app=${appName}`);
34
+ }
35
+ // Get DATABASE_URL and rewrite for tunnel
36
+ const rawUrl = await getDatabaseUrl(appTenant, appStage, { app: appName });
37
+ const tunnelUrl = rewriteDatabaseUrl(rawUrl, { endpoint: "localhost:5432" });
38
+ const parsed = new URL(tunnelUrl);
39
+ // Output export statements (to stdout for eval).
40
+ // WARNING: Contains plaintext credentials. Use only with:
41
+ // eval "$(mesh db env ...)"
42
+ // Do NOT run bare — credentials will appear in terminal and shell history.
43
+ console.log(`export DATABASE_URL="${tunnelUrl}"`);
44
+ console.log('export DB_HOST="localhost"');
45
+ console.log('export DB_PORT="5432"');
46
+ console.log(`export DB_NAME="${parsed.pathname.slice(1)}"`);
47
+ console.log(`export DB_USERNAME="${parsed.username}"`);
48
+ console.log(`export DB_PASSWORD="${decodeURIComponent(parsed.password)}"`);
49
+ }
50
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/commands/db/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAU9B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAmB;IAClD,8BAA8B;IAC9B,IAAI,cAAsB,CAAC;IAC3B,IAAI,WAAmB,CAAC;IAExB,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;QAChC,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;QAC1B,kDAAkD;QAClD,OAAO,CAAC,KAAK,CAAC,sBAAsB,cAAc,SAAS,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACzC,QAAQ,CAAC,sCAAsC,CAAC,CAAC;QACjD,OAAO,CAAC,2GAA2G,CAAC,CAAC;QACrH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,2BAA2B,cAAc,SAAS,WAAW,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,0BAA0B;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAE5B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,WAAW,QAAQ,SAAS,OAAO,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAElC,iDAAiD;IACjD,0DAA0D;IAC1D,8BAA8B;IAC9B,2EAA2E;IAC3E,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,uBAAuB,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * mesh db exec - Run any command with database connection
3
+ *
4
+ * Three modes of operation:
5
+ *
6
+ * 1. Explicit mode (recommended for ad-hoc use):
7
+ * mesh db exec --tenant=<tenant> --env=<env> [--ssl=require] -- <command>
8
+ * - Uses explicit tenant/env to find platform bastion
9
+ * - Starts tunnel if needed
10
+ * - Similar to: mesh tunnel --tenant mesh --env dev
11
+ *
12
+ * 2. Direct mode (for sst dev integration):
13
+ * mesh db exec --secret=<arn> [--ssl=require] -- <command>
14
+ * - Uses secret ARN directly, expects tunnel already running
15
+ * - Ideal for sst.config.ts devCommand
16
+ *
17
+ * 3. Discovery mode (legacy, auto-detection):
18
+ * mesh db exec [--stage=<stage>] -- <command>
19
+ * - Auto-discovers tenant/env from filesystem and config files
20
+ * - Can be fragile if project structure doesn't match expected patterns
21
+ * - Starts tunnel if needed
22
+ *
23
+ * Examples:
24
+ * # Explicit mode (recommended)
25
+ * mesh db exec --tenant mesh --env dev --ssl=require -- npx prisma db push
26
+ * mesh db exec -t mesh -e dev -- npx prisma migrate dev
27
+ *
28
+ * # Direct mode (in sst.config.ts)
29
+ * mesh db exec --secret=arn:aws:secretsmanager:... --ssl=require -- pnpm dev
30
+ *
31
+ * # Discovery mode (legacy)
32
+ * mesh db exec -- npx prisma db push
33
+ * mesh db exec --stage=dev -- npx prisma migrate dev
34
+ */
35
+ export interface ExecOptions {
36
+ /** Platform tenant for bastion lookup */
37
+ tenant?: string;
38
+ /** Platform environment for bastion lookup */
39
+ env?: string;
40
+ /** App name for credentials path */
41
+ app?: string;
42
+ /** Tenant for app credentials (if different from platform tenant) */
43
+ appTenant?: string;
44
+ /** Stage for app credentials */
45
+ appStage?: string;
46
+ /** Secret ARN for direct mode */
47
+ secret?: string;
48
+ /** SSL mode */
49
+ ssl?: string;
50
+ /** Local tunnel port */
51
+ port?: string;
52
+ }
53
+ export declare function execCommand(commandArgs: string[], options: ExecOptions): Promise<void>;
54
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../../src/commands/db/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAmEH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAgGD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Mf"}