codestrate 0.6.1 → 0.6.3
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/README.md +97 -101
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +54 -4
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +198 -119
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +0 -0
- package/dist/install.d.ts.map +0 -0
- package/dist/install.js +2 -2
- package/dist/install.js.map +1 -1
- package/dist/profiles.d.ts +28 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +89 -0
- package/dist/profiles.js.map +1 -0
- package/dist/schemas/index.d.ts +1441 -126
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +221 -10
- package/dist/schemas/index.js.map +1 -1
- package/dist/security/guard.d.ts +15 -2
- package/dist/security/guard.d.ts.map +1 -1
- package/dist/security/guard.js +42 -8
- package/dist/security/guard.js.map +1 -1
- package/dist/services/code-chunker.d.ts +50 -0
- package/dist/services/code-chunker.d.ts.map +1 -0
- package/dist/services/code-chunker.js +148 -0
- package/dist/services/code-chunker.js.map +1 -0
- package/dist/services/code-searcher.d.ts +6 -2
- package/dist/services/code-searcher.d.ts.map +1 -1
- package/dist/services/code-searcher.js +111 -17
- package/dist/services/code-searcher.js.map +1 -1
- package/dist/services/context-builder.d.ts +0 -11
- package/dist/services/context-builder.d.ts.map +1 -1
- package/dist/services/context-builder.js +74 -128
- package/dist/services/context-builder.js.map +1 -1
- package/dist/services/embedding-runtime.d.ts +41 -0
- package/dist/services/embedding-runtime.d.ts.map +1 -0
- package/dist/services/embedding-runtime.js +636 -0
- package/dist/services/embedding-runtime.js.map +1 -0
- package/dist/services/embedding.d.ts +79 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +257 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/index-state.d.ts +74 -0
- package/dist/services/index-state.d.ts.map +1 -0
- package/dist/services/index-state.js +151 -0
- package/dist/services/index-state.js.map +1 -0
- package/dist/services/index-worker.d.ts +60 -0
- package/dist/services/index-worker.d.ts.map +1 -0
- package/dist/services/index-worker.js +182 -0
- package/dist/services/index-worker.js.map +1 -0
- package/dist/services/logger.d.ts +48 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +106 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/memory-store.d.ts +9 -7
- package/dist/services/memory-store.d.ts.map +1 -1
- package/dist/services/memory-store.js +93 -7
- package/dist/services/memory-store.js.map +1 -1
- package/dist/services/repository-parser.d.ts +0 -0
- package/dist/services/repository-parser.d.ts.map +0 -0
- package/dist/services/repository-parser.js +0 -0
- package/dist/services/repository-parser.js.map +0 -0
- package/dist/services/symbol-indexer.d.ts +0 -0
- package/dist/services/symbol-indexer.d.ts.map +1 -1
- package/dist/services/symbol-indexer.js +25 -13
- package/dist/services/symbol-indexer.js.map +1 -1
- package/dist/services/tree-sitter.d.ts +0 -0
- package/dist/services/tree-sitter.d.ts.map +0 -0
- package/dist/services/tree-sitter.js +0 -0
- package/dist/services/tree-sitter.js.map +0 -0
- package/dist/services/validation-runner.d.ts +0 -0
- package/dist/services/validation-runner.d.ts.map +1 -1
- package/dist/services/validation-runner.js +9 -9
- package/dist/services/validation-runner.js.map +1 -1
- package/dist/services/vector-indexer.d.ts +53 -0
- package/dist/services/vector-indexer.d.ts.map +1 -0
- package/dist/services/vector-indexer.js +230 -0
- package/dist/services/vector-indexer.js.map +1 -0
- package/dist/store/index.d.ts +0 -0
- package/dist/store/index.d.ts.map +0 -0
- package/dist/store/index.js +0 -0
- package/dist/store/index.js.map +0 -0
- package/dist/store/interface.d.ts +70 -1
- package/dist/store/interface.d.ts.map +1 -1
- package/dist/store/interface.js +0 -0
- package/dist/store/interface.js.map +0 -0
- package/dist/store/memory.d.ts +0 -0
- package/dist/store/memory.d.ts.map +0 -0
- package/dist/store/memory.js +0 -0
- package/dist/store/memory.js.map +0 -0
- package/dist/store/service.d.ts +49 -0
- package/dist/store/service.d.ts.map +1 -0
- package/dist/store/service.js +147 -0
- package/dist/store/service.js.map +1 -0
- package/dist/store/sqlite.d.ts +68 -3
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +708 -58
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/vector-store.d.ts +66 -0
- package/dist/store/vector-store.d.ts.map +1 -0
- package/dist/store/vector-store.js +330 -0
- package/dist/store/vector-store.js.map +1 -0
- package/dist/tools/analyze-impact.d.ts +0 -0
- package/dist/tools/analyze-impact.d.ts.map +1 -1
- package/dist/tools/analyze-impact.js +101 -39
- package/dist/tools/analyze-impact.js.map +1 -1
- package/dist/tools/deep-explore.d.ts +0 -0
- package/dist/tools/deep-explore.d.ts.map +1 -1
- package/dist/tools/deep-explore.js +18 -4
- package/dist/tools/deep-explore.js.map +1 -1
- package/dist/tools/detect-cycles.d.ts +3 -0
- package/dist/tools/detect-cycles.d.ts.map +1 -0
- package/dist/tools/detect-cycles.js +61 -0
- package/dist/tools/detect-cycles.js.map +1 -0
- package/dist/tools/detect-dead-code.d.ts +0 -0
- package/dist/tools/detect-dead-code.d.ts.map +1 -1
- package/dist/tools/detect-dead-code.js +1 -0
- package/dist/tools/detect-dead-code.js.map +1 -1
- package/dist/tools/explore.d.ts +13 -0
- package/dist/tools/explore.d.ts.map +1 -1
- package/dist/tools/explore.js +122 -88
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/get-context.d.ts +15 -0
- package/dist/tools/get-context.d.ts.map +1 -1
- package/dist/tools/get-context.js +66 -61
- package/dist/tools/get-context.js.map +1 -1
- package/dist/tools/graph-explain.d.ts +3 -0
- package/dist/tools/graph-explain.d.ts.map +1 -0
- package/dist/tools/graph-explain.js +140 -0
- package/dist/tools/graph-explain.js.map +1 -0
- package/dist/tools/graph-stats.d.ts +3 -0
- package/dist/tools/graph-stats.d.ts.map +1 -0
- package/dist/tools/graph-stats.js +73 -0
- package/dist/tools/graph-stats.js.map +1 -0
- package/dist/tools/inspect-symbol.d.ts +10 -0
- package/dist/tools/inspect-symbol.d.ts.map +1 -1
- package/dist/tools/inspect-symbol.js +112 -101
- package/dist/tools/inspect-symbol.js.map +1 -1
- package/dist/tools/ping.d.ts +0 -0
- package/dist/tools/ping.d.ts.map +1 -1
- package/dist/tools/ping.js +2 -3
- package/dist/tools/ping.js.map +1 -1
- package/dist/tools/profile.d.ts +9 -0
- package/dist/tools/profile.d.ts.map +1 -0
- package/dist/tools/profile.js +101 -0
- package/dist/tools/profile.js.map +1 -0
- package/dist/tools/query-graph.d.ts +3 -0
- package/dist/tools/query-graph.d.ts.map +1 -0
- package/dist/tools/query-graph.js +157 -0
- package/dist/tools/query-graph.js.map +1 -0
- package/dist/tools/recall-experience.d.ts +0 -0
- package/dist/tools/recall-experience.d.ts.map +1 -1
- package/dist/tools/recall-experience.js +5 -5
- package/dist/tools/recall-experience.js.map +1 -1
- package/dist/tools/record-experience.d.ts +0 -0
- package/dist/tools/record-experience.d.ts.map +1 -1
- package/dist/tools/record-experience.js +2 -5
- package/dist/tools/record-experience.js.map +1 -1
- package/dist/tools/reflect.d.ts +4 -0
- package/dist/tools/reflect.d.ts.map +1 -0
- package/dist/tools/reflect.js +99 -0
- package/dist/tools/reflect.js.map +1 -0
- package/dist/tools/register.d.ts +5 -2
- package/dist/tools/register.d.ts.map +1 -1
- package/dist/tools/register.js +31 -1
- package/dist/tools/register.js.map +1 -1
- package/dist/tools/reindex.d.ts +0 -0
- package/dist/tools/reindex.d.ts.map +1 -1
- package/dist/tools/reindex.js +102 -21
- package/dist/tools/reindex.js.map +1 -1
- package/dist/tools/repo-overview.d.ts +0 -0
- package/dist/tools/repo-overview.d.ts.map +1 -1
- package/dist/tools/repo-overview.js +8 -6
- package/dist/tools/repo-overview.js.map +1 -1
- package/dist/tools/run-validation.d.ts +0 -0
- package/dist/tools/run-validation.d.ts.map +1 -1
- package/dist/tools/run-validation.js +15 -1
- package/dist/tools/run-validation.js.map +1 -1
- package/dist/tools/search-code.d.ts +0 -0
- package/dist/tools/search-code.d.ts.map +1 -1
- package/dist/tools/search-code.js +11 -4
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/search-history.d.ts +0 -0
- package/dist/tools/search-history.d.ts.map +0 -0
- package/dist/tools/search-history.js +0 -0
- package/dist/tools/search-history.js.map +0 -0
- package/dist/tools/session-heartbeat.d.ts +0 -0
- package/dist/tools/session-heartbeat.d.ts.map +1 -1
- package/dist/tools/session-heartbeat.js +1 -0
- package/dist/tools/session-heartbeat.js.map +1 -1
- package/dist/tools/session-status.d.ts +0 -0
- package/dist/tools/session-status.d.ts.map +1 -1
- package/dist/tools/session-status.js +1 -0
- package/dist/tools/session-status.js.map +1 -1
- package/dist/tools/status.d.ts +0 -0
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +87 -24
- package/dist/tools/status.js.map +1 -1
- package/dist/tools/trace-bfs.d.ts +13 -0
- package/dist/tools/trace-bfs.d.ts.map +1 -0
- package/dist/tools/trace-bfs.js +251 -0
- package/dist/tools/trace-bfs.js.map +1 -0
- package/dist/tools/trace-flow.d.ts +1 -1
- package/dist/tools/trace-flow.d.ts.map +1 -1
- package/dist/tools/trace-flow.js +113 -69
- package/dist/tools/trace-flow.js.map +1 -1
- package/dist/types.d.ts +75 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -1
- package/grammars/tree-sitter-c.wasm +0 -0
- package/grammars/tree-sitter-cpp.wasm +0 -0
- package/grammars/tree-sitter-go.wasm +0 -0
- package/grammars/tree-sitter-java.wasm +0 -0
- package/grammars/tree-sitter-javascript.wasm +0 -0
- package/grammars/tree-sitter-python.wasm +0 -0
- package/grammars/tree-sitter-rust.wasm +0 -0
- package/grammars/tree-sitter-tsx.wasm +0 -0
- package/grammars/tree-sitter-typescript.wasm +0 -0
- package/package.json +8 -6
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { registerCiTool } from "./register.js";
|
|
2
|
+
import { QueryGraphSchema, QueryGraphOutputSchema } from "../schemas/index.js";
|
|
3
|
+
import { getStore } from "../store/sqlite.js";
|
|
4
|
+
import { asStructured } from "../types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Simple term-extraction from a natural language question.
|
|
7
|
+
* Splits on whitespace, lowercases, drops stop words and short tokens.
|
|
8
|
+
*/
|
|
9
|
+
function extractTerms(question) {
|
|
10
|
+
const stopWords = new Set([
|
|
11
|
+
"the", "a", "an", "in", "of", "to", "for", "on", "and", "or",
|
|
12
|
+
"is", "are", "was", "were", "be", "been", "being", "has", "have", "had",
|
|
13
|
+
"how", "what", "why", "when", "where", "which", "who", "whom",
|
|
14
|
+
"does", "did", "can", "could", "would", "should", "will", "shall",
|
|
15
|
+
"this", "that", "these", "those", "it", "its", "they", "them",
|
|
16
|
+
"with", "without", "from", "about", "all", "any", "some", "not",
|
|
17
|
+
"connect", "connects", "connection", "show", "find", "tell", "give",
|
|
18
|
+
"list", "get", "do", "does", "did", "doing", "work", "works", "working",
|
|
19
|
+
]);
|
|
20
|
+
return question
|
|
21
|
+
.toLowerCase()
|
|
22
|
+
.split(/[^a-zA-Z0-9_]+/)
|
|
23
|
+
.filter(t => t.length > 2 && !stopWords.has(t));
|
|
24
|
+
}
|
|
25
|
+
export function registerQueryGraph(server) {
|
|
26
|
+
registerCiTool(server, "ci_query_graph", {
|
|
27
|
+
title: "Query Graph",
|
|
28
|
+
description: "Query the dependency graph using natural language. Extracts key terms, finds matching nodes, and returns a scoped subgraph with the relevant context.",
|
|
29
|
+
inputSchema: QueryGraphSchema,
|
|
30
|
+
outputSchema: QueryGraphOutputSchema,
|
|
31
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
32
|
+
}, async (params) => {
|
|
33
|
+
try {
|
|
34
|
+
const store = getStore();
|
|
35
|
+
// Extract search terms from the question
|
|
36
|
+
const terms = extractTerms(params.question);
|
|
37
|
+
if (terms.length === 0) {
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: "text", text: `Could not extract meaningful search terms from: "${params.question}"` }],
|
|
40
|
+
isError: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Search for matching nodes via FTS
|
|
44
|
+
const ftsQuery = terms.map(t => `"${t}"`).join(" OR ");
|
|
45
|
+
const matchedNodes = store.searchGraphNodesFTS(ftsQuery, params.maxResults);
|
|
46
|
+
// If no FTS matches, try LIKE fallback
|
|
47
|
+
let finalMatched = matchedNodes;
|
|
48
|
+
if (matchedNodes.length === 0) {
|
|
49
|
+
// Try camelCase segmented search
|
|
50
|
+
const camelTerms = terms.flatMap(t => {
|
|
51
|
+
// Split camelCase: "userAuth" -> ["user", "auth"]
|
|
52
|
+
const parts = t.split(/(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/);
|
|
53
|
+
return parts.length > 1 ? parts : [t];
|
|
54
|
+
});
|
|
55
|
+
const likeResults = new Map();
|
|
56
|
+
for (const term of [...new Set([...terms, ...camelTerms])]) {
|
|
57
|
+
const nodes = store.searchGraphNodes(term, 10);
|
|
58
|
+
for (const n of nodes) {
|
|
59
|
+
if (!likeResults.has(n.name)) {
|
|
60
|
+
likeResults.set(n.name, n);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
finalMatched = [...likeResults.values()].slice(0, params.maxResults);
|
|
65
|
+
}
|
|
66
|
+
// Run BFS from the top matching nodes for context
|
|
67
|
+
let subgraphNodes = [];
|
|
68
|
+
let subgraphEdges = [];
|
|
69
|
+
if (finalMatched.length > 0) {
|
|
70
|
+
const seenNodeIds = new Set();
|
|
71
|
+
const seenEdgeIds = new Set();
|
|
72
|
+
// Explore from the top 3 matched nodes
|
|
73
|
+
for (const match of finalMatched.slice(0, 3)) {
|
|
74
|
+
const result = store.traverseBFS(match.name, {
|
|
75
|
+
maxDepth: params.depth,
|
|
76
|
+
limit: params.maxResults,
|
|
77
|
+
});
|
|
78
|
+
for (const n of result.nodes) {
|
|
79
|
+
if (!seenNodeIds.has(n.id)) {
|
|
80
|
+
seenNodeIds.add(n.id);
|
|
81
|
+
subgraphNodes.push({
|
|
82
|
+
id: n.id, name: n.name, kind: n.kind, file: n.file,
|
|
83
|
+
line: n.line, column: n.column, signature: n.signature,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (const e of result.edges) {
|
|
88
|
+
if (!seenEdgeIds.has(e.id)) {
|
|
89
|
+
seenEdgeIds.add(e.id);
|
|
90
|
+
subgraphEdges.push({
|
|
91
|
+
id: e.id, sourceNodeId: e.sourceNodeId,
|
|
92
|
+
targetNodeId: e.targetNodeId, kind: e.kind,
|
|
93
|
+
confidence: e.confidence,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Build markdown output
|
|
100
|
+
const lines = [
|
|
101
|
+
`# Query Graph: "${params.question}"`,
|
|
102
|
+
``,
|
|
103
|
+
`**Search terms:** \`${terms.join("`, `")}\``,
|
|
104
|
+
`**Matched nodes:** ${finalMatched.length}`,
|
|
105
|
+
`**Subgraph:** ${subgraphNodes.length} nodes, ${subgraphEdges.length} edges`,
|
|
106
|
+
``,
|
|
107
|
+
];
|
|
108
|
+
if (finalMatched.length === 0) {
|
|
109
|
+
lines.push("_No matching symbols found. Try different terms or run ci_repo_overview / ci_reindex first._");
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
lines.push(`## Matched Symbols`, ``);
|
|
113
|
+
for (const n of finalMatched.slice(0, 15)) {
|
|
114
|
+
lines.push(`- **\`${n.name}\`** — ${n.kind} (\`${n.file}\`${n.line ? `:${n.line}` : ""})`);
|
|
115
|
+
}
|
|
116
|
+
if (subgraphNodes.length > 0) {
|
|
117
|
+
lines.push(``, `## Subgraph Context (${subgraphNodes.length} nodes)`, ``);
|
|
118
|
+
for (const n of subgraphNodes) {
|
|
119
|
+
const isMatch = finalMatched.some(m => m.id === n.id);
|
|
120
|
+
lines.push(`- ${isMatch ? "★" : " "} **\`${n.name}\`** — ${n.kind} (${n.file})`);
|
|
121
|
+
}
|
|
122
|
+
lines.push(``, `## Edges (${subgraphEdges.length})`, ``);
|
|
123
|
+
for (const e of subgraphEdges.slice(0, 20)) {
|
|
124
|
+
// Resolve names
|
|
125
|
+
const srcNode = subgraphNodes.find(n => n.id === e.sourceNodeId);
|
|
126
|
+
const tgtNode = subgraphNodes.find(n => n.id === e.targetNodeId);
|
|
127
|
+
if (srcNode && tgtNode) {
|
|
128
|
+
lines.push(`- \`${srcNode.name}\` —${e.kind}→ \`${tgtNode.name}\` [${e.confidence}]`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
135
|
+
structuredContent: asStructured({
|
|
136
|
+
question: params.question,
|
|
137
|
+
matchedNodes: finalMatched.map(n => ({
|
|
138
|
+
id: n.id, name: n.name, kind: n.kind, file: n.file,
|
|
139
|
+
line: n.line, column: n.column, signature: n.signature,
|
|
140
|
+
})),
|
|
141
|
+
subgraph: subgraphNodes.length > 0
|
|
142
|
+
? { nodes: subgraphNodes, edges: subgraphEdges }
|
|
143
|
+
: undefined,
|
|
144
|
+
totalNodes: finalMatched.length,
|
|
145
|
+
}),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
150
|
+
return {
|
|
151
|
+
content: [{ type: "text", text: `Query graph error: ${msg}` }],
|
|
152
|
+
isError: true,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=query-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-graph.js","sourceRoot":"","sources":["../../src/tools/query-graph.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall-experience.d.ts","sourceRoot":"","sources":["../../src/tools/recall-experience.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"recall-experience.d.ts","sourceRoot":"","sources":["../../src/tools/recall-experience.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuHhE"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { registerCiTool } from "./register.js";
|
|
2
2
|
import { RecallExperienceSchema, RecallExperienceOutputSchema, ResponseFormat, } from "../schemas/index.js";
|
|
3
|
-
import { hybridRecall
|
|
3
|
+
import { hybridRecall } from "../services/memory-store.js";
|
|
4
4
|
import { loadConfig, getOutputBudget } from "../constants.js";
|
|
5
|
-
import {
|
|
5
|
+
import { getStore } from "../store/sqlite.js";
|
|
6
|
+
import { getSnapshot } from "../store/service.js";
|
|
6
7
|
import { asStructured } from "../types.js";
|
|
7
8
|
// ─── Phân biệt kiểu ────────────────────────────────────────
|
|
8
9
|
// `in` không narrow được union type có optional property nên
|
|
@@ -43,8 +44,7 @@ export function registerRecallExperience(server) {
|
|
|
43
44
|
}, async (params) => {
|
|
44
45
|
try {
|
|
45
46
|
const config = loadConfig();
|
|
46
|
-
|
|
47
|
-
const repo = params.repo ?? (getIndex().repoFingerprint || undefined);
|
|
47
|
+
const repo = params.repo ?? (getStore().getRepoFingerprint() || undefined);
|
|
48
48
|
const results = hybridRecall(params.task, repo, params.topK, params.memoryTypes);
|
|
49
49
|
if (params.responseFormat === ResponseFormat.JSON) {
|
|
50
50
|
const output = results;
|
|
@@ -120,7 +120,7 @@ export function registerRecallExperience(server) {
|
|
|
120
120
|
lines.push("---");
|
|
121
121
|
lines.push("");
|
|
122
122
|
}
|
|
123
|
-
const fileCount =
|
|
123
|
+
const fileCount = getSnapshot()?.files?.length ?? null;
|
|
124
124
|
const budget = getOutputBudget(config.maxResponseChars, fileCount);
|
|
125
125
|
const output = lines.join("\n");
|
|
126
126
|
const truncated = output.length > budget
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall-experience.js","sourceRoot":"","sources":["../../src/tools/recall-experience.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"recall-experience.js","sourceRoot":"","sources":["../../src/tools/recall-experience.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-experience.d.ts","sourceRoot":"","sources":["../../src/tools/record-experience.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"record-experience.d.ts","sourceRoot":"","sources":["../../src/tools/record-experience.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAuEzD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { registerCiTool } from "./register.js";
|
|
2
2
|
import { asStructured } from "../types.js";
|
|
3
3
|
import { RecordExperienceSchema, RecordExperienceOutputSchema } from "../schemas/index.js";
|
|
4
|
-
import { storeExperience
|
|
4
|
+
import { storeExperience } from "../services/memory-store.js";
|
|
5
5
|
import { getRepoFingerprint } from "../services/validation-runner.js";
|
|
6
6
|
import { loadConfig, MAX_RESPONSE_CHARS } from "../constants.js";
|
|
7
7
|
export function registerRecordExperience(server) {
|
|
@@ -15,11 +15,11 @@ export function registerRecordExperience(server) {
|
|
|
15
15
|
destructiveHint: false,
|
|
16
16
|
idempotentHint: true,
|
|
17
17
|
},
|
|
18
|
+
profile: "full",
|
|
18
19
|
}, async (params) => {
|
|
19
20
|
const config = loadConfig();
|
|
20
21
|
const maxChars = config.maxResponseChars ?? MAX_RESPONSE_CHARS;
|
|
21
22
|
try {
|
|
22
|
-
loadMemoryStore(config.storePath);
|
|
23
23
|
const repoFingerprint = getRepoFingerprint(config.repoPath);
|
|
24
24
|
const evidence = {
|
|
25
25
|
commitSha: params.commit,
|
|
@@ -37,9 +37,6 @@ export function registerRecordExperience(server) {
|
|
|
37
37
|
commit: params.commit,
|
|
38
38
|
failedAttempts: params.failedAttempts ?? [],
|
|
39
39
|
}, evidence, repoFingerprint);
|
|
40
|
-
// addExperience lưu store nội bộ nhưng dùng DEFAULT_STORE_PATH;
|
|
41
|
-
// lưu lại với storePath đúng từ config
|
|
42
|
-
saveMemoryStore(config.storePath);
|
|
43
40
|
const output = {
|
|
44
41
|
id: result.id,
|
|
45
42
|
quality: result.quality,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-experience.js","sourceRoot":"","sources":["../../src/tools/record-experience.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAA8B,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"record-experience.js","sourceRoot":"","sources":["../../src/tools/record-experience.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAA8B,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,cAAc,CAAC,MAAM,EAAE,sBAAsB,EAC7C;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,sIAAsI;QACnJ,WAAW,EAAE,sBAAsB;QACnC,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;SACrB;QACD,OAAO,EAAE,MAAM;KAChB,EACD,KAAK,EAAE,MAA6B,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,IAAI,kBAAkB,CAAC;QAC/D,IAAI,CAAC;YAEH,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE5D,MAAM,QAAQ,GAAG;gBACf,SAAS,EAAE,MAAM,CAAC,MAAM;gBACxB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;gBAC3C,eAAe;gBACf,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC;YAEF,MAAM,MAAM,GAAG,eAAe,CAC5B;gBACE,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;aAC5C,EACD,QAAQ,EACR,eAAe,CAChB,CAAC;YAGF,MAAM,MAAM,GAAG;gBACb,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,0CAA0C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC9E,eAAe;aAChB,CAAC;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ;gBACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,iBAAiB;gBAC7C,CAAC,CAAC,IAAI,CAAC;YAET,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACrD,iBAAiB,EAAE,YAAY,CAAC,MAAM,CAAC;aACxC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC;YAC9F,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ;gBACzC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,iBAAiB;gBAChD,CAAC,CAAC,OAAO,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACrD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAE,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkDvD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmD9D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { registerCiTool } from "./register.js";
|
|
2
|
+
import { ReflectSchema, ReflectOutputSchema, SessionReflectionsSchema, SessionReflectionsOutputSchema, } from "../schemas/index.js";
|
|
3
|
+
import { getStore } from "../store/sqlite.js";
|
|
4
|
+
import { asStructured } from "../types.js";
|
|
5
|
+
export function registerReflect(server) {
|
|
6
|
+
registerCiTool(server, "ci_reflect", {
|
|
7
|
+
title: "Record Work Reflection",
|
|
8
|
+
description: "Record structured context about what you're currently working on. Use this to persist session memory across tool calls — goal, task, symbols, and files involved. Later retrieve via ci_reflect_history.",
|
|
9
|
+
inputSchema: ReflectSchema,
|
|
10
|
+
outputSchema: ReflectOutputSchema,
|
|
11
|
+
annotations: { readOnlyHint: false, idempotentHint: false },
|
|
12
|
+
profile: "full",
|
|
13
|
+
}, async (params) => {
|
|
14
|
+
try {
|
|
15
|
+
const store = getStore();
|
|
16
|
+
store.recordReflection(params.sessionId, params.goal, params.task, params.symbols, params.files);
|
|
17
|
+
return {
|
|
18
|
+
content: [{
|
|
19
|
+
type: "text",
|
|
20
|
+
text: [
|
|
21
|
+
`## Reflection Recorded`,
|
|
22
|
+
``,
|
|
23
|
+
`**Session:** \`${params.sessionId}\``,
|
|
24
|
+
`**Goal:** ${params.goal}`,
|
|
25
|
+
`**Task:** ${params.task}`,
|
|
26
|
+
params.symbols?.length ? `**Symbols:** ${params.symbols.join(", ")}` : "",
|
|
27
|
+
params.files?.length ? `**Files:** ${params.files.join(", ")}` : "",
|
|
28
|
+
].filter(Boolean).join("\n"),
|
|
29
|
+
}],
|
|
30
|
+
structuredContent: asStructured({
|
|
31
|
+
id: Date.now(),
|
|
32
|
+
sessionId: params.sessionId,
|
|
33
|
+
goal: params.goal,
|
|
34
|
+
task: params.task,
|
|
35
|
+
timestamp: new Date().toISOString(),
|
|
36
|
+
}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: "text", text: `Reflection error: ${msg}` }],
|
|
43
|
+
isError: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function registerReflectHistory(server) {
|
|
49
|
+
registerCiTool(server, "ci_reflect_history", {
|
|
50
|
+
title: "Work Reflection History",
|
|
51
|
+
description: "Retrieve previously recorded session reflections. Filters by session ID and limits results. Useful for understanding what was being worked on in prior steps.",
|
|
52
|
+
inputSchema: SessionReflectionsSchema,
|
|
53
|
+
outputSchema: SessionReflectionsOutputSchema,
|
|
54
|
+
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
55
|
+
profile: "full",
|
|
56
|
+
}, async (params) => {
|
|
57
|
+
try {
|
|
58
|
+
const store = getStore();
|
|
59
|
+
const reflections = store.getSessionReflections(params.sessionId, params.limit);
|
|
60
|
+
const lines = [
|
|
61
|
+
`# Reflection History`,
|
|
62
|
+
``,
|
|
63
|
+
`**Total:** ${reflections.length} reflections`,
|
|
64
|
+
params.sessionId ? `**Filtered by session:** \`${params.sessionId}\`` : "",
|
|
65
|
+
``,
|
|
66
|
+
];
|
|
67
|
+
if (reflections.length === 0) {
|
|
68
|
+
lines.push("_No reflections found._");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
for (const r of reflections) {
|
|
72
|
+
const symbols = JSON.parse(r.symbols);
|
|
73
|
+
const files = JSON.parse(r.files);
|
|
74
|
+
lines.push(`### ${r.timestamp}`);
|
|
75
|
+
lines.push(`**Session:** \`${r.sessionId}\``);
|
|
76
|
+
lines.push(`**Goal:** ${r.goal}`);
|
|
77
|
+
lines.push(`**Task:** ${r.task}`);
|
|
78
|
+
if (symbols.length > 0)
|
|
79
|
+
lines.push(`**Symbols:** ${symbols.join(", ")}`);
|
|
80
|
+
if (files.length > 0)
|
|
81
|
+
lines.push(`**Files:** ${files.join(", ")}`);
|
|
82
|
+
lines.push(``);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
87
|
+
structuredContent: asStructured({ reflections }),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
92
|
+
return {
|
|
93
|
+
content: [{ type: "text", text: `Reflection history error: ${msg}` }],
|
|
94
|
+
isError: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=reflect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/register.d.ts
CHANGED
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
* type inference cho callback, và trả về RegisteredTool
|
|
6
6
|
* để hỗ trợ lifecycle management.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Profile gating: each tool checks the active profile before executing.
|
|
9
|
+
* Tools outside the current profile return a gate error instead of running.
|
|
10
10
|
*/
|
|
11
11
|
import type { McpServer, RegisteredTool, ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
12
12
|
import type { ZodRawShapeCompat, AnySchema } from "@modelcontextprotocol/sdk/server/zod-compat.js";
|
|
13
13
|
import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
|
|
14
|
+
import { type ToolProfile } from "../profiles.js";
|
|
14
15
|
export interface CiToolConfig<InputArgs extends undefined | ZodRawShapeCompat | AnySchema> {
|
|
15
16
|
title?: string;
|
|
16
17
|
description?: string;
|
|
@@ -18,6 +19,8 @@ export interface CiToolConfig<InputArgs extends undefined | ZodRawShapeCompat |
|
|
|
18
19
|
outputSchema?: AnySchema;
|
|
19
20
|
annotations?: ToolAnnotations;
|
|
20
21
|
_meta?: Record<string, unknown>;
|
|
22
|
+
/** Profile requirement: set to restrict this tool to a specific profile (default: all profiles) */
|
|
23
|
+
profile?: ToolProfile;
|
|
21
24
|
}
|
|
22
25
|
export declare function registerCiTool<InputArgs extends undefined | ZodRawShapeCompat | AnySchema = undefined>(server: McpServer, name: string, config: CiToolConfig<InputArgs>, cb: ToolCallback<InputArgs>): RegisteredTool;
|
|
23
26
|
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvG,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAC;AACnG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E,MAAM,WAAW,YAAY,CAAC,SAAS,SAAS,SAAS,GAAG,iBAAiB,GAAG,SAAS;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvG,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAC;AACnG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/E,MAAM,WAAW,YAAY,CAAC,SAAS,SAAS,SAAS,GAAG,iBAAiB,GAAG,SAAS;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,mGAAmG;IACnG,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,SAAS,SAAS,SAAS,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpG,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,EAC/B,EAAE,EAAE,YAAY,CAAC,SAAS,CAAC,GAC1B,cAAc,CAkChB"}
|
package/dist/tools/register.js
CHANGED
|
@@ -1,4 +1,34 @@
|
|
|
1
|
+
import { loadConfig } from "../constants.js";
|
|
2
|
+
import { isToolInProfile, getProfile } from "../profiles.js";
|
|
1
3
|
export function registerCiTool(server, name, config, cb) {
|
|
2
|
-
return
|
|
4
|
+
// Cast is needed because ToolCallback's return type varies with InputArgs
|
|
5
|
+
// but we return a uniform CallToolResult shape.
|
|
6
|
+
const gatedCb = (async (args, extra) => {
|
|
7
|
+
const cfg = loadConfig();
|
|
8
|
+
const activeProfile = cfg.profile ?? "core";
|
|
9
|
+
// If tool specifies a required profile, check it
|
|
10
|
+
if (config.profile && config.profile !== activeProfile) {
|
|
11
|
+
return {
|
|
12
|
+
content: [{
|
|
13
|
+
type: "text",
|
|
14
|
+
text: `Tool \`${name}\` requires profile "${config.profile}". Current profile: "${activeProfile}".\n\nSwitch profile via \`ci_profile\` tool or set \`"profile": "${config.profile}"\` in .ci-mcp.json.`,
|
|
15
|
+
}],
|
|
16
|
+
isError: true,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Also gate by the active profile's tool list
|
|
20
|
+
if (!isToolInProfile(name, activeProfile)) {
|
|
21
|
+
const profileDef = getProfile(activeProfile);
|
|
22
|
+
return {
|
|
23
|
+
content: [{
|
|
24
|
+
type: "text",
|
|
25
|
+
text: `Tool \`${name}\` is not available in the "${activeProfile}" profile.\n\nAvailable tools:\n\`\`\`\n${profileDef.tools.map(t => ` - ${t}`).join("\n")}\n\`\`\`\n\nSwitch profile via \`ci_profile\` tool or set \`"profile": "${profileDef.name}"\` in .ci-mcp.json.`,
|
|
26
|
+
}],
|
|
27
|
+
isError: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return cb(args, extra);
|
|
31
|
+
});
|
|
32
|
+
return server.registerTool(name, config, gatedCb);
|
|
3
33
|
}
|
|
4
34
|
//# sourceMappingURL=register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AAa/E,MAAM,UAAU,cAAc,CAC5B,MAAiB,EACjB,IAAY,EACZ,MAA+B,EAC/B,EAA2B;IAE3B,0EAA0E;IAC1E,gDAAgD;IAChD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAS,EAAE,KAAU,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,aAAa,GAAgB,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;QAEzD,iDAAiD;QACjD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,IAAI,wBAAwB,MAAM,CAAC,OAAO,wBAAwB,aAAa,qEAAqE,MAAM,CAAC,OAAO,sBAAsB;qBACzM,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,IAAI,+BAA+B,aAAa,2CAA2C,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,2EAA2E,UAAU,CAAC,IAAI,sBAAsB;qBAC5Q,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC,IAAW,EAAE,KAAY,CAAC,CAAC;IACvC,CAAC,CAA4B,CAAC;IAE9B,OAAO,MAAM,CAAC,YAAY,CAAuB,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC"}
|
package/dist/tools/reindex.d.ts
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../src/tools/reindex.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../src/tools/reindex.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuLvD"}
|