@dev-guard/core 0.1.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ai.d.ts +30 -0
  3. package/dist/ai.js +2050 -0
  4. package/dist/ai.js.map +1 -0
  5. package/dist/analyze.d.ts +2 -0
  6. package/dist/analyze.js +303 -0
  7. package/dist/analyze.js.map +1 -0
  8. package/dist/completion.d.ts +8 -0
  9. package/dist/completion.js +272 -0
  10. package/dist/completion.js.map +1 -0
  11. package/dist/context-files.d.ts +5 -0
  12. package/dist/context-files.js +44 -0
  13. package/dist/context-files.js.map +1 -0
  14. package/dist/defaults.d.ts +3 -0
  15. package/dist/defaults.js +46 -0
  16. package/dist/defaults.js.map +1 -0
  17. package/dist/diff-intent.d.ts +19 -0
  18. package/dist/diff-intent.js +517 -0
  19. package/dist/diff-intent.js.map +1 -0
  20. package/dist/drift.d.ts +19 -0
  21. package/dist/drift.js +264 -0
  22. package/dist/drift.js.map +1 -0
  23. package/dist/index-check.mjs +13 -0
  24. package/dist/index.d.ts +18 -0
  25. package/dist/index.js +16 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/prompt.d.ts +2 -0
  28. package/dist/prompt.js +633 -0
  29. package/dist/prompt.js.map +1 -0
  30. package/dist/report.d.ts +2 -0
  31. package/dist/report.js +90 -0
  32. package/dist/report.js.map +1 -0
  33. package/dist/review.d.ts +4 -0
  34. package/dist/review.js +350 -0
  35. package/dist/review.js.map +1 -0
  36. package/dist/scan.d.ts +9 -0
  37. package/dist/scan.js +322 -0
  38. package/dist/scan.js.map +1 -0
  39. package/dist/task-anchor.d.ts +21 -0
  40. package/dist/task-anchor.js +126 -0
  41. package/dist/task-anchor.js.map +1 -0
  42. package/dist/task-router.d.ts +3 -0
  43. package/dist/task-router.js +340 -0
  44. package/dist/task-router.js.map +1 -0
  45. package/dist/templates.d.ts +20 -0
  46. package/dist/templates.js +56 -0
  47. package/dist/templates.js.map +1 -0
  48. package/dist/types.d.ts +366 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/update.d.ts +2 -0
  52. package/dist/update.js +250 -0
  53. package/dist/update.js.map +1 -0
  54. package/package.json +30 -0
package/dist/scan.js ADDED
@@ -0,0 +1,322 @@
1
+ import { dirname, extname, posix } from "node:path";
2
+ export function buildProjectScan(files) {
3
+ const index = files.map(buildProjectIndexEntry).sort((a, b) => a.path.localeCompare(b.path));
4
+ const summaries = buildFileSummaries(index);
5
+ const codeGraph = buildCodeGraph(files, index);
6
+ return {
7
+ index,
8
+ summaries,
9
+ projectMapMarkdown: buildProjectMapMarkdown(index, summaries),
10
+ codeGraph
11
+ };
12
+ }
13
+ export function refreshProjectScan(input) {
14
+ const removed = new Set(input.removedPaths);
15
+ const updatedEntries = input.updatedFiles.map(buildProjectIndexEntry);
16
+ const updatedPaths = new Set(updatedEntries.map((entry) => entry.path));
17
+ const index = [
18
+ ...input.existingIndex.filter((entry) => !removed.has(entry.path) && !updatedPaths.has(entry.path)),
19
+ ...updatedEntries
20
+ ].sort((a, b) => a.path.localeCompare(b.path));
21
+ const summaries = buildFileSummaries(index);
22
+ const codeGraph = refreshCodeGraph(input.existingCodeGraph ?? [], input.updatedFiles, index, removed);
23
+ return {
24
+ index,
25
+ summaries,
26
+ projectMapMarkdown: buildProjectMapMarkdown(index, summaries),
27
+ codeGraph,
28
+ updatedPaths: [...updatedPaths].sort(),
29
+ removedPaths: [...removed].sort(),
30
+ unchangedCount: input.existingIndex.filter((entry) => !removed.has(entry.path) && !updatedPaths.has(entry.path)).length
31
+ };
32
+ }
33
+ export function buildCodeGraph(files, index = files.map(buildProjectIndexEntry)) {
34
+ const fileSet = new Set(files.map((file) => file.path));
35
+ const indexByPath = new Map(index.map((entry) => [entry.path, entry]));
36
+ const entries = files.map((file) => buildCodeGraphEntry(file, fileSet, indexByPath));
37
+ return attachReverseDependencies(entries);
38
+ }
39
+ export function buildImpactHints(changedFiles, codeGraph, limit = 5) {
40
+ const graphByFile = new Map(codeGraph.map((entry) => [entry.file, entry]));
41
+ return [...new Set(changedFiles)]
42
+ .map((file) => {
43
+ const entry = graphByFile.get(file);
44
+ if (!entry || entry.importedBy.length === 0) {
45
+ return undefined;
46
+ }
47
+ const affectedAreas = [...new Set(entry.importedBy.map((importer) => graphByFile.get(importer)?.category ?? areaFromPath(importer)))].slice(0, 6);
48
+ return {
49
+ file,
50
+ importedByCount: entry.importedBy.length,
51
+ importedBy: entry.importedBy.slice(0, limit),
52
+ impactCandidates: entry.impactCandidates.slice(0, limit),
53
+ affectedAreas
54
+ };
55
+ })
56
+ .filter((hint) => Boolean(hint))
57
+ .sort((a, b) => b.importedByCount - a.importedByCount || a.file.localeCompare(b.file))
58
+ .slice(0, limit);
59
+ }
60
+ function refreshCodeGraph(existingCodeGraph, updatedFiles, index, removed) {
61
+ const updatedPaths = new Set(updatedFiles.map((file) => file.path));
62
+ const existingFiles = new Set([
63
+ ...existingCodeGraph.map((entry) => entry.file),
64
+ ...updatedFiles.map((file) => file.path),
65
+ ...index.map((entry) => entry.path)
66
+ ].filter((path) => !removed.has(path)));
67
+ const indexByPath = new Map(index.map((entry) => [entry.path, entry]));
68
+ const retained = existingCodeGraph
69
+ .filter((entry) => !removed.has(entry.file) && !updatedPaths.has(entry.file))
70
+ .map((entry) => ({
71
+ ...entry,
72
+ imports: entry.imports.filter((file) => existingFiles.has(file)),
73
+ importedBy: []
74
+ }));
75
+ const updated = updatedFiles.map((file) => buildCodeGraphEntry(file, existingFiles, indexByPath));
76
+ return attachReverseDependencies([...retained, ...updated]);
77
+ }
78
+ function buildCodeGraphEntry(file, fileSet, indexByPath) {
79
+ const imports = extractImportSpecifiers(file.content)
80
+ .filter((specifier) => specifier.startsWith("."))
81
+ .map((specifier) => resolveImportPath(file.path, specifier, fileSet))
82
+ .filter((path) => Boolean(path));
83
+ const exports = extractExportHints(file.content);
84
+ const index = indexByPath.get(file.path);
85
+ const category = index?.category ?? categorize(file.path, index?.keywords ?? []);
86
+ return {
87
+ file: file.path,
88
+ imports: [...new Set(imports)].sort(),
89
+ importedBy: [],
90
+ exports,
91
+ category,
92
+ impactCandidates: [],
93
+ usageHints: buildUsageHints(file.path, category, exports)
94
+ };
95
+ }
96
+ function attachReverseDependencies(entries) {
97
+ const entryByFile = new Map(entries.map((entry) => [entry.file, { ...entry, importedBy: [] }]));
98
+ for (const entry of entryByFile.values()) {
99
+ for (const imported of entry.imports) {
100
+ const target = entryByFile.get(imported);
101
+ if (target) {
102
+ target.importedBy.push(entry.file);
103
+ }
104
+ }
105
+ }
106
+ return [...entryByFile.values()]
107
+ .map((entry) => {
108
+ const importedBy = [...new Set(entry.importedBy)].sort();
109
+ const impactCandidates = [...new Set([...importedBy, ...entry.imports])].slice(0, 12);
110
+ return {
111
+ ...entry,
112
+ importedBy,
113
+ impactCandidates,
114
+ usageHints: [
115
+ ...entry.usageHints,
116
+ importedBy.length > 0 ? `used by ${importedBy.length} file(s)` : ""
117
+ ].filter(Boolean)
118
+ };
119
+ })
120
+ .sort((a, b) => a.file.localeCompare(b.file));
121
+ }
122
+ function extractImportSpecifiers(content) {
123
+ const patterns = [
124
+ /\bimport\s+(?:type\s+)?(?:[^'"]+\s+from\s+)?["']([^"']+)["']/g,
125
+ /\bexport\s+(?:type\s+)?[^'"]+\s+from\s+["']([^"']+)["']/g,
126
+ /\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,
127
+ /\brequire\s*\(\s*["']([^"']+)["']\s*\)/g
128
+ ];
129
+ return [...new Set(patterns.flatMap((pattern) => [...content.matchAll(pattern)].map((match) => match[1]).filter(Boolean)))];
130
+ }
131
+ function extractExportHints(content) {
132
+ const named = [
133
+ ...content.matchAll(/\bexport\s+(?:async\s+)?(?:function|const|class|interface|type|enum)\s+([A-Za-z0-9_]+)/g),
134
+ ...content.matchAll(/\bexport\s+default\s+(?:async\s+)?function\s+([A-Za-z0-9_]+)/g)
135
+ ].map((match) => match[1]);
136
+ const grouped = [...content.matchAll(/\bexport\s*\{([^}]+)\}/g)].flatMap((match) => (match[1] ?? "")
137
+ .split(",")
138
+ .map((item) => item.replace(/\s+as\s+.+$/i, "").trim())
139
+ .filter(Boolean));
140
+ return [...new Set([...named, ...grouped].map(cleanKeyword).filter(Boolean))].slice(0, 30);
141
+ }
142
+ function resolveImportPath(fromFile, specifier, fileSet) {
143
+ const base = posix.normalize(posix.join(dirname(fromFile), specifier));
144
+ const withoutJsExtension = base.replace(/\.(?:js|jsx|mjs|cjs)$/, "");
145
+ const candidates = [
146
+ base,
147
+ withoutJsExtension,
148
+ ...[".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".json"].map((extension) => `${withoutJsExtension}${extension}`),
149
+ ...[".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".json"].map((extension) => `${base}${extension}`),
150
+ ...["index.ts", "index.tsx", "index.js", "index.jsx"].map((indexFile) => posix.join(base, indexFile))
151
+ ];
152
+ return candidates.find((candidate) => fileSet.has(candidate));
153
+ }
154
+ function buildUsageHints(file, category, exports) {
155
+ const hints = [`category:${category}`];
156
+ if (/^(app|pages)\//.test(file)) {
157
+ hints.push(`route:${routeFromPath(file)}`);
158
+ }
159
+ const components = exports.filter((name) => /^[A-Z]/.test(name)).slice(0, 3);
160
+ if (components.length > 0) {
161
+ hints.push(`component:${components.join(",")}`);
162
+ }
163
+ return hints;
164
+ }
165
+ function routeFromPath(file) {
166
+ return `/${file
167
+ .replace(/^(app|pages)\//, "")
168
+ .replace(/\/(page|route|index)\.[^.]+$/, "")
169
+ .replace(/\.[^.]+$/, "")}`;
170
+ }
171
+ function areaFromPath(file) {
172
+ const parts = file.split("/");
173
+ return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : parts[0] || "general";
174
+ }
175
+ export function selectRelatedFilesFromScan(requirement, index, summaries) {
176
+ const tokens = extractScanTokens(requirement);
177
+ const scores = new Map();
178
+ for (const entry of index) {
179
+ const haystack = [entry.path, entry.category, ...entry.keywords].join(" ").toLowerCase();
180
+ for (const token of tokens) {
181
+ if (haystack.includes(token)) {
182
+ scores.set(entry.path, (scores.get(entry.path) ?? 0) + 2 + priorityBonus(entry.path, token));
183
+ }
184
+ }
185
+ }
186
+ for (const summary of summaries) {
187
+ const haystack = [summary.path, summary.role, ...summary.keywords, ...summary.features].join(" ").toLowerCase();
188
+ for (const token of tokens) {
189
+ if (haystack.includes(token)) {
190
+ scores.set(summary.path, (scores.get(summary.path) ?? 0) + 3 + priorityBonus(summary.path, token));
191
+ }
192
+ }
193
+ }
194
+ return [...scores.entries()]
195
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
196
+ .map(([path]) => path)
197
+ .slice(0, 8);
198
+ }
199
+ export function buildProjectIndexEntry(file) {
200
+ const keywords = extractKeywords(file.path, file.content);
201
+ return {
202
+ path: file.path,
203
+ extension: extname(file.path).replace(".", ""),
204
+ category: categorize(file.path, keywords),
205
+ keywords,
206
+ size: file.size,
207
+ lastModified: file.lastModified,
208
+ hash: file.hash
209
+ };
210
+ }
211
+ export function buildFileSummaries(index) {
212
+ return index.map((entry) => buildFileSummary(entry, index));
213
+ }
214
+ function buildFileSummary(entry, index) {
215
+ const relatedFiles = index
216
+ .filter((candidate) => candidate.path !== entry.path && candidate.category === entry.category)
217
+ .map((candidate) => candidate.path)
218
+ .slice(0, 8);
219
+ return {
220
+ path: entry.path,
221
+ role: describeRole(entry),
222
+ keywords: entry.keywords.slice(0, 20),
223
+ features: inferFeatures(entry),
224
+ relatedFiles
225
+ };
226
+ }
227
+ export function buildProjectMapMarkdown(index, summaries) {
228
+ const categories = [...new Set(index.map((entry) => entry.category))].sort();
229
+ const sections = categories.map((category) => {
230
+ const entries = index.filter((entry) => entry.category === category).slice(0, 20);
231
+ const files = entries
232
+ .map((entry) => {
233
+ const summary = summaries.find((item) => item.path === entry.path);
234
+ return `- ${entry.path}: ${summary?.role ?? describeRole(entry)}`;
235
+ })
236
+ .join("\n");
237
+ return `## ${category}\n${files}`;
238
+ });
239
+ return `# Dev Guard Project Map\n\nGenerated by \`dev-guard scan\`.\n\n${sections.join("\n\n")}\n`;
240
+ }
241
+ function categorize(path, keywords) {
242
+ const haystack = `${path} ${keywords.join(" ")}`.toLowerCase();
243
+ const rules = [
244
+ ["auth", /auth|login|kakao|oauth|sign/],
245
+ ["settings", /settings|setting|설정/],
246
+ ["admin", /admin|관리자/],
247
+ ["dashboard", /dashboard|home|홈/],
248
+ ["tree", /tree|leaf|트리|잎/],
249
+ ["supabase", /supabase/],
250
+ ["api", /api|route|endpoint/],
251
+ ["styles", /css|scss|style|theme|dark|light/],
252
+ ["config", /config|tsconfig|eslint|tailwind|package\.json/],
253
+ ["ui", /component|button|modal|dialog|card|ui/]
254
+ ];
255
+ return rules.find(([, pattern]) => pattern.test(haystack))?.[0] ?? "general";
256
+ }
257
+ function extractKeywords(path, content) {
258
+ const pathTokens = path.split(/[/.\\_-]+/g);
259
+ const codeTokens = [
260
+ ...content.matchAll(/\b(?:export\s+)?(?:function|const|class)\s+([A-Za-z0-9_]+)/g),
261
+ ...content.matchAll(/\bexport\s+default\s+function\s+([A-Za-z0-9_]+)/g)
262
+ ].map((match) => match[1]);
263
+ const routeTokens = [...path.matchAll(/(?:app|pages)\/([^/]+)/g)].map((match) => match[1]);
264
+ return [...new Set([...pathTokens, ...codeTokens, ...routeTokens].map(cleanKeyword).filter(Boolean))].slice(0, 40);
265
+ }
266
+ function inferFeatures(entry) {
267
+ return [...new Set([entry.category, ...entry.keywords.filter((keyword) => keyword.length > 3)])].slice(0, 12);
268
+ }
269
+ function describeRole(entry) {
270
+ if (entry.category === "config") {
271
+ return "Project configuration or build setup file.";
272
+ }
273
+ if (entry.category === "styles") {
274
+ return "Styling/theme related file.";
275
+ }
276
+ return `${entry.category} related code or UI file.`;
277
+ }
278
+ function extractScanTokens(text) {
279
+ const aliases = {
280
+ 설정: ["settings", "setting", "설정"],
281
+ 관리자: ["admin", "관리자"],
282
+ 의견: ["feedback", "opinion", "comment", "의견", "피드백"],
283
+ 피드백: ["feedback", "opinion", "comment", "의견", "피드백"],
284
+ 문의: ["contact", "inquiry", "support", "문의"],
285
+ 카카오: ["kakao", "카카오"],
286
+ 로그인: ["login", "auth", "로그인"],
287
+ 트리: ["tree", "leaf", "트리"],
288
+ 홈: ["home", "dashboard", "홈"]
289
+ };
290
+ const raw = text.toLowerCase().match(/[a-z0-9가-힣]{2,}/g) ?? [];
291
+ const expanded = raw.flatMap((token) => aliases[token] ?? [token]);
292
+ return [...new Set(expanded.map((token) => token.toLowerCase()))].slice(0, 30);
293
+ }
294
+ function priorityBonus(path, token) {
295
+ const lowerPath = path.toLowerCase();
296
+ const highPriority = [
297
+ "app/settings",
298
+ "components/settings",
299
+ "settings",
300
+ "app/admin",
301
+ "components/admin",
302
+ "admin",
303
+ "feedback",
304
+ "contact"
305
+ ];
306
+ const relevantTokens = ["settings", "설정", "admin", "관리자", "feedback", "피드백", "의견", "contact", "문의"];
307
+ if (highPriority.some((pattern) => lowerPath.includes(pattern)) && relevantTokens.includes(token)) {
308
+ return 5;
309
+ }
310
+ return 0;
311
+ }
312
+ function cleanKeyword(keyword) {
313
+ if (!keyword) {
314
+ return "";
315
+ }
316
+ const cleaned = keyword.trim();
317
+ if (cleaned.length < 2 || /^\d+$/.test(cleaned)) {
318
+ return "";
319
+ }
320
+ return cleaned;
321
+ }
322
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAYpD,MAAM,UAAU,gBAAgB,CAAC,KAA6B;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE/C,OAAO;QACL,KAAK;QACL,SAAS;QACT,kBAAkB,EAAE,uBAAuB,CAAC,KAAK,EAAE,SAAS,CAAC;QAC7D,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG;QACZ,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnG,GAAG,cAAc;KAClB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,IAAI,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEtG,OAAO;QACL,KAAK;QACL,SAAS;QACT,kBAAkB,EAAE,uBAAuB,CAAC,KAAK,EAAE,SAAS,CAAC;QAC7D,SAAS;QACT,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE;QACjC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;KACxH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAA6B,EAAE,QAA6B,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAC1H,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IACrF,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAAsB,EAAE,SAA2B,EAAE,KAAK,GAAG,CAAC;IAC7F,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;SAC9B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClJ,OAAO;YACL,IAAI;YACJ,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;YACxC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YAC5C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YACxD,aAAa;SACd,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACrF,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,gBAAgB,CACvB,iBAAmC,EACnC,YAAoC,EACpC,KAA0B,EAC1B,OAAoB;IAEpB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;QAC5B,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/C,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACxC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;KACpC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,iBAAiB;SAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,GAAG,KAAK;QACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChE,UAAU,EAAE,EAAE;KACf,CAAC,CAAC,CAAC;IACN,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IAElG,OAAO,yBAAyB,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAA0B,EAC1B,OAAoB,EACpB,WAA2C;IAE3C,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;SAClD,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;SACpE,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IAEjF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;QACrC,UAAU,EAAE,EAAE;QACd,OAAO;QACP,QAAQ;QACR,gBAAgB,EAAE,EAAE;QACpB,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAyB;IAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,EAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5G,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QACzC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;SAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,OAAO;YACL,GAAG,KAAK;YACR,UAAU;YACV,gBAAgB;YAChB,UAAU,EAAE;gBACV,GAAG,KAAK,CAAC,UAAU;gBACnB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE;aACpE,CAAC,MAAM,CAAC,OAAO,CAAC;SAClB,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,QAAQ,GAAG;QACf,+DAA+D;QAC/D,0DAA0D;QAC1D,wCAAwC;QACxC,yCAAyC;KAC1C,CAAC;IAEF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9H,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG;QACZ,GAAG,OAAO,CAAC,QAAQ,CAAC,yFAAyF,CAAC;QAC9G,GAAG,OAAO,CAAC,QAAQ,CAAC,+DAA+D,CAAC;KACrF,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACjF,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACtD,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,SAAiB,EAAE,OAAoB;IAClF,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG;QACjB,IAAI;QACJ,kBAAkB;QAClB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,SAAS,EAAE,CAAC;QAClH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC;QACpG,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;KACtG,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAgB,EAAE,OAAiB;IACxE,MAAM,KAAK,GAAG,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;IACvC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,SAAS,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,IAAI;SACZ,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC;SAC3C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAmB,EAAE,KAA0B,EAAE,SAAwB;IAClH,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACzF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAChH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAA0B;IAC/D,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAE1D,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC9C,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QACzC,QAAQ;QACR,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAwB,EAAE,KAA0B;IAC5E,MAAM,YAAY,GAAG,KAAK;SACvB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC;SAC7F,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;SAClC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC;QACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACrC,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC;QAC9B,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA0B,EAAE,SAAwB;IAC1F,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClF,MAAM,KAAK,GAAG,OAAO;aAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,MAAM,QAAQ,KAAK,KAAK,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,OAAO,kEAAkE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACrG,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAAkB;IAClD,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/D,MAAM,KAAK,GAA4B;QACrC,CAAC,MAAM,EAAE,6BAA6B,CAAC;QACvC,CAAC,UAAU,EAAE,qBAAqB,CAAC;QACnC,CAAC,OAAO,EAAE,WAAW,CAAC;QACtB,CAAC,WAAW,EAAE,kBAAkB,CAAC;QACjC,CAAC,MAAM,EAAE,gBAAgB,CAAC;QAC1B,CAAC,UAAU,EAAE,UAAU,CAAC;QACxB,CAAC,KAAK,EAAE,oBAAoB,CAAC;QAC7B,CAAC,QAAQ,EAAE,iCAAiC,CAAC;QAC7C,CAAC,QAAQ,EAAE,+CAA+C,CAAC;QAC3D,CAAC,IAAI,EAAE,uCAAuC,CAAC;KAChD,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC/E,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,OAAe;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG;QACjB,GAAG,OAAO,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAClF,GAAG,OAAO,CAAC,QAAQ,CAAC,kDAAkD,CAAC;KACxE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChH,CAAC;AAED,SAAS,YAAY,CAAC,KAAwB;IAC5C,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,QAAQ,2BAA2B,CAAC;AACtD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,OAAO,GAA6B;QACxC,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC;QACjC,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QACrB,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC;QACnD,GAAG,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC;QACpD,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;QAC3C,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QACrB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QAC7B,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;QAC1B,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC;KAC9B,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG;QACnB,cAAc;QACd,qBAAqB;QACrB,UAAU;QACV,WAAW;QACX,kBAAkB;QAClB,OAAO;QACP,UAAU;QACV,SAAS;KACV,CAAC;IACF,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAEpG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,OAA2B;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ChangeFile, TaskAnchorFreshnessResult } from "./types.js";
2
+ /**
3
+ * Returns true when task.md is missing, empty, or contains only template placeholder content.
4
+ * Used to distinguish "no active task" (anchor_absent) from "stale task" (stale).
5
+ */
6
+ export declare function isTaskAnchorAbsent(markdown: string): boolean;
7
+ /**
8
+ * Scores how well the current task.md matches the current git diff.
9
+ * Returns a matchScore 0-100 (higher = better match) and a mode:
10
+ * - "anchor_absent": task.md is missing, empty, or placeholder-only
11
+ * - "use_task" (score >= 60): task.md is fresh, use it normally
12
+ * - "uncertain" (30-59): task.md may be stale, use with caution
13
+ * - "stale" (< 30): task.md is stale, switch to diff-first review
14
+ */
15
+ export declare function scoreTaskAnchorFreshness(input: {
16
+ taskMarkdown: string;
17
+ diffText: string;
18
+ changedFiles: string[];
19
+ changeFiles?: ChangeFile[];
20
+ }): TaskAnchorFreshnessResult;
21
+ export declare function formatTaskAnchorStatus(result: TaskAnchorFreshnessResult, taskLabel?: string, diffLabel?: string): string;
@@ -0,0 +1,126 @@
1
+ import { analyzeGeneratedDiffDrift } from "./drift.js";
2
+ /**
3
+ * Returns true when task.md is missing, empty, or contains only template placeholder content.
4
+ * Used to distinguish "no active task" (anchor_absent) from "stale task" (stale).
5
+ */
6
+ export function isTaskAnchorAbsent(markdown) {
7
+ const text = markdown.trim();
8
+ if (!text)
9
+ return true;
10
+ // Default template placeholder text
11
+ if (/Describe the (exact request scope|requested change)/i.test(text))
12
+ return true;
13
+ // Only a title line and nothing else
14
+ if (/^#?\s*Current Task\s*$/im.test(text) && text.length < 100)
15
+ return true;
16
+ // Count substantive lines: not headings, not empty bullets, not blank
17
+ const substantiveLines = text
18
+ .split("\n")
19
+ .map((l) => l.trim())
20
+ .filter((l) => l.length > 0 && !l.startsWith("#") && !/^-\s*$/.test(l));
21
+ // Fewer than 3 substantive lines → effectively no task
22
+ if (substantiveLines.length < 3)
23
+ return true;
24
+ // Total meaningful characters (strip structural markup)
25
+ const meaningful = substantiveLines
26
+ .join(" ")
27
+ .replace(/[-*_`|>#]+/g, " ")
28
+ .replace(/\s+/g, " ")
29
+ .trim();
30
+ if (meaningful.length < 40)
31
+ return true;
32
+ return false;
33
+ }
34
+ /**
35
+ * Scores how well the current task.md matches the current git diff.
36
+ * Returns a matchScore 0-100 (higher = better match) and a mode:
37
+ * - "anchor_absent": task.md is missing, empty, or placeholder-only
38
+ * - "use_task" (score >= 60): task.md is fresh, use it normally
39
+ * - "uncertain" (30-59): task.md may be stale, use with caution
40
+ * - "stale" (< 30): task.md is stale, switch to diff-first review
41
+ */
42
+ export function scoreTaskAnchorFreshness(input) {
43
+ const taskMarkdown = input.taskMarkdown.trim();
44
+ if (isTaskAnchorAbsent(taskMarkdown)) {
45
+ return {
46
+ matchScore: 0,
47
+ mode: "anchor_absent",
48
+ reasons: ["task.md is absent or placeholder"],
49
+ drift: emptyDrift()
50
+ };
51
+ }
52
+ const drift = analyzeGeneratedDiffDrift({
53
+ requirementText: taskMarkdown,
54
+ taskMarkdown,
55
+ diffText: input.diffText,
56
+ changedFiles: input.changedFiles,
57
+ changeFiles: input.changeFiles
58
+ });
59
+ // Invert drift score: drift 0 = perfect match → matchScore 100
60
+ const baseScore = 100 - drift.driftScore;
61
+ // File hint bonus: +15 if task.md references specific files that appear in the diff
62
+ const fileBonus = computeFileHintBonus(taskMarkdown, input.changedFiles);
63
+ const matchScore = Math.min(100, Math.max(0, Math.round(baseScore + fileBonus)));
64
+ const taskType = extractTaskTypeToken(taskMarkdown);
65
+ const mode = matchScore >= 60 ? "use_task" : matchScore >= 30 ? "uncertain" : "stale";
66
+ return {
67
+ matchScore,
68
+ mode,
69
+ taskType,
70
+ diffType: undefined,
71
+ reasons: drift.reasons,
72
+ drift
73
+ };
74
+ }
75
+ export function formatTaskAnchorStatus(result, taskLabel, diffLabel) {
76
+ if (result.mode === "anchor_absent") {
77
+ return "task anchor: absent";
78
+ }
79
+ const score = `match score ${result.matchScore}`;
80
+ if (result.mode === "use_task") {
81
+ return `task.md: fresh (${score})`;
82
+ }
83
+ if (result.mode === "uncertain") {
84
+ const taskPart = taskLabel ? `task.md task: ${taskLabel}` : "";
85
+ return [`task.md: uncertain (${score})`, taskPart].filter(Boolean).join(" — ");
86
+ }
87
+ const taskPart = taskLabel ? `task.md task: ${taskLabel}` : "";
88
+ const diffPart = diffLabel ? `current diff intent: ${diffLabel}` : "";
89
+ return [
90
+ `task.md: stale (${score})`,
91
+ taskPart,
92
+ diffPart,
93
+ "mode: diff-first inferred review"
94
+ ]
95
+ .filter(Boolean)
96
+ .join("\n");
97
+ }
98
+ function computeFileHintBonus(taskMarkdown, changedFiles) {
99
+ if (changedFiles.length === 0)
100
+ return 0;
101
+ const roots = "(?:app|apps|pages|packages|src|lib|components|hooks|utils|supabase|styles|constants|public|docs)";
102
+ const hints = [...taskMarkdown.matchAll(new RegExp(`(?:^|[\\s\`'"/])((?:\\./)?${roots}/[^\\s,)\\]\`'"]+)`, "g"))]
103
+ .map((m) => (m[1] ?? "").replace(/^\.\//, "").replace(/[),.\]'"]+$/, "").trim())
104
+ .filter(Boolean);
105
+ if (hints.length === 0)
106
+ return 0;
107
+ const hitCount = changedFiles.filter((file) => hints.some((hint) => file === hint || file.startsWith(`${hint}/`) || hint.startsWith(file))).length;
108
+ return hitCount > 0 ? Math.min(15, hitCount * 5) : 0;
109
+ }
110
+ function extractTaskTypeToken(markdown) {
111
+ return markdown.match(/^-\s*type:\s*([a-z_]+)/im)?.[1] ?? markdown.match(/\btype:\s*([a-z_]+)/i)?.[1];
112
+ }
113
+ function emptyDrift() {
114
+ return {
115
+ driftScore: 100,
116
+ severity: "high",
117
+ reasons: ["no task content"],
118
+ requirementDomains: [],
119
+ generatedDomains: [],
120
+ requirementZones: [],
121
+ generatedZones: [],
122
+ allowedExpansions: [],
123
+ similarity: 0
124
+ };
125
+ }
126
+ //# sourceMappingURL=task-anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-anchor.js","sourceRoot":"","sources":["../src/task-anchor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,oCAAoC;IACpC,IAAI,sDAAsD,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnF,qCAAqC;IACrC,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IAE5E,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,IAAI;SAC1B,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,uDAAuD;IACvD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7C,wDAAwD;IACxD,MAAM,UAAU,GAAG,gBAAgB;SAChC,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACV,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IAExC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAKxC;IACC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAE/C,IAAI,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,CAAC,kCAAkC,CAAC;YAC7C,KAAK,EAAE,UAAU,EAAE;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,yBAAyB,CAAC;QACtC,eAAe,EAAE,YAAY;QAC7B,YAAY;QACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC,CAAC;IAEH,+DAA+D;IAC/D,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC;IAEzC,oFAAoF;IACpF,MAAM,SAAS,GAAG,oBAAoB,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAEzE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,IAAI,GAAsC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IAEzH,OAAO;QACL,UAAU;QACV,IAAI;QACJ,QAAQ;QACR,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiC,EAAE,SAAkB,EAAE,SAAkB;IAC9G,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACpC,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC;IACjD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,mBAAmB,KAAK,GAAG,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,uBAAuB,KAAK,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO;QACL,mBAAmB,KAAK,GAAG;QAC3B,QAAQ;QACR,QAAQ;QACR,kCAAkC;KACnC;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAoB,EAAE,YAAsB;IACxE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,kGAAkG,CAAC;IACjH,MAAM,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,6BAA6B,KAAK,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC;SAC9G,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SAC/E,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5C,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAC5F,CAAC,MAAM,CAAC;IACT,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,OAAO,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,UAAU;IACjB,OAAO;QACL,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC5B,kBAAkB,EAAE,EAAE;QACtB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,EAAE;QAClB,iBAAiB,EAAE,EAAE;QACrB,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TaskTypeResult } from "./types.js";
2
+ export declare function classifyTaskType(requirement: string): TaskTypeResult;
3
+ export declare function taskTypeStrategyNotes(result: TaskTypeResult): string[];