@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,226 @@
1
+ /**
2
+ * 웹 제품. 화면에서 API, 서버, DB로 가는 요청 길과 그 서빙 인프라, 배포 경로를 그린다.
3
+ * 색은 밝은 화면이 600 톤, 어두운 화면이 400 톤이다. 같은 색상환 자리라 테마를 바꿔도 같은 종류로 읽힌다.
4
+ * 열 순위는 두 뷰의 kind가 겹치지 않아 표 하나로 둘 다 덮는다. 뷰①은 service→feature→screen→gateway→endpoint→module→클라이언트→테이블,
5
+ * 뷰②는 workflow→build→artifact→배포처 순서로 왼쪽부터 놓인다. 인프라는 배포 경로에서 산출물이 떨어지는 버킷부터 CDN, 도메인 순으로
6
+ * 오른쪽에 붙는다. 요청 방향(도메인→CDN→버킷)과 반대라 그 선은 거꾸로 그린다
7
+ */
8
+ export const WEB_PRODUCT_PACK = {
9
+ id: 'web-product',
10
+ title: '웹 제품',
11
+ description: '화면, API, 서버, 저장소와 서빙 인프라, 배포 경로',
12
+ drilldown: 'web-product',
13
+ matchers: ['http-endpoint'],
14
+ nodeKinds: {
15
+ // service는 웹과 앱을 함께 담으므로 "서비스"로 쓰고 어느 쪽인지는 플랫폼 칩이 따로 알린다
16
+ service: {
17
+ renderClass: 'service',
18
+ short: '서비스',
19
+ text: '서비스',
20
+ color: { light: '#2563eb', dark: '#60a5fa' },
21
+ icon: '<path d="M12 3.5l8.5 4.3L12 12 3.5 7.8z"/><path d="M3.5 12.2L12 16.5l8.5-4.3"/><path d="M3.5 16.4L12 20.7l8.5-4.3"/>',
22
+ lane: 'screen',
23
+ rank: 0,
24
+ },
25
+ micro_app: {
26
+ renderClass: 'client',
27
+ // 호스트 카드는 렌더러가 '호스트'로 바꿔 단다. 두 글자 폭이 같아야 카드 폭 계산이 하나로 맞는다
28
+ short: '리모트',
29
+ text: '마이크로 프론트엔드 앱',
30
+ color: { light: '#0369a1', dark: '#7dd3fc' },
31
+ icon: '<rect x="3.5" y="3.5" width="7" height="7" rx="1.5"/><rect x="13.5" y="3.5" width="7" height="7" rx="1.5"/><rect x="3.5" y="13.5" width="7" height="7" rx="1.5"/><path d="M17 13.5v7M13.5 17h7"/>',
32
+ lane: 'screen',
33
+ rank: 0,
34
+ // Module Federation 같은 마이크로 프론트엔드의 호스트나 리모트다. 서비스가 그 묶음이고 기능 영역과 화면은 페이지 코드가 있는 앱 밑에 둔다
35
+ parents: ['service'],
36
+ },
37
+ feature: {
38
+ renderClass: 'client',
39
+ short: '기능 영역',
40
+ text: '기능 영역',
41
+ color: { light: '#0891b2', dark: '#22d3ee' },
42
+ icon: '<path d="M3.5 7.5a2 2 0 0 1 2-2h3.6l2 2.2h7.4a2 2 0 0 1 2 2v7.8a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z"/>',
43
+ lane: 'screen',
44
+ rank: 0,
45
+ parents: ['micro_app', 'service'],
46
+ },
47
+ screen: {
48
+ renderClass: 'client',
49
+ short: '화면',
50
+ text: '화면',
51
+ color: { light: '#4f46e5', dark: '#818cf8' },
52
+ icon: '<rect x="3" y="4.5" width="18" height="15" rx="2.5"/><path d="M3 9h18"/><path d="M6.5 6.8h.01M9 6.8h.01"/>',
53
+ lane: 'screen',
54
+ rank: 0,
55
+ parents: ['feature', 'micro_app', 'service'],
56
+ },
57
+ gateway: {
58
+ renderClass: 'gateway',
59
+ short: '게이트웨이',
60
+ text: '게이트웨이',
61
+ color: { light: '#475569', dark: '#94a3b8' },
62
+ icon: '<path d="M12 3l7.5 3v5.5c0 4.4-3.1 8-7.5 9.5-4.4-1.5-7.5-5.1-7.5-9.5V6z"/>',
63
+ lane: 'gateway',
64
+ rank: 1,
65
+ },
66
+ endpoint: {
67
+ renderClass: 'service',
68
+ short: 'API',
69
+ text: 'API',
70
+ color: { light: '#059669', dark: '#34d399' },
71
+ icon: '<path d="M8.5 7.5L4 12l4.5 4.5M15.5 7.5L20 12l-4.5 4.5M13.5 5.5l-3 13"/>',
72
+ lane: 'endpoint',
73
+ rank: 2,
74
+ // MCP 도구만 받는다. 스킬 없이 클라이언트가 바로 부르는 도구가 어느 서버 패키지 것인지 적는 자리다
75
+ parents: ['service'],
76
+ },
77
+ app_module: {
78
+ renderClass: 'service',
79
+ short: '서버',
80
+ text: '서버',
81
+ color: { light: '#7c3aed', dark: '#a78bfa' },
82
+ icon: '<rect x="3.5" y="4" width="17" height="7" rx="1.8"/><rect x="3.5" y="13" width="17" height="7" rx="1.8"/><path d="M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6"/>',
83
+ lane: 'app_module',
84
+ rank: 3,
85
+ },
86
+ external_service: {
87
+ renderClass: 'external',
88
+ short: '클라이언트',
89
+ text: '호출 클라이언트',
90
+ color: { light: '#d97706', dark: '#fbbf24' },
91
+ icon: '<path d="M9 3v4.5M15 3v4.5"/><path d="M6.5 7.5h11v3.5a5.5 5.5 0 0 1-11 0z"/><path d="M12 16.5V21"/>',
92
+ lane: 'external_service',
93
+ rank: 4,
94
+ },
95
+ db_table: {
96
+ renderClass: 'store',
97
+ short: 'DB',
98
+ text: '테이블',
99
+ color: { light: '#dc2626', dark: '#f87171' },
100
+ icon: '<ellipse cx="12" cy="5.5" rx="7.5" ry="2.8"/><path d="M4.5 5.5v13c0 1.5 3.4 2.8 7.5 2.8s7.5-1.3 7.5-2.8v-13"/><path d="M4.5 12c0 1.5 3.4 2.8 7.5 2.8s7.5-1.3 7.5-2.8"/>',
101
+ lane: 'db_table',
102
+ rank: 5,
103
+ parents: ['datastore'],
104
+ },
105
+ datastore: {
106
+ renderClass: 'store',
107
+ short: '저장소',
108
+ text: '저장소 클러스터',
109
+ color: { light: '#be123c', dark: '#fb7185' },
110
+ icon: '<ellipse cx="12" cy="5" rx="7.5" ry="2.5"/><path d="M4.5 5v4.5c0 1.4 3.4 2.5 7.5 2.5s7.5-1.1 7.5-2.5V5"/><path d="M4.5 9.5V14c0 1.4 3.4 2.5 7.5 2.5s7.5-1.1 7.5-2.5V9.5"/><path d="M4.5 14v4.5c0 1.4 3.4 2.5 7.5 2.5s7.5-1.1 7.5-2.5V14"/>',
111
+ // 클러스터는 테이블과 같은 rank라 같은 레인에 둔다
112
+ lane: 'db_table',
113
+ rank: 5,
114
+ },
115
+ workflow: {
116
+ renderClass: 'step',
117
+ short: '트리거',
118
+ text: '워크플로',
119
+ color: { light: '#0284c7', dark: '#38bdf8' },
120
+ icon: '<path d="M13 2.5L4.5 13.5H11l-1 8 8.5-11H12z"/>',
121
+ lane: 'workflow',
122
+ rank: 0,
123
+ },
124
+ build: {
125
+ renderClass: 'step',
126
+ short: '빌드',
127
+ text: '빌드',
128
+ color: { light: '#0d9488', dark: '#2dd4bf' },
129
+ icon: '<path d="M14.5 6.2a4 4 0 0 0-5.3 5.3L3.5 17.2l3.3 3.3 5.7-5.7a4 4 0 0 0 5.3-5.3l-2.6 2.6-2.5-.2-.2-2.5z"/>',
130
+ lane: 'build',
131
+ rank: 1,
132
+ },
133
+ artifact: {
134
+ renderClass: 'document',
135
+ short: '산출물',
136
+ text: '산출물',
137
+ color: { light: '#9333ea', dark: '#c084fc' },
138
+ icon: '<path d="M12 2.8l8.5 4.7v9L12 21.2l-8.5-4.7v-9z"/><path d="M3.5 7.5L12 12l8.5-4.5M12 12v9.2"/>',
139
+ lane: 'artifact',
140
+ rank: 2,
141
+ },
142
+ deploy_target: {
143
+ renderClass: 'infra',
144
+ short: '배포 대상',
145
+ text: '배포 대상',
146
+ color: { light: '#ea580c', dark: '#fb923c' },
147
+ icon: '<path d="M7 18.5a4.5 4.5 0 0 1-.7-8.95A6 6 0 0 1 17.8 8.6a4.95 4.95 0 0 1-.8 9.9z"/><path d="M12 11v5M9.8 13.2L12 11l2.2 2.2"/>',
148
+ lane: 'deploy_target',
149
+ rank: 3,
150
+ },
151
+ domain: {
152
+ renderClass: 'infra',
153
+ short: '도메인',
154
+ text: '도메인',
155
+ color: { light: '#db2777', dark: '#f472b6' },
156
+ icon: '<path d="M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1"/><path d="M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"/>',
157
+ lane: 'domain',
158
+ rank: 6,
159
+ },
160
+ cdn: {
161
+ renderClass: 'infra',
162
+ short: 'CDN',
163
+ text: 'CDN 배포',
164
+ color: { light: '#4338ca', dark: '#a5b4fc' },
165
+ icon: '<circle cx="12" cy="12" r="8.5"/><path d="M3.5 12h17M12 3.5c2.5 2.6 3.5 5.4 3.5 8.5s-1 5.9-3.5 8.5c-2.5-2.6-3.5-5.4-3.5-8.5s1-5.9 3.5-8.5z"/>',
166
+ lane: 'cdn',
167
+ rank: 5,
168
+ },
169
+ bucket: {
170
+ renderClass: 'store',
171
+ short: '버킷',
172
+ text: '스토리지 버킷',
173
+ color: { light: '#16a34a', dark: '#4ade80' },
174
+ icon: '<ellipse cx="12" cy="6.5" rx="8" ry="2.5"/><path d="M4 6.5l2 13a2 2 0 0 0 2 1.5h8a2 2 0 0 0 2-1.5l2-13"/>',
175
+ lane: 'bucket',
176
+ rank: 4,
177
+ },
178
+ cloud_account: {
179
+ renderClass: 'infra',
180
+ short: '계정',
181
+ text: '클라우드 계정',
182
+ color: { light: '#57534e', dark: '#a8a29e' },
183
+ icon: '<rect x="3.5" y="5" width="17" height="14" rx="2.5"/><circle cx="9" cy="11" r="2.2"/><path d="M5.8 16.2a3.5 3.5 0 0 1 6.4 0M14.5 10h3M14.5 13.5h3"/>',
184
+ lane: 'cloud_account',
185
+ rank: 7,
186
+ },
187
+ },
188
+ lanes: {
189
+ service: { title: '서비스', stacked: true },
190
+ host: { title: '호스트', stacked: true },
191
+ remote: { title: '리모트', stacked: true },
192
+ unit: { title: '기능 영역', stacked: true },
193
+ screen: { title: '화면', stacked: true },
194
+ gateway: { title: '게이트웨이' },
195
+ endpoint: { title: 'API' },
196
+ app_module: { title: '서버' },
197
+ external_service: { title: '클라이언트' },
198
+ external: { title: '외부 서비스' },
199
+ db_table: { title: 'DB' },
200
+ workflow: { title: '트리거' },
201
+ build: { title: '빌드' },
202
+ artifact: { title: '산출물' },
203
+ deploy_target: { title: '배포 대상' },
204
+ domain: { title: '도메인' },
205
+ cdn: { title: 'CDN' },
206
+ bucket: { title: '버킷' },
207
+ cloud_account: { title: '클라우드 계정' },
208
+ },
209
+ edgeKinds: {
210
+ calls: { text: '호출' },
211
+ handles: { text: '처리' },
212
+ uses: { text: '사용' },
213
+ reads_writes: { text: '읽기와 쓰기' },
214
+ routes: { text: '전달' },
215
+ navigates: { text: '화면 이동' },
216
+ triggers: { text: '실행' },
217
+ builds: { text: '빌드' },
218
+ produces: { text: '생성' },
219
+ deploys_to: { text: '배포' },
220
+ resolves_to: { text: '도메인 연결', backward: true },
221
+ origin: { text: '원본', backward: true },
222
+ serves: { text: '서빙' },
223
+ loads: { text: '런타임 로드' },
224
+ },
225
+ };
226
+ //# sourceMappingURL=web-product.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-product.js","sourceRoot":"","sources":["../../../../src/architecture/packs/web-product.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type ArchitectureNode, type ArchitectureProjection, type SequenceBlockKind } from './types.js';
2
+ export interface SequenceHead {
3
+ id: string;
4
+ x: number;
5
+ y: number;
6
+ width: number;
7
+ height: number;
8
+ }
9
+ export interface SequenceMessageBox {
10
+ id: string;
11
+ /** 번호. 그린 메시지만 1부터 센다 */
12
+ n: number;
13
+ y: number;
14
+ x1: number;
15
+ x2: number;
16
+ self: boolean;
17
+ }
18
+ export interface SequenceBlockBox {
19
+ id: string;
20
+ kind: SequenceBlockKind;
21
+ label: string;
22
+ x: number;
23
+ y: number;
24
+ width: number;
25
+ height: number;
26
+ branches: {
27
+ y: number;
28
+ label: string;
29
+ }[];
30
+ }
31
+ export interface SequenceLayout {
32
+ width: number;
33
+ height: number;
34
+ heads: SequenceHead[];
35
+ lifelines: {
36
+ id: string;
37
+ x: number;
38
+ y1: number;
39
+ y2: number;
40
+ }[];
41
+ messages: SequenceMessageBox[];
42
+ blocks: SequenceBlockBox[];
43
+ }
44
+ /**
45
+ * 그릴 메시지만 받아 좌표를 정한다. 같은 입력이면 같은 좌표가 나온다.
46
+ * 참여자는 participants 순서, 없으면 메시지에 처음 나온 순서다. 그려지지 않는 노드는 뺀다.
47
+ * whereOf가 돌려준 글자는 머리 카드 둘째 줄에 들어가므로 카드 크기에 넣어 잰다
48
+ */
49
+ export declare function computeSequenceLayout(projection: ArchitectureProjection, drawn: ReadonlySet<string>, nodeById: ReadonlyMap<string, ArchitectureNode>, whereOf?: (id: string) => string | undefined): SequenceLayout;
50
+ //# sourceMappingURL=sequence-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence-layout.d.ts","sourceRoot":"","sources":["../../../src/architecture/sequence-layout.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,sBAAsB,EAClC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAC1B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC/C,OAAO,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAA2B,GAC5D,cAAc,CAiHhB"}
@@ -0,0 +1,140 @@
1
+ import { measureNode, textUnits } from './layout.js';
2
+ import { chipTextOverride, displayKindOf, } from './types.js';
3
+ // sequence는 열과 줄이 곧 의미라 elkjs를 안 쓴다. 열은 참여자, 줄은 메시지 순서다
4
+ const HEAD_GAP = 60;
5
+ const LABEL_PAD = 48;
6
+ const LABEL_CHAR = 7;
7
+ const FIRST_ROW = 40;
8
+ const ROW = 44;
9
+ const SELF_ROW = 60;
10
+ const SELF_W = 36;
11
+ const BLOCK_HEAD = 30;
12
+ const BLOCK_TAIL = 14;
13
+ const BRANCH_GAP = 24;
14
+ const BLOCK_SIDE = 64;
15
+ const TAIL = 32;
16
+ function labelWidth(text) {
17
+ return textUnits(text) * LABEL_CHAR;
18
+ }
19
+ /**
20
+ * 그릴 메시지만 받아 좌표를 정한다. 같은 입력이면 같은 좌표가 나온다.
21
+ * 참여자는 participants 순서, 없으면 메시지에 처음 나온 순서다. 그려지지 않는 노드는 뺀다.
22
+ * whereOf가 돌려준 글자는 머리 카드 둘째 줄에 들어가므로 카드 크기에 넣어 잰다
23
+ */
24
+ export function computeSequenceLayout(projection, drawn, nodeById, whereOf = () => undefined) {
25
+ const messages = projection.messages.filter((m) => drawn.has(m.id));
26
+ const order = [];
27
+ const add = (id) => {
28
+ if (!order.includes(id) && nodeById.has(id))
29
+ order.push(id);
30
+ };
31
+ const used = new Set(messages.flatMap((m) => [m.from, m.to]));
32
+ for (const id of projection.participants ?? [])
33
+ if (used.has(id))
34
+ add(id);
35
+ for (const m of messages) {
36
+ add(m.from);
37
+ add(m.to);
38
+ }
39
+ const sizes = order.map((id) => {
40
+ const n = nodeById.get(id);
41
+ const chip = chipTextOverride(n);
42
+ const where = whereOf(id);
43
+ return measureNode(n.label, n.displayName, n.displayNameInferred, displayKindOf(n), {
44
+ ...(chip !== undefined ? { chip } : {}),
45
+ ...(where !== undefined ? { secondLine: where } : {}),
46
+ });
47
+ });
48
+ const col = new Map(order.map((id, i) => [id, i]));
49
+ // 이웃한 두 열 사이 거리는 두 카드 반폭 합과 그 사이만 잇는 메시지 글자 폭 중 큰 쪽이다
50
+ const gaps = order.slice(1).map((_, i) => {
51
+ const base = (sizes[i].width + sizes[i + 1].width) / 2 + HEAD_GAP;
52
+ const label = messages
53
+ .filter((m) => {
54
+ const a = col.get(m.from);
55
+ const b = col.get(m.to);
56
+ return Math.min(a, b) === i && Math.max(a, b) === i + 1;
57
+ })
58
+ .reduce((w, m) => Math.max(w, labelWidth(`${messages.indexOf(m) + 1}. ${m.label}`)), 0);
59
+ return Math.max(base, label + LABEL_PAD);
60
+ });
61
+ const centers = [];
62
+ order.forEach((_, i) => {
63
+ centers.push(i === 0 ? sizes[0].width / 2 : centers[i - 1] + gaps[i - 1]);
64
+ });
65
+ const headHeight = sizes.reduce((h, s) => Math.max(h, s.height), 0);
66
+ const heads = order.map((id, i) => ({
67
+ id,
68
+ x: round2(centers[i] - sizes[i].width / 2),
69
+ y: 0,
70
+ width: sizes[i].width,
71
+ height: sizes[i].height,
72
+ }));
73
+ const blockById = new Map((projection.blocks ?? []).map((b) => [b.id, b]));
74
+ const out = [];
75
+ const blocks = [];
76
+ let y = headHeight + FIRST_ROW;
77
+ let open;
78
+ let openBranch;
79
+ let span = [0, 0];
80
+ const closeBlock = () => {
81
+ if (!open)
82
+ return;
83
+ y += BLOCK_TAIL;
84
+ open.x = round2(span[0] - BLOCK_SIDE);
85
+ open.width = round2(span[1] - span[0] + BLOCK_SIDE * 2);
86
+ open.height = round2(y - open.y);
87
+ blocks.push(open);
88
+ open = undefined;
89
+ y += BLOCK_TAIL;
90
+ };
91
+ messages.forEach((m, i) => {
92
+ const x1 = centers[col.get(m.from)];
93
+ const x2 = centers[col.get(m.to)];
94
+ const self = m.from === m.to;
95
+ if (open && open.id !== m.block)
96
+ closeBlock();
97
+ if (!open && m.block !== undefined) {
98
+ const b = blockById.get(m.block);
99
+ open = { id: b.id, kind: b.kind, label: b.label, x: 0, y, width: 0, height: 0, branches: [] };
100
+ openBranch = m.branch;
101
+ span = [Math.min(x1, x2), Math.max(x1, x2)];
102
+ y += BLOCK_HEAD;
103
+ }
104
+ else if (open && m.branch !== openBranch) {
105
+ y += BRANCH_GAP / 2;
106
+ open.branches.push({ y, label: m.branch ?? '' });
107
+ y += BRANCH_GAP;
108
+ openBranch = m.branch;
109
+ }
110
+ if (open) {
111
+ span = [Math.min(span[0], x1, x2), Math.max(span[1], x1, x2 + (self ? SELF_W : 0))];
112
+ }
113
+ y += self ? SELF_ROW / 2 : ROW / 2;
114
+ out.push({ id: m.id, n: i + 1, y: round2(y), x1, x2, self });
115
+ y += self ? SELF_ROW / 2 : ROW / 2;
116
+ });
117
+ closeBlock();
118
+ const last = order.length - 1;
119
+ const right = Math.max(last >= 0 ? centers[last] + sizes[last].width / 2 : 0, ...blocks.map((b) => b.x + b.width), ...out.filter((m) => m.self).map((m) => m.x1 + SELF_W + LABEL_PAD));
120
+ const left = Math.min(0, ...blocks.map((b) => b.x));
121
+ const shift = -left;
122
+ const height = round2(y + TAIL);
123
+ return {
124
+ width: round2(right + shift),
125
+ height,
126
+ heads: heads.map((h) => ({ ...h, x: round2(h.x + shift) })),
127
+ lifelines: order.map((id, i) => ({
128
+ id,
129
+ x: round2(centers[i] + shift),
130
+ y1: sizes[i].height,
131
+ y2: round2(y),
132
+ })),
133
+ messages: out.map((m) => ({ ...m, x1: round2(m.x1 + shift), x2: round2(m.x2 + shift) })),
134
+ blocks: blocks.map((b) => ({ ...b, x: round2(b.x + shift) })),
135
+ };
136
+ }
137
+ function round2(v) {
138
+ return Math.round(v * 100) / 100;
139
+ }
140
+ //# sourceMappingURL=sequence-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence-layout.js","sourceRoot":"","sources":["../../../src/architecture/sequence-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,aAAa,GAId,MAAM,YAAY,CAAC;AAEpB,wDAAwD;AACxD,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,GAAG,GAAG,EAAE,CAAC;AACf,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,IAAI,GAAG,EAAE,CAAC;AAwChB,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkC,EAClC,KAA0B,EAC1B,QAA+C,EAC/C,UAA8C,GAAG,EAAE,CAAC,SAAS;IAE7D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,EAAU,EAAQ,EAAE;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,YAAY,IAAI,EAAE;QAAE,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1E,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE;YAClF,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,sDAAsD;IACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QACpE,MAAM,KAAK,GAAG,QAAQ;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;YACzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5C,CAAC,EAAE,CAAC;QACJ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK;QACtB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM;KACzB,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/B,IAAI,IAAkC,CAAC;IACvC,IAAI,UAA8B,CAAC;IACnC,IAAI,IAAI,GAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,CAAC,IAAI,UAAU,CAAC;QAChB,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,GAAG,SAAS,CAAC;QACjB,CAAC,IAAI,UAAU,CAAC;IAClB,CAAC,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,CAAE,CAAC;QACtC,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK;YAAE,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;YAClC,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC9F,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;YACtB,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC,IAAI,UAAU,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC3C,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;YACjD,CAAC,IAAI,UAAU,CAAC;YAChB,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,UAAU,EAAE,CAAC;IAEb,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAE,GAAG,KAAK,CAAC,IAAI,CAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EACnC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,CACnE,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChC,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3D,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE;YACF,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC;YAC9B,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM;YACpB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;SACd,CAAC,CAAC;QACH,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACnC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type ArchitectureEdge, type ArchitectureNode, type Platform, type WebHosting } from './types.js';
2
+ export interface ServiceDomain {
3
+ id: string;
4
+ label: string;
5
+ environment?: string;
6
+ }
7
+ /** 서비스와 micro_app 카드, 패널이 그래프에서 끌어내 보여주는 사실 */
8
+ export interface ServiceFacts {
9
+ /** 웹, AOS, iOS 순서로 고정. 근거가 있는 것만 든다 */
10
+ platforms: Platform[];
11
+ /** 이 서비스를 서빙하는 버킷 id. 웹 판정의 근거다 */
12
+ servingBuckets: string[];
13
+ /** 이 서비스를 서빙하는 배포 대상(SSR 서버) id */
14
+ servingTargets: string[];
15
+ /** prod 서빙 노드로 정한 서빙 방식. 서빙 노드가 없으면 비운다 */
16
+ webHosting?: WebHosting;
17
+ /** 서빙 노드에서 CDN, 도메인을 거슬러 닿은 도메인. 환경 순서로 정렬한다 */
18
+ domains: ServiceDomain[];
19
+ /** environment가 prod인 첫 도메인 */
20
+ prodDomain?: string;
21
+ }
22
+ /**
23
+ * 그릴 노드와 엣지만 받아 서비스와 micro_app마다 플랫폼과 도메인을 낸다.
24
+ * micro_app은 자기를 serves로 가리키는 버킷이나 서버로 따로 판정한다. 앱이 달린 서비스의 웹 칩과 도메인은 진입 앱(호스트) 것이다.
25
+ * 웹은 버킷이나 배포 대상이 serves로 서빙하거나 platformEvidence.web이 있을 때, android와 ios는 platforms에 있고 근거가 있을 때만 든다.
26
+ * 서빙 방식은 prod(또는 환경 없는) 서빙 노드로 정하고 그런 노드가 없을 때만 다른 환경을 본다.
27
+ * 배포 대상이 하나라도 서빙하면 SSR이다. SSR 앱도 정적 에셋은 버킷에 올리는 경우가 흔해서다
28
+ */
29
+ export declare function computeServiceFacts(nodes: readonly ArchitectureNode[], edges: readonly ArchitectureEdge[]): Map<string, ServiceFacts>;
30
+ //# sourceMappingURL=service-facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-facts.d.ts","sourceRoot":"","sources":["../../../src/architecture/service-facts.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,mCAAmC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mCAAmC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gDAAgD;IAChD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GACjC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAkE3B"}
@@ -0,0 +1,88 @@
1
+ import { compareEnvironment } from './layout.js';
2
+ import { indexMicroApps } from './micro-app.js';
3
+ import { PLATFORMS, } from './types.js';
4
+ function compareStr(a, b) {
5
+ return a < b ? -1 : a > b ? 1 : 0;
6
+ }
7
+ /**
8
+ * 그릴 노드와 엣지만 받아 서비스와 micro_app마다 플랫폼과 도메인을 낸다.
9
+ * micro_app은 자기를 serves로 가리키는 버킷이나 서버로 따로 판정한다. 앱이 달린 서비스의 웹 칩과 도메인은 진입 앱(호스트) 것이다.
10
+ * 웹은 버킷이나 배포 대상이 serves로 서빙하거나 platformEvidence.web이 있을 때, android와 ios는 platforms에 있고 근거가 있을 때만 든다.
11
+ * 서빙 방식은 prod(또는 환경 없는) 서빙 노드로 정하고 그런 노드가 없을 때만 다른 환경을 본다.
12
+ * 배포 대상이 하나라도 서빙하면 SSR이다. SSR 앱도 정적 에셋은 버킷에 올리는 경우가 흔해서다
13
+ */
14
+ export function computeServiceFacts(nodes, edges) {
15
+ const byId = new Map(nodes.map((n) => [n.id, n]));
16
+ const kindOf = (id) => byId.get(id)?.kind;
17
+ const incoming = (kind, to, fromKind) => edges
18
+ .filter((e) => e.kind === kind && e.to === to && kindOf(e.from) === fromKind)
19
+ .map((e) => e.from);
20
+ const out = new Map();
21
+ for (const n of [...nodes].sort((a, b) => compareStr(a.id, b.id))) {
22
+ if (n.kind !== 'service' && n.kind !== 'micro_app')
23
+ continue;
24
+ const buckets = [...new Set(incoming('serves', n.id, 'bucket'))].sort(compareStr);
25
+ const targets = [...new Set(incoming('serves', n.id, 'deploy_target'))].sort(compareStr);
26
+ const servers = [...buckets, ...targets];
27
+ const cdns = new Set(servers.flatMap((s) => incoming('origin', s, 'cdn')));
28
+ // SSR 서버는 CDN 없이 로드 밸런서로 도메인을 바로 받는 경우가 있다
29
+ const domainIds = new Set([...cdns, ...targets].flatMap((c) => incoming('resolves_to', c, 'domain')));
30
+ const domains = [...domainIds]
31
+ .map((id) => byId.get(id))
32
+ .map((d) => ({
33
+ id: d.id,
34
+ label: d.label,
35
+ ...(d.environment !== undefined ? { environment: d.environment } : {}),
36
+ }))
37
+ .sort((a, b) => compareEnvironment(a.environment, b.environment) ||
38
+ compareStr(a.label, b.label) ||
39
+ compareStr(a.id, b.id));
40
+ const evidenced = (p) => (n.platformEvidence?.[p] ?? []).length > 0;
41
+ const listed = new Set(n.platforms ?? []);
42
+ const platforms = PLATFORMS.filter((p) => p === 'web' ? servers.length > 0 || evidenced('web') : listed.has(p) && evidenced(p));
43
+ const prod = domains.find((d) => d.environment === 'prod');
44
+ const hosting = webHostingOf(buckets, targets, byId);
45
+ out.set(n.id, {
46
+ platforms,
47
+ servingBuckets: buckets,
48
+ servingTargets: targets,
49
+ ...(hosting !== undefined ? { webHosting: hosting } : {}),
50
+ domains,
51
+ ...(prod !== undefined ? { prodDomain: prod.label } : {}),
52
+ });
53
+ }
54
+ const apps = indexMicroApps(nodes, edges);
55
+ for (const [service, entry] of apps.entryOf) {
56
+ const own = out.get(service);
57
+ const host = out.get(entry);
58
+ if (own === undefined || host === undefined)
59
+ continue;
60
+ const web = host.platforms.includes('web') || own.platforms.includes('web');
61
+ const { webHosting: _w, prodDomain: _p, ...rest } = own;
62
+ out.set(service, {
63
+ ...rest,
64
+ platforms: PLATFORMS.filter((p) => (p === 'web' ? web : own.platforms.includes(p))),
65
+ servingBuckets: host.servingBuckets,
66
+ servingTargets: host.servingTargets,
67
+ ...(host.webHosting !== undefined ? { webHosting: host.webHosting } : {}),
68
+ domains: host.domains,
69
+ ...(host.prodDomain !== undefined ? { prodDomain: host.prodDomain } : {}),
70
+ });
71
+ }
72
+ return out;
73
+ }
74
+ function webHostingOf(buckets, targets, byId) {
75
+ const prodish = (id) => {
76
+ const env = byId.get(id)?.environment;
77
+ return env === undefined || env === 'prod';
78
+ };
79
+ const prodBuckets = buckets.filter(prodish);
80
+ const prodTargets = targets.filter(prodish);
81
+ const [b, t] = prodBuckets.length + prodTargets.length > 0 ? [prodBuckets, prodTargets] : [buckets, targets];
82
+ if (t.length > 0)
83
+ return 'ssr';
84
+ if (b.length > 0)
85
+ return 'static';
86
+ return undefined;
87
+ }
88
+ //# sourceMappingURL=service-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-facts.js","sourceRoot":"","sources":["../../../src/architecture/service-facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { ArchitectureEdge, ArchitectureIr, ArchitectureNode, ArchitectureProjection, ArchitectureView, ContextSource, UnresolvedQuestion } from './types.js';
2
+ export interface PreviousRunSummary {
3
+ generatedAt: string;
4
+ nodeCount: number;
5
+ edgeCount: number;
6
+ unresolvedOpen: number;
7
+ sourcesUsed: ContextSource[];
8
+ }
9
+ /** `<repoRoot>/.gestalt/architecture/` 아래 뷰별 IR과 HTML을 읽고 쓴다 */
10
+ export declare class ArchitectureStore {
11
+ private readonly dir;
12
+ constructor(repoRoot: string);
13
+ irPath(view: ArchitectureView): string;
14
+ htmlPath(view: ArchitectureView, audience: 'private' | 'shared'): string;
15
+ /** 없으면 null. 깨졌거나 스키마에 안 맞으면 `.corrupt-*`로 옮기고 null */
16
+ load(view: ArchitectureView): ArchitectureIr | null;
17
+ /** private 근거의 excerpt는 디스크에 남기지 않는다. 저장한 경로를 돌려준다 */
18
+ save(ir: ArchitectureIr): string;
19
+ viewPath(view: ArchitectureView, projectionId: string): string;
20
+ /**
21
+ * 투영 하나를 `views/<그림>.<투영 id>.json`에 따로 쌓는다. 질문 하나로 그림을 다시 열거나 남에게 넘길 때
22
+ * 전체 IR 없이 읽히게 투영이 가리키는 노드와 엣지, 그 메시지에 걸린 질문만 함께 담는다.
23
+ * 이번 IR에 없는 같은 그림의 옛 파일은 지운다. 저장한 경로를 돌려준다
24
+ */
25
+ saveViews(ir: ArchitectureIr): string[];
26
+ saveHtml(view: ArchitectureView, audience: 'private' | 'shared', html: string): string;
27
+ }
28
+ export interface ProjectionSlice {
29
+ schemaVersion: string;
30
+ view: ArchitectureView;
31
+ generatedAt: string;
32
+ projection: ArchitectureProjection;
33
+ nodes: ArchitectureNode[];
34
+ edges: ArchitectureEdge[];
35
+ unresolved: UnresolvedQuestion[];
36
+ }
37
+ /** 같은 노드를 알아보는 키. 재실행 병합과 분석 합치기가 같은 기준을 쓴다 */
38
+ export declare function nodeKey(node: Pick<ArchitectureNode, 'kind' | 'repo' | 'label'>): string;
39
+ /**
40
+ * 재실행 IR(next)이 이전 IR(prev)의 id를 물려받게 맞춘다.
41
+ *
42
+ * 생성할 때마다 id가 새로 매겨지면 사람이 단 답이나 화면 위치 기억이 전부 끊긴다.
43
+ * 노드는 kind, repo, 정규화한 label이 같으면 같은 것으로 보고 엣지는 바뀐 노드 id 기준
44
+ * (from, to, kind)가 같으면 같은 것으로 본다. next의 다른 id와 부딪히면 바꾸지 않는다.
45
+ * prev에서 답이 달린 질문은 대상이 merge 결과에 남아 있을 때만 이어 붙인다.
46
+ * 입력은 바꾸지 않는다.
47
+ */
48
+ export declare function mergeWithPrevious(prev: ArchitectureIr, next: ArchitectureIr): ArchitectureIr;
49
+ export declare function previousRunSummary(prev: ArchitectureIr): PreviousRunSummary;
50
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/architecture/store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,gEAAgE;AAChE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,QAAQ,EAAE,MAAM;IAI5B,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM;IAItC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM;IAIxE,uDAAuD;IACvD,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,GAAG,IAAI;IAOnD,sDAAsD;IACtD,IAAI,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM;IAMhC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAI9D;;;;OAIG;IACH,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,EAAE;IAkBvC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;CAKvF;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAwCD,+CAA+C;AAC/C,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,CAKvF;AAUD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,GAAG,cAAc,CAyJ5F;AAkCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAQ3E"}