@su-record/vibe 2.6.22 → 2.6.25
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/commands/vibe.review.md +13 -2
- package/commands/vibe.run.md +13 -3
- package/commands/vibe.spec.review.md +20 -19
- package/dist/lib/MemoryManager.d.ts +11 -0
- package/dist/lib/MemoryManager.d.ts.map +1 -1
- package/dist/lib/MemoryManager.js +21 -0
- package/dist/lib/MemoryManager.js.map +1 -1
- package/dist/lib/memory/MemorySearch.d.ts +3 -1
- package/dist/lib/memory/MemorySearch.d.ts.map +1 -1
- package/dist/lib/memory/MemorySearch.js +60 -0
- package/dist/lib/memory/MemorySearch.js.map +1 -1
- package/dist/lib/memory/MemoryStorage.d.ts +12 -1
- package/dist/lib/memory/MemoryStorage.d.ts.map +1 -1
- package/dist/lib/memory/MemoryStorage.js +127 -1
- package/dist/lib/memory/MemoryStorage.js.map +1 -1
- package/dist/lib/memory/ObservationStore.d.ts +61 -0
- package/dist/lib/memory/ObservationStore.d.ts.map +1 -0
- package/dist/lib/memory/ObservationStore.js +120 -0
- package/dist/lib/memory/ObservationStore.js.map +1 -0
- package/dist/lib/memory/SessionSummarizer.d.ts +50 -0
- package/dist/lib/memory/SessionSummarizer.d.ts.map +1 -0
- package/dist/lib/memory/SessionSummarizer.js +157 -0
- package/dist/lib/memory/SessionSummarizer.js.map +1 -0
- package/dist/lib/memory/index.d.ts +1 -0
- package/dist/lib/memory/index.d.ts.map +1 -1
- package/dist/lib/memory/index.js +1 -0
- package/dist/lib/memory/index.js.map +1 -1
- package/dist/tools/memory/addObservation.d.ts +16 -0
- package/dist/tools/memory/addObservation.d.ts.map +1 -0
- package/dist/tools/memory/addObservation.js +71 -0
- package/dist/tools/memory/addObservation.js.map +1 -0
- package/dist/tools/memory/index.d.ts +2 -0
- package/dist/tools/memory/index.d.ts.map +1 -1
- package/dist/tools/memory/index.js +2 -0
- package/dist/tools/memory/index.js.map +1 -1
- package/dist/tools/memory/searchMemoriesAdvanced.d.ts.map +1 -1
- package/dist/tools/memory/searchMemoriesAdvanced.js +7 -5
- package/dist/tools/memory/searchMemoriesAdvanced.js.map +1 -1
- package/dist/tools/memory/searchObservations.d.ts +12 -0
- package/dist/tools/memory/searchObservations.d.ts.map +1 -0
- package/dist/tools/memory/searchObservations.js +67 -0
- package/dist/tools/memory/searchObservations.js.map +1 -0
- package/dist/tools/memory/startSession.d.ts.map +1 -1
- package/dist/tools/memory/startSession.js +16 -2
- package/dist/tools/memory/startSession.js.map +1 -1
- package/dist/types/tool.d.ts +1 -1
- package/dist/types/tool.d.ts.map +1 -1
- package/hooks/scripts/code-check.js +49 -1
- package/hooks/scripts/context-save.js +21 -1
- package/package.json +1 -1
package/commands/vibe.review.md
CHANGED
|
@@ -96,10 +96,21 @@ security-review:
|
|
|
96
96
|
| Quick iteration | ❌ Standard review |
|
|
97
97
|
| API cost concerns | ❌ Standard review |
|
|
98
98
|
|
|
99
|
-
### Tool Invocation (Race Mode)
|
|
99
|
+
### Tool Invocation (Race Mode - GPT + Gemini in parallel via Bash)
|
|
100
|
+
|
|
101
|
+
**🚨 Use stdin pipe to avoid CLI argument length limits on Windows.**
|
|
102
|
+
|
|
103
|
+
1. Save code to review into `[SCRATCHPAD]/review-code.txt` (using Write tool)
|
|
104
|
+
2. Run GPT + Gemini in PARALLEL (two Bash tool calls at once):
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# GPT review (Bash tool call 1)
|
|
108
|
+
node -e "const fs=require('fs');const p=JSON.stringify({prompt:'Review this code for [REVIEW_TYPE]. Return JSON: {issues: [{id, title, description, severity, suggestion}]}. Code: '+fs.readFileSync('[SCRATCHPAD]/review-code.txt','utf8')});process.stdout.write(p)" | node "$(node -p "process.env.APPDATA || require('os').homedir() + '/.config'")/vibe/hooks/scripts/llm-orchestrate.js" gpt orchestrate-json
|
|
109
|
+
```
|
|
100
110
|
|
|
101
111
|
```bash
|
|
102
|
-
|
|
112
|
+
# Gemini review (Bash tool call 2 - run in parallel)
|
|
113
|
+
node -e "const fs=require('fs');const p=JSON.stringify({prompt:'Review this code for [REVIEW_TYPE]. Return JSON: {issues: [{id, title, description, severity, suggestion}]}. Code: '+fs.readFileSync('[SCRATCHPAD]/review-code.txt','utf8')});process.stdout.write(p)" | node "$(node -p "process.env.APPDATA || require('os').homedir() + '/.config'")/vibe/hooks/scripts/llm-orchestrate.js" gemini orchestrate-json
|
|
103
114
|
```
|
|
104
115
|
|
|
105
116
|
## Priority System
|
package/commands/vibe.run.md
CHANGED
|
@@ -905,11 +905,21 @@ After all scenarios are implemented, **GPT and Gemini review in parallel with cr
|
|
|
905
905
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
906
906
|
```
|
|
907
907
|
|
|
908
|
-
**Race Review Invocation:**
|
|
908
|
+
**Race Review Invocation (GPT + Gemini in parallel via Bash):**
|
|
909
|
+
|
|
910
|
+
**🚨 Use stdin pipe to avoid CLI argument length limits on Windows.**
|
|
911
|
+
|
|
912
|
+
1. Save code to review into `[SCRATCHPAD]/review-code.txt` (using Write tool)
|
|
913
|
+
2. Run GPT + Gemini in PARALLEL (two Bash tool calls at once):
|
|
914
|
+
|
|
915
|
+
```bash
|
|
916
|
+
# GPT review (Bash tool call 1)
|
|
917
|
+
node -e "const fs=require('fs');const p=JSON.stringify({prompt:'Review this code for security, performance, and best practices. Return JSON: {issues: [{id, title, description, severity, suggestion}]}. Code: '+fs.readFileSync('[SCRATCHPAD]/review-code.txt','utf8')});process.stdout.write(p)" | node "$(node -p "process.env.APPDATA || require('os').homedir() + '/.config'")/vibe/hooks/scripts/llm-orchestrate.js" gpt orchestrate-json
|
|
918
|
+
```
|
|
909
919
|
|
|
910
920
|
```bash
|
|
911
|
-
#
|
|
912
|
-
node -e "
|
|
921
|
+
# Gemini review (Bash tool call 2 - run in parallel)
|
|
922
|
+
node -e "const fs=require('fs');const p=JSON.stringify({prompt:'Review this code for security, performance, and best practices. Return JSON: {issues: [{id, title, description, severity, suggestion}]}. Code: '+fs.readFileSync('[SCRATCHPAD]/review-code.txt','utf8')});process.stdout.write(p)" | node "$(node -p "process.env.APPDATA || require('os').homedir() + '/.config'")/vibe/hooks/scripts/llm-orchestrate.js" gemini orchestrate-json
|
|
913
923
|
```
|
|
914
924
|
|
|
915
925
|
**Confidence-based Priority:**
|
|
@@ -169,7 +169,7 @@ Score: 96/100 ✅ PASSED
|
|
|
169
169
|
|
|
170
170
|
**🚨 ABSOLUTE RULES FOR RACE REVIEW:**
|
|
171
171
|
|
|
172
|
-
1. **YOU MUST** use the Bash tool to call `
|
|
172
|
+
1. **YOU MUST** use the Bash tool to call `llm-orchestrate.js` directly
|
|
173
173
|
2. **DO NOT** skip GPT/Gemini calls
|
|
174
174
|
3. **DO NOT** simulate or fake review results
|
|
175
175
|
4. **YOU MUST** run all 3 rounds sequentially (each round uses updated SPEC)
|
|
@@ -178,34 +178,35 @@ Score: 96/100 ✅ PASSED
|
|
|
178
178
|
|
|
179
179
|
### 3.1 Review Loop (3 Rounds)
|
|
180
180
|
|
|
181
|
-
**For EACH round (1, 2, 3),
|
|
181
|
+
**For EACH round (1, 2, 3), run GPT + Gemini in PARALLEL via Bash tool.**
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
**🚨 IMPORTANT: SPEC content is too large for CLI arguments. Use stdin pipe method.**
|
|
184
184
|
|
|
185
|
-
|
|
186
|
-
node -e "import('@su-record/vibe/tools').then(async t => { const result = await t.raceReview({reviewType: 'general', code: \`[SPEC_CONTENT]\`, context: 'SPEC review for [FEATURE_NAME]. Stack: [STACK]. Round [N]/3.'}); console.log(t.formatRaceResult(result)); }).catch(e => console.error('Race review failed:', e.message))"
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
**🚨 MANDATORY: Use the Bash tool to run the above command for EACH round.**
|
|
185
|
+
**Procedure for each round:**
|
|
190
186
|
|
|
191
|
-
|
|
192
|
-
-
|
|
193
|
-
- Round 3: Run with final SPEC → Confirm no issues remain
|
|
187
|
+
**Step A: Save SPEC content to scratchpad temp file (using Write tool):**
|
|
188
|
+
- Write the SPEC content to `[SCRATCHPAD]/spec-content.txt`
|
|
194
189
|
|
|
195
|
-
**
|
|
196
|
-
|
|
197
|
-
**Fallback: Direct llm-orchestrate.js calls (run BOTH in parallel via Bash):**
|
|
190
|
+
**Step B: Run GPT + Gemini in PARALLEL (two separate Bash tool calls at once):**
|
|
198
191
|
|
|
199
192
|
```bash
|
|
200
|
-
VIBE_SCRIPTS="$(node -p "process.env.APPDATA || require('os').homedir() + '/.config'")/vibe/hooks/scripts"
|
|
201
|
-
|
|
202
193
|
# GPT review (Bash tool call 1)
|
|
203
|
-
node
|
|
194
|
+
node -e "const fs=require('fs');const p=JSON.stringify({prompt:'Review this SPEC for completeness, specificity, testability, security, and performance. Round [N]/3. Find issues and improvements. Return JSON: {issues: [{id, title, description, severity, suggestion}]}. SPEC content: '+fs.readFileSync('[SCRATCHPAD]/spec-content.txt','utf8')});process.stdout.write(p)" | node "$(node -p "process.env.APPDATA || require('os').homedir() + '/.config'")/vibe/hooks/scripts/llm-orchestrate.js" gpt orchestrate-json
|
|
195
|
+
```
|
|
204
196
|
|
|
205
|
-
|
|
206
|
-
|
|
197
|
+
```bash
|
|
198
|
+
# Gemini review (Bash tool call 2 - run in parallel with GPT)
|
|
199
|
+
node -e "const fs=require('fs');const p=JSON.stringify({prompt:'Review this SPEC for completeness, specificity, testability, security, and performance. Round [N]/3. Find issues and improvements. Return JSON: {issues: [{id, title, description, severity, suggestion}]}. SPEC content: '+fs.readFileSync('[SCRATCHPAD]/spec-content.txt','utf8')});process.stdout.write(p)" | node "$(node -p "process.env.APPDATA || require('os').homedir() + '/.config'")/vibe/hooks/scripts/llm-orchestrate.js" gemini orchestrate-json
|
|
207
200
|
```
|
|
208
201
|
|
|
202
|
+
**🚨 MANDATORY: Replace `[SCRATCHPAD]` with the actual scratchpad directory path.**
|
|
203
|
+
**🚨 Replace `[N]` with the current round number (1, 2, or 3).**
|
|
204
|
+
**🚨 Run GPT and Gemini calls in PARALLEL (two separate Bash tool calls at once).**
|
|
205
|
+
|
|
206
|
+
- Round 1: Write SPEC → Run GPT + Gemini in parallel → Cross-validate → Apply fixes → Update SPEC file
|
|
207
|
+
- Round 2: Write updated SPEC → Run → Cross-validate → Apply fixes → Update SPEC file
|
|
208
|
+
- Round 3: Write final SPEC → Run → Cross-validate → Confirm no issues remain
|
|
209
|
+
|
|
209
210
|
### 3.2 Cross-Validation Rules
|
|
210
211
|
|
|
211
212
|
| Agreement | Priority | Action |
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { MemoryRelation, MemoryGraph } from '../types/tool.js';
|
|
2
2
|
import { MemoryItem } from './memory/MemoryStorage.js';
|
|
3
3
|
import { SearchStrategy, SearchOptions } from './memory/MemorySearch.js';
|
|
4
|
+
import { Observation, ObservationInput, ObservationType } from './memory/ObservationStore.js';
|
|
4
5
|
export { MemoryItem } from './memory/MemoryStorage.js';
|
|
6
|
+
export { Observation, ObservationInput, ObservationType } from './memory/ObservationStore.js';
|
|
5
7
|
export declare class MemoryManager {
|
|
6
8
|
private storage;
|
|
7
9
|
private graph;
|
|
8
10
|
private memorySearch;
|
|
11
|
+
private observations;
|
|
9
12
|
private static instances;
|
|
10
13
|
private static instance;
|
|
11
14
|
private static cleanupRegistered;
|
|
@@ -39,6 +42,14 @@ export declare class MemoryManager {
|
|
|
39
42
|
unlinkMemories(sourceKey: string, targetKey: string, relationType?: string): boolean;
|
|
40
43
|
search(query: string): MemoryItem[];
|
|
41
44
|
searchAdvanced(query: string, strategy: SearchStrategy, options?: SearchOptions): MemoryItem[];
|
|
45
|
+
addObservation(input: ObservationInput): number;
|
|
46
|
+
searchObservations(query: string, limit?: number): Observation[];
|
|
47
|
+
getRecentObservations(limit?: number, type?: ObservationType): Observation[];
|
|
48
|
+
getObservationsBySession(sessionId: string, limit?: number): Observation[];
|
|
49
|
+
getObservationStats(): {
|
|
50
|
+
total: number;
|
|
51
|
+
byType: Record<string, number>;
|
|
52
|
+
};
|
|
42
53
|
close(): void;
|
|
43
54
|
static resetInstance(projectPath?: string): void;
|
|
44
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../src/lib/MemoryManager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAiB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAAgB,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../src/lib/MemoryManager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAiB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAAgB,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAoB,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGhH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE9F,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAmB;IAGvC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAyC;IAEjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IACrD,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAS;IAEzC,OAAO;IAwCP;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;WACW,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa;IA+CvD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI;IAI1F,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAItC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAIrC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAI7C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAInD,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAIjE,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAInF,SAAS,IAAI,MAAM;IAQnB,YAAY,CACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAY,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO;IAIH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,UAAU,GAAG,UAAU,GAAG,MAAe,GAAG,cAAc,EAAE;IAIjG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAIvF,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,WAAW;IAI5D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAI/D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO;IAQpF,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;IAInC,cAAc,CACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,aAAkB,GAC1B,UAAU,EAAE;IAQR,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAI/C,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,WAAW,EAAE;IAIpE,qBAAqB,CAAC,KAAK,GAAE,MAAW,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,WAAW,EAAE;IAIhF,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,WAAW,EAAE;IAI9E,mBAAmB,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAQxE,KAAK,IAAI,IAAI;WAIN,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;CAmBxD"}
|
|
@@ -5,10 +5,12 @@ import { readFileSync } from 'fs';
|
|
|
5
5
|
import { MemoryStorage } from './memory/MemoryStorage.js';
|
|
6
6
|
import { KnowledgeGraph } from './memory/KnowledgeGraph.js';
|
|
7
7
|
import { MemorySearch } from './memory/MemorySearch.js';
|
|
8
|
+
import { ObservationStore } from './memory/ObservationStore.js';
|
|
8
9
|
export class MemoryManager {
|
|
9
10
|
storage;
|
|
10
11
|
graph;
|
|
11
12
|
memorySearch;
|
|
13
|
+
observations;
|
|
12
14
|
// Map of projectPath -> MemoryManager instance (for project-based memory)
|
|
13
15
|
static instances = new Map();
|
|
14
16
|
// Legacy single instance (for backward compatibility)
|
|
@@ -46,6 +48,7 @@ export class MemoryManager {
|
|
|
46
48
|
this.storage = new MemoryStorage(resolvedPath);
|
|
47
49
|
this.graph = new KnowledgeGraph(this.storage);
|
|
48
50
|
this.memorySearch = new MemorySearch(this.storage, this.graph);
|
|
51
|
+
this.observations = new ObservationStore(this.storage);
|
|
49
52
|
}
|
|
50
53
|
/**
|
|
51
54
|
* Check if the given path is the vibe package itself
|
|
@@ -163,6 +166,24 @@ export class MemoryManager {
|
|
|
163
166
|
return this.memorySearch.searchAdvanced(query, strategy, options);
|
|
164
167
|
}
|
|
165
168
|
// ============================================================================
|
|
169
|
+
// Observation Operations (delegated to ObservationStore)
|
|
170
|
+
// ============================================================================
|
|
171
|
+
addObservation(input) {
|
|
172
|
+
return this.observations.add(input);
|
|
173
|
+
}
|
|
174
|
+
searchObservations(query, limit = 20) {
|
|
175
|
+
return this.observations.search(query, limit);
|
|
176
|
+
}
|
|
177
|
+
getRecentObservations(limit = 10, type) {
|
|
178
|
+
return this.observations.getRecent(limit, type);
|
|
179
|
+
}
|
|
180
|
+
getObservationsBySession(sessionId, limit = 50) {
|
|
181
|
+
return this.observations.getBySession(sessionId, limit);
|
|
182
|
+
}
|
|
183
|
+
getObservationStats() {
|
|
184
|
+
return this.observations.getStats();
|
|
185
|
+
}
|
|
186
|
+
// ============================================================================
|
|
166
187
|
// Lifecycle Management
|
|
167
188
|
// ============================================================================
|
|
168
189
|
close() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryManager.js","sourceRoot":"","sources":["../../src/lib/MemoryManager.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+DAA+D;AAE/D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,OAAO,EAAE,aAAa,EAAc,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAiC,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryManager.js","sourceRoot":"","sources":["../../src/lib/MemoryManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MemoryItem, MemoryStorage } from './MemoryStorage.js';
|
|
2
2
|
import { KnowledgeGraph } from './KnowledgeGraph.js';
|
|
3
|
-
export type SearchStrategy = 'keyword' | 'graph_traversal' | 'temporal' | 'priority' | 'context_aware';
|
|
3
|
+
export type SearchStrategy = 'keyword' | 'fulltext' | 'graph_traversal' | 'temporal' | 'priority' | 'context_aware';
|
|
4
4
|
export interface SearchOptions {
|
|
5
5
|
limit?: number;
|
|
6
6
|
category?: string;
|
|
@@ -18,6 +18,8 @@ export declare class MemorySearch {
|
|
|
18
18
|
*/
|
|
19
19
|
searchAdvanced(query: string, strategy: SearchStrategy, options?: SearchOptions): MemoryItem[];
|
|
20
20
|
private searchKeyword;
|
|
21
|
+
private searchFulltext;
|
|
22
|
+
private searchKeywordLike;
|
|
21
23
|
private searchTemporal;
|
|
22
24
|
private searchByPriority;
|
|
23
25
|
private searchContextAware;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemorySearch.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemorySearch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"MemorySearch.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemorySearch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,eAAe,CAAC;AAEpH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,KAAK,CAAiB;gBAElB,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc;IAMzD;;OAEG;IACI,cAAc,CACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,aAAkB,GAC1B,UAAU,EAAE;IA4Bf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,kBAAkB;CA2D3B"}
|
|
@@ -17,6 +17,8 @@ export class MemorySearch {
|
|
|
17
17
|
switch (strategy) {
|
|
18
18
|
case 'keyword':
|
|
19
19
|
return this.searchKeyword(query, limit, category);
|
|
20
|
+
case 'fulltext':
|
|
21
|
+
return this.searchFulltext(query, limit, category);
|
|
20
22
|
case 'graph_traversal':
|
|
21
23
|
if (!startKey)
|
|
22
24
|
return this.searchKeyword(query, limit, category);
|
|
@@ -32,6 +34,26 @@ export class MemorySearch {
|
|
|
32
34
|
}
|
|
33
35
|
}
|
|
34
36
|
searchKeyword(query, limit, category) {
|
|
37
|
+
return this.searchKeywordLike(query, limit, category);
|
|
38
|
+
}
|
|
39
|
+
searchFulltext(query, limit, category) {
|
|
40
|
+
if (!this.storage.isFTS5Available()) {
|
|
41
|
+
return this.searchKeywordLike(query, limit, category);
|
|
42
|
+
}
|
|
43
|
+
if (category) {
|
|
44
|
+
const stmt = this.db.prepare(`
|
|
45
|
+
SELECT m.*, bm25(memories_fts) as rank
|
|
46
|
+
FROM memories_fts fts
|
|
47
|
+
JOIN memories m ON m.rowid = fts.rowid
|
|
48
|
+
WHERE memories_fts MATCH ? AND m.category = ?
|
|
49
|
+
ORDER BY rank
|
|
50
|
+
LIMIT ?
|
|
51
|
+
`);
|
|
52
|
+
return stmt.all(query, category, limit);
|
|
53
|
+
}
|
|
54
|
+
return this.storage.searchFTS(query, limit);
|
|
55
|
+
}
|
|
56
|
+
searchKeywordLike(query, limit, category) {
|
|
35
57
|
let sql = `
|
|
36
58
|
SELECT * FROM memories
|
|
37
59
|
WHERE (key LIKE ? OR value LIKE ?)
|
|
@@ -64,6 +86,44 @@ export class MemorySearch {
|
|
|
64
86
|
return this.db.prepare(sql).all(`%${query}%`, `%${query}%`, limit);
|
|
65
87
|
}
|
|
66
88
|
searchContextAware(query, limit, category) {
|
|
89
|
+
// Use FTS5 rank if available for better relevance scoring
|
|
90
|
+
if (this.storage.isFTS5Available()) {
|
|
91
|
+
try {
|
|
92
|
+
let sql;
|
|
93
|
+
const params = [];
|
|
94
|
+
if (category) {
|
|
95
|
+
sql = `
|
|
96
|
+
SELECT m.*,
|
|
97
|
+
(bm25(memories_fts) * -1 + m.priority * 0.5) as relevance_score
|
|
98
|
+
FROM memories_fts fts
|
|
99
|
+
JOIN memories m ON m.rowid = fts.rowid
|
|
100
|
+
WHERE memories_fts MATCH ? AND m.category = ?
|
|
101
|
+
ORDER BY relevance_score DESC, m.lastAccessed DESC
|
|
102
|
+
LIMIT ?
|
|
103
|
+
`;
|
|
104
|
+
params.push(query, category, limit);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
sql = `
|
|
108
|
+
SELECT m.*,
|
|
109
|
+
(bm25(memories_fts) * -1 + m.priority * 0.5) as relevance_score
|
|
110
|
+
FROM memories_fts fts
|
|
111
|
+
JOIN memories m ON m.rowid = fts.rowid
|
|
112
|
+
WHERE memories_fts MATCH ?
|
|
113
|
+
ORDER BY relevance_score DESC, m.lastAccessed DESC
|
|
114
|
+
LIMIT ?
|
|
115
|
+
`;
|
|
116
|
+
params.push(query, limit);
|
|
117
|
+
}
|
|
118
|
+
const results = this.db.prepare(sql).all(...params);
|
|
119
|
+
if (results.length > 0)
|
|
120
|
+
return results;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// FTS5 query failed, fall through to LIKE-based scoring
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// LIKE-based fallback
|
|
67
127
|
let sql = `
|
|
68
128
|
SELECT *,
|
|
69
129
|
(CASE WHEN key LIKE ? THEN 3 ELSE 0 END +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemorySearch.js","sourceRoot":"","sources":["../../../src/lib/memory/MemorySearch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MemorySearch.js","sourceRoot":"","sources":["../../../src/lib/memory/MemorySearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,10 @@ export declare class MemoryStorage {
|
|
|
14
14
|
private saveStmt;
|
|
15
15
|
private recallSelectStmt;
|
|
16
16
|
private recallUpdateStmt;
|
|
17
|
+
private fts5Available;
|
|
17
18
|
constructor(projectPath: string);
|
|
18
19
|
private initializeDatabase;
|
|
20
|
+
private initializeFTS5;
|
|
19
21
|
private initializePreparedStatements;
|
|
20
22
|
private migrateFromJSON;
|
|
21
23
|
/**
|
|
@@ -39,9 +41,18 @@ export declare class MemoryStorage {
|
|
|
39
41
|
*/
|
|
40
42
|
list(category?: string): MemoryItem[];
|
|
41
43
|
/**
|
|
42
|
-
* Search memories by keyword
|
|
44
|
+
* Search memories by keyword (FTS5 priority, LIKE fallback)
|
|
43
45
|
*/
|
|
44
46
|
search(query: string): MemoryItem[];
|
|
47
|
+
/**
|
|
48
|
+
* Full-text search using FTS5 with bm25 ranking
|
|
49
|
+
*/
|
|
50
|
+
searchFTS(query: string, limit?: number): MemoryItem[];
|
|
51
|
+
/**
|
|
52
|
+
* Check if FTS5 is available
|
|
53
|
+
*/
|
|
54
|
+
isFTS5Available(): boolean;
|
|
55
|
+
private searchLike;
|
|
45
56
|
/**
|
|
46
57
|
* Get memories by priority level
|
|
47
58
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStorage.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAmC;
|
|
1
|
+
{"version":3,"file":"MemoryStorage.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM;IAsB/B,OAAO,CAAC,kBAAkB;IAqF1B,OAAO,CAAC,cAAc;IAyDtB,OAAO,CAAC,4BAA4B;IAoBpC,OAAO,CAAC,eAAe;IAoCvB;;OAEG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI;IAcjG;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAoB7C;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASnC;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAYlD;;OAEG;IACI,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAgB5C;;OAEG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;IAW1C;;OAEG;IACI,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAiBjE;;OAEG;IACI,eAAe,IAAI,OAAO;IAIjC,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAUpD;;OAEG;IACI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAM1D;;OAEG;IACI,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAkBxE;;OAEG;IACI,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAmB1F;;OAEG;IACI,WAAW,IAAI,QAAQ,CAAC,QAAQ;IAIvC;;OAEG;IACI,SAAS,IAAI,MAAM;IAI1B;;OAEG;IACI,KAAK,IAAI,IAAI;CAKrB"}
|
|
@@ -10,6 +10,7 @@ export class MemoryStorage {
|
|
|
10
10
|
saveStmt = null;
|
|
11
11
|
recallSelectStmt = null;
|
|
12
12
|
recallUpdateStmt = null;
|
|
13
|
+
fts5Available = false;
|
|
13
14
|
constructor(projectPath) {
|
|
14
15
|
// Normalize path
|
|
15
16
|
const resolvedPath = path.resolve(projectPath);
|
|
@@ -62,12 +63,103 @@ export class MemoryStorage {
|
|
|
62
63
|
CREATE INDEX IF NOT EXISTS idx_rel_source ON memory_relations(sourceKey);
|
|
63
64
|
CREATE INDEX IF NOT EXISTS idx_rel_target ON memory_relations(targetKey);
|
|
64
65
|
CREATE INDEX IF NOT EXISTS idx_rel_type ON memory_relations(relationType);
|
|
66
|
+
`);
|
|
67
|
+
// Create observations table for structured observation capture
|
|
68
|
+
this.db.exec(`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS observations (
|
|
70
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
71
|
+
sessionId TEXT,
|
|
72
|
+
type TEXT NOT NULL CHECK(type IN ('decision','bugfix','feature','refactor','discovery')),
|
|
73
|
+
title TEXT NOT NULL,
|
|
74
|
+
narrative TEXT,
|
|
75
|
+
facts TEXT,
|
|
76
|
+
concepts TEXT,
|
|
77
|
+
filesModified TEXT,
|
|
78
|
+
timestamp TEXT NOT NULL,
|
|
79
|
+
projectPath TEXT
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
CREATE INDEX IF NOT EXISTS idx_obs_session ON observations(sessionId);
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_obs_type ON observations(type);
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_obs_timestamp ON observations(timestamp);
|
|
85
|
+
`);
|
|
86
|
+
// Create session_summaries table
|
|
87
|
+
this.db.exec(`
|
|
88
|
+
CREATE TABLE IF NOT EXISTS session_summaries (
|
|
89
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
90
|
+
sessionId TEXT UNIQUE NOT NULL,
|
|
91
|
+
request TEXT,
|
|
92
|
+
investigated TEXT,
|
|
93
|
+
learned TEXT,
|
|
94
|
+
completed TEXT,
|
|
95
|
+
nextSteps TEXT,
|
|
96
|
+
filesRead TEXT,
|
|
97
|
+
filesEdited TEXT,
|
|
98
|
+
timestamp TEXT NOT NULL
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_ss_session ON session_summaries(sessionId);
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_ss_timestamp ON session_summaries(timestamp);
|
|
65
103
|
`);
|
|
66
104
|
// Enable WAL mode for better concurrency
|
|
67
105
|
this.db.pragma('journal_mode = WAL');
|
|
106
|
+
// Initialize FTS5 full-text search (with fallback if not supported)
|
|
107
|
+
this.initializeFTS5();
|
|
68
108
|
// Pre-compile frequently used statements
|
|
69
109
|
this.initializePreparedStatements();
|
|
70
110
|
}
|
|
111
|
+
initializeFTS5() {
|
|
112
|
+
try {
|
|
113
|
+
// Create FTS5 virtual table for memories
|
|
114
|
+
this.db.exec(`
|
|
115
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts
|
|
116
|
+
USING fts5(key, value, content=memories, content_rowid=rowid);
|
|
117
|
+
`);
|
|
118
|
+
// Triggers to keep FTS5 in sync with memories table
|
|
119
|
+
this.db.exec(`
|
|
120
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
121
|
+
INSERT INTO memories_fts(rowid, key, value) VALUES (new.rowid, new.key, new.value);
|
|
122
|
+
END;
|
|
123
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
124
|
+
INSERT INTO memories_fts(memories_fts, rowid, key, value) VALUES('delete', old.rowid, old.key, old.value);
|
|
125
|
+
END;
|
|
126
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
127
|
+
INSERT INTO memories_fts(memories_fts, rowid, key, value) VALUES('delete', old.rowid, old.key, old.value);
|
|
128
|
+
INSERT INTO memories_fts(rowid, key, value) VALUES (new.rowid, new.key, new.value);
|
|
129
|
+
END;
|
|
130
|
+
`);
|
|
131
|
+
// Create FTS5 for observations
|
|
132
|
+
this.db.exec(`
|
|
133
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS observations_fts
|
|
134
|
+
USING fts5(title, narrative, facts, concepts, content=observations, content_rowid=id);
|
|
135
|
+
|
|
136
|
+
CREATE TRIGGER IF NOT EXISTS observations_ai AFTER INSERT ON observations BEGIN
|
|
137
|
+
INSERT INTO observations_fts(rowid, title, narrative, facts, concepts)
|
|
138
|
+
VALUES (new.id, new.title, new.narrative, new.facts, new.concepts);
|
|
139
|
+
END;
|
|
140
|
+
CREATE TRIGGER IF NOT EXISTS observations_ad AFTER DELETE ON observations BEGIN
|
|
141
|
+
INSERT INTO observations_fts(observations_fts, rowid, title, narrative, facts, concepts)
|
|
142
|
+
VALUES('delete', old.id, old.title, old.narrative, old.facts, old.concepts);
|
|
143
|
+
END;
|
|
144
|
+
`);
|
|
145
|
+
// Migrate existing data into FTS5 index
|
|
146
|
+
const ftsCount = this.db.prepare(`SELECT COUNT(*) as cnt FROM memories_fts`).get().cnt;
|
|
147
|
+
const memCount = this.db.prepare(`SELECT COUNT(*) as cnt FROM memories`).get().cnt;
|
|
148
|
+
if (ftsCount === 0 && memCount > 0) {
|
|
149
|
+
this.db.exec(`INSERT INTO memories_fts(rowid, key, value) SELECT rowid, key, value FROM memories`);
|
|
150
|
+
}
|
|
151
|
+
const obsFtsCount = this.db.prepare(`SELECT COUNT(*) as cnt FROM observations_fts`).get().cnt;
|
|
152
|
+
const obsCount = this.db.prepare(`SELECT COUNT(*) as cnt FROM observations`).get().cnt;
|
|
153
|
+
if (obsFtsCount === 0 && obsCount > 0) {
|
|
154
|
+
this.db.exec(`INSERT INTO observations_fts(rowid, title, narrative, facts, concepts) SELECT id, title, narrative, facts, concepts FROM observations`);
|
|
155
|
+
}
|
|
156
|
+
this.fts5Available = true;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// FTS5 not supported in this build of better-sqlite3
|
|
160
|
+
this.fts5Available = false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
71
163
|
initializePreparedStatements() {
|
|
72
164
|
try {
|
|
73
165
|
this.recallStmt = this.db.prepare(`
|
|
@@ -189,9 +281,43 @@ export class MemoryStorage {
|
|
|
189
281
|
}
|
|
190
282
|
}
|
|
191
283
|
/**
|
|
192
|
-
* Search memories by keyword
|
|
284
|
+
* Search memories by keyword (FTS5 priority, LIKE fallback)
|
|
193
285
|
*/
|
|
194
286
|
search(query) {
|
|
287
|
+
if (this.fts5Available) {
|
|
288
|
+
try {
|
|
289
|
+
return this.searchFTS(query);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
// FTS5 query failed, fall through to LIKE
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return this.searchLike(query);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Full-text search using FTS5 with bm25 ranking
|
|
299
|
+
*/
|
|
300
|
+
searchFTS(query, limit = 50) {
|
|
301
|
+
if (!this.fts5Available) {
|
|
302
|
+
return this.searchLike(query);
|
|
303
|
+
}
|
|
304
|
+
const stmt = this.db.prepare(`
|
|
305
|
+
SELECT m.*, bm25(memories_fts) as rank
|
|
306
|
+
FROM memories_fts fts
|
|
307
|
+
JOIN memories m ON m.rowid = fts.rowid
|
|
308
|
+
WHERE memories_fts MATCH ?
|
|
309
|
+
ORDER BY rank
|
|
310
|
+
LIMIT ?
|
|
311
|
+
`);
|
|
312
|
+
return stmt.all(query, limit);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Check if FTS5 is available
|
|
316
|
+
*/
|
|
317
|
+
isFTS5Available() {
|
|
318
|
+
return this.fts5Available;
|
|
319
|
+
}
|
|
320
|
+
searchLike(query) {
|
|
195
321
|
const stmt = this.db.prepare(`
|
|
196
322
|
SELECT * FROM memories
|
|
197
323
|
WHERE key LIKE ? OR value LIKE ?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStorage.js","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,iEAAiE;AAEjE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAWrE,MAAM,OAAO,aAAa;IACd,EAAE,CAAoB;IACb,MAAM,CAAS;IAC1B,UAAU,GAA8B,IAAI,CAAC;IAC7C,QAAQ,GAA8B,IAAI,CAAC;IAC3C,gBAAgB,GAA8B,IAAI,CAAC;IACnD,gBAAgB,GAA8B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryStorage.js","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"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"}
|