codestrate 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +154 -0
  2. package/dist/constants.d.ts +40 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +145 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +134 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/schemas/index.d.ts +260 -0
  11. package/dist/schemas/index.d.ts.map +1 -0
  12. package/dist/schemas/index.js +173 -0
  13. package/dist/schemas/index.js.map +1 -0
  14. package/dist/security/guard.d.ts +18 -0
  15. package/dist/security/guard.d.ts.map +1 -0
  16. package/dist/security/guard.js +39 -0
  17. package/dist/security/guard.js.map +1 -0
  18. package/dist/services/code-searcher.d.ts +22 -0
  19. package/dist/services/code-searcher.d.ts.map +1 -0
  20. package/dist/services/code-searcher.js +171 -0
  21. package/dist/services/code-searcher.js.map +1 -0
  22. package/dist/services/context-builder.d.ts +22 -0
  23. package/dist/services/context-builder.d.ts.map +1 -0
  24. package/dist/services/context-builder.js +232 -0
  25. package/dist/services/context-builder.js.map +1 -0
  26. package/dist/services/memory-store.d.ts +31 -0
  27. package/dist/services/memory-store.d.ts.map +1 -0
  28. package/dist/services/memory-store.js +27 -0
  29. package/dist/services/memory-store.js.map +1 -0
  30. package/dist/services/repository-parser.d.ts +8 -0
  31. package/dist/services/repository-parser.d.ts.map +1 -0
  32. package/dist/services/repository-parser.js +255 -0
  33. package/dist/services/repository-parser.js.map +1 -0
  34. package/dist/services/symbol-indexer.d.ts +16 -0
  35. package/dist/services/symbol-indexer.d.ts.map +1 -0
  36. package/dist/services/symbol-indexer.js +417 -0
  37. package/dist/services/symbol-indexer.js.map +1 -0
  38. package/dist/services/tree-sitter.d.ts +22 -0
  39. package/dist/services/tree-sitter.d.ts.map +1 -0
  40. package/dist/services/tree-sitter.js +269 -0
  41. package/dist/services/tree-sitter.js.map +1 -0
  42. package/dist/services/validation-runner.d.ts +30 -0
  43. package/dist/services/validation-runner.d.ts.map +1 -0
  44. package/dist/services/validation-runner.js +159 -0
  45. package/dist/services/validation-runner.js.map +1 -0
  46. package/dist/store/index.d.ts +23 -0
  47. package/dist/store/index.d.ts.map +1 -0
  48. package/dist/store/index.js +93 -0
  49. package/dist/store/index.js.map +1 -0
  50. package/dist/store/interface.d.ts +73 -0
  51. package/dist/store/interface.d.ts.map +1 -0
  52. package/dist/store/interface.js +9 -0
  53. package/dist/store/interface.js.map +1 -0
  54. package/dist/store/memory.d.ts +21 -0
  55. package/dist/store/memory.d.ts.map +1 -0
  56. package/dist/store/memory.js +157 -0
  57. package/dist/store/memory.js.map +1 -0
  58. package/dist/store/sqlite.d.ts +95 -0
  59. package/dist/store/sqlite.d.ts.map +1 -0
  60. package/dist/store/sqlite.js +1018 -0
  61. package/dist/store/sqlite.js.map +1 -0
  62. package/dist/tools/analyze-impact.d.ts +3 -0
  63. package/dist/tools/analyze-impact.d.ts.map +1 -0
  64. package/dist/tools/analyze-impact.js +110 -0
  65. package/dist/tools/analyze-impact.js.map +1 -0
  66. package/dist/tools/explore.d.ts +3 -0
  67. package/dist/tools/explore.d.ts.map +1 -0
  68. package/dist/tools/explore.js +96 -0
  69. package/dist/tools/explore.js.map +1 -0
  70. package/dist/tools/get-context.d.ts +3 -0
  71. package/dist/tools/get-context.d.ts.map +1 -0
  72. package/dist/tools/get-context.js +82 -0
  73. package/dist/tools/get-context.js.map +1 -0
  74. package/dist/tools/inspect-symbol.d.ts +3 -0
  75. package/dist/tools/inspect-symbol.d.ts.map +1 -0
  76. package/dist/tools/inspect-symbol.js +146 -0
  77. package/dist/tools/inspect-symbol.js.map +1 -0
  78. package/dist/tools/recall-experience.d.ts +3 -0
  79. package/dist/tools/recall-experience.d.ts.map +1 -0
  80. package/dist/tools/recall-experience.js +141 -0
  81. package/dist/tools/recall-experience.js.map +1 -0
  82. package/dist/tools/record-experience.d.ts +6 -0
  83. package/dist/tools/record-experience.d.ts.map +1 -0
  84. package/dist/tools/record-experience.js +68 -0
  85. package/dist/tools/record-experience.js.map +1 -0
  86. package/dist/tools/reindex.d.ts +8 -0
  87. package/dist/tools/reindex.d.ts.map +1 -0
  88. package/dist/tools/reindex.js +74 -0
  89. package/dist/tools/reindex.js.map +1 -0
  90. package/dist/tools/repo-overview.d.ts +7 -0
  91. package/dist/tools/repo-overview.d.ts.map +1 -0
  92. package/dist/tools/repo-overview.js +102 -0
  93. package/dist/tools/repo-overview.js.map +1 -0
  94. package/dist/tools/run-validation.d.ts +6 -0
  95. package/dist/tools/run-validation.d.ts.map +1 -0
  96. package/dist/tools/run-validation.js +115 -0
  97. package/dist/tools/run-validation.js.map +1 -0
  98. package/dist/tools/search-code.d.ts +3 -0
  99. package/dist/tools/search-code.d.ts.map +1 -0
  100. package/dist/tools/search-code.js +98 -0
  101. package/dist/tools/search-code.js.map +1 -0
  102. package/dist/tools/search-history.d.ts +6 -0
  103. package/dist/tools/search-history.d.ts.map +1 -0
  104. package/dist/tools/search-history.js +69 -0
  105. package/dist/tools/search-history.js.map +1 -0
  106. package/dist/tools/status.d.ts +7 -0
  107. package/dist/tools/status.d.ts.map +1 -0
  108. package/dist/tools/status.js +98 -0
  109. package/dist/tools/status.js.map +1 -0
  110. package/dist/tools/trace-flow.d.ts +3 -0
  111. package/dist/tools/trace-flow.d.ts.map +1 -0
  112. package/dist/tools/trace-flow.js +155 -0
  113. package/dist/tools/trace-flow.js.map +1 -0
  114. package/dist/types.d.ts +182 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +17 -0
  117. package/dist/types.js.map +1 -0
  118. package/grammars/tree-sitter-python.wasm +0 -0
  119. package/grammars/tree-sitter-typescript.wasm +0 -0
  120. package/package.json +48 -0
@@ -0,0 +1,73 @@
1
+ /**
2
+ * StoreProvider — abstraction over storage backends.
3
+ *
4
+ * Supports SQLite as default production store and JSON files as
5
+ * a lightweight fallback. All store operations go through this
6
+ * interface so domain code never depends on a specific backend.
7
+ */
8
+ import type { RepoSnapshot, SymbolInfo, SymbolRelation, Experience, Memory, ValidationResult } from "../types.js";
9
+ export interface Migration {
10
+ version: number;
11
+ name: string;
12
+ sql: string[];
13
+ }
14
+ export interface IndexStore {
15
+ open(): void;
16
+ close(): void;
17
+ isOpen(): boolean;
18
+ getSnapshot(): RepoSnapshot | null;
19
+ setSnapshot(snapshot: RepoSnapshot): void;
20
+ getRepoFingerprint(): string | null;
21
+ setRepoFingerprint(fingerprint: string): void;
22
+ getSymbols(): SymbolInfo[];
23
+ getSymbol(name: string, file?: string): SymbolInfo | null;
24
+ addSymbol(symbol: SymbolInfo): void;
25
+ addSymbols(symbols: SymbolInfo[]): void;
26
+ removeSymbolsByFile(file: string): void;
27
+ clearSymbols(): void;
28
+ getRelations(): SymbolRelation[];
29
+ getRelationsForSymbol(symbol: string): SymbolRelation[];
30
+ addRelation(relation: SymbolRelation): void;
31
+ addRelations(relations: SymbolRelation[]): void;
32
+ clearRelations(): void;
33
+ getFilesByLanguage(): Record<string, string[]>;
34
+ addFile(language: string, filePath: string): void;
35
+ setFilesByLanguage(files: Record<string, string[]>): void;
36
+ getIndexedCommit(): string | null;
37
+ setIndexedCommit(sha: string): void;
38
+ getIndexedAt(): string | null;
39
+ setIndexedAt(ts: string): void;
40
+ purge(): void;
41
+ }
42
+ export interface MemoryStore {
43
+ open(): void;
44
+ close(): void;
45
+ isOpen(): boolean;
46
+ addExperience(exp: Experience): void;
47
+ getExperience(id: string): Experience | null;
48
+ getAllExperiences(repo?: string): Experience[];
49
+ updateExperience(id: string, updates: Partial<Experience>): void;
50
+ deleteExperience(id: string): void;
51
+ addMemory(mem: Memory): void;
52
+ getMemory(id: string): Memory | null;
53
+ getAllMemories(repo?: string): Memory[];
54
+ updateMemory(id: string, updates: Partial<Memory>): void;
55
+ deleteMemory(id: string): void;
56
+ updateQualityScore(id: string, delta: number): void;
57
+ purge(repo?: string): void;
58
+ }
59
+ export interface ValidationResultStore {
60
+ save(result: ValidationResult): void;
61
+ getLatest(limit?: number): ValidationResult[];
62
+ }
63
+ export interface Store extends IndexStore, MemoryStore, ValidationResultStore {
64
+ open(): void;
65
+ close(): void;
66
+ isOpen(): boolean;
67
+ purge(repo?: string): void;
68
+ getCurrentVersion(): number;
69
+ migrate(targetVersion?: number): void;
70
+ vacuum(): void;
71
+ backup(destPath: string): void;
72
+ }
73
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/store/interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * StoreProvider — abstraction over storage backends.
3
+ *
4
+ * Supports SQLite as default production store and JSON files as
5
+ * a lightweight fallback. All store operations go through this
6
+ * interface so domain code never depends on a specific backend.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/store/interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,21 @@
1
+ import type { Experience, ExperienceEvidence, Memory, MemoryType } from "../types.js";
2
+ export interface MemoryStoreData {
3
+ experiences: Experience[];
4
+ memories: Memory[];
5
+ }
6
+ export declare function loadMemoryStore(storePath?: string): void;
7
+ export declare function saveMemoryStore(storePath?: string): void;
8
+ export declare function addExperience(input: {
9
+ task: string;
10
+ diagnosis: string;
11
+ solution: string;
12
+ changedFiles: string[];
13
+ commit: string;
14
+ failedAttempts: string[];
15
+ }, evidence: ExperienceEvidence, repoFingerprint: string): Experience;
16
+ export declare function getExperience(id: string): Experience | undefined;
17
+ export declare function searchExperiences(query: string, repo?: string, topK?: number, memoryTypes?: MemoryType[]): Experience[];
18
+ export declare function addMemory(memory: Omit<Memory, "id" | "timestamp" | "quality">): Memory;
19
+ export declare function searchMemories(query: string, repo?: string, topK?: number, types?: MemoryType[]): Memory[];
20
+ export declare function recallAll(query: string, repo?: string, topK?: number, types?: MemoryType[]): (Experience | Memory)[];
21
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAWD,wBAAgB,eAAe,CAAC,SAAS,GAAE,MAA2B,GAAG,IAAI,CAU5E;AAED,wBAAgB,eAAe,CAAC,SAAS,GAAE,MAA2B,GAAG,IAAI,CAM5E;AAID,wBAAgB,aAAa,CAC3B,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,EACD,QAAQ,EAAE,kBAAkB,EAC5B,eAAe,EAAE,MAAM,GACtB,UAAU,CAmCZ;AAYD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEhE;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,WAAW,CAAC,EAAE,UAAU,EAAE,GACzB,UAAU,EAAE,CAqBd;AAID,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,WAAW,GAAG,SAAS,CAAC,GAAG,MAAM,CAUtF;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,UAAU,EAAE,GACnB,MAAM,EAAE,CAYV;AAID,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,UAAU,EAAE,GACnB,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAYzB"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Memory Store — JSON-based persistence for experiences and memories.
3
+ *
4
+ * Stores:
5
+ * - Episodic: verified experiences from ci_record_experience
6
+ * - Semantic: architecture/convention knowledge
7
+ * - Procedural: workflow processes
8
+ * - Negative: known failures
9
+ *
10
+ * Quality scoring:
11
+ * quality = 0.35 * testSuccess + 0.25 * humanAcceptance + 0.15 * noRegression + 0.15 * codeReviewScore + 0.10 * reuseSuccess
12
+ */
13
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
14
+ import { join } from "path";
15
+ import { randomUUID } from "crypto";
16
+ import { DEFAULT_STORE_PATH, MEMORY_FILE } from "../constants.js";
17
+ let data = {
18
+ experiences: [],
19
+ memories: [],
20
+ };
21
+ function getPath(storePath) {
22
+ return join(storePath, MEMORY_FILE);
23
+ }
24
+ export function loadMemoryStore(storePath = DEFAULT_STORE_PATH) {
25
+ const path = getPath(storePath);
26
+ if (existsSync(path)) {
27
+ try {
28
+ const raw = readFileSync(path, "utf-8");
29
+ data = JSON.parse(raw);
30
+ }
31
+ catch {
32
+ data = { experiences: [], memories: [] };
33
+ }
34
+ }
35
+ }
36
+ export function saveMemoryStore(storePath = DEFAULT_STORE_PATH) {
37
+ const path = getPath(storePath);
38
+ if (!existsSync(storePath)) {
39
+ mkdirSync(storePath, { recursive: true });
40
+ }
41
+ writeFileSync(path, JSON.stringify(data, null, 2), "utf-8");
42
+ }
43
+ // ─── Experience CRUD ──────────────────────────────────────
44
+ export function addExperience(input, evidence, repoFingerprint) {
45
+ // Evidence check: commitSha, changedFiles, validationCommand, repoFingerprint all required
46
+ if (!evidence.commitSha)
47
+ throw new Error("Evidence.commitSha is required");
48
+ if (!evidence.changedFiles || evidence.changedFiles.length === 0)
49
+ throw new Error("Evidence.changedFiles must have at least one file");
50
+ if (!evidence.validationCommand)
51
+ throw new Error("Evidence.validationCommand is required");
52
+ if (!evidence.repoFingerprint)
53
+ throw new Error("Evidence.repoFingerprint is required");
54
+ // Require at least one validation to have passed
55
+ if (!evidence.buildPassed && !evidence.testsPassed) {
56
+ throw new Error("Evidence must include at least one passed validation (buildPassed or testsPassed). " +
57
+ "Run ci_run_validation first to verify the fix.");
58
+ }
59
+ // Compute quality score
60
+ const quality = computeQuality(evidence);
61
+ const experience = {
62
+ id: randomUUID(),
63
+ task: input.task,
64
+ diagnosis: input.diagnosis,
65
+ solution: input.solution,
66
+ changedFiles: input.changedFiles,
67
+ commit: input.commit,
68
+ validation: [],
69
+ failedAttempts: input.failedAttempts,
70
+ evidence,
71
+ quality,
72
+ timestamp: new Date().toISOString(),
73
+ repo: repoFingerprint,
74
+ type: "episodic",
75
+ };
76
+ data.experiences.push(experience);
77
+ saveMemoryStore();
78
+ return experience;
79
+ }
80
+ function computeQuality(evidence) {
81
+ let score = 0;
82
+ if (evidence.buildPassed)
83
+ score += 0.35;
84
+ if (evidence.testsPassed)
85
+ score += 0.25;
86
+ if (evidence.humanAccepted)
87
+ score += 0.15;
88
+ if (evidence.commitCreated !== false)
89
+ score += 0.15; // presence of commit = likely reviewed
90
+ score += 0.10; // baseline for reuse potential
91
+ return Math.min(1, score);
92
+ }
93
+ export function getExperience(id) {
94
+ return data.experiences.find(e => e.id === id);
95
+ }
96
+ export function searchExperiences(query, repo, topK = 5, memoryTypes) {
97
+ const q = query.toLowerCase();
98
+ let results = data.experiences.filter(e => {
99
+ if (repo && e.repo !== repo)
100
+ return false;
101
+ if (memoryTypes && !memoryTypes.includes(e.type))
102
+ return false;
103
+ return (e.task.toLowerCase().includes(q) ||
104
+ e.diagnosis.toLowerCase().includes(q) ||
105
+ e.solution.toLowerCase().includes(q) ||
106
+ e.changedFiles.some(f => f.toLowerCase().includes(q)));
107
+ });
108
+ // Sort by quality desc, then recency
109
+ results.sort((a, b) => {
110
+ const qDiff = b.quality - a.quality;
111
+ if (qDiff !== 0)
112
+ return qDiff;
113
+ return new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime();
114
+ });
115
+ return results.slice(0, topK);
116
+ }
117
+ // ─── Memory CRUD (semantic, procedural, negative) ─────────
118
+ export function addMemory(memory) {
119
+ const m = {
120
+ ...memory,
121
+ id: randomUUID(),
122
+ quality: 0.5, // default for unvalidated
123
+ timestamp: new Date().toISOString(),
124
+ };
125
+ data.memories.push(m);
126
+ saveMemoryStore();
127
+ return m;
128
+ }
129
+ export function searchMemories(query, repo, topK = 5, types) {
130
+ const q = query.toLowerCase();
131
+ let results = data.memories.filter(m => {
132
+ if (repo && m.repo !== repo)
133
+ return false;
134
+ if (types && !types.includes(m.type))
135
+ return false;
136
+ return (m.content.toLowerCase().includes(q) ||
137
+ m.symbols.some(s => s.toLowerCase().includes(q)));
138
+ });
139
+ results.sort((a, b) => b.quality - a.quality);
140
+ return results.slice(0, topK);
141
+ }
142
+ // ─── Hybrid recall ────────────────────────────────────────
143
+ export function recallAll(query, repo, topK = 5, types) {
144
+ const exps = searchExperiences(query, repo, topK, types);
145
+ const mems = searchMemories(query, repo, topK, types);
146
+ // Interleave by quality
147
+ const combined = [];
148
+ const maxLen = Math.max(exps.length, mems.length);
149
+ for (let i = 0; i < maxLen && combined.length < topK; i++) {
150
+ if (i < exps.length)
151
+ combined.push(exps[i]);
152
+ if (i < mems.length && combined.length < topK)
153
+ combined.push(mems[i]);
154
+ }
155
+ return combined;
156
+ }
157
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * SQLite Store — default production storage backend.
3
+ *
4
+ * Uses better-sqlite3 for synchronous, fast SQLite access.
5
+ * Implements the full Store interface with schema migration support.
6
+ *
7
+ * @module store/sqlite
8
+ */
9
+ import { type Store } from "./interface.js";
10
+ import type { RepoSnapshot, SymbolInfo, SymbolRelation, Experience, Memory, ValidationResult, GraphNode, GraphEdge } from "../types.js";
11
+ export declare class SQLiteStore implements Store {
12
+ private db;
13
+ private dbPath;
14
+ constructor(dbPath?: string);
15
+ open(): void;
16
+ close(): void;
17
+ isOpen(): boolean;
18
+ getCurrentVersion(): number;
19
+ migrate(targetVersion?: number): void;
20
+ getSnapshot(): RepoSnapshot | null;
21
+ setSnapshot(snapshot: RepoSnapshot): void;
22
+ getRepoFingerprint(): string | null;
23
+ setRepoFingerprint(fingerprint: string): void;
24
+ getSymbols(): SymbolInfo[];
25
+ getSymbol(name: string, file?: string): SymbolInfo | null;
26
+ addSymbol(symbol: SymbolInfo): void;
27
+ addSymbols(symbols: SymbolInfo[]): void;
28
+ removeSymbolsByFile(file: string): void;
29
+ clearSymbols(): void;
30
+ /**
31
+ * Search symbols using FTS5 full-text index.
32
+ * Returns symbols ranked by relevance (BM25).
33
+ * Limited to `limit` results (default 20, max 50).
34
+ * Falls back to name LIKE search when FTS is unavailable
35
+ * (pre-v4 migration databases).
36
+ */
37
+ searchSymbolsFTS(query: string, limit?: number): SymbolInfo[];
38
+ /** Populate graph nodes and edges from symbol data.
39
+ * Accepts symbols directly to decouple from store backend.
40
+ * Clears previous graph data first. */
41
+ populateGraph(symbols: SymbolInfo[], relations: SymbolRelation[]): void;
42
+ /** Get a graph node by ID. */
43
+ getGraphNode(id: number): GraphNode | null;
44
+ /** Get edges for a graph node. */
45
+ getGraphEdges(nodeId: number, direction?: "incoming" | "outgoing" | "both", kind?: string): GraphEdge[];
46
+ /** Search graph nodes by name (LIKE fallback). */
47
+ searchGraphNodes(query: string, limit?: number): GraphNode[];
48
+ /** Search graph nodes by name using FTS5. */
49
+ searchGraphNodesFTS(query: string, limit?: number): GraphNode[];
50
+ /** CamelCase-aware graph search — split query into segments. */
51
+ searchGraphNodesCamel(query: string, limit?: number): GraphNode[];
52
+ /** Find a path between two graph nodes using BFS. */
53
+ findGraphPath(fromNodeId: number, toNodeId: number, maxDepth?: number): GraphEdge[] | null;
54
+ /** Remove graph entries for a file (cascade via FK — foreign_keys must be ON). */
55
+ removeGraphForFile(file: string): void;
56
+ /** Clear all graph data. */
57
+ clearGraph(): void;
58
+ getRelations(): SymbolRelation[];
59
+ getRelationsForSymbol(symbol: string): SymbolRelation[];
60
+ addRelation(relation: SymbolRelation): void;
61
+ addRelations(relations: SymbolRelation[]): void;
62
+ clearRelations(): void;
63
+ getFilesByLanguage(): Record<string, string[]>;
64
+ addFile(language: string, filePath: string): void;
65
+ setFilesByLanguage(files: Record<string, string[]>): void;
66
+ getIndexedCommit(): string | null;
67
+ setIndexedCommit(sha: string): void;
68
+ getIndexedAt(): string | null;
69
+ setIndexedAt(ts: string): void;
70
+ purge(): void;
71
+ addExperience(exp: Experience): void;
72
+ getExperience(id: string): Experience | null;
73
+ getAllExperiences(repo?: string): Experience[];
74
+ updateExperience(id: string, updates: Partial<Experience>): void;
75
+ deleteExperience(id: string): void;
76
+ addMemory(mem: Memory): void;
77
+ getMemory(id: string): Memory | null;
78
+ getAllMemories(repo?: string): Memory[];
79
+ updateMemory(id: string, updates: Partial<Memory>): void;
80
+ deleteMemory(id: string): void;
81
+ updateQualityScore(id: string, delta: number): void;
82
+ save(result: ValidationResult): void;
83
+ getLatest(limit?: number): ValidationResult[];
84
+ vacuum(): void;
85
+ backup(destPath: string): void;
86
+ private ensureOpen;
87
+ private rowToSymbol;
88
+ private rowToExperience;
89
+ private rowToMemory;
90
+ }
91
+ export declare function getStore(dbPath?: string): SQLiteStore;
92
+ export declare function closeStore(): void;
93
+ /** CamelCase / snake_case splitting for fuzzy symbol matching. */
94
+ export declare function nameSegmentVocab(name: string): string[];
95
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/store/sqlite.ts"],"names":[],"mappings":"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"}