@specpow/framework 0.5.32 → 0.6.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 (29) hide show
  1. package/builtin/schemas/spec-driven/schema.yaml +20 -1
  2. package/dist/commands/propose.d.ts.map +1 -1
  3. package/dist/commands/propose.js +17 -0
  4. package/dist/commands/propose.js.map +1 -1
  5. package/dist/core/api-contract/brief-injector.d.ts +16 -0
  6. package/dist/core/api-contract/brief-injector.d.ts.map +1 -0
  7. package/dist/core/api-contract/brief-injector.js +153 -0
  8. package/dist/core/api-contract/brief-injector.js.map +1 -0
  9. package/dist/core/api-contract/extractor.d.ts +16 -0
  10. package/dist/core/api-contract/extractor.d.ts.map +1 -0
  11. package/dist/core/api-contract/extractor.js +604 -0
  12. package/dist/core/api-contract/extractor.js.map +1 -0
  13. package/dist/core/api-contract/index.d.ts +8 -0
  14. package/dist/core/api-contract/index.d.ts.map +1 -0
  15. package/dist/core/api-contract/index.js +8 -0
  16. package/dist/core/api-contract/index.js.map +1 -0
  17. package/dist/core/artifact-graph/types.d.ts +8 -0
  18. package/dist/core/artifact-graph/types.d.ts.map +1 -1
  19. package/dist/core/artifact-graph/types.js +1 -0
  20. package/dist/core/artifact-graph/types.js.map +1 -1
  21. package/dist/core/sdd-engine/controller.d.ts.map +1 -1
  22. package/dist/core/sdd-engine/controller.js +15 -2
  23. package/dist/core/sdd-engine/controller.js.map +1 -1
  24. package/dist/core/sdd-engine/parallel-dispatcher.d.ts.map +1 -1
  25. package/dist/core/sdd-engine/parallel-dispatcher.js +18 -15
  26. package/dist/core/sdd-engine/parallel-dispatcher.js.map +1 -1
  27. package/dist/core/sdd-engine/types.d.ts +1 -0
  28. package/dist/core/sdd-engine/types.d.ts.map +1 -1
  29. package/package.json +1 -2
@@ -0,0 +1,604 @@
1
+ /**
2
+ * API 契约提取器
3
+ *
4
+ * 从 design.md 中提取 REST API 接口定义,转换为 OpenAPI 3.0 YAML 可读子集。
5
+ * 使用正则+模式匹配,不依赖外部 AI 调用。
6
+ */
7
+ import { readFileSync, existsSync } from 'fs';
8
+ /**
9
+ * 从 design.md 文件提取 API 契约
10
+ * @returns OpenAPI 3.0 YAML 字符串,或 null(无 API 定义时)
11
+ */
12
+ export function extractApiContract(designMdPath) {
13
+ if (!existsSync(designMdPath))
14
+ return null;
15
+ const content = readFileSync(designMdPath, 'utf-8');
16
+ return extractApiContractFromText(content);
17
+ }
18
+ /**
19
+ * 从 design.md 文本内容提取 API 契约
20
+ */
21
+ export function extractApiContractFromText(content) {
22
+ const endpoints = detectEndpoints(content);
23
+ if (endpoints.length === 0)
24
+ return null;
25
+ return toOpenApiYaml(endpoints);
26
+ }
27
+ /**
28
+ * 从 Markdown 内容中检测所有 API endpoint
29
+ */
30
+ function detectEndpoints(content) {
31
+ // 使用 Map 去重:key = "METHOD /basepath"(不含 query params)
32
+ const endpointMap = new Map();
33
+ // 策略 1: 匹配 "### METHOD /path" 模式
34
+ const headerPattern = /^#{1,4}\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+(\/\S+)/gim;
35
+ let match;
36
+ while ((match = headerPattern.exec(content)) !== null) {
37
+ const method = match[1].toUpperCase();
38
+ const rawPath = match[2].replace(/[`,]/g, '');
39
+ const basePath = rawPath.split('?')[0]; // 去掉 query params 用于去重
40
+ const key = `${method} ${basePath}`;
41
+ if (endpointMap.has(key))
42
+ continue;
43
+ const sectionStart = match.index;
44
+ const sectionEnd = findSectionEnd(content, match.index);
45
+ const section = content.slice(sectionStart, sectionEnd);
46
+ const endpoint = {
47
+ method,
48
+ path: rawPath,
49
+ parameters: [],
50
+ responses: [],
51
+ };
52
+ const titleLine = section.split('\n')[0];
53
+ const afterPath = titleLine.replace(/^#{1,4}\s+\w+\s+\S+\s*/, '').trim();
54
+ if (afterPath) {
55
+ endpoint.summary = afterPath.replace(/^[-—:]\s*/, '');
56
+ }
57
+ endpoint.parameters = extractParameters(section, rawPath);
58
+ endpoint.requestBody = extractRequestBody(section);
59
+ endpoint.responses = extractResponses(section);
60
+ endpointMap.set(key, endpoint);
61
+ }
62
+ // 策略 2: 匹配 "**路径**: `METHOD /path`" 模式
63
+ const boldPathPattern = /\*\*路径\*\*[::]\s*`?(GET|POST|PUT|PATCH|DELETE)\s+(\/\S+?)`?(?:\s|$)/gim;
64
+ while ((match = boldPathPattern.exec(content)) !== null) {
65
+ const method = match[1].toUpperCase();
66
+ const rawPath = match[2].replace(/[`,]/g, '');
67
+ const basePath = rawPath.split('?')[0];
68
+ const key = `${method} ${basePath}`;
69
+ // 找到最近的上级标题作为 section 边界
70
+ const sectionStart = findNearestHeader(content, match.index);
71
+ const sectionEnd = findSectionEnd(content, sectionStart);
72
+ const section = content.slice(sectionStart, sectionEnd);
73
+ // 如果策略 1 已捕获此 endpoint,用策略 2 的 section 补充参数信息
74
+ if (endpointMap.has(key)) {
75
+ const existing = endpointMap.get(key);
76
+ // 如果已有 endpoint 缺少 query params 但当前 path 有,补充它们
77
+ const newQueryPart = rawPath.split('?')[1];
78
+ if (newQueryPart && !existing.path.includes('?')) {
79
+ existing.path = rawPath; // 用包含 query params 的完整路径替换
80
+ // 从 section 中补充提取 query params
81
+ const additionalParams = extractParameters(section, rawPath);
82
+ for (const param of additionalParams) {
83
+ if (!existing.parameters.some(p => p.name === param.name)) {
84
+ existing.parameters.push(param);
85
+ }
86
+ }
87
+ // 也补充 request body 和 responses(如果之前缺失)
88
+ if (!existing.requestBody) {
89
+ existing.requestBody = extractRequestBody(section);
90
+ }
91
+ if (existing.responses.length === 0 || (existing.responses.length === 1 && existing.responses[0].properties.length === 0)) {
92
+ const newResponses = extractResponses(section);
93
+ if (newResponses.length > 0 && newResponses[0].properties.length > 0) {
94
+ existing.responses = newResponses;
95
+ }
96
+ }
97
+ }
98
+ continue;
99
+ }
100
+ const endpoint = {
101
+ method,
102
+ path: rawPath,
103
+ parameters: [],
104
+ responses: [],
105
+ };
106
+ endpoint.parameters = extractParameters(section, rawPath);
107
+ endpoint.requestBody = extractRequestBody(section);
108
+ endpoint.responses = extractResponses(section);
109
+ endpointMap.set(key, endpoint);
110
+ }
111
+ return Array.from(endpointMap.values());
112
+ }
113
+ /**
114
+ * 找到最近的上级标题位置
115
+ */
116
+ function findNearestHeader(content, pos) {
117
+ const before = content.slice(0, pos);
118
+ // 查找最近的 ### 或 ## 标题
119
+ const lines = before.split('\n');
120
+ for (let i = lines.length - 1; i >= 0; i--) {
121
+ if (/^#{1,4}\s+/.test(lines[i])) {
122
+ return before.lastIndexOf(lines[i]);
123
+ }
124
+ }
125
+ return 0;
126
+ }
127
+ /**
128
+ * 找到当前 section 的结束位置(下一个同级或更高级标题)
129
+ */
130
+ function findSectionEnd(content, start) {
131
+ const lines = content.slice(start).split('\n');
132
+ const firstLine = lines[0];
133
+ const headerLevel = (firstLine.match(/^#/) || [''])[0].length || 1;
134
+ for (let i = 1; i < lines.length; i++) {
135
+ const line = lines[i];
136
+ const lineHeaderLevel = (line.match(/^#/) || [''])[0].length;
137
+ if (lineHeaderLevel > 0 && lineHeaderLevel <= headerLevel) {
138
+ return start + lines.slice(0, i).join('\n').length;
139
+ }
140
+ }
141
+ return content.length;
142
+ }
143
+ /**
144
+ * 从 section 中提取参数
145
+ */
146
+ function extractParameters(section, path) {
147
+ const params = [];
148
+ // 从 path 中提取 path parameters(如 /reading/:id → id)
149
+ const pathParamPattern = /:(\w+)/g;
150
+ let m;
151
+ while ((m = pathParamPattern.exec(path)) !== null) {
152
+ params.push({
153
+ name: m[1],
154
+ in: 'path',
155
+ required: true,
156
+ type: 'string',
157
+ });
158
+ }
159
+ // 从 path 中提取 query parameters(如 ?zodiac=xxx&lang=xxx)
160
+ const queryPart = path.split('?')[1];
161
+ if (queryPart) {
162
+ for (const param of queryPart.split('&')) {
163
+ const name = param.split('=')[0].trim();
164
+ if (name) {
165
+ params.push({
166
+ name,
167
+ in: 'query',
168
+ required: true,
169
+ type: 'string',
170
+ });
171
+ }
172
+ }
173
+ }
174
+ // 从 **请求** 或 Request 部分提取 body 参数(非 query/path 的参数)
175
+ const requestPattern = /\*\*请求\*\*[::]\s*\n?([\s\S]*?)(?=\n\s*\*\*|$)/im;
176
+ const reqMatch = requestPattern.exec(section);
177
+ if (reqMatch) {
178
+ const reqContent = reqMatch[1];
179
+ // 尝试解析 JSON 格式的请求体
180
+ const jsonMatch = reqContent.match(/```json\s*\n?([\s\S]*?)```/);
181
+ if (jsonMatch) {
182
+ try {
183
+ JSON.parse(jsonMatch[1]);
184
+ // JSON body 会作为 requestBody 处理,不作为 parameters
185
+ }
186
+ catch {
187
+ // 解析失败,忽略
188
+ }
189
+ }
190
+ }
191
+ // 从 parameters 列表中显式定义的参数
192
+ const paramListPattern = /[-*]\s+`?(\w+)`?\s*[—:-]\s*(.*?)(?:\n|$)/g;
193
+ while ((m = paramListPattern.exec(section)) !== null) {
194
+ const name = m[1];
195
+ const desc = m[2].trim();
196
+ // 避免重复添加
197
+ if (params.some(p => p.name === name))
198
+ continue;
199
+ const typeMatch = desc.match(/(?:type|类型)[::]\s*(\w+)/i);
200
+ const requiredMatch = desc.match(/(?:required|必填)[::]?\s*(true|false|是|否)/i);
201
+ const enumMatch = desc.match(/(?:enum|枚举|值)[::]\s*\[?([\w\s,|'"`]+)\]?/i);
202
+ params.push({
203
+ name,
204
+ in: 'query',
205
+ required: requiredMatch ? /^(true|是)$/i.test(requiredMatch[1]) : false,
206
+ type: typeMatch ? mapType(typeMatch[1]) : 'string',
207
+ enum: enumMatch ? enumMatch[1].split(/[,|\s]+/).map(s => s.replace(/['"`\s]/g, '')).filter(Boolean) : undefined,
208
+ description: desc || undefined,
209
+ });
210
+ }
211
+ return params;
212
+ }
213
+ /**
214
+ * 从 section 中提取 request body
215
+ */
216
+ function extractRequestBody(section) {
217
+ // 优先匹配 **请求**: `{ type: definition }` 格式(design.md 常见)
218
+ const typeDefPattern = /\*\*请求\*\*[::]\s*`?\{([^}]+)\}`?/im;
219
+ const typeMatch = typeDefPattern.exec(section);
220
+ if (typeMatch) {
221
+ const props = parseInlineTypeDefinition(typeMatch[1]);
222
+ if (props.length > 0) {
223
+ return { required: true, properties: props };
224
+ }
225
+ }
226
+ // 匹配 ```json { ... } ``` 格式
227
+ const jsonBlockPattern = /```json\s*\n(\{[\s\S]*?\})\n```/im;
228
+ const jsonMatch = jsonBlockPattern.exec(section);
229
+ if (jsonMatch) {
230
+ try {
231
+ const parsed = JSON.parse(jsonMatch[1]);
232
+ return {
233
+ required: true,
234
+ properties: objectToSchemaProperties(parsed),
235
+ };
236
+ }
237
+ catch {
238
+ // 解析失败,忽略
239
+ }
240
+ }
241
+ return undefined;
242
+ }
243
+ /**
244
+ * 从 section 中提取 responses
245
+ */
246
+ function extractResponses(section) {
247
+ const responses = [];
248
+ // 优先匹配 **响应**: `{ type: definition }` 格式
249
+ const responsePattern = /\*\*响应\*\*[::]\s*`?\{([^}]+)\}`?/im;
250
+ const match = responsePattern.exec(section);
251
+ if (match) {
252
+ const props = parseInlineTypeDefinition(match[1]);
253
+ if (props.length > 0) {
254
+ responses.push({ status: '200', properties: props });
255
+ }
256
+ }
257
+ // 如果没有找到,尝试 JSON 格式
258
+ if (responses.length === 0) {
259
+ const jsonPattern = /\*\*响应\*\*[::]\s*`?(\{[\s\S]*?\})`?(?:\s*\n|$)/im;
260
+ const jsonMatch = jsonPattern.exec(section);
261
+ if (jsonMatch) {
262
+ try {
263
+ const parsed = JSON.parse(jsonMatch[1]);
264
+ if (Array.isArray(parsed)) {
265
+ responses.push({ status: '200', properties: [], isArray: true });
266
+ }
267
+ else {
268
+ responses.push({ status: '200', properties: objectToSchemaProperties(parsed) });
269
+ }
270
+ }
271
+ catch {
272
+ // 忽略
273
+ }
274
+ }
275
+ }
276
+ // 如果没找到响应定义,添加默认 200 响应
277
+ if (responses.length === 0) {
278
+ responses.push({ status: '200', properties: [] });
279
+ }
280
+ return responses;
281
+ }
282
+ /**
283
+ * 将 JS 对象转换为 SchemaProperty 数组
284
+ */
285
+ function objectToSchemaProperties(obj) {
286
+ const props = [];
287
+ for (const [key, value] of Object.entries(obj)) {
288
+ const isOptional = key.endsWith('?');
289
+ const cleanKey = isOptional ? key.slice(0, -1) : key;
290
+ if (Array.isArray(value)) {
291
+ const itemProps = value.length > 0 && typeof value[0] === 'object'
292
+ ? objectToSchemaProperties(value[0])
293
+ : [];
294
+ props.push({
295
+ name: cleanKey,
296
+ type: 'array',
297
+ required: !isOptional,
298
+ items: itemProps,
299
+ });
300
+ }
301
+ else if (typeof value === 'object' && value !== null) {
302
+ props.push({
303
+ name: cleanKey,
304
+ type: 'object',
305
+ required: !isOptional,
306
+ items: objectToSchemaProperties(value),
307
+ });
308
+ }
309
+ else if (typeof value === 'string') {
310
+ // 值可能是类型描述,如 "single" | "three" | "love"
311
+ const enumValues = value.split('|').map(s => s.trim().replace(/['"`]/g, '')).filter(Boolean);
312
+ if (enumValues.length > 1) {
313
+ props.push({
314
+ name: cleanKey,
315
+ type: 'string',
316
+ required: !isOptional,
317
+ enum: enumValues,
318
+ });
319
+ }
320
+ else {
321
+ props.push({
322
+ name: cleanKey,
323
+ type: mapType(value) === 'string' ? inferTypeFromName(cleanKey) : mapType(value),
324
+ required: !isOptional,
325
+ });
326
+ }
327
+ }
328
+ else if (typeof value === 'boolean') {
329
+ props.push({ name: cleanKey, type: 'boolean', required: !isOptional });
330
+ }
331
+ else if (typeof value === 'number') {
332
+ props.push({ name: cleanKey, type: 'integer', required: !isOptional });
333
+ }
334
+ else {
335
+ props.push({ name: cleanKey, type: 'string', required: !isOptional });
336
+ }
337
+ }
338
+ return props;
339
+ }
340
+ /**
341
+ * 解析内联类型定义字符串(TypeScript 风格)
342
+ * 处理格式如:
343
+ * - `provider: "google" | "apple", token: string`
344
+ * - `user: { id, language, zodiac }, token: string`
345
+ * - `cards: [{ id, name, position, isReversed }]`
346
+ * - `spread: "single" | "three" | "love", question?: string`
347
+ */
348
+ function parseInlineTypeDefinition(str) {
349
+ const props = [];
350
+ // 按顶层逗号分割(跳过 {} 和 [] 内的逗号)
351
+ const entries = splitTopLevel(str, ',');
352
+ for (const entry of entries) {
353
+ const trimmed = entry.trim();
354
+ if (!trimmed)
355
+ continue;
356
+ // 处理没有 type 注解的 bare field names(如 `id, language, zodiac`)
357
+ if (!trimmed.includes(':')) {
358
+ // 可能是逗号分隔的多个 bare field names
359
+ const bareNames = trimmed.split(',').map(s => s.trim()).filter(Boolean);
360
+ for (const bareName of bareNames) {
361
+ const cleanName = bareName.replace(/\?$/, '').trim();
362
+ if (cleanName && /^\w+$/.test(cleanName)) {
363
+ props.push({ name: cleanName, type: inferTypeFromName(cleanName), required: !bareName.includes('?') });
364
+ }
365
+ }
366
+ continue;
367
+ }
368
+ // 分离 key 和 value
369
+ const colonIdx = trimmed.indexOf(':');
370
+ const rawKey = trimmed.slice(0, colonIdx).trim();
371
+ const rawValue = trimmed.slice(colonIdx + 1).trim();
372
+ const isOptional = rawKey.endsWith('?');
373
+ const name = rawKey.replace(/\?$/, '').trim();
374
+ if (!name)
375
+ continue;
376
+ // 处理嵌套对象 { ... }
377
+ if (rawValue.startsWith('{') && rawValue.endsWith('}')) {
378
+ const inner = rawValue.slice(1, -1).trim();
379
+ const nestedProps = parseInlineTypeDefinition(inner);
380
+ props.push({ name, type: 'object', required: !isOptional, items: nestedProps });
381
+ continue;
382
+ }
383
+ // 处理数组 [{ ... }] 或 [type]
384
+ if (rawValue.startsWith('[') && rawValue.endsWith(']')) {
385
+ const inner = rawValue.slice(1, -1).trim();
386
+ if (inner.startsWith('{') && inner.endsWith('}')) {
387
+ const nestedProps = parseInlineTypeDefinition(inner.slice(1, -1).trim());
388
+ props.push({ name, type: 'array', required: !isOptional, items: nestedProps });
389
+ }
390
+ else {
391
+ props.push({ name, type: 'array', required: !isOptional, items: [{ name: 'item', type: mapType(inner), required: true }] });
392
+ }
393
+ continue;
394
+ }
395
+ // 处理 enum 类型 "a" | "b" | "c"
396
+ if (rawValue.includes('|')) {
397
+ const enumValues = rawValue.split('|').map(s => s.trim().replace(/['"`]/g, '')).filter(Boolean);
398
+ props.push({ name, type: 'string', required: !isOptional, enum: enumValues });
399
+ continue;
400
+ }
401
+ // 简单类型
402
+ const type = mapType(rawValue.replace(/['"`]/g, ''));
403
+ props.push({ name, type, required: !isOptional });
404
+ }
405
+ return props;
406
+ }
407
+ /**
408
+ * 按顶层分隔符分割字符串(跳过嵌套 {} 和 [] 内的分隔符)
409
+ */
410
+ function splitTopLevel(str, separator) {
411
+ const result = [];
412
+ let depth = 0;
413
+ let current = '';
414
+ for (let i = 0; i < str.length; i++) {
415
+ const ch = str[i];
416
+ if (ch === '{' || ch === '[')
417
+ depth++;
418
+ else if (ch === '}' || ch === ']')
419
+ depth--;
420
+ else if (ch === separator && depth === 0) {
421
+ result.push(current);
422
+ current = '';
423
+ continue;
424
+ }
425
+ current += ch;
426
+ }
427
+ if (current.trim())
428
+ result.push(current);
429
+ return result;
430
+ }
431
+ /**
432
+ * 根据字段名推断类型
433
+ */
434
+ function inferTypeFromName(name) {
435
+ const lower = name.toLowerCase();
436
+ if (lower.includes('date') || lower.includes('time') || lower === 'createdat' || lower === 'updatedat')
437
+ return 'string';
438
+ if (lower.includes('count') || lower.includes('total') || lower.includes('page') || lower.includes('left') || lower.includes('remaining'))
439
+ return 'integer';
440
+ if (lower.includes('is') || lower.includes('has') || lower.includes('enabled'))
441
+ return 'boolean';
442
+ if (lower === 'id' || lower.endsWith('id'))
443
+ return 'string';
444
+ return 'string';
445
+ }
446
+ /**
447
+ * 映射类型名称到 OpenAPI 类型
448
+ */
449
+ function mapType(type) {
450
+ const lower = type.toLowerCase().replace(/[<>[\]]/g, '');
451
+ if (['string', 'str', 'text', 'varchar'].includes(lower))
452
+ return 'string';
453
+ if (['number', 'int', 'integer', 'number', 'float', 'double'].includes(lower))
454
+ return 'integer';
455
+ if (['boolean', 'bool'].includes(lower))
456
+ return 'boolean';
457
+ if (['array', 'list'].includes(lower))
458
+ return 'array';
459
+ if (['object', 'map', 'dict', 'jsonb'].includes(lower))
460
+ return 'object';
461
+ return 'string';
462
+ }
463
+ /**
464
+ * 将检测到的 endpoints 转换为 OpenAPI 3.0 YAML
465
+ */
466
+ function toOpenApiYaml(endpoints) {
467
+ const lines = [
468
+ '# API 契约',
469
+ '# 此文件由 specpow 自动生成,所有涉及前后端的 task 必须严格遵守以下接口契约。',
470
+ '# 不得修改路径、参数名、响应结构。',
471
+ '',
472
+ 'openapi: 3.0.0',
473
+ 'info:',
474
+ ' title: API Contract',
475
+ ' version: 1.0.0',
476
+ 'paths:',
477
+ ];
478
+ // 按 path 分组(同一 path 可能有多个 method)
479
+ const pathMap = new Map();
480
+ for (const ep of endpoints) {
481
+ const existing = pathMap.get(ep.path) || [];
482
+ existing.push(ep);
483
+ pathMap.set(ep.path, existing);
484
+ }
485
+ for (const [path, eps] of Array.from(pathMap.entries())) {
486
+ // 转换 path 参数格式 :id → {id}
487
+ const openApiPath = path.split('?')[0].replace(/:(\w+)/g, '{$1}');
488
+ lines.push('');
489
+ lines.push(` ${openApiPath}:`);
490
+ for (const ep of eps) {
491
+ lines.push(` ${ep.method.toLowerCase()}:`);
492
+ if (ep.summary) {
493
+ lines.push(` summary: ${ep.summary}`);
494
+ }
495
+ // Parameters
496
+ if (ep.parameters.length > 0) {
497
+ lines.push(' parameters:');
498
+ for (const param of ep.parameters) {
499
+ lines.push(` - name: ${param.name}`);
500
+ lines.push(` in: ${param.in}`);
501
+ lines.push(` required: ${param.required}`);
502
+ lines.push(' schema:');
503
+ lines.push(` type: ${param.type}`);
504
+ if (param.enum && param.enum.length > 0) {
505
+ lines.push(` enum: [${param.enum.join(', ')}]`);
506
+ }
507
+ }
508
+ }
509
+ // Request body
510
+ if (ep.requestBody && ep.requestBody.properties.length > 0) {
511
+ lines.push(' requestBody:');
512
+ lines.push(` required: ${ep.requestBody.required}`);
513
+ lines.push(' content:');
514
+ lines.push(' application/json:');
515
+ lines.push(' schema:');
516
+ lines.push(' type: object');
517
+ const requiredFields = ep.requestBody.properties.filter(p => p.required).map(p => p.name);
518
+ if (requiredFields.length > 0) {
519
+ lines.push(` required: [${requiredFields.join(', ')}]`);
520
+ }
521
+ lines.push(' properties:');
522
+ for (const prop of ep.requestBody.properties) {
523
+ appendPropertyYaml(lines, prop, ' ');
524
+ }
525
+ }
526
+ // Responses
527
+ lines.push(' responses:');
528
+ for (const resp of ep.responses) {
529
+ lines.push(` '${resp.status}':`);
530
+ lines.push(' content:');
531
+ lines.push(' application/json:');
532
+ lines.push(' schema:');
533
+ if (resp.isArray) {
534
+ lines.push(' type: array');
535
+ lines.push(' items:');
536
+ lines.push(' type: object');
537
+ }
538
+ else if (resp.properties.length > 0) {
539
+ lines.push(' type: object');
540
+ const requiredFields = resp.properties.filter(p => p.required).map(p => p.name);
541
+ if (requiredFields.length > 0) {
542
+ lines.push(` required: [${requiredFields.join(', ')}]`);
543
+ }
544
+ lines.push(' properties:');
545
+ for (const prop of resp.properties) {
546
+ appendPropertyYaml(lines, prop, ' ');
547
+ }
548
+ }
549
+ else {
550
+ lines.push(' type: object');
551
+ }
552
+ }
553
+ }
554
+ }
555
+ return lines.join('\n') + '\n';
556
+ }
557
+ /**
558
+ * 将单个属性追加为 YAML 行
559
+ */
560
+ function appendPropertyYaml(lines, prop, indent) {
561
+ if (prop.type === 'array') {
562
+ lines.push(`${indent}${prop.name}:`);
563
+ lines.push(`${indent} type: array`);
564
+ if (prop.items && prop.items.length > 0) {
565
+ lines.push(`${indent} items:`);
566
+ lines.push(`${indent} type: object`);
567
+ const requiredItems = prop.items.filter(p => p.required).map(p => p.name);
568
+ if (requiredItems.length > 0) {
569
+ lines.push(`${indent} required: [${requiredItems.join(', ')}]`);
570
+ }
571
+ lines.push(`${indent} properties:`);
572
+ for (const item of prop.items) {
573
+ appendPropertyYaml(lines, item, indent + ' ');
574
+ }
575
+ }
576
+ else {
577
+ lines.push(`${indent} items:`);
578
+ lines.push(`${indent} type: string`);
579
+ }
580
+ }
581
+ else if (prop.type === 'object' && prop.items && prop.items.length > 0) {
582
+ lines.push(`${indent}${prop.name}:`);
583
+ lines.push(`${indent} type: object`);
584
+ const requiredItems = prop.items.filter(p => p.required).map(p => p.name);
585
+ if (requiredItems.length > 0) {
586
+ lines.push(`${indent} required: [${requiredItems.join(', ')}]`);
587
+ }
588
+ lines.push(`${indent} properties:`);
589
+ for (const item of prop.items) {
590
+ appendPropertyYaml(lines, item, indent + ' ');
591
+ }
592
+ }
593
+ else {
594
+ lines.push(`${indent}${prop.name}: { type: ${prop.type} }`);
595
+ if (prop.enum && prop.enum.length > 0) {
596
+ // 替换最后一行,加入 enum
597
+ lines.pop();
598
+ lines.push(`${indent}${prop.name}:`);
599
+ lines.push(`${indent} type: ${prop.type}`);
600
+ lines.push(`${indent} enum: [${prop.enum.join(', ')}]`);
601
+ }
602
+ }
603
+ }
604
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../../src/core/api-contract/extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AA4C9C;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAAoB;IACrD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,sDAAsD;IACtD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IAExD,iCAAiC;IACjC,MAAM,aAAa,GAAG,iEAAiE,CAAC;IACxF,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAC/D,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;QAEpC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAEnC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;QACjC,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAqB;YACjC,MAAM;YACN,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,QAAQ,CAAC,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,QAAQ,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACnD,QAAQ,CAAC,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/C,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,uCAAuC;IACvC,MAAM,eAAe,GAAG,wEAAwE,CAAC;IACjG,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;QAEpC,yBAAyB;QACzB,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAExD,8CAA8C;QAC9C,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACvC,gDAAgD;YAChD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,YAAY,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjD,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,2BAA2B;gBACpD,+BAA+B;gBAC/B,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7D,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;oBACrC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC1D,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;gBACD,uCAAuC;gBACvC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAC1B,QAAQ,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACrD,CAAC;gBACD,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC1H,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBAC/C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrE,QAAQ,CAAC,SAAS,GAAG,YAAY,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAqB;YACjC,MAAM;YACN,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,QAAQ,CAAC,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,QAAQ,CAAC,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACnD,QAAQ,CAAC,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/C,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAe,EAAE,GAAW;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,oBAAoB;IACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,KAAa;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,IAAI,eAAe,GAAG,CAAC,IAAI,eAAe,IAAI,WAAW,EAAE,CAAC;YAC1D,OAAO,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAe,EAAE,IAAY;IACtD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,SAAS,CAAC;IACnC,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACV,EAAE,EAAE,MAAM;YACV,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,EAAE,EAAE,OAAO;oBACX,QAAQ,EAAE,IAAI;oBACd,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,cAAc,GAAG,iDAAiD,CAAC;IACzE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/B,mBAAmB;QACnB,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACjE,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,8CAA8C;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;IACrE,OAAO,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,SAAS;QACT,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,SAAS;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAE1E,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,EAAE,EAAE,OAAO;YACX,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YACtE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;YAClD,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/G,WAAW,EAAE,IAAI,IAAI,SAAS;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,uDAAuD;IACvD,MAAM,cAAc,GAAG,oCAAoC,CAAC;IAC5D,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;IAC7D,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,wBAAwB,CAAC,MAAM,CAAC;aAC7C,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,SAAS,GAAkB,EAAE,CAAC;IAEpC,yCAAyC;IACzC,MAAM,eAAe,GAAG,oCAAoC,CAAC;IAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,kDAAkD,CAAC;QACvE,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,GAAwB;IACxD,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAErD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAChE,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpC,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,CAAC,UAAU;gBACrB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,UAAU;gBACrB,KAAK,EAAE,wBAAwB,CAAC,KAAK,CAAC;aACvC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,yCAAyC;YACzC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7F,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,CAAC,UAAU;oBACrB,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;oBAChF,QAAQ,EAAE,CAAC,UAAU;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,yBAAyB,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,2BAA2B;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAExC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,2DAA2D;QAC3D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,8BAA8B;YAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzG,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE9C,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,iBAAiB;QACjB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAChF,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjD,MAAM,WAAW,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9H,CAAC;YACD,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QAED,OAAO;QACP,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW,EAAE,SAAiB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACjC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACtC,IAAI,EAAE,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IACxH,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5J,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACjG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1E,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACtD,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,SAA6B;IAClD,MAAM,KAAK,GAAa;QACtB,UAAU;QACV,iDAAiD;QACjD,oBAAoB;QACpB,EAAE;QACF,gBAAgB;QAChB,OAAO;QACP,uBAAuB;QACvB,kBAAkB;QAClB,QAAQ;KACT,CAAC;IAEF,kCAAkC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACxD,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,GAAG,CAAC,CAAC;QAEhC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,aAAa;YACb,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBAChC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5C,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACpD,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBAChC,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC9C,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxC,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,eAAe;YACf,IAAI,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACzC,MAAM,cAAc,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1F,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,4BAA4B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvE,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBACxC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC7C,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAED,YAAY;YACZ,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACpC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;oBAC1C,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;oBACrC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAC/C,CAAC;qBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;oBAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAChF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9B,KAAK,CAAC,IAAI,CAAC,8BAA8B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACzE,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;oBAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACnC,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAe,EAAE,IAAoB,EAAE,MAAc;IAC/E,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,kBAAkB,CAAC,CAAC;YACxC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,kBAAkB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,kBAAkB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,iBAAiB;YACjB,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * API 契约模块
3
+ *
4
+ * 提供 API 定义提取和 brief 注入能力
5
+ */
6
+ export { extractApiContract, extractApiContractFromText } from './extractor.js';
7
+ export { injectApiContract } from './brief-injector.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/api-contract/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * API 契约模块
3
+ *
4
+ * 提供 API 定义提取和 brief 注入能力
5
+ */
6
+ export { extractApiContract, extractApiContractFromText } from './extractor.js';
7
+ export { injectApiContract } from './brief-injector.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/api-contract/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}