@tienne/gestalt 0.88.0 → 0.89.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 (197) hide show
  1. package/CLAUDE.md +6 -2
  2. package/README.ko.md +2 -1
  3. package/README.md +3 -1
  4. package/dist/package.json +2 -1
  5. package/dist/plugin/skills/_shared/proactive-routing.md +1 -0
  6. package/dist/plugin/skills/architecture/SKILL.md +913 -0
  7. package/dist/schemas/architecture-ir.schema.json +596 -0
  8. package/dist/src/architecture/canvas-geometry.d.ts +40 -0
  9. package/dist/src/architecture/canvas-geometry.d.ts.map +1 -0
  10. package/dist/src/architecture/canvas-geometry.js +212 -0
  11. package/dist/src/architecture/canvas-geometry.js.map +1 -0
  12. package/dist/src/architecture/codeowners.d.ts +16 -0
  13. package/dist/src/architecture/codeowners.d.ts.map +1 -0
  14. package/dist/src/architecture/codeowners.js +58 -0
  15. package/dist/src/architecture/codeowners.js.map +1 -0
  16. package/dist/src/architecture/compare-layout.d.ts +27 -0
  17. package/dist/src/architecture/compare-layout.d.ts.map +1 -0
  18. package/dist/src/architecture/compare-layout.js +72 -0
  19. package/dist/src/architecture/compare-layout.js.map +1 -0
  20. package/dist/src/architecture/dataflow-layout.d.ts +29 -0
  21. package/dist/src/architecture/dataflow-layout.d.ts.map +1 -0
  22. package/dist/src/architecture/dataflow-layout.js +229 -0
  23. package/dist/src/architecture/dataflow-layout.js.map +1 -0
  24. package/dist/src/architecture/doc-fresh.d.ts +31 -0
  25. package/dist/src/architecture/doc-fresh.d.ts.map +1 -0
  26. package/dist/src/architecture/doc-fresh.js +84 -0
  27. package/dist/src/architecture/doc-fresh.js.map +1 -0
  28. package/dist/src/architecture/doc-link.d.ts +84 -0
  29. package/dist/src/architecture/doc-link.d.ts.map +1 -0
  30. package/dist/src/architecture/doc-link.js +396 -0
  31. package/dist/src/architecture/doc-link.js.map +1 -0
  32. package/dist/src/architecture/doc-routes.d.ts +39 -0
  33. package/dist/src/architecture/doc-routes.d.ts.map +1 -0
  34. package/dist/src/architecture/doc-routes.js +123 -0
  35. package/dist/src/architecture/doc-routes.js.map +1 -0
  36. package/dist/src/architecture/doc-scan.d.ts +107 -0
  37. package/dist/src/architecture/doc-scan.d.ts.map +1 -0
  38. package/dist/src/architecture/doc-scan.js +617 -0
  39. package/dist/src/architecture/doc-scan.js.map +1 -0
  40. package/dist/src/architecture/doc-stale.d.ts +32 -0
  41. package/dist/src/architecture/doc-stale.d.ts.map +1 -0
  42. package/dist/src/architecture/doc-stale.js +60 -0
  43. package/dist/src/architecture/doc-stale.js.map +1 -0
  44. package/dist/src/architecture/drilldown.d.ts +51 -0
  45. package/dist/src/architecture/drilldown.d.ts.map +1 -0
  46. package/dist/src/architecture/drilldown.js +1160 -0
  47. package/dist/src/architecture/drilldown.js.map +1 -0
  48. package/dist/src/architecture/endpoint-match.d.ts +43 -0
  49. package/dist/src/architecture/endpoint-match.d.ts.map +1 -0
  50. package/dist/src/architecture/endpoint-match.js +133 -0
  51. package/dist/src/architecture/endpoint-match.js.map +1 -0
  52. package/dist/src/architecture/flow-layout.d.ts +79 -0
  53. package/dist/src/architecture/flow-layout.d.ts.map +1 -0
  54. package/dist/src/architecture/flow-layout.js +519 -0
  55. package/dist/src/architecture/flow-layout.js.map +1 -0
  56. package/dist/src/architecture/focus.d.ts +14 -0
  57. package/dist/src/architecture/focus.d.ts.map +1 -0
  58. package/dist/src/architecture/focus.js +107 -0
  59. package/dist/src/architecture/focus.js.map +1 -0
  60. package/dist/src/architecture/global-context.d.ts +23 -0
  61. package/dist/src/architecture/global-context.d.ts.map +1 -0
  62. package/dist/src/architecture/global-context.js +67 -0
  63. package/dist/src/architecture/global-context.js.map +1 -0
  64. package/dist/src/architecture/html-client.d.ts +35 -0
  65. package/dist/src/architecture/html-client.d.ts.map +1 -0
  66. package/dist/src/architecture/html-client.js +1852 -0
  67. package/dist/src/architecture/html-client.js.map +1 -0
  68. package/dist/src/architecture/html-renderer.d.ts +22 -0
  69. package/dist/src/architecture/html-renderer.d.ts.map +1 -0
  70. package/dist/src/architecture/html-renderer.js +1290 -0
  71. package/dist/src/architecture/html-renderer.js.map +1 -0
  72. package/dist/src/architecture/html-theme.d.ts +25 -0
  73. package/dist/src/architecture/html-theme.d.ts.map +1 -0
  74. package/dist/src/architecture/html-theme.js +681 -0
  75. package/dist/src/architecture/html-theme.js.map +1 -0
  76. package/dist/src/architecture/index.d.ts +9 -0
  77. package/dist/src/architecture/index.d.ts.map +1 -0
  78. package/dist/src/architecture/index.js +9 -0
  79. package/dist/src/architecture/index.js.map +1 -0
  80. package/dist/src/architecture/ir-schema.d.ts +1832 -0
  81. package/dist/src/architecture/ir-schema.d.ts.map +1 -0
  82. package/dist/src/architecture/ir-schema.js +343 -0
  83. package/dist/src/architecture/ir-schema.js.map +1 -0
  84. package/dist/src/architecture/kind-text.d.ts +21 -0
  85. package/dist/src/architecture/kind-text.d.ts.map +1 -0
  86. package/dist/src/architecture/kind-text.js +42 -0
  87. package/dist/src/architecture/kind-text.js.map +1 -0
  88. package/dist/src/architecture/layout.d.ts +227 -0
  89. package/dist/src/architecture/layout.d.ts.map +1 -0
  90. package/dist/src/architecture/layout.js +627 -0
  91. package/dist/src/architecture/layout.js.map +1 -0
  92. package/dist/src/architecture/mcp-tool-match.d.ts +49 -0
  93. package/dist/src/architecture/mcp-tool-match.d.ts.map +1 -0
  94. package/dist/src/architecture/mcp-tool-match.js +53 -0
  95. package/dist/src/architecture/mcp-tool-match.js.map +1 -0
  96. package/dist/src/architecture/merge.d.ts +54 -0
  97. package/dist/src/architecture/merge.d.ts.map +1 -0
  98. package/dist/src/architecture/merge.js +681 -0
  99. package/dist/src/architecture/merge.js.map +1 -0
  100. package/dist/src/architecture/micro-app.d.ts +20 -0
  101. package/dist/src/architecture/micro-app.d.ts.map +1 -0
  102. package/dist/src/architecture/micro-app.js +41 -0
  103. package/dist/src/architecture/micro-app.js.map +1 -0
  104. package/dist/src/architecture/name-ref-match.d.ts +43 -0
  105. package/dist/src/architecture/name-ref-match.d.ts.map +1 -0
  106. package/dist/src/architecture/name-ref-match.js +127 -0
  107. package/dist/src/architecture/name-ref-match.js.map +1 -0
  108. package/dist/src/architecture/packs/data.d.ts +109 -0
  109. package/dist/src/architecture/packs/data.d.ts.map +1 -0
  110. package/dist/src/architecture/packs/data.js +64 -0
  111. package/dist/src/architecture/packs/data.js.map +1 -0
  112. package/dist/src/architecture/packs/generic.d.ts +47 -0
  113. package/dist/src/architecture/packs/generic.d.ts.map +1 -0
  114. package/dist/src/architecture/packs/generic.js +35 -0
  115. package/dist/src/architecture/packs/generic.js.map +1 -0
  116. package/dist/src/architecture/packs/harness.d.ts +96 -0
  117. package/dist/src/architecture/packs/harness.d.ts.map +1 -0
  118. package/dist/src/architecture/packs/harness.js +66 -0
  119. package/dist/src/architecture/packs/harness.js.map +1 -0
  120. package/dist/src/architecture/packs/index.d.ts +840 -0
  121. package/dist/src/architecture/packs/index.d.ts.map +1 -0
  122. package/dist/src/architecture/packs/index.js +87 -0
  123. package/dist/src/architecture/packs/index.js.map +1 -0
  124. package/dist/src/architecture/packs/infra.d.ts +91 -0
  125. package/dist/src/architecture/packs/infra.d.ts.map +1 -0
  126. package/dist/src/architecture/packs/infra.js +57 -0
  127. package/dist/src/architecture/packs/infra.js.map +1 -0
  128. package/dist/src/architecture/packs/knowledge.d.ts +72 -0
  129. package/dist/src/architecture/packs/knowledge.d.ts.map +1 -0
  130. package/dist/src/architecture/packs/knowledge.js +58 -0
  131. package/dist/src/architecture/packs/knowledge.js.map +1 -0
  132. package/dist/src/architecture/packs/process.d.ts +87 -0
  133. package/dist/src/architecture/packs/process.d.ts.map +1 -0
  134. package/dist/src/architecture/packs/process.js +52 -0
  135. package/dist/src/architecture/packs/process.js.map +1 -0
  136. package/dist/src/architecture/packs/render-classes.d.ts +11 -0
  137. package/dist/src/architecture/packs/render-classes.d.ts.map +1 -0
  138. package/dist/src/architecture/packs/render-classes.js +92 -0
  139. package/dist/src/architecture/packs/render-classes.js.map +1 -0
  140. package/dist/src/architecture/packs/types.d.ts +66 -0
  141. package/dist/src/architecture/packs/types.d.ts.map +1 -0
  142. package/dist/src/architecture/packs/types.js +18 -0
  143. package/dist/src/architecture/packs/types.js.map +1 -0
  144. package/dist/src/architecture/packs/web-product.d.ts +348 -0
  145. package/dist/src/architecture/packs/web-product.d.ts.map +1 -0
  146. package/dist/src/architecture/packs/web-product.js +226 -0
  147. package/dist/src/architecture/packs/web-product.js.map +1 -0
  148. package/dist/src/architecture/sequence-layout.d.ts +50 -0
  149. package/dist/src/architecture/sequence-layout.d.ts.map +1 -0
  150. package/dist/src/architecture/sequence-layout.js +140 -0
  151. package/dist/src/architecture/sequence-layout.js.map +1 -0
  152. package/dist/src/architecture/service-facts.d.ts +30 -0
  153. package/dist/src/architecture/service-facts.d.ts.map +1 -0
  154. package/dist/src/architecture/service-facts.js +88 -0
  155. package/dist/src/architecture/service-facts.js.map +1 -0
  156. package/dist/src/architecture/store.d.ts +50 -0
  157. package/dist/src/architecture/store.d.ts.map +1 -0
  158. package/dist/src/architecture/store.js +320 -0
  159. package/dist/src/architecture/store.js.map +1 -0
  160. package/dist/src/architecture/types.d.ts +400 -0
  161. package/dist/src/architecture/types.d.ts.map +1 -0
  162. package/dist/src/architecture/types.js +75 -0
  163. package/dist/src/architecture/types.js.map +1 -0
  164. package/dist/src/architecture/validator.d.ts +65 -0
  165. package/dist/src/architecture/validator.d.ts.map +1 -0
  166. package/dist/src/architecture/validator.js +1249 -0
  167. package/dist/src/architecture/validator.js.map +1 -0
  168. package/dist/src/core/errors.d.ts +4 -0
  169. package/dist/src/core/errors.d.ts.map +1 -1
  170. package/dist/src/core/errors.js +8 -0
  171. package/dist/src/core/errors.js.map +1 -1
  172. package/dist/src/mcp/schemas.d.ts +317 -0
  173. package/dist/src/mcp/schemas.d.ts.map +1 -1
  174. package/dist/src/mcp/schemas.js +151 -0
  175. package/dist/src/mcp/schemas.js.map +1 -1
  176. package/dist/src/mcp/server.d.ts.map +1 -1
  177. package/dist/src/mcp/server.js +7 -1
  178. package/dist/src/mcp/server.js.map +1 -1
  179. package/dist/src/mcp/tools/architecture-passthrough.d.ts +9 -0
  180. package/dist/src/mcp/tools/architecture-passthrough.d.ts.map +1 -0
  181. package/dist/src/mcp/tools/architecture-passthrough.js +587 -0
  182. package/dist/src/mcp/tools/architecture-passthrough.js.map +1 -0
  183. package/dist/src/utils/claude-projects.d.ts +19 -0
  184. package/dist/src/utils/claude-projects.d.ts.map +1 -0
  185. package/dist/src/utils/claude-projects.js +157 -0
  186. package/dist/src/utils/claude-projects.js.map +1 -0
  187. package/dist/src/utils/read-only-tools.d.ts +19 -0
  188. package/dist/src/utils/read-only-tools.d.ts.map +1 -0
  189. package/dist/src/utils/read-only-tools.js +132 -0
  190. package/dist/src/utils/read-only-tools.js.map +1 -0
  191. package/package.json +2 -1
  192. package/plugin/.codex-plugin/plugin.json +1 -1
  193. package/plugin/.mcp.json +1 -1
  194. package/plugin/mcp.json +1 -1
  195. package/plugin/skills/_shared/proactive-routing.md +1 -0
  196. package/plugin/skills/architecture/SKILL.md +913 -0
  197. package/schemas/architecture-ir.schema.json +596 -0
@@ -0,0 +1,587 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { dirname, isAbsolute, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { collectGlobalContext } from '../../architecture/global-context.js';
6
+ import { buildKnowledgeIr, scanDocRoots, summarizeScan, } from '../../architecture/doc-scan.js';
7
+ import { analyzeDocRoutes } from '../../architecture/doc-routes.js';
8
+ import { docCommitDates, summarizeFreshness } from '../../architecture/doc-fresh.js';
9
+ import { findStaleDocs } from '../../architecture/doc-stale.js';
10
+ import { ownersOf, readCodeowners } from '../../architecture/codeowners.js';
11
+ import { linkDocs } from '../../architecture/doc-link.js';
12
+ import { matchEndpoints } from '../../architecture/endpoint-match.js';
13
+ import { matchMcpTools } from '../../architecture/mcp-tool-match.js';
14
+ import { matchNameRefs } from '../../architecture/name-ref-match.js';
15
+ import { computeDrilldown, shouldDrillDown } from '../../architecture/drilldown.js';
16
+ import { renderArchitectureHtml, renderDrilldownHtml } from '../../architecture/html-renderer.js';
17
+ import { parseArchitectureIr } from '../../architecture/ir-schema.js';
18
+ import { assignStages, computeLayout } from '../../architecture/layout.js';
19
+ import { mergeArchitectureIrs } from '../../architecture/merge.js';
20
+ import { ArchitectureStore, mergeWithPrevious, previousRunSummary, } from '../../architecture/store.js';
21
+ import { ARCHITECTURE_VIEWS, } from '../../architecture/types.js';
22
+ import { validateArchitectureIr, } from '../../architecture/validator.js';
23
+ import { writeJsonAtomic } from '../../core/json-file.js';
24
+ import { log } from '../../core/log.js';
25
+ import { READ_ONLY_ALLOW_WORDS, READ_ONLY_CLI_VERBS, READ_ONLY_DENY_WORDS, filterReadOnlyTools, } from '../../utils/read-only-tools.js';
26
+ // dist/src/mcp/tools와 src/mcp/tools 둘 다 세 단계 위가 패키지 루트다. postbuild가 schemas를 dist로 복사한다
27
+ const SCHEMA_PATH = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'schemas', 'architecture-ir.schema.json');
28
+ function fail(code, message) {
29
+ return { ok: false, errors: [{ code, message }] };
30
+ }
31
+ function ratio(numerator, denominator) {
32
+ return denominator === 0 ? null : numerator / denominator;
33
+ }
34
+ function readIrFile(path, repoRoot) {
35
+ const abs = resolve(repoRoot, path);
36
+ try {
37
+ return { ok: true, raw: JSON.parse(readFileSync(abs, 'utf-8')) };
38
+ }
39
+ catch (e) {
40
+ return fail('IR_READ_ERROR', `IR 파일 "${abs}"를 읽지 못했다: ${e.message}`);
41
+ }
42
+ }
43
+ function parseIr(raw, label = '') {
44
+ const parsed = parseArchitectureIr(raw);
45
+ if (parsed.ok)
46
+ return { ok: true, ir: parsed.value };
47
+ const issues = parsed.error.issues.length > 0 ? parsed.error.issues : [parsed.error.message];
48
+ return {
49
+ ok: false,
50
+ errors: issues.map((message) => ({ code: 'IR_PARSE_ERROR', message: `${label}${message}` })),
51
+ };
52
+ }
53
+ function prepareIr(input, repoRoot) {
54
+ let raw = input.ir;
55
+ if (raw === undefined && input.irPath !== undefined) {
56
+ const read = readIrFile(input.irPath, repoRoot);
57
+ if (!read.ok)
58
+ return read;
59
+ raw = read.raw;
60
+ }
61
+ if (raw === undefined)
62
+ return fail('MISSING_INPUT', `${input.action}에는 ir이나 irPath가 필요하다.`);
63
+ const parsed = parseIr(raw);
64
+ if (!parsed.ok)
65
+ return parsed;
66
+ const ir = parsed.ir;
67
+ if (input.view !== undefined && input.view !== ir.view) {
68
+ return fail('VIEW_MISMATCH', `view(${input.view})와 ir.view(${ir.view})가 다르다.`);
69
+ }
70
+ return { ok: true, ir, repoRoot };
71
+ }
72
+ function validate(ir, repoRoot, checkFiles) {
73
+ // IR의 root는 상대경로로 적히기도 한다. 서버 cwd가 아니라 repoRoot 기준으로 풀어야 근거 파일을 찾는다
74
+ const repoRoots = Object.fromEntries(ir.repos.flatMap((r) => r.root === undefined ? [] : [[r.id, isAbsolute(r.root) ? r.root : resolve(repoRoot, r.root)]]));
75
+ return validateArchitectureIr(ir, { repoRoots, checkFiles });
76
+ }
77
+ function asFailure(result) {
78
+ return { ok: false, errors: result.errors };
79
+ }
80
+ function computeStats(validated) {
81
+ const { ir, drawableNodeIds, drawableEdgeIds, drawableStepIds, drawableTransitionIds, autoUnresolved, } = validated;
82
+ const drawnEdges = ir.edges.filter((e) => drawableEdgeIds.has(e.id));
83
+ const kindOf = new Map(ir.nodes.map((n) => [n.id, n.kind]));
84
+ const drawnNodes = ir.nodes.filter((n) => drawableNodeIds.has(n.id));
85
+ const screens = drawnNodes.filter((n) => n.kind === 'screen');
86
+ const screensToEndpoint = new Set(drawnEdges.filter((e) => kindOf.get(e.to) === 'endpoint').map((e) => e.from));
87
+ const endpoints = drawnNodes.filter((n) => n.kind === 'endpoint');
88
+ const handledEndpoints = new Set(drawnEdges
89
+ .filter((e) => e.kind === 'handles' && kindOf.get(e.to) === 'app_module')
90
+ .map((e) => e.from));
91
+ const staged = assignStages(ir);
92
+ const open = [...ir.unresolved, ...autoUnresolved].filter((q) => q.answer === undefined || q.answer.trim() === '');
93
+ return {
94
+ nodes: ir.nodes.length,
95
+ edges: ir.edges.length,
96
+ drawnEdges: drawnEdges.length,
97
+ droppedEdges: ir.edges.length - drawnEdges.length,
98
+ unresolvedOpen: open.length,
99
+ screenToEndpointRatio: ratio(screens.filter((n) => screensToEndpoint.has(n.id)).length, screens.length),
100
+ endpointMatchRatio: ratio(endpoints.filter((n) => handledEndpoints.has(n.id)).length, endpoints.length),
101
+ // 흐름이 없는 IR은 키를 안 넣는다. 기존 응답을 읽는 쪽이 그대로 돈다
102
+ ...(ir.flows !== undefined && ir.flows.length > 0
103
+ ? {
104
+ flows: ir.flows.length,
105
+ drawnSteps: drawableStepIds.size,
106
+ drawnTransitions: drawableTransitionIds.size,
107
+ }
108
+ : {}),
109
+ // 세션이 구간 규칙을 빠뜨린 노드는 맨 끝 "그 밖"으로 간다. 숫자로 알려야 세션이 규칙을 보탠다
110
+ ...(staged !== undefined
111
+ ? {
112
+ stages: ir.stages.length,
113
+ unstagedNodes: drawnNodes.filter((n) => staged.indexOf.get(n.id) === ir.stages.length)
114
+ .length,
115
+ }
116
+ : {}),
117
+ };
118
+ }
119
+ function handleStart(input, repoRoot, opts) {
120
+ if (input.view === undefined) {
121
+ return fail('MISSING_INPUT', `start에는 view가 필요하다 (${ARCHITECTURE_VIEWS.join(', ')}).`);
122
+ }
123
+ const prev = new ArchitectureStore(repoRoot).load(input.view);
124
+ let previous = null;
125
+ if (prev) {
126
+ const { sourcesUsed: _sourcesUsed, ...rest } = previousRunSummary(prev);
127
+ previous = rest;
128
+ }
129
+ return {
130
+ view: input.view,
131
+ previous,
132
+ previousSourcesUsed: prev?.sourcesUsed ?? [],
133
+ contextCandidates: collectGlobalContext({ repoRoot, ...opts }),
134
+ schemaPath: SCHEMA_PATH,
135
+ readOnlyRule: { allow: [...READ_ONLY_ALLOW_WORDS], deny: [...READ_ONLY_DENY_WORDS] },
136
+ readOnlyCliRule: { verbs: [...READ_ONLY_CLI_VERBS] },
137
+ nextAction: 'filter_tools',
138
+ instructions: [
139
+ 'contextCandidates 중 exists가 true인 파일을 읽어 맥락을 모은다. private 파일 내용은 excerpt에 옮기지 않는다.',
140
+ '세션에 붙은 MCP 도구 이름을 filter_tools에 넘겨 allowed만 쓴다. ambiguous는 부르지 않는다.',
141
+ 'schemaPath의 JSON Schema대로 IR을 만든다. 실선 엣지에는 code나 spec 근거가 있어야 한다.',
142
+ '클라우드 조회 결과는 live 근거로 싣는다. 명령의 하위 명령은 readOnlyCliRule.verbs로 시작해야 하고 응답 원문은 excerpt에 넣지 않는다.',
143
+ 'FE 호출과 BE 라우트가 모이면 match_endpoints로 이어 붙이고, validate로 확인한 뒤 render한다.',
144
+ ],
145
+ };
146
+ }
147
+ function handleFilterTools(input) {
148
+ if (input.toolNames === undefined) {
149
+ return fail('MISSING_INPUT', 'filter_tools에는 toolNames가 필요하다.');
150
+ }
151
+ return filterReadOnlyTools(input.toolNames);
152
+ }
153
+ function handleMatchEndpoints(input) {
154
+ const http = input.feCalls !== undefined && input.beRoutes !== undefined;
155
+ const mcp = input.skillToolCalls !== undefined && input.serverTools !== undefined;
156
+ const names = input.nameRefs !== undefined;
157
+ if (!http && !mcp && !names) {
158
+ return fail('MISSING_INPUT', 'match_endpoints에는 feCalls와 beRoutes, skillToolCalls와 serverTools, nameRefs 중 하나가 필요하다.');
159
+ }
160
+ return {
161
+ ...(http
162
+ ? matchEndpoints({
163
+ feCalls: input.feCalls,
164
+ beRoutes: input.beRoutes,
165
+ prefixCandidates: input.prefixCandidates,
166
+ })
167
+ : {}),
168
+ ...(mcp
169
+ ? {
170
+ tools: matchMcpTools({
171
+ skillToolCalls: input.skillToolCalls,
172
+ serverTools: input.serverTools,
173
+ }),
174
+ }
175
+ : {}),
176
+ ...(names ? { refs: matchNameRefs(input.nameRefs) } : {}),
177
+ };
178
+ }
179
+ function handleValidate(input, repoRoot) {
180
+ const prepared = prepareIr(input, repoRoot);
181
+ if (!prepared.ok)
182
+ return prepared;
183
+ const result = validate(prepared.ir, repoRoot, input.checkFiles);
184
+ if (!result.ok)
185
+ return asFailure(result);
186
+ const { drawableNodeIds, drawableEdgeIds, autoUnresolved } = result.value;
187
+ return {
188
+ ok: true,
189
+ errors: [],
190
+ autoUnresolved,
191
+ drawable: { nodeIds: [...drawableNodeIds].sort(), edgeIds: [...drawableEdgeIds].sort() },
192
+ };
193
+ }
194
+ async function handleRender(input, repoRoot) {
195
+ const prepared = prepareIr(input, repoRoot);
196
+ if (!prepared.ok)
197
+ return prepared;
198
+ const first = validate(prepared.ir, repoRoot, input.checkFiles);
199
+ if (!first.ok)
200
+ return asFailure(first);
201
+ const store = new ArchitectureStore(repoRoot);
202
+ const prev = store.load(prepared.ir.view);
203
+ const merged = prev ? mergeWithPrevious(prev, prepared.ir) : prepared.ir;
204
+ // 병합이 id를 바꾸므로 그린 대상도 병합 결과로 다시 뽑는다
205
+ const second = validate(merged, repoRoot, input.checkFiles);
206
+ if (!second.ok)
207
+ return asFailure(second);
208
+ const validated = second.value;
209
+ // 서비스가 그려지면 노드가 많아 평면 한 장으로는 못 읽는다. 레벨로 나눠 한 파일에 담는다
210
+ const drilldown = shouldDrillDown(validated) ? await computeDrilldown(validated) : null;
211
+ let privateHtml;
212
+ let sharedHtml;
213
+ if (drilldown) {
214
+ privateHtml = renderDrilldownHtml(validated, drilldown, { audience: 'private' });
215
+ sharedHtml = renderDrilldownHtml(validated, drilldown, { audience: 'shared' });
216
+ }
217
+ else {
218
+ const layout = await computeLayout(validated.ir, validated.drawableNodeIds, validated.drawableEdgeIds);
219
+ privateHtml = renderArchitectureHtml(validated, layout, { audience: 'private' });
220
+ sharedHtml = renderArchitectureHtml(validated, layout, { audience: 'shared' });
221
+ }
222
+ // 자동 질문도 저장해 둬야 사람이 답을 달고 다음 실행이 그 답을 물려받는다
223
+ const toSave = {
224
+ ...validated.ir,
225
+ unresolved: [...validated.ir.unresolved, ...validated.autoUnresolved],
226
+ };
227
+ const irPath = store.save(toSave);
228
+ const viewPaths = store.saveViews(toSave);
229
+ const view = validated.ir.view;
230
+ const htmlPath = store.saveHtml(view, 'private', privateHtml);
231
+ const sharedHtmlPath = store.saveHtml(view, 'shared', sharedHtml);
232
+ log(`architecture: rendered ${view} → ${htmlPath}`);
233
+ return {
234
+ ok: true,
235
+ irPath,
236
+ htmlPath,
237
+ sharedHtmlPath,
238
+ openPath: input.audience === 'shared' ? sharedHtmlPath : htmlPath,
239
+ ...(viewPaths.length > 0 ? { viewPaths } : {}),
240
+ ...(drilldown
241
+ ? {
242
+ levels: drilldown.levels.map((l) => ({
243
+ id: l.id,
244
+ title: l.title,
245
+ nodes: l.nodeIds.length,
246
+ edges: l.edges.length,
247
+ })),
248
+ }
249
+ : {}),
250
+ stats: computeStats(validated),
251
+ sourcesUsed: validated.ir.sourcesUsed,
252
+ };
253
+ }
254
+ function handleMerge(input, repoRoot) {
255
+ const raws = [...(input.irs ?? [])];
256
+ for (const path of input.irPaths ?? []) {
257
+ const read = readIrFile(path, repoRoot);
258
+ if (!read.ok)
259
+ return read;
260
+ raws.push(read.raw);
261
+ }
262
+ const irs = [];
263
+ for (const [i, raw] of raws.entries()) {
264
+ const parsed = parseIr(raw, `입력 ${i}: `);
265
+ if (!parsed.ok)
266
+ return parsed;
267
+ irs.push(parsed.ir);
268
+ }
269
+ const result = mergeArchitectureIrs(irs, {
270
+ prefixCandidates: input.prefixCandidates,
271
+ groupNames: input.groupNames,
272
+ });
273
+ if (!result.ok)
274
+ return result;
275
+ const nextAction = '합친 IR을 validate로 확인한 뒤 render한다. render는 repoRoot의 같은 뷰 IR과 병합하므로 원래 분석 레포가 아닌 따로 둔 디렉토리를 repoRoot로 준다.';
276
+ if (input.outPath === undefined) {
277
+ return { ok: true, ir: result.ir, report: result.report, nextAction };
278
+ }
279
+ const outPath = resolve(repoRoot, input.outPath);
280
+ writeJsonAtomic(outPath, result.ir);
281
+ log(`architecture: merged ${irs.length} IRs → ${outPath}`);
282
+ return { ok: true, irPath: outPath, report: result.report, nextAction };
283
+ }
284
+ /**
285
+ * 문서 레포를 읽기만 하고 결과는 `.gestalt/architecture/` 아래 파일로 남긴다. md 수백 개를 응답에 실으면
286
+ * 세션 맥락이 넘치니 응답은 요약과 경로만 돌려준다
287
+ */
288
+ function handleScanDocs(input, repoRoot) {
289
+ if (input.docRoots === undefined || input.docRoots.length === 0) {
290
+ return fail('MISSING_INPUT', 'scan_docs에는 docRoots가 필요하다.');
291
+ }
292
+ const roots = input.docRoots.map((r) => ({
293
+ ...r,
294
+ path: isAbsolute(r.path) ? r.path : resolve(repoRoot, r.path),
295
+ }));
296
+ let scan;
297
+ try {
298
+ scan = scanDocRoots(roots, input.docPatterns);
299
+ }
300
+ catch (err) {
301
+ return fail('SCAN_FAILED', `문서 레포를 못 읽었다: ${String(err)}`);
302
+ }
303
+ // 머리줄에 수정일을 안 적는 문서가 많아서 git이 아는 마지막 커밋 날짜를 함께 싣는다. 루트마다 log 한 번이다
304
+ for (const r of roots) {
305
+ const dates = docCommitDates(r.path);
306
+ for (const d of scan.docs) {
307
+ const at = d.repoId === r.repoId ? dates.get(d.path) : undefined;
308
+ if (at !== undefined)
309
+ d.committedAt = at;
310
+ }
311
+ }
312
+ const now = new Date().toISOString();
313
+ const dir = resolve(repoRoot, '.gestalt', 'architecture');
314
+ const scanPath = resolve(dir, 'doc-scan.json');
315
+ const draftPath = resolve(dir, 'knowledge.draft.json');
316
+ writeJsonAtomic(scanPath, {
317
+ ...scan,
318
+ roots: roots.map((r) => ({ repoId: r.repoId, name: r.name, path: r.path })),
319
+ });
320
+ writeJsonAtomic(draftPath, buildKnowledgeIr(roots, scan, now));
321
+ const routes = analyzeDocRoutes(scan);
322
+ const routesPath = resolve(dir, 'doc-routes.json');
323
+ writeJsonAtomic(routesPath, routes);
324
+ const questionRoutes = {
325
+ entries: routes.entries.length,
326
+ reachable: routes.reachable,
327
+ orphans: routes.orphans.length,
328
+ deadRoutes: routes.deadRoutes.length,
329
+ keywordConflicts: routes.conflicts.length,
330
+ };
331
+ return {
332
+ summary: {
333
+ ...summarizeScan(scan),
334
+ questionRoutes,
335
+ freshness: summarizeFreshness(scan.docs, now),
336
+ },
337
+ skipped: scan.skipped,
338
+ scanPath,
339
+ draftPath,
340
+ routesPath,
341
+ };
342
+ }
343
+ // 같은 파일을 여러 문서가 가리키므로 파일마다 한 번만 git을 부른다
344
+ function fileFactsFrom(codeRoots, repoRoot) {
345
+ const cache = new Map();
346
+ return (repoName, path) => {
347
+ const root = codeRoots[repoName];
348
+ if (root === undefined)
349
+ return undefined;
350
+ const key = `${repoName}:${path}`;
351
+ if (cache.has(key))
352
+ return cache.get(key);
353
+ const abs = isAbsolute(root) ? root : resolve(repoRoot, root);
354
+ let facts;
355
+ if (!existsSync(resolve(abs, path))) {
356
+ facts = { exists: false };
357
+ }
358
+ else {
359
+ let committedAt;
360
+ try {
361
+ committedAt =
362
+ execFileSync('git', ['-C', abs, 'log', '-1', '--format=%cs', '--', path], {
363
+ encoding: 'utf-8',
364
+ stdio: ['ignore', 'pipe', 'ignore'],
365
+ }).trim() || undefined;
366
+ }
367
+ catch {
368
+ committedAt = undefined;
369
+ }
370
+ facts = { exists: true, ...(committedAt !== undefined ? { committedAt } : {}) };
371
+ }
372
+ cache.set(key, facts);
373
+ return facts;
374
+ };
375
+ }
376
+ // 레포마다 CODEOWNERS를 한 번만 읽는다. 문서 레포와 코드 레포를 같은 이름 공간으로 본다
377
+ function ownersFrom(roots, repoRoot) {
378
+ const cache = new Map();
379
+ return (repoName, path) => {
380
+ const root = roots[repoName];
381
+ if (root === undefined)
382
+ return undefined;
383
+ let rules = cache.get(repoName);
384
+ if (rules === undefined) {
385
+ rules = readCodeowners(isAbsolute(root) ? root : resolve(repoRoot, root));
386
+ cache.set(repoName, rules);
387
+ }
388
+ return ownersOf(rules, path);
389
+ };
390
+ }
391
+ const SIGNAL_SAMPLE = 20;
392
+ function handleLinkDocs(input, repoRoot) {
393
+ if (input.irPath === undefined && input.ir === undefined)
394
+ return fail('MISSING_INPUT', 'link_docs에는 기술 IR(ir이나 irPath)이 필요하다.');
395
+ const prepared = prepareIr(input, repoRoot);
396
+ if (!prepared.ok)
397
+ return prepared;
398
+ const dir = resolve(repoRoot, '.gestalt', 'architecture');
399
+ const scanPath = resolve(dir, 'doc-scan.json');
400
+ const draftPath = resolve(dir, 'knowledge.draft.json');
401
+ let scan;
402
+ let knowledgeRaw;
403
+ try {
404
+ scan = JSON.parse(readFileSync(scanPath, 'utf-8'));
405
+ knowledgeRaw = JSON.parse(readFileSync(draftPath, 'utf-8'));
406
+ }
407
+ catch {
408
+ return fail('MISSING_INPUT', 'link_docs 전에 scan_docs를 먼저 돌려야 한다.');
409
+ }
410
+ const knowledge = parseIr(knowledgeRaw, 'knowledge.draft.json: ');
411
+ if (!knowledge.ok)
412
+ return knowledge;
413
+ const ownerRoots = {
414
+ ...Object.fromEntries((scan.roots ?? []).map((r) => [r.name, r.path])),
415
+ ...(input.codeRoots ?? {}),
416
+ };
417
+ const result = linkDocs(prepared.ir, knowledge.ir, scan.docs, {
418
+ ...(input.repoAliases !== undefined ? { repoAliases: input.repoAliases } : {}),
419
+ ...(input.screenIndexPrefixes !== undefined
420
+ ? { screenIndexPrefixes: input.screenIndexPrefixes }
421
+ : {}),
422
+ ...(input.codeRoots !== undefined
423
+ ? { fileFacts: fileFactsFrom(input.codeRoots, repoRoot) }
424
+ : {}),
425
+ ...(Object.keys(ownerRoots).length > 0 ? { ownersOf: ownersFrom(ownerRoots, repoRoot) } : {}),
426
+ generatedAt: new Date().toISOString(),
427
+ });
428
+ // 링크 상태를 다시 센 값은 문서 지도에도 돌려 쓴다. 그래야 두 그림의 깨진 링크 수가 같다
429
+ const updated = {
430
+ ...knowledge.ir,
431
+ nodes: knowledge.ir.nodes.map((n) => {
432
+ const doc = result.docInfo.get(n.id);
433
+ const owners = n.owners ?? result.docOwners.get(n.id);
434
+ return doc !== undefined || owners !== undefined
435
+ ? {
436
+ ...n,
437
+ ...(doc !== undefined ? { doc } : {}),
438
+ ...(owners !== undefined ? { owners } : {}),
439
+ }
440
+ : n;
441
+ }),
442
+ };
443
+ writeJsonAtomic(draftPath, updated);
444
+ const linkPath = resolve(dir, 'knowledge-link.draft.json');
445
+ const signalsPath = resolve(dir, 'doc-link.json');
446
+ writeJsonAtomic(linkPath, result.ir);
447
+ writeJsonAtomic(signalsPath, result.signals);
448
+ const s = result.signals;
449
+ return {
450
+ summary: {
451
+ linkedDocs: s.linkedDocs,
452
+ describes: s.describes,
453
+ coverage: s.coverage,
454
+ links: s.links,
455
+ staleCount: s.stale.length,
456
+ apiMismatchCount: s.apiMismatches.length,
457
+ screensOnlyInCode: s.screensOnlyInCode.length,
458
+ screensOnlyInIndex: s.screensOnlyInIndex.length,
459
+ uncoveredCount: s.uncovered.length,
460
+ ...(s.ownership !== undefined
461
+ ? { ownership: { tech: s.ownership.tech, docs: s.ownership.docs } }
462
+ : {}),
463
+ ...(Object.keys(s.gapsByOwner).length > 0 ? { gapsByOwner: s.gapsByOwner } : {}),
464
+ },
465
+ uncoveredSample: s.uncovered.slice(0, SIGNAL_SAMPLE),
466
+ draftPath: linkPath,
467
+ knowledgeDraftPath: draftPath,
468
+ signalsPath,
469
+ };
470
+ }
471
+ function changedFilesOf(input, repoRoot) {
472
+ if (input.changedFiles !== undefined) {
473
+ const files = [];
474
+ for (const f of input.changedFiles) {
475
+ const i = f.indexOf(':');
476
+ if (i <= 0)
477
+ return fail('INVALID_INPUT', `changedFiles는 \`<레포 이름>:<경로>\` 꼴이어야 한다: ${f}`);
478
+ files.push({ repo: f.slice(0, i), path: f.slice(i + 1) });
479
+ }
480
+ return { ok: true, files };
481
+ }
482
+ const repo = input.changedRepo;
483
+ const root = repo !== undefined ? input.codeRoots?.[repo] : undefined;
484
+ if (input.diffBase === undefined || repo === undefined || root === undefined) {
485
+ return fail('MISSING_INPUT', 'stale_docs에는 changedFiles나 diffBase, changedRepo, codeRoots[changedRepo]가 필요하다.');
486
+ }
487
+ try {
488
+ const out = execFileSync('git', [
489
+ '-C',
490
+ isAbsolute(root) ? root : resolve(repoRoot, root),
491
+ 'diff',
492
+ '--name-only',
493
+ `${input.diffBase}...HEAD`,
494
+ ],
495
+ // 큰 레포는 몇백 커밋만 넘어가도 파일 목록이 기본 버퍼(1MB)를 넘는다
496
+ { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'pipe'], maxBuffer: 64 * 1024 * 1024 });
497
+ return {
498
+ ok: true,
499
+ files: out
500
+ .split('\n')
501
+ .filter(Boolean)
502
+ .map((path) => ({ repo, path })),
503
+ };
504
+ }
505
+ catch (err) {
506
+ return fail('DIFF_FAILED', `git diff를 못 돌렸다: ${String(err)}`);
507
+ }
508
+ }
509
+ /** 바뀐 파일로 손봐야 할 문서를 고른다. link_docs를 돌렸으면 기술 노드를 거쳐 닿는 문서까지 본다 */
510
+ function handleStaleDocs(input, repoRoot) {
511
+ const changed = changedFilesOf(input, repoRoot);
512
+ if (!changed.ok)
513
+ return changed;
514
+ const dir = resolve(repoRoot, '.gestalt', 'architecture');
515
+ let scan;
516
+ try {
517
+ scan = JSON.parse(readFileSync(resolve(dir, 'doc-scan.json'), 'utf-8'));
518
+ }
519
+ catch {
520
+ return fail('MISSING_INPUT', 'stale_docs 전에 scan_docs를 먼저 돌려야 한다.');
521
+ }
522
+ const linkPath = resolve(dir, 'knowledge-link.draft.json');
523
+ let linkIr;
524
+ if (existsSync(linkPath)) {
525
+ const parsed = parseIr(JSON.parse(readFileSync(linkPath, 'utf-8')), 'knowledge-link.draft.json: ');
526
+ if (!parsed.ok)
527
+ return parsed;
528
+ linkIr = parsed.ir;
529
+ }
530
+ const docs = findStaleDocs(scan.docs, changed.files, {
531
+ ...(input.repoAliases !== undefined ? { repoAliases: input.repoAliases } : {}),
532
+ ...(linkIr !== undefined ? { linkIr } : {}),
533
+ });
534
+ const stalePath = resolve(dir, 'stale-docs.json');
535
+ writeJsonAtomic(stalePath, { changedFiles: changed.files, docs });
536
+ return {
537
+ summary: {
538
+ changedFiles: changed.files.length,
539
+ staleDocs: docs.length,
540
+ viaCodeRef: docs.filter((d) => d.reasons.some((r) => r.kind === 'code-ref')).length,
541
+ viaNode: docs.filter((d) => d.reasons.some((r) => r.kind === 'node')).length,
542
+ linkedIr: linkIr !== undefined,
543
+ },
544
+ sample: docs.slice(0, SIGNAL_SAMPLE).map((d) => ({
545
+ doc: d.doc,
546
+ ...(d.title !== undefined ? { title: d.title } : {}),
547
+ files: [...new Set(d.reasons.map((r) => r.file))],
548
+ })),
549
+ stalePath,
550
+ };
551
+ }
552
+ function handleStatus(repoRoot) {
553
+ const store = new ArchitectureStore(repoRoot);
554
+ const views = {};
555
+ for (const view of ARCHITECTURE_VIEWS) {
556
+ const prev = store.load(view);
557
+ views[view] = prev ? previousRunSummary(prev) : null;
558
+ }
559
+ return { views };
560
+ }
561
+ /** `ges_architecture` 핸들러. LLM을 부르지 않고 세션이 만든 IR을 검증하고 그린다 */
562
+ export async function handleArchitecturePassthrough(input, cwd = process.cwd(), opts = {}) {
563
+ const repoRoot = resolve(cwd, input.repoRoot ?? '.');
564
+ switch (input.action) {
565
+ case 'start':
566
+ return handleStart(input, repoRoot, opts);
567
+ case 'filter_tools':
568
+ return handleFilterTools(input);
569
+ case 'match_endpoints':
570
+ return handleMatchEndpoints(input);
571
+ case 'validate':
572
+ return handleValidate(input, repoRoot);
573
+ case 'render':
574
+ return handleRender(input, repoRoot);
575
+ case 'status':
576
+ return handleStatus(repoRoot);
577
+ case 'merge':
578
+ return handleMerge(input, repoRoot);
579
+ case 'scan_docs':
580
+ return handleScanDocs(input, repoRoot);
581
+ case 'link_docs':
582
+ return handleLinkDocs(input, repoRoot);
583
+ case 'stale_docs':
584
+ return handleStaleDocs(input, repoRoot);
585
+ }
586
+ }
587
+ //# sourceMappingURL=architecture-passthrough.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-passthrough.js","sourceRoot":"","sources":["../../../../src/mcp/tools/architecture-passthrough.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,aAAa,GAEd,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAoB,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAuB,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAkB,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,kBAAkB,GAGnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,sBAAsB,GAGvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAGxC,wFAAwF;AACxF,MAAM,WAAW,GAAG,OAAO,CACzB,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,6BAA6B,CAC9B,CAAC;AAeF,SAAS,IAAI,CAAC,IAAY,EAAE,OAAe;IACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,KAAK,CAAC,SAAiB,EAAE,WAAmB;IACnD,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC;AAC5D,CAAC;AAID,SAAS,UAAU,CACjB,IAAY,EACZ,QAAgB;IAEhB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAY,EAAE,CAAC;IAC9E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,cAAe,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAY,EAAE,KAAK,GAAG,EAAE;IACvC,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7F,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC;KAC7F,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAwB,EAAE,QAAgB;IAC3D,IAAI,GAAG,GAAY,KAAK,CAAC,EAAE,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,KAAK,SAAS;QACnB,OAAO,IAAI,CAAC,eAAe,EAAE,GAAG,KAAK,CAAC,MAAM,uBAAuB,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACrB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC,eAAe,EAAE,QAAQ,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,EAAkB,EAAE,QAAgB,EAAE,UAA+B;IACrF,oEAAoE;IACpE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAClC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC9F,CACF,CAAC;IACF,OAAO,sBAAsB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,MAA4D;IAC7E,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,SAAsB;IAC1C,MAAM,EACJ,EAAE,EACF,eAAe,EACf,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,cAAc,GACf,GAAG,SAAS,CAAC;IACd,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAErE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7E,CAAC;IACF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,UAAU;SACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,YAAY,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACtB,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,GAAG,cAAc,CAAC,CAAC,MAAM,CACvD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CACxD,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM;QACtB,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM;QACtB,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;QACjD,cAAc,EAAE,IAAI,CAAC,MAAM;QAC3B,qBAAqB,EAAE,KAAK,CAC1B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EACzD,OAAO,CAAC,MAAM,CACf;QACD,kBAAkB,EAAE,KAAK,CACvB,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAC1D,SAAS,CAAC,MAAM,CACjB;QACD,2CAA2C;QAC3C,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAC/C,CAAC,CAAC;gBACE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM;gBACtB,UAAU,EAAE,eAAe,CAAC,IAAI;gBAChC,gBAAgB,EAAE,qBAAqB,CAAC,IAAI;aAC7C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,yDAAyD;QACzD,GAAG,CAAC,MAAM,KAAK,SAAS;YACtB,CAAC,CAAC;gBACE,MAAM,EAAE,EAAE,CAAC,MAAO,CAAC,MAAM;gBACzB,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAO,CAAC,MAAM,CAAC;qBACpF,MAAM;aACV;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAQD,SAAS,WAAW,CAClB,KAAwB,EACxB,QAAgB,EAChB,IAAgC;IAEhC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,eAAe,EAAE,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACxE,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ;QACR,mBAAmB,EAAE,IAAI,EAAE,WAAW,IAAI,EAAE;QAC5C,iBAAiB,EAAE,oBAAoB,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAC9D,UAAU,EAAE,WAAW;QACvB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,oBAAoB,CAAC,EAAE;QACpF,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,mBAAmB,CAAC,EAAE;QACpD,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE;YACZ,oFAAoF;YACpF,qEAAqE;YACrE,mEAAmE;YACnE,6FAA6F;YAC7F,uEAAuE;SACxE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAwB;IACjD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,eAAe,EAAE,iCAAiC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAwB;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC;IACzE,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC;IAC3C,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO,IAAI,CACT,eAAe,EACf,wFAAwF,CACzF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,CAAC,IAAI;YACN,CAAC,CAAC,cAAc,CAAC;gBACb,OAAO,EAAE,KAAK,CAAC,OAAQ;gBACvB,QAAQ,EAAE,KAAK,CAAC,QAAS;gBACzB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;aACzC,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG;YACL,CAAC,CAAC;gBACE,KAAK,EAAE,aAAa,CAAC;oBACnB,cAAc,EAAE,KAAK,CAAC,cAAe;oBACrC,WAAW,EAAE,KAAK,CAAC,WAAY;iBAChC,CAAC;aACH;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,QAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB,EAAE,QAAgB;IAChE,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1E,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,EAAE;QACV,cAAc;QACd,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE;KACzF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAwB,EAAE,QAAgB;IACpE,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzE,oCAAoC;IACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;IAE/B,qDAAqD;IACrD,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,IAAI,WAAmB,CAAC;IACxB,IAAI,UAAkB,CAAC;IACvB,IAAI,SAAS,EAAE,CAAC;QACd,WAAW,GAAG,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,UAAU,GAAG,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,SAAS,CAAC,EAAE,EACZ,SAAS,CAAC,eAAe,EACzB,SAAS,CAAC,eAAe,CAC1B,CAAC;QACF,WAAW,GAAG,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,UAAU,GAAG,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,4CAA4C;IAC5C,MAAM,MAAM,GAAG;QACb,GAAG,SAAS,CAAC,EAAE;QACf,UAAU,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC;KACtE,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAqB,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClE,GAAG,CAAC,0BAA0B,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC;IAEpD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM;QACN,QAAQ;QACR,cAAc;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ;QACjE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM;oBACvB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;iBACtB,CAAC,CAAC;aACJ;YACH,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE,YAAY,CAAC,SAAS,CAAC;QAC9B,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,WAAW;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB,EAAE,QAAgB;IAC7D,MAAM,IAAI,GAAc,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE;QACvC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,UAAU,GACd,yGAAyG,CAAC;IAC5G,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,GAAG,CAAC,wBAAwB,GAAG,CAAC,MAAM,UAAU,OAAO,EAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAwB,EAAE,QAAgB;IAChE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,KAAK,GAAc,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC;QACJ,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;KAC9D,CAAC,CAAC,CAAC;IACJ,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,aAAa,EAAE,iBAAiB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,mEAAmE;IACnE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjE,IAAI,EAAE,KAAK,SAAS;gBAAE,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACvD,eAAe,CAAC,QAAQ,EAAE;QACxB,GAAG,IAAI;QACP,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;KAC5E,CAAC,CAAC;IACH,eAAe,CAAC,SAAS,EAAE,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACnD,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;QAC9B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;QAC9B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM;QACpC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;KAC1C,CAAC;IACF,OAAO;QACL,OAAO,EAAE;YACP,GAAG,aAAa,CAAC,IAAI,CAAC;YACtB,cAAc;YACd,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;SAC9C;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ;QACR,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC;AAED,yCAAyC;AACzC,SAAS,aAAa,CAAC,SAAiC,EAAE,QAAgB;IACxE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IACvD,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,KAA4B,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACpC,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,WAA+B,CAAC;YACpC,IAAI,CAAC;gBACH,WAAW;oBACT,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;wBACxE,QAAQ,EAAE,OAAO;wBACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;qBACpC,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,GAAG,SAAS,CAAC;YAC1B,CAAC;YACD,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAClF,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,yDAAyD;AACzD,SAAS,UAAU,CAAC,KAA6B,EAAE,QAAgB;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,OAAO,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1E,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,SAAS,cAAc,CAAC,KAAwB,EAAE,QAAgB;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;QACtD,OAAO,IAAI,CAAC,eAAe,EAAE,uCAAuC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACvD,IAAI,IAAmB,CAAC;IACxB,IAAI,YAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAkB,CAAC;QACpE,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAY,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,eAAe,EAAE,oCAAoC,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,UAAU,GAA2B;QACzC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;KAC3B,CAAC;IACF,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE;QAC5D,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;YAC/B,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;YACzD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC,CAAC;IACH,sDAAsD;IACtD,MAAM,OAAO,GAAmB;QAC9B,GAAG,SAAS,CAAC,EAAE;QACf,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;gBAC9C,CAAC,CAAC;oBACE,GAAG,CAAC;oBACJ,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5C;gBACH,CAAC,CAAC,CAAC,CAAC;QACR,CAAC,CAAC;KACH,CAAC;IACF,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAClD,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACrC,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACzB,OAAO;QACL,OAAO,EAAE;YACP,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;YAC1B,gBAAgB,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM;YACxC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,CAAC,MAAM;YAC7C,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,CAAC,MAAM;YAC/C,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM;YAClC,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS;gBAC3B,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;gBACnE,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjF;QACD,eAAe,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC;QACpD,SAAS,EAAE,QAAQ;QACnB,kBAAkB,EAAE,SAAS;QAC7B,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAwB,EACxB,QAAgB;IAEhB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC;gBACR,OAAO,IAAI,CAAC,eAAe,EAAE,2CAA2C,CAAC,EAAE,CAAC,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7E,OAAO,IAAI,CACT,eAAe,EACf,iFAAiF,CAClF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CACtB,KAAK,EACL;YACE,IAAI;YACJ,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;YACjD,MAAM;YACN,aAAa;YACb,GAAG,KAAK,CAAC,QAAQ,SAAS;SAC3B;QACD,2CAA2C;QAC3C,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CACtF,CAAC;QACF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,GAAG;iBACP,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACnC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,aAAa,EAAE,oBAAoB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,SAAS,eAAe,CAAC,KAAwB,EAAE,QAAgB;IACjE,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,IAAmB,CAAC;IACxB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAkB,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,eAAe,EAAE,qCAAqC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC;IAC3D,IAAI,MAAkC,CAAC;IACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CACpB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAC3C,6BAA6B,CAC9B,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE;QACnD,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAClD,eAAe,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO;QACL,OAAO,EAAE;YACP,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YAClC,SAAS,EAAE,IAAI,CAAC,MAAM;YACtB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM;YACnF,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM;YAC5E,QAAQ,EAAE,MAAM,KAAK,SAAS;SAC/B;QACD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAClD,CAAC,CAAC;QACH,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,KAAwB,EACxB,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,OAAmC,EAAE;IAErC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;IACrD,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5C,KAAK,cAAc;YACjB,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,iBAAiB;YACpB,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChC,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACtC,KAAK,WAAW;YACd,OAAO,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,KAAK,WAAW;YACd,OAAO,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,KAAK,YAAY;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type ExecGit = (cwd: string, args: string[]) => string;
2
+ export interface FindClaudeProjectMemoryDirsOptions {
3
+ repoRoot: string;
4
+ /** 기본값은 ~/.claude/projects. 테스트에서 주입한다. */
5
+ projectsRoot?: string;
6
+ /** 워크트리 밖에서 같은 레포를 열었던 경로. */
7
+ extraRoots?: string[];
8
+ execGit?: ExecGit;
9
+ }
10
+ export interface ClaudeProjectMemoryMatch {
11
+ remoteKey: string | null;
12
+ matchedPaths: string[];
13
+ memoryDirs: string[];
14
+ }
15
+ export declare function encodeClaudeProjectDir(absPath: string): string;
16
+ export declare function normalizeRemoteUrl(url: string): string;
17
+ export declare function listWorktreePaths(repoRoot: string, execGit?: ExecGit): string[];
18
+ export declare function findClaudeProjectMemoryDirs(opts: FindClaudeProjectMemoryDirsOptions): ClaudeProjectMemoryMatch;
19
+ //# sourceMappingURL=claude-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-projects.d.ts","sourceRoot":"","sources":["../../../src/utils/claude-projects.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAE9D,MAAM,WAAW,kCAAkC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAUD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAatD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAwB,GAAG,MAAM,EAAE,CAW/F;AA+DD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,kCAAkC,GACvC,wBAAwB,CAmD1B"}