@dikolab/kbdb 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +30 -9
  2. package/dist/cli.cjs +181 -50
  3. package/dist/cli.cjs.map +3 -3
  4. package/dist/cli.mjs +181 -50
  5. package/dist/cli.mjs.map +3 -3
  6. package/dist/kbdb-worker.cjs +283 -29
  7. package/dist/kbdb-worker.cjs.map +4 -4
  8. package/dist/mod.cjs +13 -2
  9. package/dist/mod.cjs.map +2 -2
  10. package/dist/mod.mjs +13 -2
  11. package/dist/mod.mjs.map +2 -2
  12. package/dist/src/shared/cli/functions/format-output.function.d.ts +7 -7
  13. package/dist/src/shared/cli/functions/run-search.function.d.ts +25 -16
  14. package/dist/src/shared/cli/index.d.ts +1 -1
  15. package/dist/src/shared/cli/typings/cli-options.interface.d.ts +2 -0
  16. package/dist/src/shared/cli/typings/search-display.model.d.ts +25 -7
  17. package/dist/src/shared/mcp/functions/handle-recall.function.d.ts +29 -0
  18. package/dist/src/shared/mcp/typings/mcp-client.interface.d.ts +30 -11
  19. package/dist/src/shared/version/constants/version.constant.d.ts +1 -1
  20. package/dist/src/shared/wasm-codec/functions/decode-recall-result.function.d.ts +28 -0
  21. package/dist/src/shared/wasm-codec/functions/decode-scored-results.function.d.ts +14 -7
  22. package/dist/src/shared/wasm-codec/functions/encode-recall-params.function.d.ts +21 -0
  23. package/dist/src/shared/wasm-codec/functions/encode-search-params.function.d.ts +1 -1
  24. package/dist/src/shared/wasm-codec/index.d.ts +5 -2
  25. package/dist/src/shared/worker-client/classes/worker-client.class.d.ts +13 -3
  26. package/dist/src/shared/worker-client/index.d.ts +2 -1
  27. package/dist/src/shared/worker-client/typings/recall-result.model.d.ts +94 -0
  28. package/dist/src/shared/worker-client/typings/search-params.model.d.ts +2 -0
  29. package/dist/src/shared/worker-client/typings/search-result.model.d.ts +23 -7
  30. package/dist/src/shared/worker-daemon/classes/worker-daemon.class.d.ts +1 -0
  31. package/dist/wasm/fs-database/kbdb_fs_database.d.ts +18 -0
  32. package/dist/wasm/fs-database/kbdb_fs_database.js +30 -0
  33. package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  34. package/dist/wasm/fs-database/kbdb_fs_database_bg.wasm.d.ts +2 -0
  35. package/dist/wasm/kb-worker/kbdb_worker.d.ts +38 -0
  36. package/dist/wasm/kb-worker/kbdb_worker.js +56 -0
  37. package/dist/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
  38. package/dist/wasm/kb-worker/kbdb_worker_bg.wasm.d.ts +3 -0
  39. package/dist/worker.mjs +283 -29
  40. package/dist/worker.mjs.map +4 -4
  41. package/docs/details/README.md +26 -0
  42. package/docs/details/cli.md +608 -0
  43. package/docs/details/library-api.md +406 -0
  44. package/docs/details/mcp-server.md +430 -0
  45. package/docs/details/search-and-ranking.md +457 -0
  46. package/docs/details/storage.md +529 -0
  47. package/docs/goals/agents.md +751 -0
  48. package/docs/goals/architecture.svg +198 -0
  49. package/docs/goals/cli.md +2308 -0
  50. package/docs/goals/content-composer.md +609 -0
  51. package/docs/goals/content-parser.md +279 -0
  52. package/docs/goals/database.md +1452 -0
  53. package/docs/goals/document.md +368 -0
  54. package/docs/goals/mcp.md +1467 -0
  55. package/docs/goals/overview.md +124 -0
  56. package/docs/goals/query-parser.md +271 -0
  57. package/docs/goals/query-result.md +693 -0
  58. package/docs/goals/skills.md +738 -0
  59. package/docs/goals/worker-client.md +944 -0
  60. package/docs/goals/worker-daemon.md +1447 -0
  61. package/docs/modules/overview.md +298 -0
  62. package/docs/modules/rust/fs-database/functions/document.md +48 -0
  63. package/docs/modules/rust/fs-database/functions/integrity.md +68 -0
  64. package/docs/modules/rust/fs-database/functions/io.md +87 -0
  65. package/docs/modules/rust/fs-database/functions/module.md +22 -0
  66. package/docs/modules/rust/fs-database/functions/query-exec.md +44 -0
  67. package/docs/modules/rust/fs-database/functions/section.md +59 -0
  68. package/docs/modules/rust/fs-database/indexes/btree.md +35 -0
  69. package/docs/modules/rust/fs-database/indexes/corpus.md +61 -0
  70. package/docs/modules/rust/fs-database/indexes/inverted.md +60 -0
  71. package/docs/modules/rust/fs-database/indexes/module.md +64 -0
  72. package/docs/modules/rust/fs-database/indexes/positional.md +39 -0
  73. package/docs/modules/rust/fs-database/module.md +149 -0
  74. package/docs/modules/rust/fs-database/types/catalog.md +53 -0
  75. package/docs/modules/rust/fs-database/types/module.md +12 -0
  76. package/docs/modules/rust/fs-database/types/section.md +101 -0
  77. package/docs/modules/rust/kb-worker/functions/compose.md +57 -0
  78. package/docs/modules/rust/kb-worker/functions/module.md +20 -0
  79. package/docs/modules/rust/kb-worker/functions/retrieve.md +194 -0
  80. package/docs/modules/rust/kb-worker/functions/search.md +173 -0
  81. package/docs/modules/rust/kb-worker/functions/write.md +172 -0
  82. package/docs/modules/rust/kb-worker/module.md +171 -0
  83. package/docs/modules/rust/kb-worker/types/cache.md +90 -0
  84. package/docs/modules/rust/kb-worker/types/context.md +26 -0
  85. package/docs/modules/rust/kb-worker/types/module.md +16 -0
  86. package/docs/modules/rust/kb-worker/types/status.md +29 -0
  87. package/docs/modules/rust/kb-worker/types/token.md +50 -0
  88. package/docs/modules/rust/overview.md +495 -0
  89. package/docs/modules/rust/query-parser/functions/extract.md +56 -0
  90. package/docs/modules/rust/query-parser/functions/module.md +16 -0
  91. package/docs/modules/rust/query-parser/functions/parse.md +33 -0
  92. package/docs/modules/rust/query-parser/functions/pipeline.md +103 -0
  93. package/docs/modules/rust/query-parser/functions/rank.md +85 -0
  94. package/docs/modules/rust/query-parser/module.md +136 -0
  95. package/docs/modules/rust/query-parser/types/cache.md +39 -0
  96. package/docs/modules/rust/query-parser/types/keyphrase.md +60 -0
  97. package/docs/modules/rust/query-parser/types/module.md +17 -0
  98. package/docs/modules/rust/query-parser/types/token.md +42 -0
  99. package/docs/modules/rust/shared/content-composer/functions.md +114 -0
  100. package/docs/modules/rust/shared/content-composer/module.md +147 -0
  101. package/docs/modules/rust/shared/content-composer/types.md +93 -0
  102. package/docs/modules/rust/shared/content-parser/functions.md +72 -0
  103. package/docs/modules/rust/shared/content-parser/module.md +99 -0
  104. package/docs/modules/rust/shared/content-parser/types.md +71 -0
  105. package/docs/modules/rust/shared/corpus/module.md +24 -0
  106. package/docs/modules/rust/shared/corpus/types.md +141 -0
  107. package/docs/modules/rust/shared/document/module.md +25 -0
  108. package/docs/modules/rust/shared/document/types.md +154 -0
  109. package/docs/modules/rust/shared/encode/module.md +22 -0
  110. package/docs/modules/rust/shared/encode/traits.md +304 -0
  111. package/docs/modules/rust/shared/error/module.md +28 -0
  112. package/docs/modules/rust/shared/error/types.md +302 -0
  113. package/docs/modules/rust/shared/kbid/module.md +24 -0
  114. package/docs/modules/rust/shared/kbid/types.md +147 -0
  115. package/docs/modules/rust/shared/memory/functions.md +209 -0
  116. package/docs/modules/rust/shared/memory/module.md +24 -0
  117. package/docs/modules/rust/shared/module.md +168 -0
  118. package/docs/modules/rust/shared/query/module.md +27 -0
  119. package/docs/modules/rust/shared/query/types.md +236 -0
  120. package/docs/modules/rust/shared/section/module.md +25 -0
  121. package/docs/modules/rust/shared/section/types.md +294 -0
  122. package/docs/modules/rust/shared/term/module.md +25 -0
  123. package/docs/modules/rust/shared/term/types.md +139 -0
  124. package/docs/modules/typescript/cli.md +129 -0
  125. package/docs/modules/typescript/kbdb-worker.md +135 -0
  126. package/docs/modules/typescript/overview.md +378 -0
  127. package/docs/modules/typescript/shared/cli/constants.md +23 -0
  128. package/docs/modules/typescript/shared/cli/functions.md +630 -0
  129. package/docs/modules/typescript/shared/cli/module.md +125 -0
  130. package/docs/modules/typescript/shared/cli/typings.md +172 -0
  131. package/docs/modules/typescript/shared/hash/functions.md +20 -0
  132. package/docs/modules/typescript/shared/hash/module.md +21 -0
  133. package/docs/modules/typescript/shared/mcp/classes.md +179 -0
  134. package/docs/modules/typescript/shared/mcp/functions.md +386 -0
  135. package/docs/modules/typescript/shared/mcp/module.md +160 -0
  136. package/docs/modules/typescript/shared/mcp/typings.md +522 -0
  137. package/docs/modules/typescript/shared/module.md +94 -0
  138. package/docs/modules/typescript/shared/platform/functions.md +42 -0
  139. package/docs/modules/typescript/shared/platform/module.md +25 -0
  140. package/docs/modules/typescript/shared/runtime/functions.md +26 -0
  141. package/docs/modules/typescript/shared/runtime/module.md +27 -0
  142. package/docs/modules/typescript/shared/runtime/typings.md +13 -0
  143. package/docs/modules/typescript/shared/version/module.md +27 -0
  144. package/docs/modules/typescript/shared/wasm-codec/functions.md +391 -0
  145. package/docs/modules/typescript/shared/wasm-codec/module.md +98 -0
  146. package/docs/modules/typescript/shared/worker-client/classes.md +264 -0
  147. package/docs/modules/typescript/shared/worker-client/functions.md +175 -0
  148. package/docs/modules/typescript/shared/worker-client/module.md +84 -0
  149. package/docs/modules/typescript/shared/worker-client/typings.md +508 -0
  150. package/docs/modules/typescript/shared/worker-daemon/classes.md +239 -0
  151. package/docs/modules/typescript/shared/worker-daemon/constants.md +37 -0
  152. package/docs/modules/typescript/shared/worker-daemon/functions.md +221 -0
  153. package/docs/modules/typescript/shared/worker-daemon/module.md +112 -0
  154. package/docs/modules/typescript/shared/worker-daemon/typings.md +126 -0
  155. package/docs/overview.md +188 -0
  156. package/docs/release-notes/0.1.0.md +189 -0
  157. package/docs/release-notes/0.1.1.md +46 -0
  158. package/docs/release-notes/0.1.2.md +38 -0
  159. package/docs/release-notes/0.1.3.md +42 -0
  160. package/docs/release-notes/0.2.0.md +147 -0
  161. package/docs/release-notes/README.md +9 -0
  162. package/package.json +8 -2
  163. package/src/shared/cli/functions/dispatch-command.function.ts +3 -3
  164. package/src/shared/cli/functions/format-output.function.ts +41 -34
  165. package/src/shared/cli/functions/parse-args.function.ts +7 -0
  166. package/src/shared/cli/functions/run-search.function.ts +53 -27
  167. package/src/shared/cli/index.ts +4 -1
  168. package/src/shared/cli/typings/cli-options.interface.ts +2 -0
  169. package/src/shared/cli/typings/search-display.model.ts +26 -7
  170. package/src/shared/mcp/functions/create-tool-definitions.function.ts +64 -4
  171. package/src/shared/mcp/functions/handle-recall.function.ts +66 -0
  172. package/src/shared/mcp/functions/handle-tool-call.function.ts +11 -1
  173. package/src/shared/mcp/typings/mcp-client.interface.ts +33 -15
  174. package/src/shared/version/constants/version.constant.ts +1 -1
  175. package/src/shared/wasm-codec/functions/decode-recall-result.function.ts +267 -0
  176. package/src/shared/wasm-codec/functions/decode-scored-results.function.ts +81 -27
  177. package/src/shared/wasm-codec/functions/encode-recall-params.function.ts +68 -0
  178. package/src/shared/wasm-codec/functions/encode-search-params.function.ts +4 -1
  179. package/src/shared/wasm-codec/index.ts +11 -3
  180. package/src/shared/worker-client/classes/worker-client.class.ts +24 -4
  181. package/src/shared/worker-client/index.ts +11 -1
  182. package/src/shared/worker-client/typings/recall-result.model.ts +98 -0
  183. package/src/shared/worker-client/typings/search-params.model.ts +2 -0
  184. package/src/shared/worker-client/typings/search-result.model.ts +24 -7
  185. package/src/shared/worker-daemon/classes/worker-daemon.class.ts +25 -4
  186. package/src/wasm/fs-database/kbdb_fs_database.d.ts +18 -0
  187. package/src/wasm/fs-database/kbdb_fs_database.js +30 -0
  188. package/src/wasm/fs-database/kbdb_fs_database_bg.wasm +0 -0
  189. package/src/wasm/fs-database/kbdb_fs_database_bg.wasm.d.ts +2 -0
  190. package/src/wasm/kb-worker/kbdb_worker.d.ts +38 -0
  191. package/src/wasm/kb-worker/kbdb_worker.js +56 -0
  192. package/src/wasm/kb-worker/kbdb_worker_bg.wasm +0 -0
  193. package/src/wasm/kb-worker/kbdb_worker_bg.wasm.d.ts +3 -0
@@ -0,0 +1,279 @@
1
+ # Content Parser -- Marker Extraction
2
+
3
+ *A format-agnostic parser that extracts embedding
4
+ and link markers from section content, producing
5
+ structured reference lists for result set
6
+ resolution.*
7
+
8
+ ## Goal
9
+
10
+ The content parser scans any text-based content for
11
+ `$(type: value)` markers and returns a structured
12
+ list of extracted references. It is the engine
13
+ behind the `references` field in retrieval and
14
+ search result sets -- given a section's content, it
15
+ identifies every embedded or linked section and
16
+ document so the caller can resolve them.
17
+
18
+ The parser is **format-agnostic**. It recognizes the
19
+ `$(type: value)` escape sequence regardless of the
20
+ surrounding text format -- markdown, source code,
21
+ plain text, or any other UTF-8 content. The marker
22
+ syntax is independent of the host format.
23
+
24
+ See [Document](document.md) for marker syntax and
25
+ semantics (what each marker type means, how it
26
+ renders). This document specifies the **extraction
27
+ mechanism** -- how markers are found in text and
28
+ returned as structured data.
29
+
30
+ ## Input
31
+
32
+ The parser accepts any **UTF-8 string**. This
33
+ includes:
34
+
35
+ - **Text section content** -- markdown body text
36
+ (the primary use case).
37
+ - **Code section content** -- raw source code. Code
38
+ sections may contain markers in comments or string
39
+ literals (though uncommon).
40
+ - **Plain text** -- any unstructured text.
41
+
42
+ Image sections (`image/*`) contain base64-encoded
43
+ binary data and cannot contain markers. The caller
44
+ should skip image sections -- the parser would find
45
+ no markers in base64 content.
46
+
47
+ ## Output
48
+
49
+ The parser returns an ordered list of extracted
50
+ markers. Each marker is a structured record:
51
+
52
+ ```rust
53
+ pub struct ExtractedContentMarker {
54
+ /// The marker category (Image, Code, Text, etc).
55
+ pub marker_type: ContentMarkerType,
56
+ /// The value inside the marker (kb-id or doc-id).
57
+ pub value: String,
58
+ /// Byte offset of the marker start (`$`) in the
59
+ /// original text.
60
+ pub offset: usize,
61
+ /// Byte length of the entire marker, including
62
+ /// the `$(` and `)` delimiters.
63
+ pub length: usize,
64
+ }
65
+
66
+ pub enum ContentMarkerType {
67
+ /// `$(image: {kbid})` -- image section embedding.
68
+ Image,
69
+ /// `$(code: {kbid})` -- code section embedding.
70
+ Code,
71
+ /// `$(text: {kbid})` -- text section embedding.
72
+ Text,
73
+ /// `$(document: {docid})` -- document embedding.
74
+ Document,
75
+ /// `$(link: {kbid})` -- section cross-reference.
76
+ Link,
77
+ /// `$(doc-link: {docid})` -- document
78
+ /// cross-reference.
79
+ DocLink,
80
+ }
81
+ ```
82
+
83
+ Markers are returned in **document order** -- the
84
+ order they appear in the input text, from lowest to
85
+ highest byte offset.
86
+
87
+ ## Extraction Rules
88
+
89
+ The parser uses the same syntax rules defined in
90
+ [Document](document.md):
91
+
92
+ 1. A marker starts with `$(` and ends with the next
93
+ `)`.
94
+ 2. The type identifier is matched against the six
95
+ recognized prefixes:
96
+ - `$(image:` -> `ContentMarkerType::Image`
97
+ - `$(code:` -> `ContentMarkerType::Code`
98
+ - `$(text:` -> `ContentMarkerType::Text`
99
+ - `$(document:` -> `ContentMarkerType::Document`
100
+ - `$(link:` -> `ContentMarkerType::Link`
101
+ - `$(doc-link:` -> `ContentMarkerType::DocLink`
102
+ 3. Unrecognized prefixes (e.g. `$(formula:`) are
103
+ **skipped** -- no `ExtractedContentMarker` is produced.
104
+ 4. Unclosed markers (no closing `)` before end of
105
+ input) are **skipped**.
106
+ 5. The value is the text between the colon-space
107
+ and the closing `)`, trimmed of leading and
108
+ trailing whitespace.
109
+
110
+ The parser performs a single left-to-right scan
111
+ of the input. It does not modify the input text.
112
+
113
+ ## API
114
+
115
+ Two public functions in the `kbdb-shared` crate:
116
+
117
+ ### `extract_content_markers`
118
+
119
+ ```rust
120
+ pub fn extract_content_markers(text: &str)
121
+ -> Vec<ExtractedContentMarker>
122
+ ```
123
+
124
+ Scans the input text and returns all recognized
125
+ markers in document order. Does not modify the
126
+ input. Returns an empty `Vec` if no markers are
127
+ found.
128
+
129
+ ### `strip_content_markers`
130
+
131
+ ```rust
132
+ pub fn strip_content_markers(text: &str) -> String
133
+ ```
134
+
135
+ Returns a new string with all recognized markers
136
+ removed. Whitespace left by marker removal is
137
+ preserved; the caller should normalise whitespace
138
+ if needed.
139
+
140
+ This function replaces the current implementation
141
+ in `query-parser/src/pipeline/markers.rs`. The
142
+ existing `strip_content_markers()` recognizes only
143
+ `$(image:)` and `$(code:)`. The shared version
144
+ recognizes all six marker types.
145
+
146
+ Both functions share the same scanning logic
147
+ internally. `strip_content_markers` is equivalent to
148
+ removing every character range identified by
149
+ `extract_content_markers`.
150
+
151
+ ## Recursive Resolution
152
+
153
+ The parser itself is **non-recursive**. It performs
154
+ a single-pass extraction on one text string and
155
+ returns the markers found in that string. It does
156
+ not follow references or read other sections.
157
+
158
+ **Recursive reference resolution** -- following
159
+ `$(text: {kbid})` and `$(document: {docid})`
160
+ markers into their content to collect transitive
161
+ references -- is the responsibility of the
162
+ **caller**. The typical caller is the `kb-worker`
163
+ orchestration crate, which:
164
+
165
+ 1. Receives a section's content.
166
+ 2. Calls `extract_content_markers()` to find direct
167
+ references.
168
+ 3. Fetches each referenced section or document.
169
+ 4. For `$(text:)` and `$(document:)` references,
170
+ calls `extract_content_markers()` on the referenced
171
+ content (recursing).
172
+ 5. Collects all unique references into a flat
173
+ `references` array.
174
+ 6. Uses a **visited set** to detect and break
175
+ circular references (see
176
+ [Document -- Recursion](document.md#recursion-and-circular-references)).
177
+
178
+ The parser provides the building block; the
179
+ orchestration layer provides the recursion.
180
+
181
+ ## Integration Points
182
+
183
+ ### Query Parser
184
+
185
+ The `query-parser` crate imports `strip_content_markers()`
186
+ from `kbdb-shared` for tokenization Pipeline
187
+ Stage 1. This replaces the crate's earlier
188
+ `strip_content_markers()` in `pipeline/markers.rs`, which
189
+ recognized only `$(image:)` and `$(code:)`. The
190
+ shared version recognizes all six marker types.
191
+
192
+ See [Query Parser](query-parser.md) for the full
193
+ tokenization pipeline.
194
+
195
+ ### Filesystem Database
196
+
197
+ The `fs-database` crate imports
198
+ `extract_content_markers()` from `kbdb-shared` for
199
+ **integrity checking**. When validating a section's
200
+ content, the integrity checker extracts all markers
201
+ and verifies that each referenced kb-id or doc-id
202
+ exists and has the expected type.
203
+
204
+ See [Database -- Integrity](database.md) for the
205
+ full integrity specification.
206
+
207
+ ### Worker Orchestration
208
+
209
+ The `kb-worker` crate imports `extract_content_markers()`
210
+ from `kbdb-shared` to build the `references` array
211
+ in result sets. When a search or retrieval request
212
+ returns sections, `kb-worker`:
213
+
214
+ 1. Scans each returned section's content with
215
+ `extract_content_markers()`.
216
+ 2. Collects unique kb-ids and doc-ids.
217
+ 3. Fetches the referenced sections and documents.
218
+ 4. Recurses into `$(text:)` and `$(document:)`
219
+ references to collect transitive references.
220
+ 5. Deduplicates and returns the flat `references`
221
+ array alongside the primary result data.
222
+
223
+ ## Crate Placement
224
+
225
+ The parser lives in the `kbdb-shared` rlib crate
226
+ as a `content_parser` module:
227
+
228
+ ```
229
+ engine/crates/shared/src/
230
+ content-parser/
231
+ mod.rs -- re-exports
232
+ types.rs -- ContentMarkerType, ExtractedContentMarker
233
+ extract.rs -- extract_content_markers()
234
+ strip.rs -- strip_content_markers()
235
+ ```
236
+
237
+ Added to `lib.rs` as `pub mod content_parser` alongside the
238
+ existing modules (memory, encode, kbid, term,
239
+ section, document, query, corpus, error).
240
+
241
+ The `kbdb-shared` crate is an rlib (not a cdylib),
242
+ so it produces no WASM artifact of its own. Its code
243
+ is compiled into whichever cdylib crate imports it
244
+ (`query-parser`, `fs-database`, `kb-worker`), with
245
+ unused code eliminated per-consumer.
246
+
247
+ ## Testing
248
+
249
+ Unit tests for `extract_content_markers()`:
250
+
251
+ - Empty input returns empty vec.
252
+ - Single `$(image: {kbid})` returns one marker with
253
+ correct type, value, offset, and length.
254
+ - All six marker types recognized individually.
255
+ - Multiple markers in sequence, returned in
256
+ document order.
257
+ - Adjacent markers with no space between them.
258
+ - Unrecognized `$(formula: ...)` produces no marker.
259
+ - Unclosed marker (no `)`) produces no marker.
260
+ - Unicode text surrounding markers -- offsets are
261
+ byte-accurate.
262
+ - Marker-only input (no surrounding text).
263
+ - Whitespace variations inside markers (e.g.
264
+ extra spaces after colon).
265
+
266
+ Unit tests for `strip_content_markers()`:
267
+
268
+ - Empty input returns empty string.
269
+ - Plain text with no markers returns unchanged.
270
+ - All six marker types stripped.
271
+ - Multiple markers stripped in one pass.
272
+ - Unrecognized markers left untouched.
273
+ - Unclosed markers left untouched.
274
+ - Unicode text preserved around stripped markers.
275
+
276
+ Tests live in the `kbdb-shared` crate:
277
+ `engine/crates/shared/src/content-parser/extract.rs` and
278
+ `engine/crates/shared/src/content-parser/strip.rs` (inline
279
+ `#[cfg(test)]` modules).