@tienne/gestalt 0.77.1 → 0.78.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.
- package/dist/package.json +1 -1
- package/dist/plugin/skills/_shared/proactive-routing.md +39 -2
- package/dist/plugin/skills/_shared/rule-sources.md +262 -0
- package/dist/plugin/skills/execute/SKILL.md +81 -1
- package/dist/plugin/skills/interview/SKILL.md +53 -0
- package/dist/plugin/skills/review/SKILL.md +14 -1
- package/dist/plugin/skills/solve/SKILL.md +34 -1
- package/dist/plugin/skills/spec/SKILL.md +36 -0
- package/dist/schemas/gestalt.schema.json +65 -0
- package/dist/src/core/config.d.ts +156 -2
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +454 -10
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/mcp/input-guard.d.ts +90 -0
- package/dist/src/mcp/input-guard.d.ts.map +1 -0
- package/dist/src/mcp/input-guard.js +531 -0
- package/dist/src/mcp/input-guard.js.map +1 -0
- package/dist/src/mcp/schemas.d.ts +70 -70
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +31 -22
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +32 -23
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/status.d.ts +14 -2
- package/dist/src/mcp/tools/status.d.ts.map +1 -1
- package/dist/src/mcp/tools/status.js +41 -8
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/package.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/skills/_shared/proactive-routing.md +39 -2
- package/plugin/skills/_shared/rule-sources.md +262 -0
- package/plugin/skills/execute/SKILL.md +81 -1
- package/plugin/skills/interview/SKILL.md +53 -0
- package/plugin/skills/review/SKILL.md +14 -1
- package/plugin/skills/solve/SKILL.md +34 -1
- package/plugin/skills/spec/SKILL.md +36 -0
- package/schemas/gestalt.schema.json +65 -0
|
@@ -110,6 +110,27 @@
|
|
|
110
110
|
"description": "Directory containing agent definitions (env: GESTALT_AGENTS_DIR)",
|
|
111
111
|
"default": "agents"
|
|
112
112
|
},
|
|
113
|
+
"ruleSources": {
|
|
114
|
+
"type": "array",
|
|
115
|
+
"items": { "$ref": "#/definitions/ruleSource" },
|
|
116
|
+
"maxItems": 32,
|
|
117
|
+
"description": "Rule sources outside this repo that skills must read before producing work — declared per repo so Gestalt itself stays organization-agnostic. Only declared sources are read; Gestalt never scans attached MCP servers to pick one",
|
|
118
|
+
"default": []
|
|
119
|
+
},
|
|
120
|
+
"ruleSourceErrors": {
|
|
121
|
+
"type": "array",
|
|
122
|
+
"items": { "type": "string" },
|
|
123
|
+
"readOnly": true,
|
|
124
|
+
"description": "Filled by Gestalt, not by the author. Non-empty means a ruleSources declaration could not be parsed — skills stop. Do not read an empty ruleSources array as 'nothing declared' without checking this",
|
|
125
|
+
"default": []
|
|
126
|
+
},
|
|
127
|
+
"ruleSourceWarnings": {
|
|
128
|
+
"type": "array",
|
|
129
|
+
"items": { "type": "string" },
|
|
130
|
+
"readOnly": true,
|
|
131
|
+
"description": "Filled by Gestalt, not by the author. Things worth pointing out that are not a reason to stop, such as a top-level key that looks like a misspelled 'ruleSources'. Kept apart from ruleSourceErrors so widening a detector can never halt a session",
|
|
132
|
+
"default": []
|
|
133
|
+
},
|
|
113
134
|
"notifications": {
|
|
114
135
|
"type": "boolean",
|
|
115
136
|
"description": "Enable OS desktop notifications for pipeline events (env: GESTALT_NOTIFICATIONS)",
|
|
@@ -154,6 +175,50 @@
|
|
|
154
175
|
},
|
|
155
176
|
"required": ["provider", "model"],
|
|
156
177
|
"additionalProperties": false
|
|
178
|
+
},
|
|
179
|
+
"ruleSource": {
|
|
180
|
+
"type": "object",
|
|
181
|
+
"description": "A standard neither Gestalt nor the target repo owns — design tokens, org conventions, product principles. See plugin/skills/_shared/rule-sources.md",
|
|
182
|
+
"properties": {
|
|
183
|
+
"id": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"minLength": 1,
|
|
186
|
+
"maxLength": 64,
|
|
187
|
+
"description": "Name used in reporting. Must be unique within this config. Shown to the user as-is, so anything that opens a new line or table cell is rejected — control characters, line/paragraph separators, backticks and pipes, including forms that normalize into them. Leading and trailing whitespace is rejected too. Non-ASCII names such as Korean are fine"
|
|
188
|
+
},
|
|
189
|
+
"kind": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"enum": ["mcp", "file", "skill"],
|
|
192
|
+
"description": "Where the rule lives — an MCP tool, a file path, or another skill that owns the task"
|
|
193
|
+
},
|
|
194
|
+
"ref": {
|
|
195
|
+
"type": "string",
|
|
196
|
+
"minLength": 1,
|
|
197
|
+
"maxLength": 512,
|
|
198
|
+
"description": "Target for the given kind — MCP tool name (mcp__plate__get_design_tokens), repo-relative file path, or skill name (review, gestalt:review). No character that could make the checked value differ from the value actually opened: whitespace, invisible characters, forms that normalize into something else, and separator lookalikes. The stored ref is normalized to NFC so it matches what was checked. A file ref must stay inside the repo: absolute paths, .., and credential files are rejected. Over the length limit the source is rejected rather than truncated, so a source is never silently unreadable. The full list lives in plugin/skills/_shared/rule-sources.md"
|
|
199
|
+
},
|
|
200
|
+
"scope": {
|
|
201
|
+
"type": "array",
|
|
202
|
+
"items": { "type": "string", "minLength": 1, "maxLength": 32 },
|
|
203
|
+
"maxItems": 16,
|
|
204
|
+
"description": "Read this source only for tasks tagged with one of these. Tags come from the files the task touches (ui, css, api, db, docs, test), not from the request wording. Empty means always read",
|
|
205
|
+
"default": []
|
|
206
|
+
},
|
|
207
|
+
"trust": {
|
|
208
|
+
"type": "string",
|
|
209
|
+
"enum": ["convention", "delegate"],
|
|
210
|
+
"description": "'convention' follows the format it defines (token names, naming, required fields). 'delegate' hands the task to it instead and requires kind: skill. Neither lets the source widen the scope of work",
|
|
211
|
+
"default": "convention"
|
|
212
|
+
},
|
|
213
|
+
"onMissing": {
|
|
214
|
+
"type": "string",
|
|
215
|
+
"enum": ["skip", "warn", "stop"],
|
|
216
|
+
"description": "When the source cannot be read. 'skip' proceeds silently, 'warn' proceeds and records the gap in the completion report, 'stop' halts and explains what would unblock it",
|
|
217
|
+
"default": "warn"
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
"required": ["id", "kind", "ref"],
|
|
221
|
+
"additionalProperties": false
|
|
157
222
|
}
|
|
158
223
|
}
|
|
159
224
|
}
|
|
@@ -16,6 +16,63 @@ declare const llmTierConfigSchema: z.ZodObject<{
|
|
|
16
16
|
baseURL?: string | undefined;
|
|
17
17
|
}>;
|
|
18
18
|
export type LLMTierConfig = z.infer<typeof llmTierConfigSchema>;
|
|
19
|
+
/**
|
|
20
|
+
* 레포 밖에 있는 규칙 소스. 게슈탈트도 대상 레포도 소유하지 않은 기준을 가리킨다.
|
|
21
|
+
*
|
|
22
|
+
* 선언된 것만 읽는다 — 붙어 있는 MCP를 훑어 고르면 무엇을 근거로 삼았는지 사라진다.
|
|
23
|
+
* 적용 규칙은 `plugin/skills/_shared/rule-sources.md`가 원본이다.
|
|
24
|
+
*/
|
|
25
|
+
declare const ruleSourceSchema: z.ZodEffects<z.ZodObject<{
|
|
26
|
+
/** 보고에 쓰는 이름. 레포 안에서 고유해야 한다. ref 와 같이 NFC 로 맞춰 둔다 */
|
|
27
|
+
id: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
|
|
28
|
+
kind: z.ZodEnum<["mcp", "file", "skill"]>;
|
|
29
|
+
/**
|
|
30
|
+
* kind별 대상 — mcp면 도구 이름, file이면 경로, skill이면 스킬 이름.
|
|
31
|
+
*
|
|
32
|
+
* 상한이 있는 건 이 값이 ges_status 응답으로 매번 실려 나가서다. 넘으면 자르지
|
|
33
|
+
* 않고 거부한다 — 자른 ref 는 스킬이 가진 유일한 ref 라, 읽기에 실패한 뒤
|
|
34
|
+
* onMissing 을 타고 조용히 지나간다. 거부하면 ruleSourceErrors 로 드러난다.
|
|
35
|
+
*
|
|
36
|
+
* NFC 로 맞춰 둔다. 검사만 정규화하고 원본을 저장하면 검사한 값과 스킬이 받는 값이
|
|
37
|
+
* 또 갈라진다 — 그 틈을 없애려고 고친 자리라 여기서 되풀이하지 않는다
|
|
38
|
+
*/
|
|
39
|
+
ref: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
|
|
40
|
+
/** 이 태그가 걸린 작업에서만 읽는다. 비면 항상 읽는다 */
|
|
41
|
+
scope: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
42
|
+
/** convention=형식을 따른다, delegate=그 작업을 넘긴다 */
|
|
43
|
+
trust: z.ZodDefault<z.ZodEnum<["convention", "delegate"]>>;
|
|
44
|
+
/** 못 읽었을 때. warn 이상은 결과에 남는다 */
|
|
45
|
+
onMissing: z.ZodDefault<z.ZodEnum<["skip", "warn", "stop"]>>;
|
|
46
|
+
}, "strict", z.ZodTypeAny, {
|
|
47
|
+
id: string;
|
|
48
|
+
kind: "mcp" | "file" | "skill";
|
|
49
|
+
ref: string;
|
|
50
|
+
scope: string[];
|
|
51
|
+
trust: "convention" | "delegate";
|
|
52
|
+
onMissing: "skip" | "warn" | "stop";
|
|
53
|
+
}, {
|
|
54
|
+
id: string;
|
|
55
|
+
kind: "mcp" | "file" | "skill";
|
|
56
|
+
ref: string;
|
|
57
|
+
scope?: string[] | undefined;
|
|
58
|
+
trust?: "convention" | "delegate" | undefined;
|
|
59
|
+
onMissing?: "skip" | "warn" | "stop" | undefined;
|
|
60
|
+
}>, {
|
|
61
|
+
id: string;
|
|
62
|
+
kind: "mcp" | "file" | "skill";
|
|
63
|
+
ref: string;
|
|
64
|
+
scope: string[];
|
|
65
|
+
trust: "convention" | "delegate";
|
|
66
|
+
onMissing: "skip" | "warn" | "stop";
|
|
67
|
+
}, {
|
|
68
|
+
id: string;
|
|
69
|
+
kind: "mcp" | "file" | "skill";
|
|
70
|
+
ref: string;
|
|
71
|
+
scope?: string[] | undefined;
|
|
72
|
+
trust?: "convention" | "delegate" | undefined;
|
|
73
|
+
onMissing?: "skip" | "warn" | "stop" | undefined;
|
|
74
|
+
}>;
|
|
75
|
+
export type RuleSource = z.infer<typeof ruleSourceSchema>;
|
|
19
76
|
declare const configSchema: z.ZodObject<{
|
|
20
77
|
llm: z.ZodDefault<z.ZodObject<{
|
|
21
78
|
apiKey: z.ZodDefault<z.ZodString>;
|
|
@@ -149,6 +206,83 @@ declare const configSchema: z.ZodObject<{
|
|
|
149
206
|
standard?: "haiku" | "sonnet" | "opus" | "fable" | undefined;
|
|
150
207
|
frontier?: "haiku" | "sonnet" | "opus" | "fable" | undefined;
|
|
151
208
|
}>>;
|
|
209
|
+
ruleSources: z.ZodDefault<z.ZodEffects<z.ZodArray<z.ZodEffects<z.ZodObject<{
|
|
210
|
+
/** 보고에 쓰는 이름. 레포 안에서 고유해야 한다. ref 와 같이 NFC 로 맞춰 둔다 */
|
|
211
|
+
id: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
|
|
212
|
+
kind: z.ZodEnum<["mcp", "file", "skill"]>;
|
|
213
|
+
/**
|
|
214
|
+
* kind별 대상 — mcp면 도구 이름, file이면 경로, skill이면 스킬 이름.
|
|
215
|
+
*
|
|
216
|
+
* 상한이 있는 건 이 값이 ges_status 응답으로 매번 실려 나가서다. 넘으면 자르지
|
|
217
|
+
* 않고 거부한다 — 자른 ref 는 스킬이 가진 유일한 ref 라, 읽기에 실패한 뒤
|
|
218
|
+
* onMissing 을 타고 조용히 지나간다. 거부하면 ruleSourceErrors 로 드러난다.
|
|
219
|
+
*
|
|
220
|
+
* NFC 로 맞춰 둔다. 검사만 정규화하고 원본을 저장하면 검사한 값과 스킬이 받는 값이
|
|
221
|
+
* 또 갈라진다 — 그 틈을 없애려고 고친 자리라 여기서 되풀이하지 않는다
|
|
222
|
+
*/
|
|
223
|
+
ref: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
|
|
224
|
+
/** 이 태그가 걸린 작업에서만 읽는다. 비면 항상 읽는다 */
|
|
225
|
+
scope: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
226
|
+
/** convention=형식을 따른다, delegate=그 작업을 넘긴다 */
|
|
227
|
+
trust: z.ZodDefault<z.ZodEnum<["convention", "delegate"]>>;
|
|
228
|
+
/** 못 읽었을 때. warn 이상은 결과에 남는다 */
|
|
229
|
+
onMissing: z.ZodDefault<z.ZodEnum<["skip", "warn", "stop"]>>;
|
|
230
|
+
}, "strict", z.ZodTypeAny, {
|
|
231
|
+
id: string;
|
|
232
|
+
kind: "mcp" | "file" | "skill";
|
|
233
|
+
ref: string;
|
|
234
|
+
scope: string[];
|
|
235
|
+
trust: "convention" | "delegate";
|
|
236
|
+
onMissing: "skip" | "warn" | "stop";
|
|
237
|
+
}, {
|
|
238
|
+
id: string;
|
|
239
|
+
kind: "mcp" | "file" | "skill";
|
|
240
|
+
ref: string;
|
|
241
|
+
scope?: string[] | undefined;
|
|
242
|
+
trust?: "convention" | "delegate" | undefined;
|
|
243
|
+
onMissing?: "skip" | "warn" | "stop" | undefined;
|
|
244
|
+
}>, {
|
|
245
|
+
id: string;
|
|
246
|
+
kind: "mcp" | "file" | "skill";
|
|
247
|
+
ref: string;
|
|
248
|
+
scope: string[];
|
|
249
|
+
trust: "convention" | "delegate";
|
|
250
|
+
onMissing: "skip" | "warn" | "stop";
|
|
251
|
+
}, {
|
|
252
|
+
id: string;
|
|
253
|
+
kind: "mcp" | "file" | "skill";
|
|
254
|
+
ref: string;
|
|
255
|
+
scope?: string[] | undefined;
|
|
256
|
+
trust?: "convention" | "delegate" | undefined;
|
|
257
|
+
onMissing?: "skip" | "warn" | "stop" | undefined;
|
|
258
|
+
}>, "many">, {
|
|
259
|
+
id: string;
|
|
260
|
+
kind: "mcp" | "file" | "skill";
|
|
261
|
+
ref: string;
|
|
262
|
+
scope: string[];
|
|
263
|
+
trust: "convention" | "delegate";
|
|
264
|
+
onMissing: "skip" | "warn" | "stop";
|
|
265
|
+
}[], {
|
|
266
|
+
id: string;
|
|
267
|
+
kind: "mcp" | "file" | "skill";
|
|
268
|
+
ref: string;
|
|
269
|
+
scope?: string[] | undefined;
|
|
270
|
+
trust?: "convention" | "delegate" | undefined;
|
|
271
|
+
onMissing?: "skip" | "warn" | "stop" | undefined;
|
|
272
|
+
}[]>>;
|
|
273
|
+
/**
|
|
274
|
+
* ruleSources 선언이 깨졌을 때 그 이유. 사용자가 쓰는 필드가 아니라 loadConfig가 채운다.
|
|
275
|
+
* 비어 있지 않으면 선언은 있었는데 못 읽은 상태이므로 스킬은 진행하지 않는다.
|
|
276
|
+
*/
|
|
277
|
+
ruleSourceErrors: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
278
|
+
/**
|
|
279
|
+
* 선언이 깨지진 않았는데 짚어줄 게 있을 때. 마찬가지로 loadConfig가 채운다.
|
|
280
|
+
*
|
|
281
|
+
* **멈춤 사유와 한 필드에 담지 않는다.** 담으면 탐지기를 한 번 넓힐 때마다 그게
|
|
282
|
+
* 세션을 세우는 레버가 된다 — 실제로 키 이름 오타 탐지를 넓혔더니 `resources` 같은
|
|
283
|
+
* 남의 키 하나로 이 값을 읽는 자리가 전부 멈췄다. 확실하지 않은 판정은 여기로 온다.
|
|
284
|
+
*/
|
|
285
|
+
ruleSourceWarnings: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
152
286
|
notifications: z.ZodDefault<z.ZodBoolean>;
|
|
153
287
|
dbPath: z.ZodDefault<z.ZodString>;
|
|
154
288
|
skillsDir: z.ZodDefault<z.ZodString>;
|
|
@@ -197,6 +331,16 @@ declare const configSchema: z.ZodObject<{
|
|
|
197
331
|
standard: "haiku" | "sonnet" | "opus" | "fable";
|
|
198
332
|
frontier: "haiku" | "sonnet" | "opus" | "fable";
|
|
199
333
|
};
|
|
334
|
+
ruleSources: {
|
|
335
|
+
id: string;
|
|
336
|
+
kind: "mcp" | "file" | "skill";
|
|
337
|
+
ref: string;
|
|
338
|
+
scope: string[];
|
|
339
|
+
trust: "convention" | "delegate";
|
|
340
|
+
onMissing: "skip" | "warn" | "stop";
|
|
341
|
+
}[];
|
|
342
|
+
ruleSourceErrors: string[];
|
|
343
|
+
ruleSourceWarnings: string[];
|
|
200
344
|
notifications: boolean;
|
|
201
345
|
dbPath: string;
|
|
202
346
|
skillsDir: string;
|
|
@@ -204,7 +348,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
204
348
|
roleAgentsDir: string;
|
|
205
349
|
reviewAgentsDir: string;
|
|
206
350
|
personasDir: string;
|
|
207
|
-
logLevel: "
|
|
351
|
+
logLevel: "warn" | "debug" | "info" | "error";
|
|
208
352
|
client: "claude-code" | "codex" | "both" | "grok";
|
|
209
353
|
}, {
|
|
210
354
|
interview?: {
|
|
@@ -245,6 +389,16 @@ declare const configSchema: z.ZodObject<{
|
|
|
245
389
|
standard?: "haiku" | "sonnet" | "opus" | "fable" | undefined;
|
|
246
390
|
frontier?: "haiku" | "sonnet" | "opus" | "fable" | undefined;
|
|
247
391
|
} | undefined;
|
|
392
|
+
ruleSources?: {
|
|
393
|
+
id: string;
|
|
394
|
+
kind: "mcp" | "file" | "skill";
|
|
395
|
+
ref: string;
|
|
396
|
+
scope?: string[] | undefined;
|
|
397
|
+
trust?: "convention" | "delegate" | undefined;
|
|
398
|
+
onMissing?: "skip" | "warn" | "stop" | undefined;
|
|
399
|
+
}[] | undefined;
|
|
400
|
+
ruleSourceErrors?: string[] | undefined;
|
|
401
|
+
ruleSourceWarnings?: string[] | undefined;
|
|
248
402
|
notifications?: boolean | undefined;
|
|
249
403
|
dbPath?: string | undefined;
|
|
250
404
|
skillsDir?: string | undefined;
|
|
@@ -252,7 +406,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
252
406
|
roleAgentsDir?: string | undefined;
|
|
253
407
|
reviewAgentsDir?: string | undefined;
|
|
254
408
|
personasDir?: string | undefined;
|
|
255
|
-
logLevel?: "
|
|
409
|
+
logLevel?: "warn" | "debug" | "info" | "error" | undefined;
|
|
256
410
|
client?: "claude-code" | "codex" | "both" | "grok" | undefined;
|
|
257
411
|
}>;
|
|
258
412
|
export type GestaltConfig = z.infer<typeof configSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;EAKvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;EAKvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAkKhE;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB;IAElB,sDAAsD;;;IAOtD;;;;;;;;;OASG;;IAOH,oCAAoC;;IAEpC,6CAA6C;;IAE7C,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4GhC,CAAC;AAEL,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAS1D,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAlJd,sDAAsD;;;QAOtD;;;;;;;;;WASG;;QAOH,oCAAoC;;QAEpC,6CAA6C;;QAE7C,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyIlC;;;OAGG;;IAEH;;;;;;OAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaH,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAmBzD;;;GAGG;AACH,iBAAS,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,CAAC,CAmBH;AAED;;GAEG;AACH,iBAAS,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAclD;AASD;;;GAGG;AACH,iBAAS,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiFjD;AA2GD,wBAAgB,UAAU,CACxB,SAAS,GAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,EAChD,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5D,aAAa,CAsDf;AAuHD,OAAO,EACL,SAAS,IAAI,UAAU,EACvB,eAAe,IAAI,gBAAgB,EACnC,cAAc,IAAI,eAAe,GAClC,CAAC"}
|