@diegonogueiradev_/mcp-graph 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/context/compact-context.d.ts +51 -0
- package/dist/core/context/compact-context.d.ts.map +1 -0
- package/dist/core/context/compact-context.js +115 -0
- package/dist/core/context/compact-context.js.map +1 -0
- package/dist/core/context/rag-context.d.ts +36 -0
- package/dist/core/context/rag-context.d.ts.map +1 -0
- package/dist/core/context/rag-context.js +69 -0
- package/dist/core/context/rag-context.js.map +1 -0
- package/dist/core/context/token-estimator.d.ts +7 -0
- package/dist/core/context/token-estimator.d.ts.map +1 -0
- package/dist/core/context/token-estimator.js +9 -0
- package/dist/core/context/token-estimator.js.map +1 -0
- package/dist/core/graph/graph-indexes.d.ts +3 -0
- package/dist/core/graph/graph-indexes.d.ts.map +1 -0
- package/dist/core/graph/graph-indexes.js +28 -0
- package/dist/core/graph/graph-indexes.js.map +1 -0
- package/dist/core/graph/graph-types.d.ts +72 -0
- package/dist/core/graph/graph-types.d.ts.map +1 -0
- package/dist/core/graph/graph-types.js +2 -0
- package/dist/core/graph/graph-types.js.map +1 -0
- package/dist/core/importer/import-prd.d.ts +7 -0
- package/dist/core/importer/import-prd.d.ts.map +1 -0
- package/dist/core/importer/import-prd.js +7 -0
- package/dist/core/importer/import-prd.js.map +1 -0
- package/dist/core/importer/prd-to-graph.d.ts +18 -0
- package/dist/core/importer/prd-to-graph.d.ts.map +1 -0
- package/dist/core/importer/prd-to-graph.js +188 -0
- package/dist/core/importer/prd-to-graph.js.map +1 -0
- package/dist/core/parser/classify.d.ts +31 -0
- package/dist/core/parser/classify.d.ts.map +1 -0
- package/dist/core/parser/classify.js +128 -0
- package/dist/core/parser/classify.js.map +1 -0
- package/dist/core/parser/extract.d.ts +21 -0
- package/dist/core/parser/extract.d.ts.map +1 -0
- package/dist/core/parser/extract.js +66 -0
- package/dist/core/parser/extract.js.map +1 -0
- package/dist/core/parser/normalize.d.ts +9 -0
- package/dist/core/parser/normalize.d.ts.map +1 -0
- package/dist/core/parser/normalize.js +22 -0
- package/dist/core/parser/normalize.js.map +1 -0
- package/dist/core/parser/read-file.d.ts +7 -0
- package/dist/core/parser/read-file.d.ts.map +1 -0
- package/dist/core/parser/read-file.js +17 -0
- package/dist/core/parser/read-file.js.map +1 -0
- package/dist/core/parser/segment.d.ts +13 -0
- package/dist/core/parser/segment.d.ts.map +1 -0
- package/dist/core/parser/segment.js +53 -0
- package/dist/core/parser/segment.js.map +1 -0
- package/dist/core/planner/decompose.d.ts +25 -0
- package/dist/core/planner/decompose.d.ts.map +1 -0
- package/dist/core/planner/decompose.js +100 -0
- package/dist/core/planner/decompose.js.map +1 -0
- package/dist/core/planner/dependency-chain.d.ts +20 -0
- package/dist/core/planner/dependency-chain.d.ts.map +1 -0
- package/dist/core/planner/dependency-chain.js +163 -0
- package/dist/core/planner/dependency-chain.js.map +1 -0
- package/dist/core/planner/next-task.d.ts +16 -0
- package/dist/core/planner/next-task.d.ts.map +1 -0
- package/dist/core/planner/next-task.js +76 -0
- package/dist/core/planner/next-task.js.map +1 -0
- package/dist/core/planner/velocity.d.ts +38 -0
- package/dist/core/planner/velocity.d.ts.map +1 -0
- package/dist/core/planner/velocity.js +92 -0
- package/dist/core/planner/velocity.js.map +1 -0
- package/dist/core/search/fts-search.d.ts +16 -0
- package/dist/core/search/fts-search.d.ts.map +1 -0
- package/dist/core/search/fts-search.js +57 -0
- package/dist/core/search/fts-search.js.map +1 -0
- package/dist/core/search/tfidf.d.ts +32 -0
- package/dist/core/search/tfidf.d.ts.map +1 -0
- package/dist/core/search/tfidf.js +67 -0
- package/dist/core/search/tfidf.js.map +1 -0
- package/dist/core/search/tokenizer.d.ts +9 -0
- package/dist/core/search/tokenizer.d.ts.map +1 -0
- package/dist/core/search/tokenizer.js +37 -0
- package/dist/core/search/tokenizer.js.map +1 -0
- package/dist/core/store/migrations.d.ts +4 -0
- package/dist/core/store/migrations.d.ts.map +1 -0
- package/dist/core/store/migrations.js +137 -0
- package/dist/core/store/migrations.js.map +1 -0
- package/dist/core/store/sqlite-store.d.ts +68 -0
- package/dist/core/store/sqlite-store.d.ts.map +1 -0
- package/dist/core/store/sqlite-store.js +608 -0
- package/dist/core/store/sqlite-store.js.map +1 -0
- package/dist/core/utils/errors.d.ts +20 -0
- package/dist/core/utils/errors.d.ts.map +1 -0
- package/dist/core/utils/errors.js +39 -0
- package/dist/core/utils/errors.js.map +1 -0
- package/dist/core/utils/fs.d.ts +2 -0
- package/dist/core/utils/fs.d.ts.map +1 -0
- package/dist/core/utils/fs.js +11 -0
- package/dist/core/utils/fs.js.map +1 -0
- package/dist/core/utils/id.d.ts +2 -0
- package/dist/core/utils/id.d.ts.map +1 -0
- package/dist/core/utils/id.js +6 -0
- package/dist/core/utils/id.js.map +1 -0
- package/dist/core/utils/logger.d.ts +7 -0
- package/dist/core/utils/logger.d.ts.map +1 -0
- package/dist/core/utils/logger.js +23 -0
- package/dist/core/utils/logger.js.map +1 -0
- package/dist/core/utils/time.d.ts +2 -0
- package/dist/core/utils/time.d.ts.map +1 -0
- package/dist/core/utils/time.js +4 -0
- package/dist/core/utils/time.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/init-project.d.ts +2 -0
- package/dist/mcp/init-project.d.ts.map +1 -0
- package/dist/mcp/init-project.js +104 -0
- package/dist/mcp/init-project.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +30 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +3 -0
- package/dist/mcp/stdio.d.ts.map +1 -0
- package/dist/mcp/stdio.js +20 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/mcp/tools/add-edge.d.ts +4 -0
- package/dist/mcp/tools/add-edge.d.ts.map +1 -0
- package/dist/mcp/tools/add-edge.js +62 -0
- package/dist/mcp/tools/add-edge.js.map +1 -0
- package/dist/mcp/tools/add-node.d.ts +4 -0
- package/dist/mcp/tools/add-node.d.ts.map +1 -0
- package/dist/mcp/tools/add-node.js +80 -0
- package/dist/mcp/tools/add-node.js.map +1 -0
- package/dist/mcp/tools/bulk-update-status.d.ts +4 -0
- package/dist/mcp/tools/bulk-update-status.d.ts.map +1 -0
- package/dist/mcp/tools/bulk-update-status.js +19 -0
- package/dist/mcp/tools/bulk-update-status.js.map +1 -0
- package/dist/mcp/tools/clone-node.d.ts +4 -0
- package/dist/mcp/tools/clone-node.d.ts.map +1 -0
- package/dist/mcp/tools/clone-node.js +107 -0
- package/dist/mcp/tools/clone-node.js.map +1 -0
- package/dist/mcp/tools/context.d.ts +4 -0
- package/dist/mcp/tools/context.d.ts.map +1 -0
- package/dist/mcp/tools/context.js +26 -0
- package/dist/mcp/tools/context.js.map +1 -0
- package/dist/mcp/tools/decompose.d.ts +4 -0
- package/dist/mcp/tools/decompose.d.ts.map +1 -0
- package/dist/mcp/tools/decompose.js +22 -0
- package/dist/mcp/tools/decompose.js.map +1 -0
- package/dist/mcp/tools/delete-edge.d.ts +4 -0
- package/dist/mcp/tools/delete-edge.d.ts.map +1 -0
- package/dist/mcp/tools/delete-edge.js +25 -0
- package/dist/mcp/tools/delete-edge.js.map +1 -0
- package/dist/mcp/tools/delete-node.d.ts +4 -0
- package/dist/mcp/tools/delete-node.d.ts.map +1 -0
- package/dist/mcp/tools/delete-node.js +25 -0
- package/dist/mcp/tools/delete-node.js.map +1 -0
- package/dist/mcp/tools/dependencies.d.ts +4 -0
- package/dist/mcp/tools/dependencies.d.ts.map +1 -0
- package/dist/mcp/tools/dependencies.js +42 -0
- package/dist/mcp/tools/dependencies.js.map +1 -0
- package/dist/mcp/tools/export-graph.d.ts +4 -0
- package/dist/mcp/tools/export-graph.d.ts.map +1 -0
- package/dist/mcp/tools/export-graph.js +14 -0
- package/dist/mcp/tools/export-graph.js.map +1 -0
- package/dist/mcp/tools/import-prd.d.ts +4 -0
- package/dist/mcp/tools/import-prd.d.ts.map +1 -0
- package/dist/mcp/tools/import-prd.js +72 -0
- package/dist/mcp/tools/import-prd.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +4 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +53 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/init.d.ts +4 -0
- package/dist/mcp/tools/init.d.ts.map +1 -0
- package/dist/mcp/tools/init.js +15 -0
- package/dist/mcp/tools/init.js.map +1 -0
- package/dist/mcp/tools/list-edges.d.ts +4 -0
- package/dist/mcp/tools/list-edges.d.ts.map +1 -0
- package/dist/mcp/tools/list-edges.js +49 -0
- package/dist/mcp/tools/list-edges.js.map +1 -0
- package/dist/mcp/tools/list.d.ts +4 -0
- package/dist/mcp/tools/list.d.ts.map +1 -0
- package/dist/mcp/tools/list.js +53 -0
- package/dist/mcp/tools/list.js.map +1 -0
- package/dist/mcp/tools/move-node.d.ts +4 -0
- package/dist/mcp/tools/move-node.d.ts.map +1 -0
- package/dist/mcp/tools/move-node.js +107 -0
- package/dist/mcp/tools/move-node.js.map +1 -0
- package/dist/mcp/tools/next.d.ts +4 -0
- package/dist/mcp/tools/next.d.ts.map +1 -0
- package/dist/mcp/tools/next.js +28 -0
- package/dist/mcp/tools/next.js.map +1 -0
- package/dist/mcp/tools/rag-context.d.ts +4 -0
- package/dist/mcp/tools/rag-context.d.ts.map +1 -0
- package/dist/mcp/tools/rag-context.js +25 -0
- package/dist/mcp/tools/rag-context.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +4 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +38 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/show.d.ts +4 -0
- package/dist/mcp/tools/show.d.ts.map +1 -0
- package/dist/mcp/tools/show.js +38 -0
- package/dist/mcp/tools/show.js.map +1 -0
- package/dist/mcp/tools/snapshot.d.ts +6 -0
- package/dist/mcp/tools/snapshot.d.ts.map +1 -0
- package/dist/mcp/tools/snapshot.js +43 -0
- package/dist/mcp/tools/snapshot.js.map +1 -0
- package/dist/mcp/tools/stats.d.ts +4 -0
- package/dist/mcp/tools/stats.d.ts.map +1 -0
- package/dist/mcp/tools/stats.js +43 -0
- package/dist/mcp/tools/stats.js.map +1 -0
- package/dist/mcp/tools/update-node.d.ts +4 -0
- package/dist/mcp/tools/update-node.d.ts.map +1 -0
- package/dist/mcp/tools/update-node.js +41 -0
- package/dist/mcp/tools/update-node.js.map +1 -0
- package/dist/mcp/tools/update-status.d.ts +4 -0
- package/dist/mcp/tools/update-status.d.ts.map +1 -0
- package/dist/mcp/tools/update-status.js +29 -0
- package/dist/mcp/tools/update-status.js.map +1 -0
- package/dist/mcp/tools/velocity.d.ts +4 -0
- package/dist/mcp/tools/velocity.d.ts.map +1 -0
- package/dist/mcp/tools/velocity.js +22 -0
- package/dist/mcp/tools/velocity.js.map +1 -0
- package/dist/schemas/edge.schema.d.ts +31 -0
- package/dist/schemas/edge.schema.d.ts.map +1 -0
- package/dist/schemas/edge.schema.js +16 -0
- package/dist/schemas/edge.schema.js.map +1 -0
- package/dist/schemas/graph.schema.d.ts +102 -0
- package/dist/schemas/graph.schema.d.ts.map +1 -0
- package/dist/schemas/graph.schema.js +28 -0
- package/dist/schemas/graph.schema.js.map +1 -0
- package/dist/schemas/node.schema.d.ts +80 -0
- package/dist/schemas/node.schema.d.ts.map +1 -0
- package/dist/schemas/node.schema.js +38 -0
- package/dist/schemas/node.schema.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { SqliteStore } from "../store/sqlite-store.js";
|
|
2
|
+
export interface TaskContext {
|
|
3
|
+
task: TaskSummary;
|
|
4
|
+
parent: TaskSummary | null;
|
|
5
|
+
children: TaskSummary[];
|
|
6
|
+
blockers: BlockerInfo[];
|
|
7
|
+
dependsOn: DependencyInfo[];
|
|
8
|
+
acceptanceCriteria: string[];
|
|
9
|
+
sourceRef: SourceRefInfo | null;
|
|
10
|
+
metrics: ContextMetrics;
|
|
11
|
+
}
|
|
12
|
+
interface TaskSummary {
|
|
13
|
+
id: string;
|
|
14
|
+
type: string;
|
|
15
|
+
title: string;
|
|
16
|
+
status: string;
|
|
17
|
+
priority: number;
|
|
18
|
+
description?: string;
|
|
19
|
+
sprint?: string | null;
|
|
20
|
+
xpSize?: string;
|
|
21
|
+
tags?: string[];
|
|
22
|
+
}
|
|
23
|
+
interface BlockerInfo {
|
|
24
|
+
id: string;
|
|
25
|
+
title: string;
|
|
26
|
+
status: string;
|
|
27
|
+
relationType: string;
|
|
28
|
+
inferred: boolean;
|
|
29
|
+
}
|
|
30
|
+
interface DependencyInfo {
|
|
31
|
+
id: string;
|
|
32
|
+
title: string;
|
|
33
|
+
status: string;
|
|
34
|
+
resolved: boolean;
|
|
35
|
+
inferred: boolean;
|
|
36
|
+
}
|
|
37
|
+
interface SourceRefInfo {
|
|
38
|
+
file: string;
|
|
39
|
+
startLine?: number;
|
|
40
|
+
endLine?: number;
|
|
41
|
+
confidence?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface ContextMetrics {
|
|
44
|
+
originalChars: number;
|
|
45
|
+
compactChars: number;
|
|
46
|
+
reductionPercent: number;
|
|
47
|
+
estimatedTokens: number;
|
|
48
|
+
}
|
|
49
|
+
export declare function buildTaskContext(store: SqliteStore, nodeId: string): TaskContext | null;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=compact-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compact-context.d.ts","sourceRoot":"","sources":["../../../src/core/context/compact-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAO5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAyBD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,WAAW,GAAG,IAAI,CA2GpB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { estimateTokens } from "./token-estimator.js";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
// ── Helpers ──────────────────────────────────────────────
|
|
4
|
+
function toTaskSummary(node) {
|
|
5
|
+
const summary = {
|
|
6
|
+
id: node.id,
|
|
7
|
+
type: node.type,
|
|
8
|
+
title: node.title,
|
|
9
|
+
status: node.status,
|
|
10
|
+
priority: node.priority,
|
|
11
|
+
};
|
|
12
|
+
if (node.description)
|
|
13
|
+
summary.description = node.description;
|
|
14
|
+
if (node.sprint)
|
|
15
|
+
summary.sprint = node.sprint;
|
|
16
|
+
if (node.xpSize)
|
|
17
|
+
summary.xpSize = node.xpSize;
|
|
18
|
+
if (node.tags?.length)
|
|
19
|
+
summary.tags = node.tags;
|
|
20
|
+
return summary;
|
|
21
|
+
}
|
|
22
|
+
function isInferred(edge) {
|
|
23
|
+
return edge.metadata?.inferred === true;
|
|
24
|
+
}
|
|
25
|
+
// ── Main function ────────────────────────────────────────
|
|
26
|
+
export function buildTaskContext(store, nodeId) {
|
|
27
|
+
const node = store.getNodeById(nodeId);
|
|
28
|
+
if (!node) {
|
|
29
|
+
logger.warn(`buildTaskContext: node ${nodeId} not found`);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// Parent
|
|
33
|
+
let parent = null;
|
|
34
|
+
if (node.parentId) {
|
|
35
|
+
const parentNode = store.getNodeById(node.parentId);
|
|
36
|
+
if (parentNode)
|
|
37
|
+
parent = toTaskSummary(parentNode);
|
|
38
|
+
}
|
|
39
|
+
// Children
|
|
40
|
+
const childNodes = store.getChildNodes(nodeId);
|
|
41
|
+
const children = childNodes.map(toTaskSummary);
|
|
42
|
+
// Incoming edges → blockers and dependencies
|
|
43
|
+
const incomingEdges = store.getEdgesTo(nodeId);
|
|
44
|
+
const outgoingEdges = store.getEdgesFrom(nodeId);
|
|
45
|
+
const blockers = [];
|
|
46
|
+
const dependsOn = [];
|
|
47
|
+
// Edges where something blocks this node: edge.relationType === "blocks" AND edge.to === nodeId
|
|
48
|
+
for (const edge of incomingEdges) {
|
|
49
|
+
if (edge.relationType === "blocks") {
|
|
50
|
+
const blockerNode = store.getNodeById(edge.from);
|
|
51
|
+
if (blockerNode) {
|
|
52
|
+
blockers.push({
|
|
53
|
+
id: blockerNode.id,
|
|
54
|
+
title: blockerNode.title,
|
|
55
|
+
status: blockerNode.status,
|
|
56
|
+
relationType: edge.relationType,
|
|
57
|
+
inferred: isInferred(edge),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Edges where this node depends_on something: edge.relationType === "depends_on" AND edge.from === nodeId
|
|
63
|
+
for (const edge of outgoingEdges) {
|
|
64
|
+
if (edge.relationType === "depends_on") {
|
|
65
|
+
const depNode = store.getNodeById(edge.to);
|
|
66
|
+
if (depNode) {
|
|
67
|
+
dependsOn.push({
|
|
68
|
+
id: depNode.id,
|
|
69
|
+
title: depNode.title,
|
|
70
|
+
status: depNode.status,
|
|
71
|
+
resolved: depNode.status === "done",
|
|
72
|
+
inferred: isInferred(edge),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Acceptance criteria
|
|
78
|
+
const acceptanceCriteria = node.acceptanceCriteria ?? [];
|
|
79
|
+
// Source reference
|
|
80
|
+
const sourceRef = node.sourceRef
|
|
81
|
+
? { ...node.sourceRef }
|
|
82
|
+
: null;
|
|
83
|
+
// Metrics: estimate original size from full PRD-related content
|
|
84
|
+
const allNodes = store.getAllNodes();
|
|
85
|
+
const allEdges = store.getAllEdges();
|
|
86
|
+
const originalChars = allNodes.reduce((sum, n) => sum +
|
|
87
|
+
n.title.length +
|
|
88
|
+
(n.description?.length ?? 0) +
|
|
89
|
+
(n.acceptanceCriteria?.join("").length ?? 0), 0) +
|
|
90
|
+
allEdges.reduce((sum, e) => sum + (e.reason?.length ?? 0), 0);
|
|
91
|
+
const contextPayload = {
|
|
92
|
+
task: toTaskSummary(node),
|
|
93
|
+
parent,
|
|
94
|
+
children,
|
|
95
|
+
blockers,
|
|
96
|
+
dependsOn,
|
|
97
|
+
acceptanceCriteria,
|
|
98
|
+
sourceRef,
|
|
99
|
+
metrics: { originalChars: 0, compactChars: 0, reductionPercent: 0, estimatedTokens: 0 },
|
|
100
|
+
};
|
|
101
|
+
const compactJson = JSON.stringify(contextPayload);
|
|
102
|
+
const compactChars = compactJson.length;
|
|
103
|
+
const reductionPercent = originalChars > 0
|
|
104
|
+
? Math.round(((originalChars - compactChars) / originalChars) * 100)
|
|
105
|
+
: 0;
|
|
106
|
+
contextPayload.metrics = {
|
|
107
|
+
originalChars,
|
|
108
|
+
compactChars,
|
|
109
|
+
reductionPercent: Math.max(0, reductionPercent),
|
|
110
|
+
estimatedTokens: estimateTokens(compactJson),
|
|
111
|
+
};
|
|
112
|
+
logger.info(`Context for ${nodeId}: ${contextPayload.metrics.estimatedTokens} tokens, ${contextPayload.metrics.reductionPercent}% reduction`);
|
|
113
|
+
return contextPayload;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=compact-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compact-context.js","sourceRoot":"","sources":["../../../src/core/context/compact-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG Context Builder — builds a compact context from search results
|
|
3
|
+
* suitable for LLM consumption with token budget management.
|
|
4
|
+
*/
|
|
5
|
+
import type { SqliteStore } from "../store/sqlite-store.js";
|
|
6
|
+
import { type TaskContext } from "./compact-context.js";
|
|
7
|
+
export interface RagContext {
|
|
8
|
+
query: string;
|
|
9
|
+
relevantNodes: RagNodeSummary[];
|
|
10
|
+
expandedContexts: TaskContext[];
|
|
11
|
+
tokenUsage: {
|
|
12
|
+
budget: number;
|
|
13
|
+
used: number;
|
|
14
|
+
remaining: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
interface RagNodeSummary {
|
|
18
|
+
id: string;
|
|
19
|
+
type: string;
|
|
20
|
+
title: string;
|
|
21
|
+
status: string;
|
|
22
|
+
priority: number;
|
|
23
|
+
description?: string;
|
|
24
|
+
tags?: string[];
|
|
25
|
+
score: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build a RAG context from a natural language query.
|
|
29
|
+
*
|
|
30
|
+
* 1. Search for relevant nodes via FTS5
|
|
31
|
+
* 2. Expand subgraph context for top results via buildTaskContext
|
|
32
|
+
* 3. Manage token budget to stay within limits
|
|
33
|
+
*/
|
|
34
|
+
export declare function ragBuildContext(store: SqliteStore, query: string, tokenBudget?: number): RagContext;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=rag-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-context.d.ts","sourceRoot":"","sources":["../../../src/core/context/rag-context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAI1E,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAAa,GACzB,UAAU,CAyDZ"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG Context Builder — builds a compact context from search results
|
|
3
|
+
* suitable for LLM consumption with token budget management.
|
|
4
|
+
*/
|
|
5
|
+
import { searchNodes } from "../search/fts-search.js";
|
|
6
|
+
import { buildTaskContext } from "./compact-context.js";
|
|
7
|
+
import { estimateTokens } from "./token-estimator.js";
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
|
+
/**
|
|
10
|
+
* Build a RAG context from a natural language query.
|
|
11
|
+
*
|
|
12
|
+
* 1. Search for relevant nodes via FTS5
|
|
13
|
+
* 2. Expand subgraph context for top results via buildTaskContext
|
|
14
|
+
* 3. Manage token budget to stay within limits
|
|
15
|
+
*/
|
|
16
|
+
export function ragBuildContext(store, query, tokenBudget = 4000) {
|
|
17
|
+
logger.info(`RAG context: query="${query}", budget=${tokenBudget} tokens`);
|
|
18
|
+
// Stage 1: Search for relevant nodes with TF-IDF reranking
|
|
19
|
+
const searchResults = searchNodes(store, query, { limit: 10, rerank: true });
|
|
20
|
+
const relevantNodes = searchResults.map((r) => {
|
|
21
|
+
const summary = {
|
|
22
|
+
id: r.node.id,
|
|
23
|
+
type: r.node.type,
|
|
24
|
+
title: r.node.title,
|
|
25
|
+
status: r.node.status,
|
|
26
|
+
priority: r.node.priority,
|
|
27
|
+
score: Math.round(r.score * 1000) / 1000,
|
|
28
|
+
};
|
|
29
|
+
if (r.node.description)
|
|
30
|
+
summary.description = r.node.description;
|
|
31
|
+
if (r.node.tags?.length)
|
|
32
|
+
summary.tags = r.node.tags;
|
|
33
|
+
return summary;
|
|
34
|
+
});
|
|
35
|
+
// Stage 2: Expand context for top results within budget
|
|
36
|
+
const expandedContexts = [];
|
|
37
|
+
let tokensUsed = estimateTokens(JSON.stringify({ query, relevantNodes }));
|
|
38
|
+
for (const result of searchResults) {
|
|
39
|
+
if (tokensUsed >= tokenBudget)
|
|
40
|
+
break;
|
|
41
|
+
const ctx = buildTaskContext(store, result.node.id);
|
|
42
|
+
if (!ctx)
|
|
43
|
+
continue;
|
|
44
|
+
const ctxTokens = ctx.metrics.estimatedTokens;
|
|
45
|
+
if (tokensUsed + ctxTokens > tokenBudget) {
|
|
46
|
+
// Check if we have room for at least one more context
|
|
47
|
+
if (expandedContexts.length === 0) {
|
|
48
|
+
// Always include at least one context even if over budget
|
|
49
|
+
expandedContexts.push(ctx);
|
|
50
|
+
tokensUsed += ctxTokens;
|
|
51
|
+
}
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
expandedContexts.push(ctx);
|
|
55
|
+
tokensUsed += ctxTokens;
|
|
56
|
+
}
|
|
57
|
+
logger.info(`RAG context built: ${relevantNodes.length} nodes, ${expandedContexts.length} expanded, ${tokensUsed}/${tokenBudget} tokens`);
|
|
58
|
+
return {
|
|
59
|
+
query,
|
|
60
|
+
relevantNodes,
|
|
61
|
+
expandedContexts,
|
|
62
|
+
tokenUsage: {
|
|
63
|
+
budget: tokenBudget,
|
|
64
|
+
used: tokensUsed,
|
|
65
|
+
remaining: Math.max(0, tokenBudget - tokensUsed),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=rag-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-context.js","sourceRoot":"","sources":["../../../src/core/context/rag-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight token estimation using the ~4 chars/token heuristic.
|
|
3
|
+
* This matches the industry-standard approximation used by OpenAI/Anthropic tokenizers
|
|
4
|
+
* for English text. Good enough for budget estimation without a full tokenizer dependency.
|
|
5
|
+
*/
|
|
6
|
+
export declare function estimateTokens(text: string): number;
|
|
7
|
+
//# sourceMappingURL=token-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../../src/core/context/token-estimator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight token estimation using the ~4 chars/token heuristic.
|
|
3
|
+
* This matches the industry-standard approximation used by OpenAI/Anthropic tokenizers
|
|
4
|
+
* for English text. Good enough for budget estimation without a full tokenizer dependency.
|
|
5
|
+
*/
|
|
6
|
+
export function estimateTokens(text) {
|
|
7
|
+
return Math.ceil(text.length / 4);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=token-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../../src/core/context/token-estimator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-indexes.d.ts","sourceRoot":"","sources":["../../../src/core/graph/graph-indexes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CA+BjF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function buildIndexes(nodes, edges) {
|
|
2
|
+
const byId = {};
|
|
3
|
+
const childrenByParent = {};
|
|
4
|
+
const incomingByNode = {};
|
|
5
|
+
const outgoingByNode = {};
|
|
6
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
7
|
+
const node = nodes[i];
|
|
8
|
+
byId[node.id] = i;
|
|
9
|
+
if (node.parentId) {
|
|
10
|
+
if (!childrenByParent[node.parentId]) {
|
|
11
|
+
childrenByParent[node.parentId] = [];
|
|
12
|
+
}
|
|
13
|
+
childrenByParent[node.parentId].push(node.id);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
for (const edge of edges) {
|
|
17
|
+
if (!outgoingByNode[edge.from]) {
|
|
18
|
+
outgoingByNode[edge.from] = [];
|
|
19
|
+
}
|
|
20
|
+
outgoingByNode[edge.from].push(edge.id);
|
|
21
|
+
if (!incomingByNode[edge.to]) {
|
|
22
|
+
incomingByNode[edge.to] = [];
|
|
23
|
+
}
|
|
24
|
+
incomingByNode[edge.to].push(edge.id);
|
|
25
|
+
}
|
|
26
|
+
return { byId, childrenByParent, incomingByNode, outgoingByNode };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=graph-indexes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-indexes.js","sourceRoot":"","sources":["../../../src/core/graph/graph-indexes.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,KAAkB,EAAE,KAAkB;IACjE,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,MAAM,gBAAgB,GAA6B,EAAE,CAAC;IACtD,MAAM,cAAc,GAA6B,EAAE,CAAC;IACpD,MAAM,cAAc,GAA6B,EAAE,CAAC;IAEpD,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,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACvC,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QAC/B,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export type NodeType = "epic" | "task" | "subtask" | "requirement" | "constraint" | "milestone" | "acceptance_criteria" | "risk" | "decision";
|
|
2
|
+
export type NodeStatus = "backlog" | "ready" | "in_progress" | "blocked" | "done";
|
|
3
|
+
export type XpSize = "XS" | "S" | "M" | "L" | "XL";
|
|
4
|
+
export type RelationType = "parent_of" | "child_of" | "depends_on" | "blocks" | "related_to" | "priority_over" | "implements" | "derived_from";
|
|
5
|
+
export interface SourceRef {
|
|
6
|
+
file: string;
|
|
7
|
+
startLine?: number;
|
|
8
|
+
endLine?: number;
|
|
9
|
+
confidence?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface GraphNode {
|
|
12
|
+
id: string;
|
|
13
|
+
type: NodeType;
|
|
14
|
+
title: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
status: NodeStatus;
|
|
17
|
+
priority: 1 | 2 | 3 | 4 | 5;
|
|
18
|
+
xpSize?: XpSize;
|
|
19
|
+
estimateMinutes?: number;
|
|
20
|
+
tags?: string[];
|
|
21
|
+
parentId?: string | null;
|
|
22
|
+
sprint?: string | null;
|
|
23
|
+
sourceRef?: SourceRef;
|
|
24
|
+
acceptanceCriteria?: string[];
|
|
25
|
+
blocked?: boolean;
|
|
26
|
+
metadata?: {
|
|
27
|
+
inferred?: boolean;
|
|
28
|
+
origin?: string;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
};
|
|
31
|
+
createdAt: string;
|
|
32
|
+
updatedAt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface GraphEdge {
|
|
35
|
+
id: string;
|
|
36
|
+
from: string;
|
|
37
|
+
to: string;
|
|
38
|
+
relationType: RelationType;
|
|
39
|
+
weight?: number;
|
|
40
|
+
reason?: string;
|
|
41
|
+
metadata?: {
|
|
42
|
+
inferred?: boolean;
|
|
43
|
+
confidence?: number;
|
|
44
|
+
[key: string]: unknown;
|
|
45
|
+
};
|
|
46
|
+
createdAt: string;
|
|
47
|
+
}
|
|
48
|
+
export interface GraphIndexes {
|
|
49
|
+
byId: Record<string, number>;
|
|
50
|
+
childrenByParent: Record<string, string[]>;
|
|
51
|
+
incomingByNode: Record<string, string[]>;
|
|
52
|
+
outgoingByNode: Record<string, string[]>;
|
|
53
|
+
}
|
|
54
|
+
export interface GraphProject {
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
createdAt: string;
|
|
58
|
+
updatedAt: string;
|
|
59
|
+
}
|
|
60
|
+
export interface GraphMeta {
|
|
61
|
+
sourceFiles: string[];
|
|
62
|
+
lastImport: string | null;
|
|
63
|
+
}
|
|
64
|
+
export interface GraphDocument {
|
|
65
|
+
version: string;
|
|
66
|
+
project: GraphProject;
|
|
67
|
+
nodes: GraphNode[];
|
|
68
|
+
edges: GraphEdge[];
|
|
69
|
+
indexes: GraphIndexes;
|
|
70
|
+
meta: GraphMeta;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=graph-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-types.d.ts","sourceRoot":"","sources":["../../../src/core/graph/graph-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-types.js","sourceRoot":"","sources":["../../../src/core/graph/graph-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated This module was used by the CLI. The MCP tools now handle
|
|
3
|
+
* import directly via SqliteStore + the parser pipeline.
|
|
4
|
+
* Kept as reference — do not use in new code.
|
|
5
|
+
*/
|
|
6
|
+
export { convertToGraph } from "./prd-to-graph.js";
|
|
7
|
+
//# sourceMappingURL=import-prd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-prd.d.ts","sourceRoot":"","sources":["../../../src/core/importer/import-prd.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated This module was used by the CLI. The MCP tools now handle
|
|
3
|
+
* import directly via SqliteStore + the parser pipeline.
|
|
4
|
+
* Kept as reference — do not use in new code.
|
|
5
|
+
*/
|
|
6
|
+
export { convertToGraph } from "./prd-to-graph.js";
|
|
7
|
+
//# sourceMappingURL=import-prd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-prd.js","sourceRoot":"","sources":["../../../src/core/importer/import-prd.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts parser extraction results into graph nodes and edges.
|
|
3
|
+
*/
|
|
4
|
+
import type { GraphNode, GraphEdge } from "../graph/graph-types.js";
|
|
5
|
+
import type { ExtractionResult } from "../parser/extract.js";
|
|
6
|
+
interface ConversionResult {
|
|
7
|
+
nodes: GraphNode[];
|
|
8
|
+
edges: GraphEdge[];
|
|
9
|
+
stats: {
|
|
10
|
+
nodesCreated: number;
|
|
11
|
+
edgesCreated: number;
|
|
12
|
+
blockedTasks: number;
|
|
13
|
+
inferredDeps: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function convertToGraph(extraction: ExtractionResult, sourceFile: string): ConversionResult;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=prd-to-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd-to-graph.d.ts","sourceRoot":"","sources":["../../../src/core/importer/prd-to-graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAwB,MAAM,yBAAyB,CAAC;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,UAAU,gBAAgB;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AA4HD,wBAAgB,cAAc,CAC5B,UAAU,EAAE,gBAAgB,EAC5B,UAAU,EAAE,MAAM,GACjB,gBAAgB,CAqGlB"}
|