@layoutdesign/context 0.5.0 → 0.10.1

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 (88) hide show
  1. package/README.md +71 -0
  2. package/dist/bin/cli.js +35 -0
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/src/cli/diff.d.ts +4 -0
  5. package/dist/src/cli/diff.d.ts.map +1 -0
  6. package/dist/src/cli/diff.js +53 -0
  7. package/dist/src/cli/diff.js.map +1 -0
  8. package/dist/src/cli/import-tokens-json.d.ts +5 -0
  9. package/dist/src/cli/import-tokens-json.d.ts.map +1 -0
  10. package/dist/src/cli/import-tokens-json.js +174 -0
  11. package/dist/src/cli/import-tokens-json.js.map +1 -0
  12. package/dist/src/cli/install.d.ts +1 -0
  13. package/dist/src/cli/install.d.ts.map +1 -1
  14. package/dist/src/cli/install.js +25 -0
  15. package/dist/src/cli/install.js.map +1 -1
  16. package/dist/src/cli/lint.d.ts +7 -0
  17. package/dist/src/cli/lint.d.ts.map +1 -0
  18. package/dist/src/cli/lint.js +80 -0
  19. package/dist/src/cli/lint.js.map +1 -0
  20. package/dist/src/cli/live-notify.d.ts +2 -0
  21. package/dist/src/cli/live-notify.d.ts.map +1 -0
  22. package/dist/src/cli/live-notify.js +29 -0
  23. package/dist/src/cli/live-notify.js.map +1 -0
  24. package/dist/src/install/live.d.ts +5 -0
  25. package/dist/src/install/live.d.ts.map +1 -0
  26. package/dist/src/install/live.js +285 -0
  27. package/dist/src/install/live.js.map +1 -0
  28. package/dist/src/kit/stage.d.ts +19 -0
  29. package/dist/src/kit/stage.d.ts.map +1 -0
  30. package/dist/src/kit/stage.js +30 -0
  31. package/dist/src/kit/stage.js.map +1 -0
  32. package/dist/src/lint/diff.d.ts +23 -0
  33. package/dist/src/lint/diff.d.ts.map +1 -0
  34. package/dist/src/lint/diff.js +62 -0
  35. package/dist/src/lint/diff.js.map +1 -0
  36. package/dist/src/lint/layout-md.d.ts +21 -0
  37. package/dist/src/lint/layout-md.d.ts.map +1 -0
  38. package/dist/src/lint/layout-md.js +376 -0
  39. package/dist/src/lint/layout-md.js.map +1 -0
  40. package/dist/src/mcp/live-lock-store.d.ts +40 -0
  41. package/dist/src/mcp/live-lock-store.d.ts.map +1 -0
  42. package/dist/src/mcp/live-lock-store.js +134 -0
  43. package/dist/src/mcp/live-lock-store.js.map +1 -0
  44. package/dist/src/mcp/server.d.ts.map +1 -1
  45. package/dist/src/mcp/server.js +11 -0
  46. package/dist/src/mcp/server.js.map +1 -1
  47. package/dist/src/mcp/tools/_live-socket.d.ts +23 -0
  48. package/dist/src/mcp/tools/_live-socket.d.ts.map +1 -0
  49. package/dist/src/mcp/tools/_live-socket.js +135 -0
  50. package/dist/src/mcp/tools/_live-socket.js.map +1 -0
  51. package/dist/src/mcp/tools/check-setup.d.ts +14 -1
  52. package/dist/src/mcp/tools/check-setup.d.ts.map +1 -1
  53. package/dist/src/mcp/tools/check-setup.js +75 -1
  54. package/dist/src/mcp/tools/check-setup.js.map +1 -1
  55. package/dist/src/mcp/tools/get-recent-visual-edits.d.ts +40 -0
  56. package/dist/src/mcp/tools/get-recent-visual-edits.d.ts.map +1 -0
  57. package/dist/src/mcp/tools/get-recent-visual-edits.js +106 -0
  58. package/dist/src/mcp/tools/get-recent-visual-edits.js.map +1 -0
  59. package/dist/src/mcp/tools/get-selected-element.d.ts +10 -0
  60. package/dist/src/mcp/tools/get-selected-element.d.ts.map +1 -0
  61. package/dist/src/mcp/tools/get-selected-element.js +46 -0
  62. package/dist/src/mcp/tools/get-selected-element.js.map +1 -0
  63. package/dist/src/mcp/tools/lock-file.d.ts +28 -0
  64. package/dist/src/mcp/tools/lock-file.d.ts.map +1 -0
  65. package/dist/src/mcp/tools/lock-file.js +42 -0
  66. package/dist/src/mcp/tools/lock-file.js.map +1 -0
  67. package/dist/src/mcp/tools/unlock-file.d.ts +23 -0
  68. package/dist/src/mcp/tools/unlock-file.d.ts.map +1 -0
  69. package/dist/src/mcp/tools/unlock-file.js +23 -0
  70. package/dist/src/mcp/tools/unlock-file.js.map +1 -0
  71. package/dist/src/plugins/next/babel-loader.d.ts +8 -0
  72. package/dist/src/plugins/next/babel-loader.d.ts.map +1 -0
  73. package/dist/src/plugins/next/babel-loader.js +26 -0
  74. package/dist/src/plugins/next/babel-loader.js.map +1 -0
  75. package/dist/src/plugins/next/index.d.ts +23 -0
  76. package/dist/src/plugins/next/index.d.ts.map +1 -0
  77. package/dist/src/plugins/next/index.js +58 -0
  78. package/dist/src/plugins/next/index.js.map +1 -0
  79. package/dist/src/plugins/transform.d.ts +19 -0
  80. package/dist/src/plugins/transform.d.ts.map +1 -0
  81. package/dist/src/plugins/transform.js +177 -0
  82. package/dist/src/plugins/transform.js.map +1 -0
  83. package/dist/src/plugins/vite/index.d.ts +24 -0
  84. package/dist/src/plugins/vite/index.d.ts.map +1 -0
  85. package/dist/src/plugins/vite/index.js +56 -0
  86. package/dist/src/plugins/vite/index.js.map +1 -0
  87. package/package.json +32 -9
  88. package/skills/layout-md/SKILL.md +135 -0
@@ -0,0 +1,376 @@
1
+ // Linter for the layout.md format. Runs over a loaded Kit (layout.md + the
2
+ // companion tokens.css / tokens.json) and reports issues. Callers get either
3
+ // a structured array (for JSON output + CI integration) or a human-readable
4
+ // pretty-printed summary.
5
+ //
6
+ // The seven rules mirror the checks Google's design.md CLI ships with, plus
7
+ // the specifics our three-tier token system wants to enforce.
8
+ const CANONICAL_SECTIONS = [
9
+ "Quick Reference",
10
+ "Design Direction",
11
+ "Colour System",
12
+ "Typography System",
13
+ "Spacing",
14
+ "Components",
15
+ "Elevation",
16
+ "Motion",
17
+ "Anti-Patterns",
18
+ ];
19
+ // Parses `--name: value;` declarations out of a CSS string using matchAll
20
+ // rather than stateful regex iteration.
21
+ function parseCssDeclarations(css) {
22
+ const pattern = /^\s*(--[a-zA-Z0-9_-]+)\s*:\s*([^;\n]+);/gm;
23
+ const out = [];
24
+ for (const match of css.matchAll(pattern)) {
25
+ const name = match[1];
26
+ const value = match[2];
27
+ if (name && value)
28
+ out.push({ name, value: value.trim(), index: match.index ?? 0 });
29
+ }
30
+ return out;
31
+ }
32
+ // ── Rule 1 ─────────────────────────────────────────────────────────────────
33
+ // broken-token-ref: every var(--name) in layout.md must resolve to a token
34
+ // defined in tokens.css.
35
+ function ruleBrokenTokenRef(kit) {
36
+ const issues = [];
37
+ const defined = new Set();
38
+ if (kit.tokensCss) {
39
+ for (const decl of parseCssDeclarations(kit.tokensCss))
40
+ defined.add(decl.name);
41
+ }
42
+ const pattern = /var\((--[a-zA-Z0-9_-]+)\)/g;
43
+ const seen = new Set();
44
+ for (const match of kit.layoutMd.matchAll(pattern)) {
45
+ const name = match[1];
46
+ if (!name)
47
+ continue;
48
+ if (defined.size > 0 && !defined.has(name) && !seen.has(name)) {
49
+ seen.add(name);
50
+ issues.push({
51
+ ruleId: "broken-token-ref",
52
+ severity: "warning",
53
+ message: `layout.md references var(${name}) but no definition exists in tokens.css.`,
54
+ file: "layout.md",
55
+ line: lineNumberOf(kit.layoutMd, match.index ?? 0),
56
+ detail: { token: name },
57
+ });
58
+ }
59
+ }
60
+ return issues;
61
+ }
62
+ // ── Rule 2 ─────────────────────────────────────────────────────────────────
63
+ // orphaned-tokens: tokens defined in tokens.css but never referenced anywhere
64
+ // in layout.md.
65
+ function ruleOrphanedTokens(kit) {
66
+ if (!kit.tokensCss)
67
+ return [];
68
+ const issues = [];
69
+ const declarations = parseCssDeclarations(kit.tokensCss);
70
+ const referenced = new Set();
71
+ for (const match of kit.layoutMd.matchAll(/var\((--[a-zA-Z0-9_-]+)\)/g)) {
72
+ if (match[1])
73
+ referenced.add(match[1]);
74
+ }
75
+ for (const decl of declarations) {
76
+ if (!referenced.has(decl.name)) {
77
+ issues.push({
78
+ ruleId: "orphaned-tokens",
79
+ severity: "info",
80
+ message: `Token ${decl.name} is defined in tokens.css but never referenced in layout.md.`,
81
+ file: "tokens.css",
82
+ detail: { token: decl.name },
83
+ });
84
+ }
85
+ }
86
+ return issues;
87
+ }
88
+ // ── Rule 3 ─────────────────────────────────────────────────────────────────
89
+ // wcag-aa-contrast: detectable colour pairs must clear 4.5:1 contrast.
90
+ function ruleWcagAaContrast(kit) {
91
+ if (!kit.tokensCss)
92
+ return [];
93
+ const issues = [];
94
+ const colours = parseCssColourTokens(kit.tokensCss);
95
+ const pairs = [];
96
+ for (const [name] of colours) {
97
+ if (name === "--color-primary") {
98
+ const onName = "--color-on-primary";
99
+ if (colours.has(onName))
100
+ pairs.push({ fg: onName, bg: name, context: "on-primary" });
101
+ }
102
+ }
103
+ for (const [txtName] of colours) {
104
+ if (!txtName.startsWith("--text-") && !txtName.startsWith("--color-on-"))
105
+ continue;
106
+ for (const [bgName] of colours) {
107
+ if (!bgName.startsWith("--bg-") && !bgName.startsWith("--color-bg-"))
108
+ continue;
109
+ if (txtName === "--text-primary" && bgName === "--bg-app") {
110
+ pairs.push({ fg: txtName, bg: bgName, context: "body text on app background" });
111
+ }
112
+ }
113
+ }
114
+ for (const pair of pairs) {
115
+ const fg = colours.get(pair.fg);
116
+ const bg = colours.get(pair.bg);
117
+ if (!fg || !bg)
118
+ continue;
119
+ const ratio = contrastRatio(fg, bg);
120
+ if (ratio === null)
121
+ continue;
122
+ if (ratio < 4.5) {
123
+ issues.push({
124
+ ruleId: "wcag-aa-contrast",
125
+ severity: "warning",
126
+ message: `Contrast between ${pair.fg} and ${pair.bg} is ${ratio.toFixed(2)}:1, below WCAG AA threshold (4.5:1) for ${pair.context}.`,
127
+ file: "tokens.css",
128
+ detail: { fg: pair.fg, bg: pair.bg, ratio },
129
+ });
130
+ }
131
+ }
132
+ return issues;
133
+ }
134
+ // ── Rule 4 ─────────────────────────────────────────────────────────────────
135
+ // section-ordering: canonical order enforced when sections are present.
136
+ function ruleSectionOrdering(kit) {
137
+ const positions = [];
138
+ for (const canonical of CANONICAL_SECTIONS) {
139
+ const pattern = new RegExp(`^##\\s+.*${escapeRegex(canonical)}`, "mi");
140
+ const match = kit.layoutMd.match(pattern);
141
+ if (match && match.index !== undefined)
142
+ positions.push({ name: canonical, idx: match.index });
143
+ }
144
+ const issues = [];
145
+ for (let i = 1; i < positions.length; i++) {
146
+ const current = positions[i];
147
+ const previous = positions[i - 1];
148
+ if (current.idx < previous.idx) {
149
+ issues.push({
150
+ ruleId: "section-ordering",
151
+ severity: "info",
152
+ message: `Section "${current.name}" appears before "${previous.name}" in layout.md. Canonical order: Quick Reference, Design Direction, Colour System, Typography, Spacing, Components, Elevation, Motion, Anti-Patterns.`,
153
+ file: "layout.md",
154
+ line: lineNumberOf(kit.layoutMd, current.idx),
155
+ });
156
+ }
157
+ }
158
+ return issues;
159
+ }
160
+ // ── Rule 5 ─────────────────────────────────────────────────────────────────
161
+ // missing-primary: layout.md carries at least one primary/accent colour.
162
+ function ruleMissingPrimary(kit) {
163
+ if (!kit.tokensCss)
164
+ return [];
165
+ const defined = parseCssDeclarations(kit.tokensCss).map((d) => d.name);
166
+ // Accept any token whose basename ends in -primary, -accent, -brand, or
167
+ // matches the bare names. This tolerates prefixed kits like --linear-accent,
168
+ // --stripe-primary, --acme-brand.
169
+ const hasAny = defined.some((name) => /(?:^|-)(primary|accent|brand)$/.test(name));
170
+ if (hasAny)
171
+ return [];
172
+ return [
173
+ {
174
+ ruleId: "missing-primary",
175
+ severity: "error",
176
+ message: `No primary/accent/brand colour token found. Expected any token whose name ends in -primary, -accent, or -brand (e.g. --color-primary, --linear-accent, --acme-brand).`,
177
+ file: "tokens.css",
178
+ },
179
+ ];
180
+ }
181
+ // ── Rule 6 ─────────────────────────────────────────────────────────────────
182
+ // circular-alias: --a: var(--b); --b: var(--a).
183
+ function ruleCircularAlias(kit) {
184
+ if (!kit.tokensCss)
185
+ return [];
186
+ const issues = [];
187
+ const aliases = new Map();
188
+ for (const match of kit.tokensCss.matchAll(/^\s*(--[a-zA-Z0-9_-]+)\s*:\s*var\((--[a-zA-Z0-9_-]+)\)\s*;/gm)) {
189
+ const from = match[1];
190
+ const to = match[2];
191
+ if (from && to)
192
+ aliases.set(from, to);
193
+ }
194
+ const seen = new Set();
195
+ for (const [from] of aliases) {
196
+ if (seen.has(from))
197
+ continue;
198
+ const chain = [from];
199
+ let current = from;
200
+ while (aliases.has(current)) {
201
+ const next = aliases.get(current);
202
+ if (!next)
203
+ break;
204
+ if (chain.includes(next)) {
205
+ chain.push(next);
206
+ issues.push({
207
+ ruleId: "circular-alias",
208
+ severity: "error",
209
+ message: `Circular token alias: ${chain.join(" -> ")}.`,
210
+ file: "tokens.css",
211
+ detail: { chain },
212
+ });
213
+ chain.forEach((c) => seen.add(c));
214
+ break;
215
+ }
216
+ chain.push(next);
217
+ current = next;
218
+ if (chain.length > 32)
219
+ break;
220
+ }
221
+ seen.add(from);
222
+ }
223
+ return issues;
224
+ }
225
+ // ── Rule 7 ─────────────────────────────────────────────────────────────────
226
+ // unknown-property: tokens.json entries whose $type is outside the W3C DTCG
227
+ // set Layout's exporters produce.
228
+ function ruleUnknownProperty(kit) {
229
+ if (!kit.tokensJson)
230
+ return [];
231
+ const issues = [];
232
+ let parsed;
233
+ try {
234
+ parsed = JSON.parse(kit.tokensJson);
235
+ }
236
+ catch {
237
+ return [
238
+ {
239
+ ruleId: "unknown-property",
240
+ severity: "error",
241
+ message: "tokens.json is not valid JSON.",
242
+ file: "tokens.json",
243
+ },
244
+ ];
245
+ }
246
+ const allowed = new Set([
247
+ "color",
248
+ "dimension",
249
+ "fontFamily",
250
+ "fontWeight",
251
+ "fontSize",
252
+ "lineHeight",
253
+ "letterSpacing",
254
+ "typography",
255
+ "shadow",
256
+ "border",
257
+ "duration",
258
+ "cubicBezier",
259
+ "motion",
260
+ "number",
261
+ "string",
262
+ ]);
263
+ walkTokens(parsed, (path, value) => {
264
+ if (value && typeof value === "object" && "$type" in value) {
265
+ const t = value.$type;
266
+ if (typeof t === "string" && !allowed.has(t)) {
267
+ issues.push({
268
+ ruleId: "unknown-property",
269
+ severity: "info",
270
+ message: `Token ${path} declares $type "${t}" which is not in the W3C DTCG vocabulary Layout emits.`,
271
+ file: "tokens.json",
272
+ detail: { path, type: t },
273
+ });
274
+ }
275
+ }
276
+ });
277
+ return issues;
278
+ }
279
+ // Helpers ────────────────────────────────────────────────────────────────
280
+ function escapeRegex(s) {
281
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
282
+ }
283
+ function lineNumberOf(text, index) {
284
+ return text.slice(0, index).split("\n").length;
285
+ }
286
+ function walkTokens(obj, visit, prefix = "") {
287
+ for (const [key, value] of Object.entries(obj)) {
288
+ const next = prefix ? `${prefix}.${key}` : key;
289
+ if (value && typeof value === "object") {
290
+ if ("$value" in value) {
291
+ visit(next, value);
292
+ }
293
+ else {
294
+ walkTokens(value, visit, next);
295
+ }
296
+ }
297
+ }
298
+ }
299
+ function parseCssColourTokens(css) {
300
+ const map = new Map();
301
+ for (const decl of parseCssDeclarations(css)) {
302
+ if (isColourValue(decl.value))
303
+ map.set(decl.name, decl.value);
304
+ }
305
+ return map;
306
+ }
307
+ function isColourValue(v) {
308
+ return /^#([0-9a-fA-F]{3,8})$/.test(v) || /^rgb\(/i.test(v) || /^rgba\(/i.test(v);
309
+ }
310
+ function parseHex(value) {
311
+ const match = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.exec(value.trim());
312
+ if (!match || !match[1])
313
+ return null;
314
+ let hex = match[1];
315
+ if (hex.length === 3)
316
+ hex = hex.split("").map((c) => c + c).join("");
317
+ const r = parseInt(hex.slice(0, 2), 16);
318
+ const g = parseInt(hex.slice(2, 4), 16);
319
+ const b = parseInt(hex.slice(4, 6), 16);
320
+ const a = hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;
321
+ return [r, g, b, a];
322
+ }
323
+ function parseRgb(value) {
324
+ const match = /^rgba?\(\s*([^)]+)\)\s*$/i.exec(value.trim());
325
+ if (!match || !match[1])
326
+ return null;
327
+ const parts = match[1].split(",").map((p) => p.trim());
328
+ if (parts.length < 3)
329
+ return null;
330
+ const r = Number.parseFloat(parts[0]);
331
+ const g = Number.parseFloat(parts[1]);
332
+ const b = Number.parseFloat(parts[2]);
333
+ const a = parts[3] !== undefined ? Number.parseFloat(parts[3]) : 1;
334
+ if ([r, g, b].some((n) => Number.isNaN(n)))
335
+ return null;
336
+ return [r, g, b, a];
337
+ }
338
+ function channel(c) {
339
+ const v = c / 255;
340
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
341
+ }
342
+ function relativeLuminance(rgb) {
343
+ const [r, g, b] = rgb;
344
+ return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b);
345
+ }
346
+ function contrastRatio(fg, bg) {
347
+ const fgRgb = parseHex(fg) ?? parseRgb(fg);
348
+ const bgRgb = parseHex(bg) ?? parseRgb(bg);
349
+ if (!fgRgb || !bgRgb)
350
+ return null;
351
+ const l1 = relativeLuminance([fgRgb[0], fgRgb[1], fgRgb[2]]);
352
+ const l2 = relativeLuminance([bgRgb[0], bgRgb[1], bgRgb[2]]);
353
+ const [lighter, darker] = l1 > l2 ? [l1, l2] : [l2, l1];
354
+ return (lighter + 0.05) / (darker + 0.05);
355
+ }
356
+ // ── Public API ─────────────────────────────────────────────────────────────
357
+ export function lintKit(kit) {
358
+ const rules = [
359
+ ruleBrokenTokenRef,
360
+ ruleOrphanedTokens,
361
+ ruleWcagAaContrast,
362
+ ruleSectionOrdering,
363
+ ruleMissingPrimary,
364
+ ruleCircularAlias,
365
+ ruleUnknownProperty,
366
+ ];
367
+ const issues = rules.flatMap((r) => r(kit));
368
+ const errors = issues.filter((i) => i.severity === "error").length;
369
+ const warnings = issues.filter((i) => i.severity === "warning").length;
370
+ const info = issues.filter((i) => i.severity === "info").length;
371
+ return {
372
+ issues,
373
+ summary: { errors, warnings, info, passed: errors === 0 },
374
+ };
375
+ }
376
+ //# sourceMappingURL=layout-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-md.js","sourceRoot":"","sources":["../../../src/lint/layout-md.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,0BAA0B;AAC1B,EAAE;AACF,4EAA4E;AAC5E,8DAA8D;AAyB9D,MAAM,kBAAkB,GAAG;IACzB,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;IACf,mBAAmB;IACnB,SAAS;IACT,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,eAAe;CACP,CAAC;AAEX,0EAA0E;AAC1E,wCAAwC;AACxC,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,2CAA2C,CAAC;IAC5D,MAAM,GAAG,GAA0D,EAAE,CAAC;IACtE,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,yBAAyB;AACzB,SAAS,kBAAkB,CAAC,GAAQ;IAClC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,OAAO,GAAG,4BAA4B,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,kBAAkB;gBAC1B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,4BAA4B,IAAI,2CAA2C;gBACpF,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;gBAClD,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,gBAAgB;AAChB,SAAS,kBAAkB,CAAC,GAAQ;IAClC,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;QACxE,IAAI,KAAK,CAAC,CAAC,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,iBAAiB;gBACzB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,8DAA8D;gBACzF,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,GAAQ;IAClC,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAuD,EAAE,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,oBAAoB,CAAC;YACpC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,SAAS;QACnF,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC;gBAAE,SAAS;YAC/E,IAAI,OAAO,KAAK,gBAAgB,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;YAAE,SAAS;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC7B,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,kBAAkB;gBAC1B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,oBAAoB,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2CAA2C,IAAI,CAAC,OAAO,GAAG;gBACpI,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,wEAAwE;AACxE,SAAS,mBAAmB,CAAC,GAAQ;IACnC,MAAM,SAAS,GAAyC,EAAE,CAAC;IAC3D,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,YAAY,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QACnC,IAAI,OAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,kBAAkB;gBAC1B,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,YAAY,OAAO,CAAC,IAAI,qBAAqB,QAAQ,CAAC,IAAI,uJAAuJ;gBAC1N,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,yEAAyE;AACzE,SAAS,kBAAkB,CAAC,GAAQ;IAClC,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,wEAAwE;IACxE,6EAA6E;IAC7E,kCAAkC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACnC,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;IACF,IAAI,MAAM;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO;QACL;YACE,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,uKAAuK;YAChL,IAAI,EAAE,YAAY;SACnB;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,gDAAgD;AAChD,SAAS,iBAAiB,CAAC,GAAQ;IACjC,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CACxC,8DAA8D,CAC/D,EAAE,CAAC;QACF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,IAAI,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI;gBAAE,MAAM;YACjB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,gBAAgB;oBACxB,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,yBAAyB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;oBACvD,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,EAAE,KAAK,EAAE;iBAClB,CAAC,CAAC;gBACH,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM;YACR,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;gBAAE,MAAM;QAC/B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,kCAAkC;AAClC,SAAS,mBAAmB,CAAC,GAAQ;IACnC,IAAI,CAAC,GAAG,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,aAAa;aACpB;SACF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;QACtB,OAAO;QACP,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,eAAe;QACf,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,aAAa;QACb,QAAQ;QACR,QAAQ;QACR,QAAQ;KACT,CAAC,CAAC;IAEH,UAAU,CAAC,MAAiC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAI,KAA6B,CAAC,KAAK,CAAC;YAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,kBAAkB;oBAC1B,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,SAAS,IAAI,oBAAoB,CAAC,yDAAyD;oBACpG,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2EAA2E;AAE3E,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CACjB,GAA4B,EAC5B,KAA6D,EAC7D,MAAM,GAAG,EAAE;IAEX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,IAAI,QAAQ,IAAK,KAAgB,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,EAAE,KAAgC,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,KAAgC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,KAAK,GAAG,mDAAmD,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACrF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,GAAG,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAClB,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAC,GAA6B;IACtD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;IACtB,OAAO,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,aAAa,CAAC,EAAU,EAAE,EAAU;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,EAAE,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,EAAE,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAE9E,MAAM,UAAU,OAAO,CAAC,GAAQ;IAC9B,MAAM,KAAK,GAAG;QACZ,kBAAkB;QAClB,kBAAkB;QAClB,kBAAkB;QAClB,mBAAmB;QACnB,kBAAkB;QAClB,iBAAiB;QACjB,mBAAmB;KACpB,CAAC;IACF,MAAM,MAAM,GAAgB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,OAAO;QACL,MAAM;QACN,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,EAAE;KAC1D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ export type LockHolder = "live" | "claude" | string;
2
+ export interface LockEntry {
3
+ holder: LockHolder;
4
+ lock_id: string;
5
+ acquired_at: string;
6
+ expires_at: string;
7
+ reason?: string;
8
+ }
9
+ export type LocksFile = Record<string, LockEntry>;
10
+ export type AcquireResult = {
11
+ acquired: true;
12
+ lock_id: string;
13
+ expires_at: string;
14
+ } | {
15
+ acquired: false;
16
+ current_holder: LockHolder;
17
+ expires_at: string;
18
+ };
19
+ /**
20
+ * Acquire (or take over an expired) write lock for `relPath`.
21
+ *
22
+ * Returns `{ acquired: false, current_holder, expires_at }` when a live,
23
+ * unexpired lock is already held by someone else.
24
+ */
25
+ export declare function acquireLock(projectRoot: string, opts: {
26
+ path: string;
27
+ ttlSeconds: number;
28
+ reason?: string;
29
+ holder?: LockHolder;
30
+ }): Promise<AcquireResult>;
31
+ /**
32
+ * Release a lock by its `lock_id`. Only the matching entry is removed, so a
33
+ * stale `lock_id` from a since-taken-over lock cannot evict the new holder.
34
+ */
35
+ export declare function releaseLock(projectRoot: string, lockId: string): Promise<{
36
+ released: boolean;
37
+ }>;
38
+ /** Read the current locks map (best-effort; empty if file absent/corrupt). */
39
+ export declare function readLocks(projectRoot: string): Promise<LocksFile>;
40
+ //# sourceMappingURL=live-lock-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-lock-store.d.ts","sourceRoot":"","sources":["../../../src/mcp/live-lock-store.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAElD,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AA+DxE;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,GACA,OAAO,CAAC,aAAa,CAAC,CAwCxB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAYhC;AAED,8EAA8E;AAC9E,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAGvE"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * File-based write-lock coordination between Claude Code (via the MCP tools)
3
+ * and the layout Live desktop app.
4
+ *
5
+ * Locks live in `.layout/live/locks.json` at the project root (gitignored by
6
+ * default). Both Live and these MCP handlers mutate that file, so every
7
+ * read-modify-write is wrapped in a `proper-lockfile` advisory lock for
8
+ * atomicity. Stale locks (past `expires_at`) are taken over automatically with
9
+ * a warning logged to stderr.
10
+ *
11
+ * The file-based design means Claude's `lock-file` MCP call does not have to
12
+ * wait on IPC to a desktop app — it works even when Live's socket is slow or
13
+ * Live isn't running at all.
14
+ */
15
+ import { promises as fs } from "node:fs";
16
+ import path from "node:path";
17
+ import crypto from "node:crypto";
18
+ import lockfile from "proper-lockfile";
19
+ const LIVE_DIR = path.join(".layout", "live");
20
+ const LOCKS_FILE = "locks.json";
21
+ function locksPath(projectRoot) {
22
+ return path.join(projectRoot, LIVE_DIR, LOCKS_FILE);
23
+ }
24
+ async function ensureLocksFile(projectRoot) {
25
+ const file = locksPath(projectRoot);
26
+ await fs.mkdir(path.dirname(file), { recursive: true });
27
+ try {
28
+ await fs.access(file);
29
+ }
30
+ catch {
31
+ await fs.writeFile(file, "{}\n", "utf8");
32
+ }
33
+ return file;
34
+ }
35
+ async function readLocksFile(file) {
36
+ try {
37
+ const raw = await fs.readFile(file, "utf8");
38
+ const parsed = JSON.parse(raw || "{}");
39
+ return parsed && typeof parsed === "object" ? parsed : {};
40
+ }
41
+ catch {
42
+ return {};
43
+ }
44
+ }
45
+ async function writeLocksFile(file, locks) {
46
+ await fs.writeFile(file, JSON.stringify(locks, null, 2) + "\n", "utf8");
47
+ }
48
+ /**
49
+ * Run `fn` against the locks file while holding an exclusive advisory lock on
50
+ * it, so concurrent Live + MCP writers never interleave a read-modify-write.
51
+ */
52
+ async function withLocksFile(projectRoot, fn) {
53
+ const file = await ensureLocksFile(projectRoot);
54
+ const release = await lockfile.lock(file, {
55
+ retries: { retries: 10, factor: 1.5, minTimeout: 20, maxTimeout: 200 },
56
+ stale: 10_000,
57
+ realpath: false,
58
+ });
59
+ try {
60
+ const current = await readLocksFile(file);
61
+ const { result, locks } = await fn(current);
62
+ await writeLocksFile(file, locks);
63
+ return result;
64
+ }
65
+ finally {
66
+ await release();
67
+ }
68
+ }
69
+ function isExpired(entry, now) {
70
+ const expiry = Date.parse(entry.expires_at);
71
+ return Number.isNaN(expiry) || expiry <= now;
72
+ }
73
+ /**
74
+ * Acquire (or take over an expired) write lock for `relPath`.
75
+ *
76
+ * Returns `{ acquired: false, current_holder, expires_at }` when a live,
77
+ * unexpired lock is already held by someone else.
78
+ */
79
+ export async function acquireLock(projectRoot, opts) {
80
+ const holder = opts.holder ?? "claude";
81
+ return withLocksFile(projectRoot, (locks) => {
82
+ const now = Date.now();
83
+ const existing = locks[opts.path];
84
+ if (existing && !isExpired(existing, now)) {
85
+ return {
86
+ result: {
87
+ acquired: false,
88
+ current_holder: existing.holder,
89
+ expires_at: existing.expires_at,
90
+ },
91
+ locks,
92
+ };
93
+ }
94
+ if (existing && isExpired(existing, now)) {
95
+ console.warn(`[layout-context] Taking over stale lock on "${opts.path}" ` +
96
+ `(was held by "${existing.holder}", expired ${existing.expires_at})`);
97
+ }
98
+ const lockId = crypto.randomUUID();
99
+ const acquiredAt = new Date(now).toISOString();
100
+ const expiresAt = new Date(now + opts.ttlSeconds * 1000).toISOString();
101
+ const entry = {
102
+ holder,
103
+ lock_id: lockId,
104
+ acquired_at: acquiredAt,
105
+ expires_at: expiresAt,
106
+ ...(opts.reason ? { reason: opts.reason } : {}),
107
+ };
108
+ return {
109
+ result: { acquired: true, lock_id: lockId, expires_at: expiresAt },
110
+ locks: { ...locks, [opts.path]: entry },
111
+ };
112
+ });
113
+ }
114
+ /**
115
+ * Release a lock by its `lock_id`. Only the matching entry is removed, so a
116
+ * stale `lock_id` from a since-taken-over lock cannot evict the new holder.
117
+ */
118
+ export async function releaseLock(projectRoot, lockId) {
119
+ return withLocksFile(projectRoot, (locks) => {
120
+ const entry = Object.entries(locks).find(([, v]) => v.lock_id === lockId);
121
+ if (!entry) {
122
+ return { result: { released: false }, locks };
123
+ }
124
+ const next = { ...locks };
125
+ delete next[entry[0]];
126
+ return { result: { released: true }, locks: next };
127
+ });
128
+ }
129
+ /** Read the current locks map (best-effort; empty if file absent/corrupt). */
130
+ export async function readLocks(projectRoot) {
131
+ const file = locksPath(projectRoot);
132
+ return readLocksFile(file);
133
+ }
134
+ //# sourceMappingURL=live-lock-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-lock-store.js","sourceRoot":"","sources":["../../../src/mcp/live-lock-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AA+BA;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAoMjD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAoCA;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkOjD"}
@@ -24,6 +24,11 @@ import * as getScreenshots from "./tools/get-screenshots.js";
24
24
  import * as checkSetup from "./tools/check-setup.js";
25
25
  import * as pushTokensToFigma from "./tools/push-tokens-to-figma.js";
26
26
  import * as scanProject from "./tools/scan-project.js";
27
+ // Live integration tools (v0.7.0) — query the layout Live desktop app
28
+ import * as getSelectedElement from "./tools/get-selected-element.js";
29
+ import * as getRecentVisualEdits from "./tools/get-recent-visual-edits.js";
30
+ import * as lockFile from "./tools/lock-file.js";
31
+ import * as unlockFile from "./tools/unlock-file.js";
27
32
  /**
28
33
  * Start the Layout Context MCP server.
29
34
  * Loads the kit from the current working directory and registers all tools.
@@ -131,6 +136,12 @@ export async function startServer() {
131
136
  server.tool(checkSetup.name, checkSetup.description, checkSetup.inputSchema, checkSetup.handler());
132
137
  server.tool(pushTokensToFigma.name, pushTokensToFigma.description, pushTokensToFigma.inputSchema, pushTokensToFigma.handler(kit));
133
138
  server.tool(scanProject.name, scanProject.description, scanProject.inputSchema, scanProject.handler());
139
+ // Live integration tools (v0.7.0). Registered unconditionally — they return
140
+ // cleanly-typed "Live not running" responses when the desktop app is absent.
141
+ server.tool(getSelectedElement.name, getSelectedElement.description, getSelectedElement.inputSchema, getSelectedElement.handler());
142
+ server.tool(getRecentVisualEdits.name, getRecentVisualEdits.description, getRecentVisualEdits.inputSchema, getRecentVisualEdits.handler());
143
+ server.tool(lockFile.name, lockFile.description, lockFile.inputSchema, lockFile.handler());
144
+ server.tool(unlockFile.name, unlockFile.description, unlockFile.inputSchema, unlockFile.handler());
134
145
  // Connect via stdio
135
146
  const transport = new StdioServerTransport();
136
147
  await server.connect(transport);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}