@dikolab/kbdb 0.4.0 → 0.4.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 +30 -22
- package/dist/{chunk-BJPSPNGX.mjs → chunk-BJXEVALU.mjs} +115 -1
- package/dist/chunk-BJXEVALU.mjs.map +7 -0
- package/dist/cli.cjs +462 -79
- package/dist/cli.cjs.map +4 -4
- package/dist/cli.mjs +356 -79
- package/dist/cli.mjs.map +4 -4
- package/dist/kbdb-worker.cjs +413 -53
- package/dist/kbdb-worker.cjs.map +4 -4
- package/dist/mod.cjs +230 -54
- package/dist/mod.cjs.map +4 -4
- package/dist/mod.mjs +229 -53
- package/dist/mod.mjs.map +4 -4
- package/dist/src/shared/cli/typings/cli-options.interface.d.ts +5 -0
- package/dist/src/shared/embedding/classes/tfidf-embedding-provider.class.d.ts +28 -0
- package/dist/src/shared/embedding/constants/tfidf-defaults.constant.d.ts +4 -0
- package/dist/src/shared/embedding/functions/create-embedding-provider.function.d.ts +5 -2
- package/dist/src/shared/embedding/index.d.ts +2 -0
- package/dist/src/shared/log/constants/log-colors.constant.d.ts +5 -0
- package/dist/src/shared/log/constants/log-defaults.constant.d.ts +3 -0
- package/dist/src/shared/log/constants/log-icons.constant.d.ts +3 -0
- package/dist/src/shared/log/functions/configure-log.function.d.ts +12 -0
- package/dist/src/shared/log/functions/log.function.d.ts +28 -0
- package/dist/src/shared/log/functions/parse-log-level.function.d.ts +10 -0
- package/dist/src/shared/log/functions/resolve-log-level.function.d.ts +12 -0
- package/dist/src/shared/log/functions/write-stderr.function.d.ts +10 -0
- package/dist/src/shared/log/index.d.ts +10 -0
- package/dist/src/shared/log/typings/log-config.interface.d.ts +7 -0
- package/dist/src/shared/log/typings/log-level.type.d.ts +7 -0
- package/dist/src/shared/log/typings/log-output.interface.d.ts +4 -0
- package/dist/src/shared/version/constants/version.constant.d.ts +1 -1
- package/dist/src/shared/worker-client/classes/worker-client.class.d.ts +7 -0
- package/dist/src/shared/worker-client/functions/retry-on-timeout.function.d.ts +1 -0
- package/dist/src/shared/worker-daemon/classes/worker-daemon.class.d.ts +1 -0
- package/dist/src/shared/worker-daemon/functions/run-worker.function.d.ts +6 -1
- package/dist/src/shared/worker-daemon/typings/wasm-modules.interface.d.ts +5 -0
- package/dist/wasm/default-embedding/kbdb_default_embedding.d.ts +55 -0
- package/dist/wasm/default-embedding/kbdb_default_embedding.js +156 -0
- package/dist/wasm/default-embedding/kbdb_default_embedding_bg.wasm +0 -0
- package/dist/wasm/default-embedding/kbdb_default_embedding_bg.wasm.d.ts +12 -0
- package/dist/wasm/default-embedding/package.json +13 -0
- package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration.d.ts +38 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration.js +130 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration_bg.wasm +0 -0
- package/dist/wasm/fs-migration/kbdb_fs_migration_bg.wasm.d.ts +9 -0
- package/dist/wasm/fs-migration/package.json +13 -0
- package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
- package/dist/wasm/query-parser/kbdb_query_parser_bg.wasm +0 -0
- package/dist/worker.mjs +306 -54
- package/dist/worker.mjs.map +4 -4
- package/docs/details/agent-tooling.md +10 -0
- package/docs/details/cli.md +29 -13
- package/docs/details/knowledge-base.md +15 -8
- package/docs/details/mcp-server.md +16 -1
- package/docs/details/search-and-ranking.md +6 -2
- package/docs/goals/cli.md +33 -4
- package/docs/goals/content-parser.md +1 -1
- package/docs/goals/hybrid-search.md +71 -42
- package/docs/goals/mcp.md +3 -1
- package/docs/goals/overview.md +1 -1
- package/docs/goals/query-parser.md +1 -1
- package/docs/goals/semantic-dedup.md +7 -3
- package/docs/goals/worker-daemon.md +31 -20
- package/docs/modules/overview.md +43 -22
- package/docs/modules/rust/embedding/module.md +91 -0
- package/docs/modules/rust/overview.md +56 -21
- package/docs/modules/rust/query-parser/functions/module.md +7 -5
- package/docs/modules/rust/query-parser/functions/pipeline.md +6 -138
- package/docs/modules/rust/query-parser/module.md +16 -22
- package/docs/modules/rust/query-parser/types/module.md +5 -4
- package/docs/modules/rust/query-parser/types/token.md +5 -1
- package/docs/modules/rust/shared/content-parser/functions.md +1 -1
- package/docs/modules/rust/shared/memory/module.md +1 -1
- package/docs/modules/rust/shared/module.md +33 -5
- package/docs/modules/rust/shared/pipeline/functions.md +141 -0
- package/docs/modules/rust/shared/pipeline/module.md +62 -0
- package/docs/modules/rust/shared/pipeline/types.md +43 -0
- package/docs/modules/rust/shared/section/module.md +1 -1
- package/docs/modules/rust/shared/section/types.md +1 -1
- package/docs/modules/typescript/cli.md +4 -2
- package/docs/modules/typescript/kbdb-worker.md +20 -5
- package/docs/modules/typescript/overview.md +28 -6
- package/docs/modules/typescript/shared/cli/functions.md +15 -4
- package/docs/modules/typescript/shared/cli/typings.md +21 -0
- package/docs/modules/typescript/shared/embedding/functions.md +30 -3
- package/docs/modules/typescript/shared/embedding/module.md +10 -4
- package/docs/modules/typescript/shared/embedding/typings.md +7 -5
- package/docs/modules/typescript/shared/log/constants.md +82 -0
- package/docs/modules/typescript/shared/log/functions.md +131 -0
- package/docs/modules/typescript/shared/log/module.md +153 -0
- package/docs/modules/typescript/shared/log/typings.md +82 -0
- package/docs/modules/typescript/shared/module.md +22 -6
- package/docs/modules/typescript/shared/worker-daemon/functions.md +19 -6
- package/docs/modules/typescript/shared/worker-daemon/module.md +5 -2
- package/docs/modules/typescript/shared/worker-daemon/typings.md +13 -7
- package/docs/release-notes/0.4.1.md +149 -0
- package/docs/release-notes/0.4.3.md +60 -0
- package/package.json +2 -2
- package/dist/chunk-BJPSPNGX.mjs.map +0 -7
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
## Source
|
|
6
6
|
|
|
7
|
-
`engine/crates/
|
|
7
|
+
`engine/crates/shared/src/pipeline/mod.rs`
|
|
8
|
+
|
|
9
|
+
**Note:** These types are now defined in `kbdb-shared`.
|
|
10
|
+
See [shared/pipeline/types](../../shared/pipeline/types.md)
|
|
11
|
+
for the canonical documentation.
|
|
8
12
|
|
|
9
13
|
## Type Definitions
|
|
10
14
|
|
|
@@ -49,7 +49,7 @@ is preserved; the caller should normalise whitespace
|
|
|
49
49
|
if needed.
|
|
50
50
|
|
|
51
51
|
This function replaces the earlier implementation in
|
|
52
|
-
`
|
|
52
|
+
`shared/src/pipeline/markers.rs`, which only
|
|
53
53
|
recognized `$(image:)` and `$(code:)`. The shared
|
|
54
54
|
version recognizes all six content marker types.
|
|
55
55
|
|
|
@@ -11,7 +11,7 @@ and WASM modules.*
|
|
|
11
11
|
## Responsibility
|
|
12
12
|
|
|
13
13
|
Provides the shared-memory allocation protocol used
|
|
14
|
-
by all
|
|
14
|
+
by all four WASM modules. Every WASM export that
|
|
15
15
|
exchanges variable-length data (strings, byte
|
|
16
16
|
slices, encoded structs) goes through this module's
|
|
17
17
|
allocator and read/write helpers.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# shared -- Shared Types and Utilities
|
|
2
2
|
|
|
3
3
|
*Rust crate that provides types, memory helpers, error
|
|
4
|
-
types,
|
|
5
|
-
|
|
4
|
+
types, the tokenization pipeline, and serialization
|
|
5
|
+
utilities shared across all four WASM modules.*
|
|
6
6
|
|
|
7
7
|
## Crate
|
|
8
8
|
|
|
@@ -15,10 +15,9 @@ three WASM modules.*
|
|
|
15
15
|
|
|
16
16
|
`kbdb-shared` is a pure Rust library. It is **not**
|
|
17
17
|
compiled to WASM on its own -- it is compiled into
|
|
18
|
-
each of the
|
|
18
|
+
each of the four WASM modules that depend on it
|
|
19
19
|
(`kbdb-fs-database`, `kbdb-query-parser`,
|
|
20
|
-
`kbdb-worker`).
|
|
21
|
-
`wasm-bindgen` for the `alloc`/`free` exports.
|
|
20
|
+
`kbdb-default-embedding`, `kbdb-worker`).
|
|
22
21
|
|
|
23
22
|
## Workspace Position
|
|
24
23
|
|
|
@@ -29,6 +28,7 @@ engine/
|
|
|
29
28
|
├── shared/ # this crate (leaf)
|
|
30
29
|
├── fs-database/ # depends on shared
|
|
31
30
|
├── query-parser/ # depends on shared
|
|
31
|
+
├── default-embedding/ # depends on shared
|
|
32
32
|
└── kb-worker/ # depends on shared
|
|
33
33
|
```
|
|
34
34
|
|
|
@@ -74,6 +74,18 @@ engine/crates/shared/
|
|
|
74
74
|
│ ├── types.rs # ComposeRequest, etc.
|
|
75
75
|
│ ├── compose.rs # compose_content()
|
|
76
76
|
│ └── render.rs # marker rendering
|
|
77
|
+
├── pipeline/
|
|
78
|
+
│ ├── mod.rs # pipeline orchestrator
|
|
79
|
+
│ ├── markers.rs # stage 1: strip markers
|
|
80
|
+
│ ├── unicode.rs # stage 2: NFC normalize
|
|
81
|
+
│ ├── segment.rs # stage 3: word boundaries
|
|
82
|
+
│ ├── identifiers.rs # stage 4: camelCase split
|
|
83
|
+
│ ├── case.rs # stage 5: case folding
|
|
84
|
+
│ ├── stopwords.rs # stage 6: stop words
|
|
85
|
+
│ ├── synonyms.rs # stage 7: synonym expand
|
|
86
|
+
│ ├── stem.rs # stage 8: Snowball stemmer
|
|
87
|
+
│ ├── ngram.rs # stage 9: n-gram extract
|
|
88
|
+
│ └── token_result.rs # TokenResult struct
|
|
77
89
|
└── error/
|
|
78
90
|
├── mod.rs # error module facade
|
|
79
91
|
└── error.rs # FsError, IndexError, etc.
|
|
@@ -147,6 +159,19 @@ counterparts: `module.md` = `mod.rs`,
|
|
|
147
159
|
- [functions.md](content-composer/functions.md) --
|
|
148
160
|
`compose_content()`.
|
|
149
161
|
|
|
162
|
+
### [pipeline/](pipeline/module.md) -- Tokenization Pipeline
|
|
163
|
+
|
|
164
|
+
- [functions.md](pipeline/functions.md) --
|
|
165
|
+
`tokenize()`, `bigrams()`, `trigrams()`. 9-stage
|
|
166
|
+
pipeline: marker stripping, NFC, segmentation,
|
|
167
|
+
identifier splitting, case folding, stop words,
|
|
168
|
+
synonym expansion, stemming, n-grams.
|
|
169
|
+
- [types.md](pipeline/types.md) -- `TokenResult`,
|
|
170
|
+
`TokenStream`, `Ngram`, `NgramType`, `StemResult`.
|
|
171
|
+
|
|
172
|
+
Consumers: `kbdb-query-parser` (re-exports via WASM
|
|
173
|
+
FFI), `kbdb-default-embedding` (TF-IDF vectors).
|
|
174
|
+
|
|
150
175
|
### [error/](error/module.md) -- Error Types
|
|
151
176
|
|
|
152
177
|
- [types.md](error/types.md) -- `FsError`,
|
|
@@ -157,6 +182,9 @@ counterparts: `module.md` = `mod.rs`,
|
|
|
157
182
|
```toml
|
|
158
183
|
[dependencies]
|
|
159
184
|
wasm-bindgen = "0.2"
|
|
185
|
+
unicode-segmentation = "1"
|
|
186
|
+
unicode-normalization = "0.1"
|
|
187
|
+
rust-stemmers = "1"
|
|
160
188
|
```
|
|
161
189
|
|
|
162
190
|
## Testing
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# pipeline -- Tokenization Pipeline Functions
|
|
2
|
+
|
|
3
|
+
*9-stage pipeline that converts raw text into
|
|
4
|
+
normalized, stemmed tokens with synonym expansion.
|
|
5
|
+
Used for both indexing and query processing.*
|
|
6
|
+
|
|
7
|
+
## Source
|
|
8
|
+
|
|
9
|
+
`engine/crates/shared/src/pipeline/`
|
|
10
|
+
|
|
11
|
+
## Entry Point
|
|
12
|
+
|
|
13
|
+
```rust
|
|
14
|
+
pub fn tokenize(input: &str) -> TokenStream;
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Runs all nine stages in sequence. Each stage is a
|
|
18
|
+
pure function.
|
|
19
|
+
|
|
20
|
+
## Stages
|
|
21
|
+
|
|
22
|
+
### 1. Content Marker Stripping
|
|
23
|
+
|
|
24
|
+
```rust
|
|
25
|
+
use kbdb_shared::content_parser::strip_content_markers;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Removes all six content marker types from the input
|
|
29
|
+
text before tokenization:
|
|
30
|
+
`$(image:)`, `$(code:)`, `$(text:)`, `$(document:)`,
|
|
31
|
+
`$(link:)`, `$(doc-link:)`.
|
|
32
|
+
|
|
33
|
+
Delegates to `strip_content_markers()` from the
|
|
34
|
+
sibling `content_parser` module (see
|
|
35
|
+
[Content Parser](../content-parser/module.md)).
|
|
36
|
+
These are structural references, not searchable
|
|
37
|
+
content.
|
|
38
|
+
|
|
39
|
+
### 2. Unicode Normalization (`unicode.rs`)
|
|
40
|
+
|
|
41
|
+
```rust
|
|
42
|
+
pub fn normalize_nfc(input: &str) -> String;
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
NFC normalization for consistent codepoints.
|
|
46
|
+
|
|
47
|
+
### 3. Word Boundary Detection (`segment.rs`)
|
|
48
|
+
|
|
49
|
+
```rust
|
|
50
|
+
pub fn segment_words(input: &str) -> Vec<&str>;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Unicode Segmentation (UAX #29).
|
|
54
|
+
|
|
55
|
+
### 4. Identifier Splitting (`identifiers.rs`)
|
|
56
|
+
|
|
57
|
+
```rust
|
|
58
|
+
pub fn split_identifiers(word: &str) -> Vec<String>;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- `camelCase` → `["camel", "case"]`
|
|
62
|
+
- `snake_case` → `["snake", "case"]`
|
|
63
|
+
- `PascalCase` → `["pascal", "case"]`
|
|
64
|
+
- `HTMLParser` → `["html", "parser"]`
|
|
65
|
+
|
|
66
|
+
### 5. Case Folding (`case.rs`)
|
|
67
|
+
|
|
68
|
+
```rust
|
|
69
|
+
pub fn fold_case(word: &str) -> String;
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Unicode case folding (lowercase).
|
|
73
|
+
|
|
74
|
+
### 6. Stop Word Removal (`stopwords.rs`)
|
|
75
|
+
|
|
76
|
+
```rust
|
|
77
|
+
pub fn is_stop_word(word: &str) -> bool;
|
|
78
|
+
pub fn remove_stop_words(
|
|
79
|
+
words: &[String],
|
|
80
|
+
) -> Vec<String>;
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Filters common function words. Single-character
|
|
84
|
+
tokens also removed.
|
|
85
|
+
|
|
86
|
+
### 7. Synonym Expansion (`synonyms.rs`)
|
|
87
|
+
|
|
88
|
+
```rust
|
|
89
|
+
pub fn expand_synonyms(
|
|
90
|
+
word: &str,
|
|
91
|
+
map: &SynonymMap,
|
|
92
|
+
) -> Vec<String>;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Looks up the lowercased word in the built-in synonym
|
|
96
|
+
map. Returns a vector containing the original word
|
|
97
|
+
plus any synonyms. When no synonyms exist, returns a
|
|
98
|
+
single-element vector containing only the original.
|
|
99
|
+
|
|
100
|
+
The synonym map is a bidirectional
|
|
101
|
+
`HashMap<String, Vec<String>>` built at compile time.
|
|
102
|
+
Expansion is applied after stop-word removal and
|
|
103
|
+
before stemming, so both original and synonym tokens
|
|
104
|
+
are stemmed consistently.
|
|
105
|
+
|
|
106
|
+
The map is small (~30-50 entries) and focused on
|
|
107
|
+
common IT/development vocabulary mismatches:
|
|
108
|
+
login/sign-in, auth/authentication, remove/delete,
|
|
109
|
+
config/configuration, credential/password, etc.
|
|
110
|
+
|
|
111
|
+
### 8. Stemming (`stem.rs`)
|
|
112
|
+
|
|
113
|
+
```rust
|
|
114
|
+
pub fn stem_word(word: &str) -> StemResult;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Snowball / Porter2. Preserves both original and
|
|
118
|
+
stemmed forms.
|
|
119
|
+
|
|
120
|
+
### 9. N-gram Extraction (`ngram.rs`)
|
|
121
|
+
|
|
122
|
+
```rust
|
|
123
|
+
pub fn extract_ngrams(
|
|
124
|
+
tokens: &[Token],
|
|
125
|
+
) -> Vec<Ngram>;
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Bigrams and trigrams for phrase indexing.
|
|
129
|
+
|
|
130
|
+
## Relaxed Query Mode
|
|
131
|
+
|
|
132
|
+
The tokenization pipeline is used for both the
|
|
133
|
+
primary AND-mode query plan and the relaxed OR-mode
|
|
134
|
+
fallback plan. `qp_parse_query` produces a
|
|
135
|
+
`QueryPlan` with a `match_mode` field (`All` | `Any`).
|
|
136
|
+
When the AND plan returns zero matches,
|
|
137
|
+
`kb-worker.wasm` retries with the OR plan using the
|
|
138
|
+
same tokenized terms. No additional pipeline stage or
|
|
139
|
+
WASM export is needed. See
|
|
140
|
+
[Query Parser -- Relaxed Query
|
|
141
|
+
Mode](../../../../goals/query-parser.md).
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# pipeline -- Tokenization Pipeline
|
|
2
|
+
|
|
3
|
+
*9-stage pipeline that converts raw text into
|
|
4
|
+
normalized, stemmed tokens with synonym expansion.
|
|
5
|
+
Shared across all crates that need text
|
|
6
|
+
tokenization.*
|
|
7
|
+
|
|
8
|
+
## Source
|
|
9
|
+
|
|
10
|
+
`engine/crates/shared/src/pipeline/`
|
|
11
|
+
|
|
12
|
+
## Responsibility
|
|
13
|
+
|
|
14
|
+
The pipeline module provides the canonical
|
|
15
|
+
tokenization function used for both indexing and
|
|
16
|
+
query processing. All crates that need to tokenize
|
|
17
|
+
text import from this single source of truth.
|
|
18
|
+
|
|
19
|
+
## Consumers
|
|
20
|
+
|
|
21
|
+
- **kbdb-query-parser** -- re-exports via the
|
|
22
|
+
`qp_tokenize` WASM FFI export. Uses internally
|
|
23
|
+
for query parsing (`parse`), keyword extraction
|
|
24
|
+
(`extract/rake`), and n-gram generation.
|
|
25
|
+
- **kbdb-default-embedding** -- tokenizes text
|
|
26
|
+
before feature hashing to produce TF-IDF vectors
|
|
27
|
+
that are token-consistent with the lexical index.
|
|
28
|
+
|
|
29
|
+
## Directory Layout
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
engine/crates/shared/src/pipeline/
|
|
33
|
+
├── mod.rs # pipeline orchestrator
|
|
34
|
+
├── markers.rs # stage 1: strip markers
|
|
35
|
+
├── unicode.rs # stage 2: NFC normalize
|
|
36
|
+
├── segment.rs # stage 3: word boundaries
|
|
37
|
+
├── identifiers.rs # stage 4: camelCase split
|
|
38
|
+
├── case.rs # stage 5: case folding
|
|
39
|
+
├── stopwords.rs # stage 6: stop words
|
|
40
|
+
├── synonyms.rs # stage 7: synonym expansion
|
|
41
|
+
├── stem.rs # stage 8: Snowball stemmer
|
|
42
|
+
├── ngram.rs # stage 9: n-gram extract
|
|
43
|
+
└── token_result.rs # TokenResult struct
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Exports
|
|
47
|
+
|
|
48
|
+
- **[functions.md](functions.md)** -- `tokenize()`,
|
|
49
|
+
`bigrams()`, `trigrams()`. Full 9-stage pipeline.
|
|
50
|
+
- **[types.md](types.md)** -- `TokenResult`,
|
|
51
|
+
`TokenStream`, `Ngram`, `NgramType`, `StemResult`.
|
|
52
|
+
|
|
53
|
+
## Dependencies
|
|
54
|
+
|
|
55
|
+
The pipeline brings three external crates into
|
|
56
|
+
`kbdb-shared`:
|
|
57
|
+
|
|
58
|
+
```toml
|
|
59
|
+
unicode-segmentation = "1" # stage 3
|
|
60
|
+
unicode-normalization = "0.1" # stage 2
|
|
61
|
+
rust-stemmers = "1" # stage 8
|
|
62
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# pipeline -- Tokenization Types
|
|
2
|
+
|
|
3
|
+
*Output types from the tokenization pipeline.*
|
|
4
|
+
|
|
5
|
+
## Source
|
|
6
|
+
|
|
7
|
+
`engine/crates/shared/src/pipeline/`
|
|
8
|
+
|
|
9
|
+
## Type Definitions
|
|
10
|
+
|
|
11
|
+
```rust
|
|
12
|
+
pub struct TokenResult {
|
|
13
|
+
pub original: String,
|
|
14
|
+
pub stemmed: String,
|
|
15
|
+
pub position: u32,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
pub struct TokenStream {
|
|
19
|
+
pub tokens: Vec<TokenResult>,
|
|
20
|
+
pub ngrams: Vec<Ngram>,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
pub struct Ngram {
|
|
24
|
+
pub terms: Vec<String>,
|
|
25
|
+
pub gram_type: NgramType,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
pub enum NgramType { Bigram, Trigram }
|
|
29
|
+
|
|
30
|
+
pub struct StemResult {
|
|
31
|
+
pub original: String,
|
|
32
|
+
pub stemmed: String,
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`TokenResult` preserves both original and stemmed
|
|
37
|
+
forms so the index can support exact-match and
|
|
38
|
+
stem-match queries. `position` is the zero-based
|
|
39
|
+
token offset.
|
|
40
|
+
|
|
41
|
+
`TokenStream` is the output of `tokenize()` -- the
|
|
42
|
+
full set of tokens and extracted n-grams from a
|
|
43
|
+
single input text.
|
|
@@ -12,7 +12,7 @@ structures for section CRUD operations.*
|
|
|
12
12
|
Defines the content type system (`SectionType`,
|
|
13
13
|
`MimeType`) and the data structures for section CRUD
|
|
14
14
|
operations (`SectionRecord`, `AddSectionParams`,
|
|
15
|
-
etc.) shared across all
|
|
15
|
+
etc.) shared across all four WASM modules.
|
|
16
16
|
|
|
17
17
|
See [Database -- Sections](../../../../goals/database.md)
|
|
18
18
|
for the behavioral specification of section types.
|
|
@@ -20,8 +20,9 @@ The npm `bin` entry `kbdb` points to `dist/cli.mjs`.
|
|
|
20
20
|
## Run Modes
|
|
21
21
|
|
|
22
22
|
```
|
|
23
|
-
kbdb mcp [--db <path>]
|
|
24
|
-
kbdb <command> [options]
|
|
23
|
+
kbdb mcp [--db <path>] → MCP server mode
|
|
24
|
+
kbdb <command> [options] → CLI mode
|
|
25
|
+
kbdb --non-interactive <command> → non-interactive
|
|
25
26
|
```
|
|
26
27
|
|
|
27
28
|
The executable inspects its first argument. If `mcp`,
|
|
@@ -74,6 +75,7 @@ src/cli.ts
|
|
|
74
75
|
│
|
|
75
76
|
├─ argv[0] === 'mcp'
|
|
76
77
|
├─ resolve --db flag or KBDB_DB_DIR env or cwd
|
|
78
|
+
├─ resolve --non-interactive or KBDB_NON_INTERACTIVE
|
|
77
79
|
├─ client = await createWorkerClient({ targetDir })
|
|
78
80
|
├─ server = createMcpServer(client)
|
|
79
81
|
├─ server.listen() ← stdio, blocks until closed
|
|
@@ -29,8 +29,8 @@ no running daemon is found for the target database:
|
|
|
29
29
|
```ts
|
|
30
30
|
spawn(
|
|
31
31
|
'node',
|
|
32
|
-
['kbdb-worker.js', contextPath],
|
|
33
|
-
{ detached: true, stdio:
|
|
32
|
+
['kbdb-worker.js', contextPath, '--log-level', logLevel],
|
|
33
|
+
{ detached: true, stdio: 'ignore' },
|
|
34
34
|
).unref();
|
|
35
35
|
```
|
|
36
36
|
|
|
@@ -41,6 +41,7 @@ new Deno.Command('deno', {
|
|
|
41
41
|
args: [
|
|
42
42
|
'run', '--allow-all',
|
|
43
43
|
'src/worker.ts', contextPath,
|
|
44
|
+
'--log-level', logLevel,
|
|
44
45
|
],
|
|
45
46
|
stdin: 'null',
|
|
46
47
|
stdout: 'null',
|
|
@@ -48,8 +49,16 @@ new Deno.Command('deno', {
|
|
|
48
49
|
}).spawn().unref();
|
|
49
50
|
```
|
|
50
51
|
|
|
51
|
-
The
|
|
52
|
+
The first command-line argument is the **context path**
|
|
52
53
|
-- the absolute path to the `.kbdb` database directory.
|
|
54
|
+
The optional `--log-level <level>` argument controls
|
|
55
|
+
daemon log verbosity. It is forwarded from the
|
|
56
|
+
`KBDB_LOG_LEVEL` environment variable by the spawner.
|
|
57
|
+
|
|
58
|
+
The `KBDB_NON_INTERACTIVE` environment variable is
|
|
59
|
+
inherited by the daemon through normal process
|
|
60
|
+
environment inheritance (no explicit forwarding
|
|
61
|
+
needed).
|
|
53
62
|
|
|
54
63
|
## Execution Flow
|
|
55
64
|
|
|
@@ -60,6 +69,9 @@ src/worker.ts
|
|
|
60
69
|
│
|
|
61
70
|
├─ read contextPath from argv[0]
|
|
62
71
|
├─ validate contextPath exists
|
|
72
|
+
├─ parse --log-level from argv (if present)
|
|
73
|
+
├─ configure log level
|
|
74
|
+
│ (CLI arg → KBDB_LOG_LEVEL env → ERROR default)
|
|
63
75
|
│
|
|
64
76
|
└─ await startDaemon(contextPath)
|
|
65
77
|
│
|
|
@@ -70,8 +82,10 @@ src/worker.ts
|
|
|
70
82
|
│ ├─ allocate shared WebAssembly.Memory
|
|
71
83
|
│ ├─ compile query-parser.wasm (standalone)
|
|
72
84
|
│ ├─ compile fs-database.wasm (standalone)
|
|
85
|
+
│ ├─ compile default-embedding.wasm
|
|
86
|
+
│ │ (standalone, no host imports)
|
|
73
87
|
│ └─ compile kb-worker.wasm
|
|
74
|
-
│ (imports
|
|
88
|
+
│ (imports query-parser + fs-database)
|
|
75
89
|
│
|
|
76
90
|
├─ write PID file
|
|
77
91
|
│ └─ kb-worker-{ctx}.pid in tmpdir
|
|
@@ -114,12 +128,13 @@ single function call. All daemon logic lives in
|
|
|
114
128
|
| Query orchestration| WASM (`kb-worker.wasm`) |
|
|
115
129
|
| Index operations | WASM (`fs-database.wasm`) |
|
|
116
130
|
| Tokenization | WASM (`query-parser.wasm`) |
|
|
131
|
+
| TF-IDF embedding | WASM (`default-embedding.wasm`) |
|
|
117
132
|
| Platform helpers | `shared/platform/` |
|
|
118
133
|
|
|
119
134
|
## Lifecycle
|
|
120
135
|
|
|
121
136
|
1. Spawned by worker-client as detached child process
|
|
122
|
-
2. Loads and compiles
|
|
137
|
+
2. Loads and compiles 4 WASM modules (once)
|
|
123
138
|
3. Serves IPC requests from any connected client
|
|
124
139
|
4. Shuts down after idle timeout (`timeout_ms`) or
|
|
125
140
|
OS signal (SIGTERM, SIGINT)
|
|
@@ -58,7 +58,7 @@ contains no business logic -- it dispatches to
|
|
|
58
58
|
### `src/worker.ts`
|
|
59
59
|
|
|
60
60
|
The worker daemon. Spawned as a detached child process
|
|
61
|
-
by the worker-client module. Loads the
|
|
61
|
+
by the worker-client module. Loads the four WASM
|
|
62
62
|
modules, listens on a local IPC socket, and serves
|
|
63
63
|
JSON-RPC 2.0 requests until idle timeout.
|
|
64
64
|
|
|
@@ -230,10 +230,27 @@ src/shared/
|
|
|
230
230
|
│ ├── get-tmpdir.function.ts
|
|
231
231
|
│ └── is-process-alive.function.ts
|
|
232
232
|
│
|
|
233
|
-
|
|
233
|
+
├── hash/ ← SHA-256 hashing
|
|
234
|
+
│ ├── index.ts
|
|
235
|
+
│ └── functions/
|
|
236
|
+
│ └── compute-sha256.function.ts
|
|
237
|
+
│
|
|
238
|
+
└── log/ ← Structured logging
|
|
234
239
|
├── index.ts
|
|
235
|
-
|
|
236
|
-
|
|
240
|
+
├── constants/
|
|
241
|
+
│ ├── log-colors.constant.ts
|
|
242
|
+
│ ├── log-defaults.constant.ts
|
|
243
|
+
│ └── log-icons.constant.ts
|
|
244
|
+
├── functions/
|
|
245
|
+
│ ├── configure-log.function.ts
|
|
246
|
+
│ ├── log.function.ts
|
|
247
|
+
│ ├── parse-log-level.function.ts
|
|
248
|
+
│ ├── resolve-log-level.function.ts
|
|
249
|
+
│ └── write-stderr.function.ts
|
|
250
|
+
└── typings/
|
|
251
|
+
├── log-config.interface.ts
|
|
252
|
+
├── log-level.type.ts
|
|
253
|
+
└── log-output.interface.ts
|
|
237
254
|
```
|
|
238
255
|
|
|
239
256
|
## Module Conventions
|
|
@@ -368,9 +385,14 @@ docs/modules/typescript/
|
|
|
368
385
|
├── platform/
|
|
369
386
|
│ ├── module.md
|
|
370
387
|
│ └── functions.md
|
|
371
|
-
|
|
388
|
+
├── hash/
|
|
389
|
+
│ ├── module.md
|
|
390
|
+
│ └── functions.md
|
|
391
|
+
└── log/
|
|
372
392
|
├── module.md
|
|
373
|
-
|
|
393
|
+
├── functions.md
|
|
394
|
+
├── typings.md
|
|
395
|
+
└── constants.md
|
|
374
396
|
```
|
|
375
397
|
|
|
376
398
|
`module.md` = `index.ts` (module entry point).
|
|
@@ -13,9 +13,12 @@ utility helpers, and one function per CLI sub-command.*
|
|
|
13
13
|
|
|
14
14
|
**File:** `run-cli.function.ts`
|
|
15
15
|
|
|
16
|
-
Full CLI orchestrator. Parses arguments,
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
Full CLI orchestrator. Parses arguments, configures the
|
|
17
|
+
log level from `-v`/`-vv`/`-vvv` or `KBDB_LOG_LEVEL`,
|
|
18
|
+
resolves non-interactive mode from `--non-interactive`
|
|
19
|
+
or `KBDB_NON_INTERACTIVE` before dispatching commands,
|
|
20
|
+
routes to the appropriate sub-flow, and returns a
|
|
21
|
+
`CommandResult` without touching process globals.
|
|
19
22
|
|
|
20
23
|
```ts
|
|
21
24
|
async function runCli(
|
|
@@ -110,7 +113,14 @@ function parseArgs(
|
|
|
110
113
|
```
|
|
111
114
|
|
|
112
115
|
Throws on invalid or missing required arguments.
|
|
113
|
-
Prints help text and exits for `--help
|
|
116
|
+
Prints help text and exits for `--help`. Prints the
|
|
117
|
+
version string and exits for `--version`.
|
|
118
|
+
|
|
119
|
+
`-v` maps to `--verbose` (log level WARNING), not to
|
|
120
|
+
`--version`. Use `--version` (long form only) to print
|
|
121
|
+
the version. `-vv` sets log level INFO; `-vvv` sets
|
|
122
|
+
DEBUG. The resolved level is stored in
|
|
123
|
+
`CliOptions.logLevel`.
|
|
114
124
|
|
|
115
125
|
**Compound command handling**: when the first positional
|
|
116
126
|
argument is `db`, `skill`, `agent`, or `worker`, the
|
|
@@ -140,6 +150,7 @@ and sets `command` to the hyphenated form:
|
|
|
140
150
|
| `--persona <p>` | `persona` | Agent persona file |
|
|
141
151
|
| `--body <b>` | `body` | Skill body file |
|
|
142
152
|
| `--skills <s>` | `skills` | Comma-separated kbids |
|
|
153
|
+
| `--non-interactive` | `nonInteractive` | Suppress prompts |
|
|
143
154
|
|
|
144
155
|
### `findDb`
|
|
145
156
|
|
|
@@ -34,6 +34,7 @@ interface CliOptions {
|
|
|
34
34
|
skills?: string[];
|
|
35
35
|
timeoutMs?: number;
|
|
36
36
|
retry?: number;
|
|
37
|
+
logLevel?: LogLevel;
|
|
37
38
|
}
|
|
38
39
|
```
|
|
39
40
|
|
|
@@ -65,6 +66,8 @@ interface CliOptions {
|
|
|
65
66
|
| `skills` | Ordered skill kbid list (`--skills`) |
|
|
66
67
|
| `timeoutMs` | Request timeout in ms |
|
|
67
68
|
| `retry` | Max retry count on timeout |
|
|
69
|
+
| `logLevel` | Log verbosity level from `-v`/`-vv`/`-vvv` |
|
|
70
|
+
| `nonInteractive` | Suppress prompts (`--non-interactive`) |
|
|
68
71
|
|
|
69
72
|
### `OutputFormat`
|
|
70
73
|
|
|
@@ -93,6 +96,24 @@ query.
|
|
|
93
96
|
type SearchMode = 'sections' | 'documents' | 'stats';
|
|
94
97
|
```
|
|
95
98
|
|
|
99
|
+
### `LogLevel`
|
|
100
|
+
|
|
101
|
+
**File:** `cli-options.interface.ts`
|
|
102
|
+
|
|
103
|
+
Log verbosity level. Set via `-v`/`-vv`/`-vvv` flags
|
|
104
|
+
or the `KBDB_LOG_LEVEL` environment variable.
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
type LogLevel = 'debug' | 'info' | 'warning' | 'error';
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
| Value | Description |
|
|
111
|
+
|-----------|--------------------------------------|
|
|
112
|
+
| `error` | Errors only (default) |
|
|
113
|
+
| `warning` | Errors and warnings (`-v`) |
|
|
114
|
+
| `info` | Errors, warnings, and info (`-vv`) |
|
|
115
|
+
| `debug` | All messages including debug (`-vvv`)|
|
|
116
|
+
|
|
96
117
|
### `CommandResult`
|
|
97
118
|
|
|
98
119
|
**File:** `command-result.model.ts`
|
|
@@ -12,9 +12,36 @@ createEmbeddingProvider(
|
|
|
12
12
|
|
|
13
13
|
Factory that returns the appropriate `EmbeddingProvider`
|
|
14
14
|
implementation based on the given config. Returns an
|
|
15
|
-
`OnnxEmbeddingProvider` for `
|
|
16
|
-
`ApiEmbeddingProvider` for `
|
|
17
|
-
`
|
|
15
|
+
`OnnxEmbeddingProvider` for `provider: 'onnx'`, an
|
|
16
|
+
`ApiEmbeddingProvider` for `provider: 'api'`, or a
|
|
17
|
+
`TfidfEmbeddingProvider` when config is undefined, or a
|
|
18
|
+
`NullEmbeddingProvider` when `provider: 'none'`. The
|
|
19
|
+
TF-IDF provider is the default when no embedding config
|
|
20
|
+
is present, enabling hybrid search without external
|
|
21
|
+
configuration.
|
|
22
|
+
|
|
23
|
+
## hashToken
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
hashToken(token: string): number
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Computes an FNV-1a hash of a string token, returning
|
|
30
|
+
a non-negative 32-bit unsigned integer. Used by
|
|
31
|
+
`TfidfEmbeddingProvider` to map tokens to fixed-size
|
|
32
|
+
vector buckets (feature hashing).
|
|
33
|
+
|
|
34
|
+
## tokenizeText
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
tokenizeText(text: string): string[]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Splits text into lowercase tokens by non-word
|
|
41
|
+
characters, filtering out tokens shorter than 3
|
|
42
|
+
characters. A simple JS tokenizer used by
|
|
43
|
+
`TfidfEmbeddingProvider` for both document and query
|
|
44
|
+
embedding.
|
|
18
45
|
|
|
19
46
|
## cosineSimilarity
|
|
20
47
|
|
|
@@ -40,11 +40,17 @@ src/shared/embedding/
|
|
|
40
40
|
|
|
41
41
|
## Providers
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
Four implementations of the `EmbeddingProvider` interface:
|
|
44
44
|
|
|
45
|
-
- **
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
- **TfidfEmbeddingProvider** -- Built-in default provider backed by
|
|
46
|
+
the `kbdb-default-embedding` WASM crate. Delegates `embed()`
|
|
47
|
+
calls to WASM exports that compute feature-hashed sublinear TF
|
|
48
|
+
vectors (256 dimensions, L2-normalized) using kbdb-shared's
|
|
49
|
+
tokenization pipeline. Zero external dependencies, zero
|
|
50
|
+
configuration. Enables hybrid search out of the box.
|
|
51
|
+
- **NullEmbeddingProvider** -- No-op provider (dimensions = 0).
|
|
52
|
+
Available for explicit use when embeddings should be fully
|
|
53
|
+
disabled.
|
|
48
54
|
- **OnnxEmbeddingProvider** -- Local inference using ONNX Runtime.
|
|
49
55
|
Loads a model from disk (e.g., `all-MiniLM-L6-v2`). Zero network
|
|
50
56
|
calls, fully offline.
|