archmantic 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +172 -0
  3. package/dist/agent.d.ts +20 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +239 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/analyze/datamodel.d.ts +9 -0
  8. package/dist/analyze/datamodel.d.ts.map +1 -0
  9. package/dist/analyze/datamodel.js +19 -0
  10. package/dist/analyze/datamodel.js.map +1 -0
  11. package/dist/analyze/derive.d.ts +21 -0
  12. package/dist/analyze/derive.d.ts.map +1 -0
  13. package/dist/analyze/derive.js +211 -0
  14. package/dist/analyze/derive.js.map +1 -0
  15. package/dist/analyze/drizzle.d.ts +3 -0
  16. package/dist/analyze/drizzle.d.ts.map +1 -0
  17. package/dist/analyze/drizzle.js +83 -0
  18. package/dist/analyze/drizzle.js.map +1 -0
  19. package/dist/analyze/endpoints.d.ts +3 -0
  20. package/dist/analyze/endpoints.d.ts.map +1 -0
  21. package/dist/analyze/endpoints.js +167 -0
  22. package/dist/analyze/endpoints.js.map +1 -0
  23. package/dist/analyze/fs-util.d.ts +3 -0
  24. package/dist/analyze/fs-util.d.ts.map +1 -0
  25. package/dist/analyze/fs-util.js +44 -0
  26. package/dist/analyze/fs-util.js.map +1 -0
  27. package/dist/analyze/incremental.d.ts +12 -0
  28. package/dist/analyze/incremental.d.ts.map +1 -0
  29. package/dist/analyze/incremental.js +102 -0
  30. package/dist/analyze/incremental.js.map +1 -0
  31. package/dist/analyze/index.d.ts +5 -0
  32. package/dist/analyze/index.d.ts.map +1 -0
  33. package/dist/analyze/index.js +49 -0
  34. package/dist/analyze/index.js.map +1 -0
  35. package/dist/analyze/parse-util.d.ts +10 -0
  36. package/dist/analyze/parse-util.d.ts.map +1 -0
  37. package/dist/analyze/parse-util.js +47 -0
  38. package/dist/analyze/parse-util.js.map +1 -0
  39. package/dist/analyze/prisma.d.ts +4 -0
  40. package/dist/analyze/prisma.d.ts.map +1 -0
  41. package/dist/analyze/prisma.js +97 -0
  42. package/dist/analyze/prisma.js.map +1 -0
  43. package/dist/analyze/sql.d.ts +3 -0
  44. package/dist/analyze/sql.d.ts.map +1 -0
  45. package/dist/analyze/sql.js +110 -0
  46. package/dist/analyze/sql.js.map +1 -0
  47. package/dist/analyze/stack.d.ts +4 -0
  48. package/dist/analyze/stack.d.ts.map +1 -0
  49. package/dist/analyze/stack.js +94 -0
  50. package/dist/analyze/stack.js.map +1 -0
  51. package/dist/analyze/tier0.d.ts +7 -0
  52. package/dist/analyze/tier0.d.ts.map +1 -0
  53. package/dist/analyze/tier0.js +57 -0
  54. package/dist/analyze/tier0.js.map +1 -0
  55. package/dist/analyze/tier1.d.ts +13 -0
  56. package/dist/analyze/tier1.d.ts.map +1 -0
  57. package/dist/analyze/tier1.js +144 -0
  58. package/dist/analyze/tier1.js.map +1 -0
  59. package/dist/analyze/tier2.d.ts +14 -0
  60. package/dist/analyze/tier2.d.ts.map +1 -0
  61. package/dist/analyze/tier2.js +231 -0
  62. package/dist/analyze/tier2.js.map +1 -0
  63. package/dist/analyze/walk.d.ts +3 -0
  64. package/dist/analyze/walk.d.ts.map +1 -0
  65. package/dist/analyze/walk.js +50 -0
  66. package/dist/analyze/walk.js.map +1 -0
  67. package/dist/auth.d.ts +12 -0
  68. package/dist/auth.d.ts.map +1 -0
  69. package/dist/auth.js +61 -0
  70. package/dist/auth.js.map +1 -0
  71. package/dist/cli.d.ts +3 -0
  72. package/dist/cli.d.ts.map +1 -0
  73. package/dist/cli.js +787 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/cloud/api.d.ts +20 -0
  76. package/dist/cloud/api.d.ts.map +1 -0
  77. package/dist/cloud/api.js +81 -0
  78. package/dist/cloud/api.js.map +1 -0
  79. package/dist/cloud/index.d.ts +4 -0
  80. package/dist/cloud/index.d.ts.map +1 -0
  81. package/dist/cloud/index.js +20 -0
  82. package/dist/cloud/index.js.map +1 -0
  83. package/dist/cloud/store.d.ts +34 -0
  84. package/dist/cloud/store.d.ts.map +1 -0
  85. package/dist/cloud/store.js +137 -0
  86. package/dist/cloud/store.js.map +1 -0
  87. package/dist/diff/history.d.ts +9 -0
  88. package/dist/diff/history.d.ts.map +1 -0
  89. package/dist/diff/history.js +44 -0
  90. package/dist/diff/history.js.map +1 -0
  91. package/dist/diff/index.d.ts +5 -0
  92. package/dist/diff/index.d.ts.map +1 -0
  93. package/dist/diff/index.js +26 -0
  94. package/dist/diff/index.js.map +1 -0
  95. package/dist/diff/model-diff.d.ts +44 -0
  96. package/dist/diff/model-diff.d.ts.map +1 -0
  97. package/dist/diff/model-diff.js +153 -0
  98. package/dist/diff/model-diff.js.map +1 -0
  99. package/dist/diff/snapshot.d.ts +8 -0
  100. package/dist/diff/snapshot.d.ts.map +1 -0
  101. package/dist/diff/snapshot.js +50 -0
  102. package/dist/diff/snapshot.js.map +1 -0
  103. package/dist/env.d.ts +2 -0
  104. package/dist/env.d.ts.map +1 -0
  105. package/dist/env.js +44 -0
  106. package/dist/env.js.map +1 -0
  107. package/dist/index.d.ts +7 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +23 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/ir/naming.d.ts +12 -0
  112. package/dist/ir/naming.d.ts.map +1 -0
  113. package/dist/ir/naming.js +31 -0
  114. package/dist/ir/naming.js.map +1 -0
  115. package/dist/ir/types.d.ts +149 -0
  116. package/dist/ir/types.d.ts.map +1 -0
  117. package/dist/ir/types.js +72 -0
  118. package/dist/ir/types.js.map +1 -0
  119. package/dist/mcp/bench.d.ts +25 -0
  120. package/dist/mcp/bench.d.ts.map +1 -0
  121. package/dist/mcp/bench.js +115 -0
  122. package/dist/mcp/bench.js.map +1 -0
  123. package/dist/mcp/queries.d.ts +22 -0
  124. package/dist/mcp/queries.d.ts.map +1 -0
  125. package/dist/mcp/queries.js +147 -0
  126. package/dist/mcp/queries.js.map +1 -0
  127. package/dist/mcp/server.d.ts +2 -0
  128. package/dist/mcp/server.d.ts.map +1 -0
  129. package/dist/mcp/server.js +147 -0
  130. package/dist/mcp/server.js.map +1 -0
  131. package/dist/mcp/usage.d.ts +23 -0
  132. package/dist/mcp/usage.d.ts.map +1 -0
  133. package/dist/mcp/usage.js +125 -0
  134. package/dist/mcp/usage.js.map +1 -0
  135. package/dist/project/bpmn-parse.d.ts +17 -0
  136. package/dist/project/bpmn-parse.d.ts.map +1 -0
  137. package/dist/project/bpmn-parse.js +60 -0
  138. package/dist/project/bpmn-parse.js.map +1 -0
  139. package/dist/project/bpmn.d.ts +11 -0
  140. package/dist/project/bpmn.d.ts.map +1 -0
  141. package/dist/project/bpmn.js +89 -0
  142. package/dist/project/bpmn.js.map +1 -0
  143. package/dist/project/capability.d.ts +16 -0
  144. package/dist/project/capability.d.ts.map +1 -0
  145. package/dist/project/capability.js +38 -0
  146. package/dist/project/capability.js.map +1 -0
  147. package/dist/project/erd.d.ts +17 -0
  148. package/dist/project/erd.d.ts.map +1 -0
  149. package/dist/project/erd.js +0 -0
  150. package/dist/project/erd.js.map +1 -0
  151. package/dist/project/html.d.ts +12 -0
  152. package/dist/project/html.d.ts.map +1 -0
  153. package/dist/project/html.js +166 -0
  154. package/dist/project/html.js.map +1 -0
  155. package/dist/project/index.d.ts +19 -0
  156. package/dist/project/index.d.ts.map +1 -0
  157. package/dist/project/index.js +113 -0
  158. package/dist/project/index.js.map +1 -0
  159. package/dist/project/mermaid.d.ts +20 -0
  160. package/dist/project/mermaid.d.ts.map +1 -0
  161. package/dist/project/mermaid.js +89 -0
  162. package/dist/project/mermaid.js.map +1 -0
  163. package/dist/project/spec.d.ts +69 -0
  164. package/dist/project/spec.d.ts.map +1 -0
  165. package/dist/project/spec.js +164 -0
  166. package/dist/project/spec.js.map +1 -0
  167. package/dist/project/trust.d.ts +35 -0
  168. package/dist/project/trust.d.ts.map +1 -0
  169. package/dist/project/trust.js +48 -0
  170. package/dist/project/trust.js.map +1 -0
  171. package/dist/system.d.ts +61 -0
  172. package/dist/system.d.ts.map +1 -0
  173. package/dist/system.js +161 -0
  174. package/dist/system.js.map +1 -0
  175. package/package.json +58 -0
@@ -0,0 +1,12 @@
1
+ import { type ArchitectureModel } from "../ir/types.js";
2
+ export interface IncrementalResult {
3
+ model: ArchitectureModel;
4
+ /** Files re-analyzed (changed or newly added). */
5
+ recomputed: string[];
6
+ /** Files dropped from the model (deleted on disk). */
7
+ removed: string[];
8
+ /** True when git was unavailable and every file was recomputed. */
9
+ fullFallback: boolean;
10
+ }
11
+ export declare function incrementalUpdate(root: string, base: ArchitectureModel): IncrementalResult;
12
+ //# sourceMappingURL=incremental.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../src/analyze/incremental.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AASxD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,iBAAiB,CAAC;IACzB,kDAAkD;IAClD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sDAAsD;IACtD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,YAAY,EAAE,OAAO,CAAC;CACvB;AAeD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,CAmE1F"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.incrementalUpdate = incrementalUpdate;
4
+ /**
5
+ * M6 — incremental update on change. Instead of re-analyzing the whole repo, use
6
+ * git to find what changed and patch only those files into the existing IR:
7
+ *
8
+ * - changed/added files → re-extract their components, edges, capabilities
9
+ * - deleted files → drop their components, edges (incl. dangling targets),
10
+ * and capabilities
11
+ * - external systems → rebuilt from the surviving + new edges
12
+ * - process / flow → re-derived (cheap: one graph traversal)
13
+ *
14
+ * Falls back to a full recompute when git isn't available. The result is
15
+ * equivalent (same element id sets) to a clean `analyze`, just faster.
16
+ */
17
+ const node_child_process_1 = require("node:child_process");
18
+ const walk_js_1 = require("./walk.js");
19
+ const tier0_js_1 = require("./tier0.js");
20
+ const tier1_js_1 = require("./tier1.js");
21
+ const derive_js_1 = require("./derive.js");
22
+ const stack_js_1 = require("./stack.js");
23
+ const relOf = (id) => id.slice(id.indexOf(":") + 1);
24
+ /** Source files changed vs HEAD (tracked) plus untracked new files; null if no git. */
25
+ function gitChangedFiles(root) {
26
+ try {
27
+ const tracked = (0, node_child_process_1.execFileSync)("git", ["-C", root, "diff", "--name-only", "HEAD"], { encoding: "utf8" });
28
+ const untracked = (0, node_child_process_1.execFileSync)("git", ["-C", root, "ls-files", "--others", "--exclude-standard"], {
29
+ encoding: "utf8",
30
+ });
31
+ return [...tracked.split("\n"), ...untracked.split("\n")].map((s) => s.trim()).filter(Boolean);
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ function incrementalUpdate(root, base) {
38
+ const current = (0, walk_js_1.walkSourceFiles)(root);
39
+ const currentSet = new Set(current);
40
+ const baseFiles = base.components.map((c) => relOf(c.id));
41
+ const baseSet = new Set(baseFiles);
42
+ const removed = baseFiles.filter((f) => !currentSet.has(f));
43
+ const removedSet = new Set(removed);
44
+ const gitChanged = gitChangedFiles(root);
45
+ let recomputed;
46
+ let fullFallback = false;
47
+ if (!gitChanged) {
48
+ recomputed = [...current];
49
+ fullFallback = true;
50
+ }
51
+ else {
52
+ const changed = new Set(gitChanged);
53
+ recomputed = current.filter((f) => changed.has(f) || !baseSet.has(f));
54
+ }
55
+ const recomputedSet = new Set(recomputed);
56
+ const drop = new Set([...removed, ...recomputed]); // files whose elements are rebuilt or removed
57
+ const model = structuredClone(base);
58
+ const internalSystemId = base.systems.find((s) => s.kind === "internal")?.id ?? `sys:${base.project}`;
59
+ // --- Components: keep untouched survivors; re-add recomputed ---
60
+ model.components = model.components.filter((c) => {
61
+ const f = relOf(c.id);
62
+ return currentSet.has(f) && !drop.has(f);
63
+ });
64
+ for (const f of recomputed)
65
+ model.components.push((0, tier0_js_1.componentFor)(f, internalSystemId));
66
+ // --- Relations: drop those from rebuilt/removed files or pointing at removed files; re-add recomputed ---
67
+ model.relations = model.relations.filter((r) => {
68
+ if (drop.has(relOf(r.from)))
69
+ return false;
70
+ if (r.to.startsWith("comp:") && removedSet.has(relOf(r.to)))
71
+ return false;
72
+ return true;
73
+ });
74
+ for (const f of recomputed) {
75
+ const { edges } = (0, tier1_js_1.extractFileEdges)(root, f, currentSet);
76
+ for (const e of edges)
77
+ model.relations.push(e);
78
+ }
79
+ // --- External systems: rebuild from surviving edges (reuse base metadata) ---
80
+ const referencedExt = new Set(model.relations.filter((r) => r.to.startsWith("sys:ext:")).map((r) => r.to));
81
+ const baseExt = new Map(base.systems.filter((s) => s.kind === "external").map((s) => [s.id, s]));
82
+ const internal = base.systems.find((s) => s.kind === "internal");
83
+ model.systems = internal ? [structuredClone(internal)] : [];
84
+ for (const id of [...referencedExt].sort()) {
85
+ const name = id.slice("sys:ext:".length);
86
+ model.systems.push(structuredClone(baseExt.get(id) ?? (0, tier1_js_1.buildExternalSystem)(name, name.startsWith("node:"))));
87
+ }
88
+ // --- Capabilities: keep untouched survivors; re-add recomputed ---
89
+ model.capabilities = model.capabilities.filter((cap) => {
90
+ const f = relOf(cap.componentIds[0] ?? "");
91
+ return currentSet.has(f) && !drop.has(f);
92
+ });
93
+ for (const f of recomputed)
94
+ for (const cap of (0, derive_js_1.extractFileCapabilities)(root, f))
95
+ model.capabilities.push(cap);
96
+ // --- Tech stack: cheap re-detect from package.json ---
97
+ model.technologies = (0, stack_js_1.detectStack)(root);
98
+ // --- Process + flow: cheap full re-derive over the patched graph ---
99
+ (0, derive_js_1.deriveProcessAndFlow)(root, model);
100
+ return { model, recomputed: [...recomputedSet], removed, fullFallback };
101
+ }
102
+ //# sourceMappingURL=incremental.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/analyze/incremental.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ArchitectureModel } from "../ir/types.js";
2
+ import { walkSourceFiles } from "./walk.js";
3
+ export declare function analyzeRepo(root: string): ArchitectureModel;
4
+ export { walkSourceFiles };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAsB5C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAU3D;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.walkSourceFiles = void 0;
4
+ exports.analyzeRepo = analyzeRepo;
5
+ /**
6
+ * Analysis pipeline orchestrator (tiered, cheapest-first).
7
+ * Tier 0 (repo structure) + 0.5 (tech stack) + Tier 1 (TS/JS static analysis) +
8
+ * structural derivation. Tier 2 (LLM) and Tier 3 (runtime) come later.
9
+ */
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = require("node:path");
12
+ const walk_js_1 = require("./walk.js");
13
+ Object.defineProperty(exports, "walkSourceFiles", { enumerable: true, get: function () { return walk_js_1.walkSourceFiles; } });
14
+ const tier0_js_1 = require("./tier0.js");
15
+ const tier1_js_1 = require("./tier1.js");
16
+ const derive_js_1 = require("./derive.js");
17
+ const stack_js_1 = require("./stack.js");
18
+ const datamodel_js_1 = require("./datamodel.js");
19
+ const endpoints_js_1 = require("./endpoints.js");
20
+ /** Read optional `.archmantic/config.json` → multi-repo system + project overrides. */
21
+ function applyConfig(root, model) {
22
+ const p = (0, node_path_1.join)(root, ".archmantic", "config.json");
23
+ if (!(0, node_fs_1.existsSync)(p))
24
+ return;
25
+ try {
26
+ const cfg = JSON.parse((0, node_fs_1.readFileSync)(p, "utf8"));
27
+ if (cfg.project)
28
+ model.project = cfg.project;
29
+ if (cfg.system)
30
+ model.system = cfg.system;
31
+ if (Array.isArray(cfg.consumes))
32
+ model.consumes = cfg.consumes;
33
+ }
34
+ catch {
35
+ /* ignore malformed config */
36
+ }
37
+ }
38
+ function analyzeRepo(root) {
39
+ const files = (0, walk_js_1.walkSourceFiles)(root);
40
+ const model = (0, tier0_js_1.tier0)(root, files);
41
+ (0, tier1_js_1.tier1)(root, files, model);
42
+ (0, derive_js_1.deriveSemantics)(root, files, model);
43
+ model.technologies = (0, stack_js_1.detectStack)(root);
44
+ model.dataEntities = (0, datamodel_js_1.detectDataModel)(root);
45
+ model.endpoints = (0, endpoints_js_1.detectEndpoints)(root);
46
+ applyConfig(root, model);
47
+ return model;
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":";;;AA8BA,kCAUC;AAxCD;;;;GAIG;AACH,qCAAmD;AACnD,yCAAiC;AAEjC,uCAA4C;AAkCnC,gGAlCA,yBAAe,OAkCA;AAjCxB,yCAAmC;AACnC,yCAAmC;AACnC,2CAA8C;AAC9C,yCAAyC;AACzC,iDAAiD;AACjD,iDAAiD;AAEjD,uFAAuF;AACvF,SAAS,WAAW,CAAC,IAAY,EAAE,KAAwB;IACzD,MAAM,CAAC,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IACnD,IAAI,CAAC,IAAA,oBAAU,EAAC,CAAC,CAAC;QAAE,OAAO;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,CAAC,EAAE,MAAM,CAAC,CAA+D,CAAC;QAC9G,IAAI,GAAG,CAAC,OAAO;YAAE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC7C,IAAI,GAAG,CAAC,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAA,yBAAe,EAAC,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAA,gBAAK,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,IAAA,gBAAK,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,IAAA,2BAAe,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,KAAK,CAAC,YAAY,GAAG,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;IACvC,KAAK,CAAC,YAAY,GAAG,IAAA,8BAAe,EAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,CAAC,SAAS,GAAG,IAAA,8BAAe,EAAC,IAAI,CAAC,CAAC;IACxC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Tiny text helpers shared by the Drizzle/SQL data-model parsers. */
2
+ /**
3
+ * Given `text` where `text[openIdx]` is an opening bracket, return the substring
4
+ * between it and its matching close bracket (exclusive). Bracket-depth aware;
5
+ * does not track string literals (fine for schema field blocks).
6
+ */
7
+ export declare function balancedBlock(text: string, openIdx: number, open: string, close: string): string;
8
+ /** Split on top-level commas only (ignoring commas nested in (), [], {}). */
9
+ export declare function splitTopLevel(s: string): string[];
10
+ //# sourceMappingURL=parse-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-util.d.ts","sourceRoot":"","sources":["../../src/analyze/parse-util.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAWhG;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBjD"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /** Tiny text helpers shared by the Drizzle/SQL data-model parsers. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.balancedBlock = balancedBlock;
5
+ exports.splitTopLevel = splitTopLevel;
6
+ /**
7
+ * Given `text` where `text[openIdx]` is an opening bracket, return the substring
8
+ * between it and its matching close bracket (exclusive). Bracket-depth aware;
9
+ * does not track string literals (fine for schema field blocks).
10
+ */
11
+ function balancedBlock(text, openIdx, open, close) {
12
+ let depth = 0;
13
+ for (let i = openIdx; i < text.length; i++) {
14
+ const ch = text[i];
15
+ if (ch === open)
16
+ depth++;
17
+ else if (ch === close) {
18
+ depth--;
19
+ if (depth === 0)
20
+ return text.slice(openIdx + 1, i);
21
+ }
22
+ }
23
+ return text.slice(openIdx + 1);
24
+ }
25
+ /** Split on top-level commas only (ignoring commas nested in (), [], {}). */
26
+ function splitTopLevel(s) {
27
+ const out = [];
28
+ let depth = 0;
29
+ let cur = "";
30
+ for (const ch of s) {
31
+ if (ch === "(" || ch === "[" || ch === "{")
32
+ depth++;
33
+ else if (ch === ")" || ch === "]" || ch === "}")
34
+ depth--;
35
+ if (ch === "," && depth === 0) {
36
+ out.push(cur);
37
+ cur = "";
38
+ }
39
+ else {
40
+ cur += ch;
41
+ }
42
+ }
43
+ if (cur.trim())
44
+ out.push(cur);
45
+ return out;
46
+ }
47
+ //# sourceMappingURL=parse-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-util.js","sourceRoot":"","sources":["../../src/analyze/parse-util.ts"],"names":[],"mappings":";AAAA,sEAAsE;;AAOtE,sCAWC;AAGD,sCAgBC;AAnCD;;;;GAIG;AACH,SAAgB,aAAa,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY,EAAE,KAAa;IACtF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,IAAI;YAAE,KAAK,EAAE,CAAC;aACpB,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YACtB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,6EAA6E;AAC7E,SAAgB,aAAa,CAAC,CAAS;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aAC/C,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;QACzD,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,GAAG,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,GAAG,IAAI,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type DataEntity } from "../ir/types.js";
2
+ /** Parse the repo's Prisma schema(s) into data-model entities. Empty if none. */
3
+ export declare function detectPrismaModel(root: string): DataEntity[];
4
+ //# sourceMappingURL=prisma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/analyze/prisma.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AAsBjE,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CA0D5D"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectPrismaModel = detectPrismaModel;
4
+ /**
5
+ * Data-model detection (Prisma-first) — the "what does it persist?" layer.
6
+ *
7
+ * Parses `*.prisma` schema files into DataEntity[] (models → entities, fields →
8
+ * columns, relations → edges), grounded with provenance to `schema.prisma:line`.
9
+ * Declarative source → high confidence, no LLM needed. Drizzle/TypeORM/SQL come
10
+ * later (see docs/ROADMAP.md); this is the first cut.
11
+ */
12
+ const node_fs_1 = require("node:fs");
13
+ const node_path_1 = require("node:path");
14
+ const tier0_js_1 = require("./tier0.js");
15
+ const fs_util_js_1 = require("./fs-util.js");
16
+ function finalize(cur, rel) {
17
+ for (const f of cur.fields)
18
+ if (cur.fkFields.has(f.name))
19
+ f.isForeignKey = true;
20
+ return {
21
+ id: `data:${cur.name}`,
22
+ name: cur.name,
23
+ fields: cur.fields,
24
+ provenance: [{ source: "code", ref: `${rel}:${cur.startLine}`, confidence: tier0_js_1.STRUCTURAL_CONFIDENCE }],
25
+ confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
26
+ };
27
+ }
28
+ /** Parse the repo's Prisma schema(s) into data-model entities. Empty if none. */
29
+ function detectPrismaModel(root) {
30
+ const files = (0, fs_util_js_1.findFiles)(root, (n) => n.endsWith(".prisma"));
31
+ if (!files.length)
32
+ return [];
33
+ const sources = files.map((f) => ({
34
+ rel: (0, node_path_1.relative)(root, f).split("\\").join("/"),
35
+ text: (0, node_fs_1.readFileSync)(f, "utf8"),
36
+ }));
37
+ // Pass 1: collect model names across all files (multi-file schemas cross-reference).
38
+ const modelNames = new Set();
39
+ const declRe = /^\s*model\s+(\w+)\s*\{/;
40
+ for (const s of sources) {
41
+ for (const line of s.text.split("\n")) {
42
+ const m = declRe.exec(line);
43
+ if (m)
44
+ modelNames.add(m[1]);
45
+ }
46
+ }
47
+ // Pass 2: parse each model block into fields.
48
+ const fieldRe = /^\s*(\w+)\s+([A-Za-z_]\w*)(\[\])?(\?)?(.*)$/;
49
+ const relFieldsRe = /@relation\([^)]*\bfields:\s*\[([^\]]*)\]/;
50
+ const entities = [];
51
+ for (const s of sources) {
52
+ const lines = s.text.split("\n");
53
+ let cur = null;
54
+ for (let i = 0; i < lines.length; i++) {
55
+ const line = lines[i].replace(/\/\/.*$/, ""); // strip line comments
56
+ if (!cur) {
57
+ const dm = declRe.exec(line);
58
+ if (dm)
59
+ cur = { name: dm[1], startLine: i + 1, fields: [], fkFields: new Set() };
60
+ continue;
61
+ }
62
+ if (/^\s*\}/.test(line)) {
63
+ entities.push(finalize(cur, s.rel));
64
+ cur = null;
65
+ continue;
66
+ }
67
+ if (/^\s*@@/.test(line))
68
+ continue; // block attributes (@@index, @@map…)
69
+ const fm = fieldRe.exec(line);
70
+ if (!fm)
71
+ continue;
72
+ const name = fm[1];
73
+ const baseType = fm[2];
74
+ const attrs = fm[5] ?? "";
75
+ const field = { name, type: baseType };
76
+ if (fm[3])
77
+ field.list = true;
78
+ if (fm[4])
79
+ field.optional = true;
80
+ if (/@id\b/.test(attrs))
81
+ field.isId = true;
82
+ if (/@unique\b/.test(attrs))
83
+ field.isUnique = true;
84
+ if (modelNames.has(baseType))
85
+ field.relationTo = `data:${baseType}`;
86
+ const rf = relFieldsRe.exec(attrs);
87
+ if (rf)
88
+ for (const fk of (rf[1] ?? "").split(",").map((x) => x.trim()).filter(Boolean))
89
+ cur.fkFields.add(fk);
90
+ cur.fields.push(field);
91
+ }
92
+ if (cur)
93
+ entities.push(finalize(cur, s.rel)); // unclosed block at EOF (defensive)
94
+ }
95
+ return entities;
96
+ }
97
+ //# sourceMappingURL=prisma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/analyze/prisma.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type DataEntity } from "../ir/types.js";
2
+ export declare function detectSqlModel(root: string): DataEntity[];
3
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/analyze/sql.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AA4DjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAiCzD"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectSqlModel = detectSqlModel;
4
+ /**
5
+ * SQL DDL data-model detection.
6
+ *
7
+ * Parses `CREATE TABLE` statements in `*.sql` files (migrations, schema dumps)
8
+ * into DataEntity[]: columns with PK/unique/nullable, and relations from inline
9
+ * or table-level `REFERENCES`/`FOREIGN KEY`. Grounded to `file:line`. Handles
10
+ * Postgres/MySQL/SQLite dialects loosely. See docs/ROADMAP.md.
11
+ */
12
+ const node_fs_1 = require("node:fs");
13
+ const node_path_1 = require("node:path");
14
+ const tier0_js_1 = require("./tier0.js");
15
+ const fs_util_js_1 = require("./fs-util.js");
16
+ const parse_util_js_1 = require("./parse-util.js");
17
+ const unquote = (s) => s.trim().replace(/^["'`\[]+|["'`\]]+$/g, "");
18
+ const CONSTRAINT = /^(PRIMARY\s+KEY|FOREIGN\s+KEY|CONSTRAINT|UNIQUE|CHECK|KEY|INDEX)\b/i;
19
+ function parseColumns(body) {
20
+ const fields = [];
21
+ const pk = new Set();
22
+ const uniq = new Set();
23
+ const fk = new Map();
24
+ for (const raw of (0, parse_util_js_1.splitTopLevel)(body)) {
25
+ const def = raw.trim();
26
+ if (!def)
27
+ continue;
28
+ if (CONSTRAINT.test(def)) {
29
+ const p = /PRIMARY\s+KEY\s*\(([^)]*)\)/i.exec(def);
30
+ if (p)
31
+ for (const c of p[1].split(","))
32
+ pk.add(unquote(c));
33
+ const u = /UNIQUE\s*(?:KEY\s+\w+\s*)?\(([^)]*)\)/i.exec(def);
34
+ if (u)
35
+ for (const c of u[1].split(","))
36
+ uniq.add(unquote(c));
37
+ const f = /FOREIGN\s+KEY\s*\(([^)]*)\)\s*REFERENCES\s+["'`]?(\w+)/i.exec(def);
38
+ if (f)
39
+ fk.set(unquote(f[1].split(",")[0]), f[2]);
40
+ continue;
41
+ }
42
+ const cm = /^["'`\[]?(\w+)["'`\]]?\s+([A-Za-z]\w*(?:\s*\([^)]*\))?)/.exec(def);
43
+ if (!cm)
44
+ continue;
45
+ const field = { name: cm[1], type: cm[2].replace(/\s+/g, "") };
46
+ const isPk = /\bPRIMARY\s+KEY\b/i.test(def);
47
+ if (isPk)
48
+ field.isId = true;
49
+ if (/\bUNIQUE\b/i.test(def))
50
+ field.isUnique = true;
51
+ if (!/\bNOT\s+NULL\b/i.test(def) && !isPk)
52
+ field.optional = true;
53
+ const ref = /\bREFERENCES\s+["'`]?(\w+)/i.exec(def);
54
+ if (ref) {
55
+ field.isForeignKey = true;
56
+ field.relationTo = `data:${ref[1]}`;
57
+ }
58
+ fields.push(field);
59
+ }
60
+ // Apply table-level constraints to the parsed columns.
61
+ for (const f of fields) {
62
+ if (pk.has(f.name)) {
63
+ f.isId = true;
64
+ delete f.optional;
65
+ }
66
+ if (uniq.has(f.name))
67
+ f.isUnique = true;
68
+ const target = fk.get(f.name);
69
+ if (target) {
70
+ f.isForeignKey = true;
71
+ f.relationTo = `data:${target}`;
72
+ }
73
+ }
74
+ return fields;
75
+ }
76
+ function detectSqlModel(root) {
77
+ const sources = (0, fs_util_js_1.findFiles)(root, (n) => n.endsWith(".sql")).map((f) => ({
78
+ rel: (0, node_path_1.relative)(root, f).split("\\").join("/"),
79
+ text: (0, node_fs_1.readFileSync)(f, "utf8"),
80
+ }));
81
+ const createRe = /create\s+table\s+(?:if\s+not\s+exists\s+)?["'`\[]?([A-Za-z_]\w*)["'`\]]?\s*\(/gi;
82
+ const entities = [];
83
+ const seen = new Set();
84
+ for (const s of sources) {
85
+ createRe.lastIndex = 0;
86
+ let m;
87
+ while ((m = createRe.exec(s.text))) {
88
+ const name = m[1];
89
+ if (seen.has(name))
90
+ continue; // first definition wins (e.g. across migrations)
91
+ seen.add(name);
92
+ const body = (0, parse_util_js_1.balancedBlock)(s.text, createRe.lastIndex - 1, "(", ")");
93
+ entities.push({
94
+ id: `data:${name}`,
95
+ name,
96
+ fields: parseColumns(body),
97
+ provenance: [
98
+ {
99
+ source: "code",
100
+ ref: `${s.rel}:${s.text.slice(0, m.index).split("\n").length}`,
101
+ confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
102
+ },
103
+ ],
104
+ confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
105
+ });
106
+ }
107
+ }
108
+ return entities;
109
+ }
110
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/analyze/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Technology } from "../ir/types.js";
2
+ /** Detect classified technologies from the repo's package.json. */
3
+ export declare function detectStack(root: string): Technology[];
4
+ //# sourceMappingURL=stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/analyze/stack.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA4DjD,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CA0BtD"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectStack = detectStack;
4
+ /**
5
+ * Tier 0.5 — tech-stack detection ("what is this built with?").
6
+ *
7
+ * Classifies package.json dependencies into framework/UI/database/etc. via a
8
+ * curated dictionary, grounded in package.json. Deterministic and cheap; the
9
+ * Tier-2 LLM pass can later enrich unknown libraries.
10
+ */
11
+ const node_fs_1 = require("node:fs");
12
+ const node_path_1 = require("node:path");
13
+ const tier0_js_1 = require("./tier0.js");
14
+ /** Curated package → {category, display name}. Scoped packages match on the scope/name. */
15
+ const KNOWN = {
16
+ next: { cat: "framework", name: "Next.js" },
17
+ react: { cat: "ui", name: "React" },
18
+ "react-dom": { cat: "ui", name: "React DOM" },
19
+ vue: { cat: "framework", name: "Vue" },
20
+ svelte: { cat: "framework", name: "Svelte" },
21
+ "@angular/core": { cat: "framework", name: "Angular" },
22
+ express: { cat: "framework", name: "Express" },
23
+ fastify: { cat: "framework", name: "Fastify" },
24
+ "@nestjs/core": { cat: "framework", name: "NestJS" },
25
+ koa: { cat: "framework", name: "Koa" },
26
+ "@hono/node-server": { cat: "framework", name: "Hono" },
27
+ hono: { cat: "framework", name: "Hono" },
28
+ tailwindcss: { cat: "ui", name: "Tailwind CSS" },
29
+ "bpmn-js": { cat: "ui", name: "bpmn-js" },
30
+ mermaid: { cat: "ui", name: "Mermaid" },
31
+ "lucide-react": { cat: "ui", name: "lucide" },
32
+ shadcn: { cat: "ui", name: "shadcn/ui" },
33
+ "@base-ui/react": { cat: "ui", name: "Base UI" },
34
+ pg: { cat: "database", name: "PostgreSQL (pg)" },
35
+ "@neondatabase/serverless": { cat: "database", name: "Neon" },
36
+ mysql2: { cat: "database", name: "MySQL" },
37
+ mongodb: { cat: "database", name: "MongoDB" },
38
+ redis: { cat: "database", name: "Redis" },
39
+ prisma: { cat: "orm", name: "Prisma" },
40
+ "@prisma/client": { cat: "orm", name: "Prisma" },
41
+ "drizzle-orm": { cat: "orm", name: "Drizzle" },
42
+ mongoose: { cat: "orm", name: "Mongoose" },
43
+ typeorm: { cat: "orm", name: "TypeORM" },
44
+ "@clerk/nextjs": { cat: "auth", name: "Clerk" },
45
+ "next-auth": { cat: "auth", name: "Auth.js" },
46
+ "@auth/core": { cat: "auth", name: "Auth.js" },
47
+ passport: { cat: "auth", name: "Passport" },
48
+ "@anthropic-ai/sdk": { cat: "ai", name: "Anthropic" },
49
+ openai: { cat: "ai", name: "OpenAI" },
50
+ "@modelcontextprotocol/sdk": { cat: "ai", name: "MCP SDK" },
51
+ "ai": { cat: "ai", name: "Vercel AI SDK" },
52
+ vitest: { cat: "testing", name: "Vitest" },
53
+ jest: { cat: "testing", name: "Jest" },
54
+ "@playwright/test": { cat: "testing", name: "Playwright" },
55
+ mocha: { cat: "testing", name: "Mocha" },
56
+ typescript: { cat: "language", name: "TypeScript" },
57
+ vite: { cat: "build", name: "Vite" },
58
+ webpack: { cat: "build", name: "webpack" },
59
+ esbuild: { cat: "build", name: "esbuild" },
60
+ turbo: { cat: "build", name: "Turborepo" },
61
+ stripe: { cat: "infra", name: "Stripe" },
62
+ };
63
+ /** Detect classified technologies from the repo's package.json. */
64
+ function detectStack(root) {
65
+ const pkgPath = (0, node_path_1.join)(root, "package.json");
66
+ if (!(0, node_fs_1.existsSync)(pkgPath))
67
+ return [];
68
+ let pkg = {};
69
+ try {
70
+ pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf8"));
71
+ }
72
+ catch {
73
+ return [];
74
+ }
75
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
76
+ const techs = [];
77
+ const seen = new Set();
78
+ for (const dep of Object.keys(deps)) {
79
+ const hit = KNOWN[dep];
80
+ if (!hit || seen.has(hit.name))
81
+ continue;
82
+ seen.add(hit.name);
83
+ techs.push({
84
+ id: `tech:${dep}`,
85
+ name: hit.name,
86
+ category: hit.cat,
87
+ description: `${hit.cat} (${dep})`,
88
+ provenance: [{ source: "repo", ref: "package.json", confidence: tier0_js_1.STRUCTURAL_CONFIDENCE }],
89
+ confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
90
+ });
91
+ }
92
+ return techs;
93
+ }
94
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/analyze/stack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type ArchitectureModel, type Component } from "../ir/types.js";
2
+ /** Confidence for deterministic structural facts (Tier 0/1). */
3
+ export declare const STRUCTURAL_CONFIDENCE = 0.95;
4
+ /** One Component per source file (reused by Tier 0 and the incremental updater). */
5
+ export declare function componentFor(rel: string, systemId: string): Component;
6
+ export declare function tier0(root: string, sourceFiles: string[]): ArchitectureModel;
7
+ //# sourceMappingURL=tier0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier0.d.ts","sourceRoot":"","sources":["../../src/analyze/tier0.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AAE1F,gEAAgE;AAChE,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CASrE;AAOD,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAgC5E"}