@mcoda/core 0.1.34 → 0.1.36

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 (27) hide show
  1. package/dist/api/AgentsApi.d.ts +4 -1
  2. package/dist/api/AgentsApi.d.ts.map +1 -1
  3. package/dist/api/AgentsApi.js +4 -1
  4. package/dist/prompts/PdrPrompts.js +1 -1
  5. package/dist/services/docs/DocsService.d.ts +37 -0
  6. package/dist/services/docs/DocsService.d.ts.map +1 -1
  7. package/dist/services/docs/DocsService.js +537 -2
  8. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -1
  9. package/dist/services/docs/review/gates/OpenQuestionsGate.js +13 -2
  10. package/dist/services/docs/review/gates/SdsNoUnresolvedItemsGate.d.ts.map +1 -1
  11. package/dist/services/docs/review/gates/SdsNoUnresolvedItemsGate.js +12 -1
  12. package/dist/services/planning/CreateTasksService.d.ts +57 -0
  13. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  14. package/dist/services/planning/CreateTasksService.js +2491 -291
  15. package/dist/services/planning/SdsCoverageModel.d.ts +27 -0
  16. package/dist/services/planning/SdsCoverageModel.d.ts.map +1 -0
  17. package/dist/services/planning/SdsCoverageModel.js +138 -0
  18. package/dist/services/planning/SdsPreflightService.d.ts +2 -0
  19. package/dist/services/planning/SdsPreflightService.d.ts.map +1 -1
  20. package/dist/services/planning/SdsPreflightService.js +131 -37
  21. package/dist/services/planning/SdsStructureSignals.d.ts +24 -0
  22. package/dist/services/planning/SdsStructureSignals.d.ts.map +1 -0
  23. package/dist/services/planning/SdsStructureSignals.js +402 -0
  24. package/dist/services/planning/TaskSufficiencyService.d.ts +17 -0
  25. package/dist/services/planning/TaskSufficiencyService.d.ts.map +1 -1
  26. package/dist/services/planning/TaskSufficiencyService.js +409 -278
  27. package/package.json +6 -6
@@ -0,0 +1,402 @@
1
+ const DIRECT_PATH_TOKEN_PATTERN = /(^|[\s`"'([{<])([A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)+)(?=$|[\s`"')\]}>.,;:!?])/g;
2
+ const FILE_EXTENSION_PATTERN = /\.[a-z0-9]{1,10}$/i;
3
+ const TOP_LEVEL_STRUCTURE_PATTERN = /^[a-z][a-z0-9._-]{1,80}$/i;
4
+ const TREE_CHILD_PATTERN = /^((?:[│ ]{4}| {4})*)(?:├── |└── )(.+?)\s*$/;
5
+ const NEGATED_PATH_LINE_PATTERN = /\b(no|not|never|without|exclude(?:s|d|ing)?|non-goal|out of scope|not part of|outside the .* target layout)\b/i;
6
+ const MANAGED_PREFLIGHT_BLOCK_PATTERN = /<!--\s*mcoda:sds-preflight:start\s*-->[\s\S]*?<!--\s*mcoda:sds-preflight:end\s*-->\s*/gi;
7
+ const SUPPORT_STRUCTURE_ROOTS = new Set(["docs", "fixtures", "policies", "policy", "runbooks", "pdr", "sds"]);
8
+ const ACTION_ONLY_PATH_SEGMENTS = new Set([
9
+ "add",
10
+ "browse",
11
+ "create",
12
+ "delete",
13
+ "edit",
14
+ "list",
15
+ "manage",
16
+ "read",
17
+ "remove",
18
+ "submit",
19
+ "update",
20
+ "view",
21
+ "write",
22
+ ]);
23
+ const NON_IMPLEMENTATION_HEADING_PATTERN = /\b(software design specification|system design specification|\bsds\b|revision history|table of contents|purpose|scope|definitions?|abbreviations?|glossary|references?|appendix|document control|authors?)\b/i;
24
+ const LIKELY_IMPLEMENTATION_HEADING_PATTERN = /\b(architecture|runtime|interface|interfaces|entity|entities|service|services|module|modules|component|components|pipeline|workflow|api|endpoint|schema|model|feature|store|database|ingestion|training|inference|ui|frontend|backend|ops|observability|security|deployment|solver|integration|testing|validation|contract|index|mapping|registry|cache|queue|event|job|task|migration|controller|router|policy)\b/i;
25
+ const IMPLEMENTATION_PATH_HINT_SEGMENTS = new Set([
26
+ "api",
27
+ "app",
28
+ "apps",
29
+ "bin",
30
+ "cli",
31
+ "cmd",
32
+ "component",
33
+ "components",
34
+ "controller",
35
+ "controllers",
36
+ "data",
37
+ "db",
38
+ "deploy",
39
+ "deployment",
40
+ "deployments",
41
+ "handler",
42
+ "handlers",
43
+ "infra",
44
+ "integration",
45
+ "internal",
46
+ "job",
47
+ "jobs",
48
+ "lib",
49
+ "libs",
50
+ "migration",
51
+ "migrations",
52
+ "model",
53
+ "models",
54
+ "module",
55
+ "modules",
56
+ "ops",
57
+ "page",
58
+ "pages",
59
+ "route",
60
+ "routes",
61
+ "schema",
62
+ "schemas",
63
+ "script",
64
+ "scripts",
65
+ "server",
66
+ "servers",
67
+ "service",
68
+ "services",
69
+ "spec",
70
+ "specs",
71
+ "src",
72
+ "test",
73
+ "tests",
74
+ "ui",
75
+ "web",
76
+ "worker",
77
+ "workers",
78
+ ]);
79
+ const HEADING_NOISE_TOKENS = new Set(["and", "for", "from", "into", "the", "with"]);
80
+ const normalizeLineComment = (value) => value.replace(/\s+#.*$/, "").trimEnd();
81
+ const unique = (items) => Array.from(new Set(items.filter(Boolean)));
82
+ const stripDecorators = (value) => value
83
+ .replace(/[`*_]/g, " ")
84
+ .replace(/^[\s>:\-[\]().]+/, "")
85
+ .replace(/\s+/g, " ")
86
+ .trim();
87
+ const extractHeadingNumberPath = (heading) => {
88
+ const match = stripDecorators(heading).match(/^(\d+(?:\.\d+)*)\.?(?:\s+|$)/);
89
+ return (match?.[1] ?? "")
90
+ .split(".")
91
+ .map((segment) => segment.trim())
92
+ .filter(Boolean);
93
+ };
94
+ const computeSignalScanLimit = (limit) => {
95
+ if (limit <= 0)
96
+ return 0;
97
+ return Math.max(limit * 4, limit + 12);
98
+ };
99
+ export const isStructuredFilePath = (value) => FILE_EXTENSION_PATTERN.test(value);
100
+ export const stripManagedSdsPreflightBlock = (value) => {
101
+ if (typeof value !== "string" || value.length === 0)
102
+ return value;
103
+ const sanitized = value.replace(MANAGED_PREFLIGHT_BLOCK_PATTERN, "").replace(/\n{3,}/g, "\n\n").trim();
104
+ return sanitized.length > 0 ? sanitized : undefined;
105
+ };
106
+ export const normalizeHeadingCandidate = (value) => {
107
+ const cleaned = stripDecorators(value).replace(/^\d+(?:\.\d+)*\.?\s+/, "").trim();
108
+ return cleaned.length > 0 ? cleaned : stripDecorators(value);
109
+ };
110
+ export const headingLooksImplementationRelevant = (heading) => {
111
+ const normalized = normalizeHeadingCandidate(heading).toLowerCase();
112
+ if (!normalized || normalized.length < 3)
113
+ return false;
114
+ if (normalized === "roles" || normalized === "role matrix" || normalized === "actors")
115
+ return false;
116
+ if (NON_IMPLEMENTATION_HEADING_PATTERN.test(normalized))
117
+ return false;
118
+ if (LIKELY_IMPLEMENTATION_HEADING_PATTERN.test(normalized))
119
+ return true;
120
+ const sectionMatch = heading.trim().match(/^(\d+)(?:\.\d+)*\.?(?:\s+|$)/);
121
+ if (sectionMatch) {
122
+ const major = Number.parseInt(sectionMatch[1] ?? "", 10);
123
+ if (Number.isFinite(major) && major >= 3)
124
+ return true;
125
+ }
126
+ const tokens = normalized
127
+ .split(/\s+/)
128
+ .map((token) => token.replace(/[^a-z0-9.-]+/g, ""))
129
+ .filter((token) => token.length >= 4 && !HEADING_NOISE_TOKENS.has(token));
130
+ return tokens.length >= 2;
131
+ };
132
+ export const pruneParentImplementationHeadings = (headings) => {
133
+ const numbered = headings.map((heading) => ({
134
+ heading,
135
+ numberPath: extractHeadingNumberPath(heading),
136
+ }));
137
+ return headings.filter((heading, index) => {
138
+ const current = numbered[index];
139
+ if (!current || current.numberPath.length === 0)
140
+ return true;
141
+ return !numbered.some((candidate, candidateIndex) => {
142
+ if (candidateIndex === index)
143
+ return false;
144
+ if (candidate.numberPath.length <= current.numberPath.length)
145
+ return false;
146
+ return current.numberPath.every((segment, segmentIndex) => candidate.numberPath[segmentIndex] === segment);
147
+ });
148
+ });
149
+ };
150
+ export const normalizeStructuredPathToken = (value) => {
151
+ const raw = value.replace(/\t/g, " ").replace(/\\/g, "/");
152
+ const hadTrailingSlash = /\/\s*$/.test(raw);
153
+ const normalized = normalizeLineComment(raw)
154
+ .trim()
155
+ .replace(/^[./]+/, "")
156
+ .replace(/^\/+/, "")
157
+ .replace(/\/+/g, "/");
158
+ if (!normalized)
159
+ return undefined;
160
+ if (normalized.length > 240)
161
+ return undefined;
162
+ if (normalized.includes("://"))
163
+ return undefined;
164
+ if (/[\u0000-\u001f]/.test(normalized))
165
+ return undefined;
166
+ if (normalized.includes("...") || normalized.includes("*"))
167
+ return undefined;
168
+ const parts = normalized
169
+ .replace(/\/+$/, "")
170
+ .split("/")
171
+ .map((part) => part.trim())
172
+ .filter(Boolean);
173
+ if (parts.length === 0)
174
+ return undefined;
175
+ if (parts.some((part) => part === "." || part === ".."))
176
+ return undefined;
177
+ if (!parts.every((part) => /^[A-Za-z0-9._-]+$/.test(part)))
178
+ return undefined;
179
+ if (parts.length === 1) {
180
+ const token = parts[0];
181
+ if (isStructuredFilePath(token))
182
+ return token;
183
+ if (hadTrailingSlash && TOP_LEVEL_STRUCTURE_PATTERN.test(token))
184
+ return token;
185
+ return undefined;
186
+ }
187
+ return parts.join("/");
188
+ };
189
+ export const normalizeFolderEntry = (entry) => normalizeStructuredPathToken(stripDecorators(entry).replace(/^\.\//, "").replace(/\/+$/, ""));
190
+ const extractTreePaths = (content, limit) => {
191
+ const results = [];
192
+ const seen = new Set();
193
+ let stack = [];
194
+ let treeBase = [];
195
+ const add = (candidate) => {
196
+ if (!candidate || seen.has(candidate))
197
+ return;
198
+ seen.add(candidate);
199
+ results.push(candidate);
200
+ };
201
+ for (const rawLine of content.split(/\r?\n/)) {
202
+ if (results.length >= limit)
203
+ break;
204
+ const line = rawLine.replace(/\t/g, " ");
205
+ const trimmed = line.trim();
206
+ if (!trimmed) {
207
+ stack = [];
208
+ treeBase = [];
209
+ continue;
210
+ }
211
+ if (/^```/.test(trimmed)) {
212
+ stack = [];
213
+ treeBase = [];
214
+ continue;
215
+ }
216
+ const withoutComment = normalizeLineComment(line);
217
+ const childMatch = withoutComment.match(TREE_CHILD_PATTERN);
218
+ if (childMatch) {
219
+ const depth = Math.floor((childMatch[1]?.length ?? 0) / 4);
220
+ const token = normalizeStructuredPathToken(childMatch[2] ?? "");
221
+ if (!token)
222
+ continue;
223
+ const baseDepth = treeBase.length > 0 ? treeBase.length + depth : depth;
224
+ const base = stack.slice(0, Math.max(0, baseDepth));
225
+ stack = [...base, ...token.split("/")];
226
+ add(stack.join("/"));
227
+ continue;
228
+ }
229
+ const rootToken = normalizeStructuredPathToken(trimmed);
230
+ if (rootToken) {
231
+ stack = rootToken.split("/");
232
+ treeBase = [...stack];
233
+ add(rootToken);
234
+ continue;
235
+ }
236
+ stack = [];
237
+ treeBase = [];
238
+ }
239
+ return results;
240
+ };
241
+ const lineAtOffset = (content, offset) => {
242
+ const start = content.lastIndexOf("\n", offset);
243
+ const end = content.indexOf("\n", offset);
244
+ return content.slice(start === -1 ? 0 : start + 1, end === -1 ? content.length : end);
245
+ };
246
+ export const extractStructuredPaths = (content, limit) => {
247
+ if (!content || limit <= 0)
248
+ return [];
249
+ const sanitizedContent = stripManagedSdsPreflightBlock(content) ?? "";
250
+ if (!sanitizedContent)
251
+ return [];
252
+ const paths = [];
253
+ const seen = new Set();
254
+ const add = (candidate) => {
255
+ if (!candidate || seen.has(candidate))
256
+ return;
257
+ seen.add(candidate);
258
+ paths.push(candidate);
259
+ };
260
+ for (const treePath of extractTreePaths(sanitizedContent, limit)) {
261
+ add(treePath);
262
+ if (paths.length >= limit)
263
+ return paths;
264
+ }
265
+ for (const match of sanitizedContent.matchAll(DIRECT_PATH_TOKEN_PATTERN)) {
266
+ const line = typeof match.index === "number" ? lineAtOffset(sanitizedContent, match.index) : "";
267
+ if (NEGATED_PATH_LINE_PATTERN.test(line))
268
+ continue;
269
+ const candidate = normalizeStructuredPathToken(match[2] ?? "");
270
+ add(candidate);
271
+ if (paths.length >= limit)
272
+ break;
273
+ }
274
+ return paths.slice(0, limit);
275
+ };
276
+ export const extractMarkdownHeadings = (content, limit) => {
277
+ if (!content || limit <= 0)
278
+ return [];
279
+ const sanitizedContent = stripManagedSdsPreflightBlock(content) ?? "";
280
+ if (!sanitizedContent)
281
+ return [];
282
+ const lines = sanitizedContent.split(/\r?\n/);
283
+ const headings = [];
284
+ const seen = new Set();
285
+ const pushHeading = (rawValue) => {
286
+ const heading = rawValue?.replace(/#+$/, "").replace(/[`*_]/g, "").trim();
287
+ if (!heading)
288
+ return;
289
+ const normalized = heading.replace(/\s+/g, " ").toLowerCase();
290
+ if (!normalized || seen.has(normalized))
291
+ return;
292
+ seen.add(normalized);
293
+ headings.push(heading);
294
+ };
295
+ for (let index = 0; index < lines.length; index += 1) {
296
+ const line = lines[index]?.trim() ?? "";
297
+ if (!line)
298
+ continue;
299
+ const hashHeading = line.match(/^#{1,6}\s+(.+)$/);
300
+ if (hashHeading) {
301
+ pushHeading(hashHeading[1]);
302
+ }
303
+ else if (index + 1 < lines.length &&
304
+ /^[=-]{3,}\s*$/.test((lines[index + 1] ?? "").trim()) &&
305
+ !line.startsWith("-") &&
306
+ !line.startsWith("*")) {
307
+ pushHeading(line);
308
+ }
309
+ else {
310
+ const numberedHeading = line.match(/^(\d+(?:\.\d+)+)\s+(.+)$/);
311
+ if (numberedHeading) {
312
+ const headingText = `${numberedHeading[1]} ${numberedHeading[2]}`.trim();
313
+ if (/[a-z]/i.test(headingText))
314
+ pushHeading(headingText);
315
+ }
316
+ }
317
+ if (headings.length >= limit)
318
+ break;
319
+ }
320
+ return headings;
321
+ };
322
+ const looksLikePseudoActionPath = (candidate) => {
323
+ if (!candidate || isStructuredFilePath(candidate))
324
+ return false;
325
+ const parts = candidate
326
+ .toLowerCase()
327
+ .split("/")
328
+ .map((part) => part.trim())
329
+ .filter(Boolean);
330
+ if (parts.length < 2 || parts.length > 3)
331
+ return false;
332
+ return parts.every((part) => ACTION_ONLY_PATH_SEGMENTS.has(part));
333
+ };
334
+ export const folderEntryLooksRepoRelevant = (entry) => {
335
+ const normalized = normalizeFolderEntry(entry);
336
+ if (!normalized)
337
+ return false;
338
+ if (normalized.startsWith("/") || /^[A-Za-z]:\//.test(normalized))
339
+ return false;
340
+ if (isStructuredFilePath(normalized)) {
341
+ const root = normalized.split("/")[0]?.toLowerCase();
342
+ return !root || !SUPPORT_STRUCTURE_ROOTS.has(root);
343
+ }
344
+ const segments = normalized
345
+ .split("/")
346
+ .map((segment) => segment.trim().toLowerCase())
347
+ .filter(Boolean);
348
+ if (segments.length < 2)
349
+ return false;
350
+ const root = segments[0];
351
+ if (SUPPORT_STRUCTURE_ROOTS.has(root))
352
+ return false;
353
+ if (segments.some((segment) => IMPLEMENTATION_PATH_HINT_SEGMENTS.has(segment)))
354
+ return true;
355
+ return segments.some((segment) => segment.length >= 3);
356
+ };
357
+ export const filterImplementationStructuredPaths = (paths) => {
358
+ const normalized = Array.from(new Set(paths
359
+ .map((candidate) => normalizeStructuredPathToken(candidate))
360
+ .filter((value) => Boolean(value))
361
+ .filter((candidate) => !looksLikePseudoActionPath(candidate))));
362
+ const hasImplementationTree = normalized.some((candidate) => {
363
+ const root = candidate.split("/")[0]?.toLowerCase();
364
+ return Boolean(root) && !SUPPORT_STRUCTURE_ROOTS.has(root) && candidate.includes("/");
365
+ });
366
+ return normalized.filter((candidate) => {
367
+ const root = candidate.split("/")[0]?.toLowerCase();
368
+ if (!root)
369
+ return false;
370
+ if (SUPPORT_STRUCTURE_ROOTS.has(root))
371
+ return !hasImplementationTree;
372
+ if (candidate.includes("/"))
373
+ return true;
374
+ if (isStructuredFilePath(candidate))
375
+ return true;
376
+ if (!hasImplementationTree)
377
+ return true;
378
+ return normalized.some((other) => other !== candidate && other.startsWith(`${candidate}/`));
379
+ });
380
+ };
381
+ export const collectSdsImplementationSignals = (content, options) => {
382
+ const headingScanLimit = computeSignalScanLimit(options.headingLimit);
383
+ const folderScanLimit = computeSignalScanLimit(options.folderLimit);
384
+ const rawSectionHeadings = options.headingLimit > 0 ? extractMarkdownHeadings(content, headingScanLimit) : [];
385
+ const filteredSectionHeadings = unique(rawSectionHeadings.filter((heading) => headingLooksImplementationRelevant(heading)));
386
+ const sectionHeadings = unique(pruneParentImplementationHeadings(filteredSectionHeadings).map((heading) => normalizeHeadingCandidate(heading))).slice(0, Math.max(0, options.headingLimit));
387
+ const rawFolderEntries = options.folderLimit > 0
388
+ ? unique(filterImplementationStructuredPaths(extractStructuredPaths(content, folderScanLimit)))
389
+ : [];
390
+ const folderEntries = unique(rawFolderEntries
391
+ .map((entry) => normalizeFolderEntry(entry))
392
+ .filter((entry) => Boolean(entry))
393
+ .filter((entry) => folderEntryLooksRepoRelevant(entry))).slice(0, Math.max(0, options.folderLimit));
394
+ return {
395
+ rawSectionHeadings,
396
+ rawFolderEntries,
397
+ sectionHeadings,
398
+ folderEntries,
399
+ skippedHeadingSignals: Math.max(0, rawSectionHeadings.length - sectionHeadings.length),
400
+ skippedFolderSignals: Math.max(0, rawFolderEntries.length - folderEntries.length),
401
+ };
402
+ };
@@ -1,6 +1,19 @@
1
1
  import { WorkspaceRepository } from "@mcoda/db";
2
2
  import { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
3
3
  import { JobService } from "../jobs/JobService.js";
4
+ export interface TaskSufficiencyPlannedGapBundle {
5
+ kind: "section" | "folder" | "mixed";
6
+ domain: string;
7
+ values: string[];
8
+ anchors: string[];
9
+ implementationTargets: string[];
10
+ }
11
+ export interface TaskSufficiencyUnresolvedBundle {
12
+ kind: "section" | "folder" | "mixed";
13
+ domain: string;
14
+ values: string[];
15
+ anchors: string[];
16
+ }
4
17
  export interface TaskSufficiencyAuditRequest {
5
18
  workspace: WorkspaceResolution;
6
19
  projectKey: string;
@@ -16,6 +29,7 @@ export interface TaskSufficiencyAuditIteration {
16
29
  totalSignals: number;
17
30
  missingSectionCount: number;
18
31
  missingFolderCount: number;
32
+ unresolvedBundleCount: number;
19
33
  createdTaskKeys: string[];
20
34
  }
21
35
  export interface TaskSufficiencyAuditResult {
@@ -29,6 +43,7 @@ export interface TaskSufficiencyAuditResult {
29
43
  totalTasksUpdated: number;
30
44
  maxIterations: number;
31
45
  minCoverageRatio: number;
46
+ finalTotalSignals: number;
32
47
  finalCoverageRatio: number;
33
48
  remainingSectionHeadings: string[];
34
49
  remainingFolderEntries: string[];
@@ -37,6 +52,8 @@ export interface TaskSufficiencyAuditResult {
37
52
  folders: number;
38
53
  total: number;
39
54
  };
55
+ plannedGapBundles: TaskSufficiencyPlannedGapBundle[];
56
+ unresolvedBundles: TaskSufficiencyUnresolvedBundle[];
40
57
  iterations: TaskSufficiencyAuditIteration[];
41
58
  reportPath: string;
42
59
  reportHistoryPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"TaskSufficiencyService.d.ts","sourceRoot":"","sources":["../../../src/services/planning/TaskSufficiencyService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAiC,MAAM,WAAW,CAAC;AAE/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAmGnD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,mBAAmB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,KAAK,mBAAmB,GAAG;IACzB,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAsNF,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;gBAG9C,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE,mBAAmB,EACzB,SAAS,GAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO;WAS9D,MAAM,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAU9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASd,gBAAgB;YA4BhB,iBAAiB;YAmCjB,cAAc;YAcd,mBAAmB;IAwEjC,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,cAAc;YA2BR,iBAAiB;YAyGjB,cAAc;YAkId,oBAAoB;IAkB5B,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,0BAA0B,CAAC;CA2U1F"}
1
+ {"version":3,"file":"TaskSufficiencyService.d.ts","sourceRoot":"","sources":["../../../src/services/planning/TaskSufficiencyService.ts"],"names":[],"mappings":"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"}