@sudajs/cli 0.2.1 → 0.3.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,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { createHash } from 'crypto';
3
3
  import fs, { mkdir, writeFile, readFile, stat, readdir } from 'fs/promises';
4
+ import { createRequire } from 'module';
4
5
  import path2 from 'path';
5
- import { pathToFileURL } from 'url';
6
+ import { fileURLToPath, pathToFileURL } from 'url';
6
7
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
8
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
- import { createAgentPageSchemaOutput, createThemeAgentManifest, validateAgentPageContentWithManifest, agentValidationResultSchema, createPageDataFromAgentContent, findAgentSection, createAgentComponentSchemaOutput, agentPageSchemaOutputSchema, agentComponentOutputSchema } from '@sudajs/theme-engine';
9
+ import { createAgentPageSchemaOutput, checkThemeModule, formatThemeCheckResult, createThemeAgentManifest, validateAgentPageContentWithManifest, agentValidationResultSchema, createPageDataFromAgentContent, findAgentSection, createAgentComponentSchemaOutput, agentPageSchemaOutputSchema, agentComponentOutputSchema } from '@sudajs/theme-engine';
9
10
  import { extractLayoutChrome, ThemeRender } from '@sudajs/theme-engine/server';
10
11
  import { Command } from 'commander';
11
12
  import { build, context } from 'esbuild';
@@ -515,6 +516,16 @@ async function buildTheme(root, skipThemeBuild) {
515
516
  await writeThemeArtifacts(validated);
516
517
  return validateTheme(root);
517
518
  }
519
+ function runThemeCheck(theme) {
520
+ const result = checkThemeModule(theme.module);
521
+ const text = formatThemeCheckResult(result);
522
+ if (result.ok) {
523
+ console.log(text);
524
+ } else {
525
+ console.error(text);
526
+ }
527
+ return result.ok;
528
+ }
518
529
  async function watchTheme(root, skipThemeBuild) {
519
530
  if (!skipThemeBuild) {
520
531
  await runThemePackageBuild(root);
@@ -1162,8 +1173,16 @@ async function checksum(files) {
1162
1173
  }
1163
1174
  return hash.digest("hex");
1164
1175
  }
1165
- async function publishTheme(root, skipBuild) {
1176
+ async function publishTheme(root, skipBuild, skipCheck) {
1166
1177
  const theme = skipBuild ? await validateTheme(root) : await buildTheme(root, false);
1178
+ if (!skipCheck) {
1179
+ const ok = runThemeCheck(theme);
1180
+ if (!ok) {
1181
+ throw new Error(
1182
+ "AI metadata check failed. Fix the errors above or rerun with --skip-check."
1183
+ );
1184
+ }
1185
+ }
1167
1186
  const files = await collectThemeArtifactFiles(theme);
1168
1187
  if (!theme.clientEntryPath) {
1169
1188
  throw new Error("Missing dist/runtime.client.js. Run `suda theme build` first.");
@@ -1240,8 +1259,54 @@ async function publishTheme(root, skipBuild) {
1240
1259
  }
1241
1260
  console.log(`published ${key}@${version}`);
1242
1261
  }
1262
+ var cachedCliPackageVersions;
1263
+ async function readCliPackageVersions() {
1264
+ if (cachedCliPackageVersions) {
1265
+ return cachedCliPackageVersions;
1266
+ }
1267
+ const here = fileURLToPath(import.meta.url);
1268
+ const cliPkgPath = path2.resolve(path2.dirname(here), "..", "package.json");
1269
+ let cliRaw;
1270
+ try {
1271
+ cliRaw = await readFile(cliPkgPath, "utf8");
1272
+ } catch {
1273
+ cachedCliPackageVersions = { themeEngine: "*", cli: "*" };
1274
+ return cachedCliPackageVersions;
1275
+ }
1276
+ const cliPkg = JSON.parse(cliRaw);
1277
+ const cliVersion = typeof cliPkg.version === "string" ? cliPkg.version : "0.0.0";
1278
+ const declaredEngine = cliPkg.dependencies?.["@sudajs/theme-engine"];
1279
+ let themeEngine;
1280
+ if (declaredEngine && !declaredEngine.startsWith("workspace:")) {
1281
+ themeEngine = declaredEngine;
1282
+ } else {
1283
+ let resolved;
1284
+ try {
1285
+ const require2 = createRequire(import.meta.url);
1286
+ const enginePkgPath = require2.resolve("@sudajs/theme-engine/package.json");
1287
+ const engineRaw = await readFile(enginePkgPath, "utf8");
1288
+ const engineVersion = JSON.parse(engineRaw).version;
1289
+ if (typeof engineVersion === "string" && engineVersion.length > 0) {
1290
+ resolved = `^${engineVersion}`;
1291
+ }
1292
+ } catch {
1293
+ }
1294
+ if (!resolved) {
1295
+ throw new Error(
1296
+ "suda theme init: cannot determine the @sudajs/theme-engine version to scaffold. The CLI's package.json declares it as `workspace:*` (monorepo dev mode) but `@sudajs/theme-engine/package.json` could not be resolved from the CLI's runtime. Run `pnpm install` and re-run from the monorepo root, or install a published @sudajs/cli tarball (which pins a real semver range)."
1297
+ );
1298
+ }
1299
+ themeEngine = resolved;
1300
+ }
1301
+ cachedCliPackageVersions = {
1302
+ themeEngine,
1303
+ cli: `^${cliVersion}`
1304
+ };
1305
+ return cachedCliPackageVersions;
1306
+ }
1243
1307
  async function initTheme(target) {
1244
1308
  const key = path2.basename(target).replace(/[^a-zA-Z0-9._-]/g, "-").toLowerCase();
1309
+ const cliPackageVersions = await readCliPackageVersions();
1245
1310
  await mkdir(path2.join(target, "src"), { recursive: true });
1246
1311
  await writeFile(
1247
1312
  path2.join(target, "package.json"),
@@ -1267,11 +1332,11 @@ async function initTheme(target) {
1267
1332
  preview: "suda theme preview --theme-root ."
1268
1333
  },
1269
1334
  dependencies: {
1270
- "@sudajs/theme-engine": "^0.1.1"
1335
+ "@sudajs/theme-engine": cliPackageVersions.themeEngine
1271
1336
  },
1272
1337
  devDependencies: {
1273
1338
  "@puckeditor/core": "^0.21.2",
1274
- "@sudajs/cli": "^0.1.0",
1339
+ "@sudajs/cli": cliPackageVersions.cli,
1275
1340
  "@types/node": "^22.0.0",
1276
1341
  "@types/react": "^19.0.0",
1277
1342
  "@types/react-dom": "^19.0.0",
@@ -1354,10 +1419,17 @@ export const sourceManifest: ThemeSourceManifest = {
1354
1419
  );
1355
1420
  await writeFile(
1356
1421
  path2.join(target, "src", "sections.tsx"),
1357
- `import type { ComponentConfig } from "@puckeditor/core";
1422
+ `import type { SudaComponentConfig } from "@sudajs/theme-engine";
1358
1423
 
1359
- export const Hero: ComponentConfig = {
1424
+ export const Hero: SudaComponentConfig = {
1360
1425
  label: "Hero",
1426
+ ai: {
1427
+ instructions:
1428
+ "Primary page introduction used to communicate the main value proposition. " +
1429
+ "Place near the beginning of landing, product, service, or campaign pages. " +
1430
+ "Include one concise headline, supporting copy, and one primary call to action. " +
1431
+ "Use at most once per page. Do not use for ordinary section headings or article content.",
1432
+ },
1361
1433
  fields: {
1362
1434
  eyebrow: { type: "text", label: "Eyebrow" },
1363
1435
  title: { type: "text", label: "Title" },
@@ -1382,8 +1454,14 @@ export const Hero: ComponentConfig = {
1382
1454
  ),
1383
1455
  };
1384
1456
 
1385
- export const FeatureGrid: ComponentConfig = {
1457
+ export const FeatureGrid: SudaComponentConfig = {
1386
1458
  label: "Feature grid",
1459
+ ai: {
1460
+ instructions:
1461
+ "Section that lists 3\u20136 short feature or benefit cards explaining what the product or service offers. " +
1462
+ "Place after the hero / introduction and before the final call-to-action. " +
1463
+ "Use when the page needs to communicate multiple distinct value points; do not use for testimonials, FAQs, or step-by-step processes.",
1464
+ },
1387
1465
  fields: {
1388
1466
  title: { type: "text", label: "Title" },
1389
1467
  description: { type: "textarea", label: "Description" },
@@ -1421,8 +1499,14 @@ export const FeatureGrid: ComponentConfig = {
1421
1499
  ),
1422
1500
  };
1423
1501
 
1424
- export const Testimonial: ComponentConfig = {
1502
+ export const Testimonial: SudaComponentConfig = {
1425
1503
  label: "Testimonial",
1504
+ ai: {
1505
+ instructions:
1506
+ "Section that quotes a single customer or expert as social proof. " +
1507
+ "Place mid-page after a feature or value section, or near the end before the final CTA. " +
1508
+ "Do not invent quotes, names, or roles; only use content the user provides.",
1509
+ },
1426
1510
  fields: {
1427
1511
  quote: { type: "textarea", label: "Quote" },
1428
1512
  author: { type: "text", label: "Author" },
@@ -1441,8 +1525,14 @@ export const Testimonial: ComponentConfig = {
1441
1525
  ),
1442
1526
  };
1443
1527
 
1444
- export const CallToAction: ComponentConfig = {
1528
+ export const CallToAction: SudaComponentConfig = {
1445
1529
  label: "Call to action",
1530
+ ai: {
1531
+ instructions:
1532
+ "Closing conversion section that invites the visitor to take a specific action (sign up, contact, buy, etc.). " +
1533
+ "Place near the end of the page, after supporting content. " +
1534
+ "Use at most once per page. Do not use as the page's first introduction \u2014 the Hero component fills that role.",
1535
+ },
1446
1536
  fields: {
1447
1537
  title: { type: "text", label: "Title" },
1448
1538
  description: { type: "textarea", label: "Description" },
@@ -1470,7 +1560,8 @@ export const SECTION_COMPONENTS = { Hero, FeatureGrid, Testimonial, CallToAction
1470
1560
  await writeFile(
1471
1561
  path2.join(target, "src", "layout.tsx"),
1472
1562
  `import { getPageSlot } from "@sudajs/theme-engine/runtime";
1473
- import type { ComponentConfig, Config } from "@puckeditor/core";
1563
+ import type { Config } from "@puckeditor/core";
1564
+ import type { SudaComponentConfig } from "@sudajs/theme-engine";
1474
1565
  import type { ReactElement, ReactNode } from "react";
1475
1566
 
1476
1567
  type PuckExtras = { puck?: { metadata?: Record<string, unknown> } };
@@ -1485,22 +1576,40 @@ export const rootConfig: NonNullable<Config["root"]> = {
1485
1576
  ),
1486
1577
  };
1487
1578
 
1488
- export const Header: ComponentConfig = {
1579
+ export const Header: SudaComponentConfig = {
1489
1580
  label: "Header",
1581
+ ai: {
1582
+ instructions:
1583
+ "Site-wide header rendered at the top of every page. " +
1584
+ "Place once at the top of the layout (not inside page content). " +
1585
+ "Used for branding and primary navigation, not for promotional content.",
1586
+ },
1490
1587
  fields: { siteName: { type: "text", label: "Site name" } },
1491
1588
  defaultProps: { siteName: "${key}" },
1492
1589
  render: ({ siteName }) => <header className="${key}-header">{siteName}</header>,
1493
1590
  };
1494
1591
 
1495
- export const PageOutlet: ComponentConfig = {
1592
+ export const PageOutlet: SudaComponentConfig = {
1496
1593
  label: "Page outlet",
1594
+ ai: {
1595
+ exclude: true,
1596
+ instructions:
1597
+ "Structural slot where each page's content is injected. " +
1598
+ "Managed by the layout, never created or placed by AI.",
1599
+ },
1497
1600
  fields: {},
1498
1601
  defaultProps: {},
1499
1602
  render: (props: PuckExtras): ReactElement => <>{getPageSlot(props.puck?.metadata)}</>,
1500
1603
  };
1501
1604
 
1502
- export const Footer: ComponentConfig = {
1605
+ export const Footer: SudaComponentConfig = {
1503
1606
  label: "Footer",
1607
+ ai: {
1608
+ instructions:
1609
+ "Site-wide footer rendered at the bottom of every page. " +
1610
+ "Place once at the end of the layout. " +
1611
+ "Used for legal text, copyright, and secondary links \u2014 not for primary CTAs.",
1612
+ },
1504
1613
  fields: { text: { type: "text", label: "Text" } },
1505
1614
  defaultProps: { text: "\xA9 ${key}" },
1506
1615
  render: ({ text }) => <footer className="${key}-footer">{text}</footer>,
@@ -1720,14 +1829,110 @@ It is a **standalone** npm package \u2014 it does not depend on the SudaCloud mo
1720
1829
  - Prefer editing section props over changing render code when generating pages.
1721
1830
  - Do not edit files under \`dist/\`; they are generated.
1722
1831
 
1832
+ ## AI metadata (required)
1833
+
1834
+ Every component (and zone-level layout component) **must** declare \`ai.instructions\`.
1835
+ Without it the page-generation agent has no way to know what the component is for,
1836
+ and \`suda theme check\` (run automatically before publish) will fail.
1837
+
1838
+ ### Component-level \`ai\`
1839
+
1840
+ Each \`ComponentConfig\` must include:
1841
+
1842
+ \`\`\`ts
1843
+ import type { SudaComponentConfig } from "@sudajs/theme-engine";
1844
+
1845
+ export const Hero: SudaComponentConfig = {
1846
+ label: "Hero",
1847
+ ai: {
1848
+ instructions:
1849
+ "Primary page introduction used to communicate the main value proposition. " +
1850
+ "Place near the beginning of landing or product pages. " +
1851
+ "Include one primary CTA. Use at most once per page. " +
1852
+ "Do not use for ordinary section headings or article content.",
1853
+ },
1854
+ fields: { /* ... */ },
1855
+ defaultProps: { /* ... */ },
1856
+ render: (props) => /* ... */,
1857
+ };
1858
+ \`\`\`
1859
+
1860
+ A good \`instructions\` covers, in plain English:
1861
+
1862
+ 1. **Purpose** \u2014 what role this component plays on a page.
1863
+ 2. **Use when** \u2014 page types or scenarios where it should be selected.
1864
+ 3. **Avoid when** \u2014 situations that look similar but call for a different component.
1865
+ 4. **Placement** \u2014 where in the page it normally belongs (top, after features, near end, etc.).
1866
+ 5. **Frequency / composition** \u2014 how many times it can appear, what it must contain, and any adjacency rules.
1867
+
1868
+ Write executable, specific sentences (\`Use when...\`, \`Place after...\`, \`Use at most once per page.\`).
1869
+ Do **not** describe styling (colors, fonts, spacing) \u2014 those belong to the design system.
1870
+ Do **not** write vague filler like "modern", "engaging", "beautiful".
1871
+
1872
+ If two components look similar (e.g. Hero vs. PageHeader vs. SectionHeader),
1873
+ their \`instructions\` must explicitly differentiate them, otherwise the agent
1874
+ will mix them up.
1875
+
1876
+ ### Hiding a component from AI
1877
+
1878
+ Use \`ai.exclude: true\` for internal/debug components or anything the agent
1879
+ should never auto-create. Such components remain editable by humans:
1880
+
1881
+ \`\`\`ts
1882
+ ai: { exclude: true, instructions: "Internal debug block; AI must not create it." }
1883
+ \`\`\`
1884
+
1885
+ ### Field-level \`ai\` (recommended, optional)
1886
+
1887
+ Field-level metadata sharpens the generated content but is **not required**.
1888
+ Use it when a field's name and type alone don't fully convey the constraints:
1889
+
1890
+ \`\`\`ts
1891
+ fields: {
1892
+ title: {
1893
+ type: "text",
1894
+ ai: {
1895
+ instructions:
1896
+ "Main value-proposition headline. 4\u201312 words, focus on the visitor benefit, " +
1897
+ "do not repeat the eyebrow or description.",
1898
+ required: true,
1899
+ },
1900
+ },
1901
+ imageUrl: {
1902
+ type: "text",
1903
+ ai: {
1904
+ // Atomic values that cannot render correctly while half-streamed.
1905
+ stream: false,
1906
+ instructions: "Image that supports the section topic. Avoid logos, screenshots, or unrelated decoration.",
1907
+ },
1908
+ },
1909
+ }
1910
+ \`\`\`
1911
+
1912
+ Supported field-level keys: \`instructions\`, \`required\`, \`exclude\`, \`stream\`,
1913
+ \`bind\` (delegate to a tool), and \`schema\` (only needed for \`custom\` / \`external\` /
1914
+ \`user\` fields whose runtime shape can't be inferred).
1915
+
1916
+ ### Verifying
1917
+
1918
+ \`\`\`bash
1919
+ pnpm build # also runs the AI metadata check
1920
+ suda theme check # run the check on its own
1921
+ \`\`\`
1922
+
1923
+ Missing component-level \`ai.instructions\` is reported as an **error** and blocks
1924
+ the build. Very short or label-repeating instructions are reported as
1925
+ **warnings**.
1926
+
1723
1927
  ## Useful commands
1724
1928
 
1725
1929
  \`\`\`bash
1726
1930
  pnpm install
1727
1931
  pnpm typecheck
1728
- pnpm build # tsc + suda theme build --skip-theme-build
1932
+ pnpm build # tsc + suda theme build --skip-theme-build (runs AI check)
1729
1933
  pnpm validate
1730
1934
  pnpm preview
1935
+ suda theme check # AI metadata check only
1731
1936
  suda agent theme describe local --theme-root .
1732
1937
  suda agent section schema --theme local --section Hero --theme-root .
1733
1938
  suda agent page validate --theme local --input ./page.json --theme-root .
@@ -1799,9 +2004,29 @@ function buildProgram() {
1799
2004
  );
1800
2005
  }
1801
2006
  });
1802
- theme.command("build").description("Build server dist (via package script) and browser runtime.").option("--theme-root <path>", "Theme source/artifact root.").option("--skip-theme-build", "Skip the theme package build script.").action(async (options) => {
2007
+ theme.command("build").description("Build server dist (via package script) and browser runtime.").option("--theme-root <path>", "Theme source/artifact root.").option("--skip-theme-build", "Skip the theme package build script.").option(
2008
+ "--skip-check",
2009
+ "Skip the AI metadata check that normally runs after build."
2010
+ ).action(async (options) => {
1803
2011
  const result = await buildTheme(resolveThemeRoot(options), options.skipThemeBuild === true);
1804
2012
  console.log(`built ${result.module.manifest.key}@${result.module.manifest.version}`);
2013
+ if (options.skipCheck !== true) {
2014
+ const ok = runThemeCheck(result);
2015
+ if (!ok) {
2016
+ throw new Error(
2017
+ "AI metadata check failed. Fix the errors above or rerun with --skip-check."
2018
+ );
2019
+ }
2020
+ }
2021
+ });
2022
+ theme.command("check").description(
2023
+ "Run AI metadata checks on a built theme without rebuilding. Reports missing component-level ai.instructions as errors and weak content as warnings."
2024
+ ).option("--theme-root <path>", "Theme source/artifact root.").action(async (options) => {
2025
+ const theme2 = await validateTheme(resolveThemeRoot(options));
2026
+ const ok = runThemeCheck(theme2);
2027
+ if (!ok) {
2028
+ process.exitCode = 1;
2029
+ }
1805
2030
  });
1806
2031
  theme.command("dev").description("Watch and rebuild the browser runtime.").option("--theme-root <path>", "Theme source/artifact root.").option("--skip-theme-build", "Skip the theme package build script.").action(async (options) => {
1807
2032
  await watchTheme(resolveThemeRoot(options), options.skipThemeBuild === true);
@@ -1815,8 +2040,15 @@ function buildProgram() {
1815
2040
  ).option("--theme-root <path>", "Theme source/artifact root.").option("--output <path>", "Output PNG path relative to theme root.").option("--width <px>", "Viewport width in pixels.", "1280").option("--height <px>", "Viewport height in pixels.", "800").option("--port <port>", "Preview server port used during capture.", "4178").option("--skip-build", "Skip rebuilding the theme before capturing.").action(async (options) => {
1816
2041
  await screenshotTheme(resolveThemeRoot(options), options);
1817
2042
  });
1818
- theme.command("publish").description("Upload artifact to S3 and upsert ThemePackage/ThemeVersion.").option("--theme-root <path>", "Theme source/artifact root.").option("--skip-build", "Publish existing dist files without rebuilding.").action(async (options) => {
1819
- await publishTheme(resolveThemeRoot(options), options.skipBuild === true);
2043
+ theme.command("publish").description("Upload artifact to S3 and upsert ThemePackage/ThemeVersion.").option("--theme-root <path>", "Theme source/artifact root.").option("--skip-build", "Publish existing dist files without rebuilding.").option(
2044
+ "--skip-check",
2045
+ "Skip the AI metadata check that normally runs before upload."
2046
+ ).action(async (options) => {
2047
+ await publishTheme(
2048
+ resolveThemeRoot(options),
2049
+ options.skipBuild === true,
2050
+ options.skipCheck === true
2051
+ );
1820
2052
  });
1821
2053
  const agent = program.command("agent").description("Agent-friendly theme and page tooling.");
1822
2054
  const agentProject = agent.command("project").description("Manage Suda projects from the CLI.");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth.ts","../src/index.ts"],"names":["path","esbuild","context","esbuildContext"],"mappings":"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","file":"index.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ninterface AuthConfig {\n sessionToken: string;\n host: string;\n}\n\nfunction getConfigPath() {\n return path.join(os.homedir(), \".config\", \"suda\", \"config.json\");\n}\n\nexport async function readAuthConfig(): Promise<AuthConfig | null> {\n try {\n const configPath = getConfigPath();\n const content = await fs.readFile(configPath, \"utf-8\");\n return JSON.parse(content) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function writeAuthConfig(config: AuthConfig): Promise<void> {\n const configPath = getConfigPath();\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.chmod(path.dirname(configPath), 0o700).catch(() => undefined);\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n const configPath = getConfigPath();\n try {\n await fs.unlink(configPath);\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as { code: string }).code !== \"ENOENT\") {\n throw err;\n }\n }\n}\n\nexport async function login(host: string = \"app.sudayun.cn\") {\n const protocol = host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n const baseUrl = `${protocol}://${host}`;\n\n console.log(`Requesting device authorization from ${baseUrl}...`);\n\n const deviceRes = await fetch(`${baseUrl}/api/cli-auth/device`, {\n method: \"POST\",\n });\n\n if (!deviceRes.ok) {\n throw new Error(`Failed to initialize auth: ${deviceRes.statusText}`);\n }\n\n const { deviceCode, userCode, verificationUri, interval, expiresIn } = (await deviceRes.json()) as {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n };\n\n const authUrl = `${verificationUri}?code=${userCode}`;\n console.log(`\\nPlease open the following URL in your browser to authorize Suda CLI:\\n`);\n console.log(` ${authUrl}\\n`);\n console.log(`Your confirmation code is: ${userCode}\\n`);\n // Try to open browser\n try {\n const open = (await import(\"open\")).default;\n await open(authUrl);\n } catch {\n // ignore\n }\n\n const pollInterval = (interval || 5) * 1000;\n const timeoutSeconds = expiresIn || 300;\n const deadline = Date.now() + timeoutSeconds * 1000;\n\n console.log(\"Waiting for authorization...\");\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n\n const pollRes = await fetch(`${baseUrl}/api/cli-auth/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ deviceCode }),\n });\n\n const data = (await pollRes.json()) as { status?: string; token?: string; error?: string };\n\n if (pollRes.ok && data.status === \"approved\" && data.token) {\n await writeAuthConfig({ sessionToken: data.token, host });\n console.log(\"Successfully authorized!\");\n return;\n }\n\n if (data.error === \"authorization_pending\") {\n continue;\n }\n\n throw new Error(`Authorization failed: ${data.error || \"Unknown error\"}`);\n }\n\n throw new Error(\"Authorization timed out.\");\n}\n\nexport async function status() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in. Run `suda auth login` to authenticate.\");\n return;\n }\n\n const protocol = config.host.includes(\"localhost\") || config.host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n\n let res: Response;\n try {\n res = await fetch(`${protocol}://${config.host}/api/auth/get-session`, {\n headers: {\n Authorization: `Bearer ${config.sessionToken}`,\n },\n });\n } catch {\n console.error(`Failed to connect to ${config.host}.`);\n return;\n }\n\n if (!res.ok) {\n console.log(\"Session expired or invalid. Please run `suda auth login` again.\");\n await clearAuthConfig();\n return;\n }\n\n // better-auth's `/api/auth/get-session` returns HTTP 200 with body `null`\n // when the bearer token is unrecognized. Treat that as an invalid session\n // instead of crashing on `session.user`.\n const session = (await res.json()) as { user?: { email?: string; name?: string } } | null;\n if (!session?.user) {\n console.log(\"Session expired or invalid. Please run `suda auth login` again.\");\n await clearAuthConfig();\n return;\n }\n\n console.log(`Logged in as ${session.user.email || session.user.name} on ${config.host}`);\n}\n\nexport async function logout() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in.\");\n return;\n }\n \n await clearAuthConfig();\n console.log(\"Logged out successfully.\");\n}\n","#!/usr/bin/env node\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport type {\n AgentComponentOutput,\n ThemeAgentManifest,\n ThemeModule,\n ThemeStarterPage,\n} from \"@sudajs/theme-engine\";\nimport {\n agentComponentOutputSchema,\n agentPageSchemaOutputSchema,\n agentValidationResultSchema,\n createAgentComponentSchemaOutput,\n createAgentPageSchemaOutput,\n createPageDataFromAgentContent,\n createThemeAgentManifest,\n findAgentSection,\n validateAgentPageContentWithManifest,\n} from \"@sudajs/theme-engine\";\nimport { ThemeRender, extractLayoutChrome } from \"@sudajs/theme-engine/server\";\nimport { Command } from \"commander\";\nimport { build as esbuild, context as esbuildContext, type Plugin } from \"esbuild\";\nimport { createElement } from \"react\";\nimport { renderToStaticMarkup } from \"react-dom/server\";\nimport { z } from \"zod\";\n\ninterface ValidatedTheme {\n root: string;\n module: ThemeModule;\n serverEntryPath: string;\n clientEntryPath: string | null;\n stylesheetPath: string | null;\n}\n\ninterface UploadFile {\n absolutePath: string;\n relativePath: string;\n contentType: string;\n}\n\ninterface ThemeRootOptions {\n themeRoot?: string | undefined;\n}\n\ninterface BuildOptions extends ThemeRootOptions {\n skipThemeBuild?: boolean;\n}\n\ninterface PublishOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n bucket?: string;\n}\n\ninterface PreviewOptions extends ThemeRootOptions {\n port?: string;\n}\n\ninterface AgentThemeOptions extends ThemeRootOptions {\n projectId?: string | undefined;\n version?: string | undefined;\n example?: boolean | undefined;\n}\n\ninterface AgentPageCreateOptions extends AgentThemeOptions {\n title: string;\n slug: string;\n theme: string;\n input: string;\n}\n\ninterface AgentProjectCreateOptions {\n name: string;\n siteDescription: string;\n}\n\ninterface AgentProjectSummary {\n projectId: string;\n name: string;\n defaultDomain: string | null;\n role: string;\n isOwner: boolean;\n activeThemeKey: string | null;\n activeThemeVersion: string | null;\n}\n\ninterface AgentProjectCreated {\n success: true;\n projectId: string;\n name: string;\n defaultDomain: string | null;\n dashboardUrl: string;\n}\n\ninterface ThemeCatalogItem {\n key: string;\n name: string;\n version: string;\n description?: string | null | undefined;\n categories?: string[] | undefined;\n preview?: string | undefined;\n active?: boolean | undefined;\n}\n\nconst createPageDraftOutputSchema = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"created\").describe(\"The page draft was created.\"),\n pageId: z.string().describe(\"New page id.\"),\n }),\n z.object({\n status: z.literal(\"invalid\").describe(\"The page content failed validation.\"),\n valid: z.literal(false),\n issues: z.array(\n z.object({\n path: z.string(),\n message: z.string(),\n }),\n ),\n }),\n]);\n\n// Mirrors apps/workspace/app/onboarding/constants.ts so external AI tools see\n// the same input bounds as the in-app onboarding form.\nconst PROJECT_NAME_MIN_LENGTH = 1;\nconst PROJECT_NAME_MAX_LENGTH = 80;\nconst PROJECT_DESCRIPTION_MIN_LENGTH = 1;\nconst PROJECT_DESCRIPTION_MAX_LENGTH = 300;\n\n// Single source of truth for the create_project input shape, reused by both\n// the MCP `create_project` tool and the `suda agent project create` command\n// so the two entry points cannot drift on bounds or trim semantics.\nconst createProjectInputSchema = z.object({\n name: z\n .string()\n .trim()\n .min(PROJECT_NAME_MIN_LENGTH)\n .max(PROJECT_NAME_MAX_LENGTH),\n siteDescription: z\n .string()\n .trim()\n .min(PROJECT_DESCRIPTION_MIN_LENGTH)\n .max(PROJECT_DESCRIPTION_MAX_LENGTH),\n});\n\nconst projectSummarySchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n role: z.string(),\n isOwner: z.boolean(),\n activeThemeKey: z.string().nullable(),\n activeThemeVersion: z.string().nullable(),\n});\n\nconst listProjectsOutputSchema = z.object({\n projects: z.array(projectSummarySchema),\n});\n\nconst createProjectOutputSchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n dashboardUrl: z.string(),\n});\n\nfunction createHostReactShimPlugin(): Plugin {\n return {\n name: \"suda-host-react-shim\",\n setup(build) {\n build.onResolve({ filter: /^react$/ }, () => ({\n path: \"react-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react\\/jsx-runtime$/ }, () => ({\n path: \"react-jsx-runtime-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom$/ }, () => ({\n path: \"react-dom-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom\\/client$/ }, () => ({\n path: \"react-dom-client-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onLoad({ filter: /^react-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst React = globalThis.__SUDA_REACT__;\nif (!React) {\n throw new Error(\"Missing host React runtime (__SUDA_REACT__).\");\n}\nexport default React;\nexport const {\n Children,\n Component,\n Fragment,\n Profiler,\n PureComponent,\n StrictMode,\n Suspense,\n cloneElement,\n createContext,\n createElement,\n createRef,\n forwardRef,\n isValidElement,\n lazy,\n memo,\n startTransition,\n use,\n useActionState,\n useCallback,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useImperativeHandle,\n useInsertionEffect,\n useLayoutEffect,\n useMemo,\n useOptimistic,\n useReducer,\n useRef,\n useState,\n useSyncExternalStore,\n useTransition,\n version,\n} = React;\n`,\n }));\n build.onLoad(\n {\n filter: /^react-jsx-runtime-host-shim$/,\n namespace: \"suda-shim\",\n },\n () => ({\n loader: \"js\",\n contents: `\nconst runtime = globalThis.__SUDA_REACT_JSX_RUNTIME__;\nif (!runtime) {\n throw new Error(\"Missing host React JSX runtime (__SUDA_REACT_JSX_RUNTIME__).\");\n}\nexport const { Fragment, jsx, jsxs, jsxDEV } = runtime;\n`,\n }),\n );\n build.onLoad({ filter: /^react-dom-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOM = globalThis.__SUDA_REACT_DOM__;\nif (!ReactDOM) {\n throw new Error(\"Missing host React DOM runtime (__SUDA_REACT_DOM__).\");\n}\nexport default ReactDOM;\nexport const {\n createPortal,\n flushSync,\n preconnect,\n prefetchDNS,\n preinit,\n preinitModule,\n preload,\n preloadModule,\n requestFormReset,\n unstable_batchedUpdates,\n useFormState,\n useFormStatus,\n version,\n} = ReactDOM;\n`,\n }));\n build.onLoad({ filter: /^react-dom-client-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOMClient = globalThis.__SUDA_REACT_DOM_CLIENT__;\nif (!ReactDOMClient) {\n throw new Error(\"Missing host React DOM client runtime (__SUDA_REACT_DOM_CLIENT__).\");\n}\nexport default ReactDOMClient;\nexport const { createRoot, hydrateRoot, version } = ReactDOMClient;\n`,\n }));\n },\n };\n}\n\nfunction safeObjectKeyPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n}\n\nfunction createThemePrefix(themeKey: string, version: string): string {\n return `themes/${safeObjectKeyPart(themeKey)}/${safeObjectKeyPart(version)}`;\n}\n\nfunction createThemeObjectKey(themeKey: string, version: string, relativePath: string): string {\n const safeRelativePath = relativePath\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .map(safeObjectKeyPart)\n .filter(Boolean)\n .join(\"/\");\n\n return `${createThemePrefix(themeKey, version)}/${safeRelativePath}`;\n}\n\nimport { login, status, logout, readAuthConfig } from \"./auth\";\n\nfunction resolveThemeRoot(options: ThemeRootOptions): string {\n return path.resolve(options.themeRoot ?? process.cwd());\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJson<T>(filePath: string): Promise<T> {\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nasync function readJsonIfExists<T>(filePath: string): Promise<T | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n return readJson<T>(filePath);\n}\n\nfunction protocolForHost(host: string): \"http\" | \"https\" {\n return host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n}\n\nasync function requireCliBaseUrl(): Promise<{ baseUrl: string; token: string }> {\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n return {\n baseUrl: `${protocolForHost(config.host)}://${config.host}`,\n token: config.sessionToken,\n };\n}\n\nasync function fetchJson<T>(\n url: string,\n options: RequestInit & { token?: string } = {},\n): Promise<T> {\n const headers = new Headers(options.headers);\n if (options.token) {\n headers.set(\"Authorization\", `Bearer ${options.token}`);\n }\n const response = await fetch(url, { ...options, headers });\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { error?: string; message?: string };\n throw new Error(errorData.message || errorData.error || response.statusText);\n }\n return (await response.json()) as T;\n}\n\nfunction agentCacheDir(): string {\n return path.join(process.env.XDG_CACHE_HOME ?? path.join(process.env.HOME ?? \".\", \".cache\"), \"suda\", \"agent\");\n}\n\nfunction cachedThemeManifestPath(themeKey: string, version: string): string {\n return path.join(agentCacheDir(), \"themes\", safeObjectKeyPart(themeKey), safeObjectKeyPart(version), \"agent-manifest.json\");\n}\n\nasync function loadThemeModule(serverEntryPath: string): Promise<ThemeModule> {\n const imported = (await import(`${pathToFileURL(serverEntryPath).href}?t=${Date.now()}`)) as {\n default?: ThemeModule;\n };\n\n if (!imported.default) {\n throw new Error(`${serverEntryPath} must export a default ThemeModule.`);\n }\n\n return imported.default;\n}\n\nfunction assertRecord(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${label} must be an object.`);\n }\n}\n\nfunction validateThemeModule(module: ThemeModule): void {\n assertRecord(module.manifest, \"manifest\");\n if (!module.manifest.key || !module.manifest.version || !module.manifest.name) {\n throw new Error(\"manifest.key, manifest.version and manifest.name are required.\");\n }\n if (module.manifest.entry !== \"dist/index.js\") {\n throw new Error('manifest.entry must be artifact-local: \"dist/index.js\".');\n }\n if (\n module.manifest.clientEntry !== undefined &&\n module.manifest.clientEntry !== \"dist/runtime.client.js\"\n ) {\n throw new Error(\n 'manifest.clientEntry must be artifact-local: \"dist/runtime.client.js\" when provided.',\n );\n }\n assertRecord(module.pageConfig?.components, \"pageConfig.components\");\n assertRecord(module.layoutConfig, \"layoutConfig\");\n assertRecord(module.defaultLayout, \"defaultLayout\");\n if (!Array.isArray(module.starterPages)) {\n throw new Error(\"starterPages must be an array.\");\n }\n}\n\nasync function validateTheme(root: string): Promise<ValidatedTheme> {\n const packageJsonPath = path.join(root, \"package.json\");\n const serverEntryPath = path.join(root, \"dist\", \"index.js\");\n const clientEntryPath = path.join(root, \"dist\", \"runtime.client.js\");\n const stylesheetPath = path.join(root, \"styles.css\");\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error(`Missing package.json in ${root}`);\n }\n if (!(await pathExists(serverEntryPath))) {\n throw new Error(`Missing ${serverEntryPath}. Run the theme package build first.`);\n }\n\n const module = await loadThemeModule(serverEntryPath);\n validateThemeModule(module);\n\n const result: ValidatedTheme = {\n root,\n module,\n serverEntryPath,\n clientEntryPath: null,\n stylesheetPath: null,\n };\n if (await pathExists(clientEntryPath)) {\n result.clientEntryPath = clientEntryPath;\n }\n if (await pathExists(stylesheetPath)) {\n result.stylesheetPath = stylesheetPath;\n }\n return result;\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const { spawn } = await import(\"node:child_process\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`${command} ${args.join(\" \")} exited with ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n\nasync function runThemePackageBuild(root: string): Promise<void> {\n const packageJson = await readJson<{ scripts?: Record<string, string> }>(\n path.join(root, \"package.json\"),\n );\n const buildScript = packageJson.scripts?.build;\n if (!buildScript || buildScript.includes(\"suda theme\") || buildScript.includes(\"suda-theme\")) {\n return;\n }\n await runCommand(\"pnpm\", [\"--dir\", root, \"run\", \"build\"], process.cwd());\n}\n\nasync function findClientEntry(root: string): Promise<string> {\n const candidates = [\n path.join(root, \"src\", \"runtime.client.tsx\"),\n path.join(root, \"src\", \"runtime.client.ts\"),\n ];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing runtime entry. Add src/runtime.client.ts(x) in ${root}.`);\n}\n\nasync function findServerEntry(root: string): Promise<string> {\n const candidates = [path.join(root, \"src\", \"index.tsx\"), path.join(root, \"src\", \"index.ts\")];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing server entry. Add src/index.ts(x) in ${root}.`);\n}\n\nasync function buildServerBundle(root: string): Promise<void> {\n const entryPoint = await findServerEntry(root);\n\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n external: [\n \"react\",\n \"react/jsx-runtime\",\n \"react-dom\",\n \"react-dom/*\",\n \"@puckeditor/core\",\n \"@puckeditor/core/*\",\n \"@sudajs/theme-engine\",\n \"@sudajs/theme-engine/*\",\n ],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"index.js\"),\n platform: \"node\",\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n}\n\nasync function buildTheme(root: string, skipThemeBuild: boolean): Promise<ValidatedTheme> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n\n const entryPoint = await findClientEntry(root);\n if (!(await pathExists(entryPoint))) {\n throw new Error(`Missing client entry: ${entryPoint}`);\n }\n\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: true,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin],\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n\n const validated = await validateTheme(root);\n await writeThemeArtifacts(validated);\n return validateTheme(root);\n}\n\nasync function watchTheme(root: string, skipThemeBuild: boolean): Promise<void> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n\n const entryPoint = await findClientEntry(root);\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n const watchLogPlugin = createWatchLogPlugin(\"runtime.client.js\");\n\n const context = await esbuildContext({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin, watchLogPlugin],\n sourcemap: true,\n target: \"es2022\",\n treeShaking: true,\n });\n await context.watch();\n console.log(\"watching theme runtime; press Ctrl+C to stop\");\n await new Promise(() => undefined);\n}\n\n/**\n * Logs a single line whenever esbuild finishes a (re)build in watch mode.\n * Without this, `suda theme dev` runs silently after the initial bundle and\n * developers can only confirm rebuilds by checking dist/ mtimes.\n */\nfunction createWatchLogPlugin(label: string): Plugin {\n return {\n name: \"suda-theme-watch-log\",\n setup(build) {\n let firstBuild = true;\n build.onEnd((result) => {\n if (firstBuild) {\n firstBuild = false;\n return;\n }\n const errorCount = result.errors.length;\n if (errorCount > 0) {\n console.log(`rebuild failed (${errorCount} error${errorCount === 1 ? \"\" : \"s\"}): ${label}`);\n return;\n }\n const stamp = new Date().toLocaleTimeString();\n console.log(`[${stamp}] rebuilt ${label}`);\n });\n },\n };\n}\n\ninterface PreviewServerHandle {\n url: string;\n port: number;\n close: () => Promise<void>;\n}\n\nfunction pickStarterPage(theme: ValidatedTheme): ThemeStarterPage | null {\n const pages = theme.module.starterPages;\n if (pages.length === 0) {\n return null;\n }\n return pages.find((page) => page.isHome) ?? pages[0] ?? null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction renderStarterPageHtml(theme: ValidatedTheme, page: ThemeStarterPage): string {\n const chrome = extractLayoutChrome(theme.module.defaultLayout);\n const body = renderToStaticMarkup(\n createElement(ThemeRender, {\n theme: theme.module,\n pageData: page.data,\n layoutData: theme.module.defaultLayout,\n }),\n );\n const cssVarStyle = Object.entries(chrome.cssVariables)\n .map(([key, value]) => `${key}: ${value};`)\n .join(\" \");\n const stylesheetTag = theme.stylesheetPath\n ? '<link rel=\"stylesheet\" href=\"/styles.css\" />'\n : \"\";\n const customHead = chrome.customHeadCode ?? \"\";\n const customBody = chrome.customBodyCode ?? \"\";\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n `<title>${escapeHtml(`${theme.module.manifest.name} — ${page.title}`)}</title>`,\n stylesheetTag,\n customHead,\n \"</head>\",\n `<body${cssVarStyle ? ` style=\"${cssVarStyle}\"` : \"\"}>`,\n body,\n customBody,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\nasync function startPreviewServer(\n theme: ValidatedTheme,\n port: number,\n): Promise<PreviewServerHandle> {\n const { createServer } = await import(\"node:http\");\n const starterPage = pickStarterPage(theme);\n const server = createServer((request, response) => {\n void (async () => {\n const url = new URL(request.url ?? \"/\", `http://localhost:${port}`);\n const pathname = url.pathname;\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n if (!starterPage) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"No starter page available for preview.\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(renderStarterPageHtml(theme, starterPage));\n return;\n }\n\n if (pathname === \"/styles.css\" && theme.stylesheetPath) {\n response.writeHead(200, { \"Content-Type\": \"text/css; charset=utf-8\" });\n response.end(await readFile(theme.stylesheetPath));\n return;\n }\n\n const relativePath = pathname.replace(/^\\/+/, \"\");\n const filePath = path.resolve(theme.root, relativePath);\n const normalizedRoot = path.resolve(theme.root) + path.sep;\n if (!filePath.startsWith(normalizedRoot) || !(await pathExists(filePath))) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": contentTypeFor(relativePath) });\n response.end(await readFile(filePath));\n })().catch((error) => {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(error instanceof Error ? error.message : \"Internal error\");\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error): void => {\n reject(err);\n };\n server.once(\"error\", onError);\n server.listen(port, () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n\n return {\n url: `http://localhost:${port}`,\n port,\n close: () =>\n new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n }),\n };\n}\n\nasync function previewTheme(root: string, port: number): Promise<void> {\n const theme = await buildTheme(root, false);\n const handle = await startPreviewServer(theme, port);\n console.log(\n `previewing ${theme.module.manifest.key}@${theme.module.manifest.version} at ${handle.url}`,\n );\n await new Promise(() => undefined);\n}\n\ninterface ScreenshotOptions extends ThemeRootOptions {\n output?: string;\n width?: string;\n height?: string;\n port?: string;\n skipBuild?: boolean;\n}\n\ninterface ResolvedScreenshotOptions {\n outputPath: string;\n viewport: { width: number; height: number };\n port: number;\n skipBuild: boolean;\n}\n\nconst DEFAULT_SCREENSHOT_RELATIVE = path.join(\"dist\", \"preview\", \"desktop.png\");\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (!value) {\n return fallback;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction resolveScreenshotOptions(\n root: string,\n options: ScreenshotOptions,\n): ResolvedScreenshotOptions {\n return {\n outputPath: path.resolve(root, options.output ?? DEFAULT_SCREENSHOT_RELATIVE),\n viewport: {\n width: parsePositiveInt(options.width, 1280),\n height: parsePositiveInt(options.height, 800),\n },\n port: parsePositiveInt(options.port, 4178),\n skipBuild: options.skipBuild === true,\n };\n}\n\ninterface PlaywrightModule {\n chromium: {\n launch: (options?: { headless?: boolean }) => Promise<{\n newContext: (options: {\n viewport: { width: number; height: number };\n deviceScaleFactor?: number;\n }) => Promise<{\n newPage: () => Promise<{\n goto: (url: string, options?: { waitUntil?: string }) => Promise<unknown>;\n screenshot: (options: { path: string; fullPage?: boolean }) => Promise<unknown>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n };\n}\n\nasync function loadPlaywright(): Promise<PlaywrightModule> {\n // Resolve module ids via runtime expressions so the optional dependency is not\n // required at type-check time. Either `playwright` or `@playwright/test` works.\n const candidates = [\"playwright\", \"@playwright/test\"];\n for (const id of candidates) {\n try {\n const mod: unknown = await import(/* @vite-ignore */ id);\n return mod as PlaywrightModule;\n } catch {\n // try next candidate\n }\n }\n throw new Error(\n \"Playwright is required for screenshot capture. Install it as a dev dependency: `pnpm add -D playwright && pnpm exec playwright install chromium`.\",\n );\n}\n\nasync function captureScreenshot(\n theme: ValidatedTheme,\n options: ResolvedScreenshotOptions,\n): Promise<void> {\n const playwright = await loadPlaywright();\n const handle = await startPreviewServer(theme, options.port);\n try {\n await mkdir(path.dirname(options.outputPath), { recursive: true });\n const browser = await playwright.chromium.launch({ headless: true });\n try {\n const context = await browser.newContext({\n viewport: options.viewport,\n deviceScaleFactor: 1,\n });\n const page = await context.newPage();\n await page.goto(handle.url, { waitUntil: \"networkidle\" });\n await page.screenshot({ path: options.outputPath, fullPage: false });\n await context.close();\n } finally {\n await browser.close();\n }\n } finally {\n await handle.close();\n }\n console.log(`captured ${path.relative(theme.root, options.outputPath)}`);\n}\n\nasync function screenshotTheme(root: string, options: ScreenshotOptions): Promise<void> {\n const resolved = resolveScreenshotOptions(root, options);\n const theme = resolved.skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n await captureScreenshot(theme, resolved);\n}\n\nasync function loadLocalAgentManifest(root: string): Promise<ThemeAgentManifest> {\n const built = await readJsonIfExists<ThemeAgentManifest>(path.join(root, \"dist\", \"agent-manifest.json\"));\n if (built) {\n return built;\n }\n throw new Error(\n `No agent manifest found at ${path.join(root, \"dist\", \"agent-manifest.json\")}. Run \"suda theme build\" first.`,\n );\n}\n\nasync function listAgentThemes(options: AgentThemeOptions): Promise<ThemeCatalogItem[]> {\n if (options.themeRoot) {\n const manifest = await loadLocalAgentManifest(resolveThemeRoot(options));\n return [\n {\n key: manifest.manifest.key,\n name: manifest.manifest.name,\n version: manifest.manifest.version,\n description: manifest.manifest.description ?? null,\n categories: manifest.manifest.categories,\n preview: manifest.manifest.preview,\n },\n ];\n }\n\n const auth = await requireCliBaseUrl();\n const url = new URL(\"/api/cli/agent/themes\", auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const catalog = await fetchJson<{ themes: ThemeCatalogItem[] }>(url.href, { token: auth.token });\n await mkdir(agentCacheDir(), { recursive: true });\n await writeFile(path.join(agentCacheDir(), \"catalog.json\"), `${JSON.stringify(catalog, null, 2)}\\n`);\n return catalog.themes;\n}\n\nasync function fetchAgentManifest(\n themeKey: string,\n options: AgentThemeOptions,\n): Promise<ThemeAgentManifest> {\n if (options.themeRoot) {\n return loadLocalAgentManifest(resolveThemeRoot(options));\n }\n\n const auth = await requireCliBaseUrl();\n const version = options.version ?? \"latest\";\n const cachePath = cachedThemeManifestPath(themeKey, version);\n const cached = version === \"latest\" ? null : await readJsonIfExists<ThemeAgentManifest>(cachePath);\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/cli/agent/themes/${encodeURIComponent(themeKey)}/${encodeURIComponent(version)}/schema`, auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const result = await fetchJson<{ agentManifest: ThemeAgentManifest }>(url.href, { token: auth.token });\n const realVersion = result.agentManifest.manifest.version;\n const realCachePath = cachedThemeManifestPath(themeKey, realVersion);\n await mkdir(path.dirname(realCachePath), { recursive: true });\n await writeFile(realCachePath, `${JSON.stringify(result.agentManifest, null, 2)}\\n`);\n return result.agentManifest;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction createSectionSchema(manifest: ThemeAgentManifest, sectionType: string): AgentComponentOutput {\n const section = findAgentSection(manifest, sectionType);\n if (!section) {\n throw new Error(`Unknown section type \"${sectionType}\".`);\n }\n return createAgentComponentSchemaOutput(section, \"section\");\n}\n\nasync function validateAgentPage(themeKey: string, input: string, options: AgentThemeOptions): Promise<void> {\n const manifest = await fetchAgentManifest(themeKey, options);\n const pageContent = await readJson<unknown>(path.resolve(input));\n const result = validateAgentPageContentWithManifest(pageContent, manifest);\n printJson(agentValidationResultSchema.parse(result));\n if (!result.valid) {\n process.exitCode = 1;\n }\n}\n\nasync function createAgentPage(options: AgentPageCreateOptions): Promise<void> {\n if (!options.projectId) {\n throw new Error(\"--project-id is required.\");\n }\n const pageContent = await readJson<unknown>(path.resolve(options.input));\n const manifest = await fetchAgentManifest(options.theme, options);\n const validation = validateAgentPageContentWithManifest(pageContent, manifest);\n if (!validation.valid) {\n printJson(agentValidationResultSchema.parse(validation));\n process.exitCode = 1;\n return;\n }\n const pageData = createPageDataFromAgentContent(pageContent);\n\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(options.projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: options.title,\n slug: options.slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: pageData,\n }),\n },\n );\n printJson({ success: true, ...response });\n}\n\nasync function listAgentProjects(): Promise<AgentProjectSummary[]> {\n const auth = await requireCliBaseUrl();\n const result = await fetchJson<{ projects: AgentProjectSummary[] }>(\n `${auth.baseUrl}/api/cli/agent/projects`,\n { token: auth.token },\n );\n return result.projects;\n}\n\nasync function createAgentProject(\n options: AgentProjectCreateOptions,\n): Promise<AgentProjectCreated> {\n const auth = await requireCliBaseUrl();\n return fetchJson<AgentProjectCreated>(`${auth.baseUrl}/api/cli/agent/projects`, {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name: options.name,\n siteDescription: options.siteDescription,\n }),\n });\n}\n\nfunction mcpStructured<T extends Record<string, unknown>>(summary: string, value: T) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: summary,\n },\n ],\n structuredContent: value,\n };\n}\n\nasync function startMcpServer(): Promise<void> {\n const server = new McpServer({\n name: \"suda\",\n version: \"0.1.0\",\n });\n\n server.registerTool(\n \"list_projects\",\n {\n description:\n \"List Suda projects the current CLI user can access. ALWAYS call this first when the user asks to generate or edit a website. Flow: (1) If `projects` is empty, do NOT call this tool again; instead skip directly to gathering inputs and calling create_project (see its description). (2) If `projects` has one or more entries, you MUST ask the user which project to use before any further action — even if there is only a single project, present it and ask the user to confirm or pick a different one. Never auto-pick a project on the user's behalf.\",\n inputSchema: {},\n outputSchema: listProjectsOutputSchema.shape,\n },\n async () => {\n const structuredContent = listProjectsOutputSchema.parse({\n projects: await listAgentProjects(),\n });\n return mcpStructured(\"Suda projects accessible to the current user.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_project\",\n {\n description:\n \"Create a new Suda project for the current user. Only call this after list_projects returned an empty list. Conversation flow before calling: (1) Ask the user for the website / brand name in one turn and capture it as `name`. (2) Ask the user for a business introduction; the user is allowed (and expected) to answer over multiple turns — keep asking follow-up questions and accumulating their answers until they confirm they are done, then concatenate the accumulated text into a single `siteDescription` (trimmed). Do not invent details the user did not provide. Do not call this tool until both fields are confirmed by the user. The project is created with the default theme and starter pages; no in-app AI site generation is triggered — drive page content afterwards via create_page_draft using the returned projectId.\",\n inputSchema: {\n name: createProjectInputSchema.shape.name.describe(\n \"Website or brand name confirmed by the user in a dedicated turn. Used as the project name and site title.\",\n ),\n siteDescription: createProjectInputSchema.shape.siteDescription.describe(\n \"Business introduction the user provided, possibly across multiple turns, then concatenated and trimmed. Captures what the site is about and who it serves. Used to seed default site metadata.\",\n ),\n },\n outputSchema: createProjectOutputSchema.shape,\n },\n async ({ name, siteDescription }) => {\n const result = await createAgentProject({ name, siteDescription });\n const structuredContent = createProjectOutputSchema.parse({\n projectId: result.projectId,\n name: result.name,\n defaultDomain: result.defaultDomain,\n dashboardUrl: result.dashboardUrl,\n });\n return mcpStructured(\"Created Suda project.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"list_themes\",\n {\n description: \"List themes visible to the current Suda CLI user.\",\n inputSchema: {\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n themes: z.array(\n z.object({\n key: z.string(),\n name: z.string(),\n version: z.string(),\n description: z.string().nullable().optional(),\n categories: z.array(z.string()).optional(),\n preview: z.string().optional(),\n active: z.boolean().optional(),\n }),\n ),\n },\n },\n async ({ projectId, themeRoot }) => {\n const structuredContent = { themes: await listAgentThemes({ projectId, themeRoot }) };\n return mcpStructured(\"Available Suda themes.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"describe_theme\",\n {\n description: \"Return the raw Suda agent manifest for a theme.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n agentManifest: z.unknown(),\n },\n },\n async ({ theme, version, projectId, themeRoot }) => {\n const structuredContent = {\n agentManifest: await fetchAgentManifest(theme, { version, projectId, themeRoot }),\n };\n return mcpStructured(\"Raw Suda theme agent manifest.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_page_schema\",\n {\n description:\n \"Return the AI-first output schema for generating Suda page content, including all section schemas.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n includeExample: z.boolean().optional(),\n },\n outputSchema: agentPageSchemaOutputSchema.shape,\n },\n async ({ theme, version, projectId, themeRoot, includeExample }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createAgentPageSchemaOutput(manifest, {\n includeExample: includeExample === true,\n });\n return mcpStructured(\"AI-first Suda page content output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_section_schema\",\n {\n description: \"Return the AI-first output schema for one section component in a theme.\",\n inputSchema: {\n theme: z.string(),\n section: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentComponentOutputSchema.shape,\n },\n async ({ theme, section, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createSectionSchema(manifest, section);\n return mcpStructured(\"AI-first Suda section output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"validate_page_config\",\n {\n description: \"Validate AI-generated Suda page content against a theme.\",\n inputSchema: {\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentValidationResultSchema.shape,\n },\n async ({ theme, data, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = agentValidationResultSchema.parse(\n validateAgentPageContentWithManifest(data, manifest),\n );\n return mcpStructured(\"Suda page content validation result.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_page_draft\",\n {\n description: \"Create a workspace page draft from AI-generated Suda page content.\",\n inputSchema: {\n projectId: z.string(),\n title: z.string(),\n slug: z.string(),\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n },\n outputSchema: createPageDraftOutputSchema,\n },\n async ({ projectId, title, slug, theme, data, version }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId });\n const validation = validateAgentPageContentWithManifest(data, manifest);\n if (!validation.valid) {\n return mcpStructured(\n \"Suda page content validation failed. Fix issues before creating a draft.\",\n createPageDraftOutputSchema.parse({\n status: \"invalid\",\n valid: false,\n issues: validation.issues,\n }),\n );\n }\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title,\n slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: createPageDataFromAgentContent(data),\n }),\n },\n );\n return mcpStructured(\n \"Created Suda page draft.\",\n createPageDraftOutputSchema.parse({ status: \"created\", ...response }),\n );\n },\n );\n\n await server.connect(new StdioServerTransport());\n}\n\nasync function writeThemeArtifacts(theme: ValidatedTheme): Promise<void> {\n const dist = path.join(theme.root, \"dist\");\n const agentManifest = createThemeAgentManifest(theme.module);\n await writeFile(\n path.join(dist, \"manifest.json\"),\n `${JSON.stringify(theme.module.manifest, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"starter-pages.json\"),\n `${JSON.stringify(theme.module.starterPages, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"default-layout.json\"),\n `${JSON.stringify(theme.module.defaultLayout, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"agent-manifest.json\"),\n `${JSON.stringify(agentManifest, null, 2)}\\n`,\n );\n}\n\nfunction contentTypeFor(relativePath: string): string {\n if (relativePath.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (relativePath.endsWith(\".js\")) {\n return \"application/javascript; charset=utf-8\";\n }\n if (relativePath.endsWith(\".json\")) {\n return \"application/json; charset=utf-8\";\n }\n if (relativePath.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (relativePath.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (relativePath.endsWith(\".jpg\") || relativePath.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n }\n if (relativePath.endsWith(\".webp\")) {\n return \"image/webp\";\n }\n return \"application/octet-stream\";\n}\n\nasync function collectFiles(root: string, directory: string): Promise<UploadFile[]> {\n const files: UploadFile[] = [];\n if (!(await pathExists(directory))) {\n return files;\n }\n\n const children = await readdir(directory, { withFileTypes: true });\n for (const child of children) {\n const absolutePath = path.join(directory, child.name);\n if (child.isDirectory()) {\n files.push(...(await collectFiles(root, absolutePath)));\n continue;\n }\n const relativePath = path.relative(root, absolutePath).replaceAll(path.sep, \"/\");\n files.push({\n absolutePath,\n relativePath,\n contentType: contentTypeFor(relativePath),\n });\n }\n return files;\n}\n\nasync function collectThemeArtifactFiles(theme: ValidatedTheme): Promise<UploadFile[]> {\n const files = await collectFiles(theme.root, path.join(theme.root, \"dist\"));\n const assetsFiles = await collectFiles(theme.root, path.join(theme.root, \"assets\"));\n files.push(...assetsFiles);\n if (theme.stylesheetPath) {\n files.push({\n absolutePath: theme.stylesheetPath,\n relativePath: \"styles.css\",\n contentType: \"text/css; charset=utf-8\",\n });\n }\n return files;\n}\n\nasync function checksum(files: UploadFile[]): Promise<string> {\n const hash = createHash(\"sha256\");\n for (const file of files.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {\n hash.update(file.relativePath);\n hash.update(await readFile(file.absolutePath));\n }\n return hash.digest(\"hex\");\n}\n\nasync function publishTheme(\n root: string,\n skipBuild: boolean,\n): Promise<void> {\n const theme = skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n const files = await collectThemeArtifactFiles(theme);\n if (!theme.clientEntryPath) {\n throw new Error(\"Missing dist/runtime.client.js. Run `suda theme build` first.\");\n }\n\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n\n const baseUrl = `${protocolForHost(config.host)}://${config.host}`;\n const { key, version } = theme.module.manifest;\n\n const intentRes = await fetch(`${baseUrl}/api/cli/themes/publish-intent`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n files: files.map((f) => ({ relativePath: f.relativePath, contentType: f.contentType })),\n }),\n });\n\n if (!intentRes.ok) {\n const errorData = (await intentRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to get publish intent: ${errorData.error || intentRes.statusText}`);\n }\n\n const { urls } = (await intentRes.json()) as { urls: Array<{ relativePath: string; url: string }> };\n\n // Upload to S3 using presigned URLs\n for (const file of files) {\n const urlObj = urls.find((u) => u.relativePath === file.relativePath);\n if (!urlObj) {\n throw new Error(`Missing presigned URL for ${file.relativePath}`);\n }\n\n const body = await readFile(file.absolutePath);\n const putRes = await fetch(urlObj.url, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": file.contentType,\n },\n body,\n });\n\n if (!putRes.ok) {\n throw new Error(`Failed to upload ${file.relativePath}: ${putRes.statusText}`);\n }\n console.log(`uploaded ${createThemeObjectKey(key, version, file.relativePath)}`);\n }\n\n const digest = await checksum(files);\n const bundleArtifactRelative = \"dist/index.js\";\n const bundleArtifactExists = files.some((f) => f.relativePath === bundleArtifactRelative);\n if (!bundleArtifactExists) {\n throw new Error(`Missing ${bundleArtifactRelative} in theme artifacts.`);\n }\n\n const previewArtifactRelative = \"dist/preview/desktop.png\";\n const previewArtifactExists = await pathExists(path.join(theme.root, previewArtifactRelative));\n const agentManifest = createThemeAgentManifest(theme.module);\n\n const completeRes = await fetch(`${baseUrl}/api/cli/themes/publish-complete`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n checksum: digest,\n manifest: theme.module.manifest,\n agentManifest,\n bundleArtifactRelative,\n previewArtifactRelative: previewArtifactExists ? previewArtifactRelative : undefined,\n }),\n });\n\n if (!completeRes.ok) {\n const errorData = (await completeRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to complete publish: ${errorData.error || completeRes.statusText}`);\n }\n\n console.log(`published ${key}@${version}`);\n}\n\nasync function initTheme(target: string): Promise<void> {\n const key = path\n .basename(target)\n .replace(/[^a-zA-Z0-9._-]/g, \"-\")\n .toLowerCase();\n await mkdir(path.join(target, \"src\"), { recursive: true });\n await writeFile(\n path.join(target, \"package.json\"),\n `${JSON.stringify(\n {\n name: `@suda-themes/${key}`,\n version: \"0.1.0\",\n private: true,\n packageManager: \"pnpm@11.6.0\",\n type: \"module\",\n main: \"./dist/index.js\",\n types: \"./dist/index.d.ts\",\n scripts: {\n // `build:src` compiles TypeScript sources to dist/. `build` then runs\n // `suda theme build --skip-theme-build` so the CLI does not recurse\n // back into this script (it would otherwise see scripts.build and\n // call `pnpm run build` again, causing infinite recursion).\n \"build:src\": \"tsc -p tsconfig.json\",\n build: \"pnpm run build:src && suda theme build --theme-root . --skip-theme-build\",\n dev: \"suda theme dev --theme-root . --skip-theme-build\",\n typecheck: \"tsc -p tsconfig.json --noEmit\",\n validate: \"suda theme validate --theme-root .\",\n preview: \"suda theme preview --theme-root .\",\n },\n dependencies: {\n \"@sudajs/theme-engine\": \"^0.1.1\",\n },\n devDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n \"@sudajs/cli\": \"^0.1.0\",\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n typescript: \"^5.6.0\",\n },\n peerDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n },\n },\n null,\n 2,\n )}\\n`,\n );\n // pnpm 11 removed `pnpm.onlyBuiltDependencies` from `package.json` and the\n // `package.json#pnpm` overrides field; everything must live in\n // `pnpm-workspace.yaml`. Even a standalone single-package theme project\n // needs this file to allow esbuild's postinstall to run.\n await writeFile(\n path.join(target, \"pnpm-workspace.yaml\"),\n `# This is NOT a monorepo marker — it only exists because pnpm 11 moved\\n# project-level settings such as \\`allowBuilds\\` out of package.json. Without\\n# a \\`packages:\\` field this workspace contains just the current package, so\\n# the project remains a standalone single-package theme.\\n# See https://pnpm.io/settings and https://pnpm.io/pnpm-workspace_yaml.\\nallowBuilds:\\n esbuild: true\\n`,\n );\n await writeFile(\n path.join(target, \"tsconfig.json\"),\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"DOM\", \"DOM.Iterable\", \"ES2022\"],\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n jsx: \"react-jsx\",\n rootDir: \"src\",\n outDir: \"dist\",\n declaration: true,\n declarationMap: true,\n sourceMap: true,\n strict: true,\n noUncheckedIndexedAccess: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n types: [\"node\"],\n },\n // `package.json` is included so `src/index.tsx` can read its `version`\n // via `import pkg from \"../package.json\"`. tsc tolerates this with\n // rootDir pinned because the JSON is resolved as input but not emitted.\n include: [\"src\", \"package.json\"],\n },\n null,\n 2,\n )}\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"manifest.ts\"),\n `import type { ThemeSourceManifest } from \"@sudajs/theme-engine\";\\n\\n// Source-side manifest — version is intentionally omitted because the\\n// authoritative theme version lives in package.json. \\`src/index.tsx\\` reads\\n// package.json#version and merges it into the published ThemeManifest, so a\\n// single \\`pnpm changeset version\\` (or \\`npm version\\`) bumps everything.\\nexport const sourceManifest: ThemeSourceManifest = {\\n key: \"${key}\",\\n name: \"${key}\",\\n categories: [\"other\"],\\n minEngineVersion: \"0.0.0\",\\n entry: \"dist/index.js\",\\n clientEntry: \"dist/runtime.client.js\",\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"sections.tsx\"),\n `import type { ComponentConfig } from \"@puckeditor/core\";\\n\\nexport const Hero: ComponentConfig = {\\n label: \"Hero\",\\n fields: {\\n eyebrow: { type: \"text\", label: \"Eyebrow\" },\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n primaryLabel: { type: \"text\", label: \"Primary button label\" },\\n primaryHref: { type: \"text\", label: \"Primary button link\" },\\n },\\n defaultProps: {\\n eyebrow: \"New theme\",\\n title: \"Build with SudaCloud\",\\n description: \"Edit this starter section in the visual editor.\",\\n primaryLabel: \"Get started\",\\n primaryHref: \"#contact\",\\n },\\n render: ({ eyebrow, title, description, primaryLabel, primaryHref }) => (\\n <section className=\"${key}-section ${key}-hero\">\\n <p className=\"${key}-eyebrow\">{eyebrow}</p>\\n <h1>{title}</h1>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={primaryHref}>{primaryLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const FeatureGrid: ComponentConfig = {\\n label: \"Feature grid\",\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n features: {\\n type: \"array\",\\n label: \"Features\",\\n arrayFields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n },\\n },\\n },\\n defaultProps: {\\n title: \"Everything you need to launch\",\\n description: \"Use this section to explain the core value of the project.\",\\n features: [\\n { title: \"Fast setup\", description: \"Start from a clean theme contract.\" },\\n { title: \"Visual editing\", description: \"Expose content fields through Puck.\" },\\n { title: \"Publish ready\", description: \"Build and publish with the Suda CLI.\" },\\n ],\\n },\\n render: ({ title, description, features = [] }) => (\\n <section className=\"${key}-section\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <div className=\"${key}-grid\">\\n {features.map((feature: { title?: string; description?: string }, index: number) => (\\n <article className=\"${key}-card\" key={index}>\\n <h3>{feature.title}</h3>\\n <p>{feature.description}</p>\\n </article>\\n ))}\\n </div>\\n </section>\\n ),\\n};\\n\\nexport const Testimonial: ComponentConfig = {\\n label: \"Testimonial\",\\n fields: {\\n quote: { type: \"textarea\", label: \"Quote\" },\\n author: { type: \"text\", label: \"Author\" },\\n role: { type: \"text\", label: \"Role\" },\\n },\\n defaultProps: {\\n quote: \"SudaCloud gives our team a practical editing workflow without giving up theme control.\",\\n author: \"Alex Chen\",\\n role: \"Founder\",\\n },\\n render: ({ quote, author, role }) => (\\n <section className=\"${key}-section ${key}-quote\">\\n <blockquote>{quote}</blockquote>\\n <p>{author} · {role}</p>\\n </section>\\n ),\\n};\\n\\nexport const CallToAction: ComponentConfig = {\\n label: \"Call to action\",\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n buttonLabel: { type: \"text\", label: \"Button label\" },\\n buttonHref: { type: \"text\", label: \"Button link\" },\\n },\\n defaultProps: {\\n title: \"Ready to build your next page?\",\\n description: \"Use this section as the final conversion block.\",\\n buttonLabel: \"Contact us\",\\n buttonHref: \"#contact\",\\n },\\n render: ({ title, description, buttonLabel, buttonHref }) => (\\n <section className=\"${key}-section ${key}-cta\" id=\"contact\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={buttonHref}>{buttonLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const SECTION_COMPONENTS = { Hero, FeatureGrid, Testimonial, CallToAction };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"layout.tsx\"),\n `import { getPageSlot } from \"@sudajs/theme-engine/runtime\";\\nimport type { ComponentConfig, Config } from \"@puckeditor/core\";\\nimport type { ReactElement, ReactNode } from \"react\";\\n\\ntype PuckExtras = { puck?: { metadata?: Record<string, unknown> } };\\n\\nexport const rootConfig: NonNullable<Config[\"root\"]> = {\\n fields: {\\n siteName: { type: \"text\", label: \"Site name\" },\\n },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ children, siteName }: { children?: ReactNode; siteName?: string }) => (\\n <div className=\"${key}-root\" data-site-name={siteName}>{children}</div>\\n ),\\n};\\n\\nexport const Header: ComponentConfig = {\\n label: \"Header\",\\n fields: { siteName: { type: \"text\", label: \"Site name\" } },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ siteName }) => <header className=\"${key}-header\">{siteName}</header>,\\n};\\n\\nexport const PageOutlet: ComponentConfig = {\\n label: \"Page outlet\",\\n fields: {},\\n defaultProps: {},\\n render: (props: PuckExtras): ReactElement => <>{getPageSlot(props.puck?.metadata)}</>,\\n};\\n\\nexport const Footer: ComponentConfig = {\\n label: \"Footer\",\\n fields: { text: { type: \"text\", label: \"Text\" } },\\n defaultProps: { text: \"© ${key}\" },\\n render: ({ text }) => <footer className=\"${key}-footer\">{text}</footer>,\\n};\\n\\nexport const LAYOUT_COMPONENTS = { Header, PageOutlet, Footer };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"config.ts\"),\n `import type { Config, Data } from \"@puckeditor/core\";\\n\\nimport { LAYOUT_COMPONENTS, rootConfig } from \"./layout.js\";\\nimport { SECTION_COMPONENTS } from \"./sections.js\";\\n\\nexport const pageConfig: Config = {\\n components: SECTION_COMPONENTS,\\n};\\n\\nexport const layoutConfig: Config = {\\n root: rootConfig,\\n components: LAYOUT_COMPONENTS,\\n};\\n\\nexport const defaultLayout: Data = {\\n root: { props: { siteName: \"${key}\" } },\\n content: [\\n { type: \"Header\", props: { id: \"Header-1\", siteName: \"${key}\" } },\\n { type: \"PageOutlet\", props: { id: \"PageOutlet-1\" } },\\n { type: \"Footer\", props: { id: \"Footer-1\", text: \"© ${key}\" } },\\n ],\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"templates.ts\"),\n `import type { ThemeStarterPage } from \"@sudajs/theme-engine\";\\n\\nexport const starterPages: ThemeStarterPage[] = [\\n {\\n slug: \"home\",\\n title: \"Home\",\\n isHome: true,\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-1\",\\n eyebrow: \"Starter page\",\\n title: \"Welcome to ${key}\",\\n description: \"This page was generated by suda theme init.\",\\n primaryLabel: \"Explore features\",\\n primaryHref: \"#features\",\\n },\\n },\\n {\\n type: \"FeatureGrid\",\\n props: {\\n id: \"FeatureGrid-1\",\\n title: \"Designed for editable sites\",\\n description: \"Starter sections show agents and editors how this theme is structured.\",\\n features: [\\n { title: \"Typed fields\", description: \"Each section exposes a clear field schema.\" },\\n { title: \"Starter pages\", description: \"Templates show realistic section composition.\" },\\n { title: \"CLI workflow\", description: \"Build, validate, preview, and publish from one tool.\" },\\n ],\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-1\",\\n title: \"Launch your first page\",\\n description: \"Customize this starter template or let an agent generate a new draft.\",\\n buttonLabel: \"Get in touch\",\\n buttonHref: \"/contact\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"about\",\\n title: \"About\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-About\",\\n eyebrow: \"About\",\\n title: \"A clean starting point for your story\",\\n description: \"Use this page to introduce the project, audience, and promise.\",\\n primaryLabel: \"Contact us\",\\n primaryHref: \"/contact\",\\n },\\n },\\n {\\n type: \"Testimonial\",\\n props: {\\n id: \"Testimonial-About\",\\n quote: \"This starter theme keeps the editable surface focused and predictable.\",\\n author: \"SudaCloud\",\\n role: \"Theme team\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"contact\",\\n title: \"Contact\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-Contact\",\\n eyebrow: \"Contact\",\\n title: \"Let's talk\",\\n description: \"Tell visitors how to reach you and what happens next.\",\\n primaryLabel: \"Email us\",\\n primaryHref: \"mailto:hello@example.com\",\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-Contact\",\\n title: \"Start the conversation\",\\n description: \"Replace this copy with your preferred contact details or form link.\",\\n buttonLabel: \"Send an email\",\\n buttonHref: \"mailto:hello@example.com\",\\n },\\n },\\n ],\\n },\\n },\\n];\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"index.tsx\"),\n `import type { ThemeManifest, ThemeModule } from \"@sudajs/theme-engine\";\\n\\nimport pkg from \"../package.json\" with { type: \"json\" };\\nimport { defaultLayout, layoutConfig, pageConfig } from \"./config.js\";\\nimport { sourceManifest } from \"./manifest.js\";\\nimport { starterPages } from \"./templates.js\";\\n\\n// Single source of truth: theme version comes from package.json#version,\\n// merged into the source-side manifest. esbuild inlines the JSON import at\\n// build time, so the published \\`dist/index.js\\` is fully self-contained.\\nexport const manifest: ThemeManifest = { ...sourceManifest, version: pkg.version };\\n\\nconst theme: ThemeModule = {\\n manifest,\\n pageConfig,\\n layoutConfig,\\n defaultLayout,\\n starterPages,\\n};\\n\\nexport default theme;\\nexport { pageConfig, layoutConfig, defaultLayout, starterPages };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"runtime.client.ts\"),\n '\"use client\";\\n\\nimport theme from \"./index.js\";\\n\\nexport default theme;\\n',\n );\n await writeFile(\n path.join(target, \"styles.css\"),\n `.${key}-root { font-family: Inter, ui-sans-serif, system-ui, sans-serif; color: #111827; background: #ffffff; }\\n.${key}-header, .${key}-footer { padding: 20px clamp(20px, 5vw, 64px); border-bottom: 1px solid #e5e7eb; }\\n.${key}-footer { border-top: 1px solid #e5e7eb; border-bottom: 0; color: #6b7280; }\\n.${key}-section { padding: 64px clamp(20px, 5vw, 64px); }\\n.${key}-hero { background: #f8fafc; }\\n.${key}-eyebrow { text-transform: uppercase; letter-spacing: 0.08em; font-size: 12px; color: #2563eb; font-weight: 700; }\\n.${key}-section h1 { max-width: 780px; font-size: clamp(40px, 7vw, 72px); line-height: 0.95; margin: 0 0 20px; }\\n.${key}-section h2 { max-width: 720px; font-size: 36px; line-height: 1.05; margin: 0 0 16px; }\\n.${key}-section p { max-width: 680px; line-height: 1.7; color: #4b5563; }\\n.${key}-button { display: inline-flex; align-items: center; min-height: 42px; padding: 0 18px; border-radius: 8px; background: #111827; color: #ffffff; text-decoration: none; font-weight: 700; }\\n.${key}-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; margin-top: 28px; }\\n.${key}-card { border: 1px solid #e5e7eb; border-radius: 8px; padding: 20px; }\\n.${key}-quote blockquote { max-width: 780px; font-size: 28px; line-height: 1.25; margin: 0 0 16px; }\\n.${key}-cta { background: #111827; color: #ffffff; }\\n.${key}-cta p { color: #d1d5db; }\\n.${key}-cta .${key}-button { background: #ffffff; color: #111827; }\\n`,\n );\n await writeFile(path.join(target, \".gitignore\"), \"node_modules\\ndist\\n*.tsbuildinfo\\n\");\n await writeFile(\n path.join(target, \"AGENTS.md\"),\n `# Suda Theme Agent Guide\\n\\nThis directory is a Suda theme source project generated by \\`suda theme init\\`.\\nIt is a **standalone** npm package — it does not depend on the SudaCloud monorepo.\\n\\n## What to edit\\n\\n- Add page sections in \\`src/sections.tsx\\` and register them in \\`SECTION_COMPONENTS\\`.\\n- Add starter pages in \\`src/templates.ts\\` to show realistic section combinations.\\n- Keep shared site chrome in \\`src/layout.tsx\\`; \\`PageOutlet\\` is where page content renders.\\n- Keep \\`src/index.tsx\\` exporting the source \\`ThemeModule\\`. The final artifact is produced by \\`suda theme build\\`.\\n- All relative imports under \\`src/\\` MUST include the \\`.js\\` extension (NodeNext ESM resolution).\\n\\n## Page content rules\\n\\n- Agent page files passed to \\`suda agent page validate/create\\` contain \\`content\\` and optional \\`zones\\` only.\\n- Every \\`content[]\\` item must use a section type from \\`SECTION_COMPONENTS\\`.\\n- Every \\`content[]\\` item must include \\`props.id\\`.\\n- Prefer editing section props over changing render code when generating pages.\\n- Do not edit files under \\`dist/\\`; they are generated.\\n\\n## Useful commands\\n\\n\\`\\`\\`bash\\npnpm install\\npnpm typecheck\\npnpm build # tsc + suda theme build --skip-theme-build\\npnpm validate\\npnpm preview\\nsuda agent theme describe local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\nsuda agent page validate --theme local --input ./page.json --theme-root .\\n\\`\\`\\`\\n`,\n );\n await writeFile(\n path.join(target, \"CLAUDE.md\"),\n `# Claude Code\\n\\nRead \\`AGENTS.md\\` first. It is the canonical guide for this Suda theme project.\\n`,\n );\n await writeFile(\n path.join(target, \"README.md\"),\n `# ${key}\\n\\nA Suda theme scaffolded with \\`suda theme init\\`. This is a standalone\\npackage; it does not need to live inside the SudaCloud monorepo.\\n\\n## Setup\\n\\n\\`\\`\\`bash\\npnpm install\\n\\`\\`\\`\\n\\n## Develop\\n\\n\\`\\`\\`bash\\npnpm typecheck # type-check sources\\npnpm build # tsc + suda theme build (server bundle + client runtime + manifest)\\npnpm dev # watch the browser runtime\\npnpm preview # build and preview the home starter page\\npnpm validate # validate the dist artifact\\n\\`\\`\\`\\n\\n## Agent tooling\\n\\n\\`\\`\\`bash\\nsuda agent theme describe local --theme-root .\\nsuda agent page schema local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\n\\`\\`\\`\\n\\n## Publish\\n\\n\\`\\`\\`bash\\npnpm build\\nsuda theme screenshot # optional: capture dist/preview/desktop.png\\nsuda theme publish\\n\\`\\`\\`\\n`,\n );\n console.log(`created theme scaffold at ${target}`);\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"suda\")\n .description(\"Suda CLI for managing themes, sites, posts and AI tooling.\")\n .version(\"0.0.0\");\n\n const theme = program.command(\"theme\").description(\"Manage Suda theme artifacts.\");\n\n theme\n .command(\"init\")\n .description(\"Scaffold a new theme source directory.\")\n .argument(\"[dir]\", \"Theme directory to create.\", \"./theme\")\n .action(async (dir: string) => {\n await initTheme(path.resolve(dir));\n });\n\n theme\n .command(\"validate\")\n .description(\"Validate a built theme artifact.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .action(async (options: ThemeRootOptions) => {\n const result = await validateTheme(resolveThemeRoot(options));\n console.log(`valid ${result.module.manifest.key}@${result.module.manifest.version}`);\n if (!result.clientEntryPath) {\n console.warn(\n \"warning: dist/runtime.client.js is missing; editor runtime will not load until `suda theme build` runs.\",\n );\n }\n });\n\n theme\n .command(\"build\")\n .description(\"Build server dist (via package script) and browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .action(async (options: BuildOptions) => {\n const result = await buildTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n console.log(`built ${result.module.manifest.key}@${result.module.manifest.version}`);\n });\n\n theme\n .command(\"dev\")\n .description(\"Watch and rebuild the browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .action(async (options: BuildOptions) => {\n await watchTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n });\n\n theme\n .command(\"preview\")\n .description(\"Build and serve the local theme artifact files.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--port <port>\", \"Preview server port.\", \"4177\")\n .action(async (options: PreviewOptions) => {\n const port = Number(options.port ?? \"4177\");\n await previewTheme(resolveThemeRoot(options), Number.isFinite(port) ? port : 4177);\n });\n\n theme\n .command(\"screenshot\")\n .description(\n \"Capture a desktop preview screenshot of the home starter page using Playwright.\",\n )\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--output <path>\", \"Output PNG path relative to theme root.\")\n .option(\"--width <px>\", \"Viewport width in pixels.\", \"1280\")\n .option(\"--height <px>\", \"Viewport height in pixels.\", \"800\")\n .option(\"--port <port>\", \"Preview server port used during capture.\", \"4178\")\n .option(\"--skip-build\", \"Skip rebuilding the theme before capturing.\")\n .action(async (options: ScreenshotOptions) => {\n await screenshotTheme(resolveThemeRoot(options), options);\n });\n\n theme\n .command(\"publish\")\n .description(\"Upload artifact to S3 and upsert ThemePackage/ThemeVersion.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-build\", \"Publish existing dist files without rebuilding.\")\n .action(async (options: PublishOptions) => {\n await publishTheme(resolveThemeRoot(options), options.skipBuild === true);\n });\n\n const agent = program.command(\"agent\").description(\"Agent-friendly theme and page tooling.\");\n\n const agentProject = agent\n .command(\"project\")\n .description(\"Manage Suda projects from the CLI.\");\n\n agentProject\n .command(\"list\")\n .description(\"List Suda projects the current CLI user can access.\")\n .action(async () => {\n const projects = await listAgentProjects();\n printJson({ projects });\n });\n\n agentProject\n .command(\"create\")\n .description(\n \"Create a new Suda project (mirrors onboarding). External AI should ask the user for a website name and short business description before calling this.\",\n )\n .requiredOption(\"--name <name>\", \"Website or brand name.\")\n .requiredOption(\n \"--site-description <description>\",\n \"Short business introduction used to seed default site metadata.\",\n )\n .action(async (options: { name: string; siteDescription: string }) => {\n // Reuse the shared zod schema so CLI flag validation matches the MCP\n // tool input bounds and the server-side `/api/cli/agent/projects` route.\n const parsed = createProjectInputSchema.safeParse({\n name: options.name,\n siteDescription: options.siteDescription,\n });\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n const field = issue?.path[0] === \"siteDescription\" ? \"--site-description\" : \"--name\";\n throw new Error(`${field}: ${issue?.message ?? \"invalid value\"}`);\n }\n\n const result = await createAgentProject(parsed.data);\n printJson(result);\n });\n\n const agentThemes = agent.command(\"themes\").description(\"Manage agent-visible themes.\");\n\n agentThemes\n .command(\"list\")\n .description(\"List themes visible to the current CLI user.\")\n .option(\"--project-id <projectId>\", \"Scope results to a project.\")\n .option(\"--theme-root <path>\", \"Describe a local theme instead of the remote catalog.\")\n .action(async (options: AgentThemeOptions) => {\n const themes = await listAgentThemes(options);\n printJson({ themes });\n });\n\n const agentTheme = agent.command(\"theme\").description(\"Inspect a single theme.\");\n\n agentTheme\n .command(\"describe\")\n .description(\"Describe a theme's AI-first page schema.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\n });\n\n const agentPage = agent.command(\"page\").description(\"AI-first page content tooling.\");\n\n agentPage\n .command(\"schema\")\n .description(\"Print the AI-first page content output schema for a theme.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\n });\n\n agentPage\n .command(\"validate\")\n .description(\"Validate an AI-generated Suda page content JSON document.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; input: string }) => {\n await validateAgentPage(options.theme, options.input, options);\n });\n\n agentPage\n .command(\"create\")\n .description(\"Create a workspace page draft from AI-generated Suda page content JSON.\")\n .requiredOption(\"--project-id <projectId>\", \"Project id.\")\n .requiredOption(\"--title <title>\", \"Page title.\")\n .requiredOption(\"--slug <slug>\", \"Page slug.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .action(async (options: AgentPageCreateOptions) => {\n await createAgentPage(options);\n });\n\n const agentSection = agent.command(\"section\").description(\"Inspect a single section.\");\n\n agentSection\n .command(\"schema\")\n .description(\"Print one AI-first section output schema for a theme.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--section <section>\", \"Section type.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; section: string }) => {\n const manifest = await fetchAgentManifest(options.theme, options);\n printJson(createSectionSchema(manifest, options.section));\n });\n\n program\n .command(\"mcp\")\n .description(\"Run the Suda local MCP server over stdio.\")\n .action(async () => {\n await startMcpServer();\n });\n\n const authCmd = program.command(\"auth\").description(\"Manage Suda authentication.\");\n\n authCmd\n .command(\"login\")\n .description(\"Authenticate Suda CLI with a SudaCloud workspace.\")\n .option(\"--host <host>\", \"The SudaCloud workspace host to authenticate against.\", \"app.sudayun.cn\")\n .action(async (options: { host: string }) => {\n await login(options.host);\n });\n\n authCmd\n .command(\"status\")\n .description(\"Check current authentication status.\")\n .action(async () => {\n await status();\n });\n\n authCmd\n .command(\"logout\")\n .description(\"Clear local authentication configuration.\")\n .action(async () => {\n await logout();\n });\n\n program.showHelpAfterError();\n\n return program;\n}\n\nexport async function main(): Promise<void> {\n const program = buildProgram();\n const argv = process.argv.filter((arg, index) => index < 2 || arg !== \"--\");\n await program.parseAsync(argv);\n}\n"]}
1
+ {"version":3,"sources":["../src/auth.ts","../src/index.ts"],"names":["path","esbuild","context","esbuildContext","require","theme"],"mappings":";;;;;;;;;;;;;;;;;AASA,SAAS,aAAA,GAAgB;AACvB,EAAA,OAAOA,MAAK,IAAA,CAAK,EAAA,CAAG,SAAQ,EAAG,SAAA,EAAW,QAAQ,aAAa,CAAA;AACjE;AAEA,eAAsB,cAAA,GAA6C;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,aAAa,aAAA,EAAc;AACjC,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AACrD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,gBAAgB,MAAA,EAAmC;AACvE,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,MAAM,EAAA,CAAG,MAAMA,KAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC5D,EAAA,MAAM,EAAA,CAAG,KAAA,CAAMA,KAAA,CAAK,OAAA,CAAQ,UAAU,GAAG,GAAK,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACrE,EAAA,MAAM,EAAA,CAAG,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,GAAA,EAAO,CAAA;AACjF;AAEA,eAAsB,eAAA,GAAiC;AACrD,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,UAAU,CAAA;AAAA,EAC5B,SAAS,GAAA,EAAc;AACrB,IAAA,IAAI,eAAe,KAAA,IAAS,MAAA,IAAU,GAAA,IAAQ,GAAA,CAAyB,SAAS,QAAA,EAAU;AACxF,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,KAAA,CAAM,OAAe,gBAAA,EAAkB;AAC3D,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,WAAW,KAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,GAAI,MAAA,GAAS,OAAA;AACrF,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA;AAErC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,OAAO,CAAA,GAAA,CAAK,CAAA;AAEhE,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,oBAAA,CAAA,EAAwB;AAAA,IAC9D,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,SAAA,CAAU,UAAU,CAAA,CAAE,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,EAAE,YAAY,QAAA,EAAU,eAAA,EAAiB,UAAU,SAAA,EAAU,GAAK,MAAM,SAAA,CAAU,IAAA,EAAK;AAQ7F,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,eAAe,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA;AACnD,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA,CAA0E,CAAA;AACtF,EAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,OAAO;AAAA,CAAI,CAAA;AAC5B,EAAA,OAAA,CAAQ,GAAA,CAAI,8BAA8B,QAAQ;AAAA,CAAI,CAAA;AAEtD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,OAAO,MAAM,CAAA,EAAG,OAAA;AACpC,IAAA,MAAM,KAAK,OAAO,CAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,YAAA,GAAA,CAAgB,YAAY,CAAA,IAAK,GAAA;AACvC,EAAA,MAAM,iBAAiB,SAAA,IAAa,GAAA;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,cAAA,GAAiB,GAAA;AAE/C,EAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAE1C,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAEhE,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAC1D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,YAAY;AAAA,KACpC,CAAA;AAED,IAAA,MAAM,IAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,EAAK;AAEjC,IAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,KAAK,KAAA,EAAO;AAC1D,MAAA,MAAM,gBAAgB,EAAE,YAAA,EAAc,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AACxD,MAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,UAAU,uBAAA,EAAyB;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,KAAA,IAAS,eAAe,CAAA,CAAE,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC5C;AAEA,eAAsB,MAAA,GAAS;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AACnE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,GAAI,MAAA,GAAS,OAAA;AAEnG,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,MAAA,CAAO,IAAI,CAAA,qBAAA,CAAA,EAAyB;AAAA,MACrE,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,CAAA,OAAA,EAAU,MAAA,CAAO,YAAY,CAAA;AAAA;AAC9C,KACD,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AACpD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,OAAA,CAAQ,IAAI,iEAAiE,CAAA;AAC7E,IAAA,MAAM,eAAA,EAAgB;AACtB,IAAA;AAAA,EACF;AAKA,EAAA,MAAM,OAAA,GAAW,MAAM,GAAA,CAAI,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,IAAA,OAAA,CAAQ,IAAI,iEAAiE,CAAA;AAC7E,IAAA,MAAM,eAAA,EAAgB;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACzF;AAEA,eAAsB,MAAA,GAAS;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAC5B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,EAAgB;AACtB,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACxC;;;ACtCA,IAAM,2BAAA,GAA8B,CAAA,CAAE,kBAAA,CAAmB,QAAA,EAAU;AAAA,EACjE,EAAE,MAAA,CAAO;AAAA,IACP,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA,CAAE,SAAS,6BAA6B,CAAA;AAAA,IACnE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc;AAAA,GAC3C,CAAA;AAAA,EACD,EAAE,MAAA,CAAO;AAAA,IACP,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA,CAAE,SAAS,qCAAqC,CAAA;AAAA,IAC3E,KAAA,EAAO,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,IACtB,QAAQ,CAAA,CAAE,KAAA;AAAA,MACR,EAAE,MAAA,CAAO;AAAA,QACP,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,QACf,OAAA,EAAS,EAAE,MAAA;AAAO,OACnB;AAAA;AACH,GACD;AACH,CAAC,CAAA;AAID,IAAM,uBAAA,GAA0B,CAAA;AAChC,IAAM,uBAAA,GAA0B,EAAA;AAChC,IAAM,8BAAA,GAAiC,CAAA;AACvC,IAAM,8BAAA,GAAiC,GAAA;AAKvC,IAAM,wBAAA,GAA2B,EAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,CAAA,CACH,MAAA,EAAO,CACP,IAAA,GACA,GAAA,CAAI,uBAAuB,CAAA,CAC3B,GAAA,CAAI,uBAAuB,CAAA;AAAA,EAC9B,eAAA,EAAiB,CAAA,CACd,MAAA,EAAO,CACP,IAAA,GACA,GAAA,CAAI,8BAA8B,CAAA,CAClC,GAAA,CAAI,8BAA8B;AACvC,CAAC,CAAA;AAED,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACpC,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,EACnB,cAAA,EAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACpC,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACjC,CAAC,CAAA;AAED,IAAM,wBAAA,GAA2B,EAAE,MAAA,CAAO;AAAA,EACxC,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,oBAAoB;AACxC,CAAC,CAAA;AAED,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EACzC,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,EACf,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,YAAA,EAAc,EAAE,MAAA;AAClB,CAAC,CAAA;AAED,SAAS,yBAAA,GAAoC;AAC3C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,sBAAA;AAAA,IACN,MAAM,KAAA,EAAO;AACX,MAAA,KAAA,CAAM,SAAA,CAAU,EAAE,MAAA,EAAQ,SAAA,IAAa,OAAO;AAAA,QAC5C,IAAA,EAAM,iBAAA;AAAA,QACN,SAAA,EAAW;AAAA,OACb,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,SAAA,CAAU,EAAE,MAAA,EAAQ,sBAAA,IAA0B,OAAO;AAAA,QACzD,IAAA,EAAM,6BAAA;AAAA,QACN,SAAA,EAAW;AAAA,OACb,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,SAAA,CAAU,EAAE,MAAA,EAAQ,aAAA,IAAiB,OAAO;AAAA,QAChD,IAAA,EAAM,qBAAA;AAAA,QACN,SAAA,EAAW;AAAA,OACb,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,SAAA,CAAU,EAAE,MAAA,EAAQ,qBAAA,IAAyB,OAAO;AAAA,QACxD,IAAA,EAAM,4BAAA;AAAA,QACN,SAAA,EAAW;AAAA,OACb,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,OAAO,EAAE,MAAA,EAAQ,qBAAqB,SAAA,EAAW,WAAA,IAAe,OAAO;AAAA,QAC3E,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA2CZ,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,MAAA;AAAA,QACJ;AAAA,UACE,MAAA,EAAQ,+BAAA;AAAA,UACR,SAAA,EAAW;AAAA,SACb;AAAA,QACA,OAAO;AAAA,UACL,MAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAOZ;AAAA,OACF;AACA,MAAA,KAAA,CAAM,OAAO,EAAE,MAAA,EAAQ,yBAAyB,SAAA,EAAW,WAAA,IAAe,OAAO;AAAA,QAC/E,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAsBZ,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,OAAO,EAAE,MAAA,EAAQ,gCAAgC,SAAA,EAAW,WAAA,IAAe,OAAO;AAAA,QACtF,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQZ,CAAE,CAAA;AAAA,IACJ;AAAA,GACF;AACF;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA;AAC9C;AAEA,SAAS,iBAAA,CAAkB,UAAkB,OAAA,EAAyB;AACpE,EAAA,OAAO,UAAU,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAA,EAAI,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAA;AAC5E;AAEA,SAAS,oBAAA,CAAqB,QAAA,EAAkB,OAAA,EAAiB,YAAA,EAA8B;AAC7F,EAAA,MAAM,mBAAmB,YAAA,CACtB,OAAA,CAAQ,MAAA,EAAQ,EAAE,EAClB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,iBAAiB,CAAA,CACrB,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,OAAO,GAAG,iBAAA,CAAkB,QAAA,EAAU,OAAO,CAAC,IAAI,gBAAgB,CAAA,CAAA;AACpE;AAIA,SAAS,iBAAiB,OAAA,EAAmC;AAC3D,EAAA,OAAOA,MAAK,OAAA,CAAQ,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,KAAK,CAAA;AACxD;AAEA,eAAe,WAAW,QAAA,EAAoC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAe,SAAY,QAAA,EAA8B;AACvD,EAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC3C,EAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB;AAEA,eAAe,iBAAoB,QAAA,EAAqC;AACtE,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,QAAQ,CAAA,EAAI;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAY,QAAQ,CAAA;AAC7B;AAEA,SAAS,gBAAgB,IAAA,EAAgC;AACvD,EAAA,OAAO,IAAA,CAAK,SAAS,WAAW,CAAA,IAAK,KAAK,QAAA,CAAS,WAAW,IAAI,MAAA,GAAS,OAAA;AAC7E;AAEA,eAAe,iBAAA,GAAiE;AAC9E,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,GAAG,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAC,CAAA,GAAA,EAAM,OAAO,IAAI,CAAA,CAAA;AAAA,IACzD,OAAO,MAAA,CAAO;AAAA,GAChB;AACF;AAEA,eAAe,SAAA,CACb,GAAA,EACA,OAAA,GAA4C,EAAC,EACjC;AACZ,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC3C,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,SAAS,CAAA;AACzD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACzD,IAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,WAAW,SAAA,CAAU,KAAA,IAAS,SAAS,UAAU,CAAA;AAAA,EAC7E;AACA,EAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAC9B;AAEA,SAAS,aAAA,GAAwB;AAC/B,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,kBAAkBA,KAAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,GAAA,EAAK,QAAQ,CAAA,EAAG,QAAQ,OAAO,CAAA;AAC9G;AAEA,SAAS,uBAAA,CAAwB,UAAkB,OAAA,EAAyB;AAC1E,EAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAc,EAAG,QAAA,EAAU,iBAAA,CAAkB,QAAQ,CAAA,EAAG,iBAAA,CAAkB,OAAO,CAAA,EAAG,qBAAqB,CAAA;AAC5H;AAEA,eAAe,gBAAgB,eAAA,EAA+C;AAC5E,EAAA,MAAM,QAAA,GAAY,MAAM,OAAO,CAAA,EAAG,aAAA,CAAc,eAAe,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,CAAA;AAIrF,EAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA,mCAAA,CAAqC,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,QAAA,CAAS,OAAA;AAClB;AAEA,SAAS,YAAA,CAAa,OAAgB,KAAA,EAAyD;AAC7F,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,EAC/C;AACF;AAEA,SAAS,oBAAoB,MAAA,EAA2B;AACtD,EAAA,YAAA,CAAa,MAAA,CAAO,UAAU,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAA,IAAO,CAAC,MAAA,CAAO,QAAA,CAAS,OAAA,IAAW,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM;AAC7E,IAAA,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAA,KAAU,eAAA,EAAiB;AAC7C,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,IACE,OAAO,QAAA,CAAS,WAAA,KAAgB,UAChC,MAAA,CAAO,QAAA,CAAS,gBAAgB,wBAAA,EAChC;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,UAAA,EAAY,uBAAuB,CAAA;AACnE,EAAA,YAAA,CAAa,MAAA,CAAO,cAAc,cAAc,CAAA;AAChD,EAAA,YAAA,CAAa,MAAA,CAAO,eAAe,eAAe,CAAA;AAClD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACF;AAEA,eAAe,cAAc,IAAA,EAAuC;AAClE,EAAA,MAAM,eAAA,GAAkBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,cAAc,CAAA;AACtD,EAAA,MAAM,eAAA,GAAkBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,UAAU,CAAA;AAC1D,EAAA,MAAM,eAAA,GAAkBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,mBAAmB,CAAA;AACnE,EAAA,MAAM,cAAA,GAAiBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAEnD,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,eAAe,CAAA,EAAI;AACxC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,eAAe,CAAA,EAAI;AACxC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,eAAe,CAAA,oCAAA,CAAsC,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,eAAe,CAAA;AACpD,EAAA,mBAAA,CAAoB,MAAM,CAAA;AAE1B,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,IAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA,EAAiB,IAAA;AAAA,IACjB,cAAA,EAAgB;AAAA,GAClB;AACA,EAAA,IAAI,MAAM,UAAA,CAAW,eAAe,CAAA,EAAG;AACrC,IAAA,MAAA,CAAO,eAAA,GAAkB,eAAA;AAAA,EAC3B;AACA,EAAA,IAAI,MAAM,UAAA,CAAW,cAAc,CAAA,EAAG;AACpC,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,UAAA,CAAW,OAAA,EAAiB,IAAA,EAAgB,GAAA,EAA4B;AACrF,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,eAAoB,CAAA;AACnD,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,EAAS,IAAA,EAAM,EAAE,GAAA,EAAK,KAAA,EAAO,WAAW,CAAA;AAC5D,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM,CAAA;AACxB,IAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACzB,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,aAAA,EAAgB,IAAA,IAAQ,SAAS,GAAG,CAAC,CAAA;AAAA,MACpF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,eAAe,qBAAqB,IAAA,EAA6B;AAC/D,EAAA,MAAM,cAAc,MAAM,QAAA;AAAA,IACxBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,cAAc;AAAA,GAChC;AACA,EAAA,MAAM,WAAA,GAAc,YAAY,OAAA,EAAS,KAAA;AACzC,EAAA,IAAI,CAAC,eAAe,WAAA,CAAY,QAAA,CAAS,YAAY,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,YAAY,CAAA,EAAG;AAC5F,IAAA;AAAA,EACF;AACA,EAAA,MAAM,UAAA,CAAW,MAAA,EAAQ,CAAC,OAAA,EAAS,IAAA,EAAM,OAAO,OAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,EAAK,CAAA;AACzE;AAEA,eAAe,gBAAgB,IAAA,EAA+B;AAC5D,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,oBAAoB,CAAA;AAAA,IAC3CA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,mBAAmB;AAAA,GAC5C;AACA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uDAAA,EAA0D,IAAI,CAAA,CAAA,CAAG,CAAA;AACnF;AAEA,eAAe,gBAAgB,IAAA,EAA+B;AAC5D,EAAA,MAAM,UAAA,GAAa,CAACA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,WAAW,CAAA,EAAGA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,UAAU,CAAC,CAAA;AAC3F,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,IAAI,CAAA,CAAA,CAAG,CAAA;AACzE;AAEA,eAAe,kBAAkB,IAAA,EAA6B;AAC5D,EAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,IAAI,CAAA;AAE7C,EAAA,MAAMC,KAAA,CAAQ;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa,CAAC,UAAU,CAAA;AAAA,IACxB,QAAA,EAAU;AAAA,MACR,OAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ,KAAA;AAAA,IACR,GAAA,EAAK,WAAA;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAASD,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,UAAU,CAAA;AAAA,IAC3C,QAAA,EAAU,MAAA;AAAA,IACV,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACd,CAAA;AACH;AAEA,eAAe,UAAA,CAAW,MAAc,cAAA,EAAkD;AACxF,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,qBAAqB,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,kBAAkB,IAAI,CAAA;AAE5B,EAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,IAAI,CAAA;AAC7C,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,UAAU,CAAA,EAAI;AACnC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,CAAE,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,KAAA,CAAMA,MAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxD,EAAA,MAAM,sBAAsB,yBAAA,EAA0B;AACtD,EAAA,MAAMC,KAAA,CAAQ;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa,CAAC,UAAU,CAAA;AAAA,IACxB,MAAA,EAAQ,KAAA;AAAA,IACR,GAAA,EAAK,WAAA;AAAA,IACL,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAASD,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,mBAAmB,CAAA;AAAA,IACpD,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,IAC7B,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,IAAI,CAAA;AAC1C,EAAA,MAAM,oBAAoB,SAAS,CAAA;AACnC,EAAA,OAAO,cAAc,IAAI,CAAA;AAC3B;AAOA,SAAS,cAAc,KAAA,EAAgC;AACrD,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,uBAAuB,MAAM,CAAA;AAC1C,EAAA,IAAI,OAAO,EAAA,EAAI;AACb,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EAClB,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,MAAA,CAAO,EAAA;AAChB;AAEA,eAAe,UAAA,CAAW,MAAc,cAAA,EAAwC;AAC9E,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,qBAAqB,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,kBAAkB,IAAI,CAAA;AAE5B,EAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,IAAI,CAAA;AAC7C,EAAA,MAAM,KAAA,CAAMA,MAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxD,EAAA,MAAM,sBAAsB,yBAAA,EAA0B;AACtD,EAAA,MAAM,cAAA,GAAiB,qBAAqB,mBAAmB,CAAA;AAE/D,EAAA,MAAME,SAAA,GAAU,MAAMC,OAAA,CAAe;AAAA,IACnC,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa,CAAC,UAAU,CAAA;AAAA,IACxB,MAAA,EAAQ,KAAA;AAAA,IACR,GAAA,EAAK,WAAA;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAASH,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,mBAAmB,CAAA;AAAA,IACpD,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS,CAAC,mBAAA,EAAqB,cAAc,CAAA;AAAA,IAC7C,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACd,CAAA;AACD,EAAA,MAAME,UAAQ,KAAA,EAAM;AACpB,EAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,MAAS,CAAA;AACnC;AAOA,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,sBAAA;AAAA,IACN,MAAM,KAAA,EAAO;AACX,MAAA,IAAI,UAAA,GAAa,IAAA;AACjB,MAAA,KAAA,CAAM,KAAA,CAAM,CAAC,MAAA,KAAW;AACtB,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,UAAA,GAAa,KAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,MAAA;AACjC,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,UAAU,CAAA,MAAA,EAAS,UAAA,KAAe,IAAI,EAAA,GAAK,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAC1F,UAAA;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAA,iBAAQ,IAAI,IAAA,EAAK,EAAE,kBAAA,EAAmB;AAC5C,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,EAAI,KAAK,CAAA,UAAA,EAAa,KAAK,CAAA,CAAE,CAAA;AAAA,MAC3C,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAQA,SAAS,gBAAgB,KAAA,EAAgD;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,YAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,CAAC,IAAA,KAAS,KAAK,MAAM,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AAC1D;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAEA,SAAS,qBAAA,CAAsB,OAAuB,IAAA,EAAgC;AACpF,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,KAAA,CAAM,MAAA,CAAO,aAAa,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,oBAAA;AAAA,IACX,cAAc,WAAA,EAAa;AAAA,MACzB,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,UAAA,EAAY,MAAM,MAAA,CAAO;AAAA,KAC1B;AAAA,GACH;AACA,EAAA,MAAM,cAAc,MAAA,CAAO,OAAA,CAAQ,OAAO,YAAY,CAAA,CACnD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAA,KAAM,GAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA,CACzC,KAAK,GAAG,CAAA;AACX,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,cAAA,GACxB,8CAAA,GACA,EAAA;AACJ,EAAA,MAAM,UAAA,GAAa,OAAO,cAAA,IAAkB,EAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAO,cAAA,IAAkB,EAAA;AAC5C,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA,QAAA;AAAA,IACA,0BAAA;AAAA,IACA,wEAAA;AAAA,IACA,CAAA,OAAA,EAAU,UAAA,CAAW,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,QAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAE,CAAC,CAAA,QAAA,CAAA;AAAA,IACrE,aAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,CAAA,KAAA,EAAQ,WAAA,GAAc,CAAA,QAAA,EAAW,WAAW,MAAM,EAAE,CAAA,CAAA,CAAA;AAAA,IACpD,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,EAAE,CAAA;AACX;AAEA,eAAe,kBAAA,CACb,OACA,IAAA,EAC8B;AAC9B,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,OAAO,MAAW,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,gBAAgB,KAAK,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAC,OAAA,EAAS,QAAA,KAAa;AACjD,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,OAAO,GAAA,EAAK,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAClE,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAErB,MAAA,IAAI,QAAA,KAAa,GAAA,IAAO,QAAA,KAAa,aAAA,EAAe;AAClD,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,6BAA6B,CAAA;AACvE,UAAA,QAAA,CAAS,IAAI,wCAAwC,CAAA;AACrD,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,4BAA4B,CAAA;AACtE,QAAA,QAAA,CAAS,GAAA,CAAI,qBAAA,CAAsB,KAAA,EAAO,WAAW,CAAC,CAAA;AACtD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,KAAa,aAAA,IAAiB,KAAA,CAAM,cAAA,EAAgB;AACtD,QAAA,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,2BAA2B,CAAA;AACrE,QAAA,QAAA,CAAS,GAAA,CAAI,MAAM,QAAA,CAAS,KAAA,CAAM,cAAc,CAAC,CAAA;AACjD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAChD,MAAA,MAAM,QAAA,GAAWF,KAAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAM,YAAY,CAAA;AACtD,MAAA,MAAM,iBAAiBA,KAAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,IAAIA,KAAAA,CAAK,GAAA;AACvD,MAAA,IAAI,CAAC,SAAS,UAAA,CAAW,cAAc,KAAK,CAAE,MAAM,UAAA,CAAW,QAAQ,CAAA,EAAI;AACzE,QAAA,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,6BAA6B,CAAA;AACvE,QAAA,QAAA,CAAS,IAAI,WAAW,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,UAAU,GAAA,EAAK,EAAE,gBAAgB,cAAA,CAAe,YAAY,GAAG,CAAA;AACxE,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,IACvC,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACpB,MAAA,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,6BAA6B,CAAA;AACvE,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,gBAAgB,CAAA;AAAA,IACxE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAqB;AACpC,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAA;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,OAAO,CAAA;AAC5B,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,MAAM;AACxB,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,OAAO,CAAA;AAC3B,MAAA,OAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,oBAAoB,IAAI,CAAA,CAAA;AAAA,IAC7B,IAAA;AAAA,IACA,KAAA,EAAO,MACL,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAC7B,MAAA,MAAA,CAAO,MAAM,MAAM;AACjB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAC;AAAA,GACL;AACF;AAEA,eAAe,YAAA,CAAa,MAAc,IAAA,EAA6B;AACrE,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAA,EAAO,IAAI,CAAA;AACnD,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,CAAA,WAAA,EAAc,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,IAAA,EAAO,MAAA,CAAO,GAAG,CAAA;AAAA,GAC3F;AACA,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,MAAS,CAAA;AACnC;AAiBA,IAAM,2BAAA,GAA8BA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,WAAW,aAAa,CAAA;AAE9E,SAAS,gBAAA,CAAiB,OAA2B,QAAA,EAA0B;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,EAAA,OAAO,OAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,IAAI,MAAA,GAAS,QAAA;AAC1D;AAEA,SAAS,wBAAA,CACP,MACA,OAAA,EAC2B;AAC3B,EAAA,OAAO;AAAA,IACL,YAAYA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,UAAU,2BAA2B,CAAA;AAAA,IAC5E,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,gBAAA,CAAiB,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAAA,MAC3C,MAAA,EAAQ,gBAAA,CAAiB,OAAA,CAAQ,MAAA,EAAQ,GAAG;AAAA,KAC9C;AAAA,IACA,IAAA,EAAM,gBAAA,CAAiB,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IACzC,SAAA,EAAW,QAAQ,SAAA,KAAc;AAAA,GACnC;AACF;AAqBA,eAAe,cAAA,GAA4C;AAGzD,EAAA,MAAM,UAAA,GAAa,CAAC,YAAA,EAAc,kBAAkB,CAAA;AACpD,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAe,MAAM;AAAA;AAAA,QAA0B;AAAA,OAAA;AACrD,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAEA,eAAe,iBAAA,CACb,OACA,OAAA,EACe;AACf,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAA,EAAO,QAAQ,IAAI,CAAA;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,CAAMA,MAAK,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,QAAA,CAAS,OAAO,EAAE,QAAA,EAAU,MAAM,CAAA;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,QACvC,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,iBAAA,EAAmB;AAAA,OACpB,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,OAAA,EAAQ;AACnC,MAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,SAAA,EAAW,eAAe,CAAA;AACxD,MAAA,MAAM,IAAA,CAAK,WAAW,EAAE,IAAA,EAAM,QAAQ,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AACnE,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAM,OAAO,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,YAAYA,KAAAA,CAAK,QAAA,CAAS,MAAM,IAAA,EAAM,OAAA,CAAQ,UAAU,CAAC,CAAA,CAAE,CAAA;AACzE;AAEA,eAAe,eAAA,CAAgB,MAAc,OAAA,EAA2C;AACtF,EAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,IAAA,EAAM,OAAO,CAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,SAAA,GAAY,MAAM,aAAA,CAAc,IAAI,CAAA,GAAI,MAAM,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAC3F,EAAA,MAAM,iBAAA,CAAkB,OAAO,QAAQ,CAAA;AACzC;AAEA,eAAe,uBAAuB,IAAA,EAA2C;AAC/E,EAAA,MAAM,KAAA,GAAQ,MAAM,gBAAA,CAAqCA,KAAAA,CAAK,KAAK,IAAA,EAAM,MAAA,EAAQ,qBAAqB,CAAC,CAAA;AACvG,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,8BAA8BA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,qBAAqB,CAAC,CAAA,+BAAA;AAAA,GAC9E;AACF;AAEA,eAAe,gBAAgB,OAAA,EAAyD;AACtF,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB,gBAAA,CAAiB,OAAO,CAAC,CAAA;AACvE,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,SAAS,QAAA,CAAS,GAAA;AAAA,QACvB,IAAA,EAAM,SAAS,QAAA,CAAS,IAAA;AAAA,QACxB,OAAA,EAAS,SAAS,QAAA,CAAS,OAAA;AAAA,QAC3B,WAAA,EAAa,QAAA,CAAS,QAAA,CAAS,WAAA,IAAe,IAAA;AAAA,QAC9C,UAAA,EAAY,SAAS,QAAA,CAAS,UAAA;AAAA,QAC9B,OAAA,EAAS,SAAS,QAAA,CAAS;AAAA;AAC7B,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,EAAkB;AACrC,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,uBAAA,EAAyB,KAAK,OAAO,CAAA;AACzD,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAA0C,GAAA,CAAI,MAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAC/F,EAAA,MAAM,MAAM,aAAA,EAAc,EAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAc,EAAG,cAAc,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AACnG,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;AAEA,eAAe,kBAAA,CACb,UACA,OAAA,EAC6B;AAC7B,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,OAAO,sBAAA,CAAuB,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,EAAkB;AACrC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,QAAA;AACnC,EAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,QAAA,EAAU,OAAO,CAAA;AAC3D,EAAA,MAAM,SAAS,OAAA,KAAY,QAAA,GAAW,IAAA,GAAO,MAAM,iBAAqC,SAAS,CAAA;AACjG,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,OAAO,CAAC,CAAA,OAAA,CAAA,EAAW,KAAK,OAAO,CAAA;AAC/H,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAiD,GAAA,CAAI,MAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AACrG,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,aAAA,CAAc,QAAA,CAAS,OAAA;AAClD,EAAA,MAAM,aAAA,GAAgB,uBAAA,CAAwB,QAAA,EAAU,WAAW,CAAA;AACnE,EAAA,MAAM,KAAA,CAAMA,MAAK,OAAA,CAAQ,aAAa,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,EAAA,MAAM,SAAA,CAAU,eAAe,CAAA,EAAG,IAAA,CAAK,UAAU,MAAA,CAAO,aAAA,EAAe,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AACnF,EAAA,OAAO,MAAA,CAAO,aAAA;AAChB;AAEA,SAAS,UAAU,KAAA,EAAsB;AACvC,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C;AAEA,SAAS,mBAAA,CAAoB,UAA8B,WAAA,EAA2C;AACpG,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,QAAA,EAAU,WAAW,CAAA;AACtD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,gCAAA,CAAiC,SAAS,SAAS,CAAA;AAC5D;AAEA,eAAe,iBAAA,CAAkB,QAAA,EAAkB,KAAA,EAAe,OAAA,EAA2C;AAC3G,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,QAAA,EAAU,OAAO,CAAA;AAC3D,EAAA,MAAM,cAAc,MAAM,QAAA,CAAkBA,KAAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,oCAAA,CAAqC,WAAA,EAAa,QAAQ,CAAA;AACzE,EAAA,SAAA,CAAU,2BAAA,CAA4B,KAAA,CAAM,MAAM,CAAC,CAAA;AACnD,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,EACrB;AACF;AAEA,eAAe,gBAAgB,OAAA,EAAgD;AAC7E,EAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,cAAc,MAAM,QAAA,CAAkBA,MAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACvE,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAO,OAAO,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,oCAAA,CAAqC,WAAA,EAAa,QAAQ,CAAA;AAC7E,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,SAAA,CAAU,2BAAA,CAA4B,KAAA,CAAM,UAAU,CAAC,CAAA;AACvD,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,+BAA+B,WAAW,CAAA;AAE3D,EAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,EAAkB;AACrC,EAAA,MAAM,WAAW,MAAM,SAAA;AAAA,IACrB,GAAG,IAAA,CAAK,OAAO,2BAA2B,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAC,CAAA,MAAA,CAAA;AAAA,IAC/E;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAA,EAAU,SAAS,QAAA,CAAS,GAAA;AAAA,QAC5B,YAAA,EAAc,SAAS,QAAA,CAAS,OAAA;AAAA,QAChC,IAAA,EAAM;AAAA,OACP;AAAA;AACH,GACF;AACA,EAAA,SAAA,CAAU,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,UAAU,CAAA;AAC1C;AAEA,eAAe,iBAAA,GAAoD;AACjE,EAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,EAAkB;AACrC,EAAA,MAAM,SAAS,MAAM,SAAA;AAAA,IACnB,CAAA,EAAG,KAAK,OAAO,CAAA,uBAAA,CAAA;AAAA,IACf,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA;AAAM,GACtB;AACA,EAAA,OAAO,MAAA,CAAO,QAAA;AAChB;AAEA,eAAe,mBACb,OAAA,EAC8B;AAC9B,EAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,EAAkB;AACrC,EAAA,OAAO,SAAA,CAA+B,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,uBAAA,CAAA,EAA2B;AAAA,IAC9E,MAAA,EAAQ,MAAA;AAAA,IACR,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,IAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,iBAAiB,OAAA,CAAQ;AAAA,KAC1B;AAAA,GACF,CAAA;AACH;AAEA,SAAS,aAAA,CAAiD,SAAiB,KAAA,EAAU;AACnF,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,iBAAA,EAAmB;AAAA,GACrB;AACF;AAEA,eAAe,cAAA,GAAgC;AAC7C,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,eAAA;AAAA,IACA;AAAA,MACE,WAAA,EACE,wiBAAA;AAAA,MACF,aAAa,EAAC;AAAA,MACd,cAAc,wBAAA,CAAyB;AAAA,KACzC;AAAA,IACA,YAAY;AACV,MAAA,MAAM,iBAAA,GAAoB,yBAAyB,KAAA,CAAM;AAAA,QACvD,QAAA,EAAU,MAAM,iBAAA;AAAkB,OACnC,CAAA;AACD,MAAA,OAAO,aAAA,CAAc,iDAAiD,iBAAiB,CAAA;AAAA,IACzF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,gBAAA;AAAA,IACA;AAAA,MACE,WAAA,EACE,i0BAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,wBAAA,CAAyB,KAAA,CAAM,IAAA,CAAK,QAAA;AAAA,UACxC;AAAA,SACF;AAAA,QACA,eAAA,EAAiB,wBAAA,CAAyB,KAAA,CAAM,eAAA,CAAgB,QAAA;AAAA,UAC9D;AAAA;AACF,OACF;AAAA,MACA,cAAc,yBAAA,CAA0B;AAAA,KAC1C;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAgB,KAAM;AACnC,MAAA,MAAM,SAAS,MAAM,kBAAA,CAAmB,EAAE,IAAA,EAAM,iBAAiB,CAAA;AACjE,MAAA,MAAM,iBAAA,GAAoB,0BAA0B,KAAA,CAAM;AAAA,QACxD,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,cAAc,MAAA,CAAO;AAAA,OACtB,CAAA;AACD,MAAA,OAAO,aAAA,CAAc,yBAAyB,iBAAiB,CAAA;AAAA,IACjE;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,aAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,mDAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,OACjC;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,QAAQ,CAAA,CAAE,KAAA;AAAA,UACR,EAAE,MAAA,CAAO;AAAA,YACP,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,YACd,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,YACf,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,YAClB,aAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,YAC5C,YAAY,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,YACzC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,YAC7B,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,WAC9B;AAAA;AACH;AACF,KACF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAU,KAAM;AAClC,MAAA,MAAM,iBAAA,GAAoB,EAAE,MAAA,EAAQ,MAAM,gBAAgB,EAAE,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE;AACpF,MAAA,OAAO,aAAA,CAAc,0BAA0B,iBAAiB,CAAA;AAAA,IAClE;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,gBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,iDAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC7B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,OACjC;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,aAAA,EAAe,EAAE,OAAA;AAAQ;AAC3B,KACF;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,WAAU,KAAM;AAClD,MAAA,MAAM,iBAAA,GAAoB;AAAA,QACxB,aAAA,EAAe,MAAM,kBAAA,CAAmB,KAAA,EAAO,EAAE,OAAA,EAAS,SAAA,EAAW,WAAW;AAAA,OAClF;AACA,MAAA,OAAO,aAAA,CAAc,kCAAkC,iBAAiB,CAAA;AAAA,IAC1E;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,iBAAA;AAAA,IACA;AAAA,MACE,WAAA,EACE,oGAAA;AAAA,MACF,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC7B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,OACvC;AAAA,MACA,cAAc,2BAAA,CAA4B;AAAA,KAC5C;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,SAAS,SAAA,EAAW,SAAA,EAAW,gBAAe,KAAM;AAClE,MAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,KAAA,EAAO,EAAE,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAClF,MAAA,MAAM,iBAAA,GAAoB,4BAA4B,QAAA,EAAU;AAAA,QAC9D,gBAAgB,cAAA,KAAmB;AAAA,OACpC,CAAA;AACD,MAAA,OAAO,aAAA,CAAc,6CAA6C,iBAAiB,CAAA;AAAA,IACrF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,oBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,yEAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,QAClB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC7B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,OACjC;AAAA,MACA,cAAc,0BAAA,CAA2B;AAAA,KAC3C;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,SAAS,OAAA,EAAS,SAAA,EAAW,WAAU,KAAM;AAC3D,MAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,KAAA,EAAO,EAAE,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAClF,MAAA,MAAM,iBAAA,GAAoB,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAC/D,MAAA,OAAO,aAAA,CAAc,wCAAwC,iBAAiB,CAAA;AAAA,IAChF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,sBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,0DAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,QAChB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC7B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,OACjC;AAAA,MACA,cAAc,2BAAA,CAA4B;AAAA,KAC5C;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,MAAM,OAAA,EAAS,SAAA,EAAW,WAAU,KAAM;AACxD,MAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,KAAA,EAAO,EAAE,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAClF,MAAA,MAAM,oBAAoB,2BAAA,CAA4B,KAAA;AAAA,QACpD,oCAAA,CAAqC,MAAM,QAAQ;AAAA,OACrD;AACA,MAAA,OAAO,aAAA,CAAc,wCAAwC,iBAAiB,CAAA;AAAA,IAChF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,mBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,oEAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,QACpB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,QACf,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,QAChB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,OAC/B;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,MAAM,KAAA,EAAO,IAAA,EAAM,SAAQ,KAAM;AAC1D,MAAA,MAAM,WAAW,MAAM,kBAAA,CAAmB,OAAO,EAAE,OAAA,EAAS,WAAW,CAAA;AACvE,MAAA,MAAM,UAAA,GAAa,oCAAA,CAAqC,IAAA,EAAM,QAAQ,CAAA;AACtE,MAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,QAAA,OAAO,aAAA;AAAA,UACL,0EAAA;AAAA,UACA,4BAA4B,KAAA,CAAM;AAAA,YAChC,MAAA,EAAQ,SAAA;AAAA,YACR,KAAA,EAAO,KAAA;AAAA,YACP,QAAQ,UAAA,CAAW;AAAA,WACpB;AAAA,SACH;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,EAAkB;AACrC,MAAA,MAAM,WAAW,MAAM,SAAA;AAAA,QACrB,GAAG,IAAA,CAAK,OAAO,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,SAAS,CAAC,CAAA,MAAA,CAAA;AAAA,QACvE;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,KAAA;AAAA,YACA,IAAA;AAAA,YACE,QAAA,EAAU,SAAS,QAAA,CAAS,GAAA;AAAA,YAC5B,YAAA,EAAc,SAAS,QAAA,CAAS,OAAA;AAAA,YAChC,IAAA,EAAM,+BAA+B,IAAI;AAAA,WAC1C;AAAA;AACL,OACF;AACA,MAAA,OAAO,aAAA;AAAA,QACL,0BAAA;AAAA,QACA,4BAA4B,KAAA,CAAM,EAAE,QAAQ,SAAA,EAAW,GAAG,UAAU;AAAA,OACtE;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,oBAAA,EAAsB,CAAA;AACjD;AAEA,eAAe,oBAAoB,KAAA,EAAsC;AACvE,EAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,wBAAA,CAAyB,KAAA,CAAM,MAAM,CAAA;AAC3D,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,eAAe,CAAA;AAAA,IAC/B,CAAA,EAAG,KAAK,SAAA,CAAU,KAAA,CAAM,OAAO,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA;AAAA,GACnD;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,oBAAoB,CAAA;AAAA,IACpC,CAAA,EAAG,KAAK,SAAA,CAAU,KAAA,CAAM,OAAO,YAAA,EAAc,IAAA,EAAM,CAAC,CAAC;AAAA;AAAA,GACvD;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,qBAAqB,CAAA;AAAA,IACrC,CAAA,EAAG,KAAK,SAAA,CAAU,KAAA,CAAM,OAAO,aAAA,EAAe,IAAA,EAAM,CAAC,CAAC;AAAA;AAAA,GACxD;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,qBAAqB,CAAA;AAAA,IACrC,GAAG,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAA,EAAM,CAAC,CAAC;AAAA;AAAA,GAC3C;AACF;AAEA,SAAS,eAAe,YAAA,EAA8B;AACpD,EAAA,IAAI,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AACjC,IAAA,OAAO,yBAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,EAAG;AAChC,IAAA,OAAO,uCAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,iCAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AACjC,IAAA,OAAO,eAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AACjC,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAa,QAAA,CAAS,MAAM,KAAK,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA,EAAG;AACnE,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,OAAO,0BAAA;AACT;AAEA,eAAe,YAAA,CAAa,MAAc,SAAA,EAA0C;AAClF,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,SAAS,CAAA,EAAI;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AACjE,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,CAAA;AACpD,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,KAAA,CAAM,KAAK,GAAI,MAAM,YAAA,CAAa,IAAA,EAAM,YAAY,CAAE,CAAA;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAeA,MAAK,QAAA,CAAS,IAAA,EAAM,YAAY,CAAA,CAAE,UAAA,CAAWA,KAAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAC/E,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,YAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA,EAAa,eAAe,YAAY;AAAA,KACzC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,0BAA0B,KAAA,EAA8C;AACrF,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,KAAA,CAAM,IAAA,EAAMA,MAAK,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAC1E,EAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,KAAA,CAAM,IAAA,EAAMA,MAAK,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,QAAQ,CAAC,CAAA;AAClF,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA;AACzB,EAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,cAAc,KAAA,CAAM,cAAA;AAAA,MACpB,YAAA,EAAc,YAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,SAAS,KAAA,EAAsC;AAC5D,EAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAChC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,aAAA,CAAc,CAAA,CAAE,YAAY,CAAC,CAAA,EAAG;AACrF,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,YAAY,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAC1B;AAEA,eAAe,YAAA,CACb,IAAA,EACA,SAAA,EACA,SAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,aAAA,CAAc,IAAI,CAAA,GAAI,MAAM,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAKlF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,EAAA,GAAK,cAAc,KAAK,CAAA;AAC9B,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,yBAAA,CAA0B,KAAK,CAAA;AACnD,EAAA,IAAI,CAAC,MAAM,eAAA,EAAiB;AAC1B,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,EAC/E;AAEA,EAAA,MAAM,OAAA,GAAU,GAAG,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAC,CAAA,GAAA,EAAM,OAAO,IAAI,CAAA,CAAA;AAChE,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,MAAM,MAAA,CAAO,QAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,8BAAA,CAAA,EAAkC;AAAA,IACxE,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAA,EAAe,CAAA,OAAA,EAAU,MAAA,CAAO,YAAY,CAAA;AAAA,KAC9C;AAAA,IACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,GAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,YAAA,EAAc,CAAA,CAAE,YAAA,EAAc,WAAA,EAAa,CAAA,CAAE,WAAA,EAAY,CAAE;AAAA,KACvF;AAAA,GACF,CAAA;AAED,EAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACjB,IAAA,MAAM,SAAA,GAAa,MAAM,SAAA,CAAU,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC1D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,UAAU,KAAA,IAAS,SAAA,CAAU,UAAU,CAAA,CAAE,CAAA;AAAA,EAC5F;AAEA,EAAA,MAAM,EAAE,IAAA,EAAK,GAAK,MAAM,UAAU,IAAA,EAAK;AAGvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,YAAA,KAAiB,KAAK,YAAY,CAAA;AACpE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,CAAK,YAAY,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,gBAAgB,IAAA,CAAK;AAAA,OACvB;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,MAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,IAC/E;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,oBAAA,CAAqB,GAAA,EAAK,SAAS,IAAA,CAAK,YAAY,CAAC,CAAA,CAAE,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAK,CAAA;AACnC,EAAA,MAAM,sBAAA,GAAyB,eAAA;AAC/B,EAAA,MAAM,uBAAuB,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,sBAAsB,CAAA;AACxF,EAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,sBAAsB,CAAA,oBAAA,CAAsB,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,uBAAA,GAA0B,0BAAA;AAChC,EAAA,MAAM,qBAAA,GAAwB,MAAM,UAAA,CAAWA,KAAAA,CAAK,KAAK,KAAA,CAAM,IAAA,EAAM,uBAAuB,CAAC,CAAA;AAC7F,EAAA,MAAM,aAAA,GAAgB,wBAAA,CAAyB,KAAA,CAAM,MAAM,CAAA;AAE3D,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,gCAAA,CAAA,EAAoC;AAAA,IAC5E,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAA,EAAe,CAAA,OAAA,EAAU,MAAA,CAAO,YAAY,CAAA;AAAA,KAC9C;AAAA,IACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,GAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA;AAAA,MACvB,aAAA;AAAA,MACA,sBAAA;AAAA,MACA,uBAAA,EAAyB,wBAAwB,uBAAA,GAA0B;AAAA,KAC5E;AAAA,GACF,CAAA;AAED,EAAA,IAAI,CAAC,YAAY,EAAA,EAAI;AACnB,IAAA,MAAM,SAAA,GAAa,MAAM,WAAA,CAAY,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC5D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,UAAU,KAAA,IAAS,WAAA,CAAY,UAAU,CAAA,CAAE,CAAA;AAAA,EAC5F;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC3C;AASA,IAAI,wBAAA;AAaJ,eAAe,sBAAA,GAAsD;AACnE,EAAA,IAAI,wBAAA,EAA0B;AAC5B,IAAA,OAAO,wBAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAaA,MAAK,OAAA,CAAQA,KAAAA,CAAK,QAAQ,IAAI,CAAA,EAAG,MAAM,cAAc,CAAA;AACxE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AAEN,IAAA,wBAAA,GAA2B,EAAE,WAAA,EAAa,GAAA,EAAK,GAAA,EAAK,GAAA,EAAI;AACxD,IAAA,OAAO,wBAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAIhC,EAAA,MAAM,aAAa,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,OAAA;AACzE,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,YAAA,GAAe,sBAAsB,CAAA;AACnE,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,UAAA,CAAW,YAAY,CAAA,EAAG;AAG9D,IAAA,WAAA,GAAc,cAAA;AAAA,EAChB,CAAA,MAAO;AAOL,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAMI,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,MAAA,MAAM,aAAA,GAAgBA,QAAAA,CAAQ,OAAA,CAAQ,mCAAmC,CAAA;AACzE,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,aAAA,EAAe,MAAM,CAAA;AACtD,MAAA,MAAM,aAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,CAA2B,OAAA;AACtE,MAAA,IAAI,OAAO,aAAA,KAAkB,QAAA,IAAY,aAAA,CAAc,SAAS,CAAA,EAAG;AACjE,QAAA,QAAA,GAAW,IAAI,aAAa,CAAA,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAKF;AAAA,IACF;AACA,IAAA,WAAA,GAAc,QAAA;AAAA,EAChB;AACA,EAAA,wBAAA,GAA2B;AAAA,IACzB,WAAA;AAAA,IACA,GAAA,EAAK,IAAI,UAAU,CAAA;AAAA,GACrB;AACA,EAAA,OAAO,wBAAA;AACT;AAEA,eAAe,UAAU,MAAA,EAA+B;AACtD,EAAA,MAAM,GAAA,GAAMJ,MACT,QAAA,CAAS,MAAM,EACf,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA,CAC/B,WAAA,EAAY;AAKf,EAAA,MAAM,kBAAA,GAAqB,MAAM,sBAAA,EAAuB;AACxD,EAAA,MAAM,KAAA,CAAMA,MAAK,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACzD,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA;AAAA,IAChC,GAAG,IAAA,CAAK,SAAA;AAAA,MACN;AAAA,QACE,IAAA,EAAM,gBAAgB,GAAG,CAAA,CAAA;AAAA,QACzB,OAAA,EAAS,OAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,cAAA,EAAgB,aAAA;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,KAAA,EAAO,mBAAA;AAAA,QACP,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA,UAKP,WAAA,EAAa,sBAAA;AAAA,UACb,KAAA,EAAO,0EAAA;AAAA,UACP,GAAA,EAAK,kDAAA;AAAA,UACL,SAAA,EAAW,+BAAA;AAAA,UACX,QAAA,EAAU,oCAAA;AAAA,UACV,OAAA,EAAS;AAAA,SACX;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,wBAAwB,kBAAA,CAAmB;AAAA,SAC7C;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,kBAAA,EAAoB,SAAA;AAAA,UACpB,eAAe,kBAAA,CAAmB,GAAA;AAAA,UAClC,aAAA,EAAe,SAAA;AAAA,UACf,cAAA,EAAgB,SAAA;AAAA,UAChB,kBAAA,EAAoB,SAAA;AAAA,UACpB,KAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa,SAAA;AAAA,UACb,UAAA,EAAY;AAAA,SACd;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,kBAAA,EAAoB,SAAA;AAAA,UACpB,KAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD;AAAA;AAAA,GACH;AAKA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,qBAAqB,CAAA;AAAA,IACvC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACF;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,eAAe,CAAA;AAAA,IACjC,GAAG,IAAA,CAAK,SAAA;AAAA,MACN;AAAA,QACE,eAAA,EAAiB;AAAA,UACf,MAAA,EAAQ,QAAA;AAAA,UACR,GAAA,EAAK,CAAC,KAAA,EAAO,cAAA,EAAgB,QAAQ,CAAA;AAAA,UACrC,MAAA,EAAQ,UAAA;AAAA,UACR,gBAAA,EAAkB,UAAA;AAAA,UAClB,GAAA,EAAK,WAAA;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,MAAA,EAAQ,MAAA;AAAA,UACR,WAAA,EAAa,IAAA;AAAA,UACb,cAAA,EAAgB,IAAA;AAAA,UAChB,SAAA,EAAW,IAAA;AAAA,UACX,MAAA,EAAQ,IAAA;AAAA,UACR,wBAAA,EAA0B,IAAA;AAAA,UAC1B,eAAA,EAAiB,IAAA;AAAA,UACjB,YAAA,EAAc,IAAA;AAAA,UACd,gCAAA,EAAkC,IAAA;AAAA,UAClC,iBAAA,EAAmB,IAAA;AAAA,UACnB,KAAA,EAAO,CAAC,MAAM;AAAA,SAChB;AAAA;AAAA;AAAA;AAAA,QAIA,OAAA,EAAS,CAAC,KAAA,EAAO,cAAc;AAAA,OACjC;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD;AAAA;AAAA,GACH;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,aAAa,CAAA;AAAA,IACtC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAAub,GAAG,CAAA;AAAA,SAAA,EAAgB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAC/c;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,cAAc,CAAA;AAAA,IACvC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAAyoC,GAAG,YAAY,GAAG,CAAA;AAAA,oBAAA,EAAgC,GAAG,CAAA;AAAA;AAAA;AAAA,oBAAA,EAAoG,GAAG,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAAi3C,GAAG,CAAA;AAAA;AAAA;AAAA,sBAAA,EAAyF,GAAG,CAAA;AAAA;AAAA,8BAAA,EAAyI,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAA07B,GAAG,YAAY,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAA+iC,GAAG,YAAY,GAAG,CAAA;AAAA;AAAA;AAAA,oBAAA,EAAgG,GAAG,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,GACn/J;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,YAAY,CAAA;AAAA,IACrC,CAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAAmd,GAAG,CAAA;AAAA;AAAA,oBAAA,EAAmH,GAAG,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAA8d,GAAG,CAAA;AAAA,+CAAA,EAAwD,GAAG,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAA+yB,GAAG,CAAA;AAAA,2CAAA,EAAoD,GAAG,CAAA;AAAA;;AAAA;AAAA;AAAA,GACn9D;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAAA,IACpC,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,8BAAA,EAAua,GAAG,CAAA;AAAA;AAAA,0DAAA,EAAmF,GAAG,CAAA;AAAA;AAAA,2DAAA,EAA+H,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA,GACpoB;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,cAAc,CAAA;AAAA,IACvC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAAyY,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAC9Y;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAAA,IACpC,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,GACF;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,mBAAmB,CAAA;AAAA,IAC5C;AAAA,GACF;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,YAAY,CAAA;AAAA,IAC9B,IAAI,GAAG,CAAA;AAAA,CAAA,EAA8G,GAAG,aAAa,GAAG,CAAA;AAAA,CAAA,EAAyF,GAAG,CAAA;AAAA,CAAA,EAAkF,GAAG,CAAA;AAAA,CAAA,EAAwD,GAAG,CAAA;AAAA,CAAA,EAAoC,GAAG,CAAA;AAAA,CAAA,EAAwH,GAAG,CAAA;AAAA,CAAA,EAA+G,GAAG,CAAA;AAAA,CAAA,EAA6F,GAAG,CAAA;AAAA,CAAA,EAAwE,GAAG,CAAA;AAAA,CAAA,EAAiM,GAAG,CAAA;AAAA,CAAA,EAAwH,GAAG,CAAA;AAAA,CAAA,EAA6E,GAAG,CAAA;AAAA,CAAA,EAAmG,GAAG,CAAA;AAAA,CAAA,EAAmD,GAAG,CAAA;AAAA,CAAA,EAAgC,GAAG,SAAS,GAAG,CAAA;AAAA;AAAA,GAC/4C;AACA,EAAA,MAAM,UAAUA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,YAAY,GAAG,qCAAqC,CAAA;AACtF,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC7B,CAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACF;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC7B,CAAA;;AAAA;AAAA;AAAA,GACF;AACA,EAAA,MAAM,SAAA;AAAA,IACJA,KAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC7B,KAAK,GAAG;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACV;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAA6B,MAAM,CAAA,CAAE,CAAA;AACnD;AAEO,SAAS,YAAA,GAAwB;AACtC,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,EAAA,OAAA,CACG,KAAK,MAAM,CAAA,CACX,YAAY,4DAA4D,CAAA,CACxE,QAAQ,OAAO,CAAA;AAElB,EAAA,MAAM,QAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,CAAE,YAAY,8BAA8B,CAAA;AAEjF,EAAA,KAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,wCAAwC,CAAA,CACpD,QAAA,CAAS,OAAA,EAAS,4BAAA,EAA8B,SAAS,CAAA,CACzD,MAAA,CAAO,OAAO,GAAA,KAAgB;AAC7B,IAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,EACnC,CAAC,CAAA;AAEH,EAAA,KAAA,CACG,OAAA,CAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,kCAAkC,CAAA,CAC9C,MAAA,CAAO,qBAAA,EAAuB,6BAA6B,CAAA,CAC3D,MAAA,CAAO,OAAO,OAAA,KAA8B;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC5D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AACnF,IAAA,IAAI,CAAC,OAAO,eAAA,EAAiB;AAC3B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,KAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,6DAA6D,CAAA,CACzE,MAAA,CAAO,qBAAA,EAAuB,6BAA6B,CAAA,CAC3D,MAAA,CAAO,oBAAA,EAAsB,sCAAsC,CAAA,CACnE,MAAA;AAAA,IACC,cAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAA0B;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAA,CAAQ,mBAAmB,IAAI,CAAA;AAC1F,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AACnF,IAAA,IAAI,OAAA,CAAQ,cAAc,IAAA,EAAM;AAC9B,MAAA,MAAM,EAAA,GAAK,cAAc,MAAM,CAAA;AAC/B,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,KAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA;AAAA,IACC;AAAA,IAED,MAAA,CAAO,qBAAA,EAAuB,6BAA6B,CAAA,CAC3D,MAAA,CAAO,OAAO,OAAA,KAA0B;AACvC,IAAA,MAAMK,MAAAA,GAAQ,MAAM,aAAA,CAAc,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC3D,IAAA,MAAM,EAAA,GAAK,cAAcA,MAAK,CAAA;AAC9B,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,IACrB;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,KAAA,CACG,QAAQ,KAAK,CAAA,CACb,WAAA,CAAY,wCAAwC,EACpD,MAAA,CAAO,qBAAA,EAAuB,6BAA6B,CAAA,CAC3D,OAAO,oBAAA,EAAsB,sCAAsC,CAAA,CACnE,MAAA,CAAO,OAAO,OAAA,KAA0B;AACvC,IAAA,MAAM,WAAW,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAA,CAAQ,mBAAmB,IAAI,CAAA;AAAA,EAC7E,CAAC,CAAA;AAEH,EAAA,KAAA,CACG,QAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,iDAAiD,EAC7D,MAAA,CAAO,qBAAA,EAAuB,6BAA6B,CAAA,CAC3D,OAAO,eAAA,EAAiB,sBAAA,EAAwB,MAAM,CAAA,CACtD,MAAA,CAAO,OAAO,OAAA,KAA4B;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,IAAQ,MAAM,CAAA;AAC1C,IAAA,MAAM,YAAA,CAAa,iBAAiB,OAAO,CAAA,EAAG,OAAO,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,IAAI,CAAA;AAAA,EACnF,CAAC,CAAA;AAEH,EAAA,KAAA,CACG,OAAA,CAAQ,YAAY,CAAA,CACpB,WAAA;AAAA,IACC;AAAA,GACF,CACC,MAAA,CAAO,qBAAA,EAAuB,6BAA6B,CAAA,CAC3D,MAAA,CAAO,iBAAA,EAAmB,yCAAyC,CAAA,CACnE,MAAA,CAAO,cAAA,EAAgB,2BAAA,EAA6B,MAAM,CAAA,CAC1D,MAAA,CAAO,eAAA,EAAiB,4BAAA,EAA8B,KAAK,CAAA,CAC3D,MAAA,CAAO,eAAA,EAAiB,0CAAA,EAA4C,MAAM,CAAA,CAC1E,MAAA,CAAO,cAAA,EAAgB,6CAA6C,CAAA,CACpE,MAAA,CAAO,OAAO,OAAA,KAA+B;AAC5C,IAAA,MAAM,eAAA,CAAgB,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAO,CAAA;AAAA,EAC1D,CAAC,CAAA;AAEH,EAAA,KAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,6DAA6D,CAAA,CACzE,MAAA,CAAO,qBAAA,EAAuB,6BAA6B,CAAA,CAC3D,MAAA,CAAO,cAAA,EAAgB,iDAAiD,CAAA,CACxE,MAAA;AAAA,IACC,cAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAA4B;AACzC,IAAA,MAAM,YAAA;AAAA,MACJ,iBAAiB,OAAO,CAAA;AAAA,MACxB,QAAQ,SAAA,KAAc,IAAA;AAAA,MACtB,QAAQ,SAAA,KAAc;AAAA,KACxB;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,MAAM,QAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,CAAE,YAAY,wCAAwC,CAAA;AAE3F,EAAA,MAAM,eAAe,KAAA,CAClB,OAAA,CAAQ,SAAS,CAAA,CACjB,YAAY,oCAAoC,CAAA;AAEnD,EAAA,YAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,qDAAqD,CAAA,CACjE,OAAO,YAAY;AAClB,IAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,EAAkB;AACzC,IAAA,SAAA,CAAU,EAAE,UAAU,CAAA;AAAA,EACxB,CAAC,CAAA;AAEH,EAAA,YAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA;AAAA,IACC;AAAA,GACF,CACC,cAAA,CAAe,eAAA,EAAiB,wBAAwB,CAAA,CACxD,cAAA;AAAA,IACC,kCAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAuD;AAGpE,IAAA,MAAM,MAAA,GAAS,yBAAyB,SAAA,CAAU;AAAA,MAChD,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AACD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AACnC,MAAA,MAAM,QAAQ,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,oBAAoB,oBAAA,GAAuB,QAAA;AAC5E,MAAA,MAAM,IAAI,MAAM,CAAA,EAAG,KAAK,KAAK,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AACnD,IAAA,SAAA,CAAU,MAAM,CAAA;AAAA,EAClB,CAAC,CAAA;AAEH,EAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,YAAY,8BAA8B,CAAA;AAEtF,EAAA,WAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,8CAA8C,EAC1D,MAAA,CAAO,0BAAA,EAA4B,6BAA6B,CAAA,CAChE,OAAO,qBAAA,EAAuB,uDAAuD,CAAA,CACrF,MAAA,CAAO,OAAO,OAAA,KAA+B;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAO,CAAA;AAC5C,IAAA,SAAA,CAAU,EAAE,QAAQ,CAAA;AAAA,EACtB,CAAC,CAAA;AAEH,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAE,YAAY,yBAAyB,CAAA;AAE/E,EAAA,UAAA,CACG,OAAA,CAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,0CAA0C,CAAA,CACtD,QAAA,CAAS,SAAA,EAAW,YAAY,CAAA,CAChC,MAAA,CAAO,qBAAA,EAAuB,gBAAgB,CAAA,CAC9C,MAAA,CAAO,0BAAA,EAA4B,gBAAgB,CAAA,CACnD,MAAA,CAAO,qBAAA,EAAuB,qBAAqB,CAAA,CACnD,MAAA,CAAO,WAAA,EAAa,+BAA+B,CAAA,CACnD,MAAA,CAAO,OAAO,UAAkB,OAAA,KAA+B;AAC9D,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,QAAA,EAAU,OAAO,CAAA;AAC3D,IAAA,SAAA,CAAU,2BAAA,CAA4B,UAAU,EAAE,cAAA,EAAgB,QAAQ,OAAA,KAAY,IAAA,EAAM,CAAC,CAAA;AAAA,EAC/F,CAAC,CAAA;AAEH,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,CAAE,YAAY,gCAAgC,CAAA;AAEpF,EAAA,SAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,4DAA4D,CAAA,CACxE,QAAA,CAAS,SAAA,EAAW,YAAY,CAAA,CAChC,MAAA,CAAO,qBAAA,EAAuB,gBAAgB,CAAA,CAC9C,MAAA,CAAO,0BAAA,EAA4B,gBAAgB,CAAA,CACnD,MAAA,CAAO,qBAAA,EAAuB,qBAAqB,CAAA,CACnD,MAAA,CAAO,WAAA,EAAa,+BAA+B,CAAA,CACnD,MAAA,CAAO,OAAO,UAAkB,OAAA,KAA+B;AAC9D,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,QAAA,EAAU,OAAO,CAAA;AAC3D,IAAA,SAAA,CAAU,2BAAA,CAA4B,UAAU,EAAE,cAAA,EAAgB,QAAQ,OAAA,KAAY,IAAA,EAAM,CAAC,CAAA;AAAA,EAC/F,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,OAAA,CAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,2DAA2D,CAAA,CACvE,cAAA,CAAe,iBAAA,EAAmB,YAAY,CAAA,CAC9C,cAAA,CAAe,gBAAA,EAAkB,yCAAyC,CAAA,CAC1E,MAAA,CAAO,qBAAA,EAAuB,gBAAgB,CAAA,CAC9C,MAAA,CAAO,0BAAA,EAA4B,gBAAgB,CAAA,CACnD,MAAA,CAAO,qBAAA,EAAuB,qBAAqB,CAAA,CACnD,MAAA,CAAO,OAAO,OAAA,KAAkE;AAC/E,IAAA,MAAM,iBAAA,CAAkB,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EAC/D,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,yEAAyE,CAAA,CACrF,cAAA,CAAe,0BAAA,EAA4B,aAAa,CAAA,CACxD,cAAA,CAAe,iBAAA,EAAmB,aAAa,EAC/C,cAAA,CAAe,eAAA,EAAiB,YAAY,CAAA,CAC5C,cAAA,CAAe,iBAAA,EAAmB,YAAY,CAAA,CAC9C,eAAe,gBAAA,EAAkB,yCAAyC,CAAA,CAC1E,MAAA,CAAO,qBAAA,EAAuB,gBAAgB,CAAA,CAC9C,MAAA,CAAO,OAAO,OAAA,KAAoC;AACjD,IAAA,MAAM,gBAAgB,OAAO,CAAA;AAAA,EAC/B,CAAC,CAAA;AAEH,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,CAAE,YAAY,2BAA2B,CAAA;AAErF,EAAA,YAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,uDAAuD,CAAA,CACnE,cAAA,CAAe,iBAAA,EAAmB,YAAY,CAAA,CAC9C,cAAA,CAAe,qBAAA,EAAuB,eAAe,CAAA,CACrD,MAAA,CAAO,qBAAA,EAAuB,gBAAgB,CAAA,CAC9C,MAAA,CAAO,0BAAA,EAA4B,gBAAgB,CAAA,CACnD,MAAA,CAAO,qBAAA,EAAuB,qBAAqB,CAAA,CACnD,MAAA,CAAO,OAAO,OAAA,KAAoE;AACjF,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAO,OAAO,CAAA;AAChE,IAAA,SAAA,CAAU,mBAAA,CAAoB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,KAAK,CAAA,CACb,YAAY,2CAA2C,CAAA,CACvD,OAAO,YAAY;AAClB,IAAA,MAAM,cAAA,EAAe;AAAA,EACvB,CAAC,CAAA;AAEH,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,YAAY,6BAA6B,CAAA;AAEjF,EAAA,OAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,mDAAmD,CAAA,CAC/D,MAAA,CAAO,eAAA,EAAiB,uDAAA,EAAyD,gBAAgB,CAAA,CACjG,MAAA,CAAO,OAAO,OAAA,KAA8B;AAC3C,IAAA,MAAM,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EAC1B,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,sCAAsC,CAAA,CAClD,OAAO,YAAY;AAClB,IAAA,MAAM,MAAA,EAAO;AAAA,EACf,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,2CAA2C,CAAA,CACvD,OAAO,YAAY;AAClB,IAAA,MAAM,MAAA,EAAO;AAAA,EACf,CAAC,CAAA;AAEH,EAAA,OAAA,CAAQ,kBAAA,EAAmB;AAE3B,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,IAAA,GAAsB;AAC1C,EAAA,MAAM,UAAU,YAAA,EAAa;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,KAAA,GAAQ,CAAA,IAAK,GAAA,KAAQ,IAAI,CAAA;AAC1E,EAAA,MAAM,OAAA,CAAQ,WAAW,IAAI,CAAA;AAC/B","file":"index.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ninterface AuthConfig {\n sessionToken: string;\n host: string;\n}\n\nfunction getConfigPath() {\n return path.join(os.homedir(), \".config\", \"suda\", \"config.json\");\n}\n\nexport async function readAuthConfig(): Promise<AuthConfig | null> {\n try {\n const configPath = getConfigPath();\n const content = await fs.readFile(configPath, \"utf-8\");\n return JSON.parse(content) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function writeAuthConfig(config: AuthConfig): Promise<void> {\n const configPath = getConfigPath();\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.chmod(path.dirname(configPath), 0o700).catch(() => undefined);\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n const configPath = getConfigPath();\n try {\n await fs.unlink(configPath);\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as { code: string }).code !== \"ENOENT\") {\n throw err;\n }\n }\n}\n\nexport async function login(host: string = \"app.sudayun.cn\") {\n const protocol = host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n const baseUrl = `${protocol}://${host}`;\n\n console.log(`Requesting device authorization from ${baseUrl}...`);\n\n const deviceRes = await fetch(`${baseUrl}/api/cli-auth/device`, {\n method: \"POST\",\n });\n\n if (!deviceRes.ok) {\n throw new Error(`Failed to initialize auth: ${deviceRes.statusText}`);\n }\n\n const { deviceCode, userCode, verificationUri, interval, expiresIn } = (await deviceRes.json()) as {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n };\n\n const authUrl = `${verificationUri}?code=${userCode}`;\n console.log(`\\nPlease open the following URL in your browser to authorize Suda CLI:\\n`);\n console.log(` ${authUrl}\\n`);\n console.log(`Your confirmation code is: ${userCode}\\n`);\n // Try to open browser\n try {\n const open = (await import(\"open\")).default;\n await open(authUrl);\n } catch {\n // ignore\n }\n\n const pollInterval = (interval || 5) * 1000;\n const timeoutSeconds = expiresIn || 300;\n const deadline = Date.now() + timeoutSeconds * 1000;\n\n console.log(\"Waiting for authorization...\");\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n\n const pollRes = await fetch(`${baseUrl}/api/cli-auth/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ deviceCode }),\n });\n\n const data = (await pollRes.json()) as { status?: string; token?: string; error?: string };\n\n if (pollRes.ok && data.status === \"approved\" && data.token) {\n await writeAuthConfig({ sessionToken: data.token, host });\n console.log(\"Successfully authorized!\");\n return;\n }\n\n if (data.error === \"authorization_pending\") {\n continue;\n }\n\n throw new Error(`Authorization failed: ${data.error || \"Unknown error\"}`);\n }\n\n throw new Error(\"Authorization timed out.\");\n}\n\nexport async function status() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in. Run `suda auth login` to authenticate.\");\n return;\n }\n\n const protocol = config.host.includes(\"localhost\") || config.host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n\n let res: Response;\n try {\n res = await fetch(`${protocol}://${config.host}/api/auth/get-session`, {\n headers: {\n Authorization: `Bearer ${config.sessionToken}`,\n },\n });\n } catch {\n console.error(`Failed to connect to ${config.host}.`);\n return;\n }\n\n if (!res.ok) {\n console.log(\"Session expired or invalid. Please run `suda auth login` again.\");\n await clearAuthConfig();\n return;\n }\n\n // better-auth's `/api/auth/get-session` returns HTTP 200 with body `null`\n // when the bearer token is unrecognized. Treat that as an invalid session\n // instead of crashing on `session.user`.\n const session = (await res.json()) as { user?: { email?: string; name?: string } } | null;\n if (!session?.user) {\n console.log(\"Session expired or invalid. Please run `suda auth login` again.\");\n await clearAuthConfig();\n return;\n }\n\n console.log(`Logged in as ${session.user.email || session.user.name} on ${config.host}`);\n}\n\nexport async function logout() {\n const config = await readAuthConfig();\n if (!config) {\n console.log(\"Not logged in.\");\n return;\n }\n \n await clearAuthConfig();\n console.log(\"Logged out successfully.\");\n}\n","#!/usr/bin/env node\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport type {\n AgentComponentOutput,\n ThemeAgentManifest,\n ThemeModule,\n ThemeStarterPage,\n} from \"@sudajs/theme-engine\";\nimport {\n agentComponentOutputSchema,\n agentPageSchemaOutputSchema,\n agentValidationResultSchema,\n checkThemeModule,\n createAgentComponentSchemaOutput,\n createAgentPageSchemaOutput,\n createPageDataFromAgentContent,\n createThemeAgentManifest,\n findAgentSection,\n formatThemeCheckResult,\n validateAgentPageContentWithManifest,\n} from \"@sudajs/theme-engine\";\nimport { ThemeRender, extractLayoutChrome } from \"@sudajs/theme-engine/server\";\nimport { Command } from \"commander\";\nimport { build as esbuild, context as esbuildContext, type Plugin } from \"esbuild\";\nimport { createElement } from \"react\";\nimport { renderToStaticMarkup } from \"react-dom/server\";\nimport { z } from \"zod\";\n\ninterface ValidatedTheme {\n root: string;\n module: ThemeModule;\n serverEntryPath: string;\n clientEntryPath: string | null;\n stylesheetPath: string | null;\n}\n\ninterface UploadFile {\n absolutePath: string;\n relativePath: string;\n contentType: string;\n}\n\ninterface ThemeRootOptions {\n themeRoot?: string | undefined;\n}\n\ninterface BuildOptions extends ThemeRootOptions {\n skipThemeBuild?: boolean;\n skipCheck?: boolean;\n}\n\ninterface CheckOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n}\n\ninterface PublishOptions extends ThemeRootOptions {\n skipBuild?: boolean;\n skipCheck?: boolean;\n bucket?: string;\n}\n\ninterface PreviewOptions extends ThemeRootOptions {\n port?: string;\n}\n\ninterface AgentThemeOptions extends ThemeRootOptions {\n projectId?: string | undefined;\n version?: string | undefined;\n example?: boolean | undefined;\n}\n\ninterface AgentPageCreateOptions extends AgentThemeOptions {\n title: string;\n slug: string;\n theme: string;\n input: string;\n}\n\ninterface AgentProjectCreateOptions {\n name: string;\n siteDescription: string;\n}\n\ninterface AgentProjectSummary {\n projectId: string;\n name: string;\n defaultDomain: string | null;\n role: string;\n isOwner: boolean;\n activeThemeKey: string | null;\n activeThemeVersion: string | null;\n}\n\ninterface AgentProjectCreated {\n success: true;\n projectId: string;\n name: string;\n defaultDomain: string | null;\n dashboardUrl: string;\n}\n\ninterface ThemeCatalogItem {\n key: string;\n name: string;\n version: string;\n description?: string | null | undefined;\n categories?: string[] | undefined;\n preview?: string | undefined;\n active?: boolean | undefined;\n}\n\nconst createPageDraftOutputSchema = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"created\").describe(\"The page draft was created.\"),\n pageId: z.string().describe(\"New page id.\"),\n }),\n z.object({\n status: z.literal(\"invalid\").describe(\"The page content failed validation.\"),\n valid: z.literal(false),\n issues: z.array(\n z.object({\n path: z.string(),\n message: z.string(),\n }),\n ),\n }),\n]);\n\n// Mirrors apps/workspace/app/onboarding/constants.ts so external AI tools see\n// the same input bounds as the in-app onboarding form.\nconst PROJECT_NAME_MIN_LENGTH = 1;\nconst PROJECT_NAME_MAX_LENGTH = 80;\nconst PROJECT_DESCRIPTION_MIN_LENGTH = 1;\nconst PROJECT_DESCRIPTION_MAX_LENGTH = 300;\n\n// Single source of truth for the create_project input shape, reused by both\n// the MCP `create_project` tool and the `suda agent project create` command\n// so the two entry points cannot drift on bounds or trim semantics.\nconst createProjectInputSchema = z.object({\n name: z\n .string()\n .trim()\n .min(PROJECT_NAME_MIN_LENGTH)\n .max(PROJECT_NAME_MAX_LENGTH),\n siteDescription: z\n .string()\n .trim()\n .min(PROJECT_DESCRIPTION_MIN_LENGTH)\n .max(PROJECT_DESCRIPTION_MAX_LENGTH),\n});\n\nconst projectSummarySchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n role: z.string(),\n isOwner: z.boolean(),\n activeThemeKey: z.string().nullable(),\n activeThemeVersion: z.string().nullable(),\n});\n\nconst listProjectsOutputSchema = z.object({\n projects: z.array(projectSummarySchema),\n});\n\nconst createProjectOutputSchema = z.object({\n projectId: z.string(),\n name: z.string(),\n defaultDomain: z.string().nullable(),\n dashboardUrl: z.string(),\n});\n\nfunction createHostReactShimPlugin(): Plugin {\n return {\n name: \"suda-host-react-shim\",\n setup(build) {\n build.onResolve({ filter: /^react$/ }, () => ({\n path: \"react-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react\\/jsx-runtime$/ }, () => ({\n path: \"react-jsx-runtime-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom$/ }, () => ({\n path: \"react-dom-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onResolve({ filter: /^react-dom\\/client$/ }, () => ({\n path: \"react-dom-client-host-shim\",\n namespace: \"suda-shim\",\n }));\n build.onLoad({ filter: /^react-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst React = globalThis.__SUDA_REACT__;\nif (!React) {\n throw new Error(\"Missing host React runtime (__SUDA_REACT__).\");\n}\nexport default React;\nexport const {\n Children,\n Component,\n Fragment,\n Profiler,\n PureComponent,\n StrictMode,\n Suspense,\n cloneElement,\n createContext,\n createElement,\n createRef,\n forwardRef,\n isValidElement,\n lazy,\n memo,\n startTransition,\n use,\n useActionState,\n useCallback,\n useContext,\n useDeferredValue,\n useEffect,\n useId,\n useImperativeHandle,\n useInsertionEffect,\n useLayoutEffect,\n useMemo,\n useOptimistic,\n useReducer,\n useRef,\n useState,\n useSyncExternalStore,\n useTransition,\n version,\n} = React;\n`,\n }));\n build.onLoad(\n {\n filter: /^react-jsx-runtime-host-shim$/,\n namespace: \"suda-shim\",\n },\n () => ({\n loader: \"js\",\n contents: `\nconst runtime = globalThis.__SUDA_REACT_JSX_RUNTIME__;\nif (!runtime) {\n throw new Error(\"Missing host React JSX runtime (__SUDA_REACT_JSX_RUNTIME__).\");\n}\nexport const { Fragment, jsx, jsxs, jsxDEV } = runtime;\n`,\n }),\n );\n build.onLoad({ filter: /^react-dom-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOM = globalThis.__SUDA_REACT_DOM__;\nif (!ReactDOM) {\n throw new Error(\"Missing host React DOM runtime (__SUDA_REACT_DOM__).\");\n}\nexport default ReactDOM;\nexport const {\n createPortal,\n flushSync,\n preconnect,\n prefetchDNS,\n preinit,\n preinitModule,\n preload,\n preloadModule,\n requestFormReset,\n unstable_batchedUpdates,\n useFormState,\n useFormStatus,\n version,\n} = ReactDOM;\n`,\n }));\n build.onLoad({ filter: /^react-dom-client-host-shim$/, namespace: \"suda-shim\" }, () => ({\n loader: \"js\",\n contents: `\nconst ReactDOMClient = globalThis.__SUDA_REACT_DOM_CLIENT__;\nif (!ReactDOMClient) {\n throw new Error(\"Missing host React DOM client runtime (__SUDA_REACT_DOM_CLIENT__).\");\n}\nexport default ReactDOMClient;\nexport const { createRoot, hydrateRoot, version } = ReactDOMClient;\n`,\n }));\n },\n };\n}\n\nfunction safeObjectKeyPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n}\n\nfunction createThemePrefix(themeKey: string, version: string): string {\n return `themes/${safeObjectKeyPart(themeKey)}/${safeObjectKeyPart(version)}`;\n}\n\nfunction createThemeObjectKey(themeKey: string, version: string, relativePath: string): string {\n const safeRelativePath = relativePath\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .map(safeObjectKeyPart)\n .filter(Boolean)\n .join(\"/\");\n\n return `${createThemePrefix(themeKey, version)}/${safeRelativePath}`;\n}\n\nimport { login, status, logout, readAuthConfig } from \"./auth\";\n\nfunction resolveThemeRoot(options: ThemeRootOptions): string {\n return path.resolve(options.themeRoot ?? process.cwd());\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJson<T>(filePath: string): Promise<T> {\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nasync function readJsonIfExists<T>(filePath: string): Promise<T | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n return readJson<T>(filePath);\n}\n\nfunction protocolForHost(host: string): \"http\" | \"https\" {\n return host.includes(\"localhost\") || host.includes(\"127.0.0.1\") ? \"http\" : \"https\";\n}\n\nasync function requireCliBaseUrl(): Promise<{ baseUrl: string; token: string }> {\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n return {\n baseUrl: `${protocolForHost(config.host)}://${config.host}`,\n token: config.sessionToken,\n };\n}\n\nasync function fetchJson<T>(\n url: string,\n options: RequestInit & { token?: string } = {},\n): Promise<T> {\n const headers = new Headers(options.headers);\n if (options.token) {\n headers.set(\"Authorization\", `Bearer ${options.token}`);\n }\n const response = await fetch(url, { ...options, headers });\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as { error?: string; message?: string };\n throw new Error(errorData.message || errorData.error || response.statusText);\n }\n return (await response.json()) as T;\n}\n\nfunction agentCacheDir(): string {\n return path.join(process.env.XDG_CACHE_HOME ?? path.join(process.env.HOME ?? \".\", \".cache\"), \"suda\", \"agent\");\n}\n\nfunction cachedThemeManifestPath(themeKey: string, version: string): string {\n return path.join(agentCacheDir(), \"themes\", safeObjectKeyPart(themeKey), safeObjectKeyPart(version), \"agent-manifest.json\");\n}\n\nasync function loadThemeModule(serverEntryPath: string): Promise<ThemeModule> {\n const imported = (await import(`${pathToFileURL(serverEntryPath).href}?t=${Date.now()}`)) as {\n default?: ThemeModule;\n };\n\n if (!imported.default) {\n throw new Error(`${serverEntryPath} must export a default ThemeModule.`);\n }\n\n return imported.default;\n}\n\nfunction assertRecord(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${label} must be an object.`);\n }\n}\n\nfunction validateThemeModule(module: ThemeModule): void {\n assertRecord(module.manifest, \"manifest\");\n if (!module.manifest.key || !module.manifest.version || !module.manifest.name) {\n throw new Error(\"manifest.key, manifest.version and manifest.name are required.\");\n }\n if (module.manifest.entry !== \"dist/index.js\") {\n throw new Error('manifest.entry must be artifact-local: \"dist/index.js\".');\n }\n if (\n module.manifest.clientEntry !== undefined &&\n module.manifest.clientEntry !== \"dist/runtime.client.js\"\n ) {\n throw new Error(\n 'manifest.clientEntry must be artifact-local: \"dist/runtime.client.js\" when provided.',\n );\n }\n assertRecord(module.pageConfig?.components, \"pageConfig.components\");\n assertRecord(module.layoutConfig, \"layoutConfig\");\n assertRecord(module.defaultLayout, \"defaultLayout\");\n if (!Array.isArray(module.starterPages)) {\n throw new Error(\"starterPages must be an array.\");\n }\n}\n\nasync function validateTheme(root: string): Promise<ValidatedTheme> {\n const packageJsonPath = path.join(root, \"package.json\");\n const serverEntryPath = path.join(root, \"dist\", \"index.js\");\n const clientEntryPath = path.join(root, \"dist\", \"runtime.client.js\");\n const stylesheetPath = path.join(root, \"styles.css\");\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error(`Missing package.json in ${root}`);\n }\n if (!(await pathExists(serverEntryPath))) {\n throw new Error(`Missing ${serverEntryPath}. Run the theme package build first.`);\n }\n\n const module = await loadThemeModule(serverEntryPath);\n validateThemeModule(module);\n\n const result: ValidatedTheme = {\n root,\n module,\n serverEntryPath,\n clientEntryPath: null,\n stylesheetPath: null,\n };\n if (await pathExists(clientEntryPath)) {\n result.clientEntryPath = clientEntryPath;\n }\n if (await pathExists(stylesheetPath)) {\n result.stylesheetPath = stylesheetPath;\n }\n return result;\n}\n\nasync function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const { spawn } = await import(\"node:child_process\");\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`${command} ${args.join(\" \")} exited with ${code ?? \"unknown\"}.`));\n }\n });\n });\n}\n\nasync function runThemePackageBuild(root: string): Promise<void> {\n const packageJson = await readJson<{ scripts?: Record<string, string> }>(\n path.join(root, \"package.json\"),\n );\n const buildScript = packageJson.scripts?.build;\n if (!buildScript || buildScript.includes(\"suda theme\") || buildScript.includes(\"suda-theme\")) {\n return;\n }\n await runCommand(\"pnpm\", [\"--dir\", root, \"run\", \"build\"], process.cwd());\n}\n\nasync function findClientEntry(root: string): Promise<string> {\n const candidates = [\n path.join(root, \"src\", \"runtime.client.tsx\"),\n path.join(root, \"src\", \"runtime.client.ts\"),\n ];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing runtime entry. Add src/runtime.client.ts(x) in ${root}.`);\n}\n\nasync function findServerEntry(root: string): Promise<string> {\n const candidates = [path.join(root, \"src\", \"index.tsx\"), path.join(root, \"src\", \"index.ts\")];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Missing server entry. Add src/index.ts(x) in ${root}.`);\n}\n\nasync function buildServerBundle(root: string): Promise<void> {\n const entryPoint = await findServerEntry(root);\n\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n external: [\n \"react\",\n \"react/jsx-runtime\",\n \"react-dom\",\n \"react-dom/*\",\n \"@puckeditor/core\",\n \"@puckeditor/core/*\",\n \"@sudajs/theme-engine\",\n \"@sudajs/theme-engine/*\",\n ],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"index.js\"),\n platform: \"node\",\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n}\n\nasync function buildTheme(root: string, skipThemeBuild: boolean): Promise<ValidatedTheme> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n\n const entryPoint = await findClientEntry(root);\n if (!(await pathExists(entryPoint))) {\n throw new Error(`Missing client entry: ${entryPoint}`);\n }\n\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n await esbuild({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: true,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin],\n sourcemap: false,\n target: \"es2022\",\n treeShaking: true,\n });\n\n const validated = await validateTheme(root);\n await writeThemeArtifacts(validated);\n return validateTheme(root);\n}\n\n/**\n * Runs the AI-metadata check on a built theme. Prints a human-readable report\n * via {@link formatThemeCheckResult} and returns whether errors were found, so\n * callers can decide whether to fail the build.\n */\nfunction runThemeCheck(theme: ValidatedTheme): boolean {\n const result = checkThemeModule(theme.module);\n const text = formatThemeCheckResult(result);\n if (result.ok) {\n console.log(text);\n } else {\n console.error(text);\n }\n return result.ok;\n}\n\nasync function watchTheme(root: string, skipThemeBuild: boolean): Promise<void> {\n if (!skipThemeBuild) {\n await runThemePackageBuild(root);\n }\n\n await buildServerBundle(root);\n\n const entryPoint = await findClientEntry(root);\n await mkdir(path.join(root, \"dist\"), { recursive: true });\n const hostReactShimPlugin = createHostReactShimPlugin();\n const watchLogPlugin = createWatchLogPlugin(\"runtime.client.js\");\n\n const context = await esbuildContext({\n bundle: true,\n entryPoints: [entryPoint],\n format: \"esm\",\n jsx: \"automatic\",\n minify: false,\n outfile: path.join(root, \"dist\", \"runtime.client.js\"),\n platform: \"browser\",\n plugins: [hostReactShimPlugin, watchLogPlugin],\n sourcemap: true,\n target: \"es2022\",\n treeShaking: true,\n });\n await context.watch();\n console.log(\"watching theme runtime; press Ctrl+C to stop\");\n await new Promise(() => undefined);\n}\n\n/**\n * Logs a single line whenever esbuild finishes a (re)build in watch mode.\n * Without this, `suda theme dev` runs silently after the initial bundle and\n * developers can only confirm rebuilds by checking dist/ mtimes.\n */\nfunction createWatchLogPlugin(label: string): Plugin {\n return {\n name: \"suda-theme-watch-log\",\n setup(build) {\n let firstBuild = true;\n build.onEnd((result) => {\n if (firstBuild) {\n firstBuild = false;\n return;\n }\n const errorCount = result.errors.length;\n if (errorCount > 0) {\n console.log(`rebuild failed (${errorCount} error${errorCount === 1 ? \"\" : \"s\"}): ${label}`);\n return;\n }\n const stamp = new Date().toLocaleTimeString();\n console.log(`[${stamp}] rebuilt ${label}`);\n });\n },\n };\n}\n\ninterface PreviewServerHandle {\n url: string;\n port: number;\n close: () => Promise<void>;\n}\n\nfunction pickStarterPage(theme: ValidatedTheme): ThemeStarterPage | null {\n const pages = theme.module.starterPages;\n if (pages.length === 0) {\n return null;\n }\n return pages.find((page) => page.isHome) ?? pages[0] ?? null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction renderStarterPageHtml(theme: ValidatedTheme, page: ThemeStarterPage): string {\n const chrome = extractLayoutChrome(theme.module.defaultLayout);\n const body = renderToStaticMarkup(\n createElement(ThemeRender, {\n theme: theme.module,\n pageData: page.data,\n layoutData: theme.module.defaultLayout,\n }),\n );\n const cssVarStyle = Object.entries(chrome.cssVariables)\n .map(([key, value]) => `${key}: ${value};`)\n .join(\" \");\n const stylesheetTag = theme.stylesheetPath\n ? '<link rel=\"stylesheet\" href=\"/styles.css\" />'\n : \"\";\n const customHead = chrome.customHeadCode ?? \"\";\n const customBody = chrome.customBodyCode ?? \"\";\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n `<title>${escapeHtml(`${theme.module.manifest.name} — ${page.title}`)}</title>`,\n stylesheetTag,\n customHead,\n \"</head>\",\n `<body${cssVarStyle ? ` style=\"${cssVarStyle}\"` : \"\"}>`,\n body,\n customBody,\n \"</body>\",\n \"</html>\",\n ].join(\"\");\n}\n\nasync function startPreviewServer(\n theme: ValidatedTheme,\n port: number,\n): Promise<PreviewServerHandle> {\n const { createServer } = await import(\"node:http\");\n const starterPage = pickStarterPage(theme);\n const server = createServer((request, response) => {\n void (async () => {\n const url = new URL(request.url ?? \"/\", `http://localhost:${port}`);\n const pathname = url.pathname;\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n if (!starterPage) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"No starter page available for preview.\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n response.end(renderStarterPageHtml(theme, starterPage));\n return;\n }\n\n if (pathname === \"/styles.css\" && theme.stylesheetPath) {\n response.writeHead(200, { \"Content-Type\": \"text/css; charset=utf-8\" });\n response.end(await readFile(theme.stylesheetPath));\n return;\n }\n\n const relativePath = pathname.replace(/^\\/+/, \"\");\n const filePath = path.resolve(theme.root, relativePath);\n const normalizedRoot = path.resolve(theme.root) + path.sep;\n if (!filePath.startsWith(normalizedRoot) || !(await pathExists(filePath))) {\n response.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found\");\n return;\n }\n response.writeHead(200, { \"Content-Type\": contentTypeFor(relativePath) });\n response.end(await readFile(filePath));\n })().catch((error) => {\n response.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n response.end(error instanceof Error ? error.message : \"Internal error\");\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error): void => {\n reject(err);\n };\n server.once(\"error\", onError);\n server.listen(port, () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n\n return {\n url: `http://localhost:${port}`,\n port,\n close: () =>\n new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n }),\n };\n}\n\nasync function previewTheme(root: string, port: number): Promise<void> {\n const theme = await buildTheme(root, false);\n const handle = await startPreviewServer(theme, port);\n console.log(\n `previewing ${theme.module.manifest.key}@${theme.module.manifest.version} at ${handle.url}`,\n );\n await new Promise(() => undefined);\n}\n\ninterface ScreenshotOptions extends ThemeRootOptions {\n output?: string;\n width?: string;\n height?: string;\n port?: string;\n skipBuild?: boolean;\n}\n\ninterface ResolvedScreenshotOptions {\n outputPath: string;\n viewport: { width: number; height: number };\n port: number;\n skipBuild: boolean;\n}\n\nconst DEFAULT_SCREENSHOT_RELATIVE = path.join(\"dist\", \"preview\", \"desktop.png\");\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (!value) {\n return fallback;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction resolveScreenshotOptions(\n root: string,\n options: ScreenshotOptions,\n): ResolvedScreenshotOptions {\n return {\n outputPath: path.resolve(root, options.output ?? DEFAULT_SCREENSHOT_RELATIVE),\n viewport: {\n width: parsePositiveInt(options.width, 1280),\n height: parsePositiveInt(options.height, 800),\n },\n port: parsePositiveInt(options.port, 4178),\n skipBuild: options.skipBuild === true,\n };\n}\n\ninterface PlaywrightModule {\n chromium: {\n launch: (options?: { headless?: boolean }) => Promise<{\n newContext: (options: {\n viewport: { width: number; height: number };\n deviceScaleFactor?: number;\n }) => Promise<{\n newPage: () => Promise<{\n goto: (url: string, options?: { waitUntil?: string }) => Promise<unknown>;\n screenshot: (options: { path: string; fullPage?: boolean }) => Promise<unknown>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n close: () => Promise<void>;\n }>;\n };\n}\n\nasync function loadPlaywright(): Promise<PlaywrightModule> {\n // Resolve module ids via runtime expressions so the optional dependency is not\n // required at type-check time. Either `playwright` or `@playwright/test` works.\n const candidates = [\"playwright\", \"@playwright/test\"];\n for (const id of candidates) {\n try {\n const mod: unknown = await import(/* @vite-ignore */ id);\n return mod as PlaywrightModule;\n } catch {\n // try next candidate\n }\n }\n throw new Error(\n \"Playwright is required for screenshot capture. Install it as a dev dependency: `pnpm add -D playwright && pnpm exec playwright install chromium`.\",\n );\n}\n\nasync function captureScreenshot(\n theme: ValidatedTheme,\n options: ResolvedScreenshotOptions,\n): Promise<void> {\n const playwright = await loadPlaywright();\n const handle = await startPreviewServer(theme, options.port);\n try {\n await mkdir(path.dirname(options.outputPath), { recursive: true });\n const browser = await playwright.chromium.launch({ headless: true });\n try {\n const context = await browser.newContext({\n viewport: options.viewport,\n deviceScaleFactor: 1,\n });\n const page = await context.newPage();\n await page.goto(handle.url, { waitUntil: \"networkidle\" });\n await page.screenshot({ path: options.outputPath, fullPage: false });\n await context.close();\n } finally {\n await browser.close();\n }\n } finally {\n await handle.close();\n }\n console.log(`captured ${path.relative(theme.root, options.outputPath)}`);\n}\n\nasync function screenshotTheme(root: string, options: ScreenshotOptions): Promise<void> {\n const resolved = resolveScreenshotOptions(root, options);\n const theme = resolved.skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n await captureScreenshot(theme, resolved);\n}\n\nasync function loadLocalAgentManifest(root: string): Promise<ThemeAgentManifest> {\n const built = await readJsonIfExists<ThemeAgentManifest>(path.join(root, \"dist\", \"agent-manifest.json\"));\n if (built) {\n return built;\n }\n throw new Error(\n `No agent manifest found at ${path.join(root, \"dist\", \"agent-manifest.json\")}. Run \"suda theme build\" first.`,\n );\n}\n\nasync function listAgentThemes(options: AgentThemeOptions): Promise<ThemeCatalogItem[]> {\n if (options.themeRoot) {\n const manifest = await loadLocalAgentManifest(resolveThemeRoot(options));\n return [\n {\n key: manifest.manifest.key,\n name: manifest.manifest.name,\n version: manifest.manifest.version,\n description: manifest.manifest.description ?? null,\n categories: manifest.manifest.categories,\n preview: manifest.manifest.preview,\n },\n ];\n }\n\n const auth = await requireCliBaseUrl();\n const url = new URL(\"/api/cli/agent/themes\", auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const catalog = await fetchJson<{ themes: ThemeCatalogItem[] }>(url.href, { token: auth.token });\n await mkdir(agentCacheDir(), { recursive: true });\n await writeFile(path.join(agentCacheDir(), \"catalog.json\"), `${JSON.stringify(catalog, null, 2)}\\n`);\n return catalog.themes;\n}\n\nasync function fetchAgentManifest(\n themeKey: string,\n options: AgentThemeOptions,\n): Promise<ThemeAgentManifest> {\n if (options.themeRoot) {\n return loadLocalAgentManifest(resolveThemeRoot(options));\n }\n\n const auth = await requireCliBaseUrl();\n const version = options.version ?? \"latest\";\n const cachePath = cachedThemeManifestPath(themeKey, version);\n const cached = version === \"latest\" ? null : await readJsonIfExists<ThemeAgentManifest>(cachePath);\n if (cached) {\n return cached;\n }\n\n const url = new URL(`/api/cli/agent/themes/${encodeURIComponent(themeKey)}/${encodeURIComponent(version)}/schema`, auth.baseUrl);\n if (options.projectId) {\n url.searchParams.set(\"projectId\", options.projectId);\n }\n const result = await fetchJson<{ agentManifest: ThemeAgentManifest }>(url.href, { token: auth.token });\n const realVersion = result.agentManifest.manifest.version;\n const realCachePath = cachedThemeManifestPath(themeKey, realVersion);\n await mkdir(path.dirname(realCachePath), { recursive: true });\n await writeFile(realCachePath, `${JSON.stringify(result.agentManifest, null, 2)}\\n`);\n return result.agentManifest;\n}\n\nfunction printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction createSectionSchema(manifest: ThemeAgentManifest, sectionType: string): AgentComponentOutput {\n const section = findAgentSection(manifest, sectionType);\n if (!section) {\n throw new Error(`Unknown section type \"${sectionType}\".`);\n }\n return createAgentComponentSchemaOutput(section, \"section\");\n}\n\nasync function validateAgentPage(themeKey: string, input: string, options: AgentThemeOptions): Promise<void> {\n const manifest = await fetchAgentManifest(themeKey, options);\n const pageContent = await readJson<unknown>(path.resolve(input));\n const result = validateAgentPageContentWithManifest(pageContent, manifest);\n printJson(agentValidationResultSchema.parse(result));\n if (!result.valid) {\n process.exitCode = 1;\n }\n}\n\nasync function createAgentPage(options: AgentPageCreateOptions): Promise<void> {\n if (!options.projectId) {\n throw new Error(\"--project-id is required.\");\n }\n const pageContent = await readJson<unknown>(path.resolve(options.input));\n const manifest = await fetchAgentManifest(options.theme, options);\n const validation = validateAgentPageContentWithManifest(pageContent, manifest);\n if (!validation.valid) {\n printJson(agentValidationResultSchema.parse(validation));\n process.exitCode = 1;\n return;\n }\n const pageData = createPageDataFromAgentContent(pageContent);\n\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(options.projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: options.title,\n slug: options.slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: pageData,\n }),\n },\n );\n printJson({ success: true, ...response });\n}\n\nasync function listAgentProjects(): Promise<AgentProjectSummary[]> {\n const auth = await requireCliBaseUrl();\n const result = await fetchJson<{ projects: AgentProjectSummary[] }>(\n `${auth.baseUrl}/api/cli/agent/projects`,\n { token: auth.token },\n );\n return result.projects;\n}\n\nasync function createAgentProject(\n options: AgentProjectCreateOptions,\n): Promise<AgentProjectCreated> {\n const auth = await requireCliBaseUrl();\n return fetchJson<AgentProjectCreated>(`${auth.baseUrl}/api/cli/agent/projects`, {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name: options.name,\n siteDescription: options.siteDescription,\n }),\n });\n}\n\nfunction mcpStructured<T extends Record<string, unknown>>(summary: string, value: T) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: summary,\n },\n ],\n structuredContent: value,\n };\n}\n\nasync function startMcpServer(): Promise<void> {\n const server = new McpServer({\n name: \"suda\",\n version: \"0.1.0\",\n });\n\n server.registerTool(\n \"list_projects\",\n {\n description:\n \"List Suda projects the current CLI user can access. ALWAYS call this first when the user asks to generate or edit a website. Flow: (1) If `projects` is empty, do NOT call this tool again; instead skip directly to gathering inputs and calling create_project (see its description). (2) If `projects` has one or more entries, you MUST ask the user which project to use before any further action — even if there is only a single project, present it and ask the user to confirm or pick a different one. Never auto-pick a project on the user's behalf.\",\n inputSchema: {},\n outputSchema: listProjectsOutputSchema.shape,\n },\n async () => {\n const structuredContent = listProjectsOutputSchema.parse({\n projects: await listAgentProjects(),\n });\n return mcpStructured(\"Suda projects accessible to the current user.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_project\",\n {\n description:\n \"Create a new Suda project for the current user. Only call this after list_projects returned an empty list. Conversation flow before calling: (1) Ask the user for the website / brand name in one turn and capture it as `name`. (2) Ask the user for a business introduction; the user is allowed (and expected) to answer over multiple turns — keep asking follow-up questions and accumulating their answers until they confirm they are done, then concatenate the accumulated text into a single `siteDescription` (trimmed). Do not invent details the user did not provide. Do not call this tool until both fields are confirmed by the user. The project is created with the default theme and starter pages; no in-app AI site generation is triggered — drive page content afterwards via create_page_draft using the returned projectId.\",\n inputSchema: {\n name: createProjectInputSchema.shape.name.describe(\n \"Website or brand name confirmed by the user in a dedicated turn. Used as the project name and site title.\",\n ),\n siteDescription: createProjectInputSchema.shape.siteDescription.describe(\n \"Business introduction the user provided, possibly across multiple turns, then concatenated and trimmed. Captures what the site is about and who it serves. Used to seed default site metadata.\",\n ),\n },\n outputSchema: createProjectOutputSchema.shape,\n },\n async ({ name, siteDescription }) => {\n const result = await createAgentProject({ name, siteDescription });\n const structuredContent = createProjectOutputSchema.parse({\n projectId: result.projectId,\n name: result.name,\n defaultDomain: result.defaultDomain,\n dashboardUrl: result.dashboardUrl,\n });\n return mcpStructured(\"Created Suda project.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"list_themes\",\n {\n description: \"List themes visible to the current Suda CLI user.\",\n inputSchema: {\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n themes: z.array(\n z.object({\n key: z.string(),\n name: z.string(),\n version: z.string(),\n description: z.string().nullable().optional(),\n categories: z.array(z.string()).optional(),\n preview: z.string().optional(),\n active: z.boolean().optional(),\n }),\n ),\n },\n },\n async ({ projectId, themeRoot }) => {\n const structuredContent = { themes: await listAgentThemes({ projectId, themeRoot }) };\n return mcpStructured(\"Available Suda themes.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"describe_theme\",\n {\n description: \"Return the raw Suda agent manifest for a theme.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: {\n agentManifest: z.unknown(),\n },\n },\n async ({ theme, version, projectId, themeRoot }) => {\n const structuredContent = {\n agentManifest: await fetchAgentManifest(theme, { version, projectId, themeRoot }),\n };\n return mcpStructured(\"Raw Suda theme agent manifest.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_page_schema\",\n {\n description:\n \"Return the AI-first output schema for generating Suda page content, including all section schemas.\",\n inputSchema: {\n theme: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n includeExample: z.boolean().optional(),\n },\n outputSchema: agentPageSchemaOutputSchema.shape,\n },\n async ({ theme, version, projectId, themeRoot, includeExample }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createAgentPageSchemaOutput(manifest, {\n includeExample: includeExample === true,\n });\n return mcpStructured(\"AI-first Suda page content output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"get_section_schema\",\n {\n description: \"Return the AI-first output schema for one section component in a theme.\",\n inputSchema: {\n theme: z.string(),\n section: z.string(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentComponentOutputSchema.shape,\n },\n async ({ theme, section, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = createSectionSchema(manifest, section);\n return mcpStructured(\"AI-first Suda section output schema.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"validate_page_config\",\n {\n description: \"Validate AI-generated Suda page content against a theme.\",\n inputSchema: {\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n projectId: z.string().optional(),\n themeRoot: z.string().optional(),\n },\n outputSchema: agentValidationResultSchema.shape,\n },\n async ({ theme, data, version, projectId, themeRoot }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId, themeRoot });\n const structuredContent = agentValidationResultSchema.parse(\n validateAgentPageContentWithManifest(data, manifest),\n );\n return mcpStructured(\"Suda page content validation result.\", structuredContent);\n },\n );\n\n server.registerTool(\n \"create_page_draft\",\n {\n description: \"Create a workspace page draft from AI-generated Suda page content.\",\n inputSchema: {\n projectId: z.string(),\n title: z.string(),\n slug: z.string(),\n theme: z.string(),\n data: z.unknown(),\n version: z.string().optional(),\n },\n outputSchema: createPageDraftOutputSchema,\n },\n async ({ projectId, title, slug, theme, data, version }) => {\n const manifest = await fetchAgentManifest(theme, { version, projectId });\n const validation = validateAgentPageContentWithManifest(data, manifest);\n if (!validation.valid) {\n return mcpStructured(\n \"Suda page content validation failed. Fix issues before creating a draft.\",\n createPageDraftOutputSchema.parse({\n status: \"invalid\",\n valid: false,\n issues: validation.issues,\n }),\n );\n }\n const auth = await requireCliBaseUrl();\n const response = await fetchJson<{ pageId: string }>(\n `${auth.baseUrl}/api/cli/agent/projects/${encodeURIComponent(projectId)}/pages`,\n {\n method: \"POST\",\n token: auth.token,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title,\n slug,\n themeKey: manifest.manifest.key,\n themeVersion: manifest.manifest.version,\n data: createPageDataFromAgentContent(data),\n }),\n },\n );\n return mcpStructured(\n \"Created Suda page draft.\",\n createPageDraftOutputSchema.parse({ status: \"created\", ...response }),\n );\n },\n );\n\n await server.connect(new StdioServerTransport());\n}\n\nasync function writeThemeArtifacts(theme: ValidatedTheme): Promise<void> {\n const dist = path.join(theme.root, \"dist\");\n const agentManifest = createThemeAgentManifest(theme.module);\n await writeFile(\n path.join(dist, \"manifest.json\"),\n `${JSON.stringify(theme.module.manifest, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"starter-pages.json\"),\n `${JSON.stringify(theme.module.starterPages, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"default-layout.json\"),\n `${JSON.stringify(theme.module.defaultLayout, null, 2)}\\n`,\n );\n await writeFile(\n path.join(dist, \"agent-manifest.json\"),\n `${JSON.stringify(agentManifest, null, 2)}\\n`,\n );\n}\n\nfunction contentTypeFor(relativePath: string): string {\n if (relativePath.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (relativePath.endsWith(\".js\")) {\n return \"application/javascript; charset=utf-8\";\n }\n if (relativePath.endsWith(\".json\")) {\n return \"application/json; charset=utf-8\";\n }\n if (relativePath.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (relativePath.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (relativePath.endsWith(\".jpg\") || relativePath.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n }\n if (relativePath.endsWith(\".webp\")) {\n return \"image/webp\";\n }\n return \"application/octet-stream\";\n}\n\nasync function collectFiles(root: string, directory: string): Promise<UploadFile[]> {\n const files: UploadFile[] = [];\n if (!(await pathExists(directory))) {\n return files;\n }\n\n const children = await readdir(directory, { withFileTypes: true });\n for (const child of children) {\n const absolutePath = path.join(directory, child.name);\n if (child.isDirectory()) {\n files.push(...(await collectFiles(root, absolutePath)));\n continue;\n }\n const relativePath = path.relative(root, absolutePath).replaceAll(path.sep, \"/\");\n files.push({\n absolutePath,\n relativePath,\n contentType: contentTypeFor(relativePath),\n });\n }\n return files;\n}\n\nasync function collectThemeArtifactFiles(theme: ValidatedTheme): Promise<UploadFile[]> {\n const files = await collectFiles(theme.root, path.join(theme.root, \"dist\"));\n const assetsFiles = await collectFiles(theme.root, path.join(theme.root, \"assets\"));\n files.push(...assetsFiles);\n if (theme.stylesheetPath) {\n files.push({\n absolutePath: theme.stylesheetPath,\n relativePath: \"styles.css\",\n contentType: \"text/css; charset=utf-8\",\n });\n }\n return files;\n}\n\nasync function checksum(files: UploadFile[]): Promise<string> {\n const hash = createHash(\"sha256\");\n for (const file of files.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {\n hash.update(file.relativePath);\n hash.update(await readFile(file.absolutePath));\n }\n return hash.digest(\"hex\");\n}\n\nasync function publishTheme(\n root: string,\n skipBuild: boolean,\n skipCheck: boolean,\n): Promise<void> {\n const theme = skipBuild ? await validateTheme(root) : await buildTheme(root, false);\n // Run the AI-metadata gate before uploading. `theme build` already runs it\n // when `skipBuild === false`, but skipping the check here would let\n // `--skip-build` bypass the contract entirely, and we want a single source\n // of truth for \"is this theme allowed to leave the developer's machine?\".\n if (!skipCheck) {\n const ok = runThemeCheck(theme);\n if (!ok) {\n throw new Error(\n \"AI metadata check failed. Fix the errors above or rerun with --skip-check.\",\n );\n }\n }\n const files = await collectThemeArtifactFiles(theme);\n if (!theme.clientEntryPath) {\n throw new Error(\"Missing dist/runtime.client.js. Run `suda theme build` first.\");\n }\n\n const config = await readAuthConfig();\n if (!config) {\n throw new Error(\"Not logged in. Run `suda auth login` to authenticate first.\");\n }\n\n const baseUrl = `${protocolForHost(config.host)}://${config.host}`;\n const { key, version } = theme.module.manifest;\n\n const intentRes = await fetch(`${baseUrl}/api/cli/themes/publish-intent`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n files: files.map((f) => ({ relativePath: f.relativePath, contentType: f.contentType })),\n }),\n });\n\n if (!intentRes.ok) {\n const errorData = (await intentRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to get publish intent: ${errorData.error || intentRes.statusText}`);\n }\n\n const { urls } = (await intentRes.json()) as { urls: Array<{ relativePath: string; url: string }> };\n\n // Upload to S3 using presigned URLs\n for (const file of files) {\n const urlObj = urls.find((u) => u.relativePath === file.relativePath);\n if (!urlObj) {\n throw new Error(`Missing presigned URL for ${file.relativePath}`);\n }\n\n const body = await readFile(file.absolutePath);\n const putRes = await fetch(urlObj.url, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": file.contentType,\n },\n body,\n });\n\n if (!putRes.ok) {\n throw new Error(`Failed to upload ${file.relativePath}: ${putRes.statusText}`);\n }\n console.log(`uploaded ${createThemeObjectKey(key, version, file.relativePath)}`);\n }\n\n const digest = await checksum(files);\n const bundleArtifactRelative = \"dist/index.js\";\n const bundleArtifactExists = files.some((f) => f.relativePath === bundleArtifactRelative);\n if (!bundleArtifactExists) {\n throw new Error(`Missing ${bundleArtifactRelative} in theme artifacts.`);\n }\n\n const previewArtifactRelative = \"dist/preview/desktop.png\";\n const previewArtifactExists = await pathExists(path.join(theme.root, previewArtifactRelative));\n const agentManifest = createThemeAgentManifest(theme.module);\n\n const completeRes = await fetch(`${baseUrl}/api/cli/themes/publish-complete`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.sessionToken}`,\n },\n body: JSON.stringify({\n key,\n version,\n checksum: digest,\n manifest: theme.module.manifest,\n agentManifest,\n bundleArtifactRelative,\n previewArtifactRelative: previewArtifactExists ? previewArtifactRelative : undefined,\n }),\n });\n\n if (!completeRes.ok) {\n const errorData = (await completeRes.json().catch(() => ({}))) as { error?: string };\n throw new Error(`Failed to complete publish: ${errorData.error || completeRes.statusText}`);\n }\n\n console.log(`published ${key}@${version}`);\n}\n\ninterface CliPackageVersions {\n /** Caret-prefixed semver range to install for `@sudajs/theme-engine`. */\n themeEngine: string;\n /** Caret-prefixed semver range to install for `@sudajs/cli`. */\n cli: string;\n}\n\nlet cachedCliPackageVersions: CliPackageVersions | undefined;\n\n/**\n * Reads the CLI's own `package.json` so scaffolded themes pin to a\n * `@sudajs/theme-engine` whose types match the CLI invoking `theme init`.\n *\n * In the published CLI, `dependencies[\"@sudajs/theme-engine\"]` is already a\n * real semver range (changesets resolves `workspace:*` at publish time), so\n * we forward it verbatim. In the monorepo (`workspace:*`) we instead read\n * the live `@sudajs/theme-engine/package.json` so the scaffolded starter\n * pins to the version under development, which can diverge from the CLI's\n * own version after this release decoupled the two majors.\n */\nasync function readCliPackageVersions(): Promise<CliPackageVersions> {\n if (cachedCliPackageVersions) {\n return cachedCliPackageVersions;\n }\n const here = fileURLToPath(import.meta.url);\n // dist/index.js or src/index.ts → ../package.json\n const cliPkgPath = path.resolve(path.dirname(here), \"..\", \"package.json\");\n let cliRaw: string;\n try {\n cliRaw = await readFile(cliPkgPath, \"utf8\");\n } catch {\n // Should not happen in a real install, but stay resilient in tests.\n cachedCliPackageVersions = { themeEngine: \"*\", cli: \"*\" };\n return cachedCliPackageVersions;\n }\n const cliPkg = JSON.parse(cliRaw) as {\n version?: string;\n dependencies?: Record<string, string>;\n };\n const cliVersion = typeof cliPkg.version === \"string\" ? cliPkg.version : \"0.0.0\";\n const declaredEngine = cliPkg.dependencies?.[\"@sudajs/theme-engine\"];\n let themeEngine: string;\n if (declaredEngine && !declaredEngine.startsWith(\"workspace:\")) {\n // Published CLI tarball: changesets has already replaced workspace:* with\n // a real semver range, which is exactly what we want to forward.\n themeEngine = declaredEngine;\n } else {\n // Monorepo / development: resolve the engine's actual version from its\n // own package.json. The CLI version is NOT a safe fallback here — the\n // engine and CLI ship independent majors via separate changesets, so\n // `^${cliVersion}` could pin scaffolded themes to a non-existent or\n // incompatible engine release. We instead error out loudly so a broken\n // dev environment is fixed before generating a starter.\n let resolved: string | undefined;\n try {\n const require = createRequire(import.meta.url);\n const enginePkgPath = require.resolve(\"@sudajs/theme-engine/package.json\");\n const engineRaw = await readFile(enginePkgPath, \"utf8\");\n const engineVersion = (JSON.parse(engineRaw) as { version?: string }).version;\n if (typeof engineVersion === \"string\" && engineVersion.length > 0) {\n resolved = `^${engineVersion}`;\n }\n } catch {\n // fall through to the explicit error below\n }\n if (!resolved) {\n throw new Error(\n \"suda theme init: cannot determine the @sudajs/theme-engine version to scaffold. \" +\n \"The CLI's package.json declares it as `workspace:*` (monorepo dev mode) but \" +\n \"`@sudajs/theme-engine/package.json` could not be resolved from the CLI's runtime. \" +\n \"Run `pnpm install` and re-run from the monorepo root, or install a published \" +\n \"@sudajs/cli tarball (which pins a real semver range).\",\n );\n }\n themeEngine = resolved;\n }\n cachedCliPackageVersions = {\n themeEngine,\n cli: `^${cliVersion}`,\n };\n return cachedCliPackageVersions;\n}\n\nasync function initTheme(target: string): Promise<void> {\n const key = path\n .basename(target)\n .replace(/[^a-zA-Z0-9._-]/g, \"-\")\n .toLowerCase();\n // Pin scaffolded themes to the CLI's own dependency declarations so\n // `suda theme init` never produces a project that pulls in an older\n // `@sudajs/theme-engine` whose `SudaComponentConfig` type is out of sync\n // with the CLI's `theme check` requirements.\n const cliPackageVersions = await readCliPackageVersions();\n await mkdir(path.join(target, \"src\"), { recursive: true });\n await writeFile(\n path.join(target, \"package.json\"),\n `${JSON.stringify(\n {\n name: `@suda-themes/${key}`,\n version: \"0.1.0\",\n private: true,\n packageManager: \"pnpm@11.6.0\",\n type: \"module\",\n main: \"./dist/index.js\",\n types: \"./dist/index.d.ts\",\n scripts: {\n // `build:src` compiles TypeScript sources to dist/. `build` then runs\n // `suda theme build --skip-theme-build` so the CLI does not recurse\n // back into this script (it would otherwise see scripts.build and\n // call `pnpm run build` again, causing infinite recursion).\n \"build:src\": \"tsc -p tsconfig.json\",\n build: \"pnpm run build:src && suda theme build --theme-root . --skip-theme-build\",\n dev: \"suda theme dev --theme-root . --skip-theme-build\",\n typecheck: \"tsc -p tsconfig.json --noEmit\",\n validate: \"suda theme validate --theme-root .\",\n preview: \"suda theme preview --theme-root .\",\n },\n dependencies: {\n \"@sudajs/theme-engine\": cliPackageVersions.themeEngine,\n },\n devDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n \"@sudajs/cli\": cliPackageVersions.cli,\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n typescript: \"^5.6.0\",\n },\n peerDependencies: {\n \"@puckeditor/core\": \"^0.21.2\",\n react: \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n },\n },\n null,\n 2,\n )}\\n`,\n );\n // pnpm 11 removed `pnpm.onlyBuiltDependencies` from `package.json` and the\n // `package.json#pnpm` overrides field; everything must live in\n // `pnpm-workspace.yaml`. Even a standalone single-package theme project\n // needs this file to allow esbuild's postinstall to run.\n await writeFile(\n path.join(target, \"pnpm-workspace.yaml\"),\n `# This is NOT a monorepo marker — it only exists because pnpm 11 moved\\n# project-level settings such as \\`allowBuilds\\` out of package.json. Without\\n# a \\`packages:\\` field this workspace contains just the current package, so\\n# the project remains a standalone single-package theme.\\n# See https://pnpm.io/settings and https://pnpm.io/pnpm-workspace_yaml.\\nallowBuilds:\\n esbuild: true\\n`,\n );\n await writeFile(\n path.join(target, \"tsconfig.json\"),\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"DOM\", \"DOM.Iterable\", \"ES2022\"],\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n jsx: \"react-jsx\",\n rootDir: \"src\",\n outDir: \"dist\",\n declaration: true,\n declarationMap: true,\n sourceMap: true,\n strict: true,\n noUncheckedIndexedAccess: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n types: [\"node\"],\n },\n // `package.json` is included so `src/index.tsx` can read its `version`\n // via `import pkg from \"../package.json\"`. tsc tolerates this with\n // rootDir pinned because the JSON is resolved as input but not emitted.\n include: [\"src\", \"package.json\"],\n },\n null,\n 2,\n )}\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"manifest.ts\"),\n `import type { ThemeSourceManifest } from \"@sudajs/theme-engine\";\\n\\n// Source-side manifest — version is intentionally omitted because the\\n// authoritative theme version lives in package.json. \\`src/index.tsx\\` reads\\n// package.json#version and merges it into the published ThemeManifest, so a\\n// single \\`pnpm changeset version\\` (or \\`npm version\\`) bumps everything.\\nexport const sourceManifest: ThemeSourceManifest = {\\n key: \"${key}\",\\n name: \"${key}\",\\n categories: [\"other\"],\\n minEngineVersion: \"0.0.0\",\\n entry: \"dist/index.js\",\\n clientEntry: \"dist/runtime.client.js\",\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"sections.tsx\"),\n `import type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\n\\nexport const Hero: SudaComponentConfig = {\\n label: \"Hero\",\\n ai: {\\n instructions:\\n \"Primary page introduction used to communicate the main value proposition. \" +\\n \"Place near the beginning of landing, product, service, or campaign pages. \" +\\n \"Include one concise headline, supporting copy, and one primary call to action. \" +\\n \"Use at most once per page. Do not use for ordinary section headings or article content.\",\\n },\\n fields: {\\n eyebrow: { type: \"text\", label: \"Eyebrow\" },\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n primaryLabel: { type: \"text\", label: \"Primary button label\" },\\n primaryHref: { type: \"text\", label: \"Primary button link\" },\\n },\\n defaultProps: {\\n eyebrow: \"New theme\",\\n title: \"Build with SudaCloud\",\\n description: \"Edit this starter section in the visual editor.\",\\n primaryLabel: \"Get started\",\\n primaryHref: \"#contact\",\\n },\\n render: ({ eyebrow, title, description, primaryLabel, primaryHref }) => (\\n <section className=\"${key}-section ${key}-hero\">\\n <p className=\"${key}-eyebrow\">{eyebrow}</p>\\n <h1>{title}</h1>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={primaryHref}>{primaryLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const FeatureGrid: SudaComponentConfig = {\\n label: \"Feature grid\",\\n ai: {\\n instructions:\\n \"Section that lists 3–6 short feature or benefit cards explaining what the product or service offers. \" +\\n \"Place after the hero / introduction and before the final call-to-action. \" +\\n \"Use when the page needs to communicate multiple distinct value points; do not use for testimonials, FAQs, or step-by-step processes.\",\\n },\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n features: {\\n type: \"array\",\\n label: \"Features\",\\n arrayFields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n },\\n },\\n },\\n defaultProps: {\\n title: \"Everything you need to launch\",\\n description: \"Use this section to explain the core value of the project.\",\\n features: [\\n { title: \"Fast setup\", description: \"Start from a clean theme contract.\" },\\n { title: \"Visual editing\", description: \"Expose content fields through Puck.\" },\\n { title: \"Publish ready\", description: \"Build and publish with the Suda CLI.\" },\\n ],\\n },\\n render: ({ title, description, features = [] }) => (\\n <section className=\"${key}-section\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <div className=\"${key}-grid\">\\n {features.map((feature: { title?: string; description?: string }, index: number) => (\\n <article className=\"${key}-card\" key={index}>\\n <h3>{feature.title}</h3>\\n <p>{feature.description}</p>\\n </article>\\n ))}\\n </div>\\n </section>\\n ),\\n};\\n\\nexport const Testimonial: SudaComponentConfig = {\\n label: \"Testimonial\",\\n ai: {\\n instructions:\\n \"Section that quotes a single customer or expert as social proof. \" +\\n \"Place mid-page after a feature or value section, or near the end before the final CTA. \" +\\n \"Do not invent quotes, names, or roles; only use content the user provides.\",\\n },\\n fields: {\\n quote: { type: \"textarea\", label: \"Quote\" },\\n author: { type: \"text\", label: \"Author\" },\\n role: { type: \"text\", label: \"Role\" },\\n },\\n defaultProps: {\\n quote: \"SudaCloud gives our team a practical editing workflow without giving up theme control.\",\\n author: \"Alex Chen\",\\n role: \"Founder\",\\n },\\n render: ({ quote, author, role }) => (\\n <section className=\"${key}-section ${key}-quote\">\\n <blockquote>{quote}</blockquote>\\n <p>{author} · {role}</p>\\n </section>\\n ),\\n};\\n\\nexport const CallToAction: SudaComponentConfig = {\\n label: \"Call to action\",\\n ai: {\\n instructions:\\n \"Closing conversion section that invites the visitor to take a specific action (sign up, contact, buy, etc.). \" +\\n \"Place near the end of the page, after supporting content. \" +\\n \"Use at most once per page. Do not use as the page's first introduction — the Hero component fills that role.\",\\n },\\n fields: {\\n title: { type: \"text\", label: \"Title\" },\\n description: { type: \"textarea\", label: \"Description\" },\\n buttonLabel: { type: \"text\", label: \"Button label\" },\\n buttonHref: { type: \"text\", label: \"Button link\" },\\n },\\n defaultProps: {\\n title: \"Ready to build your next page?\",\\n description: \"Use this section as the final conversion block.\",\\n buttonLabel: \"Contact us\",\\n buttonHref: \"#contact\",\\n },\\n render: ({ title, description, buttonLabel, buttonHref }) => (\\n <section className=\"${key}-section ${key}-cta\" id=\"contact\">\\n <h2>{title}</h2>\\n <p>{description}</p>\\n <a className=\"${key}-button\" href={buttonHref}>{buttonLabel}</a>\\n </section>\\n ),\\n};\\n\\nexport const SECTION_COMPONENTS = { Hero, FeatureGrid, Testimonial, CallToAction };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"layout.tsx\"),\n `import { getPageSlot } from \"@sudajs/theme-engine/runtime\";\\nimport type { Config } from \"@puckeditor/core\";\\nimport type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\nimport type { ReactElement, ReactNode } from \"react\";\\n\\ntype PuckExtras = { puck?: { metadata?: Record<string, unknown> } };\\n\\nexport const rootConfig: NonNullable<Config[\"root\"]> = {\\n fields: {\\n siteName: { type: \"text\", label: \"Site name\" },\\n },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ children, siteName }: { children?: ReactNode; siteName?: string }) => (\\n <div className=\"${key}-root\" data-site-name={siteName}>{children}</div>\\n ),\\n};\\n\\nexport const Header: SudaComponentConfig = {\\n label: \"Header\",\\n ai: {\\n instructions:\\n \"Site-wide header rendered at the top of every page. \" +\\n \"Place once at the top of the layout (not inside page content). \" +\\n \"Used for branding and primary navigation, not for promotional content.\",\\n },\\n fields: { siteName: { type: \"text\", label: \"Site name\" } },\\n defaultProps: { siteName: \"${key}\" },\\n render: ({ siteName }) => <header className=\"${key}-header\">{siteName}</header>,\\n};\\n\\nexport const PageOutlet: SudaComponentConfig = {\\n label: \"Page outlet\",\\n ai: {\\n exclude: true,\\n instructions:\\n \"Structural slot where each page's content is injected. \" +\\n \"Managed by the layout, never created or placed by AI.\",\\n },\\n fields: {},\\n defaultProps: {},\\n render: (props: PuckExtras): ReactElement => <>{getPageSlot(props.puck?.metadata)}</>,\\n};\\n\\nexport const Footer: SudaComponentConfig = {\\n label: \"Footer\",\\n ai: {\\n instructions:\\n \"Site-wide footer rendered at the bottom of every page. \" +\\n \"Place once at the end of the layout. \" +\\n \"Used for legal text, copyright, and secondary links — not for primary CTAs.\",\\n },\\n fields: { text: { type: \"text\", label: \"Text\" } },\\n defaultProps: { text: \"© ${key}\" },\\n render: ({ text }) => <footer className=\"${key}-footer\">{text}</footer>,\\n};\\n\\nexport const LAYOUT_COMPONENTS = { Header, PageOutlet, Footer };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"config.ts\"),\n `import type { Config, Data } from \"@puckeditor/core\";\\n\\nimport { LAYOUT_COMPONENTS, rootConfig } from \"./layout.js\";\\nimport { SECTION_COMPONENTS } from \"./sections.js\";\\n\\nexport const pageConfig: Config = {\\n components: SECTION_COMPONENTS,\\n};\\n\\nexport const layoutConfig: Config = {\\n root: rootConfig,\\n components: LAYOUT_COMPONENTS,\\n};\\n\\nexport const defaultLayout: Data = {\\n root: { props: { siteName: \"${key}\" } },\\n content: [\\n { type: \"Header\", props: { id: \"Header-1\", siteName: \"${key}\" } },\\n { type: \"PageOutlet\", props: { id: \"PageOutlet-1\" } },\\n { type: \"Footer\", props: { id: \"Footer-1\", text: \"© ${key}\" } },\\n ],\\n};\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"templates.ts\"),\n `import type { ThemeStarterPage } from \"@sudajs/theme-engine\";\\n\\nexport const starterPages: ThemeStarterPage[] = [\\n {\\n slug: \"home\",\\n title: \"Home\",\\n isHome: true,\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-1\",\\n eyebrow: \"Starter page\",\\n title: \"Welcome to ${key}\",\\n description: \"This page was generated by suda theme init.\",\\n primaryLabel: \"Explore features\",\\n primaryHref: \"#features\",\\n },\\n },\\n {\\n type: \"FeatureGrid\",\\n props: {\\n id: \"FeatureGrid-1\",\\n title: \"Designed for editable sites\",\\n description: \"Starter sections show agents and editors how this theme is structured.\",\\n features: [\\n { title: \"Typed fields\", description: \"Each section exposes a clear field schema.\" },\\n { title: \"Starter pages\", description: \"Templates show realistic section composition.\" },\\n { title: \"CLI workflow\", description: \"Build, validate, preview, and publish from one tool.\" },\\n ],\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-1\",\\n title: \"Launch your first page\",\\n description: \"Customize this starter template or let an agent generate a new draft.\",\\n buttonLabel: \"Get in touch\",\\n buttonHref: \"/contact\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"about\",\\n title: \"About\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-About\",\\n eyebrow: \"About\",\\n title: \"A clean starting point for your story\",\\n description: \"Use this page to introduce the project, audience, and promise.\",\\n primaryLabel: \"Contact us\",\\n primaryHref: \"/contact\",\\n },\\n },\\n {\\n type: \"Testimonial\",\\n props: {\\n id: \"Testimonial-About\",\\n quote: \"This starter theme keeps the editable surface focused and predictable.\",\\n author: \"SudaCloud\",\\n role: \"Theme team\",\\n },\\n },\\n ],\\n },\\n },\\n {\\n slug: \"contact\",\\n title: \"Contact\",\\n data: {\\n root: { props: {} },\\n content: [\\n {\\n type: \"Hero\",\\n props: {\\n id: \"Hero-Contact\",\\n eyebrow: \"Contact\",\\n title: \"Let's talk\",\\n description: \"Tell visitors how to reach you and what happens next.\",\\n primaryLabel: \"Email us\",\\n primaryHref: \"mailto:hello@example.com\",\\n },\\n },\\n {\\n type: \"CallToAction\",\\n props: {\\n id: \"CallToAction-Contact\",\\n title: \"Start the conversation\",\\n description: \"Replace this copy with your preferred contact details or form link.\",\\n buttonLabel: \"Send an email\",\\n buttonHref: \"mailto:hello@example.com\",\\n },\\n },\\n ],\\n },\\n },\\n];\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"index.tsx\"),\n `import type { ThemeManifest, ThemeModule } from \"@sudajs/theme-engine\";\\n\\nimport pkg from \"../package.json\" with { type: \"json\" };\\nimport { defaultLayout, layoutConfig, pageConfig } from \"./config.js\";\\nimport { sourceManifest } from \"./manifest.js\";\\nimport { starterPages } from \"./templates.js\";\\n\\n// Single source of truth: theme version comes from package.json#version,\\n// merged into the source-side manifest. esbuild inlines the JSON import at\\n// build time, so the published \\`dist/index.js\\` is fully self-contained.\\nexport const manifest: ThemeManifest = { ...sourceManifest, version: pkg.version };\\n\\nconst theme: ThemeModule = {\\n manifest,\\n pageConfig,\\n layoutConfig,\\n defaultLayout,\\n starterPages,\\n};\\n\\nexport default theme;\\nexport { pageConfig, layoutConfig, defaultLayout, starterPages };\\n`,\n );\n await writeFile(\n path.join(target, \"src\", \"runtime.client.ts\"),\n '\"use client\";\\n\\nimport theme from \"./index.js\";\\n\\nexport default theme;\\n',\n );\n await writeFile(\n path.join(target, \"styles.css\"),\n `.${key}-root { font-family: Inter, ui-sans-serif, system-ui, sans-serif; color: #111827; background: #ffffff; }\\n.${key}-header, .${key}-footer { padding: 20px clamp(20px, 5vw, 64px); border-bottom: 1px solid #e5e7eb; }\\n.${key}-footer { border-top: 1px solid #e5e7eb; border-bottom: 0; color: #6b7280; }\\n.${key}-section { padding: 64px clamp(20px, 5vw, 64px); }\\n.${key}-hero { background: #f8fafc; }\\n.${key}-eyebrow { text-transform: uppercase; letter-spacing: 0.08em; font-size: 12px; color: #2563eb; font-weight: 700; }\\n.${key}-section h1 { max-width: 780px; font-size: clamp(40px, 7vw, 72px); line-height: 0.95; margin: 0 0 20px; }\\n.${key}-section h2 { max-width: 720px; font-size: 36px; line-height: 1.05; margin: 0 0 16px; }\\n.${key}-section p { max-width: 680px; line-height: 1.7; color: #4b5563; }\\n.${key}-button { display: inline-flex; align-items: center; min-height: 42px; padding: 0 18px; border-radius: 8px; background: #111827; color: #ffffff; text-decoration: none; font-weight: 700; }\\n.${key}-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; margin-top: 28px; }\\n.${key}-card { border: 1px solid #e5e7eb; border-radius: 8px; padding: 20px; }\\n.${key}-quote blockquote { max-width: 780px; font-size: 28px; line-height: 1.25; margin: 0 0 16px; }\\n.${key}-cta { background: #111827; color: #ffffff; }\\n.${key}-cta p { color: #d1d5db; }\\n.${key}-cta .${key}-button { background: #ffffff; color: #111827; }\\n`,\n );\n await writeFile(path.join(target, \".gitignore\"), \"node_modules\\ndist\\n*.tsbuildinfo\\n\");\n await writeFile(\n path.join(target, \"AGENTS.md\"),\n `# Suda Theme Agent Guide\\n\\nThis directory is a Suda theme source project generated by \\`suda theme init\\`.\\nIt is a **standalone** npm package — it does not depend on the SudaCloud monorepo.\\n\\n## What to edit\\n\\n- Add page sections in \\`src/sections.tsx\\` and register them in \\`SECTION_COMPONENTS\\`.\\n- Add starter pages in \\`src/templates.ts\\` to show realistic section combinations.\\n- Keep shared site chrome in \\`src/layout.tsx\\`; \\`PageOutlet\\` is where page content renders.\\n- Keep \\`src/index.tsx\\` exporting the source \\`ThemeModule\\`. The final artifact is produced by \\`suda theme build\\`.\\n- All relative imports under \\`src/\\` MUST include the \\`.js\\` extension (NodeNext ESM resolution).\\n\\n## Page content rules\\n\\n- Agent page files passed to \\`suda agent page validate/create\\` contain \\`content\\` and optional \\`zones\\` only.\\n- Every \\`content[]\\` item must use a section type from \\`SECTION_COMPONENTS\\`.\\n- Every \\`content[]\\` item must include \\`props.id\\`.\\n- Prefer editing section props over changing render code when generating pages.\\n- Do not edit files under \\`dist/\\`; they are generated.\\n\\n## AI metadata (required)\\n\\nEvery component (and zone-level layout component) **must** declare \\`ai.instructions\\`.\\nWithout it the page-generation agent has no way to know what the component is for,\\nand \\`suda theme check\\` (run automatically before publish) will fail.\\n\\n### Component-level \\`ai\\`\\n\\nEach \\`ComponentConfig\\` must include:\\n\\n\\`\\`\\`ts\\nimport type { SudaComponentConfig } from \"@sudajs/theme-engine\";\\n\\nexport const Hero: SudaComponentConfig = {\\n label: \"Hero\",\\n ai: {\\n instructions:\\n \"Primary page introduction used to communicate the main value proposition. \" +\\n \"Place near the beginning of landing or product pages. \" +\\n \"Include one primary CTA. Use at most once per page. \" +\\n \"Do not use for ordinary section headings or article content.\",\\n },\\n fields: { /* ... */ },\\n defaultProps: { /* ... */ },\\n render: (props) => /* ... */,\\n};\\n\\`\\`\\`\\n\\nA good \\`instructions\\` covers, in plain English:\\n\\n1. **Purpose** — what role this component plays on a page.\\n2. **Use when** — page types or scenarios where it should be selected.\\n3. **Avoid when** — situations that look similar but call for a different component.\\n4. **Placement** — where in the page it normally belongs (top, after features, near end, etc.).\\n5. **Frequency / composition** — how many times it can appear, what it must contain, and any adjacency rules.\\n\\nWrite executable, specific sentences (\\`Use when...\\`, \\`Place after...\\`, \\`Use at most once per page.\\`).\\nDo **not** describe styling (colors, fonts, spacing) — those belong to the design system.\\nDo **not** write vague filler like \"modern\", \"engaging\", \"beautiful\".\\n\\nIf two components look similar (e.g. Hero vs. PageHeader vs. SectionHeader),\\ntheir \\`instructions\\` must explicitly differentiate them, otherwise the agent\\nwill mix them up.\\n\\n### Hiding a component from AI\\n\\nUse \\`ai.exclude: true\\` for internal/debug components or anything the agent\\nshould never auto-create. Such components remain editable by humans:\\n\\n\\`\\`\\`ts\\nai: { exclude: true, instructions: \"Internal debug block; AI must not create it.\" }\\n\\`\\`\\`\\n\\n### Field-level \\`ai\\` (recommended, optional)\\n\\nField-level metadata sharpens the generated content but is **not required**.\\nUse it when a field's name and type alone don't fully convey the constraints:\\n\\n\\`\\`\\`ts\\nfields: {\\n title: {\\n type: \"text\",\\n ai: {\\n instructions:\\n \"Main value-proposition headline. 4–12 words, focus on the visitor benefit, \" +\\n \"do not repeat the eyebrow or description.\",\\n required: true,\\n },\\n },\\n imageUrl: {\\n type: \"text\",\\n ai: {\\n // Atomic values that cannot render correctly while half-streamed.\\n stream: false,\\n instructions: \"Image that supports the section topic. Avoid logos, screenshots, or unrelated decoration.\",\\n },\\n },\\n}\\n\\`\\`\\`\\n\\nSupported field-level keys: \\`instructions\\`, \\`required\\`, \\`exclude\\`, \\`stream\\`,\\n\\`bind\\` (delegate to a tool), and \\`schema\\` (only needed for \\`custom\\` / \\`external\\` /\\n\\`user\\` fields whose runtime shape can't be inferred).\\n\\n### Verifying\\n\\n\\`\\`\\`bash\\npnpm build # also runs the AI metadata check\\nsuda theme check # run the check on its own\\n\\`\\`\\`\\n\\nMissing component-level \\`ai.instructions\\` is reported as an **error** and blocks\\nthe build. Very short or label-repeating instructions are reported as\\n**warnings**.\\n\\n## Useful commands\\n\\n\\`\\`\\`bash\\npnpm install\\npnpm typecheck\\npnpm build # tsc + suda theme build --skip-theme-build (runs AI check)\\npnpm validate\\npnpm preview\\nsuda theme check # AI metadata check only\\nsuda agent theme describe local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\nsuda agent page validate --theme local --input ./page.json --theme-root .\\n\\`\\`\\`\\n`,\n );\n await writeFile(\n path.join(target, \"CLAUDE.md\"),\n `# Claude Code\\n\\nRead \\`AGENTS.md\\` first. It is the canonical guide for this Suda theme project.\\n`,\n );\n await writeFile(\n path.join(target, \"README.md\"),\n `# ${key}\\n\\nA Suda theme scaffolded with \\`suda theme init\\`. This is a standalone\\npackage; it does not need to live inside the SudaCloud monorepo.\\n\\n## Setup\\n\\n\\`\\`\\`bash\\npnpm install\\n\\`\\`\\`\\n\\n## Develop\\n\\n\\`\\`\\`bash\\npnpm typecheck # type-check sources\\npnpm build # tsc + suda theme build (server bundle + client runtime + manifest)\\npnpm dev # watch the browser runtime\\npnpm preview # build and preview the home starter page\\npnpm validate # validate the dist artifact\\n\\`\\`\\`\\n\\n## Agent tooling\\n\\n\\`\\`\\`bash\\nsuda agent theme describe local --theme-root .\\nsuda agent page schema local --theme-root .\\nsuda agent section schema --theme local --section Hero --theme-root .\\n\\`\\`\\`\\n\\n## Publish\\n\\n\\`\\`\\`bash\\npnpm build\\nsuda theme screenshot # optional: capture dist/preview/desktop.png\\nsuda theme publish\\n\\`\\`\\`\\n`,\n );\n console.log(`created theme scaffold at ${target}`);\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"suda\")\n .description(\"Suda CLI for managing themes, sites, posts and AI tooling.\")\n .version(\"0.0.0\");\n\n const theme = program.command(\"theme\").description(\"Manage Suda theme artifacts.\");\n\n theme\n .command(\"init\")\n .description(\"Scaffold a new theme source directory.\")\n .argument(\"[dir]\", \"Theme directory to create.\", \"./theme\")\n .action(async (dir: string) => {\n await initTheme(path.resolve(dir));\n });\n\n theme\n .command(\"validate\")\n .description(\"Validate a built theme artifact.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .action(async (options: ThemeRootOptions) => {\n const result = await validateTheme(resolveThemeRoot(options));\n console.log(`valid ${result.module.manifest.key}@${result.module.manifest.version}`);\n if (!result.clientEntryPath) {\n console.warn(\n \"warning: dist/runtime.client.js is missing; editor runtime will not load until `suda theme build` runs.\",\n );\n }\n });\n\n theme\n .command(\"build\")\n .description(\"Build server dist (via package script) and browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .option(\n \"--skip-check\",\n \"Skip the AI metadata check that normally runs after build.\",\n )\n .action(async (options: BuildOptions) => {\n const result = await buildTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n console.log(`built ${result.module.manifest.key}@${result.module.manifest.version}`);\n if (options.skipCheck !== true) {\n const ok = runThemeCheck(result);\n if (!ok) {\n throw new Error(\n \"AI metadata check failed. Fix the errors above or rerun with --skip-check.\",\n );\n }\n }\n });\n\n theme\n .command(\"check\")\n .description(\n \"Run AI metadata checks on a built theme without rebuilding. Reports missing component-level ai.instructions as errors and weak content as warnings.\",\n )\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .action(async (options: CheckOptions) => {\n const theme = await validateTheme(resolveThemeRoot(options));\n const ok = runThemeCheck(theme);\n if (!ok) {\n process.exitCode = 1;\n }\n });\n\n theme\n .command(\"dev\")\n .description(\"Watch and rebuild the browser runtime.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-theme-build\", \"Skip the theme package build script.\")\n .action(async (options: BuildOptions) => {\n await watchTheme(resolveThemeRoot(options), options.skipThemeBuild === true);\n });\n\n theme\n .command(\"preview\")\n .description(\"Build and serve the local theme artifact files.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--port <port>\", \"Preview server port.\", \"4177\")\n .action(async (options: PreviewOptions) => {\n const port = Number(options.port ?? \"4177\");\n await previewTheme(resolveThemeRoot(options), Number.isFinite(port) ? port : 4177);\n });\n\n theme\n .command(\"screenshot\")\n .description(\n \"Capture a desktop preview screenshot of the home starter page using Playwright.\",\n )\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--output <path>\", \"Output PNG path relative to theme root.\")\n .option(\"--width <px>\", \"Viewport width in pixels.\", \"1280\")\n .option(\"--height <px>\", \"Viewport height in pixels.\", \"800\")\n .option(\"--port <port>\", \"Preview server port used during capture.\", \"4178\")\n .option(\"--skip-build\", \"Skip rebuilding the theme before capturing.\")\n .action(async (options: ScreenshotOptions) => {\n await screenshotTheme(resolveThemeRoot(options), options);\n });\n\n theme\n .command(\"publish\")\n .description(\"Upload artifact to S3 and upsert ThemePackage/ThemeVersion.\")\n .option(\"--theme-root <path>\", \"Theme source/artifact root.\")\n .option(\"--skip-build\", \"Publish existing dist files without rebuilding.\")\n .option(\n \"--skip-check\",\n \"Skip the AI metadata check that normally runs before upload.\",\n )\n .action(async (options: PublishOptions) => {\n await publishTheme(\n resolveThemeRoot(options),\n options.skipBuild === true,\n options.skipCheck === true,\n );\n });\n\n const agent = program.command(\"agent\").description(\"Agent-friendly theme and page tooling.\");\n\n const agentProject = agent\n .command(\"project\")\n .description(\"Manage Suda projects from the CLI.\");\n\n agentProject\n .command(\"list\")\n .description(\"List Suda projects the current CLI user can access.\")\n .action(async () => {\n const projects = await listAgentProjects();\n printJson({ projects });\n });\n\n agentProject\n .command(\"create\")\n .description(\n \"Create a new Suda project (mirrors onboarding). External AI should ask the user for a website name and short business description before calling this.\",\n )\n .requiredOption(\"--name <name>\", \"Website or brand name.\")\n .requiredOption(\n \"--site-description <description>\",\n \"Short business introduction used to seed default site metadata.\",\n )\n .action(async (options: { name: string; siteDescription: string }) => {\n // Reuse the shared zod schema so CLI flag validation matches the MCP\n // tool input bounds and the server-side `/api/cli/agent/projects` route.\n const parsed = createProjectInputSchema.safeParse({\n name: options.name,\n siteDescription: options.siteDescription,\n });\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n const field = issue?.path[0] === \"siteDescription\" ? \"--site-description\" : \"--name\";\n throw new Error(`${field}: ${issue?.message ?? \"invalid value\"}`);\n }\n\n const result = await createAgentProject(parsed.data);\n printJson(result);\n });\n\n const agentThemes = agent.command(\"themes\").description(\"Manage agent-visible themes.\");\n\n agentThemes\n .command(\"list\")\n .description(\"List themes visible to the current CLI user.\")\n .option(\"--project-id <projectId>\", \"Scope results to a project.\")\n .option(\"--theme-root <path>\", \"Describe a local theme instead of the remote catalog.\")\n .action(async (options: AgentThemeOptions) => {\n const themes = await listAgentThemes(options);\n printJson({ themes });\n });\n\n const agentTheme = agent.command(\"theme\").description(\"Inspect a single theme.\");\n\n agentTheme\n .command(\"describe\")\n .description(\"Describe a theme's AI-first page schema.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\n });\n\n const agentPage = agent.command(\"page\").description(\"AI-first page content tooling.\");\n\n agentPage\n .command(\"schema\")\n .description(\"Print the AI-first page content output schema for a theme.\")\n .argument(\"<theme>\", \"Theme key.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .option(\"--example\", \"Include example page content.\")\n .action(async (themeKey: string, options: AgentThemeOptions) => {\n const manifest = await fetchAgentManifest(themeKey, options);\n printJson(createAgentPageSchemaOutput(manifest, { includeExample: options.example === true }));\n });\n\n agentPage\n .command(\"validate\")\n .description(\"Validate an AI-generated Suda page content JSON document.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; input: string }) => {\n await validateAgentPage(options.theme, options.input, options);\n });\n\n agentPage\n .command(\"create\")\n .description(\"Create a workspace page draft from AI-generated Suda page content JSON.\")\n .requiredOption(\"--project-id <projectId>\", \"Project id.\")\n .requiredOption(\"--title <title>\", \"Page title.\")\n .requiredOption(\"--slug <slug>\", \"Page slug.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--input <file>\", \"JSON file containing Suda page content.\")\n .option(\"--version <version>\", \"Theme version.\")\n .action(async (options: AgentPageCreateOptions) => {\n await createAgentPage(options);\n });\n\n const agentSection = agent.command(\"section\").description(\"Inspect a single section.\");\n\n agentSection\n .command(\"schema\")\n .description(\"Print one AI-first section output schema for a theme.\")\n .requiredOption(\"--theme <theme>\", \"Theme key.\")\n .requiredOption(\"--section <section>\", \"Section type.\")\n .option(\"--version <version>\", \"Theme version.\")\n .option(\"--project-id <projectId>\", \"Project scope.\")\n .option(\"--theme-root <path>\", \"Read a local theme.\")\n .action(async (options: AgentThemeOptions & { theme: string; section: string }) => {\n const manifest = await fetchAgentManifest(options.theme, options);\n printJson(createSectionSchema(manifest, options.section));\n });\n\n program\n .command(\"mcp\")\n .description(\"Run the Suda local MCP server over stdio.\")\n .action(async () => {\n await startMcpServer();\n });\n\n const authCmd = program.command(\"auth\").description(\"Manage Suda authentication.\");\n\n authCmd\n .command(\"login\")\n .description(\"Authenticate Suda CLI with a SudaCloud workspace.\")\n .option(\"--host <host>\", \"The SudaCloud workspace host to authenticate against.\", \"app.sudayun.cn\")\n .action(async (options: { host: string }) => {\n await login(options.host);\n });\n\n authCmd\n .command(\"status\")\n .description(\"Check current authentication status.\")\n .action(async () => {\n await status();\n });\n\n authCmd\n .command(\"logout\")\n .description(\"Clear local authentication configuration.\")\n .action(async () => {\n await logout();\n });\n\n program.showHelpAfterError();\n\n return program;\n}\n\nexport async function main(): Promise<void> {\n const program = buildProgram();\n const argv = process.argv.filter((arg, index) => index < 2 || arg !== \"--\");\n await program.parseAsync(argv);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudajs/cli",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "suda": "./bin/suda.js"
@@ -31,7 +31,7 @@
31
31
  "react": "^19.0.0",
32
32
  "react-dom": "^19.0.0",
33
33
  "zod": "^3.24.1",
34
- "@sudajs/theme-engine": "0.2.1"
34
+ "@sudajs/theme-engine": "1.0.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "^22.10.2",