@kitnai/cli 0.1.8 → 0.1.9

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
@@ -510,6 +510,40 @@ var init_tsconfig_patcher = __esm({
510
510
  }
511
511
  });
512
512
 
513
+ // src/installers/barrel-manager.ts
514
+ function createBarrelFile() {
515
+ return `${BARREL_COMMENT}
516
+ ${EXPORT_LINE}
517
+ `;
518
+ }
519
+ function addImportToBarrel(content, importPath) {
520
+ const importLine = `import "${importPath}";`;
521
+ if (content.includes(importLine)) return content;
522
+ const exportIndex = content.indexOf(EXPORT_LINE);
523
+ if (exportIndex === -1) {
524
+ return `${content.trimEnd()}
525
+ ${importLine}
526
+ ${EXPORT_LINE}
527
+ `;
528
+ }
529
+ const before = content.slice(0, exportIndex);
530
+ const after = content.slice(exportIndex);
531
+ return `${before}${importLine}
532
+ ${after}`;
533
+ }
534
+ function removeImportFromBarrel(content, importPath) {
535
+ const importLine = `import "${importPath}";`;
536
+ return content.split("\n").filter((line) => line.trim() !== importLine).join("\n");
537
+ }
538
+ var EXPORT_LINE, BARREL_COMMENT;
539
+ var init_barrel_manager = __esm({
540
+ "src/installers/barrel-manager.ts"() {
541
+ "use strict";
542
+ EXPORT_LINE = 'export { registerWithPlugin } from "@kitnai/core";';
543
+ BARREL_COMMENT = "// Managed by kitn CLI \u2014 components auto-imported below";
544
+ }
545
+ });
546
+
513
547
  // src/utils/hash.ts
514
548
  import { createHash } from "crypto";
515
549
  function contentHash(content) {
@@ -643,6 +677,9 @@ __export(add_exports, {
643
677
  import * as p3 from "@clack/prompts";
644
678
  import pc4 from "picocolors";
645
679
  import { join as join7 } from "path";
680
+ import { existsSync } from "fs";
681
+ import { readFile as readFile6, writeFile as writeFile6, mkdir as mkdir3 } from "fs/promises";
682
+ import { relative as relative2 } from "path";
646
683
  async function addCommand(components, opts) {
647
684
  p3.intro(pc4.bgCyan(pc4.black(" kitn add ")));
648
685
  const cwd = process.cwd();
@@ -695,10 +732,10 @@ async function addCommand(components, opts) {
695
732
  for (const item of resolved) {
696
733
  if (item.dependencies) allDeps.push(...item.dependencies);
697
734
  if (item.type === "kitn:package") {
698
- const baseDir = config.aliases.base ?? "src/ai";
735
+ const baseDir2 = config.aliases.base ?? "src/ai";
699
736
  for (const file of item.files) {
700
- const targetPath = join7(cwd, baseDir, file.path);
701
- const relativePath = join7(baseDir, file.path);
737
+ const targetPath = join7(cwd, baseDir2, file.path);
738
+ const relativePath = join7(baseDir2, file.path);
702
739
  const status = await checkFileStatus(targetPath, file.content);
703
740
  switch (status) {
704
741
  case "new" /* New */:
@@ -737,7 +774,7 @@ async function addCommand(components, opts) {
737
774
  const resolvedPaths = {};
738
775
  const installDir = item.installDir ?? item.name;
739
776
  for (const [key, values] of Object.entries(item.tsconfig)) {
740
- resolvedPaths[key] = values.map((v) => `./${join7(baseDir, installDir, v)}`);
777
+ resolvedPaths[key] = values.map((v) => `./${join7(baseDir2, installDir, v)}`);
741
778
  }
742
779
  await patchProjectTsconfig(cwd, resolvedPaths);
743
780
  p3.log.info(`Patched tsconfig.json with paths: ${Object.keys(resolvedPaths).join(", ")}`);
@@ -750,7 +787,7 @@ async function addCommand(components, opts) {
750
787
  registry: ref.namespace,
751
788
  version: item.version ?? "1.0.0",
752
789
  installedAt: (/* @__PURE__ */ new Date()).toISOString(),
753
- files: item.files.map((f) => join7(baseDir, f.path)),
790
+ files: item.files.map((f) => join7(baseDir2, f.path)),
754
791
  hash: contentHash(allContent)
755
792
  };
756
793
  config.installed = installed;
@@ -838,6 +875,61 @@ async function addCommand(components, opts) {
838
875
  config.installed = installed;
839
876
  }
840
877
  }
878
+ const BARREL_ELIGIBLE = /* @__PURE__ */ new Set(["kitn:agent", "kitn:tool", "kitn:skill"]);
879
+ const baseDir = config.aliases.base ?? "src/ai";
880
+ const barrelPath = join7(cwd, baseDir, "index.ts");
881
+ const barrelDir = join7(cwd, baseDir);
882
+ const barrelImports = [];
883
+ for (const item of resolved) {
884
+ if (!BARREL_ELIGIBLE.has(item.type)) continue;
885
+ for (const file of item.files) {
886
+ const aliasKey = (() => {
887
+ switch (item.type) {
888
+ case "kitn:agent":
889
+ return "agents";
890
+ case "kitn:tool":
891
+ return "tools";
892
+ case "kitn:skill":
893
+ return "skills";
894
+ }
895
+ })();
896
+ const fileName = file.path.split("/").pop();
897
+ const filePath = join7(cwd, config.aliases[aliasKey], fileName);
898
+ const importPath = "./" + relative2(barrelDir, filePath).replace(/\\/g, "/");
899
+ barrelImports.push(importPath);
900
+ }
901
+ }
902
+ if (barrelImports.length > 0) {
903
+ const barrelExisted = existsSync(barrelPath);
904
+ let barrelContent;
905
+ if (barrelExisted) {
906
+ barrelContent = await readFile6(barrelPath, "utf-8");
907
+ } else {
908
+ await mkdir3(barrelDir, { recursive: true });
909
+ barrelContent = createBarrelFile();
910
+ }
911
+ for (const importPath of barrelImports) {
912
+ barrelContent = addImportToBarrel(barrelContent, importPath);
913
+ }
914
+ await writeFile6(barrelPath, barrelContent);
915
+ p3.log.info(`Updated barrel file: ${join7(baseDir, "index.ts")}`);
916
+ if (!barrelExisted) {
917
+ p3.note(
918
+ [
919
+ `import { createAIPlugin } from "@kitnai/hono";`,
920
+ `import { registerWithPlugin } from "./ai";`,
921
+ ``,
922
+ `const plugin = createAIPlugin({`,
923
+ ` model: (model) => yourProvider(model ?? "default-model"),`,
924
+ `});`,
925
+ ``,
926
+ `registerWithPlugin(plugin);`,
927
+ `app.route("/api", plugin.app);`
928
+ ].join("\n"),
929
+ "Add this to your app setup"
930
+ );
931
+ }
932
+ }
841
933
  await writeConfig(cwd, config);
842
934
  const uniqueDeps = [...new Set(allDeps)];
843
935
  if (uniqueDeps.length > 0) {
@@ -886,7 +978,7 @@ async function addCommand(components, opts) {
886
978
  hints.push(pc4.dim(` import { yourProvider } from "your-ai-provider";`));
887
979
  hints.push(pc4.dim(``));
888
980
  hints.push(pc4.dim(` const plugin = createAIPlugin({`));
889
- hints.push(pc4.dim(` getModel: (id) => yourProvider(id ?? "default-model"),`));
981
+ hints.push(pc4.dim(` model: (model) => yourProvider(model ?? "default-model"),`));
890
982
  hints.push(pc4.dim(` });`));
891
983
  hints.push(pc4.dim(``));
892
984
  hints.push(pc4.dim(` const app = new Hono();`));
@@ -913,6 +1005,7 @@ var init_add = __esm({
913
1005
  init_env_writer();
914
1006
  init_import_rewriter();
915
1007
  init_tsconfig_patcher();
1008
+ init_barrel_manager();
916
1009
  init_hash();
917
1010
  init_parse_ref();
918
1011
  init_schema();
@@ -1102,8 +1195,9 @@ __export(remove_exports, {
1102
1195
  });
1103
1196
  import * as p6 from "@clack/prompts";
1104
1197
  import pc6 from "picocolors";
1105
- import { join as join9 } from "path";
1106
- import { unlink } from "fs/promises";
1198
+ import { join as join9, relative as relative3, dirname as dirname3 } from "path";
1199
+ import { unlink, readFile as readFile7, writeFile as writeFile7 } from "fs/promises";
1200
+ import { existsSync as existsSync2 } from "fs";
1107
1201
  async function removeCommand(componentName) {
1108
1202
  const cwd = process.cwd();
1109
1203
  const config = await readConfig(cwd);
@@ -1136,6 +1230,32 @@ async function removeCommand(componentName) {
1136
1230
  p6.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);
1137
1231
  }
1138
1232
  }
1233
+ const baseDir = config.aliases.base ?? "src/ai";
1234
+ const barrelPath = join9(cwd, baseDir, "index.ts");
1235
+ const barrelDir = join9(cwd, baseDir);
1236
+ const barrelEligibleDirs = /* @__PURE__ */ new Set([
1237
+ config.aliases.agents,
1238
+ config.aliases.tools,
1239
+ config.aliases.skills
1240
+ ]);
1241
+ if (existsSync2(barrelPath) && deleted.length > 0) {
1242
+ let barrelContent = await readFile7(barrelPath, "utf-8");
1243
+ let barrelChanged = false;
1244
+ for (const filePath of deleted) {
1245
+ const fileDir = dirname3(filePath);
1246
+ if (!barrelEligibleDirs.has(fileDir)) continue;
1247
+ const importPath = "./" + relative3(barrelDir, join9(cwd, filePath)).replace(/\\/g, "/");
1248
+ const updated = removeImportFromBarrel(barrelContent, importPath);
1249
+ if (updated !== barrelContent) {
1250
+ barrelContent = updated;
1251
+ barrelChanged = true;
1252
+ }
1253
+ }
1254
+ if (barrelChanged) {
1255
+ await writeFile7(barrelPath, barrelContent);
1256
+ p6.log.info(`Updated barrel file: ${join9(baseDir, "index.ts")}`);
1257
+ }
1258
+ }
1139
1259
  delete config.installed[installedKey];
1140
1260
  if (Object.keys(config.installed).length === 0) {
1141
1261
  delete config.installed;
@@ -1151,6 +1271,7 @@ var init_remove = __esm({
1151
1271
  "use strict";
1152
1272
  init_config();
1153
1273
  init_parse_ref();
1274
+ init_barrel_manager();
1154
1275
  }
1155
1276
  });
1156
1277
 
@@ -1186,7 +1307,7 @@ var init_update = __esm({
1186
1307
  });
1187
1308
 
1188
1309
  // src/registry/build-output.ts
1189
- import { readdir, writeFile as writeFile6, mkdir as mkdir3, access as access4 } from "fs/promises";
1310
+ import { readdir, writeFile as writeFile8, mkdir as mkdir4, access as access4 } from "fs/promises";
1190
1311
  import { join as join10, resolve } from "path";
1191
1312
  async function fileExists(path) {
1192
1313
  try {
@@ -1261,11 +1382,11 @@ async function writeRegistryOutput(outputDir, items) {
1261
1382
  for (const item of items) {
1262
1383
  const dir = typeToDir[item.type];
1263
1384
  const typeDir = join10(resolvedOutput, dir);
1264
- await mkdir3(typeDir, { recursive: true });
1385
+ await mkdir4(typeDir, { recursive: true });
1265
1386
  const itemJson = JSON.stringify(item, null, 2);
1266
1387
  const latestPath = join10(typeDir, `${item.name}.json`);
1267
1388
  const latestRelative = `${dir}/${item.name}.json`;
1268
- await writeFile6(latestPath, itemJson, "utf-8");
1389
+ await writeFile8(latestPath, itemJson, "utf-8");
1269
1390
  written.push(latestRelative);
1270
1391
  if (item.version) {
1271
1392
  const versionedFilename = `${item.name}@${item.version}.json`;
@@ -1274,7 +1395,7 @@ async function writeRegistryOutput(outputDir, items) {
1274
1395
  if (await fileExists(versionedPath)) {
1275
1396
  skipped.push(versionedRelative);
1276
1397
  } else {
1277
- await writeFile6(versionedPath, itemJson, "utf-8");
1398
+ await writeFile8(versionedPath, itemJson, "utf-8");
1278
1399
  written.push(versionedRelative);
1279
1400
  }
1280
1401
  }
@@ -1310,7 +1431,7 @@ async function writeRegistryOutput(outputDir, items) {
1310
1431
  items: indexItems
1311
1432
  };
1312
1433
  const indexPath = join10(resolvedOutput, "registry.json");
1313
- await writeFile6(indexPath, JSON.stringify(index, null, 2), "utf-8");
1434
+ await writeFile8(indexPath, JSON.stringify(index, null, 2), "utf-8");
1314
1435
  written.push("registry.json");
1315
1436
  return { written, skipped };
1316
1437
  }
@@ -1332,8 +1453,8 @@ var init_build_output = __esm({
1332
1453
  });
1333
1454
 
1334
1455
  // src/registry/builder.ts
1335
- import { readFile as readFile7, readdir as readdir2 } from "fs/promises";
1336
- import { join as join11, relative as relative3 } from "path";
1456
+ import { readFile as readFile9, readdir as readdir2 } from "fs/promises";
1457
+ import { join as join11, relative as relative5 } from "path";
1337
1458
  function isExcludedDevDep(name) {
1338
1459
  return EXCLUDED_DEV_DEPS.has(name) || name.startsWith("@types/");
1339
1460
  }
@@ -1346,7 +1467,7 @@ async function readTsFiles(dir, baseDir, exclude) {
1346
1467
  const entries = await readdir2(dir, { withFileTypes: true });
1347
1468
  for (const entry of entries) {
1348
1469
  const fullPath = join11(dir, entry.name);
1349
- const relPath = relative3(baseDir, fullPath);
1470
+ const relPath = relative5(baseDir, fullPath);
1350
1471
  if (entry.isDirectory()) {
1351
1472
  const nested = await readTsFiles(fullPath, baseDir, exclude);
1352
1473
  results.push(...nested);
@@ -1354,7 +1475,7 @@ async function readTsFiles(dir, baseDir, exclude) {
1354
1475
  if (exclude.includes(relPath)) {
1355
1476
  continue;
1356
1477
  }
1357
- const content = await readFile7(fullPath, "utf-8");
1478
+ const content = await readFile9(fullPath, "utf-8");
1358
1479
  results.push({ relativePath: relPath, content });
1359
1480
  }
1360
1481
  }
@@ -1363,7 +1484,7 @@ async function readTsFiles(dir, baseDir, exclude) {
1363
1484
  async function buildComponent(componentDir) {
1364
1485
  let rawConfig;
1365
1486
  try {
1366
- rawConfig = await readFile7(join11(componentDir, "registry.json"), "utf-8");
1487
+ rawConfig = await readFile9(join11(componentDir, "registry.json"), "utf-8");
1367
1488
  } catch {
1368
1489
  throw new Error(
1369
1490
  `No registry.json found in ${componentDir}. Every component must have a registry.json file.`
@@ -1379,7 +1500,7 @@ async function buildComponent(componentDir) {
1379
1500
  }
1380
1501
  let pkg = null;
1381
1502
  try {
1382
- const rawPkg = await readFile7(join11(componentDir, "package.json"), "utf-8");
1503
+ const rawPkg = await readFile9(join11(componentDir, "package.json"), "utf-8");
1383
1504
  pkg = JSON.parse(rawPkg);
1384
1505
  } catch {
1385
1506
  }
@@ -1462,7 +1583,7 @@ async function buildComponent(componentDir) {
1462
1583
  const fullPath = join11(componentDir, filePath);
1463
1584
  let content;
1464
1585
  try {
1465
- content = await readFile7(fullPath, "utf-8");
1586
+ content = await readFile9(fullPath, "utf-8");
1466
1587
  } catch {
1467
1588
  throw new Error(
1468
1589
  `Cannot read file "${filePath}" referenced in registry.json for component "${name}". Make sure the file exists at ${fullPath}.`
@@ -1526,7 +1647,7 @@ __export(build_exports, {
1526
1647
  });
1527
1648
  import * as p8 from "@clack/prompts";
1528
1649
  import pc7 from "picocolors";
1529
- import { resolve as resolve2, relative as relative4 } from "path";
1650
+ import { resolve as resolve2, relative as relative6 } from "path";
1530
1651
  async function buildCommand(paths, opts) {
1531
1652
  p8.intro(pc7.bgCyan(pc7.black(" kitn build ")));
1532
1653
  const cwd = process.cwd();
@@ -1543,7 +1664,7 @@ async function buildCommand(paths, opts) {
1543
1664
  }
1544
1665
  s.stop(`Found ${componentDirs.length} component(s)`);
1545
1666
  for (const dir of componentDirs) {
1546
- p8.log.message(` ${pc7.dim(relative4(cwd, dir))}`);
1667
+ p8.log.message(` ${pc7.dim(relative6(cwd, dir))}`);
1547
1668
  }
1548
1669
  s.start("Building components...");
1549
1670
  const items = [];
@@ -1553,7 +1674,7 @@ async function buildCommand(paths, opts) {
1553
1674
  const item = await buildComponent(dir);
1554
1675
  items.push(item);
1555
1676
  } catch (err) {
1556
- errors.push({ dir: relative4(cwd, dir), error: err.message });
1677
+ errors.push({ dir: relative6(cwd, dir), error: err.message });
1557
1678
  }
1558
1679
  }
1559
1680
  if (errors.length > 0) {
@@ -1577,7 +1698,7 @@ async function buildCommand(paths, opts) {
1577
1698
  p8.log.message(` ${pc7.dim("-")} ${f}`);
1578
1699
  }
1579
1700
  }
1580
- p8.outro(`Output: ${pc7.cyan(relative4(cwd, outputDir) || ".")}`);
1701
+ p8.outro(`Output: ${pc7.cyan(relative6(cwd, outputDir) || ".")}`);
1581
1702
  }
1582
1703
  var init_build = __esm({
1583
1704
  "src/commands/build.ts"() {
@@ -1596,7 +1717,7 @@ __export(create_exports, {
1596
1717
  import * as p9 from "@clack/prompts";
1597
1718
  import pc8 from "picocolors";
1598
1719
  import { join as join12 } from "path";
1599
- import { mkdir as mkdir4, writeFile as writeFile7 } from "fs/promises";
1720
+ import { mkdir as mkdir5, writeFile as writeFile9 } from "fs/promises";
1600
1721
  function toCamelCase(str) {
1601
1722
  return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
1602
1723
  }
@@ -1622,24 +1743,27 @@ function generateRegistryJson(type, name, sourceFile) {
1622
1743
  }
1623
1744
  function generateAgentSource(name) {
1624
1745
  const camel = toCamelCase(name);
1625
- return `import type { AgentConfig } from "@kitnai/core";
1746
+ return `import { registerAgent } from "@kitnai/core";
1626
1747
 
1627
- export const ${camel}Config: AgentConfig = {
1748
+ const SYSTEM_PROMPT = "You are a helpful assistant.";
1749
+
1750
+ registerAgent({
1628
1751
  name: "${name}",
1629
1752
  description: "",
1630
- system: "You are a helpful assistant.",
1631
- tools: [],
1632
- };
1753
+ system: SYSTEM_PROMPT,
1754
+ tools: {},
1755
+ });
1633
1756
  `;
1634
1757
  }
1635
1758
  function generateToolSource(name) {
1636
1759
  const camel = toCamelCase(name);
1637
- return `import { tool } from "ai";
1760
+ return `import { registerTool } from "@kitnai/core";
1761
+ import { tool } from "ai";
1638
1762
  import { z } from "zod";
1639
1763
 
1640
1764
  export const ${camel} = tool({
1641
1765
  description: "",
1642
- inputSchema: z.object({
1766
+ parameters: z.object({
1643
1767
  input: z.string().describe("Input parameter"),
1644
1768
  }),
1645
1769
  execute: async ({ input }) => {
@@ -1647,6 +1771,13 @@ export const ${camel} = tool({
1647
1771
  return { result: input };
1648
1772
  },
1649
1773
  });
1774
+
1775
+ registerTool({
1776
+ name: "${name}",
1777
+ description: "",
1778
+ inputSchema: z.object({ input: z.string() }),
1779
+ tool: ${camel},
1780
+ });
1650
1781
  `;
1651
1782
  }
1652
1783
  function generateSkillSource(name) {
@@ -1691,11 +1822,11 @@ async function createComponent(type, name, opts) {
1691
1822
  if (await dirExists(dir)) {
1692
1823
  throw new Error(`Directory "${name}" already exists`);
1693
1824
  }
1694
- await mkdir4(dir, { recursive: true });
1825
+ await mkdir5(dir, { recursive: true });
1695
1826
  const validType = type;
1696
1827
  const sourceFile = validType === "skill" ? "README.md" : `${name}.ts`;
1697
1828
  const registryJson = generateRegistryJson(validType, name, sourceFile);
1698
- await writeFile7(
1829
+ await writeFile9(
1699
1830
  join12(dir, "registry.json"),
1700
1831
  JSON.stringify(registryJson, null, 2) + "\n"
1701
1832
  );
@@ -1714,7 +1845,7 @@ async function createComponent(type, name, opts) {
1714
1845
  source = generateStorageSource(name);
1715
1846
  break;
1716
1847
  }
1717
- await writeFile7(join12(dir, sourceFile), source);
1848
+ await writeFile9(join12(dir, sourceFile), source);
1718
1849
  return { dir, files: ["registry.json", sourceFile] };
1719
1850
  }
1720
1851
  async function createCommand(type, name) {
@@ -2017,7 +2148,7 @@ function startUpdateCheck(currentVersion) {
2017
2148
  }
2018
2149
 
2019
2150
  // src/index.ts
2020
- var VERSION = true ? "0.1.8" : "0.0.0-dev";
2151
+ var VERSION = true ? "0.1.9" : "0.0.0-dev";
2021
2152
  var printUpdateNotice = startUpdateCheck(VERSION);
2022
2153
  var program = new Command().name("kitn").description("Install AI agent components from the kitn registry").version(VERSION);
2023
2154
  program.command("init").description("Initialize kitn in your project").action(async () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/config.ts","../src/commands/init.ts","../src/utils/detect.ts","../src/registry/fetcher.ts","../src/registry/resolver.ts","../src/installers/file-writer.ts","../src/installers/dep-installer.ts","../src/installers/env-writer.ts","../src/installers/import-rewriter.ts","../src/installers/tsconfig-patcher.ts","../src/utils/hash.ts","../src/utils/parse-ref.ts","../src/registry/schema.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/registry/build-output.ts","../src/registry/builder.ts","../src/commands/build.ts","../src/commands/create.ts","../src/commands/info.ts","../src/commands/registry.ts","../src/index.ts","../src/utils/update-check.ts"],"sourcesContent":["import { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nconst componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\"]);\ntype ComponentType = z.infer<typeof componentType>;\n\nconst installedComponentSchema = z.object({\n registry: z.string().optional(),\n version: z.string(),\n installedAt: z.string(),\n files: z.array(z.string()),\n hash: z.string(),\n});\n\nexport const configSchema = z.object({\n $schema: z.string().optional(),\n runtime: z.enum([\"bun\", \"node\", \"deno\"]),\n framework: z.enum([\"hono\", \"cloudflare\", \"elysia\", \"fastify\", \"express\"]).optional(),\n aliases: z.object({\n base: z.string().optional(),\n agents: z.string(),\n tools: z.string(),\n skills: z.string(),\n storage: z.string(),\n }),\n registries: z.record(z.string(), z.string()),\n installed: z.record(z.string(), installedComponentSchema).optional(),\n});\n\nexport type KitnConfig = z.infer<typeof configSchema>;\n\nconst CONFIG_FILE = \"kitn.json\";\n\nexport async function readConfig(projectDir: string): Promise<KitnConfig | null> {\n try {\n const raw = await readFile(join(projectDir, CONFIG_FILE), \"utf-8\");\n return configSchema.parse(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nexport async function writeConfig(projectDir: string, config: KitnConfig): Promise<void> {\n const data = { $schema: \"https://kitn.dev/schema/config.json\", ...config };\n await writeFile(join(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + \"\\n\");\n}\n\ntype RequiredAliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\";\n\nconst typeToAliasKey: Record<Exclude<ComponentType, \"kitn:package\">, RequiredAliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n};\n\ntype SingleFileComponentType = Exclude<ComponentType, \"kitn:package\">;\n\nexport function getInstallPath(\n config: KitnConfig,\n type: SingleFileComponentType,\n fileName: string\n): string {\n const aliasKey = typeToAliasKey[type];\n return join(config.aliases[aliasKey], fileName);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\n\nexport async function initCommand() {\n p.intro(pc.bgCyan(pc.black(\" kitn \")));\n\n const cwd = process.cwd();\n\n const existing = await readConfig(cwd);\n if (existing) {\n p.log.warn(\"kitn.json already exists in this directory.\");\n const shouldContinue = await p.confirm({\n message: \"Overwrite existing configuration?\",\n initialValue: false,\n });\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n }\n\n const runtime = await p.select({\n message: \"Which runtime do you use?\",\n options: [\n { value: \"bun\", label: \"Bun\", hint: \"recommended\" },\n { value: \"node\", label: \"Node.js\" },\n { value: \"deno\", label: \"Deno\" },\n ],\n });\n if (p.isCancel(runtime)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const framework = await p.select({\n message: \"Which framework are you using?\",\n options: [\n { value: \"hono\", label: \"Hono\", hint: \"recommended\" },\n { value: \"cloudflare\", label: \"Cloudflare Workers\", hint: \"coming soon\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"coming soon\" },\n { value: \"fastify\", label: \"Fastify\", hint: \"coming soon\" },\n { value: \"express\", label: \"Express\", hint: \"coming soon\" },\n ],\n });\n if (p.isCancel(framework)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const base = await p.text({\n message: \"Where should kitn packages be installed?\",\n initialValue: \"src/ai\",\n placeholder: \"src/ai\",\n });\n if (p.isCancel(base)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const baseDir = base as string;\n const config = {\n runtime: runtime as \"bun\" | \"node\" | \"deno\",\n framework: framework as \"hono\" | \"cloudflare\" | \"elysia\" | \"fastify\" | \"express\",\n aliases: {\n base: baseDir,\n agents: `${baseDir}/agents`,\n tools: `${baseDir}/tools`,\n skills: `${baseDir}/skills`,\n storage: `${baseDir}/storage`,\n },\n registries: {\n \"@kitn\": \"https://kitn-ai.github.io/registry/r/{type}/{name}.json\",\n },\n };\n\n const s = p.spinner();\n s.start(\"Writing kitn.json\");\n await writeConfig(cwd, config);\n s.stop(\"Created kitn.json\");\n\n p.outro(pc.green(\"Done! Run `kitn add core` to install the engine, then `kitn add routes` for HTTP routes.\"));\n}\n","import { access } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport type PackageManager = \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\nconst LOCKFILE_MAP: [string, PackageManager][] = [\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\nexport async function detectPackageManager(dir: string): Promise<PackageManager | null> {\n for (const [lockfile, pm] of LOCKFILE_MAP) {\n try {\n await access(join(dir, lockfile));\n return pm;\n } catch {\n // lockfile doesn't exist, try next\n }\n }\n return null;\n}\n\nexport function getInstallCommand(pm: PackageManager, packages: string[]): string {\n const pkgs = packages.join(\" \");\n switch (pm) {\n case \"bun\":\n return `bun add ${pkgs}`;\n case \"pnpm\":\n return `pnpm add ${pkgs}`;\n case \"yarn\":\n return `yarn add ${pkgs}`;\n case \"npm\":\n return `npm install ${pkgs}`;\n }\n}\n\nexport function getRunCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return \"bunx\";\n case \"pnpm\":\n return \"pnpm dlx\";\n case \"yarn\":\n return \"yarn dlx\";\n case \"npm\":\n return \"npx\";\n }\n}\n","import type { RegistryItem, RegistryIndex } from \"./schema.js\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\";\ntype FetchFn = (url: string) => Promise<RegistryItem>;\n\nexport class RegistryFetcher {\n private registries: Record<string, string>;\n private cache = new Map<string, Promise<RegistryItem>>();\n private fetchFn: FetchFn;\n\n constructor(registries: Record<string, string>, fetchFn?: FetchFn) {\n this.registries = registries;\n this.fetchFn = fetchFn ?? this.defaultFetch;\n }\n\n resolveUrl(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): string {\n const template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\n const fileName = version ? `${name}@${version}` : name;\n return template.replace(\"{name}\", fileName).replace(\"{type}\", typeDir);\n }\n\n async fetchItem(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): Promise<RegistryItem> {\n const url = this.resolveUrl(name, typeDir, namespace, version);\n if (!this.cache.has(url)) {\n this.cache.set(url, this.fetchFn(url));\n }\n return this.cache.get(url)!;\n }\n\n async fetchIndex(namespace = \"@kitn\"): Promise<RegistryIndex> {\n const template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\n const baseUrl = template.replace(\"{type}/{name}.json\", \"registry.json\");\n const res = await fetch(baseUrl);\n if (!res.ok) throw new Error(`Failed to fetch registry index: ${res.statusText}`);\n return res.json();\n }\n\n private async defaultFetch(url: string): Promise<RegistryItem> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch ${url}: ${res.statusText}`);\n return res.json();\n }\n}\n","import type { RegistryItem } from \"./schema.js\";\n\ntype FetchItemFn = (name: string) => Promise<RegistryItem>;\n\nexport async function resolveDependencies(\n names: string[],\n fetchItem: FetchItemFn\n): Promise<RegistryItem[]> {\n const visited = new Set<string>();\n const items = new Map<string, RegistryItem>();\n const edges: [string, string][] = [];\n\n async function resolve(name: string): Promise<void> {\n if (visited.has(name)) return;\n visited.add(name);\n\n const item = await fetchItem(name);\n items.set(name, item);\n\n const deps = item.registryDependencies ?? [];\n for (const dep of deps) {\n edges.push([dep, name]);\n await resolve(dep);\n }\n }\n\n for (const name of names) {\n await resolve(name);\n }\n\n return topologicalSort(items, edges);\n}\n\nfunction topologicalSort(\n items: Map<string, RegistryItem>,\n edges: [string, string][]\n): RegistryItem[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const name of items.keys()) {\n inDegree.set(name, 0);\n adjacency.set(name, []);\n }\n\n for (const [from, to] of edges) {\n adjacency.get(from)?.push(to);\n inDegree.set(to, (inDegree.get(to) ?? 0) + 1);\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: RegistryItem[] = [];\n while (queue.length > 0) {\n const name = queue.shift()!;\n sorted.push(items.get(name)!);\n\n for (const neighbor of adjacency.get(name) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length !== items.size) {\n const missing = [...items.keys()].filter((n) => !sorted.some((s) => s.name === n));\n throw new Error(`Circular dependency detected involving: ${missing.join(\", \")}`);\n }\n\n return sorted;\n}\n","import { readFile, writeFile, mkdir, access } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { createPatch } from \"diff\";\n\nexport enum FileStatus {\n New = \"new\",\n Identical = \"identical\",\n Different = \"different\",\n}\n\nexport async function checkFileStatus(filePath: string, newContent: string): Promise<FileStatus> {\n try {\n await access(filePath);\n } catch {\n return FileStatus.New;\n }\n const existing = await readFile(filePath, \"utf-8\");\n return existing === newContent ? FileStatus.Identical : FileStatus.Different;\n}\n\nexport function generateDiff(filePath: string, oldContent: string, newContent: string): string {\n return createPatch(filePath, oldContent, newContent, \"local\", \"registry\");\n}\n\nexport async function readExistingFile(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nexport async function writeComponentFile(filePath: string, content: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n}\n","import { execSync } from \"child_process\";\nimport type { PackageManager } from \"../utils/detect.js\";\n\nexport function installDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add ${pkgs}`;\n case \"pnpm\": return `pnpm add ${pkgs}`;\n case \"yarn\": return `yarn add ${pkgs}`;\n case \"npm\": return `npm install ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n\nexport function installDevDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add -d ${pkgs}`;\n case \"pnpm\": return `pnpm add -D ${pkgs}`;\n case \"yarn\": return `yarn add -D ${pkgs}`;\n case \"npm\": return `npm install -D ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport type { EnvVarConfig } from \"../registry/schema.js\";\n\n/**\n * Parse a .env file into a Set of defined variable names.\n * Only cares about keys, not values.\n */\nfunction parseEnvKeys(content: string): Set<string> {\n const keys = new Set<string>();\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n keys.add(trimmed.slice(0, eqIndex).trim());\n }\n }\n return keys;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readEnvFile(path: string): Promise<string> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Collect all envVars from resolved items, deduplicating by key name.\n * Later items override earlier ones if same key.\n */\nexport function collectEnvVars(\n items: Array<{ envVars?: Record<string, EnvVarConfig> }>\n): Record<string, EnvVarConfig> {\n const merged: Record<string, EnvVarConfig> = {};\n for (const item of items) {\n if (item.envVars) {\n Object.assign(merged, item.envVars);\n }\n }\n return merged;\n}\n\n/**\n * Handle env var setup after component installation:\n * 1. Write missing vars to .env.example (always)\n * 2. Prompt user for missing vars and write to .env (interactive)\n */\nexport async function handleEnvVars(\n cwd: string,\n envVars: Record<string, EnvVarConfig>\n): Promise<void> {\n const keys = Object.keys(envVars);\n if (keys.length === 0) return;\n\n // Read existing .env and .env.example\n const envPath = join(cwd, \".env\");\n const examplePath = join(cwd, \".env.example\");\n\n const envContent = await readEnvFile(envPath);\n const exampleContent = await readEnvFile(examplePath);\n\n const envKeys = parseEnvKeys(envContent);\n const exampleKeys = parseEnvKeys(exampleContent);\n\n // Find vars missing from each file\n const missingFromExample = keys.filter((k) => !exampleKeys.has(k));\n const missingFromEnv = keys.filter((k) => !envKeys.has(k) && !process.env[k]);\n\n // 1. Always append missing vars to .env.example\n if (missingFromExample.length > 0) {\n const lines: string[] = [];\n if (exampleContent && !exampleContent.endsWith(\"\\n\")) lines.push(\"\");\n for (const key of missingFromExample) {\n const config = envVars[key];\n lines.push(`# ${config.description}${config.url ? ` (${config.url})` : \"\"}`);\n lines.push(`${key}=`);\n }\n await writeFile(examplePath, exampleContent + lines.join(\"\\n\") + \"\\n\");\n p.log.info(`Updated ${pc.cyan(\".env.example\")} with ${missingFromExample.length} variable(s)`);\n }\n\n // 2. Prompt for missing env vars\n if (missingFromEnv.length === 0) return;\n\n p.log.message(\"\");\n p.log.warn(\n `${missingFromEnv.length} environment variable(s) needed:`\n );\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const req = config.required !== false ? pc.red(\"*\") : \"\";\n p.log.message(` ${pc.yellow(key)}${req}: ${config.description}${config.url ? pc.dim(` -> ${config.url}`) : \"\"}`);\n }\n\n const shouldPrompt = await p.confirm({\n message: \"Would you like to enter values now?\",\n initialValue: true,\n });\n\n if (p.isCancel(shouldPrompt) || !shouldPrompt) {\n p.log.info(`Add them to ${pc.cyan(\".env\")} when ready.`);\n return;\n }\n\n const newEntries: string[] = [];\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const isSecret = config.secret !== false; // default true\n\n let value: string | symbol;\n if (isSecret) {\n value = await p.password({\n message: `${key}:`,\n });\n } else {\n value = await p.text({\n message: `${key}:`,\n placeholder: config.description,\n });\n }\n\n if (p.isCancel(value)) {\n p.log.info(`Skipped remaining variables. Add them to ${pc.cyan(\".env\")} when ready.`);\n break;\n }\n\n if (value) {\n newEntries.push(`${key}=${value}`);\n }\n }\n\n if (newEntries.length > 0) {\n const existingEnv = await readEnvFile(envPath);\n const lines: string[] = [];\n if (existingEnv && !existingEnv.endsWith(\"\\n\")) lines.push(\"\");\n lines.push(...newEntries);\n await writeFile(envPath, existingEnv + lines.join(\"\\n\") + \"\\n\");\n p.log.success(`Wrote ${newEntries.length} variable(s) to ${pc.cyan(\".env\")}`);\n }\n}\n","import { relative, dirname, join, posix } from \"path\";\n\ntype AliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\";\n\nconst KNOWN_TYPES: readonly AliasKey[] = [\"agents\", \"tools\", \"skills\", \"storage\"];\n\nconst TYPE_TO_ALIAS_KEY: Record<string, AliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n};\n\n/**\n * Rewrites `@kitn/<type>/<path>` imports to relative paths based on install layout.\n *\n * Only rewrites known types (agents, tools, skills, storage).\n * Other `@kitn/` imports (e.g. `@kitn/server`) pass through untouched.\n */\nexport function rewriteKitnImports(\n content: string,\n fileType: string,\n fileName: string,\n aliases: Record<AliasKey, string>,\n): string {\n const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];\n if (!sourceAliasKey) return content;\n\n const sourceDir = aliases[sourceAliasKey];\n\n // Match import/export ... from \"@kitn/<type>/<path>\"\n return content.replace(\n /((?:import|export)\\s+.*?\\s+from\\s+[\"'])@kitn\\/([\\w-]+)\\/([^\"']+)([\"'])/g,\n (_match, prefix: string, type: string, targetPath: string, quote: string) => {\n if (!KNOWN_TYPES.includes(type as AliasKey)) {\n return `${prefix}@kitn/${type}/${targetPath}${quote}`;\n }\n\n const targetDir = aliases[type as AliasKey];\n const targetFile = join(targetDir, targetPath);\n let rel = relative(sourceDir, targetFile);\n\n // Normalize to posix separators\n rel = rel.split(\"\\\\\").join(\"/\");\n\n // Ensure relative path starts with ./ or ../\n if (!rel.startsWith(\".\")) {\n rel = `./${rel}`;\n }\n\n return `${prefix}${rel}${quote}`;\n },\n );\n}\n","import { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\n\n/**\n * Strip single-line (//) and multi-line comments from JSONC,\n * and remove trailing commas before } or ], so JSON.parse succeeds.\n */\nfunction stripJsonc(text: string): string {\n return text\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/,\\s*([}\\]])/g, \"$1\");\n}\n\n/**\n * Patches a tsconfig JSON string with additional paths entries.\n * Returns the updated JSON string.\n */\nexport function patchTsconfig(\n tsconfigContent: string,\n paths: Record<string, string[]>,\n): string {\n const config = JSON.parse(stripJsonc(tsconfigContent));\n\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n if (!config.compilerOptions.paths) {\n config.compilerOptions.paths = {};\n }\n\n for (const [key, value] of Object.entries(paths)) {\n config.compilerOptions.paths[key] = value;\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/**\n * Reads tsconfig.json from projectDir, patches paths, and writes it back.\n * If no tsconfig.json exists, creates one with just the paths.\n */\nexport async function patchProjectTsconfig(\n projectDir: string,\n paths: Record<string, string[]>,\n): Promise<void> {\n const tsconfigPath = join(projectDir, \"tsconfig.json\");\n let content: string;\n try {\n content = await readFile(tsconfigPath, \"utf-8\");\n } catch {\n content = \"{}\";\n }\n\n const patched = patchTsconfig(content, paths);\n await writeFile(tsconfigPath, patched);\n}\n","import { createHash } from \"crypto\";\n\nexport function contentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 8);\n}\n","export interface ComponentRef {\n namespace: string;\n name: string;\n version: string | undefined;\n}\n\nexport function parseComponentRef(input: string): ComponentRef {\n let namespace = \"@kitn\";\n let rest = input;\n\n // Parse @namespace/name\n if (rest.startsWith(\"@\")) {\n const slashIdx = rest.indexOf(\"/\");\n if (slashIdx === -1) {\n throw new Error(`Invalid component reference: ${input}. Expected @namespace/name`);\n }\n namespace = rest.slice(0, slashIdx);\n rest = rest.slice(slashIdx + 1);\n }\n\n // Parse name@version\n const atIdx = rest.indexOf(\"@\");\n if (atIdx === -1) {\n return { namespace, name: rest, version: undefined };\n }\n\n return {\n namespace,\n name: rest.slice(0, atIdx),\n version: rest.slice(atIdx + 1),\n };\n}\n","import { z } from \"zod\";\n\nexport const componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\"]);\nexport type ComponentType = z.infer<typeof componentType>;\n\nexport const registryFileSchema = z.object({\n path: z.string(),\n content: z.string(),\n type: componentType,\n});\n\nexport const changelogEntrySchema = z.object({\n version: z.string(),\n date: z.string(),\n type: z.enum([\"feature\", \"fix\", \"breaking\", \"initial\"]),\n note: z.string(),\n});\nexport type ChangelogEntry = z.infer<typeof changelogEntrySchema>;\n\nexport const envVarConfigSchema = z.object({\n description: z.string(),\n required: z.boolean().optional(),\n secret: z.boolean().optional(),\n url: z.string().optional(),\n});\nexport type EnvVarConfig = z.infer<typeof envVarConfigSchema>;\n\n/** Schema for the author-facing registry.json file */\nexport const componentConfigSchema = z.object({\n $schema: z.string().optional(),\n type: componentType,\n name: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n files: z.array(z.string()).optional(),\n sourceDir: z.string().optional(),\n exclude: z.array(z.string()).optional(),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n categories: z.array(z.string()).optional(),\n docs: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type ComponentConfig = z.infer<typeof componentConfigSchema>;\n\nexport const registryItemSchema = z.object({\n $schema: z.string().optional(),\n name: z.string(),\n type: componentType,\n description: z.string(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n files: z.array(registryFileSchema),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n docs: z.string().optional(),\n categories: z.array(z.string()).optional(),\n version: z.string().optional(),\n updatedAt: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type RegistryItem = z.infer<typeof registryItemSchema>;\n\nexport const registryIndexItemSchema = z.object({\n name: z.string(),\n type: componentType,\n description: z.string(),\n registryDependencies: z.array(z.string()).optional(),\n categories: z.array(z.string()).optional(),\n version: z.string().optional(),\n versions: z.array(z.string()).optional(),\n updatedAt: z.string().optional(),\n});\n\nexport const registryIndexSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n items: z.array(registryIndexItemSchema),\n});\nexport type RegistryIndex = z.infer<typeof registryIndexSchema>;\n\nexport const typeToDir: Record<ComponentType, string> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:package\": \"package\",\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig, getInstallPath } from \"../utils/config.js\";\nimport { detectPackageManager } from \"../utils/detect.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { resolveDependencies } from \"../registry/resolver.js\";\nimport {\n checkFileStatus,\n writeComponentFile,\n readExistingFile,\n generateDiff,\n FileStatus,\n} from \"../installers/file-writer.js\";\nimport { installDependencies } from \"../installers/dep-installer.js\";\nimport { collectEnvVars, handleEnvVars } from \"../installers/env-writer.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.js\";\nimport { contentHash } from \"../utils/hash.js\";\nimport { parseComponentRef, type ComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir, type RegistryItem, type ComponentType } from \"../registry/schema.js\";\n\ninterface AddOptions {\n overwrite?: boolean;\n type?: string;\n}\n\nexport async function addCommand(components: string[], opts: AddOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn add \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n if (components.length === 0) {\n p.log.error(\"Please specify at least one component to add.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" to framework-specific package name, then parse refs\n const resolvedComponents = components.map((c) => {\n if (c === \"routes\") {\n const fw = config.framework ?? \"hono\";\n return fw;\n }\n return c;\n });\n\n const refs = resolvedComponents.map(parseComponentRef);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Resolving dependencies...\");\n\n let resolved: RegistryItem[];\n try {\n resolved = await resolveDependencies(resolvedComponents, async (name) => {\n const ref = refs.find((r) => r.name === name) ?? { namespace: \"@kitn\", name, version: undefined };\n const index = await fetcher.fetchIndex(ref.namespace);\n const indexItem = index.items.find((i) => i.name === name);\n if (!indexItem) throw new Error(`Component '${name}' not found in ${ref.namespace} registry`);\n const dir = typeToDir[indexItem.type];\n return fetcher.fetchItem(name, dir as any, ref.namespace, ref.version);\n });\n } catch (err: any) {\n s.stop(pc.red(\"Failed to resolve dependencies\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(`Resolved ${resolved.length} component(s)`);\n\n p.log.info(\"Components to install:\");\n for (const item of resolved) {\n const isExplicit = resolvedComponents.includes(item.name) || components.includes(item.name);\n const label = isExplicit ? item.name : `${item.name} ${pc.dim(\"(dependency)\")}`;\n p.log.message(` ${pc.cyan(label)}`);\n }\n\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n const allDeps: string[] = [];\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\n\n if (item.type === \"kitn:package\") {\n // Package install — multi-file, preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n\n for (const file of item.files) {\n const targetPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n\n const status = await checkFileStatus(targetPath, file.content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, file.content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", file.content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Patch tsconfig.json with package paths\n if (item.tsconfig) {\n const resolvedPaths: Record<string, string[]> = {};\n const installDir = item.installDir ?? item.name;\n for (const [key, values] of Object.entries(item.tsconfig)) {\n resolvedPaths[key] = values.map((v) => `./${join(baseDir, installDir, v)}`);\n }\n await patchProjectTsconfig(cwd, resolvedPaths);\n p.log.info(`Patched tsconfig.json with paths: ${Object.keys(resolvedPaths).join(\", \")}`);\n }\n\n // Track in installed\n const installed = config.installed ?? {};\n const allContent = item.files.map((f) => f.content).join(\"\\n\");\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const installedKey = ref.namespace === \"@kitn\" ? item.name : `${ref.namespace}/${item.name}`;\n installed[installedKey] = {\n registry: ref.namespace,\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => join(baseDir, f.path)),\n hash: contentHash(allContent),\n };\n config.installed = installed;\n\n } else {\n // Regular component install — single file, import rewriting\n for (const file of item.files) {\n const aliasKey = (() => {\n switch (item.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n\n const fileName = file.path.split(\"/\").pop()!;\n const targetPath = join(cwd, config.aliases[aliasKey], fileName);\n const relativePath = join(config.aliases[aliasKey], fileName);\n const content = rewriteKitnImports(file.content, item.type, fileName, config.aliases);\n\n const status = await checkFileStatus(targetPath, content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Track in installed\n const installed = config.installed ?? {};\n const allContent = item.files.map((f) => {\n const fn = f.path.split(\"/\").pop()!;\n return rewriteKitnImports(f.content, item.type, fn, config.aliases);\n }).join(\"\\n\");\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const installedKey = ref.namespace === \"@kitn\" ? item.name : `${ref.namespace}/${item.name}`;\n installed[installedKey] = {\n registry: ref.namespace,\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => {\n const aliasKey = (() => {\n switch (item.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n const fileName = f.path.split(\"/\").pop()!;\n return join(config.aliases[aliasKey], fileName);\n }),\n hash: contentHash(allContent),\n };\n config.installed = installed;\n }\n }\n\n await writeConfig(cwd, config);\n\n const uniqueDeps = [...new Set(allDeps)];\n if (uniqueDeps.length > 0) {\n const pm = await detectPackageManager(cwd);\n if (pm) {\n s.start(`Installing ${uniqueDeps.length} npm dependenc${uniqueDeps.length === 1 ? \"y\" : \"ies\"}...`);\n try {\n installDependencies(pm, uniqueDeps, cwd);\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Some dependencies failed to install\"));\n }\n }\n }\n\n if (created.length > 0) {\n p.log.success(`Created ${created.length} file(s):`);\n for (const f of created) p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n if (updated.length > 0) {\n p.log.success(`Updated ${updated.length} file(s):`);\n for (const f of updated) p.log.message(` ${pc.yellow(\"~\")} ${f}`);\n }\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s):`);\n for (const f of skipped) p.log.message(` ${pc.dim(\"-\")} ${f}`);\n }\n\n // Handle environment variables\n const allEnvVars = collectEnvVars(resolved);\n await handleEnvVars(cwd, allEnvVars);\n\n for (const item of resolved) {\n if (item.docs) {\n p.log.info(`${pc.bold(item.name)}: ${item.docs}`);\n }\n }\n\n // Show next-step hints for well-known packages\n const installedNames = new Set(resolved.map((r) => r.name));\n const hints: string[] = [];\n\n if (installedNames.has(\"core\") && !installedNames.has(config.framework ?? \"hono\")) {\n hints.push(`Run ${pc.cyan(`kitn add routes`)} to install the HTTP adapter.`);\n }\n\n const fw = config.framework ?? \"hono\";\n if (installedNames.has(fw) || (installedNames.has(\"core\") && installedNames.has(fw))) {\n hints.push(`Add this to your server entry point:`);\n if (fw === \"hono\") {\n hints.push(\"\");\n hints.push(pc.dim(` import { Hono } from \"hono\";`));\n hints.push(pc.dim(` import { createAIPlugin } from \"@kitnai/hono\";`));\n hints.push(pc.dim(` import { yourProvider } from \"your-ai-provider\";`));\n hints.push(pc.dim(``));\n hints.push(pc.dim(` const plugin = createAIPlugin({`));\n hints.push(pc.dim(` getModel: (id) => yourProvider(id ?? \"default-model\"),`));\n hints.push(pc.dim(` });`));\n hints.push(pc.dim(``));\n hints.push(pc.dim(` const app = new Hono();`));\n hints.push(pc.dim(` app.route(\"/api\", plugin.app);`));\n hints.push(pc.dim(` await plugin.initialize();`));\n hints.push(\"\");\n }\n }\n\n if (hints.length > 0) {\n p.log.message(pc.bold(\"\\nNext steps:\"));\n for (const hint of hints) p.log.message(hint);\n }\n\n p.outro(pc.green(\"Done!\"));\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport type { RegistryIndex } from \"../registry/schema.js\";\n\ninterface ListOptions {\n installed?: boolean;\n type?: string;\n registry?: string;\n}\n\ntype IndexItemWithNamespace = RegistryIndex[\"items\"][number] & { namespace: string };\n\nexport async function listCommand(opts: ListOptions) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const fetcher = new RegistryFetcher(config.registries);\n\n const namespacesToFetch = opts.registry\n ? [opts.registry]\n : Object.keys(config.registries);\n\n if (opts.registry && !config.registries[opts.registry]) {\n p.log.error(`Registry ${pc.bold(opts.registry)} is not configured. Run ${pc.bold(\"kitn registry list\")} to see configured registries.`);\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Fetching registry index...\");\n\n const allItems: IndexItemWithNamespace[] = [];\n const errors: string[] = [];\n\n for (const namespace of namespacesToFetch) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allItems.push({ ...item, namespace });\n }\n } catch (err: any) {\n errors.push(`${namespace}: ${err.message}`);\n }\n }\n\n if (allItems.length === 0 && errors.length > 0) {\n s.stop(pc.red(\"Failed to fetch registries\"));\n for (const e of errors) p.log.error(e);\n process.exit(1);\n }\n\n s.stop(`Found ${allItems.length} components across ${namespacesToFetch.length - errors.length} ${namespacesToFetch.length - errors.length === 1 ? \"registry\" : \"registries\"}`);\n\n for (const e of errors) {\n p.log.warn(`${pc.yellow(\"⚠\")} Failed to fetch ${e}`);\n }\n\n const installed = config.installed ?? {};\n const typeGroups = new Map<string, IndexItemWithNamespace[]>();\n\n for (const item of allItems) {\n if (opts.type && !item.type.endsWith(opts.type)) continue;\n\n const group = item.type.replace(\"kitn:\", \"\");\n if (!typeGroups.has(group)) typeGroups.set(group, []);\n typeGroups.get(group)!.push(item);\n }\n\n let installedCount = 0;\n let updateCount = 0;\n\n for (const [group, items] of typeGroups) {\n p.log.message(pc.bold(`\\n${group.charAt(0).toUpperCase() + group.slice(1)}s:`));\n\n for (const item of items) {\n const displayName = item.namespace === \"@kitn\" ? item.name : `${item.namespace}/${item.name}`;\n const inst = installed[item.name] ?? installed[displayName];\n if (opts.installed && !inst) continue;\n\n const version = pc.dim(`v${item.version ?? \"1.0.0\"}`);\n\n if (inst) {\n installedCount++;\n const status = pc.green(\"✓\");\n const hasUpdate = item.version && inst.version !== item.version;\n const updateTag = hasUpdate ? pc.yellow(` ⬆ v${item.version} available`) : \"\";\n if (hasUpdate) updateCount++;\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}${updateTag}`);\n } else {\n const status = pc.dim(\"○\");\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}`);\n }\n }\n }\n\n const availableCount = allItems.length - installedCount;\n const parts = [`${installedCount} installed`, `${availableCount} available`];\n if (updateCount > 0) parts.push(`${updateCount} update${updateCount === 1 ? \"\" : \"s\"} available`);\n p.log.message(\"\");\n p.log.message(pc.dim(` ${parts.join(\", \")}`));\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { readExistingFile, generateDiff } from \"../installers/file-writer.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function diffCommand(componentName: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" alias to framework-specific package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[installedKey];\n if (!installed) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const namespace = installed.registry ?? ref.namespace;\n const fetcher = new RegistryFetcher(config.registries);\n const index = await fetcher.fetchIndex(namespace);\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n p.log.error(`Component '${ref.name}' not found in ${namespace} registry.`);\n process.exit(1);\n }\n\n const dir = typeToDir[indexItem.type] as any;\n const registryItem = await fetcher.fetchItem(ref.name, dir, namespace, ref.version);\n\n let hasDiff = false;\n for (const file of registryItem.files) {\n if (indexItem.type === \"kitn:package\") {\n // Packages use base alias + preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n const localPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${relativePath}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(relativePath, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n } else {\n // Regular components use type-based alias directories\n const fileName = file.path.split(\"/\").pop()!;\n const aliasKey = (() => {\n switch (indexItem.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n const localPath = join(cwd, config.aliases[aliasKey], fileName);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${fileName}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(fileName, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n }\n }\n\n if (!hasDiff) {\n p.log.success(`${ref.name}: up to date, no differences.`);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { unlink } from \"fs/promises\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\n\nexport async function removeCommand(componentName: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" alias to framework-specific package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[installedKey];\n if (!installed) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const shouldRemove = await p.confirm({\n message: `Remove ${ref.name}? This will delete ${installed.files.length} file(s).`,\n initialValue: false,\n });\n if (p.isCancel(shouldRemove) || !shouldRemove) {\n p.cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n\n const deleted: string[] = [];\n for (const filePath of installed.files) {\n try {\n await unlink(join(cwd, filePath));\n deleted.push(filePath);\n } catch {\n p.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);\n }\n }\n\n delete config.installed![installedKey];\n if (Object.keys(config.installed!).length === 0) {\n delete config.installed;\n }\n await writeConfig(cwd, config);\n\n if (deleted.length > 0) {\n p.log.success(`Removed ${ref.name}:`);\n for (const f of deleted) p.log.message(` ${pc.red(\"-\")} ${f}`);\n }\n}\n","import { addCommand } from \"./add.js\";\nimport { readConfig } from \"../utils/config.js\";\nimport * as p from \"@clack/prompts\";\n\nexport async function updateCommand(components: string[]) {\n // If no components specified, update all installed components\n if (components.length === 0) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const installed = config.installed;\n if (!installed || Object.keys(installed).length === 0) {\n p.log.info(\"No installed components to update.\");\n return;\n }\n\n components = Object.keys(installed);\n }\n\n await addCommand(components, { overwrite: true });\n}\n","import { readdir, stat, writeFile, mkdir, access, readFile } from \"fs/promises\";\nimport { join, resolve, relative } from \"path\";\nimport { typeToDir, type RegistryItem, type RegistryIndex } from \"./schema.js\";\n\n/** Directories to skip when walking the full tree */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \"dist\",\n \".git\",\n \"r\",\n \"test\",\n \"tests\",\n \".claude\",\n]);\n\n/** Check whether a file exists */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Walk a directory tree recursively, collecting directories that contain registry.json.\n * Skips directories in the SKIP_DIRS set.\n */\nasync function walkForRegistryJson(dir: string): Promise<string[]> {\n const results: string[] = [];\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Check if this directory itself has registry.json\n if (await fileExists(join(dir, \"registry.json\"))) {\n results.push(dir);\n // Don't recurse into component directories — they won't nest further\n return results;\n }\n\n // Recurse into subdirectories\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIP_DIRS.has(entry.name)) {\n const subResults = await walkForRegistryJson(join(dir, entry.name));\n results.push(...subResults);\n }\n }\n\n return results;\n}\n\n/**\n * Discover directories containing registry.json files.\n *\n * If `paths` is provided, each path is checked:\n * - If it directly contains registry.json, it's included.\n * - Otherwise, its immediate subdirectories are checked for registry.json.\n *\n * If `paths` is not provided, the full directory tree from `cwd` is walked,\n * skipping directories in SKIP_DIRS.\n *\n * @returns Array of absolute directory paths containing registry.json.\n */\nexport async function scanForComponents(\n cwd: string,\n paths?: string[]\n): Promise<string[]> {\n const resolvedCwd = resolve(cwd);\n\n if (paths && paths.length > 0) {\n const results: string[] = [];\n\n for (const p of paths) {\n const absPath = resolve(resolvedCwd, p);\n\n // Check if this path directly contains registry.json\n if (await fileExists(join(absPath, \"registry.json\"))) {\n results.push(absPath);\n continue;\n }\n\n // Otherwise, scan one level of subdirectories\n let entries;\n try {\n entries = await readdir(absPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = join(absPath, entry.name);\n if (await fileExists(join(subDir, \"registry.json\"))) {\n results.push(subDir);\n }\n }\n }\n }\n\n return results;\n }\n\n // No paths specified — walk the full tree\n return walkForRegistryJson(resolvedCwd);\n}\n\n/**\n * Extract version strings from versioned filenames like `weather@1.0.0.json`.\n */\nfunction parseVersionFromFilename(\n name: string,\n componentName: string\n): string | null {\n const prefix = `${componentName}@`;\n const suffix = \".json\";\n if (name.startsWith(prefix) && name.endsWith(suffix)) {\n return name.slice(prefix.length, -suffix.length);\n }\n return null;\n}\n\n/**\n * Write the built registry output to the output directory.\n *\n * For each item:\n * 1. Creates the type subdirectory (e.g., tools/, package/)\n * 2. Writes `<typeDir>/<name>.json` — latest version, always overwritten\n * 3. Writes `<typeDir>/<name>@<version>.json` — versioned copy, immutable (skipped if exists)\n * 4. Scans existing versioned files to collect all available versions\n *\n * After all items:\n * 5. Writes `registry.json` index with metadata (no file content)\n *\n * @returns `{ written, skipped }` arrays of relative file paths.\n */\nexport async function writeRegistryOutput(\n outputDir: string,\n items: RegistryItem[]\n): Promise<{ written: string[]; skipped: string[] }> {\n const written: string[] = [];\n const skipped: string[] = [];\n const resolvedOutput = resolve(outputDir);\n\n const indexItems: RegistryIndex[\"items\"] = [];\n\n for (const item of items) {\n const dir = typeToDir[item.type];\n const typeDir = join(resolvedOutput, dir);\n await mkdir(typeDir, { recursive: true });\n\n const itemJson = JSON.stringify(item, null, 2);\n\n // 1. Write latest version (always overwritten)\n const latestPath = join(typeDir, `${item.name}.json`);\n const latestRelative = `${dir}/${item.name}.json`;\n await writeFile(latestPath, itemJson, \"utf-8\");\n written.push(latestRelative);\n\n // 2. Write versioned copy (immutable)\n if (item.version) {\n const versionedFilename = `${item.name}@${item.version}.json`;\n const versionedPath = join(typeDir, versionedFilename);\n const versionedRelative = `${dir}/${versionedFilename}`;\n\n if (await fileExists(versionedPath)) {\n skipped.push(versionedRelative);\n } else {\n await writeFile(versionedPath, itemJson, \"utf-8\");\n written.push(versionedRelative);\n }\n }\n\n // 3. Scan for all versioned files to collect versions\n const versions: string[] = [];\n let entries: string[];\n try {\n entries = await readdir(typeDir);\n } catch {\n entries = [];\n }\n\n for (const filename of entries) {\n const ver = parseVersionFromFilename(filename, item.name);\n if (ver) {\n versions.push(ver);\n }\n }\n\n // Sort versions (simple string sort is fine for semver with consistent formatting)\n versions.sort();\n\n // 4. Build index item (no file content)\n indexItems.push({\n name: item.name,\n type: item.type,\n description: item.description,\n ...(item.registryDependencies &&\n item.registryDependencies.length > 0 && {\n registryDependencies: item.registryDependencies,\n }),\n ...(item.categories &&\n item.categories.length > 0 && { categories: item.categories }),\n ...(item.version && { version: item.version }),\n ...(versions.length > 0 && { versions }),\n ...(item.updatedAt && { updatedAt: item.updatedAt }),\n });\n }\n\n // 5. Write registry.json index\n const index: RegistryIndex = {\n version: \"1\",\n items: indexItems,\n };\n\n const indexPath = join(resolvedOutput, \"registry.json\");\n await writeFile(indexPath, JSON.stringify(index, null, 2), \"utf-8\");\n written.push(\"registry.json\");\n\n return { written, skipped };\n}\n","import { readFile, readdir } from \"fs/promises\";\nimport { join, relative } from \"path\";\nimport {\n componentConfigSchema,\n registryItemSchema,\n typeToDir,\n type ComponentConfig,\n type RegistryItem,\n} from \"./schema.js\";\n\n/** Build tooling devDependencies to exclude from the output */\nconst EXCLUDED_DEV_DEPS = new Set([\n \"typescript\",\n \"@types/bun\",\n \"@types/node\",\n \"tsup\",\n \"vitest\",\n \"jest\",\n \"@types/jest\",\n]);\n\nfunction isExcludedDevDep(name: string): boolean {\n return EXCLUDED_DEV_DEPS.has(name) || name.startsWith(\"@types/\");\n}\n\n/** Strip @scope/ prefix from a package name (e.g., @kitnai/core -> core) */\nfunction stripScope(name: string): string {\n const match = name.match(/^@[^/]+\\/(.+)$/);\n return match ? match[1] : name;\n}\n\n/** Recursively read all .ts files from a directory */\nasync function readTsFiles(\n dir: string,\n baseDir: string,\n exclude: string[]\n): Promise<{ relativePath: string; content: string }[]> {\n const results: { relativePath: string; content: string }[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relPath = relative(baseDir, fullPath);\n\n if (entry.isDirectory()) {\n const nested = await readTsFiles(fullPath, baseDir, exclude);\n results.push(...nested);\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n if (exclude.includes(relPath)) {\n continue;\n }\n const content = await readFile(fullPath, \"utf-8\");\n results.push({ relativePath: relPath, content });\n }\n }\n\n return results;\n}\n\n/**\n * Build a RegistryItem from a component directory.\n *\n * Reads registry.json (required) + optional package.json + source files,\n * and produces a validated RegistryItem.\n */\nexport async function buildComponent(componentDir: string): Promise<RegistryItem> {\n // 1. Read and validate registry.json\n let rawConfig: string;\n try {\n rawConfig = await readFile(join(componentDir, \"registry.json\"), \"utf-8\");\n } catch {\n throw new Error(\n `No registry.json found in ${componentDir}. Every component must have a registry.json file.`\n );\n }\n\n let config: ComponentConfig;\n try {\n config = componentConfigSchema.parse(JSON.parse(rawConfig));\n } catch (err) {\n throw new Error(\n `Invalid registry.json in ${componentDir}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // 2. Try to read package.json (optional)\n let pkg: {\n name?: string;\n version?: string;\n description?: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n } | null = null;\n\n try {\n const rawPkg = await readFile(join(componentDir, \"package.json\"), \"utf-8\");\n pkg = JSON.parse(rawPkg);\n } catch {\n // No package.json, that's fine for standalone components\n }\n\n // 3. Resolve metadata by merging registry.json + package.json\n const name = config.name ?? (pkg?.name ? stripScope(pkg.name) : undefined);\n const version = config.version ?? pkg?.version;\n const description = config.description ?? pkg?.description;\n\n if (!name) {\n throw new Error(\n `Component in ${componentDir} is missing a name. Provide \"name\" in registry.json or have a package.json with a \"name\" field.`\n );\n }\n if (!description) {\n throw new Error(\n `Component in ${componentDir} is missing a description. Provide \"description\" in registry.json or have a package.json with a \"description\" field.`\n );\n }\n\n // Resolve dependencies from package.json if available\n let dependencies = config.dependencies;\n let devDependencies = config.devDependencies;\n\n if (pkg && !config.dependencies) {\n const deps: string[] = [];\n if (pkg.dependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.dependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (pkg.peerDependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.peerDependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (deps.length > 0) {\n dependencies = deps;\n }\n }\n\n if (pkg && !config.devDependencies) {\n const devDeps: string[] = [];\n if (pkg.devDependencies) {\n for (const depName of Object.keys(pkg.devDependencies)) {\n if (!isExcludedDevDep(depName)) {\n devDeps.push(depName);\n }\n }\n }\n if (devDeps.length > 0) {\n devDependencies = devDeps;\n }\n }\n\n // 4. Read source files\n const isPackage = config.type === \"kitn:package\";\n const dirPrefix = config.installDir ?? typeToDir[config.type];\n\n let files: { path: string; content: string; type: typeof config.type }[];\n\n if (isPackage) {\n // For packages: recursively read .ts files from src/ (or sourceDir override)\n const sourceDir = config.sourceDir ?? \"src\";\n const sourcePath = join(componentDir, sourceDir);\n const exclude = config.exclude ?? [];\n\n let tsFiles: { relativePath: string; content: string }[];\n try {\n tsFiles = await readTsFiles(sourcePath, sourcePath, exclude);\n } catch {\n throw new Error(\n `Cannot read source directory \"${sourceDir}\" in ${componentDir}. Make sure it exists.`\n );\n }\n\n files = tsFiles.map((f) => ({\n path: `${dirPrefix}/${f.relativePath}`,\n content: f.content,\n type: config.type,\n }));\n } else {\n // For standalone components: read files listed in the files array\n if (!config.files || config.files.length === 0) {\n throw new Error(\n `Component \"${name}\" (type: ${config.type}) has no \"files\" array in registry.json. Standalone components must list their source files.`\n );\n }\n\n files = await Promise.all(\n config.files.map(async (filePath) => {\n const fullPath = join(componentDir, filePath);\n let content: string;\n try {\n content = await readFile(fullPath, \"utf-8\");\n } catch {\n throw new Error(\n `Cannot read file \"${filePath}\" referenced in registry.json for component \"${name}\". Make sure the file exists at ${fullPath}.`\n );\n }\n return {\n path: `${dirPrefix}/${filePath}`,\n content,\n type: config.type,\n };\n })\n );\n }\n\n // 5. Build the RegistryItem\n const item: RegistryItem = {\n name,\n type: config.type,\n description,\n files,\n };\n\n // Add optional fields only if present\n if (version) item.version = version;\n if (dependencies && dependencies.length > 0) item.dependencies = dependencies;\n if (devDependencies && devDependencies.length > 0) item.devDependencies = devDependencies;\n if (config.registryDependencies && config.registryDependencies.length > 0) {\n item.registryDependencies = config.registryDependencies;\n }\n if (config.envVars) item.envVars = config.envVars;\n if (config.tsconfig) item.tsconfig = config.tsconfig;\n if (config.docs) item.docs = config.docs;\n if (config.categories && config.categories.length > 0) item.categories = config.categories;\n if (config.changelog && config.changelog.length > 0) item.changelog = config.changelog;\n if (isPackage && config.installDir) item.installDir = config.installDir;\n\n // 6. Validate the result\n try {\n return registryItemSchema.parse(item);\n } catch (err) {\n throw new Error(\n `Built component \"${name}\" failed validation: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { resolve, relative } from \"path\";\nimport { scanForComponents, writeRegistryOutput } from \"../registry/build-output.js\";\nimport { buildComponent } from \"../registry/builder.js\";\nimport type { RegistryItem } from \"../registry/schema.js\";\n\ninterface BuildOptions {\n output?: string;\n}\n\nexport async function buildCommand(paths: string[], opts: BuildOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn build \")));\n\n const cwd = process.cwd();\n const outputDir = resolve(cwd, opts.output ?? \"dist/r\");\n\n const s = p.spinner();\n s.start(\"Scanning for components...\");\n\n const componentDirs = await scanForComponents(cwd, paths.length > 0 ? paths : undefined);\n\n if (componentDirs.length === 0) {\n s.stop(\"No components found\");\n p.log.info(\n `No directories with ${pc.bold(\"registry.json\")} found. Run ${pc.bold(\"kitn create\")} to scaffold a component.`\n );\n return;\n }\n\n s.stop(`Found ${componentDirs.length} component(s)`);\n for (const dir of componentDirs) {\n p.log.message(` ${pc.dim(relative(cwd, dir))}`);\n }\n\n s.start(\"Building components...\");\n\n const items: RegistryItem[] = [];\n const errors: { dir: string; error: string }[] = [];\n\n for (const dir of componentDirs) {\n try {\n const item = await buildComponent(dir);\n items.push(item);\n } catch (err: any) {\n errors.push({ dir: relative(cwd, dir), error: err.message });\n }\n }\n\n if (errors.length > 0) {\n s.stop(pc.red(`Build failed with ${errors.length} error(s)`));\n for (const { dir, error } of errors) {\n p.log.error(`${pc.bold(dir)}: ${error}`);\n }\n process.exit(1);\n }\n\n const { written, skipped } = await writeRegistryOutput(outputDir, items);\n\n s.stop(pc.green(`Built ${items.length} component(s)`));\n\n if (written.length > 0) {\n p.log.success(`Wrote ${written.length} file(s):`);\n for (const f of written) {\n p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n }\n\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s) (already exist):`);\n for (const f of skipped) {\n p.log.message(` ${pc.dim(\"-\")} ${f}`);\n }\n }\n\n p.outro(`Output: ${pc.cyan(relative(cwd, outputDir) || \".\")}`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { mkdir, writeFile } from \"fs/promises\";\n\nconst VALID_TYPES = [\"agent\", \"tool\", \"skill\", \"storage\"] as const;\ntype ComponentType = (typeof VALID_TYPES)[number];\n\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toTitleCase(str: string): string {\n return str\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\nfunction generateRegistryJson(\n type: ComponentType,\n name: string,\n sourceFile: string\n): object {\n const base: Record<string, unknown> = {\n $schema: \"https://kitn.dev/schema/registry.json\",\n name,\n type: `kitn:${type}`,\n version: \"0.1.0\",\n description: \"\",\n files: [sourceFile],\n categories: [],\n };\n\n if (type === \"tool\") {\n base.dependencies = [\"ai\", \"zod\"];\n } else if (type === \"agent\" || type === \"storage\") {\n base.dependencies = [];\n }\n\n return base;\n}\n\nfunction generateAgentSource(name: string): string {\n const camel = toCamelCase(name);\n return `import type { AgentConfig } from \"@kitnai/core\";\n\nexport const ${camel}Config: AgentConfig = {\n name: \"${name}\",\n description: \"\",\n system: \"You are a helpful assistant.\",\n tools: [],\n};\n`;\n}\n\nfunction generateToolSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { tool } from \"ai\";\nimport { z } from \"zod\";\n\nexport const ${camel} = tool({\n description: \"\",\n inputSchema: z.object({\n input: z.string().describe(\"Input parameter\"),\n }),\n execute: async ({ input }) => {\n // TODO: implement\n return { result: input };\n },\n});\n`;\n}\n\nfunction generateSkillSource(name: string): string {\n const title = toTitleCase(name);\n return `---\nname: ${name}\ndescription: \"\"\n---\n\n# ${title}\n\nDescribe what this skill does and how to use it.\n`;\n}\n\nfunction generateStorageSource(name: string): string {\n const camel = toCamelCase(\"create-\" + name);\n return `import type { StorageProvider } from \"@kitnai/core\";\n\nexport function ${camel}(config?: Record<string, unknown>): StorageProvider {\n // TODO: implement storage provider\n throw new Error(\"Not implemented\");\n}\n`;\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const { stat } = await import(\"fs/promises\");\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function createComponent(\n type: string,\n name: string,\n opts?: { cwd?: string }\n): Promise<{ dir: string; files: string[] }> {\n if (!VALID_TYPES.includes(type as ComponentType)) {\n throw new Error(\n `Invalid component type: \"${type}\". Valid types: ${VALID_TYPES.join(\", \")}`\n );\n }\n\n const cwd = opts?.cwd ?? process.cwd();\n const dir = join(cwd, name);\n\n if (await dirExists(dir)) {\n throw new Error(`Directory \"${name}\" already exists`);\n }\n\n await mkdir(dir, { recursive: true });\n\n const validType = type as ComponentType;\n const sourceFile = validType === \"skill\" ? \"README.md\" : `${name}.ts`;\n const registryJson = generateRegistryJson(validType, name, sourceFile);\n\n await writeFile(\n join(dir, \"registry.json\"),\n JSON.stringify(registryJson, null, 2) + \"\\n\"\n );\n\n let source: string;\n switch (validType) {\n case \"agent\":\n source = generateAgentSource(name);\n break;\n case \"tool\":\n source = generateToolSource(name);\n break;\n case \"skill\":\n source = generateSkillSource(name);\n break;\n case \"storage\":\n source = generateStorageSource(name);\n break;\n }\n\n await writeFile(join(dir, sourceFile), source);\n\n return { dir, files: [\"registry.json\", sourceFile] };\n}\n\nexport async function createCommand(type: string, name: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn create \")));\n\n try {\n const { dir, files } = await createComponent(type, name);\n\n p.log.success(`Created ${pc.bold(type)} component ${pc.cyan(name)}`);\n for (const file of files) {\n p.log.message(` ${pc.green(\"+\")} ${file}`);\n }\n\n const editFile = files.find((f) => f !== \"registry.json\") ?? files[0];\n p.outro(\n `Edit ${pc.cyan(`${name}/${editFile}`)}, then run ${pc.bold(\"kitn build\")}`\n );\n } catch (err: any) {\n p.log.error(err.message);\n process.exit(1);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function infoCommand(component: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const ref = parseComponentRef(component);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Fetching component info...\");\n\n // Fetch registry index to find the component and get available versions\n let index;\n try {\n index = await fetcher.fetchIndex(ref.namespace);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch registry\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n s.stop(pc.red(\"Component not found\"));\n p.log.error(`Component '${ref.name}' not found in registry.`);\n process.exit(1);\n }\n\n // Fetch the full component JSON (specific version or latest)\n const dir = typeToDir[indexItem.type] as any;\n let item;\n try {\n item = await fetcher.fetchItem(ref.name, dir, ref.namespace, ref.version);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch component\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(\"Component found\");\n\n // Display formatted output\n const version = item.version ?? indexItem.version ?? \"unknown\";\n const typeName = indexItem.type.replace(\"kitn:\", \"\");\n\n // Header: name, version, namespace\n console.log();\n console.log(\n ` ${pc.bold(item.name)} ${pc.cyan(`v${version}`)}${\" \".repeat(Math.max(1, 40 - item.name.length - version.length - 2))}${pc.dim(ref.namespace)}`\n );\n console.log(` ${pc.dim(item.description)}`);\n console.log();\n\n // Details\n console.log(` ${pc.dim(\"Type:\")} ${typeName}`);\n\n if (item.dependencies?.length) {\n console.log(\n ` ${pc.dim(\"Dependencies:\")} ${item.dependencies.join(\", \")}`\n );\n }\n\n if (item.registryDependencies?.length) {\n console.log(\n ` ${pc.dim(\"Registry deps:\")} ${item.registryDependencies.join(\", \")}`\n );\n }\n\n if (item.categories?.length) {\n console.log(\n ` ${pc.dim(\"Categories:\")} ${item.categories.join(\", \")}`\n );\n }\n\n if (item.updatedAt) {\n console.log(` ${pc.dim(\"Updated:\")} ${item.updatedAt}`);\n }\n\n // Available versions from index\n const versions = indexItem.versions;\n if (versions?.length) {\n console.log(` ${pc.dim(\"Versions:\")} ${versions.join(\", \")}`);\n }\n\n // Changelog\n if (item.changelog?.length) {\n console.log();\n console.log(` ${pc.bold(\"Changelog:\")}`);\n for (const entry of item.changelog) {\n const tag =\n entry.type === \"feature\"\n ? pc.green(entry.type)\n : entry.type === \"fix\"\n ? pc.yellow(entry.type)\n : entry.type === \"breaking\"\n ? pc.red(entry.type)\n : pc.dim(entry.type);\n console.log(\n ` ${pc.cyan(entry.version)} ${pc.dim(entry.date)} ${tag} ${entry.note}`\n );\n }\n }\n\n // Files\n console.log();\n const fileCount = item.files.length;\n console.log(` ${pc.bold(`Files:`)} ${pc.dim(`(${fileCount})`)}`);\n const maxShown = 10;\n for (const file of item.files.slice(0, maxShown)) {\n console.log(` ${pc.dim(file.path)}`);\n }\n if (fileCount > maxShown) {\n console.log(` ${pc.dim(`... and ${fileCount - maxShown} more`)}`);\n }\n\n // Installed status\n const installed = config.installed?.[item.name];\n if (installed) {\n console.log();\n console.log(\n ` ${pc.green(\"Installed\")} ${pc.dim(`v${installed.version}`)}`\n );\n if (version !== installed.version) {\n console.log(\n ` ${pc.yellow(\"Update available:\")} ${pc.dim(`v${installed.version}`)} → ${pc.cyan(`v${version}`)}`\n );\n }\n }\n\n console.log();\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\n\ninterface RegistryAddOptions {\n cwd?: string;\n overwrite?: boolean;\n}\n\ninterface RegistryRemoveOptions {\n cwd?: string;\n force?: boolean;\n}\n\ninterface RegistryListOptions {\n cwd?: string;\n}\n\nexport async function registryAddCommand(\n namespace: string,\n url: string,\n opts: RegistryAddOptions = {},\n) {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!namespace.startsWith(\"@\")) {\n throw new Error(\"Namespace must start with @ (e.g. @myteam)\");\n }\n if (!url.includes(\"{type}\")) {\n throw new Error(\"URL template must include {type} placeholder\");\n }\n if (!url.includes(\"{name}\")) {\n throw new Error(\"URL template must include {name} placeholder\");\n }\n if (config.registries[namespace] && !opts.overwrite) {\n throw new Error(`Registry '${namespace}' is already configured. Use --overwrite to replace.`);\n }\n\n config.registries[namespace] = url;\n await writeConfig(cwd, config);\n\n p.log.success(`Added registry ${pc.bold(namespace)}`);\n p.log.message(pc.dim(` ${url}`));\n}\n\nexport async function registryRemoveCommand(\n namespace: string,\n opts: RegistryRemoveOptions = {},\n): Promise<{ affectedComponents: string[] }> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!config.registries[namespace]) {\n throw new Error(`Registry '${namespace}' is not configured.`);\n }\n if (namespace === \"@kitn\" && !opts.force) {\n throw new Error(\"Cannot remove the default @kitn registry. Use --force to override.\");\n }\n\n const affectedComponents: string[] = [];\n if (config.installed) {\n for (const [name, entry] of Object.entries(config.installed)) {\n if (entry.registry === namespace) {\n affectedComponents.push(name);\n }\n }\n }\n\n delete config.registries[namespace];\n await writeConfig(cwd, config);\n\n p.log.success(`Removed registry ${pc.bold(namespace)}`);\n if (affectedComponents.length > 0) {\n p.log.warn(`${affectedComponents.length} installed component(s) referenced this registry:`);\n for (const name of affectedComponents) {\n p.log.message(` ${pc.yellow(\"!\")} ${name}`);\n }\n }\n\n return { affectedComponents };\n}\n\nexport async function registryListCommand(\n opts: RegistryListOptions = {},\n): Promise<Array<{ namespace: string; url: string }>> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n const entries = Object.entries(config.registries).map(([namespace, url]) => ({ namespace, url }));\n\n if (entries.length === 0) {\n p.log.message(pc.dim(\" No registries configured.\"));\n } else {\n for (const { namespace, url } of entries) {\n p.log.message(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\n }\n }\n\n return entries;\n}\n","import { Command } from \"commander\";\nimport { startUpdateCheck } from \"./utils/update-check.js\";\n\ndeclare const __CLI_VERSION__: string;\nconst VERSION = typeof __CLI_VERSION__ !== \"undefined\" ? __CLI_VERSION__ : \"0.0.0-dev\";\n\nconst printUpdateNotice = startUpdateCheck(VERSION);\n\nconst program = new Command()\n .name(\"kitn\")\n .description(\"Install AI agent components from the kitn registry\")\n .version(VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Initialize kitn in your project\")\n .action(async () => {\n const { initCommand } = await import(\"./commands/init.js\");\n await initCommand();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add components from the kitn registry\")\n .argument(\"[components...]\", \"component names to install\")\n .option(\"-o, --overwrite\", \"overwrite existing files without prompting\")\n .option(\"-t, --type <type>\", \"filter by component type\")\n .action(async (components: string[], opts) => {\n const { addCommand } = await import(\"./commands/add.js\");\n await addCommand(components, opts);\n });\n\nprogram\n .command(\"list\")\n .description(\"List available and installed components\")\n .option(\"-i, --installed\", \"only show installed components\")\n .option(\"-t, --type <type>\", \"filter by type (agent, tool, skill, storage, package)\")\n .option(\"-r, --registry <namespace>\", \"only show components from this registry\")\n .action(async (opts) => {\n const { listCommand } = await import(\"./commands/list.js\");\n await listCommand(opts);\n });\n\nprogram\n .command(\"diff\")\n .description(\"Show differences between local and registry version\")\n .argument(\"<component>\", \"component name\")\n .action(async (component: string) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand(component);\n });\n\nprogram\n .command(\"remove\")\n .description(\"Remove an installed component\")\n .argument(\"<component>\", \"component name to remove\")\n .action(async (component: string) => {\n const { removeCommand } = await import(\"./commands/remove.js\");\n await removeCommand(component);\n });\n\nprogram\n .command(\"update\")\n .description(\"Update installed components to latest registry version\")\n .argument(\"[components...]\", \"component names to update\")\n .action(async (components: string[]) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand(components);\n });\n\nprogram\n .command(\"build\")\n .description(\"Build registry JSON from components with registry.json files\")\n .argument(\"[paths...]\", \"directories to build (default: scan from cwd)\")\n .option(\"-o, --output <dir>\", \"output directory\", \"dist/r\")\n .action(async (paths: string[], opts) => {\n const { buildCommand } = await import(\"./commands/build.js\");\n await buildCommand(paths, opts);\n });\n\nprogram\n .command(\"create\")\n .description(\"Scaffold a new kitn component\")\n .argument(\"<type>\", \"component type (agent, tool, skill, storage)\")\n .argument(\"<name>\", \"component name\")\n .action(async (type: string, name: string) => {\n const { createCommand } = await import(\"./commands/create.js\");\n await createCommand(type, name);\n });\n\nprogram\n .command(\"info\")\n .description(\"Show details about a component\")\n .argument(\"<component>\", \"component name (e.g. weather-agent, @acme/tool@1.0.0)\")\n .action(async (component: string) => {\n const { infoCommand } = await import(\"./commands/info.js\");\n await infoCommand(component);\n });\n\nconst registry = program\n .command(\"registry\")\n .description(\"Manage component registries\");\n\nregistry\n .command(\"add\")\n .description(\"Add a component registry\")\n .argument(\"<namespace>\", \"registry namespace (e.g. @myteam)\")\n .argument(\"<url>\", \"URL template with {type} and {name} placeholders\")\n .option(\"-o, --overwrite\", \"overwrite if namespace already exists\")\n .action(async (namespace: string, url: string, opts) => {\n const { registryAddCommand } = await import(\"./commands/registry.js\");\n await registryAddCommand(namespace, url, opts);\n });\n\nregistry\n .command(\"remove\")\n .description(\"Remove a component registry\")\n .argument(\"<namespace>\", \"registry namespace to remove (e.g. @myteam)\")\n .option(\"-f, --force\", \"allow removing the default @kitn registry\")\n .action(async (namespace: string, opts) => {\n const { registryRemoveCommand } = await import(\"./commands/registry.js\");\n await registryRemoveCommand(namespace, opts);\n });\n\nregistry\n .command(\"list\")\n .description(\"List all configured registries\")\n .action(async () => {\n const { registryListCommand } = await import(\"./commands/registry.js\");\n await registryListCommand();\n });\n\nawait program.parseAsync();\nprintUpdateNotice();\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport pc from \"picocolors\";\n\nconst CACHE_DIR = join(homedir(), \".kitn\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst CHECK_INTERVAL = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n latest: string;\n checkedAt: number;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n const raw = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(entry: CacheEntry): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true });\n await writeFile(CACHE_FILE, JSON.stringify(entry));\n } catch {\n // Silently ignore cache write failures\n }\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\"https://registry.npmjs.org/@kitnai/cli/latest\", {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nexport function isNewer(latest: string, current: string): boolean {\n const [lMaj, lMin, lPat] = latest.split(\".\").map(Number);\n const [cMaj, cMin, cPat] = current.split(\".\").map(Number);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\n/**\n * Starts a non-blocking update check. Returns a function that,\n * when called, prints the update notice if a newer version was found.\n */\nexport function startUpdateCheck(currentVersion: string): () => void {\n let message = \"\";\n\n // Fire-and-forget: don't block CLI startup\n const check = (async () => {\n const cache = await readCache();\n let latest: string | null = null;\n\n if (cache && Date.now() - cache.checkedAt < CHECK_INTERVAL) {\n latest = cache.latest;\n } else {\n latest = await fetchLatestVersion();\n if (latest) {\n await writeCache({ latest, checkedAt: Date.now() });\n }\n }\n\n if (latest && isNewer(latest, currentVersion)) {\n message = [\n \"\",\n pc.yellow(` Update available: ${pc.dim(currentVersion)} → ${pc.green(latest)}`),\n pc.dim(` Run ${pc.cyan(\"npx @kitnai/cli@latest\")} or ${pc.cyan(\"npm i -g @kitnai/cli\")}`),\n \"\",\n ].join(\"\\n\");\n }\n })();\n\n // Suppress unhandled rejection from the fire-and-forget promise\n check.catch(() => {});\n\n return () => {\n if (message) process.stderr.write(message);\n };\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,YAAAA,WAAU,aAAAC,kBAAiB;AACpC,SAAS,QAAAC,aAAY;AACrB,SAAS,SAAS;AAgClB,eAAsB,WAAW,YAAgD;AAC/E,MAAI;AACF,UAAM,MAAM,MAAMF,UAASE,MAAK,YAAY,WAAW,GAAG,OAAO;AACjE,WAAO,aAAa,MAAM,KAAK,MAAM,GAAG,CAAC;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YAAY,YAAoB,QAAmC;AACvF,QAAM,OAAO,EAAE,SAAS,uCAAuC,GAAG,OAAO;AACzE,QAAMD,WAAUC,MAAK,YAAY,WAAW,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AACrF;AA9CA,IAIM,eAGA,0BAQO,cAiBP;AAhCN;AAAA;AAAA;AAIA,IAAM,gBAAgB,EAAE,KAAK,CAAC,cAAc,aAAa,cAAc,gBAAgB,cAAc,CAAC;AAGtG,IAAM,2BAA2B,EAAE,OAAO;AAAA,MACxC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,SAAS,EAAE,OAAO;AAAA,MAClB,aAAa,EAAE,OAAO;AAAA,MACtB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,MACzB,MAAM,EAAE,OAAO;AAAA,IACjB,CAAC;AAEM,IAAM,eAAe,EAAE,OAAO;AAAA,MACnC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAAS,EAAE,KAAK,CAAC,OAAO,QAAQ,MAAM,CAAC;AAAA,MACvC,WAAW,EAAE,KAAK,CAAC,QAAQ,cAAc,UAAU,WAAW,SAAS,CAAC,EAAE,SAAS;AAAA,MACnF,SAAS,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,QAAQ,EAAE,OAAO;AAAA,QACjB,OAAO,EAAE,OAAO;AAAA,QAChB,QAAQ,EAAE,OAAO;AAAA,QACjB,SAAS,EAAE,OAAO;AAAA,MACpB,CAAC;AAAA,MACD,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,MAC3C,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,wBAAwB,EAAE,SAAS;AAAA,IACrE,CAAC;AAID,IAAM,cAAc;AAAA;AAAA;;;AChCpB;AAAA;AAAA;AAAA;AAAA,YAAY,OAAO;AACnB,OAAOC,SAAQ;AAGf,eAAsB,cAAc;AAClC,EAAE,QAAMA,IAAG,OAAOA,IAAG,MAAM,QAAQ,CAAC,CAAC;AAErC,QAAM,MAAM,QAAQ,IAAI;AAExB,QAAM,WAAW,MAAM,WAAW,GAAG;AACrC,MAAI,UAAU;AACZ,IAAE,MAAI,KAAK,6CAA6C;AACxD,UAAM,iBAAiB,MAAQ,UAAQ;AAAA,MACrC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,cAAc,KAAK,CAAC,gBAAgB;AACjD,MAAE,SAAO,iBAAiB;AAC1B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,UAAU,MAAQ,SAAO;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,cAAc;AAAA,MAClD,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,MAClC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,IACjC;AAAA,EACF,CAAC;AACD,MAAM,WAAS,OAAO,GAAG;AACvB,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,MAAQ,SAAO;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,cAAc;AAAA,MACpD,EAAE,OAAO,cAAc,OAAO,sBAAsB,MAAM,cAAc;AAAA,MACxE,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,cAAc;AAAA,MACxD,EAAE,OAAO,WAAW,OAAO,WAAW,MAAM,cAAc;AAAA,MAC1D,EAAE,OAAO,WAAW,OAAO,WAAW,MAAM,cAAc;AAAA,IAC5D;AAAA,EACF,CAAC;AACD,MAAM,WAAS,SAAS,GAAG;AACzB,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,MAAQ,OAAK;AAAA,IACxB,SAAS;AAAA,IACT,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AACD,MAAM,WAAS,IAAI,GAAG;AACpB,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU;AAChB,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,QAAQ,GAAG,OAAO;AAAA,MAClB,OAAO,GAAG,OAAO;AAAA,MACjB,QAAQ,GAAG,OAAO;AAAA,MAClB,SAAS,GAAG,OAAO;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,IAAM,UAAQ;AACpB,IAAE,MAAM,mBAAmB;AAC3B,QAAM,YAAY,KAAK,MAAM;AAC7B,IAAE,KAAK,mBAAmB;AAE1B,EAAE,QAAMA,IAAG,MAAM,0FAA0F,CAAC;AAC9G;AAlFA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,SAAS,cAAc;AACvB,SAAS,QAAAC,aAAY;AAYrB,eAAsB,qBAAqB,KAA6C;AACtF,aAAW,CAAC,UAAU,EAAE,KAAK,cAAc;AACzC,QAAI;AACF,YAAM,OAAOA,MAAK,KAAK,QAAQ,CAAC;AAChC,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAvBA,IAKM;AALN;AAAA;AAAA;AAKA,IAAM,eAA2C;AAAA,MAC/C,CAAC,YAAY,KAAK;AAAA,MAClB,CAAC,aAAa,KAAK;AAAA,MACnB,CAAC,kBAAkB,MAAM;AAAA,MACzB,CAAC,aAAa,MAAM;AAAA,MACpB,CAAC,qBAAqB,KAAK;AAAA,IAC7B;AAAA;AAAA;;;ACXA,IAKa;AALb;AAAA;AAAA;AAKO,IAAM,kBAAN,MAAsB;AAAA,MACnB;AAAA,MACA,QAAQ,oBAAI,IAAmC;AAAA,MAC/C;AAAA,MAER,YAAY,YAAoC,SAAmB;AACjE,aAAK,aAAa;AAClB,aAAK,UAAU,WAAW,KAAK;AAAA,MACjC;AAAA,MAEA,WAAW,MAAc,SAAkB,YAAY,SAAS,SAA0B;AACxF,cAAM,WAAW,KAAK,WAAW,SAAS;AAC1C,YAAI,CAAC,SAAU,OAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE;AACxE,cAAM,WAAW,UAAU,GAAG,IAAI,IAAI,OAAO,KAAK;AAClD,eAAO,SAAS,QAAQ,UAAU,QAAQ,EAAE,QAAQ,UAAU,OAAO;AAAA,MACvE;AAAA,MAEA,MAAM,UAAU,MAAc,SAAkB,YAAY,SAAS,SAAyC;AAC5G,cAAM,MAAM,KAAK,WAAW,MAAM,SAAS,WAAW,OAAO;AAC7D,YAAI,CAAC,KAAK,MAAM,IAAI,GAAG,GAAG;AACxB,eAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,GAAG,CAAC;AAAA,QACvC;AACA,eAAO,KAAK,MAAM,IAAI,GAAG;AAAA,MAC3B;AAAA,MAEA,MAAM,WAAW,YAAY,SAAiC;AAC5D,cAAM,WAAW,KAAK,WAAW,SAAS;AAC1C,YAAI,CAAC,SAAU,OAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE;AACxE,cAAM,UAAU,SAAS,QAAQ,sBAAsB,eAAe;AACtE,cAAM,MAAM,MAAM,MAAM,OAAO;AAC/B,YAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mCAAmC,IAAI,UAAU,EAAE;AAChF,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,MAEA,MAAc,aAAa,KAAoC;AAC7D,cAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,YAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mBAAmB,GAAG,KAAK,IAAI,UAAU,EAAE;AACxE,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACF;AAAA;AAAA;;;ACxCA,eAAsB,oBACpB,OACA,WACyB;AACzB,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,QAAQ,oBAAI,IAA0B;AAC5C,QAAM,QAA4B,CAAC;AAEnC,iBAAeC,SAAQ,MAA6B;AAClD,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,YAAQ,IAAI,IAAI;AAEhB,UAAM,OAAO,MAAM,UAAU,IAAI;AACjC,UAAM,IAAI,MAAM,IAAI;AAEpB,UAAM,OAAO,KAAK,wBAAwB,CAAC;AAC3C,eAAW,OAAO,MAAM;AACtB,YAAM,KAAK,CAAC,KAAK,IAAI,CAAC;AACtB,YAAMA,SAAQ,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAMA,SAAQ,IAAI;AAAA,EACpB;AAEA,SAAO,gBAAgB,OAAO,KAAK;AACrC;AAEA,SAAS,gBACP,OACA,OACgB;AAChB,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,YAAY,oBAAI,IAAsB;AAE5C,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,aAAS,IAAI,MAAM,CAAC;AACpB,cAAU,IAAI,MAAM,CAAC,CAAC;AAAA,EACxB;AAEA,aAAW,CAAC,MAAM,EAAE,KAAK,OAAO;AAC9B,cAAU,IAAI,IAAI,GAAG,KAAK,EAAE;AAC5B,aAAS,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,MAAM,MAAM,KAAK,UAAU;AACrC,QAAI,WAAW,EAAG,OAAM,KAAK,IAAI;AAAA,EACnC;AAEA,QAAM,SAAyB,CAAC;AAChC,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,OAAO,MAAM,MAAM;AACzB,WAAO,KAAK,MAAM,IAAI,IAAI,CAAE;AAE5B,eAAW,YAAY,UAAU,IAAI,IAAI,KAAK,CAAC,GAAG;AAChD,YAAM,aAAa,SAAS,IAAI,QAAQ,KAAK,KAAK;AAClD,eAAS,IAAI,UAAU,SAAS;AAChC,UAAI,cAAc,EAAG,OAAM,KAAK,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,MAAM,MAAM;AAChC,UAAM,UAAU,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACjF,UAAM,IAAI,MAAM,2CAA2C,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,EACjF;AAEA,SAAO;AACT;AAzEA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,QAAO,UAAAC,eAAc;AACnD,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAQ5B,eAAsB,gBAAgB,UAAkB,YAAyC;AAC/F,MAAI;AACF,UAAMA,QAAO,QAAQ;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAMH,UAAS,UAAU,OAAO;AACjD,SAAO,aAAa,aAAa,8BAAuB;AAC1D;AAEO,SAAS,aAAa,UAAkB,YAAoB,YAA4B;AAC7F,SAAO,YAAY,UAAU,YAAY,YAAY,SAAS,UAAU;AAC1E;AAEA,eAAsB,iBAAiB,UAA0C;AAC/E,MAAI;AACF,WAAO,MAAMA,UAAS,UAAU,OAAO;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,mBAAmB,UAAkB,SAAgC;AACzF,QAAME,OAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAMD,WAAU,UAAU,OAAO;AACnC;AAnCA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,gBAAgB;AAGlB,SAAS,oBAAoB,IAAoB,MAAgB,YAA0B;AAChG,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,OAAO,KAAK,KAAK,GAAG;AAC1B,QAAM,OAAO,MAAM;AACjB,YAAQ,IAAI;AAAA,MACV,KAAK;AAAO,eAAO,WAAW,IAAI;AAAA,MAClC,KAAK;AAAQ,eAAO,YAAY,IAAI;AAAA,MACpC,KAAK;AAAQ,eAAO,YAAY,IAAI;AAAA,MACpC,KAAK;AAAO,eAAO,eAAe,IAAI;AAAA,IACxC;AAAA,EACF,GAAG;AACH,WAAS,KAAK,EAAE,KAAK,YAAY,OAAO,OAAO,CAAC;AAClD;AAfA;AAAA;AAAA;AAAA;AAAA;;;ACAA,YAAYG,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,YAAAC,WAAU,aAAAC,YAAW,UAAAC,eAAc;AAC5C,SAAS,QAAAC,aAAY;AAOrB,SAAS,aAAa,SAA8B;AAClD,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAM,UAAU,QAAQ,QAAQ,GAAG;AACnC,QAAI,UAAU,GAAG;AACf,WAAK,IAAI,QAAQ,MAAM,GAAG,OAAO,EAAE,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAWA,eAAe,YAAY,MAA+B;AACxD,MAAI;AACF,WAAO,MAAMH,UAAS,MAAM,OAAO;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,eACd,OAC8B;AAC9B,QAAM,SAAuC,CAAC;AAC9C,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS;AAChB,aAAO,OAAO,QAAQ,KAAK,OAAO;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAOA,eAAsB,cACpB,KACA,SACe;AACf,QAAM,OAAO,OAAO,KAAK,OAAO;AAChC,MAAI,KAAK,WAAW,EAAG;AAGvB,QAAM,UAAUG,MAAK,KAAK,MAAM;AAChC,QAAM,cAAcA,MAAK,KAAK,cAAc;AAE5C,QAAM,aAAa,MAAM,YAAY,OAAO;AAC5C,QAAM,iBAAiB,MAAM,YAAY,WAAW;AAEpD,QAAM,UAAU,aAAa,UAAU;AACvC,QAAM,cAAc,aAAa,cAAc;AAG/C,QAAM,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;AACjE,QAAM,iBAAiB,KAAK,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;AAG5E,MAAI,mBAAmB,SAAS,GAAG;AACjC,UAAM,QAAkB,CAAC;AACzB,QAAI,kBAAkB,CAAC,eAAe,SAAS,IAAI,EAAG,OAAM,KAAK,EAAE;AACnE,eAAW,OAAO,oBAAoB;AACpC,YAAM,SAAS,QAAQ,GAAG;AAC1B,YAAM,KAAK,KAAK,OAAO,WAAW,GAAG,OAAO,MAAM,KAAK,OAAO,GAAG,MAAM,EAAE,EAAE;AAC3E,YAAM,KAAK,GAAG,GAAG,GAAG;AAAA,IACtB;AACA,UAAMF,WAAU,aAAa,iBAAiB,MAAM,KAAK,IAAI,IAAI,IAAI;AACrE,IAAE,OAAI,KAAK,WAAWF,IAAG,KAAK,cAAc,CAAC,SAAS,mBAAmB,MAAM,cAAc;AAAA,EAC/F;AAGA,MAAI,eAAe,WAAW,EAAG;AAEjC,EAAE,OAAI,QAAQ,EAAE;AAChB,EAAE,OAAI;AAAA,IACJ,GAAG,eAAe,MAAM;AAAA,EAC1B;AACA,aAAW,OAAO,gBAAgB;AAChC,UAAM,SAAS,QAAQ,GAAG;AAC1B,UAAM,MAAM,OAAO,aAAa,QAAQA,IAAG,IAAI,GAAG,IAAI;AACtD,IAAE,OAAI,QAAQ,KAAKA,IAAG,OAAO,GAAG,CAAC,GAAG,GAAG,KAAK,OAAO,WAAW,GAAG,OAAO,MAAMA,IAAG,IAAI,OAAO,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE;AAAA,EAClH;AAEA,QAAM,eAAe,MAAQ,WAAQ;AAAA,IACnC,SAAS;AAAA,IACT,cAAc;AAAA,EAChB,CAAC;AAED,MAAM,YAAS,YAAY,KAAK,CAAC,cAAc;AAC7C,IAAE,OAAI,KAAK,eAAeA,IAAG,KAAK,MAAM,CAAC,cAAc;AACvD;AAAA,EACF;AAEA,QAAM,aAAuB,CAAC;AAC9B,aAAW,OAAO,gBAAgB;AAChC,UAAM,SAAS,QAAQ,GAAG;AAC1B,UAAM,WAAW,OAAO,WAAW;AAEnC,QAAI;AACJ,QAAI,UAAU;AACZ,cAAQ,MAAQ,YAAS;AAAA,QACvB,SAAS,GAAG,GAAG;AAAA,MACjB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,MAAQ,QAAK;AAAA,QACnB,SAAS,GAAG,GAAG;AAAA,QACf,aAAa,OAAO;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,QAAM,YAAS,KAAK,GAAG;AACrB,MAAE,OAAI,KAAK,4CAA4CA,IAAG,KAAK,MAAM,CAAC,cAAc;AACpF;AAAA,IACF;AAEA,QAAI,OAAO;AACT,iBAAW,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,IACnC;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,cAAc,MAAM,YAAY,OAAO;AAC7C,UAAM,QAAkB,CAAC;AACzB,QAAI,eAAe,CAAC,YAAY,SAAS,IAAI,EAAG,OAAM,KAAK,EAAE;AAC7D,UAAM,KAAK,GAAG,UAAU;AACxB,UAAME,WAAU,SAAS,cAAc,MAAM,KAAK,IAAI,IAAI,IAAI;AAC9D,IAAE,OAAI,QAAQ,SAAS,WAAW,MAAM,mBAAmBF,IAAG,KAAK,MAAM,CAAC,EAAE;AAAA,EAC9E;AACF;AAzJA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,UAAmB,QAAAK,aAAmB;AAmBxC,SAAS,mBACd,SACA,UACA,UACA,SACQ;AACR,QAAM,iBAAiB,kBAAkB,QAAQ;AACjD,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,YAAY,QAAQ,cAAc;AAGxC,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,CAAC,QAAQ,QAAgB,MAAc,YAAoB,UAAkB;AAC3E,UAAI,CAAC,YAAY,SAAS,IAAgB,GAAG;AAC3C,eAAO,GAAG,MAAM,SAAS,IAAI,IAAI,UAAU,GAAG,KAAK;AAAA,MACrD;AAEA,YAAM,YAAY,QAAQ,IAAgB;AAC1C,YAAM,aAAaA,MAAK,WAAW,UAAU;AAC7C,UAAI,MAAM,SAAS,WAAW,UAAU;AAGxC,YAAM,IAAI,MAAM,IAAI,EAAE,KAAK,GAAG;AAG9B,UAAI,CAAC,IAAI,WAAW,GAAG,GAAG;AACxB,cAAM,KAAK,GAAG;AAAA,MAChB;AAEA,aAAO,GAAG,MAAM,GAAG,GAAG,GAAG,KAAK;AAAA,IAChC;AAAA,EACF;AACF;AArDA,IAIM,aAEA;AANN;AAAA;AAAA;AAIA,IAAM,cAAmC,CAAC,UAAU,SAAS,UAAU,SAAS;AAEhF,IAAM,oBAA8C;AAAA,MAClD,cAAc;AAAA,MACd,aAAa;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;ACXA,SAAS,YAAAC,WAAU,aAAAC,kBAAiB;AACpC,SAAS,QAAAC,aAAY;AAMrB,SAAS,WAAWC,OAAsB;AACxC,SAAOA,MACJ,QAAQ,aAAa,EAAE,EACvB,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,gBAAgB,IAAI;AACjC;AAMO,SAAS,cACd,iBACA,OACQ;AACR,QAAM,SAAS,KAAK,MAAM,WAAW,eAAe,CAAC;AAErD,MAAI,CAAC,OAAO,iBAAiB;AAC3B,WAAO,kBAAkB,CAAC;AAAA,EAC5B;AACA,MAAI,CAAC,OAAO,gBAAgB,OAAO;AACjC,WAAO,gBAAgB,QAAQ,CAAC;AAAA,EAClC;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,WAAO,gBAAgB,MAAM,GAAG,IAAI;AAAA,EACtC;AAEA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI;AAC3C;AAMA,eAAsB,qBACpB,YACA,OACe;AACf,QAAM,eAAeD,MAAK,YAAY,eAAe;AACrD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMF,UAAS,cAAc,OAAO;AAAA,EAChD,QAAQ;AACN,cAAU;AAAA,EACZ;AAEA,QAAM,UAAU,cAAc,SAAS,KAAK;AAC5C,QAAMC,WAAU,cAAc,OAAO;AACvC;AAxDA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,kBAAkB;AAEpB,SAAS,YAAY,SAAyB;AACnD,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACtE;AAJA;AAAA;AAAA;AAAA;AAAA;;;ACMO,SAAS,kBAAkB,OAA6B;AAC7D,MAAI,YAAY;AAChB,MAAI,OAAO;AAGX,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,aAAa,IAAI;AACnB,YAAM,IAAI,MAAM,gCAAgC,KAAK,4BAA4B;AAAA,IACnF;AACA,gBAAY,KAAK,MAAM,GAAG,QAAQ;AAClC,WAAO,KAAK,MAAM,WAAW,CAAC;AAAA,EAChC;AAGA,QAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,MAAI,UAAU,IAAI;AAChB,WAAO,EAAE,WAAW,MAAM,MAAM,SAAS,OAAU;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,MAAM,GAAG,KAAK;AAAA,IACzB,SAAS,KAAK,MAAM,QAAQ,CAAC;AAAA,EAC/B;AACF;AA/BA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,KAAAG,UAAS;AAAlB,IAEaC,gBAGA,oBAMA,sBAQA,oBASA,uBAqBA,oBAoBA,yBAWA,qBAOA;AAvFb;AAAA;AAAA;AAEO,IAAMA,iBAAgBD,GAAE,KAAK,CAAC,cAAc,aAAa,cAAc,gBAAgB,cAAc,CAAC;AAGtG,IAAM,qBAAqBA,GAAE,OAAO;AAAA,MACzC,MAAMA,GAAE,OAAO;AAAA,MACf,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMC;AAAA,IACR,CAAC;AAEM,IAAM,uBAAuBD,GAAE,OAAO;AAAA,MAC3C,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMA,GAAE,KAAK,CAAC,WAAW,OAAO,YAAY,SAAS,CAAC;AAAA,MACtD,MAAMA,GAAE,OAAO;AAAA,IACjB,CAAC;AAGM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,MACzC,aAAaA,GAAE,OAAO;AAAA,MACtB,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAC/B,QAAQA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAC7B,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,CAAC;AAIM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,MAC5C,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAMC;AAAA,MACN,MAAMD,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC3C,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC9C,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACpC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACtC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,MAC7D,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAG,kBAAkB,EAAE,SAAS;AAAA,MAC3D,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACzC,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,WAAWA,GAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA,IACpD,CAAC;AAGM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,MACzC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMC;AAAA,MACN,aAAaD,GAAE,OAAO;AAAA,MACtB,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC3C,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC9C,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAG,kBAAkB,EAAE,SAAS;AAAA,MAC3D,OAAOA,GAAE,MAAM,kBAAkB;AAAA,MACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,MAC7D,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACzC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,WAAWA,GAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA,IACpD,CAAC;AAGM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,MAC9C,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMC;AAAA,MACN,aAAaD,GAAE,OAAO;AAAA,MACtB,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACzC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACvC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,CAAC;AAEM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,MAC1C,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAASA,GAAE,OAAO;AAAA,MAClB,OAAOA,GAAE,MAAM,uBAAuB;AAAA,IACxC,CAAC;AAGM,IAAM,YAA2C;AAAA,MACtD,cAAc;AAAA,MACd,aAAa;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;AC7FA;AAAA;AAAA;AAAA;AAAA,YAAYE,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,QAAAC,aAAY;AAyBrB,eAAsB,WAAW,YAAsB,MAAkB;AACvE,EAAE,SAAMD,IAAG,OAAOA,IAAG,MAAM,YAAY,CAAC,CAAC;AAEzC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,IAAE,OAAI,MAAM,+CAA+C;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,qBAAqB,WAAW,IAAI,CAAC,MAAM;AAC/C,QAAI,MAAM,UAAU;AAClB,YAAME,MAAK,OAAO,aAAa;AAC/B,aAAOA;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,mBAAmB,IAAI,iBAAiB;AACrD,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AAErD,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,2BAA2B;AAEnC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,oBAAoB,oBAAoB,OAAO,SAAS;AACvE,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK,EAAE,WAAW,SAAS,MAAM,SAAS,OAAU;AAChG,YAAM,QAAQ,MAAM,QAAQ,WAAW,IAAI,SAAS;AACpD,YAAM,YAAY,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACzD,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,cAAc,IAAI,kBAAkB,IAAI,SAAS,WAAW;AAC5F,YAAM,MAAM,UAAU,UAAU,IAAI;AACpC,aAAO,QAAQ,UAAU,MAAM,KAAY,IAAI,WAAW,IAAI,OAAO;AAAA,IACvE,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,MAAE,KAAKF,IAAG,IAAI,gCAAgC,CAAC;AAC/C,IAAE,OAAI,MAAM,IAAI,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,YAAY,SAAS,MAAM,eAAe;AAEjD,EAAE,OAAI,KAAK,wBAAwB;AACnC,aAAW,QAAQ,UAAU;AAC3B,UAAM,aAAa,mBAAmB,SAAS,KAAK,IAAI,KAAK,WAAW,SAAS,KAAK,IAAI;AAC1F,UAAM,QAAQ,aAAa,KAAK,OAAO,GAAG,KAAK,IAAI,IAAIA,IAAG,IAAI,cAAc,CAAC;AAC7E,IAAE,OAAI,QAAQ,KAAKA,IAAG,KAAK,KAAK,CAAC,EAAE;AAAA,EACrC;AAEA,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,aAAc,SAAQ,KAAK,GAAG,KAAK,YAAY;AAExD,QAAI,KAAK,SAAS,gBAAgB;AAEhC,YAAM,UAAU,OAAO,QAAQ,QAAQ;AAEvC,iBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAM,aAAaC,MAAK,KAAK,SAAS,KAAK,IAAI;AAC/C,cAAM,eAAeA,MAAK,SAAS,KAAK,IAAI;AAE5C,cAAM,SAAS,MAAM,gBAAgB,YAAY,KAAK,OAAO;AAE7D,gBAAQ,QAAQ;AAAA,UACd;AACE,kBAAM,mBAAmB,YAAY,KAAK,OAAO;AACjD,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,gBAAI,KAAK,WAAW;AAClB,oBAAM,mBAAmB,YAAY,KAAK,OAAO;AACjD,sBAAQ,KAAK,YAAY;AAAA,YAC3B,OAAO;AACL,oBAAM,WAAW,MAAM,iBAAiB,UAAU;AAClD,oBAAM,OAAO,aAAa,cAAc,YAAY,IAAI,KAAK,OAAO;AACpE,cAAE,OAAI,QAAQD,IAAG,IAAI,IAAI,CAAC;AAE1B,oBAAM,SAAS,MAAQ,UAAO;AAAA,gBAC5B,SAAS,GAAG,YAAY;AAAA,gBACxB,SAAS;AAAA,kBACP,EAAE,OAAO,QAAQ,OAAO,qBAAqB;AAAA,kBAC7C,EAAE,OAAO,aAAa,OAAO,kCAAkC;AAAA,gBACjE;AAAA,cACF,CAAC;AAED,kBAAI,CAAG,YAAS,MAAM,KAAK,WAAW,aAAa;AACjD,sBAAM,mBAAmB,YAAY,KAAK,OAAO;AACjD,wBAAQ,KAAK,YAAY;AAAA,cAC3B,OAAO;AACL,wBAAQ,KAAK,YAAY;AAAA,cAC3B;AAAA,YACF;AACA;AAAA,QACJ;AAAA,MACF;AAGA,UAAI,KAAK,UAAU;AACjB,cAAM,gBAA0C,CAAC;AACjD,cAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,mBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACzD,wBAAc,GAAG,IAAI,OAAO,IAAI,CAAC,MAAM,KAAKC,MAAK,SAAS,YAAY,CAAC,CAAC,EAAE;AAAA,QAC5E;AACA,cAAM,qBAAqB,KAAK,aAAa;AAC7C,QAAE,OAAI,KAAK,qCAAqC,OAAO,KAAK,aAAa,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACzF;AAGA,YAAM,YAAY,OAAO,aAAa,CAAC;AACvC,YAAM,aAAa,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAC7D,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,KAAK,EAAE,WAAW,SAAS,MAAM,KAAK,MAAM,SAAS,OAAU;AAChH,YAAM,eAAe,IAAI,cAAc,UAAU,KAAK,OAAO,GAAG,IAAI,SAAS,IAAI,KAAK,IAAI;AAC1F,gBAAU,YAAY,IAAI;AAAA,QACxB,UAAU,IAAI;AAAA,QACd,SAAS,KAAK,WAAW;AAAA,QACzB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,OAAO,KAAK,MAAM,IAAI,CAAC,MAAMA,MAAK,SAAS,EAAE,IAAI,CAAC;AAAA,QAClD,MAAM,YAAY,UAAU;AAAA,MAC9B;AACA,aAAO,YAAY;AAAA,IAErB,OAAO;AAEL,iBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAM,YAAY,MAAM;AACtB,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK;AAAc,qBAAO;AAAA,YAC1B,KAAK;AAAa,qBAAO;AAAA,YACzB,KAAK;AAAc,qBAAO;AAAA,YAC1B,KAAK;AAAgB,qBAAO;AAAA,UAC9B;AAAA,QACF,GAAG;AAEH,cAAM,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI;AAC1C,cAAM,aAAaA,MAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAC/D,cAAM,eAAeA,MAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAC5D,cAAM,UAAU,mBAAmB,KAAK,SAAS,KAAK,MAAM,UAAU,OAAO,OAAO;AAEpF,cAAM,SAAS,MAAM,gBAAgB,YAAY,OAAO;AAExD,gBAAQ,QAAQ;AAAA,UACd;AACE,kBAAM,mBAAmB,YAAY,OAAO;AAC5C,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,gBAAI,KAAK,WAAW;AAClB,oBAAM,mBAAmB,YAAY,OAAO;AAC5C,sBAAQ,KAAK,YAAY;AAAA,YAC3B,OAAO;AACL,oBAAM,WAAW,MAAM,iBAAiB,UAAU;AAClD,oBAAM,OAAO,aAAa,cAAc,YAAY,IAAI,OAAO;AAC/D,cAAE,OAAI,QAAQD,IAAG,IAAI,IAAI,CAAC;AAE1B,oBAAM,SAAS,MAAQ,UAAO;AAAA,gBAC5B,SAAS,GAAG,YAAY;AAAA,gBACxB,SAAS;AAAA,kBACP,EAAE,OAAO,QAAQ,OAAO,qBAAqB;AAAA,kBAC7C,EAAE,OAAO,aAAa,OAAO,kCAAkC;AAAA,gBACjE;AAAA,cACF,CAAC;AAED,kBAAI,CAAG,YAAS,MAAM,KAAK,WAAW,aAAa;AACjD,sBAAM,mBAAmB,YAAY,OAAO;AAC5C,wBAAQ,KAAK,YAAY;AAAA,cAC3B,OAAO;AACL,wBAAQ,KAAK,YAAY;AAAA,cAC3B;AAAA,YACF;AACA;AAAA,QACJ;AAAA,MACF;AAGA,YAAM,YAAY,OAAO,aAAa,CAAC;AACvC,YAAM,aAAa,KAAK,MAAM,IAAI,CAAC,MAAM;AACvC,cAAM,KAAK,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI;AACjC,eAAO,mBAAmB,EAAE,SAAS,KAAK,MAAM,IAAI,OAAO,OAAO;AAAA,MACpE,CAAC,EAAE,KAAK,IAAI;AACZ,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,KAAK,EAAE,WAAW,SAAS,MAAM,KAAK,MAAM,SAAS,OAAU;AAChH,YAAM,eAAe,IAAI,cAAc,UAAU,KAAK,OAAO,GAAG,IAAI,SAAS,IAAI,KAAK,IAAI;AAC1F,gBAAU,YAAY,IAAI;AAAA,QACxB,UAAU,IAAI;AAAA,QACd,SAAS,KAAK,WAAW;AAAA,QACzB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,OAAO,KAAK,MAAM,IAAI,CAAC,MAAM;AAC3B,gBAAM,YAAY,MAAM;AACtB,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK;AAAc,uBAAO;AAAA,cAC1B,KAAK;AAAa,uBAAO;AAAA,cACzB,KAAK;AAAc,uBAAO;AAAA,cAC1B,KAAK;AAAgB,uBAAO;AAAA,YAC9B;AAAA,UACF,GAAG;AACH,gBAAM,WAAW,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI;AACvC,iBAAOC,MAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAAA,QAChD,CAAC;AAAA,QACD,MAAM,YAAY,UAAU;AAAA,MAC9B;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,MAAM;AAE7B,QAAM,aAAa,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AACvC,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK,MAAM,qBAAqB,GAAG;AACzC,QAAI,IAAI;AACN,QAAE,MAAM,cAAc,WAAW,MAAM,iBAAiB,WAAW,WAAW,IAAI,MAAM,KAAK,KAAK;AAClG,UAAI;AACF,4BAAoB,IAAI,YAAY,GAAG;AACvC,UAAE,KAAK,wBAAwB;AAAA,MACjC,QAAQ;AACN,UAAE,KAAKD,IAAG,OAAO,qCAAqC,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,QAAQ,WAAW,QAAQ,MAAM,WAAW;AAClD,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKA,IAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EAClE;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,QAAQ,WAAW,QAAQ,MAAM,WAAW;AAClD,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKA,IAAG,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EACnE;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,KAAK,WAAW,QAAQ,MAAM,WAAW;AAC/C,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKA,IAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EAChE;AAGA,QAAM,aAAa,eAAe,QAAQ;AAC1C,QAAM,cAAc,KAAK,UAAU;AAEnC,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,MAAM;AACb,MAAE,OAAI,KAAK,GAAGA,IAAG,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AAAA,IAClD;AAAA,EACF;AAGA,QAAM,iBAAiB,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC1D,QAAM,QAAkB,CAAC;AAEzB,MAAI,eAAe,IAAI,MAAM,KAAK,CAAC,eAAe,IAAI,OAAO,aAAa,MAAM,GAAG;AACjF,UAAM,KAAK,OAAOA,IAAG,KAAK,iBAAiB,CAAC,+BAA+B;AAAA,EAC7E;AAEA,QAAM,KAAK,OAAO,aAAa;AAC/B,MAAI,eAAe,IAAI,EAAE,KAAM,eAAe,IAAI,MAAM,KAAK,eAAe,IAAI,EAAE,GAAI;AACpF,UAAM,KAAK,sCAAsC;AACjD,QAAI,OAAO,QAAQ;AACjB,YAAM,KAAK,EAAE;AACb,YAAM,KAAKA,IAAG,IAAI,gCAAgC,CAAC;AACnD,YAAM,KAAKA,IAAG,IAAI,kDAAkD,CAAC;AACrE,YAAM,KAAKA,IAAG,IAAI,oDAAoD,CAAC;AACvE,YAAM,KAAKA,IAAG,IAAI,EAAE,CAAC;AACrB,YAAM,KAAKA,IAAG,IAAI,mCAAmC,CAAC;AACtD,YAAM,KAAKA,IAAG,IAAI,4DAA4D,CAAC;AAC/E,YAAM,KAAKA,IAAG,IAAI,OAAO,CAAC;AAC1B,YAAM,KAAKA,IAAG,IAAI,EAAE,CAAC;AACrB,YAAM,KAAKA,IAAG,IAAI,2BAA2B,CAAC;AAC9C,YAAM,KAAKA,IAAG,IAAI,kCAAkC,CAAC;AACrD,YAAM,KAAKA,IAAG,IAAI,8BAA8B,CAAC;AACjD,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,IAAE,OAAI,QAAQA,IAAG,KAAK,eAAe,CAAC;AACtC,eAAW,QAAQ,MAAO,CAAE,OAAI,QAAQ,IAAI;AAAA,EAC9C;AAEA,EAAE,SAAMA,IAAG,MAAM,OAAO,CAAC;AAC3B;AAlUA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACpBA;AAAA;AAAA;AAAA;AAAA,YAAYG,QAAO;AACnB,OAAOC,SAAQ;AAaf,eAAsB,YAAY,MAAmB;AACnD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AAErD,QAAM,oBAAoB,KAAK,WAC3B,CAAC,KAAK,QAAQ,IACd,OAAO,KAAK,OAAO,UAAU;AAEjC,MAAI,KAAK,YAAY,CAAC,OAAO,WAAW,KAAK,QAAQ,GAAG;AACtD,IAAE,OAAI,MAAM,YAAYA,IAAG,KAAK,KAAK,QAAQ,CAAC,2BAA2BA,IAAG,KAAK,oBAAoB,CAAC,gCAAgC;AACtI,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,4BAA4B;AAEpC,QAAM,WAAqC,CAAC;AAC5C,QAAM,SAAmB,CAAC;AAE1B,aAAW,aAAa,mBAAmB;AACzC,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAChD,iBAAW,QAAQ,MAAM,OAAO;AAC9B,iBAAS,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC;AAAA,MACtC;AAAA,IACF,SAAS,KAAU;AACjB,aAAO,KAAK,GAAG,SAAS,KAAK,IAAI,OAAO,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,KAAK,OAAO,SAAS,GAAG;AAC9C,MAAE,KAAKA,IAAG,IAAI,4BAA4B,CAAC;AAC3C,eAAW,KAAK,OAAQ,CAAE,OAAI,MAAM,CAAC;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,SAAS,SAAS,MAAM,sBAAsB,kBAAkB,SAAS,OAAO,MAAM,IAAI,kBAAkB,SAAS,OAAO,WAAW,IAAI,aAAa,YAAY,EAAE;AAE7K,aAAW,KAAK,QAAQ;AACtB,IAAE,OAAI,KAAK,GAAGA,IAAG,OAAO,QAAG,CAAC,oBAAoB,CAAC,EAAE;AAAA,EACrD;AAEA,QAAM,YAAY,OAAO,aAAa,CAAC;AACvC,QAAM,aAAa,oBAAI,IAAsC;AAE7D,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,SAAS,KAAK,IAAI,EAAG;AAEjD,UAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS,EAAE;AAC3C,QAAI,CAAC,WAAW,IAAI,KAAK,EAAG,YAAW,IAAI,OAAO,CAAC,CAAC;AACpD,eAAW,IAAI,KAAK,EAAG,KAAK,IAAI;AAAA,EAClC;AAEA,MAAI,iBAAiB;AACrB,MAAI,cAAc;AAElB,aAAW,CAAC,OAAO,KAAK,KAAK,YAAY;AACvC,IAAE,OAAI,QAAQA,IAAG,KAAK;AAAA,EAAK,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC;AAE9E,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,KAAK,cAAc,UAAU,KAAK,OAAO,GAAG,KAAK,SAAS,IAAI,KAAK,IAAI;AAC3F,YAAM,OAAO,UAAU,KAAK,IAAI,KAAK,UAAU,WAAW;AAC1D,UAAI,KAAK,aAAa,CAAC,KAAM;AAE7B,YAAM,UAAUA,IAAG,IAAI,IAAI,KAAK,WAAW,OAAO,EAAE;AAEpD,UAAI,MAAM;AACR;AACA,cAAM,SAASA,IAAG,MAAM,QAAG;AAC3B,cAAM,YAAY,KAAK,WAAW,KAAK,YAAY,KAAK;AACxD,cAAM,YAAY,YAAYA,IAAG,OAAO,YAAO,KAAK,OAAO,YAAY,IAAI;AAC3E,YAAI,UAAW;AACf,QAAE,OAAI,QAAQ,KAAK,MAAM,IAAI,YAAY,OAAO,EAAE,CAAC,IAAI,OAAO,KAAKA,IAAG,IAAI,KAAK,WAAW,CAAC,GAAG,SAAS,EAAE;AAAA,MAC3G,OAAO;AACL,cAAM,SAASA,IAAG,IAAI,QAAG;AACzB,QAAE,OAAI,QAAQ,KAAK,MAAM,IAAI,YAAY,OAAO,EAAE,CAAC,IAAI,OAAO,KAAKA,IAAG,IAAI,KAAK,WAAW,CAAC,EAAE;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS,SAAS;AACzC,QAAM,QAAQ,CAAC,GAAG,cAAc,cAAc,GAAG,cAAc,YAAY;AAC3E,MAAI,cAAc,EAAG,OAAM,KAAK,GAAG,WAAW,UAAU,gBAAgB,IAAI,KAAK,GAAG,YAAY;AAChG,EAAE,OAAI,QAAQ,EAAE;AAChB,EAAE,OAAI,QAAQA,IAAG,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AAC/C;AAzGA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACHA;AAAA;AAAA;AAAA;AAAA,YAAYC,QAAO;AAEnB,SAAS,QAAAC,aAAY;AAOrB,eAAsB,YAAY,eAAuB;AACvD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,QAAQ,kBAAkB,WAAY,OAAO,aAAa,SAAU;AAC1E,QAAM,MAAM,kBAAkB,KAAK;AAGnC,QAAM,eAAe,IAAI,cAAc,UAAU,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI,IAAI,IAAI;AACxF,QAAM,YAAY,OAAO,YAAY,YAAY;AACjD,MAAI,CAAC,WAAW;AACd,IAAE,OAAI,MAAM,cAAc,IAAI,IAAI,qBAAqB;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,UAAU,YAAY,IAAI;AAC5C,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AACrD,QAAM,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAChD,QAAM,YAAY,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;AAC7D,MAAI,CAAC,WAAW;AACd,IAAE,OAAI,MAAM,cAAc,IAAI,IAAI,kBAAkB,SAAS,YAAY;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,UAAU,UAAU,IAAI;AACpC,QAAM,eAAe,MAAM,QAAQ,UAAU,IAAI,MAAM,KAAK,WAAW,IAAI,OAAO;AAElF,MAAI,UAAU;AACd,aAAW,QAAQ,aAAa,OAAO;AACrC,QAAI,UAAU,SAAS,gBAAgB;AAErC,YAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,YAAM,YAAYA,MAAK,KAAK,SAAS,KAAK,IAAI;AAC9C,YAAM,eAAeA,MAAK,SAAS,KAAK,IAAI;AAC5C,YAAM,eAAe,MAAM,iBAAiB,SAAS;AAErD,UAAI,iBAAiB,MAAM;AACzB,QAAE,OAAI,KAAK,GAAG,YAAY,wBAAwB;AAClD,kBAAU;AAAA,MACZ,WAAW,iBAAiB,KAAK,SAAS;AACxC,cAAM,OAAO,aAAa,cAAc,cAAc,KAAK,OAAO;AAClE,gBAAQ,IAAI,IAAI;AAChB,kBAAU;AAAA,MACZ;AAAA,IACF,OAAO;AAEL,YAAM,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI;AAC1C,YAAM,YAAY,MAAM;AACtB,gBAAQ,UAAU,MAAM;AAAA,UACtB,KAAK;AAAc,mBAAO;AAAA,UAC1B,KAAK;AAAa,mBAAO;AAAA,UACzB,KAAK;AAAc,mBAAO;AAAA,UAC1B,KAAK;AAAgB,mBAAO;AAAA,QAC9B;AAAA,MACF,GAAG;AACH,YAAM,YAAYA,MAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAC9D,YAAM,eAAe,MAAM,iBAAiB,SAAS;AAErD,UAAI,iBAAiB,MAAM;AACzB,QAAE,OAAI,KAAK,GAAG,QAAQ,wBAAwB;AAC9C,kBAAU;AAAA,MACZ,WAAW,iBAAiB,KAAK,SAAS;AACxC,cAAM,OAAO,aAAa,UAAU,cAAc,KAAK,OAAO;AAC9D,gBAAQ,IAAI,IAAI;AAChB,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,IAAE,OAAI,QAAQ,GAAG,IAAI,IAAI,+BAA+B;AAAA,EAC1D;AACF;AAtFA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACPA;AAAA;AAAA;AAAA;AAAA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAc;AAIvB,eAAsB,cAAc,eAAuB;AACzD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,QAAQ,kBAAkB,WAAY,OAAO,aAAa,SAAU;AAC1E,QAAM,MAAM,kBAAkB,KAAK;AAGnC,QAAM,eAAe,IAAI,cAAc,UAAU,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI,IAAI,IAAI;AACxF,QAAM,YAAY,OAAO,YAAY,YAAY;AACjD,MAAI,CAAC,WAAW;AACd,IAAE,OAAI,MAAM,cAAc,IAAI,IAAI,qBAAqB;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,MAAQ,WAAQ;AAAA,IACnC,SAAS,UAAU,IAAI,IAAI,sBAAsB,UAAU,MAAM,MAAM;AAAA,IACvE,cAAc;AAAA,EAChB,CAAC;AACD,MAAM,YAAS,YAAY,KAAK,CAAC,cAAc;AAC7C,IAAE,UAAO,mBAAmB;AAC5B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAoB,CAAC;AAC3B,aAAW,YAAY,UAAU,OAAO;AACtC,QAAI;AACF,YAAM,OAAOA,MAAK,KAAK,QAAQ,CAAC;AAChC,cAAQ,KAAK,QAAQ;AAAA,IACvB,QAAQ;AACN,MAAE,OAAI,KAAK,oBAAoB,QAAQ,mCAAmC;AAAA,IAC5E;AAAA,EACF;AAEA,SAAO,OAAO,UAAW,YAAY;AACrC,MAAI,OAAO,KAAK,OAAO,SAAU,EAAE,WAAW,GAAG;AAC/C,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,YAAY,KAAK,MAAM;AAE7B,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,QAAQ,WAAW,IAAI,IAAI,GAAG;AACpC,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKD,IAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EAChE;AACF;AAxDA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAAA;AAEA,YAAYE,QAAO;AAEnB,eAAsB,cAAc,YAAsB;AAExD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,SAAS,MAAM,WAAW,GAAG;AACnC,QAAI,CAAC,QAAQ;AACX,MAAE,OAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,YAAY,OAAO;AACzB,QAAI,CAAC,aAAa,OAAO,KAAK,SAAS,EAAE,WAAW,GAAG;AACrD,MAAE,OAAI,KAAK,oCAAoC;AAC/C;AAAA,IACF;AAEA,iBAAa,OAAO,KAAK,SAAS;AAAA,EACpC;AAEA,QAAM,WAAW,YAAY,EAAE,WAAW,KAAK,CAAC;AAClD;AAxBA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,SAAS,SAAe,aAAAC,YAAW,SAAAC,QAAO,UAAAC,eAAwB;AAClE,SAAS,QAAAC,QAAM,eAAyB;AAexC,eAAe,WAAW,MAAgC;AACxD,MAAI;AACF,UAAMD,QAAO,IAAI;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAe,oBAAoB,KAAgC;AACjE,QAAM,UAAoB,CAAC;AAE3B,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,WAAWC,OAAK,KAAK,eAAe,CAAC,GAAG;AAChD,YAAQ,KAAK,GAAG;AAEhB,WAAO;AAAA,EACT;AAGA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,YAAY,KAAK,CAAC,UAAU,IAAI,MAAM,IAAI,GAAG;AACrD,YAAM,aAAa,MAAM,oBAAoBA,OAAK,KAAK,MAAM,IAAI,CAAC;AAClE,cAAQ,KAAK,GAAG,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;AAcA,eAAsB,kBACpB,KACA,OACmB;AACnB,QAAM,cAAc,QAAQ,GAAG;AAE/B,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,UAAM,UAAoB,CAAC;AAE3B,eAAWC,OAAK,OAAO;AACrB,YAAM,UAAU,QAAQ,aAAaA,GAAC;AAGtC,UAAI,MAAM,WAAWD,OAAK,SAAS,eAAe,CAAC,GAAG;AACpD,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF;AAGA,UAAI;AACJ,UAAI;AACF,kBAAU,MAAM,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,MAC1D,QAAQ;AACN;AAAA,MACF;AAEA,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,SAASA,OAAK,SAAS,MAAM,IAAI;AACvC,cAAI,MAAM,WAAWA,OAAK,QAAQ,eAAe,CAAC,GAAG;AACnD,oBAAQ,KAAK,MAAM;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAGA,SAAO,oBAAoB,WAAW;AACxC;AAKA,SAAS,yBACP,MACA,eACe;AACf,QAAM,SAAS,GAAG,aAAa;AAC/B,QAAM,SAAS;AACf,MAAI,KAAK,WAAW,MAAM,KAAK,KAAK,SAAS,MAAM,GAAG;AACpD,WAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,OAAO,MAAM;AAAA,EACjD;AACA,SAAO;AACT;AAgBA,eAAsB,oBACpB,WACA,OACmD;AACnD,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,iBAAiB,QAAQ,SAAS;AAExC,QAAM,aAAqC,CAAC;AAE5C,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,UAAU,KAAK,IAAI;AAC/B,UAAM,UAAUA,OAAK,gBAAgB,GAAG;AACxC,UAAMF,OAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAExC,UAAM,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC;AAG7C,UAAM,aAAaE,OAAK,SAAS,GAAG,KAAK,IAAI,OAAO;AACpD,UAAM,iBAAiB,GAAG,GAAG,IAAI,KAAK,IAAI;AAC1C,UAAMH,WAAU,YAAY,UAAU,OAAO;AAC7C,YAAQ,KAAK,cAAc;AAG3B,QAAI,KAAK,SAAS;AAChB,YAAM,oBAAoB,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO;AACtD,YAAM,gBAAgBG,OAAK,SAAS,iBAAiB;AACrD,YAAM,oBAAoB,GAAG,GAAG,IAAI,iBAAiB;AAErD,UAAI,MAAM,WAAW,aAAa,GAAG;AACnC,gBAAQ,KAAK,iBAAiB;AAAA,MAChC,OAAO;AACL,cAAMH,WAAU,eAAe,UAAU,OAAO;AAChD,gBAAQ,KAAK,iBAAiB;AAAA,MAChC;AAAA,IACF;AAGA,UAAM,WAAqB,CAAC;AAC5B,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,OAAO;AAAA,IACjC,QAAQ;AACN,gBAAU,CAAC;AAAA,IACb;AAEA,eAAW,YAAY,SAAS;AAC9B,YAAM,MAAM,yBAAyB,UAAU,KAAK,IAAI;AACxD,UAAI,KAAK;AACP,iBAAS,KAAK,GAAG;AAAA,MACnB;AAAA,IACF;AAGA,aAAS,KAAK;AAGd,eAAW,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,GAAI,KAAK,wBACP,KAAK,qBAAqB,SAAS,KAAK;AAAA,QACtC,sBAAsB,KAAK;AAAA,MAC7B;AAAA,MACF,GAAI,KAAK,cACP,KAAK,WAAW,SAAS,KAAK,EAAE,YAAY,KAAK,WAAW;AAAA,MAC9D,GAAI,KAAK,WAAW,EAAE,SAAS,KAAK,QAAQ;AAAA,MAC5C,GAAI,SAAS,SAAS,KAAK,EAAE,SAAS;AAAA,MACtC,GAAI,KAAK,aAAa,EAAE,WAAW,KAAK,UAAU;AAAA,IACpD,CAAC;AAAA,EACH;AAGA,QAAM,QAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAEA,QAAM,YAAYG,OAAK,gBAAgB,eAAe;AACtD,QAAMH,WAAU,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAClE,UAAQ,KAAK,eAAe;AAE5B,SAAO,EAAE,SAAS,QAAQ;AAC5B;AAjOA,IAKM;AALN;AAAA;AAAA;AAEA;AAGA,IAAM,YAAY,oBAAI,IAAI;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;ACbD,SAAS,YAAAK,WAAU,WAAAC,gBAAe;AAClC,SAAS,QAAAC,QAAM,YAAAC,iBAAgB;AAoB/B,SAAS,iBAAiB,MAAuB;AAC/C,SAAO,kBAAkB,IAAI,IAAI,KAAK,KAAK,WAAW,SAAS;AACjE;AAGA,SAAS,WAAW,MAAsB;AACxC,QAAM,QAAQ,KAAK,MAAM,gBAAgB;AACzC,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AAGA,eAAe,YACb,KACA,SACA,SACsD;AACtD,QAAM,UAAuD,CAAC;AAC9D,QAAM,UAAU,MAAMF,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE1D,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWC,OAAK,KAAK,MAAM,IAAI;AACrC,UAAM,UAAUC,UAAS,SAAS,QAAQ;AAE1C,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,SAAS,MAAM,YAAY,UAAU,SAAS,OAAO;AAC3D,cAAQ,KAAK,GAAG,MAAM;AAAA,IACxB,WAAW,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AACvD,UAAI,QAAQ,SAAS,OAAO,GAAG;AAC7B;AAAA,MACF;AACA,YAAM,UAAU,MAAMH,UAAS,UAAU,OAAO;AAChD,cAAQ,KAAK,EAAE,cAAc,SAAS,QAAQ,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAQA,eAAsB,eAAe,cAA6C;AAEhF,MAAI;AACJ,MAAI;AACF,gBAAY,MAAMA,UAASE,OAAK,cAAc,eAAe,GAAG,OAAO;AAAA,EACzE,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,6BAA6B,YAAY;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,sBAAsB,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,EAC5D,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,4BAA4B,YAAY,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/F;AAAA,EACF;AAGA,MAAI,MAOO;AAEX,MAAI;AACF,UAAM,SAAS,MAAMF,UAASE,OAAK,cAAc,cAAc,GAAG,OAAO;AACzE,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB,QAAQ;AAAA,EAER;AAGA,QAAM,OAAO,OAAO,SAAS,KAAK,OAAO,WAAW,IAAI,IAAI,IAAI;AAChE,QAAM,UAAU,OAAO,WAAW,KAAK;AACvC,QAAM,cAAc,OAAO,eAAe,KAAK;AAE/C,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR,gBAAgB,YAAY;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,gBAAgB,YAAY;AAAA,IAC9B;AAAA,EACF;AAGA,MAAI,eAAe,OAAO;AAC1B,MAAI,kBAAkB,OAAO;AAE7B,MAAI,OAAO,CAAC,OAAO,cAAc;AAC/B,UAAM,OAAiB,CAAC;AACxB,QAAI,IAAI,cAAc;AACpB,iBAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,IAAI,YAAY,GAAG;AACpE,YAAI,eAAe,eAAe;AAChC,eAAK,KAAK,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,kBAAkB;AACxB,iBAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,IAAI,gBAAgB,GAAG;AACxE,YAAI,eAAe,eAAe;AAChC,eAAK,KAAK,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,SAAS,GAAG;AACnB,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,OAAO,CAAC,OAAO,iBAAiB;AAClC,UAAM,UAAoB,CAAC;AAC3B,QAAI,IAAI,iBAAiB;AACvB,iBAAW,WAAW,OAAO,KAAK,IAAI,eAAe,GAAG;AACtD,YAAI,CAAC,iBAAiB,OAAO,GAAG;AAC9B,kBAAQ,KAAK,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,wBAAkB;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,YAAY,OAAO,SAAS;AAClC,QAAM,YAAY,OAAO,cAAc,UAAU,OAAO,IAAI;AAE5D,MAAI;AAEJ,MAAI,WAAW;AAEb,UAAM,YAAY,OAAO,aAAa;AACtC,UAAM,aAAaA,OAAK,cAAc,SAAS;AAC/C,UAAM,UAAU,OAAO,WAAW,CAAC;AAEnC,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,YAAY,YAAY,YAAY,OAAO;AAAA,IAC7D,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,iCAAiC,SAAS,QAAQ,YAAY;AAAA,MAChE;AAAA,IACF;AAEA,YAAQ,QAAQ,IAAI,CAAC,OAAO;AAAA,MAC1B,MAAM,GAAG,SAAS,IAAI,EAAE,YAAY;AAAA,MACpC,SAAS,EAAE;AAAA,MACX,MAAM,OAAO;AAAA,IACf,EAAE;AAAA,EACJ,OAAO;AAEL,QAAI,CAAC,OAAO,SAAS,OAAO,MAAM,WAAW,GAAG;AAC9C,YAAM,IAAI;AAAA,QACR,cAAc,IAAI,YAAY,OAAO,IAAI;AAAA,MAC3C;AAAA,IACF;AAEA,YAAQ,MAAM,QAAQ;AAAA,MACpB,OAAO,MAAM,IAAI,OAAO,aAAa;AACnC,cAAM,WAAWA,OAAK,cAAc,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,oBAAU,MAAMF,UAAS,UAAU,OAAO;AAAA,QAC5C,QAAQ;AACN,gBAAM,IAAI;AAAA,YACR,qBAAqB,QAAQ,gDAAgD,IAAI,mCAAmC,QAAQ;AAAA,UAC9H;AAAA,QACF;AACA,eAAO;AAAA,UACL,MAAM,GAAG,SAAS,IAAI,QAAQ;AAAA,UAC9B;AAAA,UACA,MAAM,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,OAAqB;AAAA,IACzB;AAAA,IACA,MAAM,OAAO;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAGA,MAAI,QAAS,MAAK,UAAU;AAC5B,MAAI,gBAAgB,aAAa,SAAS,EAAG,MAAK,eAAe;AACjE,MAAI,mBAAmB,gBAAgB,SAAS,EAAG,MAAK,kBAAkB;AAC1E,MAAI,OAAO,wBAAwB,OAAO,qBAAqB,SAAS,GAAG;AACzE,SAAK,uBAAuB,OAAO;AAAA,EACrC;AACA,MAAI,OAAO,QAAS,MAAK,UAAU,OAAO;AAC1C,MAAI,OAAO,SAAU,MAAK,WAAW,OAAO;AAC5C,MAAI,OAAO,KAAM,MAAK,OAAO,OAAO;AACpC,MAAI,OAAO,cAAc,OAAO,WAAW,SAAS,EAAG,MAAK,aAAa,OAAO;AAChF,MAAI,OAAO,aAAa,OAAO,UAAU,SAAS,EAAG,MAAK,YAAY,OAAO;AAC7E,MAAI,aAAa,OAAO,WAAY,MAAK,aAAa,OAAO;AAG7D,MAAI;AACF,WAAO,mBAAmB,MAAM,IAAI;AAAA,EACtC,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,oBAAoB,IAAI,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAClG;AAAA,EACF;AACF;AAjPA,IAWM;AAXN;AAAA;AAAA;AAEA;AASA,IAAM,oBAAoB,oBAAI,IAAI;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;ACnBD;AAAA;AAAA;AAAA;AAAA,YAAYI,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,WAAAC,UAAS,YAAAC,iBAAgB;AASlC,eAAsB,aAAa,OAAiB,MAAoB;AACtE,EAAE,SAAMF,IAAG,OAAOA,IAAG,MAAM,cAAc,CAAC,CAAC;AAE3C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,YAAYC,SAAQ,KAAK,KAAK,UAAU,QAAQ;AAEtD,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,4BAA4B;AAEpC,QAAM,gBAAgB,MAAM,kBAAkB,KAAK,MAAM,SAAS,IAAI,QAAQ,MAAS;AAEvF,MAAI,cAAc,WAAW,GAAG;AAC9B,MAAE,KAAK,qBAAqB;AAC5B,IAAE,OAAI;AAAA,MACJ,uBAAuBD,IAAG,KAAK,eAAe,CAAC,eAAeA,IAAG,KAAK,aAAa,CAAC;AAAA,IACtF;AACA;AAAA,EACF;AAEA,IAAE,KAAK,SAAS,cAAc,MAAM,eAAe;AACnD,aAAW,OAAO,eAAe;AAC/B,IAAE,OAAI,QAAQ,KAAKA,IAAG,IAAIE,UAAS,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,EACjD;AAEA,IAAE,MAAM,wBAAwB;AAEhC,QAAM,QAAwB,CAAC;AAC/B,QAAM,SAA2C,CAAC;AAElD,aAAW,OAAO,eAAe;AAC/B,QAAI;AACF,YAAM,OAAO,MAAM,eAAe,GAAG;AACrC,YAAM,KAAK,IAAI;AAAA,IACjB,SAAS,KAAU;AACjB,aAAO,KAAK,EAAE,KAAKA,UAAS,KAAK,GAAG,GAAG,OAAO,IAAI,QAAQ,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,MAAE,KAAKF,IAAG,IAAI,qBAAqB,OAAO,MAAM,WAAW,CAAC;AAC5D,eAAW,EAAE,KAAK,MAAM,KAAK,QAAQ;AACnC,MAAE,OAAI,MAAM,GAAGA,IAAG,KAAK,GAAG,CAAC,KAAK,KAAK,EAAE;AAAA,IACzC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,SAAS,QAAQ,IAAI,MAAM,oBAAoB,WAAW,KAAK;AAEvE,IAAE,KAAKA,IAAG,MAAM,SAAS,MAAM,MAAM,eAAe,CAAC;AAErD,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,QAAQ,SAAS,QAAQ,MAAM,WAAW;AAChD,eAAW,KAAK,SAAS;AACvB,MAAE,OAAI,QAAQ,KAAKA,IAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,IACzC;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,KAAK,WAAW,QAAQ,MAAM,2BAA2B;AAC/D,eAAW,KAAK,SAAS;AACvB,MAAE,OAAI,QAAQ,KAAKA,IAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,EAAE,SAAM,WAAWA,IAAG,KAAKE,UAAS,KAAK,SAAS,KAAK,GAAG,CAAC,EAAE;AAC/D;AA5EA;AAAA;AAAA;AAGA;AACA;AAAA;AAAA;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,QAAAC,cAAY;AACrB,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AAKjC,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAC3D;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,GAAG;AACb;AAEA,SAAS,qBACP,MACA,MACA,YACQ;AACR,QAAM,OAAgC;AAAA,IACpC,SAAS;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,IAAI;AAAA,IAClB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO,CAAC,UAAU;AAAA,IAClB,YAAY,CAAC;AAAA,EACf;AAEA,MAAI,SAAS,QAAQ;AACnB,SAAK,eAAe,CAAC,MAAM,KAAK;AAAA,EAClC,WAAW,SAAS,WAAW,SAAS,WAAW;AACjD,SAAK,eAAe,CAAC;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAsB;AACjD,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO;AAAA;AAAA,eAEM,KAAK;AAAA,WACT,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAMf;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO;AAAA;AAAA;AAAA,eAGM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB;AAEA,SAAS,oBAAoB,MAAsB;AACjD,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO;AAAA,QACD,IAAI;AAAA;AAAA;AAAA;AAAA,IAIR,KAAK;AAAA;AAAA;AAAA;AAIT;AAEA,SAAS,sBAAsB,MAAsB;AACnD,QAAM,QAAQ,YAAY,YAAY,IAAI;AAC1C,SAAO;AAAA;AAAA,kBAES,KAAK;AAAA;AAAA;AAAA;AAAA;AAKvB;AAEA,eAAe,UAAU,MAAgC;AACvD,MAAI;AACF,UAAM,EAAE,MAAAC,MAAK,IAAI,MAAM,OAAO,aAAa;AAC3C,UAAM,IAAI,MAAMA,MAAK,IAAI;AACzB,WAAO,EAAE,YAAY;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBACpB,MACA,MACA,MAC2C;AAC3C,MAAI,CAAC,YAAY,SAAS,IAAqB,GAAG;AAChD,UAAM,IAAI;AAAA,MACR,4BAA4B,IAAI,mBAAmB,YAAY,KAAK,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,QAAM,MAAMH,OAAK,KAAK,IAAI;AAE1B,MAAI,MAAM,UAAU,GAAG,GAAG;AACxB,UAAM,IAAI,MAAM,cAAc,IAAI,kBAAkB;AAAA,EACtD;AAEA,QAAMC,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEpC,QAAM,YAAY;AAClB,QAAM,aAAa,cAAc,UAAU,cAAc,GAAG,IAAI;AAChE,QAAM,eAAe,qBAAqB,WAAW,MAAM,UAAU;AAErE,QAAMC;AAAA,IACJF,OAAK,KAAK,eAAe;AAAA,IACzB,KAAK,UAAU,cAAc,MAAM,CAAC,IAAI;AAAA,EAC1C;AAEA,MAAI;AACJ,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,eAAS,oBAAoB,IAAI;AACjC;AAAA,IACF,KAAK;AACH,eAAS,mBAAmB,IAAI;AAChC;AAAA,IACF,KAAK;AACH,eAAS,oBAAoB,IAAI;AACjC;AAAA,IACF,KAAK;AACH,eAAS,sBAAsB,IAAI;AACnC;AAAA,EACJ;AAEA,QAAME,WAAUF,OAAK,KAAK,UAAU,GAAG,MAAM;AAE7C,SAAO,EAAE,KAAK,OAAO,CAAC,iBAAiB,UAAU,EAAE;AACrD;AAEA,eAAsB,cAAc,MAAc,MAAc;AAC9D,EAAE,SAAMD,IAAG,OAAOA,IAAG,MAAM,eAAe,CAAC,CAAC;AAE5C,MAAI;AACF,UAAM,EAAE,KAAK,MAAM,IAAI,MAAM,gBAAgB,MAAM,IAAI;AAEvD,IAAE,OAAI,QAAQ,WAAWA,IAAG,KAAK,IAAI,CAAC,cAAcA,IAAG,KAAK,IAAI,CAAC,EAAE;AACnE,eAAW,QAAQ,OAAO;AACxB,MAAE,OAAI,QAAQ,KAAKA,IAAG,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE;AAAA,IAC5C;AAEA,UAAM,WAAW,MAAM,KAAK,CAAC,MAAM,MAAM,eAAe,KAAK,MAAM,CAAC;AACpE,IAAE;AAAA,MACA,QAAQA,IAAG,KAAK,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,cAAcA,IAAG,KAAK,YAAY,CAAC;AAAA,IAC3E;AAAA,EACF,SAAS,KAAU;AACjB,IAAE,OAAI,MAAM,IAAI,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAjLA,IAKM;AALN;AAAA;AAAA;AAKA,IAAM,cAAc,CAAC,SAAS,QAAQ,SAAS,SAAS;AAAA;AAAA;;;ACLxD;AAAA;AAAA;AAAA;AAAA,YAAYK,SAAO;AACnB,OAAOC,SAAQ;AAMf,eAAsB,YAAY,WAAmB;AACnD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,QAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,kBAAkB,SAAS;AACvC,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AAErD,QAAM,IAAM,YAAQ;AACpB,IAAE,MAAM,4BAA4B;AAGpC,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,QAAQ,WAAW,IAAI,SAAS;AAAA,EAChD,SAAS,KAAU;AACjB,MAAE,KAAKA,IAAG,IAAI,0BAA0B,CAAC;AACzC,IAAE,QAAI,MAAM,IAAI,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;AAC7D,MAAI,CAAC,WAAW;AACd,MAAE,KAAKA,IAAG,IAAI,qBAAqB,CAAC;AACpC,IAAE,QAAI,MAAM,cAAc,IAAI,IAAI,0BAA0B;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,MAAM,UAAU,UAAU,IAAI;AACpC,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,QAAQ,UAAU,IAAI,MAAM,KAAK,IAAI,WAAW,IAAI,OAAO;AAAA,EAC1E,SAAS,KAAU;AACjB,MAAE,KAAKA,IAAG,IAAI,2BAA2B,CAAC;AAC1C,IAAE,QAAI,MAAM,IAAI,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,iBAAiB;AAGxB,QAAM,UAAU,KAAK,WAAW,UAAU,WAAW;AACrD,QAAM,WAAW,UAAU,KAAK,QAAQ,SAAS,EAAE;AAGnD,UAAQ,IAAI;AACZ,UAAQ;AAAA,IACN,KAAKA,IAAG,KAAK,KAAK,IAAI,CAAC,IAAIA,IAAG,KAAK,IAAI,OAAO,EAAE,CAAC,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,SAAS,QAAQ,SAAS,CAAC,CAAC,CAAC,GAAGA,IAAG,IAAI,IAAI,SAAS,CAAC;AAAA,EACjJ;AACA,UAAQ,IAAI,KAAKA,IAAG,IAAI,KAAK,WAAW,CAAC,EAAE;AAC3C,UAAQ,IAAI;AAGZ,UAAQ,IAAI,KAAKA,IAAG,IAAI,OAAO,CAAC,cAAc,QAAQ,EAAE;AAExD,MAAI,KAAK,cAAc,QAAQ;AAC7B,YAAQ;AAAA,MACN,KAAKA,IAAG,IAAI,eAAe,CAAC,MAAM,KAAK,aAAa,KAAK,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,KAAK,sBAAsB,QAAQ;AACrC,YAAQ;AAAA,MACN,KAAKA,IAAG,IAAI,gBAAgB,CAAC,KAAK,KAAK,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,YAAQ;AAAA,MACN,KAAKA,IAAG,IAAI,aAAa,CAAC,QAAQ,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,KAAK,WAAW;AAClB,YAAQ,IAAI,KAAKA,IAAG,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS,EAAE;AAAA,EAChE;AAGA,QAAM,WAAW,UAAU;AAC3B,MAAI,UAAU,QAAQ;AACpB,YAAQ,IAAI,KAAKA,IAAG,IAAI,WAAW,CAAC,UAAU,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,EACrE;AAGA,MAAI,KAAK,WAAW,QAAQ;AAC1B,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAKA,IAAG,KAAK,YAAY,CAAC,EAAE;AACxC,eAAW,SAAS,KAAK,WAAW;AAClC,YAAM,MACJ,MAAM,SAAS,YACXA,IAAG,MAAM,MAAM,IAAI,IACnB,MAAM,SAAS,QACbA,IAAG,OAAO,MAAM,IAAI,IACpB,MAAM,SAAS,aACbA,IAAG,IAAI,MAAM,IAAI,IACjBA,IAAG,IAAI,MAAM,IAAI;AAC3B,cAAQ;AAAA,QACN,OAAOA,IAAG,KAAK,MAAM,OAAO,CAAC,KAAKA,IAAG,IAAI,MAAM,IAAI,CAAC,KAAK,GAAG,KAAK,MAAM,IAAI;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,IAAI;AACZ,QAAM,YAAY,KAAK,MAAM;AAC7B,UAAQ,IAAI,KAAKA,IAAG,KAAK,QAAQ,CAAC,IAAIA,IAAG,IAAI,IAAI,SAAS,GAAG,CAAC,EAAE;AAChE,QAAM,WAAW;AACjB,aAAW,QAAQ,KAAK,MAAM,MAAM,GAAG,QAAQ,GAAG;AAChD,YAAQ,IAAI,OAAOA,IAAG,IAAI,KAAK,IAAI,CAAC,EAAE;AAAA,EACxC;AACA,MAAI,YAAY,UAAU;AACxB,YAAQ,IAAI,OAAOA,IAAG,IAAI,WAAW,YAAY,QAAQ,OAAO,CAAC,EAAE;AAAA,EACrE;AAGA,QAAM,YAAY,OAAO,YAAY,KAAK,IAAI;AAC9C,MAAI,WAAW;AACb,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACN,KAAKA,IAAG,MAAM,WAAW,CAAC,IAAIA,IAAG,IAAI,IAAI,UAAU,OAAO,EAAE,CAAC;AAAA,IAC/D;AACA,QAAI,YAAY,UAAU,SAAS;AACjC,cAAQ;AAAA,QACN,KAAKA,IAAG,OAAO,mBAAmB,CAAC,IAAIA,IAAG,IAAI,IAAI,UAAU,OAAO,EAAE,CAAC,WAAMA,IAAG,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,MACpG;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI;AACd;AA5IA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAYC,SAAO;AACnB,OAAOC,UAAQ;AAiBf,eAAsB,mBACpB,WACA,KACA,OAA2B,CAAC,GAC5B;AACA,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAEzE,MAAI,CAAC,UAAU,WAAW,GAAG,GAAG;AAC9B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,MAAI,CAAC,IAAI,SAAS,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,MAAI,CAAC,IAAI,SAAS,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,MAAI,OAAO,WAAW,SAAS,KAAK,CAAC,KAAK,WAAW;AACnD,UAAM,IAAI,MAAM,aAAa,SAAS,sDAAsD;AAAA,EAC9F;AAEA,SAAO,WAAW,SAAS,IAAI;AAC/B,QAAM,YAAY,KAAK,MAAM;AAE7B,EAAE,QAAI,QAAQ,kBAAkBA,KAAG,KAAK,SAAS,CAAC,EAAE;AACpD,EAAE,QAAI,QAAQA,KAAG,IAAI,KAAK,GAAG,EAAE,CAAC;AAClC;AAEA,eAAsB,sBACpB,WACA,OAA8B,CAAC,GACY;AAC3C,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAEzE,MAAI,CAAC,OAAO,WAAW,SAAS,GAAG;AACjC,UAAM,IAAI,MAAM,aAAa,SAAS,sBAAsB;AAAA,EAC9D;AACA,MAAI,cAAc,WAAW,CAAC,KAAK,OAAO;AACxC,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACtF;AAEA,QAAM,qBAA+B,CAAC;AACtC,MAAI,OAAO,WAAW;AACpB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAC5D,UAAI,MAAM,aAAa,WAAW;AAChC,2BAAmB,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,WAAW,SAAS;AAClC,QAAM,YAAY,KAAK,MAAM;AAE7B,EAAE,QAAI,QAAQ,oBAAoBA,KAAG,KAAK,SAAS,CAAC,EAAE;AACtD,MAAI,mBAAmB,SAAS,GAAG;AACjC,IAAE,QAAI,KAAK,GAAG,mBAAmB,MAAM,mDAAmD;AAC1F,eAAW,QAAQ,oBAAoB;AACrC,MAAE,QAAI,QAAQ,KAAKA,KAAG,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,EAAE,mBAAmB;AAC9B;AAEA,eAAsB,oBACpB,OAA4B,CAAC,GACuB;AACpD,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAEzE,QAAM,UAAU,OAAO,QAAQ,OAAO,UAAU,EAAE,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,EAAE;AAEhG,MAAI,QAAQ,WAAW,GAAG;AACxB,IAAE,QAAI,QAAQA,KAAG,IAAI,6BAA6B,CAAC;AAAA,EACrD,OAAO;AACL,eAAW,EAAE,WAAW,IAAI,KAAK,SAAS;AACxC,MAAE,QAAI,QAAQ,KAAKA,KAAG,KAAK,UAAU,OAAO,EAAE,CAAC,CAAC,IAAIA,KAAG,IAAI,GAAG,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AACT;AAvGA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,SAAS,eAAe;;;ACAxB,SAAS,UAAU,WAAW,aAAa;AAC3C,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,OAAO,QAAQ;AAEf,IAAM,YAAY,KAAK,QAAQ,GAAG,OAAO;AACzC,IAAM,aAAa,KAAK,WAAW,mBAAmB;AACtD,IAAM,iBAAiB,KAAK,KAAK;AAOjC,eAAe,YAAwC;AACrD,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,YAAY,OAAO;AAC9C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,WAAW,OAAkC;AAC1D,MAAI;AACF,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,UAAU,YAAY,KAAK,UAAU,KAAK,CAAC;AAAA,EACnD,QAAQ;AAAA,EAER;AACF;AAEA,eAAe,qBAA6C;AAC1D,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AACzD,UAAM,MAAM,MAAM,MAAM,iDAAiD;AAAA,MACvE,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,iBAAa,OAAO;AACpB,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,QAAQ,QAAgB,SAA0B;AAChE,QAAM,CAAC,MAAM,MAAM,IAAI,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AACvD,QAAM,CAAC,MAAM,MAAM,IAAI,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AACxD,MAAI,SAAS,KAAM,QAAO,OAAO;AACjC,MAAI,SAAS,KAAM,QAAO,OAAO;AACjC,SAAO,OAAO;AAChB;AAMO,SAAS,iBAAiB,gBAAoC;AACnE,MAAI,UAAU;AAGd,QAAM,SAAS,YAAY;AACzB,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,SAAwB;AAE5B,QAAI,SAAS,KAAK,IAAI,IAAI,MAAM,YAAY,gBAAgB;AAC1D,eAAS,MAAM;AAAA,IACjB,OAAO;AACL,eAAS,MAAM,mBAAmB;AAClC,UAAI,QAAQ;AACV,cAAM,WAAW,EAAE,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,QAAQ,cAAc,GAAG;AAC7C,gBAAU;AAAA,QACR;AAAA,QACA,GAAG,OAAO,uBAAuB,GAAG,IAAI,cAAc,CAAC,WAAM,GAAG,MAAM,MAAM,CAAC,EAAE;AAAA,QAC/E,GAAG,IAAI,SAAS,GAAG,KAAK,wBAAwB,CAAC,OAAO,GAAG,KAAK,sBAAsB,CAAC,EAAE;AAAA,QACzF;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,GAAG;AAGH,QAAM,MAAM,MAAM;AAAA,EAAC,CAAC;AAEpB,SAAO,MAAM;AACX,QAAI,QAAS,SAAQ,OAAO,MAAM,OAAO;AAAA,EAC3C;AACF;;;ADzFA,IAAM,UAAU,OAAyC,UAAkB;AAE3E,IAAM,oBAAoB,iBAAiB,OAAO;AAElD,IAAM,UAAU,IAAI,QAAQ,EACzB,KAAK,MAAM,EACX,YAAY,oDAAoD,EAChE,QAAQ,OAAO;AAElB,QACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,YAAY;AAClB,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY;AACpB,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,uCAAuC,EACnD,SAAS,mBAAmB,4BAA4B,EACxD,OAAO,mBAAmB,4CAA4C,EACtE,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,OAAO,YAAsB,SAAS;AAC5C,QAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,QAAMA,YAAW,YAAY,IAAI;AACnC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,yCAAyC,EACrD,OAAO,mBAAmB,gCAAgC,EAC1D,OAAO,qBAAqB,uDAAuD,EACnF,OAAO,8BAA8B,yCAAyC,EAC9E,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY,IAAI;AACxB,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,qDAAqD,EACjE,SAAS,eAAe,gBAAgB,EACxC,OAAO,OAAO,cAAsB;AACnC,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY,SAAS;AAC7B,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,+BAA+B,EAC3C,SAAS,eAAe,0BAA0B,EAClD,OAAO,OAAO,cAAsB;AACnC,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,QAAMA,eAAc,SAAS;AAC/B,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,wDAAwD,EACpE,SAAS,mBAAmB,2BAA2B,EACvD,OAAO,OAAO,eAAyB;AACtC,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,QAAMA,eAAc,UAAU;AAChC,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,8DAA8D,EAC1E,SAAS,cAAc,+CAA+C,EACtE,OAAO,sBAAsB,oBAAoB,QAAQ,EACzD,OAAO,OAAO,OAAiB,SAAS;AACvC,QAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,QAAMA,cAAa,OAAO,IAAI;AAChC,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,+BAA+B,EAC3C,SAAS,UAAU,8CAA8C,EACjE,SAAS,UAAU,gBAAgB,EACnC,OAAO,OAAO,MAAc,SAAiB;AAC5C,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,QAAMA,eAAc,MAAM,IAAI;AAChC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,SAAS,eAAe,uDAAuD,EAC/E,OAAO,OAAO,cAAsB;AACnC,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY,SAAS;AAC7B,CAAC;AAEH,IAAM,WAAW,QACd,QAAQ,UAAU,EAClB,YAAY,6BAA6B;AAE5C,SACG,QAAQ,KAAK,EACb,YAAY,0BAA0B,EACtC,SAAS,eAAe,mCAAmC,EAC3D,SAAS,SAAS,kDAAkD,EACpE,OAAO,mBAAmB,uCAAuC,EACjE,OAAO,OAAO,WAAmB,KAAa,SAAS;AACtD,QAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,QAAMA,oBAAmB,WAAW,KAAK,IAAI;AAC/C,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,SAAS,eAAe,6CAA6C,EACrE,OAAO,eAAe,2CAA2C,EACjE,OAAO,OAAO,WAAmB,SAAS;AACzC,QAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM;AACxC,QAAMA,uBAAsB,WAAW,IAAI;AAC7C,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,YAAY;AAClB,QAAM,EAAE,qBAAAC,qBAAoB,IAAI,MAAM;AACtC,QAAMA,qBAAoB;AAC5B,CAAC;AAEH,MAAM,QAAQ,WAAW;AACzB,kBAAkB;","names":["readFile","writeFile","join","pc","join","resolve","readFile","writeFile","mkdir","access","p","pc","readFile","writeFile","access","join","join","readFile","writeFile","join","text","z","componentType","p","pc","join","fw","p","pc","p","join","p","pc","join","p","writeFile","mkdir","access","join","p","readFile","readdir","join","relative","p","pc","resolve","relative","p","pc","join","mkdir","writeFile","stat","p","pc","p","pc","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","buildCommand","createCommand","infoCommand","registryAddCommand","registryRemoveCommand","registryListCommand"]}
1
+ {"version":3,"sources":["../src/utils/config.ts","../src/commands/init.ts","../src/utils/detect.ts","../src/registry/fetcher.ts","../src/registry/resolver.ts","../src/installers/file-writer.ts","../src/installers/dep-installer.ts","../src/installers/env-writer.ts","../src/installers/import-rewriter.ts","../src/installers/tsconfig-patcher.ts","../src/installers/barrel-manager.ts","../src/utils/hash.ts","../src/utils/parse-ref.ts","../src/registry/schema.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/registry/build-output.ts","../src/registry/builder.ts","../src/commands/build.ts","../src/commands/create.ts","../src/commands/info.ts","../src/commands/registry.ts","../src/index.ts","../src/utils/update-check.ts"],"sourcesContent":["import { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nconst componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\"]);\ntype ComponentType = z.infer<typeof componentType>;\n\nconst installedComponentSchema = z.object({\n registry: z.string().optional(),\n version: z.string(),\n installedAt: z.string(),\n files: z.array(z.string()),\n hash: z.string(),\n});\n\nexport const configSchema = z.object({\n $schema: z.string().optional(),\n runtime: z.enum([\"bun\", \"node\", \"deno\"]),\n framework: z.enum([\"hono\", \"cloudflare\", \"elysia\", \"fastify\", \"express\"]).optional(),\n aliases: z.object({\n base: z.string().optional(),\n agents: z.string(),\n tools: z.string(),\n skills: z.string(),\n storage: z.string(),\n }),\n registries: z.record(z.string(), z.string()),\n installed: z.record(z.string(), installedComponentSchema).optional(),\n});\n\nexport type KitnConfig = z.infer<typeof configSchema>;\n\nconst CONFIG_FILE = \"kitn.json\";\n\nexport async function readConfig(projectDir: string): Promise<KitnConfig | null> {\n try {\n const raw = await readFile(join(projectDir, CONFIG_FILE), \"utf-8\");\n return configSchema.parse(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nexport async function writeConfig(projectDir: string, config: KitnConfig): Promise<void> {\n const data = { $schema: \"https://kitn.dev/schema/config.json\", ...config };\n await writeFile(join(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + \"\\n\");\n}\n\ntype RequiredAliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\";\n\nconst typeToAliasKey: Record<Exclude<ComponentType, \"kitn:package\">, RequiredAliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n};\n\ntype SingleFileComponentType = Exclude<ComponentType, \"kitn:package\">;\n\nexport function getInstallPath(\n config: KitnConfig,\n type: SingleFileComponentType,\n fileName: string\n): string {\n const aliasKey = typeToAliasKey[type];\n return join(config.aliases[aliasKey], fileName);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\n\nexport async function initCommand() {\n p.intro(pc.bgCyan(pc.black(\" kitn \")));\n\n const cwd = process.cwd();\n\n const existing = await readConfig(cwd);\n if (existing) {\n p.log.warn(\"kitn.json already exists in this directory.\");\n const shouldContinue = await p.confirm({\n message: \"Overwrite existing configuration?\",\n initialValue: false,\n });\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n }\n\n const runtime = await p.select({\n message: \"Which runtime do you use?\",\n options: [\n { value: \"bun\", label: \"Bun\", hint: \"recommended\" },\n { value: \"node\", label: \"Node.js\" },\n { value: \"deno\", label: \"Deno\" },\n ],\n });\n if (p.isCancel(runtime)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const framework = await p.select({\n message: \"Which framework are you using?\",\n options: [\n { value: \"hono\", label: \"Hono\", hint: \"recommended\" },\n { value: \"cloudflare\", label: \"Cloudflare Workers\", hint: \"coming soon\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"coming soon\" },\n { value: \"fastify\", label: \"Fastify\", hint: \"coming soon\" },\n { value: \"express\", label: \"Express\", hint: \"coming soon\" },\n ],\n });\n if (p.isCancel(framework)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const base = await p.text({\n message: \"Where should kitn packages be installed?\",\n initialValue: \"src/ai\",\n placeholder: \"src/ai\",\n });\n if (p.isCancel(base)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const baseDir = base as string;\n const config = {\n runtime: runtime as \"bun\" | \"node\" | \"deno\",\n framework: framework as \"hono\" | \"cloudflare\" | \"elysia\" | \"fastify\" | \"express\",\n aliases: {\n base: baseDir,\n agents: `${baseDir}/agents`,\n tools: `${baseDir}/tools`,\n skills: `${baseDir}/skills`,\n storage: `${baseDir}/storage`,\n },\n registries: {\n \"@kitn\": \"https://kitn-ai.github.io/registry/r/{type}/{name}.json\",\n },\n };\n\n const s = p.spinner();\n s.start(\"Writing kitn.json\");\n await writeConfig(cwd, config);\n s.stop(\"Created kitn.json\");\n\n p.outro(pc.green(\"Done! Run `kitn add core` to install the engine, then `kitn add routes` for HTTP routes.\"));\n}\n","import { access } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport type PackageManager = \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\nconst LOCKFILE_MAP: [string, PackageManager][] = [\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\nexport async function detectPackageManager(dir: string): Promise<PackageManager | null> {\n for (const [lockfile, pm] of LOCKFILE_MAP) {\n try {\n await access(join(dir, lockfile));\n return pm;\n } catch {\n // lockfile doesn't exist, try next\n }\n }\n return null;\n}\n\nexport function getInstallCommand(pm: PackageManager, packages: string[]): string {\n const pkgs = packages.join(\" \");\n switch (pm) {\n case \"bun\":\n return `bun add ${pkgs}`;\n case \"pnpm\":\n return `pnpm add ${pkgs}`;\n case \"yarn\":\n return `yarn add ${pkgs}`;\n case \"npm\":\n return `npm install ${pkgs}`;\n }\n}\n\nexport function getRunCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return \"bunx\";\n case \"pnpm\":\n return \"pnpm dlx\";\n case \"yarn\":\n return \"yarn dlx\";\n case \"npm\":\n return \"npx\";\n }\n}\n","import type { RegistryItem, RegistryIndex } from \"./schema.js\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\";\ntype FetchFn = (url: string) => Promise<RegistryItem>;\n\nexport class RegistryFetcher {\n private registries: Record<string, string>;\n private cache = new Map<string, Promise<RegistryItem>>();\n private fetchFn: FetchFn;\n\n constructor(registries: Record<string, string>, fetchFn?: FetchFn) {\n this.registries = registries;\n this.fetchFn = fetchFn ?? this.defaultFetch;\n }\n\n resolveUrl(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): string {\n const template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\n const fileName = version ? `${name}@${version}` : name;\n return template.replace(\"{name}\", fileName).replace(\"{type}\", typeDir);\n }\n\n async fetchItem(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): Promise<RegistryItem> {\n const url = this.resolveUrl(name, typeDir, namespace, version);\n if (!this.cache.has(url)) {\n this.cache.set(url, this.fetchFn(url));\n }\n return this.cache.get(url)!;\n }\n\n async fetchIndex(namespace = \"@kitn\"): Promise<RegistryIndex> {\n const template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\n const baseUrl = template.replace(\"{type}/{name}.json\", \"registry.json\");\n const res = await fetch(baseUrl);\n if (!res.ok) throw new Error(`Failed to fetch registry index: ${res.statusText}`);\n return res.json();\n }\n\n private async defaultFetch(url: string): Promise<RegistryItem> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch ${url}: ${res.statusText}`);\n return res.json();\n }\n}\n","import type { RegistryItem } from \"./schema.js\";\n\ntype FetchItemFn = (name: string) => Promise<RegistryItem>;\n\nexport async function resolveDependencies(\n names: string[],\n fetchItem: FetchItemFn\n): Promise<RegistryItem[]> {\n const visited = new Set<string>();\n const items = new Map<string, RegistryItem>();\n const edges: [string, string][] = [];\n\n async function resolve(name: string): Promise<void> {\n if (visited.has(name)) return;\n visited.add(name);\n\n const item = await fetchItem(name);\n items.set(name, item);\n\n const deps = item.registryDependencies ?? [];\n for (const dep of deps) {\n edges.push([dep, name]);\n await resolve(dep);\n }\n }\n\n for (const name of names) {\n await resolve(name);\n }\n\n return topologicalSort(items, edges);\n}\n\nfunction topologicalSort(\n items: Map<string, RegistryItem>,\n edges: [string, string][]\n): RegistryItem[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const name of items.keys()) {\n inDegree.set(name, 0);\n adjacency.set(name, []);\n }\n\n for (const [from, to] of edges) {\n adjacency.get(from)?.push(to);\n inDegree.set(to, (inDegree.get(to) ?? 0) + 1);\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: RegistryItem[] = [];\n while (queue.length > 0) {\n const name = queue.shift()!;\n sorted.push(items.get(name)!);\n\n for (const neighbor of adjacency.get(name) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length !== items.size) {\n const missing = [...items.keys()].filter((n) => !sorted.some((s) => s.name === n));\n throw new Error(`Circular dependency detected involving: ${missing.join(\", \")}`);\n }\n\n return sorted;\n}\n","import { readFile, writeFile, mkdir, access } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { createPatch } from \"diff\";\n\nexport enum FileStatus {\n New = \"new\",\n Identical = \"identical\",\n Different = \"different\",\n}\n\nexport async function checkFileStatus(filePath: string, newContent: string): Promise<FileStatus> {\n try {\n await access(filePath);\n } catch {\n return FileStatus.New;\n }\n const existing = await readFile(filePath, \"utf-8\");\n return existing === newContent ? FileStatus.Identical : FileStatus.Different;\n}\n\nexport function generateDiff(filePath: string, oldContent: string, newContent: string): string {\n return createPatch(filePath, oldContent, newContent, \"local\", \"registry\");\n}\n\nexport async function readExistingFile(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nexport async function writeComponentFile(filePath: string, content: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n}\n","import { execSync } from \"child_process\";\nimport type { PackageManager } from \"../utils/detect.js\";\n\nexport function installDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add ${pkgs}`;\n case \"pnpm\": return `pnpm add ${pkgs}`;\n case \"yarn\": return `yarn add ${pkgs}`;\n case \"npm\": return `npm install ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n\nexport function installDevDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add -d ${pkgs}`;\n case \"pnpm\": return `pnpm add -D ${pkgs}`;\n case \"yarn\": return `yarn add -D ${pkgs}`;\n case \"npm\": return `npm install -D ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport type { EnvVarConfig } from \"../registry/schema.js\";\n\n/**\n * Parse a .env file into a Set of defined variable names.\n * Only cares about keys, not values.\n */\nfunction parseEnvKeys(content: string): Set<string> {\n const keys = new Set<string>();\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n keys.add(trimmed.slice(0, eqIndex).trim());\n }\n }\n return keys;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readEnvFile(path: string): Promise<string> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Collect all envVars from resolved items, deduplicating by key name.\n * Later items override earlier ones if same key.\n */\nexport function collectEnvVars(\n items: Array<{ envVars?: Record<string, EnvVarConfig> }>\n): Record<string, EnvVarConfig> {\n const merged: Record<string, EnvVarConfig> = {};\n for (const item of items) {\n if (item.envVars) {\n Object.assign(merged, item.envVars);\n }\n }\n return merged;\n}\n\n/**\n * Handle env var setup after component installation:\n * 1. Write missing vars to .env.example (always)\n * 2. Prompt user for missing vars and write to .env (interactive)\n */\nexport async function handleEnvVars(\n cwd: string,\n envVars: Record<string, EnvVarConfig>\n): Promise<void> {\n const keys = Object.keys(envVars);\n if (keys.length === 0) return;\n\n // Read existing .env and .env.example\n const envPath = join(cwd, \".env\");\n const examplePath = join(cwd, \".env.example\");\n\n const envContent = await readEnvFile(envPath);\n const exampleContent = await readEnvFile(examplePath);\n\n const envKeys = parseEnvKeys(envContent);\n const exampleKeys = parseEnvKeys(exampleContent);\n\n // Find vars missing from each file\n const missingFromExample = keys.filter((k) => !exampleKeys.has(k));\n const missingFromEnv = keys.filter((k) => !envKeys.has(k) && !process.env[k]);\n\n // 1. Always append missing vars to .env.example\n if (missingFromExample.length > 0) {\n const lines: string[] = [];\n if (exampleContent && !exampleContent.endsWith(\"\\n\")) lines.push(\"\");\n for (const key of missingFromExample) {\n const config = envVars[key];\n lines.push(`# ${config.description}${config.url ? ` (${config.url})` : \"\"}`);\n lines.push(`${key}=`);\n }\n await writeFile(examplePath, exampleContent + lines.join(\"\\n\") + \"\\n\");\n p.log.info(`Updated ${pc.cyan(\".env.example\")} with ${missingFromExample.length} variable(s)`);\n }\n\n // 2. Prompt for missing env vars\n if (missingFromEnv.length === 0) return;\n\n p.log.message(\"\");\n p.log.warn(\n `${missingFromEnv.length} environment variable(s) needed:`\n );\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const req = config.required !== false ? pc.red(\"*\") : \"\";\n p.log.message(` ${pc.yellow(key)}${req}: ${config.description}${config.url ? pc.dim(` -> ${config.url}`) : \"\"}`);\n }\n\n const shouldPrompt = await p.confirm({\n message: \"Would you like to enter values now?\",\n initialValue: true,\n });\n\n if (p.isCancel(shouldPrompt) || !shouldPrompt) {\n p.log.info(`Add them to ${pc.cyan(\".env\")} when ready.`);\n return;\n }\n\n const newEntries: string[] = [];\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const isSecret = config.secret !== false; // default true\n\n let value: string | symbol;\n if (isSecret) {\n value = await p.password({\n message: `${key}:`,\n });\n } else {\n value = await p.text({\n message: `${key}:`,\n placeholder: config.description,\n });\n }\n\n if (p.isCancel(value)) {\n p.log.info(`Skipped remaining variables. Add them to ${pc.cyan(\".env\")} when ready.`);\n break;\n }\n\n if (value) {\n newEntries.push(`${key}=${value}`);\n }\n }\n\n if (newEntries.length > 0) {\n const existingEnv = await readEnvFile(envPath);\n const lines: string[] = [];\n if (existingEnv && !existingEnv.endsWith(\"\\n\")) lines.push(\"\");\n lines.push(...newEntries);\n await writeFile(envPath, existingEnv + lines.join(\"\\n\") + \"\\n\");\n p.log.success(`Wrote ${newEntries.length} variable(s) to ${pc.cyan(\".env\")}`);\n }\n}\n","import { relative, dirname, join, posix } from \"path\";\n\ntype AliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\";\n\nconst KNOWN_TYPES: readonly AliasKey[] = [\"agents\", \"tools\", \"skills\", \"storage\"];\n\nconst TYPE_TO_ALIAS_KEY: Record<string, AliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n};\n\n/**\n * Rewrites `@kitn/<type>/<path>` imports to relative paths based on install layout.\n *\n * Only rewrites known types (agents, tools, skills, storage).\n * Other `@kitn/` imports (e.g. `@kitn/server`) pass through untouched.\n */\nexport function rewriteKitnImports(\n content: string,\n fileType: string,\n fileName: string,\n aliases: Record<AliasKey, string>,\n): string {\n const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];\n if (!sourceAliasKey) return content;\n\n const sourceDir = aliases[sourceAliasKey];\n\n // Match import/export ... from \"@kitn/<type>/<path>\"\n return content.replace(\n /((?:import|export)\\s+.*?\\s+from\\s+[\"'])@kitn\\/([\\w-]+)\\/([^\"']+)([\"'])/g,\n (_match, prefix: string, type: string, targetPath: string, quote: string) => {\n if (!KNOWN_TYPES.includes(type as AliasKey)) {\n return `${prefix}@kitn/${type}/${targetPath}${quote}`;\n }\n\n const targetDir = aliases[type as AliasKey];\n const targetFile = join(targetDir, targetPath);\n let rel = relative(sourceDir, targetFile);\n\n // Normalize to posix separators\n rel = rel.split(\"\\\\\").join(\"/\");\n\n // Ensure relative path starts with ./ or ../\n if (!rel.startsWith(\".\")) {\n rel = `./${rel}`;\n }\n\n return `${prefix}${rel}${quote}`;\n },\n );\n}\n","import { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\n\n/**\n * Strip single-line (//) and multi-line comments from JSONC,\n * and remove trailing commas before } or ], so JSON.parse succeeds.\n */\nfunction stripJsonc(text: string): string {\n return text\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/,\\s*([}\\]])/g, \"$1\");\n}\n\n/**\n * Patches a tsconfig JSON string with additional paths entries.\n * Returns the updated JSON string.\n */\nexport function patchTsconfig(\n tsconfigContent: string,\n paths: Record<string, string[]>,\n): string {\n const config = JSON.parse(stripJsonc(tsconfigContent));\n\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n if (!config.compilerOptions.paths) {\n config.compilerOptions.paths = {};\n }\n\n for (const [key, value] of Object.entries(paths)) {\n config.compilerOptions.paths[key] = value;\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/**\n * Reads tsconfig.json from projectDir, patches paths, and writes it back.\n * If no tsconfig.json exists, creates one with just the paths.\n */\nexport async function patchProjectTsconfig(\n projectDir: string,\n paths: Record<string, string[]>,\n): Promise<void> {\n const tsconfigPath = join(projectDir, \"tsconfig.json\");\n let content: string;\n try {\n content = await readFile(tsconfigPath, \"utf-8\");\n } catch {\n content = \"{}\";\n }\n\n const patched = patchTsconfig(content, paths);\n await writeFile(tsconfigPath, patched);\n}\n","const EXPORT_LINE = 'export { registerWithPlugin } from \"@kitnai/core\";';\nconst BARREL_COMMENT = \"// Managed by kitn CLI — components auto-imported below\";\n\nexport function createBarrelFile(): string {\n return `${BARREL_COMMENT}\\n${EXPORT_LINE}\\n`;\n}\n\nexport function addImportToBarrel(content: string, importPath: string): string {\n const importLine = `import \"${importPath}\";`;\n\n // Idempotent — skip if already present\n if (content.includes(importLine)) return content;\n\n // Insert before the export line\n const exportIndex = content.indexOf(EXPORT_LINE);\n if (exportIndex === -1) {\n // No export line found — append both\n return `${content.trimEnd()}\\n${importLine}\\n${EXPORT_LINE}\\n`;\n }\n\n const before = content.slice(0, exportIndex);\n const after = content.slice(exportIndex);\n return `${before}${importLine}\\n${after}`;\n}\n\nexport function removeImportFromBarrel(\n content: string,\n importPath: string,\n): string {\n const importLine = `import \"${importPath}\";`;\n return content\n .split(\"\\n\")\n .filter((line) => line.trim() !== importLine)\n .join(\"\\n\");\n}\n\nexport function parseBarrelFile(content: string): string[] {\n const imports: string[] = [];\n for (const line of content.split(\"\\n\")) {\n const match = line.match(/^import\\s+[\"'](.+)[\"'];?\\s*$/);\n if (match) imports.push(match[1]);\n }\n return imports;\n}\n","import { createHash } from \"crypto\";\n\nexport function contentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 8);\n}\n","export interface ComponentRef {\n namespace: string;\n name: string;\n version: string | undefined;\n}\n\nexport function parseComponentRef(input: string): ComponentRef {\n let namespace = \"@kitn\";\n let rest = input;\n\n // Parse @namespace/name\n if (rest.startsWith(\"@\")) {\n const slashIdx = rest.indexOf(\"/\");\n if (slashIdx === -1) {\n throw new Error(`Invalid component reference: ${input}. Expected @namespace/name`);\n }\n namespace = rest.slice(0, slashIdx);\n rest = rest.slice(slashIdx + 1);\n }\n\n // Parse name@version\n const atIdx = rest.indexOf(\"@\");\n if (atIdx === -1) {\n return { namespace, name: rest, version: undefined };\n }\n\n return {\n namespace,\n name: rest.slice(0, atIdx),\n version: rest.slice(atIdx + 1),\n };\n}\n","import { z } from \"zod\";\n\nexport const componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\"]);\nexport type ComponentType = z.infer<typeof componentType>;\n\nexport const registryFileSchema = z.object({\n path: z.string(),\n content: z.string(),\n type: componentType,\n});\n\nexport const changelogEntrySchema = z.object({\n version: z.string(),\n date: z.string(),\n type: z.enum([\"feature\", \"fix\", \"breaking\", \"initial\"]),\n note: z.string(),\n});\nexport type ChangelogEntry = z.infer<typeof changelogEntrySchema>;\n\nexport const envVarConfigSchema = z.object({\n description: z.string(),\n required: z.boolean().optional(),\n secret: z.boolean().optional(),\n url: z.string().optional(),\n});\nexport type EnvVarConfig = z.infer<typeof envVarConfigSchema>;\n\n/** Schema for the author-facing registry.json file */\nexport const componentConfigSchema = z.object({\n $schema: z.string().optional(),\n type: componentType,\n name: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n files: z.array(z.string()).optional(),\n sourceDir: z.string().optional(),\n exclude: z.array(z.string()).optional(),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n categories: z.array(z.string()).optional(),\n docs: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type ComponentConfig = z.infer<typeof componentConfigSchema>;\n\nexport const registryItemSchema = z.object({\n $schema: z.string().optional(),\n name: z.string(),\n type: componentType,\n description: z.string(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n files: z.array(registryFileSchema),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n docs: z.string().optional(),\n categories: z.array(z.string()).optional(),\n version: z.string().optional(),\n updatedAt: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type RegistryItem = z.infer<typeof registryItemSchema>;\n\nexport const registryIndexItemSchema = z.object({\n name: z.string(),\n type: componentType,\n description: z.string(),\n registryDependencies: z.array(z.string()).optional(),\n categories: z.array(z.string()).optional(),\n version: z.string().optional(),\n versions: z.array(z.string()).optional(),\n updatedAt: z.string().optional(),\n});\n\nexport const registryIndexSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n items: z.array(registryIndexItemSchema),\n});\nexport type RegistryIndex = z.infer<typeof registryIndexSchema>;\n\nexport const typeToDir: Record<ComponentType, string> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:package\": \"package\",\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig, getInstallPath } from \"../utils/config.js\";\nimport { detectPackageManager } from \"../utils/detect.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { resolveDependencies } from \"../registry/resolver.js\";\nimport {\n checkFileStatus,\n writeComponentFile,\n readExistingFile,\n generateDiff,\n FileStatus,\n} from \"../installers/file-writer.js\";\nimport { installDependencies } from \"../installers/dep-installer.js\";\nimport { collectEnvVars, handleEnvVars } from \"../installers/env-writer.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.js\";\nimport { createBarrelFile, addImportToBarrel } from \"../installers/barrel-manager.js\";\nimport { contentHash } from \"../utils/hash.js\";\nimport { parseComponentRef, type ComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir, type RegistryItem, type ComponentType } from \"../registry/schema.js\";\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { relative } from \"path\";\n\ninterface AddOptions {\n overwrite?: boolean;\n type?: string;\n}\n\nexport async function addCommand(components: string[], opts: AddOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn add \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n if (components.length === 0) {\n p.log.error(\"Please specify at least one component to add.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" to framework-specific package name, then parse refs\n const resolvedComponents = components.map((c) => {\n if (c === \"routes\") {\n const fw = config.framework ?? \"hono\";\n return fw;\n }\n return c;\n });\n\n const refs = resolvedComponents.map(parseComponentRef);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Resolving dependencies...\");\n\n let resolved: RegistryItem[];\n try {\n resolved = await resolveDependencies(resolvedComponents, async (name) => {\n const ref = refs.find((r) => r.name === name) ?? { namespace: \"@kitn\", name, version: undefined };\n const index = await fetcher.fetchIndex(ref.namespace);\n const indexItem = index.items.find((i) => i.name === name);\n if (!indexItem) throw new Error(`Component '${name}' not found in ${ref.namespace} registry`);\n const dir = typeToDir[indexItem.type];\n return fetcher.fetchItem(name, dir as any, ref.namespace, ref.version);\n });\n } catch (err: any) {\n s.stop(pc.red(\"Failed to resolve dependencies\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(`Resolved ${resolved.length} component(s)`);\n\n p.log.info(\"Components to install:\");\n for (const item of resolved) {\n const isExplicit = resolvedComponents.includes(item.name) || components.includes(item.name);\n const label = isExplicit ? item.name : `${item.name} ${pc.dim(\"(dependency)\")}`;\n p.log.message(` ${pc.cyan(label)}`);\n }\n\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n const allDeps: string[] = [];\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\n\n if (item.type === \"kitn:package\") {\n // Package install — multi-file, preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n\n for (const file of item.files) {\n const targetPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n\n const status = await checkFileStatus(targetPath, file.content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, file.content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", file.content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Patch tsconfig.json with package paths\n if (item.tsconfig) {\n const resolvedPaths: Record<string, string[]> = {};\n const installDir = item.installDir ?? item.name;\n for (const [key, values] of Object.entries(item.tsconfig)) {\n resolvedPaths[key] = values.map((v) => `./${join(baseDir, installDir, v)}`);\n }\n await patchProjectTsconfig(cwd, resolvedPaths);\n p.log.info(`Patched tsconfig.json with paths: ${Object.keys(resolvedPaths).join(\", \")}`);\n }\n\n // Track in installed\n const installed = config.installed ?? {};\n const allContent = item.files.map((f) => f.content).join(\"\\n\");\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const installedKey = ref.namespace === \"@kitn\" ? item.name : `${ref.namespace}/${item.name}`;\n installed[installedKey] = {\n registry: ref.namespace,\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => join(baseDir, f.path)),\n hash: contentHash(allContent),\n };\n config.installed = installed;\n\n } else {\n // Regular component install — single file, import rewriting\n for (const file of item.files) {\n const aliasKey = (() => {\n switch (item.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n\n const fileName = file.path.split(\"/\").pop()!;\n const targetPath = join(cwd, config.aliases[aliasKey], fileName);\n const relativePath = join(config.aliases[aliasKey], fileName);\n const content = rewriteKitnImports(file.content, item.type, fileName, config.aliases);\n\n const status = await checkFileStatus(targetPath, content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Track in installed\n const installed = config.installed ?? {};\n const allContent = item.files.map((f) => {\n const fn = f.path.split(\"/\").pop()!;\n return rewriteKitnImports(f.content, item.type, fn, config.aliases);\n }).join(\"\\n\");\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const installedKey = ref.namespace === \"@kitn\" ? item.name : `${ref.namespace}/${item.name}`;\n installed[installedKey] = {\n registry: ref.namespace,\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => {\n const aliasKey = (() => {\n switch (item.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n const fileName = f.path.split(\"/\").pop()!;\n return join(config.aliases[aliasKey], fileName);\n }),\n hash: contentHash(allContent),\n };\n config.installed = installed;\n }\n }\n\n // Barrel management — auto-wire imports for barrel-eligible components\n const BARREL_ELIGIBLE: Set<string> = new Set([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\"]);\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelDir = join(cwd, baseDir);\n\n const barrelImports: string[] = [];\n for (const item of resolved) {\n if (!BARREL_ELIGIBLE.has(item.type)) continue;\n\n for (const file of item.files) {\n const aliasKey = (() => {\n switch (item.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n }\n })() as \"agents\" | \"tools\" | \"skills\";\n\n const fileName = file.path.split(\"/\").pop()!;\n const filePath = join(cwd, config.aliases[aliasKey], fileName);\n const importPath = \"./\" + relative(barrelDir, filePath).replace(/\\\\/g, \"/\");\n barrelImports.push(importPath);\n }\n }\n\n if (barrelImports.length > 0) {\n const barrelExisted = existsSync(barrelPath);\n let barrelContent: string;\n\n if (barrelExisted) {\n barrelContent = await readFile(barrelPath, \"utf-8\");\n } else {\n await mkdir(barrelDir, { recursive: true });\n barrelContent = createBarrelFile();\n }\n\n for (const importPath of barrelImports) {\n barrelContent = addImportToBarrel(barrelContent, importPath);\n }\n\n await writeFile(barrelPath, barrelContent);\n p.log.info(`Updated barrel file: ${join(baseDir, \"index.ts\")}`);\n\n if (!barrelExisted) {\n p.note(\n [\n `import { createAIPlugin } from \"@kitnai/hono\";`,\n `import { registerWithPlugin } from \"./ai\";`,\n ``,\n `const plugin = createAIPlugin({`,\n ` model: (model) => yourProvider(model ?? \"default-model\"),`,\n `});`,\n ``,\n `registerWithPlugin(plugin);`,\n `app.route(\"/api\", plugin.app);`,\n ].join(\"\\n\"),\n \"Add this to your app setup\",\n );\n }\n }\n\n await writeConfig(cwd, config);\n\n const uniqueDeps = [...new Set(allDeps)];\n if (uniqueDeps.length > 0) {\n const pm = await detectPackageManager(cwd);\n if (pm) {\n s.start(`Installing ${uniqueDeps.length} npm dependenc${uniqueDeps.length === 1 ? \"y\" : \"ies\"}...`);\n try {\n installDependencies(pm, uniqueDeps, cwd);\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Some dependencies failed to install\"));\n }\n }\n }\n\n if (created.length > 0) {\n p.log.success(`Created ${created.length} file(s):`);\n for (const f of created) p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n if (updated.length > 0) {\n p.log.success(`Updated ${updated.length} file(s):`);\n for (const f of updated) p.log.message(` ${pc.yellow(\"~\")} ${f}`);\n }\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s):`);\n for (const f of skipped) p.log.message(` ${pc.dim(\"-\")} ${f}`);\n }\n\n // Handle environment variables\n const allEnvVars = collectEnvVars(resolved);\n await handleEnvVars(cwd, allEnvVars);\n\n for (const item of resolved) {\n if (item.docs) {\n p.log.info(`${pc.bold(item.name)}: ${item.docs}`);\n }\n }\n\n // Show next-step hints for well-known packages\n const installedNames = new Set(resolved.map((r) => r.name));\n const hints: string[] = [];\n\n if (installedNames.has(\"core\") && !installedNames.has(config.framework ?? \"hono\")) {\n hints.push(`Run ${pc.cyan(`kitn add routes`)} to install the HTTP adapter.`);\n }\n\n const fw = config.framework ?? \"hono\";\n if (installedNames.has(fw) || (installedNames.has(\"core\") && installedNames.has(fw))) {\n hints.push(`Add this to your server entry point:`);\n if (fw === \"hono\") {\n hints.push(\"\");\n hints.push(pc.dim(` import { Hono } from \"hono\";`));\n hints.push(pc.dim(` import { createAIPlugin } from \"@kitnai/hono\";`));\n hints.push(pc.dim(` import { yourProvider } from \"your-ai-provider\";`));\n hints.push(pc.dim(``));\n hints.push(pc.dim(` const plugin = createAIPlugin({`));\n hints.push(pc.dim(` model: (model) => yourProvider(model ?? \"default-model\"),`));\n hints.push(pc.dim(` });`));\n hints.push(pc.dim(``));\n hints.push(pc.dim(` const app = new Hono();`));\n hints.push(pc.dim(` app.route(\"/api\", plugin.app);`));\n hints.push(pc.dim(` await plugin.initialize();`));\n hints.push(\"\");\n }\n }\n\n if (hints.length > 0) {\n p.log.message(pc.bold(\"\\nNext steps:\"));\n for (const hint of hints) p.log.message(hint);\n }\n\n p.outro(pc.green(\"Done!\"));\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport type { RegistryIndex } from \"../registry/schema.js\";\n\ninterface ListOptions {\n installed?: boolean;\n type?: string;\n registry?: string;\n}\n\ntype IndexItemWithNamespace = RegistryIndex[\"items\"][number] & { namespace: string };\n\nexport async function listCommand(opts: ListOptions) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const fetcher = new RegistryFetcher(config.registries);\n\n const namespacesToFetch = opts.registry\n ? [opts.registry]\n : Object.keys(config.registries);\n\n if (opts.registry && !config.registries[opts.registry]) {\n p.log.error(`Registry ${pc.bold(opts.registry)} is not configured. Run ${pc.bold(\"kitn registry list\")} to see configured registries.`);\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Fetching registry index...\");\n\n const allItems: IndexItemWithNamespace[] = [];\n const errors: string[] = [];\n\n for (const namespace of namespacesToFetch) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allItems.push({ ...item, namespace });\n }\n } catch (err: any) {\n errors.push(`${namespace}: ${err.message}`);\n }\n }\n\n if (allItems.length === 0 && errors.length > 0) {\n s.stop(pc.red(\"Failed to fetch registries\"));\n for (const e of errors) p.log.error(e);\n process.exit(1);\n }\n\n s.stop(`Found ${allItems.length} components across ${namespacesToFetch.length - errors.length} ${namespacesToFetch.length - errors.length === 1 ? \"registry\" : \"registries\"}`);\n\n for (const e of errors) {\n p.log.warn(`${pc.yellow(\"⚠\")} Failed to fetch ${e}`);\n }\n\n const installed = config.installed ?? {};\n const typeGroups = new Map<string, IndexItemWithNamespace[]>();\n\n for (const item of allItems) {\n if (opts.type && !item.type.endsWith(opts.type)) continue;\n\n const group = item.type.replace(\"kitn:\", \"\");\n if (!typeGroups.has(group)) typeGroups.set(group, []);\n typeGroups.get(group)!.push(item);\n }\n\n let installedCount = 0;\n let updateCount = 0;\n\n for (const [group, items] of typeGroups) {\n p.log.message(pc.bold(`\\n${group.charAt(0).toUpperCase() + group.slice(1)}s:`));\n\n for (const item of items) {\n const displayName = item.namespace === \"@kitn\" ? item.name : `${item.namespace}/${item.name}`;\n const inst = installed[item.name] ?? installed[displayName];\n if (opts.installed && !inst) continue;\n\n const version = pc.dim(`v${item.version ?? \"1.0.0\"}`);\n\n if (inst) {\n installedCount++;\n const status = pc.green(\"✓\");\n const hasUpdate = item.version && inst.version !== item.version;\n const updateTag = hasUpdate ? pc.yellow(` ⬆ v${item.version} available`) : \"\";\n if (hasUpdate) updateCount++;\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}${updateTag}`);\n } else {\n const status = pc.dim(\"○\");\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}`);\n }\n }\n }\n\n const availableCount = allItems.length - installedCount;\n const parts = [`${installedCount} installed`, `${availableCount} available`];\n if (updateCount > 0) parts.push(`${updateCount} update${updateCount === 1 ? \"\" : \"s\"} available`);\n p.log.message(\"\");\n p.log.message(pc.dim(` ${parts.join(\", \")}`));\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { readExistingFile, generateDiff } from \"../installers/file-writer.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function diffCommand(componentName: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" alias to framework-specific package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[installedKey];\n if (!installed) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const namespace = installed.registry ?? ref.namespace;\n const fetcher = new RegistryFetcher(config.registries);\n const index = await fetcher.fetchIndex(namespace);\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n p.log.error(`Component '${ref.name}' not found in ${namespace} registry.`);\n process.exit(1);\n }\n\n const dir = typeToDir[indexItem.type] as any;\n const registryItem = await fetcher.fetchItem(ref.name, dir, namespace, ref.version);\n\n let hasDiff = false;\n for (const file of registryItem.files) {\n if (indexItem.type === \"kitn:package\") {\n // Packages use base alias + preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n const localPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${relativePath}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(relativePath, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n } else {\n // Regular components use type-based alias directories\n const fileName = file.path.split(\"/\").pop()!;\n const aliasKey = (() => {\n switch (indexItem.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n const localPath = join(cwd, config.aliases[aliasKey], fileName);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${fileName}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(fileName, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n }\n }\n\n if (!hasDiff) {\n p.log.success(`${ref.name}: up to date, no differences.`);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join, relative, dirname } from \"path\";\nimport { unlink, readFile, writeFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { removeImportFromBarrel } from \"../installers/barrel-manager.js\";\n\nexport async function removeCommand(componentName: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" alias to framework-specific package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[installedKey];\n if (!installed) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const shouldRemove = await p.confirm({\n message: `Remove ${ref.name}? This will delete ${installed.files.length} file(s).`,\n initialValue: false,\n });\n if (p.isCancel(shouldRemove) || !shouldRemove) {\n p.cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n\n const deleted: string[] = [];\n for (const filePath of installed.files) {\n try {\n await unlink(join(cwd, filePath));\n deleted.push(filePath);\n } catch {\n p.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);\n }\n }\n\n // Remove barrel imports for deleted files\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelDir = join(cwd, baseDir);\n const barrelEligibleDirs = new Set([\n config.aliases.agents,\n config.aliases.tools,\n config.aliases.skills,\n ]);\n\n if (existsSync(barrelPath) && deleted.length > 0) {\n let barrelContent = await readFile(barrelPath, \"utf-8\");\n let barrelChanged = false;\n\n for (const filePath of deleted) {\n // Check if the file is in a barrel-eligible directory\n const fileDir = dirname(filePath);\n if (!barrelEligibleDirs.has(fileDir)) continue;\n\n const importPath = \"./\" + relative(barrelDir, join(cwd, filePath)).replace(/\\\\/g, \"/\");\n const updated = removeImportFromBarrel(barrelContent, importPath);\n if (updated !== barrelContent) {\n barrelContent = updated;\n barrelChanged = true;\n }\n }\n\n if (barrelChanged) {\n await writeFile(barrelPath, barrelContent);\n p.log.info(`Updated barrel file: ${join(baseDir, \"index.ts\")}`);\n }\n }\n\n delete config.installed![installedKey];\n if (Object.keys(config.installed!).length === 0) {\n delete config.installed;\n }\n await writeConfig(cwd, config);\n\n if (deleted.length > 0) {\n p.log.success(`Removed ${ref.name}:`);\n for (const f of deleted) p.log.message(` ${pc.red(\"-\")} ${f}`);\n }\n}\n","import { addCommand } from \"./add.js\";\nimport { readConfig } from \"../utils/config.js\";\nimport * as p from \"@clack/prompts\";\n\nexport async function updateCommand(components: string[]) {\n // If no components specified, update all installed components\n if (components.length === 0) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const installed = config.installed;\n if (!installed || Object.keys(installed).length === 0) {\n p.log.info(\"No installed components to update.\");\n return;\n }\n\n components = Object.keys(installed);\n }\n\n await addCommand(components, { overwrite: true });\n}\n","import { readdir, stat, writeFile, mkdir, access, readFile } from \"fs/promises\";\nimport { join, resolve, relative } from \"path\";\nimport { typeToDir, type RegistryItem, type RegistryIndex } from \"./schema.js\";\n\n/** Directories to skip when walking the full tree */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \"dist\",\n \".git\",\n \"r\",\n \"test\",\n \"tests\",\n \".claude\",\n]);\n\n/** Check whether a file exists */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Walk a directory tree recursively, collecting directories that contain registry.json.\n * Skips directories in the SKIP_DIRS set.\n */\nasync function walkForRegistryJson(dir: string): Promise<string[]> {\n const results: string[] = [];\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Check if this directory itself has registry.json\n if (await fileExists(join(dir, \"registry.json\"))) {\n results.push(dir);\n // Don't recurse into component directories — they won't nest further\n return results;\n }\n\n // Recurse into subdirectories\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIP_DIRS.has(entry.name)) {\n const subResults = await walkForRegistryJson(join(dir, entry.name));\n results.push(...subResults);\n }\n }\n\n return results;\n}\n\n/**\n * Discover directories containing registry.json files.\n *\n * If `paths` is provided, each path is checked:\n * - If it directly contains registry.json, it's included.\n * - Otherwise, its immediate subdirectories are checked for registry.json.\n *\n * If `paths` is not provided, the full directory tree from `cwd` is walked,\n * skipping directories in SKIP_DIRS.\n *\n * @returns Array of absolute directory paths containing registry.json.\n */\nexport async function scanForComponents(\n cwd: string,\n paths?: string[]\n): Promise<string[]> {\n const resolvedCwd = resolve(cwd);\n\n if (paths && paths.length > 0) {\n const results: string[] = [];\n\n for (const p of paths) {\n const absPath = resolve(resolvedCwd, p);\n\n // Check if this path directly contains registry.json\n if (await fileExists(join(absPath, \"registry.json\"))) {\n results.push(absPath);\n continue;\n }\n\n // Otherwise, scan one level of subdirectories\n let entries;\n try {\n entries = await readdir(absPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = join(absPath, entry.name);\n if (await fileExists(join(subDir, \"registry.json\"))) {\n results.push(subDir);\n }\n }\n }\n }\n\n return results;\n }\n\n // No paths specified — walk the full tree\n return walkForRegistryJson(resolvedCwd);\n}\n\n/**\n * Extract version strings from versioned filenames like `weather@1.0.0.json`.\n */\nfunction parseVersionFromFilename(\n name: string,\n componentName: string\n): string | null {\n const prefix = `${componentName}@`;\n const suffix = \".json\";\n if (name.startsWith(prefix) && name.endsWith(suffix)) {\n return name.slice(prefix.length, -suffix.length);\n }\n return null;\n}\n\n/**\n * Write the built registry output to the output directory.\n *\n * For each item:\n * 1. Creates the type subdirectory (e.g., tools/, package/)\n * 2. Writes `<typeDir>/<name>.json` — latest version, always overwritten\n * 3. Writes `<typeDir>/<name>@<version>.json` — versioned copy, immutable (skipped if exists)\n * 4. Scans existing versioned files to collect all available versions\n *\n * After all items:\n * 5. Writes `registry.json` index with metadata (no file content)\n *\n * @returns `{ written, skipped }` arrays of relative file paths.\n */\nexport async function writeRegistryOutput(\n outputDir: string,\n items: RegistryItem[]\n): Promise<{ written: string[]; skipped: string[] }> {\n const written: string[] = [];\n const skipped: string[] = [];\n const resolvedOutput = resolve(outputDir);\n\n const indexItems: RegistryIndex[\"items\"] = [];\n\n for (const item of items) {\n const dir = typeToDir[item.type];\n const typeDir = join(resolvedOutput, dir);\n await mkdir(typeDir, { recursive: true });\n\n const itemJson = JSON.stringify(item, null, 2);\n\n // 1. Write latest version (always overwritten)\n const latestPath = join(typeDir, `${item.name}.json`);\n const latestRelative = `${dir}/${item.name}.json`;\n await writeFile(latestPath, itemJson, \"utf-8\");\n written.push(latestRelative);\n\n // 2. Write versioned copy (immutable)\n if (item.version) {\n const versionedFilename = `${item.name}@${item.version}.json`;\n const versionedPath = join(typeDir, versionedFilename);\n const versionedRelative = `${dir}/${versionedFilename}`;\n\n if (await fileExists(versionedPath)) {\n skipped.push(versionedRelative);\n } else {\n await writeFile(versionedPath, itemJson, \"utf-8\");\n written.push(versionedRelative);\n }\n }\n\n // 3. Scan for all versioned files to collect versions\n const versions: string[] = [];\n let entries: string[];\n try {\n entries = await readdir(typeDir);\n } catch {\n entries = [];\n }\n\n for (const filename of entries) {\n const ver = parseVersionFromFilename(filename, item.name);\n if (ver) {\n versions.push(ver);\n }\n }\n\n // Sort versions (simple string sort is fine for semver with consistent formatting)\n versions.sort();\n\n // 4. Build index item (no file content)\n indexItems.push({\n name: item.name,\n type: item.type,\n description: item.description,\n ...(item.registryDependencies &&\n item.registryDependencies.length > 0 && {\n registryDependencies: item.registryDependencies,\n }),\n ...(item.categories &&\n item.categories.length > 0 && { categories: item.categories }),\n ...(item.version && { version: item.version }),\n ...(versions.length > 0 && { versions }),\n ...(item.updatedAt && { updatedAt: item.updatedAt }),\n });\n }\n\n // 5. Write registry.json index\n const index: RegistryIndex = {\n version: \"1\",\n items: indexItems,\n };\n\n const indexPath = join(resolvedOutput, \"registry.json\");\n await writeFile(indexPath, JSON.stringify(index, null, 2), \"utf-8\");\n written.push(\"registry.json\");\n\n return { written, skipped };\n}\n","import { readFile, readdir } from \"fs/promises\";\nimport { join, relative } from \"path\";\nimport {\n componentConfigSchema,\n registryItemSchema,\n typeToDir,\n type ComponentConfig,\n type RegistryItem,\n} from \"./schema.js\";\n\n/** Build tooling devDependencies to exclude from the output */\nconst EXCLUDED_DEV_DEPS = new Set([\n \"typescript\",\n \"@types/bun\",\n \"@types/node\",\n \"tsup\",\n \"vitest\",\n \"jest\",\n \"@types/jest\",\n]);\n\nfunction isExcludedDevDep(name: string): boolean {\n return EXCLUDED_DEV_DEPS.has(name) || name.startsWith(\"@types/\");\n}\n\n/** Strip @scope/ prefix from a package name (e.g., @kitnai/core -> core) */\nfunction stripScope(name: string): string {\n const match = name.match(/^@[^/]+\\/(.+)$/);\n return match ? match[1] : name;\n}\n\n/** Recursively read all .ts files from a directory */\nasync function readTsFiles(\n dir: string,\n baseDir: string,\n exclude: string[]\n): Promise<{ relativePath: string; content: string }[]> {\n const results: { relativePath: string; content: string }[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relPath = relative(baseDir, fullPath);\n\n if (entry.isDirectory()) {\n const nested = await readTsFiles(fullPath, baseDir, exclude);\n results.push(...nested);\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n if (exclude.includes(relPath)) {\n continue;\n }\n const content = await readFile(fullPath, \"utf-8\");\n results.push({ relativePath: relPath, content });\n }\n }\n\n return results;\n}\n\n/**\n * Build a RegistryItem from a component directory.\n *\n * Reads registry.json (required) + optional package.json + source files,\n * and produces a validated RegistryItem.\n */\nexport async function buildComponent(componentDir: string): Promise<RegistryItem> {\n // 1. Read and validate registry.json\n let rawConfig: string;\n try {\n rawConfig = await readFile(join(componentDir, \"registry.json\"), \"utf-8\");\n } catch {\n throw new Error(\n `No registry.json found in ${componentDir}. Every component must have a registry.json file.`\n );\n }\n\n let config: ComponentConfig;\n try {\n config = componentConfigSchema.parse(JSON.parse(rawConfig));\n } catch (err) {\n throw new Error(\n `Invalid registry.json in ${componentDir}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // 2. Try to read package.json (optional)\n let pkg: {\n name?: string;\n version?: string;\n description?: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n } | null = null;\n\n try {\n const rawPkg = await readFile(join(componentDir, \"package.json\"), \"utf-8\");\n pkg = JSON.parse(rawPkg);\n } catch {\n // No package.json, that's fine for standalone components\n }\n\n // 3. Resolve metadata by merging registry.json + package.json\n const name = config.name ?? (pkg?.name ? stripScope(pkg.name) : undefined);\n const version = config.version ?? pkg?.version;\n const description = config.description ?? pkg?.description;\n\n if (!name) {\n throw new Error(\n `Component in ${componentDir} is missing a name. Provide \"name\" in registry.json or have a package.json with a \"name\" field.`\n );\n }\n if (!description) {\n throw new Error(\n `Component in ${componentDir} is missing a description. Provide \"description\" in registry.json or have a package.json with a \"description\" field.`\n );\n }\n\n // Resolve dependencies from package.json if available\n let dependencies = config.dependencies;\n let devDependencies = config.devDependencies;\n\n if (pkg && !config.dependencies) {\n const deps: string[] = [];\n if (pkg.dependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.dependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (pkg.peerDependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.peerDependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (deps.length > 0) {\n dependencies = deps;\n }\n }\n\n if (pkg && !config.devDependencies) {\n const devDeps: string[] = [];\n if (pkg.devDependencies) {\n for (const depName of Object.keys(pkg.devDependencies)) {\n if (!isExcludedDevDep(depName)) {\n devDeps.push(depName);\n }\n }\n }\n if (devDeps.length > 0) {\n devDependencies = devDeps;\n }\n }\n\n // 4. Read source files\n const isPackage = config.type === \"kitn:package\";\n const dirPrefix = config.installDir ?? typeToDir[config.type];\n\n let files: { path: string; content: string; type: typeof config.type }[];\n\n if (isPackage) {\n // For packages: recursively read .ts files from src/ (or sourceDir override)\n const sourceDir = config.sourceDir ?? \"src\";\n const sourcePath = join(componentDir, sourceDir);\n const exclude = config.exclude ?? [];\n\n let tsFiles: { relativePath: string; content: string }[];\n try {\n tsFiles = await readTsFiles(sourcePath, sourcePath, exclude);\n } catch {\n throw new Error(\n `Cannot read source directory \"${sourceDir}\" in ${componentDir}. Make sure it exists.`\n );\n }\n\n files = tsFiles.map((f) => ({\n path: `${dirPrefix}/${f.relativePath}`,\n content: f.content,\n type: config.type,\n }));\n } else {\n // For standalone components: read files listed in the files array\n if (!config.files || config.files.length === 0) {\n throw new Error(\n `Component \"${name}\" (type: ${config.type}) has no \"files\" array in registry.json. Standalone components must list their source files.`\n );\n }\n\n files = await Promise.all(\n config.files.map(async (filePath) => {\n const fullPath = join(componentDir, filePath);\n let content: string;\n try {\n content = await readFile(fullPath, \"utf-8\");\n } catch {\n throw new Error(\n `Cannot read file \"${filePath}\" referenced in registry.json for component \"${name}\". Make sure the file exists at ${fullPath}.`\n );\n }\n return {\n path: `${dirPrefix}/${filePath}`,\n content,\n type: config.type,\n };\n })\n );\n }\n\n // 5. Build the RegistryItem\n const item: RegistryItem = {\n name,\n type: config.type,\n description,\n files,\n };\n\n // Add optional fields only if present\n if (version) item.version = version;\n if (dependencies && dependencies.length > 0) item.dependencies = dependencies;\n if (devDependencies && devDependencies.length > 0) item.devDependencies = devDependencies;\n if (config.registryDependencies && config.registryDependencies.length > 0) {\n item.registryDependencies = config.registryDependencies;\n }\n if (config.envVars) item.envVars = config.envVars;\n if (config.tsconfig) item.tsconfig = config.tsconfig;\n if (config.docs) item.docs = config.docs;\n if (config.categories && config.categories.length > 0) item.categories = config.categories;\n if (config.changelog && config.changelog.length > 0) item.changelog = config.changelog;\n if (isPackage && config.installDir) item.installDir = config.installDir;\n\n // 6. Validate the result\n try {\n return registryItemSchema.parse(item);\n } catch (err) {\n throw new Error(\n `Built component \"${name}\" failed validation: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { resolve, relative } from \"path\";\nimport { scanForComponents, writeRegistryOutput } from \"../registry/build-output.js\";\nimport { buildComponent } from \"../registry/builder.js\";\nimport type { RegistryItem } from \"../registry/schema.js\";\n\ninterface BuildOptions {\n output?: string;\n}\n\nexport async function buildCommand(paths: string[], opts: BuildOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn build \")));\n\n const cwd = process.cwd();\n const outputDir = resolve(cwd, opts.output ?? \"dist/r\");\n\n const s = p.spinner();\n s.start(\"Scanning for components...\");\n\n const componentDirs = await scanForComponents(cwd, paths.length > 0 ? paths : undefined);\n\n if (componentDirs.length === 0) {\n s.stop(\"No components found\");\n p.log.info(\n `No directories with ${pc.bold(\"registry.json\")} found. Run ${pc.bold(\"kitn create\")} to scaffold a component.`\n );\n return;\n }\n\n s.stop(`Found ${componentDirs.length} component(s)`);\n for (const dir of componentDirs) {\n p.log.message(` ${pc.dim(relative(cwd, dir))}`);\n }\n\n s.start(\"Building components...\");\n\n const items: RegistryItem[] = [];\n const errors: { dir: string; error: string }[] = [];\n\n for (const dir of componentDirs) {\n try {\n const item = await buildComponent(dir);\n items.push(item);\n } catch (err: any) {\n errors.push({ dir: relative(cwd, dir), error: err.message });\n }\n }\n\n if (errors.length > 0) {\n s.stop(pc.red(`Build failed with ${errors.length} error(s)`));\n for (const { dir, error } of errors) {\n p.log.error(`${pc.bold(dir)}: ${error}`);\n }\n process.exit(1);\n }\n\n const { written, skipped } = await writeRegistryOutput(outputDir, items);\n\n s.stop(pc.green(`Built ${items.length} component(s)`));\n\n if (written.length > 0) {\n p.log.success(`Wrote ${written.length} file(s):`);\n for (const f of written) {\n p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n }\n\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s) (already exist):`);\n for (const f of skipped) {\n p.log.message(` ${pc.dim(\"-\")} ${f}`);\n }\n }\n\n p.outro(`Output: ${pc.cyan(relative(cwd, outputDir) || \".\")}`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { mkdir, writeFile } from \"fs/promises\";\n\nconst VALID_TYPES = [\"agent\", \"tool\", \"skill\", \"storage\"] as const;\ntype ComponentType = (typeof VALID_TYPES)[number];\n\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toTitleCase(str: string): string {\n return str\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\nfunction generateRegistryJson(\n type: ComponentType,\n name: string,\n sourceFile: string\n): object {\n const base: Record<string, unknown> = {\n $schema: \"https://kitn.dev/schema/registry.json\",\n name,\n type: `kitn:${type}`,\n version: \"0.1.0\",\n description: \"\",\n files: [sourceFile],\n categories: [],\n };\n\n if (type === \"tool\") {\n base.dependencies = [\"ai\", \"zod\"];\n } else if (type === \"agent\" || type === \"storage\") {\n base.dependencies = [];\n }\n\n return base;\n}\n\nfunction generateAgentSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerAgent } from \"@kitnai/core\";\n\nconst SYSTEM_PROMPT = \"You are a helpful assistant.\";\n\nregisterAgent({\n name: \"${name}\",\n description: \"\",\n system: SYSTEM_PROMPT,\n tools: {},\n});\n`;\n}\n\nfunction generateToolSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerTool } from \"@kitnai/core\";\nimport { tool } from \"ai\";\nimport { z } from \"zod\";\n\nexport const ${camel} = tool({\n description: \"\",\n parameters: z.object({\n input: z.string().describe(\"Input parameter\"),\n }),\n execute: async ({ input }) => {\n // TODO: implement\n return { result: input };\n },\n});\n\nregisterTool({\n name: \"${name}\",\n description: \"\",\n inputSchema: z.object({ input: z.string() }),\n tool: ${camel},\n});\n`;\n}\n\nfunction generateSkillSource(name: string): string {\n const title = toTitleCase(name);\n return `---\nname: ${name}\ndescription: \"\"\n---\n\n# ${title}\n\nDescribe what this skill does and how to use it.\n`;\n}\n\nfunction generateStorageSource(name: string): string {\n const camel = toCamelCase(\"create-\" + name);\n return `import type { StorageProvider } from \"@kitnai/core\";\n\nexport function ${camel}(config?: Record<string, unknown>): StorageProvider {\n // TODO: implement storage provider\n throw new Error(\"Not implemented\");\n}\n`;\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const { stat } = await import(\"fs/promises\");\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function createComponent(\n type: string,\n name: string,\n opts?: { cwd?: string }\n): Promise<{ dir: string; files: string[] }> {\n if (!VALID_TYPES.includes(type as ComponentType)) {\n throw new Error(\n `Invalid component type: \"${type}\". Valid types: ${VALID_TYPES.join(\", \")}`\n );\n }\n\n const cwd = opts?.cwd ?? process.cwd();\n const dir = join(cwd, name);\n\n if (await dirExists(dir)) {\n throw new Error(`Directory \"${name}\" already exists`);\n }\n\n await mkdir(dir, { recursive: true });\n\n const validType = type as ComponentType;\n const sourceFile = validType === \"skill\" ? \"README.md\" : `${name}.ts`;\n const registryJson = generateRegistryJson(validType, name, sourceFile);\n\n await writeFile(\n join(dir, \"registry.json\"),\n JSON.stringify(registryJson, null, 2) + \"\\n\"\n );\n\n let source: string;\n switch (validType) {\n case \"agent\":\n source = generateAgentSource(name);\n break;\n case \"tool\":\n source = generateToolSource(name);\n break;\n case \"skill\":\n source = generateSkillSource(name);\n break;\n case \"storage\":\n source = generateStorageSource(name);\n break;\n }\n\n await writeFile(join(dir, sourceFile), source);\n\n return { dir, files: [\"registry.json\", sourceFile] };\n}\n\nexport async function createCommand(type: string, name: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn create \")));\n\n try {\n const { dir, files } = await createComponent(type, name);\n\n p.log.success(`Created ${pc.bold(type)} component ${pc.cyan(name)}`);\n for (const file of files) {\n p.log.message(` ${pc.green(\"+\")} ${file}`);\n }\n\n const editFile = files.find((f) => f !== \"registry.json\") ?? files[0];\n p.outro(\n `Edit ${pc.cyan(`${name}/${editFile}`)}, then run ${pc.bold(\"kitn build\")}`\n );\n } catch (err: any) {\n p.log.error(err.message);\n process.exit(1);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function infoCommand(component: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const ref = parseComponentRef(component);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Fetching component info...\");\n\n // Fetch registry index to find the component and get available versions\n let index;\n try {\n index = await fetcher.fetchIndex(ref.namespace);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch registry\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n s.stop(pc.red(\"Component not found\"));\n p.log.error(`Component '${ref.name}' not found in registry.`);\n process.exit(1);\n }\n\n // Fetch the full component JSON (specific version or latest)\n const dir = typeToDir[indexItem.type] as any;\n let item;\n try {\n item = await fetcher.fetchItem(ref.name, dir, ref.namespace, ref.version);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch component\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(\"Component found\");\n\n // Display formatted output\n const version = item.version ?? indexItem.version ?? \"unknown\";\n const typeName = indexItem.type.replace(\"kitn:\", \"\");\n\n // Header: name, version, namespace\n console.log();\n console.log(\n ` ${pc.bold(item.name)} ${pc.cyan(`v${version}`)}${\" \".repeat(Math.max(1, 40 - item.name.length - version.length - 2))}${pc.dim(ref.namespace)}`\n );\n console.log(` ${pc.dim(item.description)}`);\n console.log();\n\n // Details\n console.log(` ${pc.dim(\"Type:\")} ${typeName}`);\n\n if (item.dependencies?.length) {\n console.log(\n ` ${pc.dim(\"Dependencies:\")} ${item.dependencies.join(\", \")}`\n );\n }\n\n if (item.registryDependencies?.length) {\n console.log(\n ` ${pc.dim(\"Registry deps:\")} ${item.registryDependencies.join(\", \")}`\n );\n }\n\n if (item.categories?.length) {\n console.log(\n ` ${pc.dim(\"Categories:\")} ${item.categories.join(\", \")}`\n );\n }\n\n if (item.updatedAt) {\n console.log(` ${pc.dim(\"Updated:\")} ${item.updatedAt}`);\n }\n\n // Available versions from index\n const versions = indexItem.versions;\n if (versions?.length) {\n console.log(` ${pc.dim(\"Versions:\")} ${versions.join(\", \")}`);\n }\n\n // Changelog\n if (item.changelog?.length) {\n console.log();\n console.log(` ${pc.bold(\"Changelog:\")}`);\n for (const entry of item.changelog) {\n const tag =\n entry.type === \"feature\"\n ? pc.green(entry.type)\n : entry.type === \"fix\"\n ? pc.yellow(entry.type)\n : entry.type === \"breaking\"\n ? pc.red(entry.type)\n : pc.dim(entry.type);\n console.log(\n ` ${pc.cyan(entry.version)} ${pc.dim(entry.date)} ${tag} ${entry.note}`\n );\n }\n }\n\n // Files\n console.log();\n const fileCount = item.files.length;\n console.log(` ${pc.bold(`Files:`)} ${pc.dim(`(${fileCount})`)}`);\n const maxShown = 10;\n for (const file of item.files.slice(0, maxShown)) {\n console.log(` ${pc.dim(file.path)}`);\n }\n if (fileCount > maxShown) {\n console.log(` ${pc.dim(`... and ${fileCount - maxShown} more`)}`);\n }\n\n // Installed status\n const installed = config.installed?.[item.name];\n if (installed) {\n console.log();\n console.log(\n ` ${pc.green(\"Installed\")} ${pc.dim(`v${installed.version}`)}`\n );\n if (version !== installed.version) {\n console.log(\n ` ${pc.yellow(\"Update available:\")} ${pc.dim(`v${installed.version}`)} → ${pc.cyan(`v${version}`)}`\n );\n }\n }\n\n console.log();\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\n\ninterface RegistryAddOptions {\n cwd?: string;\n overwrite?: boolean;\n}\n\ninterface RegistryRemoveOptions {\n cwd?: string;\n force?: boolean;\n}\n\ninterface RegistryListOptions {\n cwd?: string;\n}\n\nexport async function registryAddCommand(\n namespace: string,\n url: string,\n opts: RegistryAddOptions = {},\n) {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!namespace.startsWith(\"@\")) {\n throw new Error(\"Namespace must start with @ (e.g. @myteam)\");\n }\n if (!url.includes(\"{type}\")) {\n throw new Error(\"URL template must include {type} placeholder\");\n }\n if (!url.includes(\"{name}\")) {\n throw new Error(\"URL template must include {name} placeholder\");\n }\n if (config.registries[namespace] && !opts.overwrite) {\n throw new Error(`Registry '${namespace}' is already configured. Use --overwrite to replace.`);\n }\n\n config.registries[namespace] = url;\n await writeConfig(cwd, config);\n\n p.log.success(`Added registry ${pc.bold(namespace)}`);\n p.log.message(pc.dim(` ${url}`));\n}\n\nexport async function registryRemoveCommand(\n namespace: string,\n opts: RegistryRemoveOptions = {},\n): Promise<{ affectedComponents: string[] }> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!config.registries[namespace]) {\n throw new Error(`Registry '${namespace}' is not configured.`);\n }\n if (namespace === \"@kitn\" && !opts.force) {\n throw new Error(\"Cannot remove the default @kitn registry. Use --force to override.\");\n }\n\n const affectedComponents: string[] = [];\n if (config.installed) {\n for (const [name, entry] of Object.entries(config.installed)) {\n if (entry.registry === namespace) {\n affectedComponents.push(name);\n }\n }\n }\n\n delete config.registries[namespace];\n await writeConfig(cwd, config);\n\n p.log.success(`Removed registry ${pc.bold(namespace)}`);\n if (affectedComponents.length > 0) {\n p.log.warn(`${affectedComponents.length} installed component(s) referenced this registry:`);\n for (const name of affectedComponents) {\n p.log.message(` ${pc.yellow(\"!\")} ${name}`);\n }\n }\n\n return { affectedComponents };\n}\n\nexport async function registryListCommand(\n opts: RegistryListOptions = {},\n): Promise<Array<{ namespace: string; url: string }>> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n const entries = Object.entries(config.registries).map(([namespace, url]) => ({ namespace, url }));\n\n if (entries.length === 0) {\n p.log.message(pc.dim(\" No registries configured.\"));\n } else {\n for (const { namespace, url } of entries) {\n p.log.message(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\n }\n }\n\n return entries;\n}\n","import { Command } from \"commander\";\nimport { startUpdateCheck } from \"./utils/update-check.js\";\n\ndeclare const __CLI_VERSION__: string;\nconst VERSION = typeof __CLI_VERSION__ !== \"undefined\" ? __CLI_VERSION__ : \"0.0.0-dev\";\n\nconst printUpdateNotice = startUpdateCheck(VERSION);\n\nconst program = new Command()\n .name(\"kitn\")\n .description(\"Install AI agent components from the kitn registry\")\n .version(VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Initialize kitn in your project\")\n .action(async () => {\n const { initCommand } = await import(\"./commands/init.js\");\n await initCommand();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add components from the kitn registry\")\n .argument(\"[components...]\", \"component names to install\")\n .option(\"-o, --overwrite\", \"overwrite existing files without prompting\")\n .option(\"-t, --type <type>\", \"filter by component type\")\n .action(async (components: string[], opts) => {\n const { addCommand } = await import(\"./commands/add.js\");\n await addCommand(components, opts);\n });\n\nprogram\n .command(\"list\")\n .description(\"List available and installed components\")\n .option(\"-i, --installed\", \"only show installed components\")\n .option(\"-t, --type <type>\", \"filter by type (agent, tool, skill, storage, package)\")\n .option(\"-r, --registry <namespace>\", \"only show components from this registry\")\n .action(async (opts) => {\n const { listCommand } = await import(\"./commands/list.js\");\n await listCommand(opts);\n });\n\nprogram\n .command(\"diff\")\n .description(\"Show differences between local and registry version\")\n .argument(\"<component>\", \"component name\")\n .action(async (component: string) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand(component);\n });\n\nprogram\n .command(\"remove\")\n .description(\"Remove an installed component\")\n .argument(\"<component>\", \"component name to remove\")\n .action(async (component: string) => {\n const { removeCommand } = await import(\"./commands/remove.js\");\n await removeCommand(component);\n });\n\nprogram\n .command(\"update\")\n .description(\"Update installed components to latest registry version\")\n .argument(\"[components...]\", \"component names to update\")\n .action(async (components: string[]) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand(components);\n });\n\nprogram\n .command(\"build\")\n .description(\"Build registry JSON from components with registry.json files\")\n .argument(\"[paths...]\", \"directories to build (default: scan from cwd)\")\n .option(\"-o, --output <dir>\", \"output directory\", \"dist/r\")\n .action(async (paths: string[], opts) => {\n const { buildCommand } = await import(\"./commands/build.js\");\n await buildCommand(paths, opts);\n });\n\nprogram\n .command(\"create\")\n .description(\"Scaffold a new kitn component\")\n .argument(\"<type>\", \"component type (agent, tool, skill, storage)\")\n .argument(\"<name>\", \"component name\")\n .action(async (type: string, name: string) => {\n const { createCommand } = await import(\"./commands/create.js\");\n await createCommand(type, name);\n });\n\nprogram\n .command(\"info\")\n .description(\"Show details about a component\")\n .argument(\"<component>\", \"component name (e.g. weather-agent, @acme/tool@1.0.0)\")\n .action(async (component: string) => {\n const { infoCommand } = await import(\"./commands/info.js\");\n await infoCommand(component);\n });\n\nconst registry = program\n .command(\"registry\")\n .description(\"Manage component registries\");\n\nregistry\n .command(\"add\")\n .description(\"Add a component registry\")\n .argument(\"<namespace>\", \"registry namespace (e.g. @myteam)\")\n .argument(\"<url>\", \"URL template with {type} and {name} placeholders\")\n .option(\"-o, --overwrite\", \"overwrite if namespace already exists\")\n .action(async (namespace: string, url: string, opts) => {\n const { registryAddCommand } = await import(\"./commands/registry.js\");\n await registryAddCommand(namespace, url, opts);\n });\n\nregistry\n .command(\"remove\")\n .description(\"Remove a component registry\")\n .argument(\"<namespace>\", \"registry namespace to remove (e.g. @myteam)\")\n .option(\"-f, --force\", \"allow removing the default @kitn registry\")\n .action(async (namespace: string, opts) => {\n const { registryRemoveCommand } = await import(\"./commands/registry.js\");\n await registryRemoveCommand(namespace, opts);\n });\n\nregistry\n .command(\"list\")\n .description(\"List all configured registries\")\n .action(async () => {\n const { registryListCommand } = await import(\"./commands/registry.js\");\n await registryListCommand();\n });\n\nawait program.parseAsync();\nprintUpdateNotice();\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport pc from \"picocolors\";\n\nconst CACHE_DIR = join(homedir(), \".kitn\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst CHECK_INTERVAL = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n latest: string;\n checkedAt: number;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n const raw = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(entry: CacheEntry): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true });\n await writeFile(CACHE_FILE, JSON.stringify(entry));\n } catch {\n // Silently ignore cache write failures\n }\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\"https://registry.npmjs.org/@kitnai/cli/latest\", {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nexport function isNewer(latest: string, current: string): boolean {\n const [lMaj, lMin, lPat] = latest.split(\".\").map(Number);\n const [cMaj, cMin, cPat] = current.split(\".\").map(Number);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\n/**\n * Starts a non-blocking update check. Returns a function that,\n * when called, prints the update notice if a newer version was found.\n */\nexport function startUpdateCheck(currentVersion: string): () => void {\n let message = \"\";\n\n // Fire-and-forget: don't block CLI startup\n const check = (async () => {\n const cache = await readCache();\n let latest: string | null = null;\n\n if (cache && Date.now() - cache.checkedAt < CHECK_INTERVAL) {\n latest = cache.latest;\n } else {\n latest = await fetchLatestVersion();\n if (latest) {\n await writeCache({ latest, checkedAt: Date.now() });\n }\n }\n\n if (latest && isNewer(latest, currentVersion)) {\n message = [\n \"\",\n pc.yellow(` Update available: ${pc.dim(currentVersion)} → ${pc.green(latest)}`),\n pc.dim(` Run ${pc.cyan(\"npx @kitnai/cli@latest\")} or ${pc.cyan(\"npm i -g @kitnai/cli\")}`),\n \"\",\n ].join(\"\\n\");\n }\n })();\n\n // Suppress unhandled rejection from the fire-and-forget promise\n check.catch(() => {});\n\n return () => {\n if (message) process.stderr.write(message);\n };\n}\n"],"mappings":"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","names":["readFile","writeFile","join","pc","join","resolve","readFile","writeFile","mkdir","access","p","pc","readFile","writeFile","access","join","join","readFile","writeFile","join","text","z","componentType","p","pc","join","readFile","writeFile","mkdir","relative","fw","baseDir","p","pc","p","join","p","pc","join","relative","dirname","readFile","writeFile","existsSync","p","writeFile","mkdir","access","join","p","readFile","readdir","join","relative","p","pc","resolve","relative","p","pc","join","mkdir","writeFile","stat","p","pc","p","pc","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","buildCommand","createCommand","infoCommand","registryAddCommand","registryRemoveCommand","registryListCommand"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitnai/cli",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "type": "module",
5
5
  "description": "CLI for installing AI agent components from the kitn registry",
6
6
  "bin": {