ralph-hero-knowledge-index 0.1.20 → 0.1.23
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/.claude-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/README.md +109 -0
- package/dist/chunker.d.ts +37 -0
- package/dist/chunker.js +219 -0
- package/dist/chunker.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.js +75 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +7 -0
- package/dist/db.js +17 -0
- package/dist/db.js.map +1 -1
- package/dist/file-scanner.d.ts +13 -1
- package/dist/file-scanner.js +30 -3
- package/dist/file-scanner.js.map +1 -1
- package/dist/hybrid-search.d.ts +12 -0
- package/dist/hybrid-search.js +74 -5
- package/dist/hybrid-search.js.map +1 -1
- package/dist/ignore.d.ts +29 -0
- package/dist/ignore.js +65 -0
- package/dist/ignore.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +166 -6
- package/dist/index.js.map +1 -1
- package/dist/llm-client.d.ts +41 -0
- package/dist/llm-client.js +98 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/reindex.d.ts +22 -3
- package/dist/reindex.js +60 -8
- package/dist/reindex.js.map +1 -1
- package/dist/search.d.ts +12 -0
- package/dist/search.js +15 -1
- package/dist/search.js.map +1 -1
- package/package.json +2 -1
- package/src/__tests__/chunker.test.ts +246 -0
- package/src/__tests__/config.test.ts +173 -0
- package/src/__tests__/file-scanner.test.ts +88 -0
- package/src/__tests__/hybrid-search.test.ts +107 -0
- package/src/__tests__/ignore.test.ts +86 -0
- package/src/__tests__/index.test.ts +450 -0
- package/src/__tests__/llm-client.test.ts +349 -0
- package/src/__tests__/memory-stats.test.ts +204 -0
- package/src/__tests__/reindex.test.ts +148 -2
- package/src/__tests__/search.test.ts +37 -0
- package/src/chunker.ts +279 -0
- package/src/config.ts +105 -0
- package/src/db.ts +17 -0
- package/src/file-scanner.ts +28 -3
- package/src/hybrid-search.ts +88 -5
- package/src/ignore.ts +82 -0
- package/src/index.ts +202 -7
- package/src/llm-client.ts +136 -0
- package/src/reindex.ts +80 -9
- package/src/search.ts +27 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ralph-knowledge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"description": "Knowledge graph for ralph-hero: semantic search, relationship traversal, and document indexing across thoughts/ documents. Optional companion to ralph-hero.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Chad Dubiel",
|
package/.mcp.json
CHANGED
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# ralph-knowledge
|
|
2
|
+
|
|
3
|
+
Semantic search over a personal knowledge corpus (`thoughts/` plus any other
|
|
4
|
+
markdown roots). Uses SQLite + `sqlite-vec` for local embeddings and exposes
|
|
5
|
+
a stdio MCP server to Claude Code.
|
|
6
|
+
|
|
7
|
+
## Quick start
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
cd plugin/ralph-knowledge
|
|
11
|
+
npm install
|
|
12
|
+
npm run build
|
|
13
|
+
npm run reindex # index default root (../../thoughts)
|
|
14
|
+
npm run reindex -- /path/to/roots # CLI override, see "Configuration"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
A SQLite file is written to `~/.ralph-hero/knowledge.db` by default.
|
|
18
|
+
|
|
19
|
+
## Configuration
|
|
20
|
+
|
|
21
|
+
ralph-knowledge reads configuration from four sources. Each source can be
|
|
22
|
+
missing; later sources fill in only what earlier sources did not provide. The
|
|
23
|
+
precedence for **roots** (directories to index), from highest to lowest, is:
|
|
24
|
+
|
|
25
|
+
1. CLI positional arguments (`npm run reindex -- /a /b /c`)
|
|
26
|
+
2. `RALPH_KNOWLEDGE_DIRS` environment variable (comma-separated)
|
|
27
|
+
3. `roots[]` in `~/.ralph/knowledge.config.json`
|
|
28
|
+
4. Fallback: `../../thoughts` (relative to the current working directory)
|
|
29
|
+
|
|
30
|
+
`dbPath` precedence is independent:
|
|
31
|
+
|
|
32
|
+
1. CLI positional argument ending in `.db`
|
|
33
|
+
2. `RALPH_KNOWLEDGE_DB` environment variable
|
|
34
|
+
3. `dbPath` in `~/.ralph/knowledge.config.json`
|
|
35
|
+
4. Default: `~/.ralph-hero/knowledge.db`
|
|
36
|
+
|
|
37
|
+
### `~/.ralph/knowledge.config.json`
|
|
38
|
+
|
|
39
|
+
Create this file to persist multi-root setups and global ignore patterns.
|
|
40
|
+
The path can be overridden via the `RALPH_KNOWLEDGE_CONFIG` env var.
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"roots": [
|
|
45
|
+
"~/projects/ralph-hero/thoughts",
|
|
46
|
+
"~/projects/landcrawler-ai/thoughts",
|
|
47
|
+
"~/notes"
|
|
48
|
+
],
|
|
49
|
+
"ignorePatterns": [
|
|
50
|
+
"**/drafts/**",
|
|
51
|
+
"**/worktrees/**",
|
|
52
|
+
"*.bak"
|
|
53
|
+
],
|
|
54
|
+
"dbPath": "~/.ralph-hero/knowledge.db"
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
All fields are optional. Tilde (`~`) prefixes in `roots[]` and `dbPath` are
|
|
59
|
+
expanded to the user's home directory at load time. Malformed JSON, non-object
|
|
60
|
+
top levels, and non-string entries are ignored with a warning.
|
|
61
|
+
|
|
62
|
+
On startup, ralph-knowledge logs which source provided the roots, e.g.:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
Using roots from: config
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Ignoring files
|
|
69
|
+
|
|
70
|
+
Per-root `.ralphignore` files use full gitignore syntax and are layered on
|
|
71
|
+
top of the config's `ignorePatterns` and the following default globals (always
|
|
72
|
+
applied):
|
|
73
|
+
|
|
74
|
+
- `.claude/`
|
|
75
|
+
- `node_modules/`
|
|
76
|
+
- `dist/`
|
|
77
|
+
- `.git/`
|
|
78
|
+
- `*.log`
|
|
79
|
+
|
|
80
|
+
Example `.ralphignore` at the top of a root directory:
|
|
81
|
+
|
|
82
|
+
```gitignore
|
|
83
|
+
# Skip a whole subtree
|
|
84
|
+
.claude/worktrees/**
|
|
85
|
+
|
|
86
|
+
# Skip drafts but keep the index
|
|
87
|
+
drafts/**
|
|
88
|
+
!drafts/INDEX.md
|
|
89
|
+
|
|
90
|
+
# Skip anything ending in .bak
|
|
91
|
+
*.bak
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Patterns behave exactly like `.gitignore`:
|
|
95
|
+
|
|
96
|
+
- `**/name/**` matches `name/` at any depth.
|
|
97
|
+
- A leading `!` negates an earlier match, re-including a path.
|
|
98
|
+
- A trailing `/` makes the pattern directory-only.
|
|
99
|
+
|
|
100
|
+
Directories whose names start with `.` or `_` are also always skipped, as a
|
|
101
|
+
fast-path before any matcher is consulted.
|
|
102
|
+
|
|
103
|
+
## Environment variables
|
|
104
|
+
|
|
105
|
+
| Variable | Purpose |
|
|
106
|
+
|----------|---------|
|
|
107
|
+
| `RALPH_KNOWLEDGE_CONFIG` | Override path to `knowledge.config.json` (tilde expanded). |
|
|
108
|
+
| `RALPH_KNOWLEDGE_DIRS` | Comma-separated list of roots. Beats config, loses to CLI. |
|
|
109
|
+
| `RALPH_KNOWLEDGE_DB` | Override SQLite path. Beats `config.dbPath`, loses to a CLI `.db` positional. |
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecursiveCharacterTextSplitter-style chunker.
|
|
3
|
+
*
|
|
4
|
+
* Splits long text into overlapping chunks while preserving the original
|
|
5
|
+
* character offsets (charStart, charEnd) so downstream code can reconstruct
|
|
6
|
+
* positions. Mirrors the semantics of LangChain's RecursiveCharacterTextSplitter:
|
|
7
|
+
* tries each separator in order, snapping chunk boundaries to the highest-priority
|
|
8
|
+
* separator that keeps pieces under chunkSize.
|
|
9
|
+
*
|
|
10
|
+
* Defaults correspond to 512-token chunks with 64-token overlap
|
|
11
|
+
* (approx: 1 token ~= 4 chars for English text).
|
|
12
|
+
*/
|
|
13
|
+
export interface Chunk {
|
|
14
|
+
index: number;
|
|
15
|
+
content: string;
|
|
16
|
+
charStart: number;
|
|
17
|
+
charEnd: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ChunkerOptions {
|
|
20
|
+
chunkSize?: number;
|
|
21
|
+
chunkOverlap?: number;
|
|
22
|
+
separators?: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Split `text` into overlapping chunks.
|
|
26
|
+
*
|
|
27
|
+
* Semantics:
|
|
28
|
+
* - Empty input -> empty array.
|
|
29
|
+
* - Short input (<= chunkSize) -> single chunk covering the whole text.
|
|
30
|
+
* - For each chunk, `text.slice(charStart, charEnd) === content`.
|
|
31
|
+
* - `charStart` is monotonically non-decreasing across chunks.
|
|
32
|
+
* - Consecutive chunks overlap by ~`chunkOverlap` chars (snapped to atom
|
|
33
|
+
* boundaries; may differ by up to the largest atom size).
|
|
34
|
+
* - Each chunk's content length is bounded by chunkSize + a small slack for
|
|
35
|
+
* the separator that snapped the boundary.
|
|
36
|
+
*/
|
|
37
|
+
export declare function chunkText(text: string, opts?: ChunkerOptions): Chunk[];
|
package/dist/chunker.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecursiveCharacterTextSplitter-style chunker.
|
|
3
|
+
*
|
|
4
|
+
* Splits long text into overlapping chunks while preserving the original
|
|
5
|
+
* character offsets (charStart, charEnd) so downstream code can reconstruct
|
|
6
|
+
* positions. Mirrors the semantics of LangChain's RecursiveCharacterTextSplitter:
|
|
7
|
+
* tries each separator in order, snapping chunk boundaries to the highest-priority
|
|
8
|
+
* separator that keeps pieces under chunkSize.
|
|
9
|
+
*
|
|
10
|
+
* Defaults correspond to 512-token chunks with 64-token overlap
|
|
11
|
+
* (approx: 1 token ~= 4 chars for English text).
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_CHUNK_SIZE = 2048;
|
|
14
|
+
const DEFAULT_CHUNK_OVERLAP = 256;
|
|
15
|
+
const DEFAULT_SEPARATORS = ["\n\n", "\n", ". ", " ", ""];
|
|
16
|
+
/**
|
|
17
|
+
* Pick the first separator from `separators` that occurs in `piece.text`.
|
|
18
|
+
* Falls back to the last separator (typically `""`) if none match — this is
|
|
19
|
+
* the sentinel that lets us character-split oversized pieces with no natural
|
|
20
|
+
* boundary.
|
|
21
|
+
*/
|
|
22
|
+
function pickSeparator(pieceText, separators) {
|
|
23
|
+
for (let i = 0; i < separators.length; i++) {
|
|
24
|
+
const sep = separators[i];
|
|
25
|
+
if (sep === "") {
|
|
26
|
+
return { separator: sep, remaining: separators.slice(i + 1) };
|
|
27
|
+
}
|
|
28
|
+
if (pieceText.includes(sep)) {
|
|
29
|
+
return { separator: sep, remaining: separators.slice(i + 1) };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Should be unreachable when DEFAULT_SEPARATORS ends with "".
|
|
33
|
+
return { separator: "", remaining: [] };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Split a piece on `separator` while retaining absolute char offsets.
|
|
37
|
+
* When separator is empty, split into single-character pieces.
|
|
38
|
+
*/
|
|
39
|
+
function splitOnSeparator(piece, separator) {
|
|
40
|
+
if (separator === "") {
|
|
41
|
+
const out = [];
|
|
42
|
+
for (let i = 0; i < piece.text.length; i++) {
|
|
43
|
+
out.push({ text: piece.text[i], start: piece.start + i });
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
const out = [];
|
|
48
|
+
let cursor = 0;
|
|
49
|
+
let idx = piece.text.indexOf(separator, cursor);
|
|
50
|
+
while (idx !== -1) {
|
|
51
|
+
// Keep the separator attached to the preceding piece so reconstruction
|
|
52
|
+
// via text.slice(charStart, charEnd) works bit-for-bit.
|
|
53
|
+
const sliceEnd = idx + separator.length;
|
|
54
|
+
out.push({
|
|
55
|
+
text: piece.text.slice(cursor, sliceEnd),
|
|
56
|
+
start: piece.start + cursor,
|
|
57
|
+
});
|
|
58
|
+
cursor = sliceEnd;
|
|
59
|
+
idx = piece.text.indexOf(separator, cursor);
|
|
60
|
+
}
|
|
61
|
+
if (cursor < piece.text.length) {
|
|
62
|
+
out.push({
|
|
63
|
+
text: piece.text.slice(cursor),
|
|
64
|
+
start: piece.start + cursor,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Recursively flatten a piece into "atoms" — pieces small enough to merge
|
|
71
|
+
* greedily into chunks. Pieces larger than chunkSize are split with the next
|
|
72
|
+
* separator in line; pieces that fit are returned as-is.
|
|
73
|
+
*/
|
|
74
|
+
function flattenToAtoms(piece, separators, chunkSize) {
|
|
75
|
+
if (piece.text.length <= chunkSize) {
|
|
76
|
+
return [piece];
|
|
77
|
+
}
|
|
78
|
+
const { separator, remaining } = pickSeparator(piece.text, separators);
|
|
79
|
+
const splits = splitOnSeparator(piece, separator);
|
|
80
|
+
// If the separator didn't actually reduce the piece (e.g., no occurrence),
|
|
81
|
+
// fall through to the next separator with the original piece.
|
|
82
|
+
if (splits.length <= 1) {
|
|
83
|
+
if (remaining.length === 0) {
|
|
84
|
+
// No more separators — return whatever we have, even if oversized.
|
|
85
|
+
return [piece];
|
|
86
|
+
}
|
|
87
|
+
return flattenToAtoms(piece, remaining, chunkSize);
|
|
88
|
+
}
|
|
89
|
+
const out = [];
|
|
90
|
+
for (const sub of splits) {
|
|
91
|
+
if (sub.text.length <= chunkSize) {
|
|
92
|
+
out.push(sub);
|
|
93
|
+
}
|
|
94
|
+
else if (remaining.length > 0) {
|
|
95
|
+
for (const leaf of flattenToAtoms(sub, remaining, chunkSize)) {
|
|
96
|
+
out.push(leaf);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Last-resort: character-split oversized atom so we never return a
|
|
101
|
+
// single atom larger than chunkSize.
|
|
102
|
+
out.push(...splitOnSeparator(sub, ""));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Build a chunk object from a contiguous run of atoms.
|
|
109
|
+
* `charStart` is taken from the first atom, `charEnd` from the last atom's
|
|
110
|
+
* end boundary, and `content` is `text.slice(start, end)` — this guarantees
|
|
111
|
+
* `text.slice(charStart, charEnd) === content`.
|
|
112
|
+
*/
|
|
113
|
+
function buildChunk(originalText, atoms, index) {
|
|
114
|
+
const first = atoms[0];
|
|
115
|
+
const last = atoms[atoms.length - 1];
|
|
116
|
+
const charStart = first.start;
|
|
117
|
+
const charEnd = last.start + last.text.length;
|
|
118
|
+
return {
|
|
119
|
+
index,
|
|
120
|
+
content: originalText.slice(charStart, charEnd),
|
|
121
|
+
charStart,
|
|
122
|
+
charEnd,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Compute the start position for the next chunk's atoms given the previous
|
|
127
|
+
* chunk ended at `prevEnd`. We walk backward through the atom list to find
|
|
128
|
+
* the atom whose start >= prevEnd - chunkOverlap; that atom begins the
|
|
129
|
+
* overlap region.
|
|
130
|
+
*/
|
|
131
|
+
function findOverlapStartIndex(atoms, lastEndAtomIndex, prevEnd, chunkOverlap) {
|
|
132
|
+
if (chunkOverlap <= 0) {
|
|
133
|
+
return lastEndAtomIndex + 1;
|
|
134
|
+
}
|
|
135
|
+
const targetStart = prevEnd - chunkOverlap;
|
|
136
|
+
// Find the earliest atom in [0..lastEndAtomIndex] whose start >= targetStart.
|
|
137
|
+
let overlapAtomIdx = lastEndAtomIndex + 1;
|
|
138
|
+
for (let i = lastEndAtomIndex; i >= 0; i--) {
|
|
139
|
+
if (atoms[i].start >= targetStart) {
|
|
140
|
+
overlapAtomIdx = i;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// If overlap produced no progress (no atoms found), step forward to avoid
|
|
147
|
+
// an infinite loop.
|
|
148
|
+
if (overlapAtomIdx > lastEndAtomIndex) {
|
|
149
|
+
overlapAtomIdx = lastEndAtomIndex + 1;
|
|
150
|
+
}
|
|
151
|
+
return overlapAtomIdx;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Split `text` into overlapping chunks.
|
|
155
|
+
*
|
|
156
|
+
* Semantics:
|
|
157
|
+
* - Empty input -> empty array.
|
|
158
|
+
* - Short input (<= chunkSize) -> single chunk covering the whole text.
|
|
159
|
+
* - For each chunk, `text.slice(charStart, charEnd) === content`.
|
|
160
|
+
* - `charStart` is monotonically non-decreasing across chunks.
|
|
161
|
+
* - Consecutive chunks overlap by ~`chunkOverlap` chars (snapped to atom
|
|
162
|
+
* boundaries; may differ by up to the largest atom size).
|
|
163
|
+
* - Each chunk's content length is bounded by chunkSize + a small slack for
|
|
164
|
+
* the separator that snapped the boundary.
|
|
165
|
+
*/
|
|
166
|
+
export function chunkText(text, opts = {}) {
|
|
167
|
+
const chunkSize = opts.chunkSize ?? DEFAULT_CHUNK_SIZE;
|
|
168
|
+
const chunkOverlap = opts.chunkOverlap ?? DEFAULT_CHUNK_OVERLAP;
|
|
169
|
+
const separators = opts.separators ?? DEFAULT_SEPARATORS;
|
|
170
|
+
if (text.length === 0) {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
if (chunkOverlap >= chunkSize) {
|
|
174
|
+
throw new Error(`chunker: chunkOverlap (${chunkOverlap}) must be smaller than chunkSize (${chunkSize})`);
|
|
175
|
+
}
|
|
176
|
+
// Fast path for short docs — no need to walk separators.
|
|
177
|
+
if (text.length <= chunkSize) {
|
|
178
|
+
return [
|
|
179
|
+
{
|
|
180
|
+
index: 0,
|
|
181
|
+
content: text,
|
|
182
|
+
charStart: 0,
|
|
183
|
+
charEnd: text.length,
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
}
|
|
187
|
+
const atoms = flattenToAtoms({ text, start: 0 }, separators, chunkSize);
|
|
188
|
+
const chunks = [];
|
|
189
|
+
let chunkIdx = 0;
|
|
190
|
+
let i = 0;
|
|
191
|
+
while (i < atoms.length) {
|
|
192
|
+
// Greedily pack atoms into this chunk until adding one more would push
|
|
193
|
+
// the chunk content past chunkSize.
|
|
194
|
+
let runLen = 0;
|
|
195
|
+
let j = i;
|
|
196
|
+
while (j < atoms.length) {
|
|
197
|
+
const atomLen = atoms[j].text.length;
|
|
198
|
+
// Always include at least one atom per chunk to ensure progress.
|
|
199
|
+
if (j > i && runLen + atomLen > chunkSize) {
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
runLen += atomLen;
|
|
203
|
+
j++;
|
|
204
|
+
}
|
|
205
|
+
const runAtoms = atoms.slice(i, j);
|
|
206
|
+
const chunk = buildChunk(text, runAtoms, chunkIdx);
|
|
207
|
+
chunks.push(chunk);
|
|
208
|
+
chunkIdx++;
|
|
209
|
+
if (j >= atoms.length) {
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
// Compute overlap start for the next chunk.
|
|
213
|
+
const lastEndAtomIdx = j - 1;
|
|
214
|
+
const nextStart = findOverlapStartIndex(atoms, lastEndAtomIdx, chunk.charEnd, chunkOverlap);
|
|
215
|
+
i = nextStart;
|
|
216
|
+
}
|
|
217
|
+
return chunks;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../src/chunker.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shape of the optional `~/.ralph/knowledge.config.json` file.
|
|
3
|
+
*
|
|
4
|
+
* All fields are optional. Unknown fields are preserved at parse time but are
|
|
5
|
+
* not surfaced through this interface — callers should treat the file as
|
|
6
|
+
* forward-compatible.
|
|
7
|
+
*/
|
|
8
|
+
export interface KnowledgeConfig {
|
|
9
|
+
/** Absolute or `~`-prefixed directories to index. */
|
|
10
|
+
roots?: string[];
|
|
11
|
+
/** Extra gitignore-syntax patterns layered on top of per-root `.ralphignore`. */
|
|
12
|
+
ignorePatterns?: string[];
|
|
13
|
+
/** Override for the SQLite database path. */
|
|
14
|
+
dbPath?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Expand a leading `~` or `~/` segment in a path to the user's home directory.
|
|
18
|
+
* Paths that do not begin with `~` are returned unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export declare function expandHome(p: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the knowledge config file path. Precedence:
|
|
23
|
+
* 1. `process.env.RALPH_KNOWLEDGE_CONFIG`
|
|
24
|
+
* 2. `~/.ralph/knowledge.config.json`
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveConfigPath(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Load the optional `knowledge.config.json` file. Returns an empty object when
|
|
29
|
+
* the file is missing or malformed. Tilde-prefixed paths inside `roots` and
|
|
30
|
+
* `dbPath` are expanded eagerly so callers receive absolute paths.
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadConfig(): KnowledgeConfig;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
/**
|
|
5
|
+
* Expand a leading `~` or `~/` segment in a path to the user's home directory.
|
|
6
|
+
* Paths that do not begin with `~` are returned unchanged.
|
|
7
|
+
*/
|
|
8
|
+
export function expandHome(p) {
|
|
9
|
+
if (!p)
|
|
10
|
+
return p;
|
|
11
|
+
if (p === "~")
|
|
12
|
+
return homedir();
|
|
13
|
+
if (p.startsWith("~/") || p.startsWith("~\\")) {
|
|
14
|
+
return join(homedir(), p.slice(2));
|
|
15
|
+
}
|
|
16
|
+
return p;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the knowledge config file path. Precedence:
|
|
20
|
+
* 1. `process.env.RALPH_KNOWLEDGE_CONFIG`
|
|
21
|
+
* 2. `~/.ralph/knowledge.config.json`
|
|
22
|
+
*/
|
|
23
|
+
export function resolveConfigPath() {
|
|
24
|
+
const envPath = process.env.RALPH_KNOWLEDGE_CONFIG;
|
|
25
|
+
if (envPath && envPath.trim().length > 0) {
|
|
26
|
+
return expandHome(envPath);
|
|
27
|
+
}
|
|
28
|
+
return join(homedir(), ".ralph", "knowledge.config.json");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load the optional `knowledge.config.json` file. Returns an empty object when
|
|
32
|
+
* the file is missing or malformed. Tilde-prefixed paths inside `roots` and
|
|
33
|
+
* `dbPath` are expanded eagerly so callers receive absolute paths.
|
|
34
|
+
*/
|
|
35
|
+
export function loadConfig() {
|
|
36
|
+
const configPath = resolveConfigPath();
|
|
37
|
+
if (!existsSync(configPath)) {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
let raw;
|
|
41
|
+
try {
|
|
42
|
+
raw = readFileSync(configPath, "utf-8");
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.warn(`Failed to read knowledge config at ${configPath}: ${e.message}`);
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(raw);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
console.warn(`Malformed JSON in knowledge config at ${configPath}: ${e.message}`);
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
57
|
+
console.warn(`Knowledge config at ${configPath} is not a JSON object; ignoring.`);
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
const obj = parsed;
|
|
61
|
+
const out = {};
|
|
62
|
+
if (Array.isArray(obj.roots)) {
|
|
63
|
+
out.roots = obj.roots
|
|
64
|
+
.filter((r) => typeof r === "string" && r.length > 0)
|
|
65
|
+
.map(expandHome);
|
|
66
|
+
}
|
|
67
|
+
if (Array.isArray(obj.ignorePatterns)) {
|
|
68
|
+
out.ignorePatterns = obj.ignorePatterns.filter((p) => typeof p === "string" && p.length > 0);
|
|
69
|
+
}
|
|
70
|
+
if (typeof obj.dbPath === "string" && obj.dbPath.length > 0) {
|
|
71
|
+
out.dbPath = expandHome(obj.dbPath);
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
CHANGED
|
@@ -114,6 +114,13 @@ export declare class KnowledgeDB {
|
|
|
114
114
|
getMeta(key: string): string | undefined;
|
|
115
115
|
setMeta(key: string, value: string): void;
|
|
116
116
|
documentExists(id: string): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Returns the `memory_tier` for the given document id. Returns `undefined`
|
|
119
|
+
* when the document does not exist OR when the `memory_tier` column is
|
|
120
|
+
* absent from the schema (pre-v3 databases). Used by MCP `knowledge_*`
|
|
121
|
+
* tools that need to post-filter result sets by tier.
|
|
122
|
+
*/
|
|
123
|
+
getMemoryTier(id: string): string | undefined;
|
|
117
124
|
deleteDocument(id: string): void;
|
|
118
125
|
clearAll(): void;
|
|
119
126
|
close(): void;
|
package/dist/db.js
CHANGED
|
@@ -323,6 +323,23 @@ export class KnowledgeDB {
|
|
|
323
323
|
const row = this.db.prepare("SELECT 1 FROM documents WHERE id = ?").get(id);
|
|
324
324
|
return row !== undefined;
|
|
325
325
|
}
|
|
326
|
+
/**
|
|
327
|
+
* Returns the `memory_tier` for the given document id. Returns `undefined`
|
|
328
|
+
* when the document does not exist OR when the `memory_tier` column is
|
|
329
|
+
* absent from the schema (pre-v3 databases). Used by MCP `knowledge_*`
|
|
330
|
+
* tools that need to post-filter result sets by tier.
|
|
331
|
+
*/
|
|
332
|
+
getMemoryTier(id) {
|
|
333
|
+
const columns = this.db
|
|
334
|
+
.prepare("PRAGMA table_info(documents)")
|
|
335
|
+
.all();
|
|
336
|
+
if (!columns.some((c) => c.name === "memory_tier"))
|
|
337
|
+
return undefined;
|
|
338
|
+
const row = this.db
|
|
339
|
+
.prepare("SELECT memory_tier AS memoryTier FROM documents WHERE id = ?")
|
|
340
|
+
.get(id);
|
|
341
|
+
return row?.memoryTier;
|
|
342
|
+
}
|
|
326
343
|
deleteDocument(id) {
|
|
327
344
|
this.db.prepare("DELETE FROM documents WHERE id = ?").run(id);
|
|
328
345
|
}
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/file-scanner.d.ts
CHANGED
|
@@ -1 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import type { IgnoreMatcher } from "./ignore.js";
|
|
2
|
+
/**
|
|
3
|
+
* Recursively find all `.md` files under `dir`.
|
|
4
|
+
*
|
|
5
|
+
* Directory names beginning with `.` or `_` and file names beginning with `_`
|
|
6
|
+
* are always skipped (fast-path). When an {@link IgnoreMatcher} is supplied,
|
|
7
|
+
* each remaining path is additionally tested against it via its root-relative
|
|
8
|
+
* form; matches are skipped.
|
|
9
|
+
*
|
|
10
|
+
* @param dir root directory to walk
|
|
11
|
+
* @param matcher optional matcher built via `loadIgnoreForRoot(dir, …)`
|
|
12
|
+
*/
|
|
13
|
+
export declare function findMarkdownFiles(dir: string, matcher?: IgnoreMatcher): string[];
|
package/dist/file-scanner.js
CHANGED
|
@@ -1,14 +1,41 @@
|
|
|
1
1
|
import { readdirSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Recursively find all `.md` files under `dir`.
|
|
5
|
+
*
|
|
6
|
+
* Directory names beginning with `.` or `_` and file names beginning with `_`
|
|
7
|
+
* are always skipped (fast-path). When an {@link IgnoreMatcher} is supplied,
|
|
8
|
+
* each remaining path is additionally tested against it via its root-relative
|
|
9
|
+
* form; matches are skipped.
|
|
10
|
+
*
|
|
11
|
+
* @param dir root directory to walk
|
|
12
|
+
* @param matcher optional matcher built via `loadIgnoreForRoot(dir, …)`
|
|
13
|
+
*/
|
|
14
|
+
export function findMarkdownFiles(dir, matcher) {
|
|
4
15
|
const results = [];
|
|
5
16
|
function walk(d) {
|
|
6
17
|
for (const entry of readdirSync(d, { withFileTypes: true })) {
|
|
7
18
|
const fullPath = join(d, entry.name);
|
|
8
|
-
if (entry.isDirectory()
|
|
19
|
+
if (entry.isDirectory()) {
|
|
20
|
+
// Fast-path: hidden/underscored directories are always skipped.
|
|
21
|
+
if (entry.name.startsWith(".") || entry.name.startsWith("_"))
|
|
22
|
+
continue;
|
|
23
|
+
if (matcher) {
|
|
24
|
+
// Test both bare and trailing-slash forms so gitignore-style
|
|
25
|
+
// directory-only patterns (e.g., `dist/`) match even when the
|
|
26
|
+
// directory itself has not yet been descended.
|
|
27
|
+
const rel = relative(dir, fullPath);
|
|
28
|
+
if (matcher.isIgnored(rel) || matcher.isIgnored(`${rel}/`))
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
9
31
|
walk(fullPath);
|
|
10
32
|
}
|
|
11
33
|
else if (entry.isFile() && entry.name.endsWith(".md") && !entry.name.startsWith("_")) {
|
|
34
|
+
if (matcher) {
|
|
35
|
+
const rel = relative(dir, fullPath);
|
|
36
|
+
if (matcher.isIgnored(rel))
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
12
39
|
results.push(fullPath);
|
|
13
40
|
}
|
|
14
41
|
}
|
package/dist/file-scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../src/file-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../src/file-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,OAAuB;IACpE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,SAAS,IAAI,CAAC,CAAS;QACrB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,gEAAgE;gBAChE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACvE,IAAI,OAAO,EAAE,CAAC;oBACZ,6DAA6D;oBAC7D,8DAA8D;oBAC9D,+CAA+C;oBAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACpC,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;wBAAE,SAAS;gBACvE,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvF,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACpC,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;wBAAE,SAAS;gBACvC,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,OAAO,CAAC;AACjB,CAAC"}
|