@objectstack/knowledge-memory 17.1.0 → 17.3.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.
- package/CHANGELOG.md +386 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,391 @@
|
|
|
1
1
|
# @objectstack/knowledge-memory
|
|
2
2
|
|
|
3
|
+
## 17.3.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ad54eb3: feat(tooling): onboard all 14 `packages/plugins/**` packages into `check:test-typecheck` (#14062)
|
|
8
|
+
|
|
9
|
+
Every plugin package now has a `tsconfig.test.json` compiled by the shared
|
|
10
|
+
`check:test-typecheck` gate, and its `typecheck` script names it. Before this,
|
|
11
|
+
the shrink-only `test-typecheck-debt.json` ratchet said **nothing** about a
|
|
12
|
+
third of the repo's runtime surface: 14 packages, 1 `tsconfig.test.json`
|
|
13
|
+
(`plugin-security`, wired directly to `tsc` rather than to the instrument), and
|
|
14
|
+
0 `check:test-typecheck` scripts.
|
|
15
|
+
|
|
16
|
+
Onboarded as a family by the director ruling of 2026-09-01 on #14062
|
|
17
|
+
(maintainer verbatim: 「同意」), which also carries the #5286 maintainer
|
|
18
|
+
authority the starting ledgers need. The smaller branch triage recommended —
|
|
19
|
+
declare the instrument's scope and re-site the two compile-time pins — was
|
|
20
|
+
recorded as considered and not taken: an instrument silent over a third of the
|
|
21
|
+
runtime surface is a hole readers generalise across, and that costs more than
|
|
22
|
+
fourteen tsconfigs.
|
|
23
|
+
|
|
24
|
+
**Measured, not assumed** (at `e80889095`, workspace closure built first). Four
|
|
25
|
+
packages carry residue and therefore a starting ledger — plugin-approvals 324
|
|
26
|
+
over 8 files, plugin-auth 94 over 10, plugin-sharing 3 over 2,
|
|
27
|
+
knowledge-ragflow 3 over 1. The other ten measure **zero** and deliberately get
|
|
28
|
+
no ledger file at all: the gate reads a missing ledger as `{ entries: {} }`, so
|
|
29
|
+
any error there is red immediately with no entry to be added to — strictly
|
|
30
|
+
stronger than a ledger holding nothing, and the call `plugin-security` had
|
|
31
|
+
already recorded for itself.
|
|
32
|
+
|
|
33
|
+
⛔ **This does not repair 345 type errors.** Per ruling item 3 it makes the
|
|
34
|
+
ratchet able to *see* them; paydown follows the ratchet's own shrink-only
|
|
35
|
+
discipline on its own cards. No test file is edited here.
|
|
36
|
+
|
|
37
|
+
Two corrections to the finding's own prose, both measured: the exclusion is
|
|
38
|
+
narrower than "no plugin package compiles its tests" — 9 of the 14 already
|
|
39
|
+
compiled their tests inside the `typecheck`-invoked build config, at zero
|
|
40
|
+
errors — and `exec-context-annotation.pin.ts` is a `.pin.ts`, which
|
|
41
|
+
`**/*.test.ts` never excluded, so its directives were already live. The pin
|
|
42
|
+
this change genuinely makes real is
|
|
43
|
+
`plugin-approvals/src/manager-org-screen-parity.contract.test.ts`, which no tsc
|
|
44
|
+
program had ever read.
|
|
45
|
+
- Updated dependencies [809d417]
|
|
46
|
+
- Updated dependencies [387e231]
|
|
47
|
+
- Updated dependencies [f794e4e]
|
|
48
|
+
- Updated dependencies [cae2169]
|
|
49
|
+
- Updated dependencies [b812a54]
|
|
50
|
+
- Updated dependencies [2d4fa75]
|
|
51
|
+
- Updated dependencies [0e4e51b]
|
|
52
|
+
- Updated dependencies [e84bbf6]
|
|
53
|
+
- Updated dependencies [effae80]
|
|
54
|
+
- Updated dependencies [efb3513]
|
|
55
|
+
- Updated dependencies [d62f990]
|
|
56
|
+
- Updated dependencies [c45d8e6]
|
|
57
|
+
- Updated dependencies [2e3e8c7]
|
|
58
|
+
- Updated dependencies [e621291]
|
|
59
|
+
- Updated dependencies [655b106]
|
|
60
|
+
- Updated dependencies [40a93b5]
|
|
61
|
+
- Updated dependencies [d5b330d]
|
|
62
|
+
- Updated dependencies [dda969c]
|
|
63
|
+
- Updated dependencies [1f45690]
|
|
64
|
+
- Updated dependencies [277948f]
|
|
65
|
+
- Updated dependencies [8bdd955]
|
|
66
|
+
- Updated dependencies [f3bbbef]
|
|
67
|
+
- Updated dependencies [4f24e9d]
|
|
68
|
+
- Updated dependencies [e27583e]
|
|
69
|
+
- Updated dependencies [4bd6faa]
|
|
70
|
+
- Updated dependencies [86cbe37]
|
|
71
|
+
- Updated dependencies [6a180e4]
|
|
72
|
+
- Updated dependencies [474242f]
|
|
73
|
+
- Updated dependencies [63cd487]
|
|
74
|
+
- Updated dependencies [bd4aa4e]
|
|
75
|
+
- Updated dependencies [803eaab]
|
|
76
|
+
- Updated dependencies [f8e8f03]
|
|
77
|
+
- Updated dependencies [983edf1]
|
|
78
|
+
- Updated dependencies [eae824e]
|
|
79
|
+
- Updated dependencies [f6fa22c]
|
|
80
|
+
- Updated dependencies [8a483b3]
|
|
81
|
+
- Updated dependencies [97bcd99]
|
|
82
|
+
- Updated dependencies [df59de0]
|
|
83
|
+
- Updated dependencies [96e25a8]
|
|
84
|
+
- Updated dependencies [f75a38a]
|
|
85
|
+
- Updated dependencies [7a25e7d]
|
|
86
|
+
- Updated dependencies [1fa05a6]
|
|
87
|
+
- Updated dependencies [c85a265]
|
|
88
|
+
- Updated dependencies [dcb10a5]
|
|
89
|
+
- Updated dependencies [773a999]
|
|
90
|
+
- Updated dependencies [35dffea]
|
|
91
|
+
- Updated dependencies [d8024f0]
|
|
92
|
+
- Updated dependencies [8120808]
|
|
93
|
+
- Updated dependencies [776a098]
|
|
94
|
+
- Updated dependencies [5060877]
|
|
95
|
+
- Updated dependencies [4f6325d]
|
|
96
|
+
- Updated dependencies [52954c0]
|
|
97
|
+
- Updated dependencies [2aa8456]
|
|
98
|
+
- Updated dependencies [93809a3]
|
|
99
|
+
- Updated dependencies [7c0d0c3]
|
|
100
|
+
- Updated dependencies [daae7aa]
|
|
101
|
+
- Updated dependencies [8dc22d6]
|
|
102
|
+
- Updated dependencies [279431e]
|
|
103
|
+
- Updated dependencies [948dd6b]
|
|
104
|
+
- Updated dependencies [3b4c56c]
|
|
105
|
+
- Updated dependencies [ae8edd2]
|
|
106
|
+
- Updated dependencies [e25403c]
|
|
107
|
+
- Updated dependencies [64baa68]
|
|
108
|
+
- Updated dependencies [9fa70d7]
|
|
109
|
+
- Updated dependencies [09db64a]
|
|
110
|
+
- Updated dependencies [92916e7]
|
|
111
|
+
- Updated dependencies [a84f3ea]
|
|
112
|
+
- Updated dependencies [f2eaae8]
|
|
113
|
+
- Updated dependencies [c09451b]
|
|
114
|
+
- Updated dependencies [ba64877]
|
|
115
|
+
- Updated dependencies [e7191ce]
|
|
116
|
+
- Updated dependencies [7345308]
|
|
117
|
+
- Updated dependencies [79b6a22]
|
|
118
|
+
- Updated dependencies [30d96ab]
|
|
119
|
+
- Updated dependencies [f658793]
|
|
120
|
+
- Updated dependencies [c95ad19]
|
|
121
|
+
- Updated dependencies [e58ea8b]
|
|
122
|
+
- Updated dependencies [4a17645]
|
|
123
|
+
- Updated dependencies [3795c5f]
|
|
124
|
+
- Updated dependencies [8ab926b]
|
|
125
|
+
- Updated dependencies [7317cf2]
|
|
126
|
+
- Updated dependencies [e25e839]
|
|
127
|
+
- Updated dependencies [5997207]
|
|
128
|
+
- Updated dependencies [8b13cc8]
|
|
129
|
+
- Updated dependencies [4a4a35d]
|
|
130
|
+
- Updated dependencies [86e765a]
|
|
131
|
+
- Updated dependencies [1d7e76a]
|
|
132
|
+
- Updated dependencies [53dc739]
|
|
133
|
+
- Updated dependencies [fd289be]
|
|
134
|
+
- Updated dependencies [03bf7b1]
|
|
135
|
+
- Updated dependencies [f90e820]
|
|
136
|
+
- Updated dependencies [18d816a]
|
|
137
|
+
- Updated dependencies [e8bd715]
|
|
138
|
+
- Updated dependencies [b91c351]
|
|
139
|
+
- Updated dependencies [a28a3c0]
|
|
140
|
+
- Updated dependencies [daeaaf9]
|
|
141
|
+
- Updated dependencies [c459da6]
|
|
142
|
+
- Updated dependencies [e914733]
|
|
143
|
+
- Updated dependencies [f887e52]
|
|
144
|
+
- Updated dependencies [881f8d8]
|
|
145
|
+
- Updated dependencies [3bfa1e6]
|
|
146
|
+
- Updated dependencies [0a8ebf3]
|
|
147
|
+
- Updated dependencies [901355c]
|
|
148
|
+
- Updated dependencies [34ce8e7]
|
|
149
|
+
- Updated dependencies [33681ea]
|
|
150
|
+
- Updated dependencies [4635f3e]
|
|
151
|
+
- Updated dependencies [fd289be]
|
|
152
|
+
- Updated dependencies [ee3595c]
|
|
153
|
+
- Updated dependencies [b2eab95]
|
|
154
|
+
- Updated dependencies [93940d4]
|
|
155
|
+
- Updated dependencies [3a04b01]
|
|
156
|
+
- Updated dependencies [45b9051]
|
|
157
|
+
- Updated dependencies [b9e9227]
|
|
158
|
+
- Updated dependencies [d395692]
|
|
159
|
+
- Updated dependencies [5894d30]
|
|
160
|
+
- Updated dependencies [a3765f6]
|
|
161
|
+
- Updated dependencies [2d5cee3]
|
|
162
|
+
- Updated dependencies [e22158f]
|
|
163
|
+
- Updated dependencies [7404925]
|
|
164
|
+
- Updated dependencies [0c2334f]
|
|
165
|
+
- Updated dependencies [778c59f]
|
|
166
|
+
- Updated dependencies [d2619fd]
|
|
167
|
+
- Updated dependencies [af56546]
|
|
168
|
+
- Updated dependencies [6acb11a]
|
|
169
|
+
- Updated dependencies [33c5fd3]
|
|
170
|
+
- Updated dependencies [20b0fdb]
|
|
171
|
+
- Updated dependencies [905019b]
|
|
172
|
+
- Updated dependencies [a286411]
|
|
173
|
+
- Updated dependencies [98c0d33]
|
|
174
|
+
- Updated dependencies [368a82e]
|
|
175
|
+
- Updated dependencies [a3d5724]
|
|
176
|
+
- Updated dependencies [93ea19b]
|
|
177
|
+
- Updated dependencies [9ee2dcf]
|
|
178
|
+
- Updated dependencies [8cb96ec]
|
|
179
|
+
- Updated dependencies [8f10a79]
|
|
180
|
+
- Updated dependencies [6269a55]
|
|
181
|
+
- Updated dependencies [a17da05]
|
|
182
|
+
- Updated dependencies [a8c00e2]
|
|
183
|
+
- Updated dependencies [0fb8760]
|
|
184
|
+
- Updated dependencies [e5ce2ed]
|
|
185
|
+
- Updated dependencies [be21955]
|
|
186
|
+
- Updated dependencies [bc56e18]
|
|
187
|
+
- Updated dependencies [be21955]
|
|
188
|
+
- Updated dependencies [a9ee989]
|
|
189
|
+
- Updated dependencies [4d0d944]
|
|
190
|
+
- Updated dependencies [15d58db]
|
|
191
|
+
- Updated dependencies [d63b014]
|
|
192
|
+
- Updated dependencies [9abe4e4]
|
|
193
|
+
- Updated dependencies [2cc7122]
|
|
194
|
+
- Updated dependencies [50d6c92]
|
|
195
|
+
- Updated dependencies [9e0ba21]
|
|
196
|
+
- Updated dependencies [311433f]
|
|
197
|
+
- Updated dependencies [3e5ad08]
|
|
198
|
+
- Updated dependencies [9abe4e4]
|
|
199
|
+
- Updated dependencies [b7131f3]
|
|
200
|
+
- Updated dependencies [e5812fa]
|
|
201
|
+
- Updated dependencies [7085f90]
|
|
202
|
+
- Updated dependencies [dee4dd4]
|
|
203
|
+
- Updated dependencies [ce7e497]
|
|
204
|
+
- Updated dependencies [51ecb2f]
|
|
205
|
+
- Updated dependencies [9086761]
|
|
206
|
+
- Updated dependencies [42a117b]
|
|
207
|
+
- Updated dependencies [1401ae7]
|
|
208
|
+
- Updated dependencies [4297fe7]
|
|
209
|
+
- Updated dependencies [e398863]
|
|
210
|
+
- Updated dependencies [d16df74]
|
|
211
|
+
- Updated dependencies [f11fc61]
|
|
212
|
+
- Updated dependencies [e808890]
|
|
213
|
+
- Updated dependencies [8f79379]
|
|
214
|
+
- Updated dependencies [e6ca40e]
|
|
215
|
+
- Updated dependencies [0c77ea4]
|
|
216
|
+
- Updated dependencies [52954c0]
|
|
217
|
+
- Updated dependencies [89eb997]
|
|
218
|
+
- Updated dependencies [7131f12]
|
|
219
|
+
- Updated dependencies [aa5994e]
|
|
220
|
+
- Updated dependencies [be93457]
|
|
221
|
+
- Updated dependencies [a65db76]
|
|
222
|
+
- Updated dependencies [15eb2c9]
|
|
223
|
+
- Updated dependencies [5691b07]
|
|
224
|
+
- Updated dependencies [2a6122b]
|
|
225
|
+
- Updated dependencies [225e769]
|
|
226
|
+
- Updated dependencies [8af88dd]
|
|
227
|
+
- Updated dependencies [fb5fbb8]
|
|
228
|
+
- Updated dependencies [d7b3963]
|
|
229
|
+
- Updated dependencies [33184fd]
|
|
230
|
+
- Updated dependencies [7c41693]
|
|
231
|
+
- Updated dependencies [b72db01]
|
|
232
|
+
- Updated dependencies [dce5cd4]
|
|
233
|
+
- Updated dependencies [9688f58]
|
|
234
|
+
- Updated dependencies [556ebc1]
|
|
235
|
+
- Updated dependencies [177ebdc]
|
|
236
|
+
- Updated dependencies [8d237b4]
|
|
237
|
+
- Updated dependencies [2d2e6f0]
|
|
238
|
+
- Updated dependencies [2d8dd8d]
|
|
239
|
+
- Updated dependencies [22d573e]
|
|
240
|
+
- Updated dependencies [b5a2398]
|
|
241
|
+
- Updated dependencies [348860c]
|
|
242
|
+
- Updated dependencies [5383fa6]
|
|
243
|
+
- Updated dependencies [5b3ff63]
|
|
244
|
+
- Updated dependencies [1a6a19c]
|
|
245
|
+
- Updated dependencies [527e050]
|
|
246
|
+
- Updated dependencies [dd33bf9]
|
|
247
|
+
- Updated dependencies [4cb2a90]
|
|
248
|
+
- Updated dependencies [74a7804]
|
|
249
|
+
- Updated dependencies [53d3689]
|
|
250
|
+
- Updated dependencies [b3a63d3]
|
|
251
|
+
- Updated dependencies [49f0dcf]
|
|
252
|
+
- Updated dependencies [033a34c]
|
|
253
|
+
- Updated dependencies [4d25d22]
|
|
254
|
+
- Updated dependencies [1ffee51]
|
|
255
|
+
- Updated dependencies [5ae4303]
|
|
256
|
+
- Updated dependencies [ece4dad]
|
|
257
|
+
- Updated dependencies [e9b377e]
|
|
258
|
+
- Updated dependencies [146f448]
|
|
259
|
+
- Updated dependencies [735f5c7]
|
|
260
|
+
- Updated dependencies [a7e18de]
|
|
261
|
+
- Updated dependencies [366f895]
|
|
262
|
+
- Updated dependencies [dc75ba8]
|
|
263
|
+
- Updated dependencies [cce0aa9]
|
|
264
|
+
- Updated dependencies [e764507]
|
|
265
|
+
- Updated dependencies [cff17af]
|
|
266
|
+
- Updated dependencies [39404f3]
|
|
267
|
+
- Updated dependencies [ca1965f]
|
|
268
|
+
- Updated dependencies [8619f95]
|
|
269
|
+
- Updated dependencies [b706af9]
|
|
270
|
+
- Updated dependencies [8422acd]
|
|
271
|
+
- Updated dependencies [add4360]
|
|
272
|
+
- Updated dependencies [fc9ba76]
|
|
273
|
+
- Updated dependencies [0f94cc7]
|
|
274
|
+
- Updated dependencies [a11c1a5]
|
|
275
|
+
- Updated dependencies [71f9cd1]
|
|
276
|
+
- Updated dependencies [ee17d86]
|
|
277
|
+
- Updated dependencies [cdbd920]
|
|
278
|
+
- Updated dependencies [18c432e]
|
|
279
|
+
- Updated dependencies [3c418c4]
|
|
280
|
+
- Updated dependencies [fa8715a]
|
|
281
|
+
- Updated dependencies [a933ed7]
|
|
282
|
+
- Updated dependencies [b3ca463]
|
|
283
|
+
- Updated dependencies [a933ed7]
|
|
284
|
+
- Updated dependencies [0d4a6a8]
|
|
285
|
+
- Updated dependencies [518d5e5]
|
|
286
|
+
- Updated dependencies [6643ba1]
|
|
287
|
+
- Updated dependencies [eeba2ef]
|
|
288
|
+
- Updated dependencies [ec4c4d2]
|
|
289
|
+
- Updated dependencies [424f73c]
|
|
290
|
+
- Updated dependencies [cccbe51]
|
|
291
|
+
- Updated dependencies [a8d6b1d]
|
|
292
|
+
- Updated dependencies [e4a7695]
|
|
293
|
+
- Updated dependencies [87075b1]
|
|
294
|
+
- Updated dependencies [fc58a99]
|
|
295
|
+
- Updated dependencies [14cfc00]
|
|
296
|
+
- Updated dependencies [1c6f7b4]
|
|
297
|
+
- Updated dependencies [e854a53]
|
|
298
|
+
- Updated dependencies [dfebfc8]
|
|
299
|
+
- Updated dependencies [d028b37]
|
|
300
|
+
- Updated dependencies [f7b25c5]
|
|
301
|
+
- Updated dependencies [122ef38]
|
|
302
|
+
- Updated dependencies [4a37870]
|
|
303
|
+
- Updated dependencies [428f9b2]
|
|
304
|
+
- Updated dependencies [aa7ff56]
|
|
305
|
+
- Updated dependencies [c41b42e]
|
|
306
|
+
- Updated dependencies [c4db311]
|
|
307
|
+
- Updated dependencies [750fff5]
|
|
308
|
+
- Updated dependencies [c19035e]
|
|
309
|
+
- Updated dependencies [ececf7a]
|
|
310
|
+
- Updated dependencies [d173125]
|
|
311
|
+
- Updated dependencies [8eeca27]
|
|
312
|
+
- Updated dependencies [8425c17]
|
|
313
|
+
- Updated dependencies [a5ef1d8]
|
|
314
|
+
- Updated dependencies [772d5de]
|
|
315
|
+
- Updated dependencies [ce80ec2]
|
|
316
|
+
- Updated dependencies [b372318]
|
|
317
|
+
- Updated dependencies [97a2263]
|
|
318
|
+
- Updated dependencies [29d0676]
|
|
319
|
+
- Updated dependencies [0169d49]
|
|
320
|
+
- Updated dependencies [6bd3231]
|
|
321
|
+
- Updated dependencies [d2b5ba8]
|
|
322
|
+
- Updated dependencies [b799ac5]
|
|
323
|
+
- Updated dependencies [8f74307]
|
|
324
|
+
- Updated dependencies [d23dc08]
|
|
325
|
+
- Updated dependencies [644ad50]
|
|
326
|
+
- Updated dependencies [0da7cd2]
|
|
327
|
+
- Updated dependencies [28a5c3e]
|
|
328
|
+
- Updated dependencies [4bc18e5]
|
|
329
|
+
- @objectstack/spec@17.3.0
|
|
330
|
+
- @objectstack/core@17.3.0
|
|
331
|
+
- @objectstack/service-knowledge@17.3.0
|
|
332
|
+
|
|
333
|
+
## 17.2.0
|
|
334
|
+
|
|
335
|
+
### Patch Changes
|
|
336
|
+
|
|
337
|
+
- Updated dependencies [6936d07]
|
|
338
|
+
- Updated dependencies [59eb04d]
|
|
339
|
+
- Updated dependencies [9f05b7d]
|
|
340
|
+
- Updated dependencies [3b2af5e]
|
|
341
|
+
- Updated dependencies [7d2d112]
|
|
342
|
+
- Updated dependencies [5fa0d72]
|
|
343
|
+
- Updated dependencies [7bf3fb7]
|
|
344
|
+
- Updated dependencies [02b3b07]
|
|
345
|
+
- Updated dependencies [914c413]
|
|
346
|
+
- Updated dependencies [55809a0]
|
|
347
|
+
- Updated dependencies [ee2ff45]
|
|
348
|
+
- Updated dependencies [47cd3ec]
|
|
349
|
+
- Updated dependencies [52db1d1]
|
|
350
|
+
- Updated dependencies [5649efb]
|
|
351
|
+
- Updated dependencies [9d7d2de]
|
|
352
|
+
- Updated dependencies [c815c50]
|
|
353
|
+
- Updated dependencies [795ea05]
|
|
354
|
+
- Updated dependencies [2306a76]
|
|
355
|
+
- Updated dependencies [e5ea701]
|
|
356
|
+
- Updated dependencies [a40dcc1]
|
|
357
|
+
- Updated dependencies [def0d3e]
|
|
358
|
+
- Updated dependencies [8d0bb79]
|
|
359
|
+
- Updated dependencies [5acb58d]
|
|
360
|
+
- Updated dependencies [e222a53]
|
|
361
|
+
- Updated dependencies [2e3cf95]
|
|
362
|
+
- Updated dependencies [4c93387]
|
|
363
|
+
- Updated dependencies [504c8d5]
|
|
364
|
+
- Updated dependencies [a037f7c]
|
|
365
|
+
- Updated dependencies [6d5c4fa]
|
|
366
|
+
- Updated dependencies [3ee8ddf]
|
|
367
|
+
- Updated dependencies [16cef97]
|
|
368
|
+
- Updated dependencies [a79bd35]
|
|
369
|
+
- Updated dependencies [6ceaa4b]
|
|
370
|
+
- Updated dependencies [15ea214]
|
|
371
|
+
- Updated dependencies [de19489]
|
|
372
|
+
- Updated dependencies [c684d00]
|
|
373
|
+
- Updated dependencies [923c424]
|
|
374
|
+
- Updated dependencies [1ec36b7]
|
|
375
|
+
- Updated dependencies [5f2e54c]
|
|
376
|
+
- Updated dependencies [189373b]
|
|
377
|
+
- Updated dependencies [35ad101]
|
|
378
|
+
- Updated dependencies [ceb33a9]
|
|
379
|
+
- Updated dependencies [73d9795]
|
|
380
|
+
- Updated dependencies [8012960]
|
|
381
|
+
- Updated dependencies [f34f56b]
|
|
382
|
+
- Updated dependencies [f399618]
|
|
383
|
+
- Updated dependencies [75e9301]
|
|
384
|
+
- Updated dependencies [2810695]
|
|
385
|
+
- @objectstack/spec@17.2.0
|
|
386
|
+
- @objectstack/core@17.2.0
|
|
387
|
+
- @objectstack/service-knowledge@17.2.0
|
|
388
|
+
|
|
3
389
|
## 17.1.0
|
|
4
390
|
|
|
5
391
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -35,7 +35,7 @@ interface KnowledgeMemoryPluginOptions {
|
|
|
35
35
|
declare class KnowledgeMemoryPlugin implements Plugin {
|
|
36
36
|
name: string;
|
|
37
37
|
version: string;
|
|
38
|
-
type:
|
|
38
|
+
type: "standard";
|
|
39
39
|
private readonly adapter;
|
|
40
40
|
constructor(opts?: KnowledgeMemoryPluginOptions);
|
|
41
41
|
init(_ctx: PluginContext): Promise<void>;
|
package/dist/index.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ interface KnowledgeMemoryPluginOptions {
|
|
|
35
35
|
declare class KnowledgeMemoryPlugin implements Plugin {
|
|
36
36
|
name: string;
|
|
37
37
|
version: string;
|
|
38
|
-
type:
|
|
38
|
+
type: "standard";
|
|
39
39
|
private readonly adapter;
|
|
40
40
|
constructor(opts?: KnowledgeMemoryPluginOptions);
|
|
41
41
|
init(_ctx: PluginContext): Promise<void>;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type {\n IKnowledgeAdapter,\n IKnowledgeService,\n AdapterContext,\n AdapterSearchOptions,\n} from '@objectstack/spec/contracts';\nimport type {\n KnowledgeDocument,\n KnowledgeHit,\n} from '@objectstack/spec/ai';\nimport { KNOWLEDGE_SERVICE } from '@objectstack/spec/contracts';\n\n/**\n * In-memory knowledge adapter. Stores per-source document maps,\n * chunks documents naively on paragraph boundaries (with a soft 800-char\n * cap), embeds each chunk as a sparse token-frequency vector, and\n * answers `search()` via brute-force cosine similarity.\n *\n * Deterministic — same input always produces the same hits — so it's\n * great for tests and reference implementations. **Don't use in prod.**\n */\nexport class KnowledgeMemoryAdapter implements IKnowledgeAdapter {\n readonly id: string;\n private readonly store = new Map<string, ChunkRecord[]>();\n\n constructor(id = 'memory') {\n this.id = id;\n }\n\n async upsert(docs: KnowledgeDocument[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const existing = this.store.get(sourceId) ?? [];\n const byDoc = new Map<string, ChunkRecord[]>();\n for (const c of existing) {\n const arr = byDoc.get(c.documentId) ?? [];\n arr.push(c);\n byDoc.set(c.documentId, arr);\n }\n for (const doc of docs) {\n byDoc.set(doc.id, chunkAndEmbed(doc));\n }\n this.store.set(sourceId, Array.from(byDoc.values()).flat());\n }\n\n async delete(documentIds: string[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const chunks = this.store.get(sourceId);\n if (!chunks) return;\n const dropSet = new Set(documentIds);\n this.store.set(\n sourceId,\n chunks.filter((c) => !dropSet.has(c.documentId)),\n );\n }\n\n async search(query: string, opts: AdapterSearchOptions): Promise<KnowledgeHit[]> {\n const chunks = this.store.get(opts.source.id) ?? [];\n if (chunks.length === 0) return [];\n const qVec = embedTokens(tokenize(query));\n const qNorm = vectorNorm(qVec);\n if (qNorm === 0) return [];\n\n const filter = opts.filter ?? {};\n const filtered = Object.keys(filter).length\n ? chunks.filter((c) => matchesFilter(c.metadata, filter))\n : chunks;\n\n const scored = filtered.map((c) => ({\n chunk: c,\n score: cosineSimilarity(qVec, c.vector, qNorm, c.vectorNorm),\n }));\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, opts.topK).filter((s) => s.score > 0);\n return top.map<KnowledgeHit>(({ chunk, score }) => ({\n chunkId: chunk.chunkId,\n documentId: chunk.documentId,\n sourceId: opts.source.id,\n sourceRecordId: chunk.sourceRecordId,\n score,\n snippet: chunk.content,\n title: chunk.title,\n metadata: chunk.metadata,\n }));\n }\n\n async healthCheck(): Promise<{ ok: boolean; message?: string }> {\n return { ok: true, message: `memory adapter (${this.store.size} sources)` };\n }\n}\n\ninterface ChunkRecord {\n chunkId: string;\n documentId: string;\n sourceRecordId?: string;\n content: string;\n title?: string;\n metadata: Record<string, unknown>;\n vector: Map<string, number>;\n vectorNorm: number;\n}\n\nconst CHUNK_TARGET = 800;\n\nfunction chunkAndEmbed(doc: KnowledgeDocument): ChunkRecord[] {\n const paragraphs = doc.content\n .split(/\\n{2,}/)\n .map((p) => p.trim())\n .filter(Boolean);\n const chunks: string[] = [];\n let buf = '';\n for (const p of paragraphs.length ? paragraphs : [doc.content]) {\n if (buf && buf.length + p.length + 2 > CHUNK_TARGET) {\n chunks.push(buf);\n buf = '';\n }\n if (p.length > CHUNK_TARGET) {\n if (buf) {\n chunks.push(buf);\n buf = '';\n }\n for (let i = 0; i < p.length; i += CHUNK_TARGET) {\n chunks.push(p.slice(i, i + CHUNK_TARGET));\n }\n } else {\n buf = buf ? `${buf}\\n\\n${p}` : p;\n }\n }\n if (buf) chunks.push(buf);\n return chunks.map((content, idx) => {\n const vec = embedTokens(tokenize(content));\n return {\n chunkId: `${doc.id}#${idx}`,\n documentId: doc.id,\n sourceRecordId: doc.sourceRecordId,\n content,\n title: doc.title,\n metadata: doc.metadata ?? {},\n vector: vec,\n vectorNorm: vectorNorm(vec),\n };\n });\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9\\u4e00-\\u9fff]+/i)\n .filter((t) => t.length > 1);\n}\n\nfunction embedTokens(tokens: string[]): Map<string, number> {\n const vec = new Map<string, number>();\n for (const t of tokens) vec.set(t, (vec.get(t) ?? 0) + 1);\n return vec;\n}\n\nfunction vectorNorm(v: Map<string, number>): number {\n let s = 0;\n for (const x of v.values()) s += x * x;\n return Math.sqrt(s);\n}\n\nfunction cosineSimilarity(\n a: Map<string, number>,\n b: Map<string, number>,\n aNorm = vectorNorm(a),\n bNorm = vectorNorm(b),\n): number {\n if (aNorm === 0 || bNorm === 0) return 0;\n // iterate smaller map\n const [small, big] = a.size < b.size ? [a, b] : [b, a];\n let dot = 0;\n for (const [k, v] of small) {\n const w = big.get(k);\n if (w) dot += v * w;\n }\n return dot / (aNorm * bNorm);\n}\n\nfunction matchesFilter(\n metadata: Record<string, unknown>,\n filter: Record<string, unknown>,\n): boolean {\n for (const [k, v] of Object.entries(filter)) {\n if (metadata[k] !== v) return false;\n }\n return true;\n}\n\n/* ---------------------------------------------------------------- */\n/* Kernel plugin glue */\n/* ---------------------------------------------------------------- */\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\n\nexport interface KnowledgeMemoryPluginOptions {\n /** Adapter id. @default 'memory' */\n id?: string;\n}\n\n/**\n * `KnowledgeMemoryPlugin` — registers a `KnowledgeMemoryAdapter` with\n * the host's `IKnowledgeService` during `start()`.\n */\nexport class KnowledgeMemoryPlugin implements Plugin {\n name = 'com.objectstack.plugin.knowledge-memory';\n version = '0.1.0';\n type = 'standard';\n\n private readonly adapter: KnowledgeMemoryAdapter;\n\n constructor(opts: KnowledgeMemoryPluginOptions = {}) {\n this.adapter = new KnowledgeMemoryAdapter(opts.id ?? 'memory');\n }\n\n async init(_ctx: PluginContext): Promise<void> {\n // No-op: registration happens in start() once IKnowledgeService is up.\n }\n\n async start(ctx: PluginContext): Promise<void> {\n let svc: IKnowledgeService | undefined;\n try {\n svc = ctx.getService<IKnowledgeService>(KNOWLEDGE_SERVICE);\n } catch {\n ctx.logger.warn?.(\n 'KnowledgeMemoryPlugin: IKnowledgeService not registered — install KnowledgeServicePlugin first.',\n );\n return;\n }\n svc.registerAdapter(this.adapter.id, this.adapter);\n ctx.logger.info?.(`KnowledgeMemoryPlugin: adapter '${this.adapter.id}' registered.`);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type {\n IKnowledgeAdapter,\n IKnowledgeService,\n AdapterContext,\n AdapterSearchOptions,\n} from '@objectstack/spec/contracts';\nimport type {\n KnowledgeDocument,\n KnowledgeHit,\n} from '@objectstack/spec/ai';\nimport { KNOWLEDGE_SERVICE } from '@objectstack/spec/contracts';\n\n/**\n * In-memory knowledge adapter. Stores per-source document maps,\n * chunks documents naively on paragraph boundaries (with a soft 800-char\n * cap), embeds each chunk as a sparse token-frequency vector, and\n * answers `search()` via brute-force cosine similarity.\n *\n * Deterministic — same input always produces the same hits — so it's\n * great for tests and reference implementations. **Don't use in prod.**\n */\nexport class KnowledgeMemoryAdapter implements IKnowledgeAdapter {\n readonly id: string;\n private readonly store = new Map<string, ChunkRecord[]>();\n\n constructor(id = 'memory') {\n this.id = id;\n }\n\n async upsert(docs: KnowledgeDocument[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const existing = this.store.get(sourceId) ?? [];\n const byDoc = new Map<string, ChunkRecord[]>();\n for (const c of existing) {\n const arr = byDoc.get(c.documentId) ?? [];\n arr.push(c);\n byDoc.set(c.documentId, arr);\n }\n for (const doc of docs) {\n byDoc.set(doc.id, chunkAndEmbed(doc));\n }\n this.store.set(sourceId, Array.from(byDoc.values()).flat());\n }\n\n async delete(documentIds: string[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const chunks = this.store.get(sourceId);\n if (!chunks) return;\n const dropSet = new Set(documentIds);\n this.store.set(\n sourceId,\n chunks.filter((c) => !dropSet.has(c.documentId)),\n );\n }\n\n async search(query: string, opts: AdapterSearchOptions): Promise<KnowledgeHit[]> {\n const chunks = this.store.get(opts.source.id) ?? [];\n if (chunks.length === 0) return [];\n const qVec = embedTokens(tokenize(query));\n const qNorm = vectorNorm(qVec);\n if (qNorm === 0) return [];\n\n const filter = opts.filter ?? {};\n const filtered = Object.keys(filter).length\n ? chunks.filter((c) => matchesFilter(c.metadata, filter))\n : chunks;\n\n const scored = filtered.map((c) => ({\n chunk: c,\n score: cosineSimilarity(qVec, c.vector, qNorm, c.vectorNorm),\n }));\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, opts.topK).filter((s) => s.score > 0);\n return top.map<KnowledgeHit>(({ chunk, score }) => ({\n chunkId: chunk.chunkId,\n documentId: chunk.documentId,\n sourceId: opts.source.id,\n sourceRecordId: chunk.sourceRecordId,\n score,\n snippet: chunk.content,\n title: chunk.title,\n metadata: chunk.metadata,\n }));\n }\n\n async healthCheck(): Promise<{ ok: boolean; message?: string }> {\n return { ok: true, message: `memory adapter (${this.store.size} sources)` };\n }\n}\n\ninterface ChunkRecord {\n chunkId: string;\n documentId: string;\n sourceRecordId?: string;\n content: string;\n title?: string;\n metadata: Record<string, unknown>;\n vector: Map<string, number>;\n vectorNorm: number;\n}\n\nconst CHUNK_TARGET = 800;\n\nfunction chunkAndEmbed(doc: KnowledgeDocument): ChunkRecord[] {\n const paragraphs = doc.content\n .split(/\\n{2,}/)\n .map((p) => p.trim())\n .filter(Boolean);\n const chunks: string[] = [];\n let buf = '';\n for (const p of paragraphs.length ? paragraphs : [doc.content]) {\n if (buf && buf.length + p.length + 2 > CHUNK_TARGET) {\n chunks.push(buf);\n buf = '';\n }\n if (p.length > CHUNK_TARGET) {\n if (buf) {\n chunks.push(buf);\n buf = '';\n }\n for (let i = 0; i < p.length; i += CHUNK_TARGET) {\n chunks.push(p.slice(i, i + CHUNK_TARGET));\n }\n } else {\n buf = buf ? `${buf}\\n\\n${p}` : p;\n }\n }\n if (buf) chunks.push(buf);\n return chunks.map((content, idx) => {\n const vec = embedTokens(tokenize(content));\n return {\n chunkId: `${doc.id}#${idx}`,\n documentId: doc.id,\n sourceRecordId: doc.sourceRecordId,\n content,\n title: doc.title,\n metadata: doc.metadata ?? {},\n vector: vec,\n vectorNorm: vectorNorm(vec),\n };\n });\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9\\u4e00-\\u9fff]+/i)\n .filter((t) => t.length > 1);\n}\n\nfunction embedTokens(tokens: string[]): Map<string, number> {\n const vec = new Map<string, number>();\n for (const t of tokens) vec.set(t, (vec.get(t) ?? 0) + 1);\n return vec;\n}\n\nfunction vectorNorm(v: Map<string, number>): number {\n let s = 0;\n for (const x of v.values()) s += x * x;\n return Math.sqrt(s);\n}\n\nfunction cosineSimilarity(\n a: Map<string, number>,\n b: Map<string, number>,\n aNorm = vectorNorm(a),\n bNorm = vectorNorm(b),\n): number {\n if (aNorm === 0 || bNorm === 0) return 0;\n // iterate smaller map\n const [small, big] = a.size < b.size ? [a, b] : [b, a];\n let dot = 0;\n for (const [k, v] of small) {\n const w = big.get(k);\n if (w) dot += v * w;\n }\n return dot / (aNorm * bNorm);\n}\n\nfunction matchesFilter(\n metadata: Record<string, unknown>,\n filter: Record<string, unknown>,\n): boolean {\n for (const [k, v] of Object.entries(filter)) {\n if (metadata[k] !== v) return false;\n }\n return true;\n}\n\n/* ---------------------------------------------------------------- */\n/* Kernel plugin glue */\n/* ---------------------------------------------------------------- */\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\n\nexport interface KnowledgeMemoryPluginOptions {\n /** Adapter id. @default 'memory' */\n id?: string;\n}\n\n/**\n * `KnowledgeMemoryPlugin` — registers a `KnowledgeMemoryAdapter` with\n * the host's `IKnowledgeService` during `start()`.\n */\nexport class KnowledgeMemoryPlugin implements Plugin {\n name = 'com.objectstack.plugin.knowledge-memory';\n version = '0.1.0';\n type = 'standard' as const;\n\n private readonly adapter: KnowledgeMemoryAdapter;\n\n constructor(opts: KnowledgeMemoryPluginOptions = {}) {\n this.adapter = new KnowledgeMemoryAdapter(opts.id ?? 'memory');\n }\n\n async init(_ctx: PluginContext): Promise<void> {\n // No-op: registration happens in start() once IKnowledgeService is up.\n }\n\n async start(ctx: PluginContext): Promise<void> {\n let svc: IKnowledgeService | undefined;\n try {\n svc = ctx.getService<IKnowledgeService>(KNOWLEDGE_SERVICE);\n } catch {\n ctx.logger.warn?.(\n 'KnowledgeMemoryPlugin: IKnowledgeService not registered — install KnowledgeServicePlugin first.',\n );\n return;\n }\n svc.registerAdapter(this.adapter.id, this.adapter);\n ctx.logger.info?.(`KnowledgeMemoryPlugin: adapter '${this.adapter.id}' registered.`);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type {\n IKnowledgeAdapter,\n IKnowledgeService,\n AdapterContext,\n AdapterSearchOptions,\n} from '@objectstack/spec/contracts';\nimport type {\n KnowledgeDocument,\n KnowledgeHit,\n} from '@objectstack/spec/ai';\nimport { KNOWLEDGE_SERVICE } from '@objectstack/spec/contracts';\n\n/**\n * In-memory knowledge adapter. Stores per-source document maps,\n * chunks documents naively on paragraph boundaries (with a soft 800-char\n * cap), embeds each chunk as a sparse token-frequency vector, and\n * answers `search()` via brute-force cosine similarity.\n *\n * Deterministic — same input always produces the same hits — so it's\n * great for tests and reference implementations. **Don't use in prod.**\n */\nexport class KnowledgeMemoryAdapter implements IKnowledgeAdapter {\n readonly id: string;\n private readonly store = new Map<string, ChunkRecord[]>();\n\n constructor(id = 'memory') {\n this.id = id;\n }\n\n async upsert(docs: KnowledgeDocument[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const existing = this.store.get(sourceId) ?? [];\n const byDoc = new Map<string, ChunkRecord[]>();\n for (const c of existing) {\n const arr = byDoc.get(c.documentId) ?? [];\n arr.push(c);\n byDoc.set(c.documentId, arr);\n }\n for (const doc of docs) {\n byDoc.set(doc.id, chunkAndEmbed(doc));\n }\n this.store.set(sourceId, Array.from(byDoc.values()).flat());\n }\n\n async delete(documentIds: string[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const chunks = this.store.get(sourceId);\n if (!chunks) return;\n const dropSet = new Set(documentIds);\n this.store.set(\n sourceId,\n chunks.filter((c) => !dropSet.has(c.documentId)),\n );\n }\n\n async search(query: string, opts: AdapterSearchOptions): Promise<KnowledgeHit[]> {\n const chunks = this.store.get(opts.source.id) ?? [];\n if (chunks.length === 0) return [];\n const qVec = embedTokens(tokenize(query));\n const qNorm = vectorNorm(qVec);\n if (qNorm === 0) return [];\n\n const filter = opts.filter ?? {};\n const filtered = Object.keys(filter).length\n ? chunks.filter((c) => matchesFilter(c.metadata, filter))\n : chunks;\n\n const scored = filtered.map((c) => ({\n chunk: c,\n score: cosineSimilarity(qVec, c.vector, qNorm, c.vectorNorm),\n }));\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, opts.topK).filter((s) => s.score > 0);\n return top.map<KnowledgeHit>(({ chunk, score }) => ({\n chunkId: chunk.chunkId,\n documentId: chunk.documentId,\n sourceId: opts.source.id,\n sourceRecordId: chunk.sourceRecordId,\n score,\n snippet: chunk.content,\n title: chunk.title,\n metadata: chunk.metadata,\n }));\n }\n\n async healthCheck(): Promise<{ ok: boolean; message?: string }> {\n return { ok: true, message: `memory adapter (${this.store.size} sources)` };\n }\n}\n\ninterface ChunkRecord {\n chunkId: string;\n documentId: string;\n sourceRecordId?: string;\n content: string;\n title?: string;\n metadata: Record<string, unknown>;\n vector: Map<string, number>;\n vectorNorm: number;\n}\n\nconst CHUNK_TARGET = 800;\n\nfunction chunkAndEmbed(doc: KnowledgeDocument): ChunkRecord[] {\n const paragraphs = doc.content\n .split(/\\n{2,}/)\n .map((p) => p.trim())\n .filter(Boolean);\n const chunks: string[] = [];\n let buf = '';\n for (const p of paragraphs.length ? paragraphs : [doc.content]) {\n if (buf && buf.length + p.length + 2 > CHUNK_TARGET) {\n chunks.push(buf);\n buf = '';\n }\n if (p.length > CHUNK_TARGET) {\n if (buf) {\n chunks.push(buf);\n buf = '';\n }\n for (let i = 0; i < p.length; i += CHUNK_TARGET) {\n chunks.push(p.slice(i, i + CHUNK_TARGET));\n }\n } else {\n buf = buf ? `${buf}\\n\\n${p}` : p;\n }\n }\n if (buf) chunks.push(buf);\n return chunks.map((content, idx) => {\n const vec = embedTokens(tokenize(content));\n return {\n chunkId: `${doc.id}#${idx}`,\n documentId: doc.id,\n sourceRecordId: doc.sourceRecordId,\n content,\n title: doc.title,\n metadata: doc.metadata ?? {},\n vector: vec,\n vectorNorm: vectorNorm(vec),\n };\n });\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9\\u4e00-\\u9fff]+/i)\n .filter((t) => t.length > 1);\n}\n\nfunction embedTokens(tokens: string[]): Map<string, number> {\n const vec = new Map<string, number>();\n for (const t of tokens) vec.set(t, (vec.get(t) ?? 0) + 1);\n return vec;\n}\n\nfunction vectorNorm(v: Map<string, number>): number {\n let s = 0;\n for (const x of v.values()) s += x * x;\n return Math.sqrt(s);\n}\n\nfunction cosineSimilarity(\n a: Map<string, number>,\n b: Map<string, number>,\n aNorm = vectorNorm(a),\n bNorm = vectorNorm(b),\n): number {\n if (aNorm === 0 || bNorm === 0) return 0;\n // iterate smaller map\n const [small, big] = a.size < b.size ? [a, b] : [b, a];\n let dot = 0;\n for (const [k, v] of small) {\n const w = big.get(k);\n if (w) dot += v * w;\n }\n return dot / (aNorm * bNorm);\n}\n\nfunction matchesFilter(\n metadata: Record<string, unknown>,\n filter: Record<string, unknown>,\n): boolean {\n for (const [k, v] of Object.entries(filter)) {\n if (metadata[k] !== v) return false;\n }\n return true;\n}\n\n/* ---------------------------------------------------------------- */\n/* Kernel plugin glue */\n/* ---------------------------------------------------------------- */\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\n\nexport interface KnowledgeMemoryPluginOptions {\n /** Adapter id. @default 'memory' */\n id?: string;\n}\n\n/**\n * `KnowledgeMemoryPlugin` — registers a `KnowledgeMemoryAdapter` with\n * the host's `IKnowledgeService` during `start()`.\n */\nexport class KnowledgeMemoryPlugin implements Plugin {\n name = 'com.objectstack.plugin.knowledge-memory';\n version = '0.1.0';\n type = 'standard';\n\n private readonly adapter: KnowledgeMemoryAdapter;\n\n constructor(opts: KnowledgeMemoryPluginOptions = {}) {\n this.adapter = new KnowledgeMemoryAdapter(opts.id ?? 'memory');\n }\n\n async init(_ctx: PluginContext): Promise<void> {\n // No-op: registration happens in start() once IKnowledgeService is up.\n }\n\n async start(ctx: PluginContext): Promise<void> {\n let svc: IKnowledgeService | undefined;\n try {\n svc = ctx.getService<IKnowledgeService>(KNOWLEDGE_SERVICE);\n } catch {\n ctx.logger.warn?.(\n 'KnowledgeMemoryPlugin: IKnowledgeService not registered — install KnowledgeServicePlugin first.',\n );\n return;\n }\n svc.registerAdapter(this.adapter.id, this.adapter);\n ctx.logger.info?.(`KnowledgeMemoryPlugin: adapter '${this.adapter.id}' registered.`);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type {\n IKnowledgeAdapter,\n IKnowledgeService,\n AdapterContext,\n AdapterSearchOptions,\n} from '@objectstack/spec/contracts';\nimport type {\n KnowledgeDocument,\n KnowledgeHit,\n} from '@objectstack/spec/ai';\nimport { KNOWLEDGE_SERVICE } from '@objectstack/spec/contracts';\n\n/**\n * In-memory knowledge adapter. Stores per-source document maps,\n * chunks documents naively on paragraph boundaries (with a soft 800-char\n * cap), embeds each chunk as a sparse token-frequency vector, and\n * answers `search()` via brute-force cosine similarity.\n *\n * Deterministic — same input always produces the same hits — so it's\n * great for tests and reference implementations. **Don't use in prod.**\n */\nexport class KnowledgeMemoryAdapter implements IKnowledgeAdapter {\n readonly id: string;\n private readonly store = new Map<string, ChunkRecord[]>();\n\n constructor(id = 'memory') {\n this.id = id;\n }\n\n async upsert(docs: KnowledgeDocument[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const existing = this.store.get(sourceId) ?? [];\n const byDoc = new Map<string, ChunkRecord[]>();\n for (const c of existing) {\n const arr = byDoc.get(c.documentId) ?? [];\n arr.push(c);\n byDoc.set(c.documentId, arr);\n }\n for (const doc of docs) {\n byDoc.set(doc.id, chunkAndEmbed(doc));\n }\n this.store.set(sourceId, Array.from(byDoc.values()).flat());\n }\n\n async delete(documentIds: string[], ctx: AdapterContext): Promise<void> {\n const sourceId = ctx.source.id;\n const chunks = this.store.get(sourceId);\n if (!chunks) return;\n const dropSet = new Set(documentIds);\n this.store.set(\n sourceId,\n chunks.filter((c) => !dropSet.has(c.documentId)),\n );\n }\n\n async search(query: string, opts: AdapterSearchOptions): Promise<KnowledgeHit[]> {\n const chunks = this.store.get(opts.source.id) ?? [];\n if (chunks.length === 0) return [];\n const qVec = embedTokens(tokenize(query));\n const qNorm = vectorNorm(qVec);\n if (qNorm === 0) return [];\n\n const filter = opts.filter ?? {};\n const filtered = Object.keys(filter).length\n ? chunks.filter((c) => matchesFilter(c.metadata, filter))\n : chunks;\n\n const scored = filtered.map((c) => ({\n chunk: c,\n score: cosineSimilarity(qVec, c.vector, qNorm, c.vectorNorm),\n }));\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, opts.topK).filter((s) => s.score > 0);\n return top.map<KnowledgeHit>(({ chunk, score }) => ({\n chunkId: chunk.chunkId,\n documentId: chunk.documentId,\n sourceId: opts.source.id,\n sourceRecordId: chunk.sourceRecordId,\n score,\n snippet: chunk.content,\n title: chunk.title,\n metadata: chunk.metadata,\n }));\n }\n\n async healthCheck(): Promise<{ ok: boolean; message?: string }> {\n return { ok: true, message: `memory adapter (${this.store.size} sources)` };\n }\n}\n\ninterface ChunkRecord {\n chunkId: string;\n documentId: string;\n sourceRecordId?: string;\n content: string;\n title?: string;\n metadata: Record<string, unknown>;\n vector: Map<string, number>;\n vectorNorm: number;\n}\n\nconst CHUNK_TARGET = 800;\n\nfunction chunkAndEmbed(doc: KnowledgeDocument): ChunkRecord[] {\n const paragraphs = doc.content\n .split(/\\n{2,}/)\n .map((p) => p.trim())\n .filter(Boolean);\n const chunks: string[] = [];\n let buf = '';\n for (const p of paragraphs.length ? paragraphs : [doc.content]) {\n if (buf && buf.length + p.length + 2 > CHUNK_TARGET) {\n chunks.push(buf);\n buf = '';\n }\n if (p.length > CHUNK_TARGET) {\n if (buf) {\n chunks.push(buf);\n buf = '';\n }\n for (let i = 0; i < p.length; i += CHUNK_TARGET) {\n chunks.push(p.slice(i, i + CHUNK_TARGET));\n }\n } else {\n buf = buf ? `${buf}\\n\\n${p}` : p;\n }\n }\n if (buf) chunks.push(buf);\n return chunks.map((content, idx) => {\n const vec = embedTokens(tokenize(content));\n return {\n chunkId: `${doc.id}#${idx}`,\n documentId: doc.id,\n sourceRecordId: doc.sourceRecordId,\n content,\n title: doc.title,\n metadata: doc.metadata ?? {},\n vector: vec,\n vectorNorm: vectorNorm(vec),\n };\n });\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9\\u4e00-\\u9fff]+/i)\n .filter((t) => t.length > 1);\n}\n\nfunction embedTokens(tokens: string[]): Map<string, number> {\n const vec = new Map<string, number>();\n for (const t of tokens) vec.set(t, (vec.get(t) ?? 0) + 1);\n return vec;\n}\n\nfunction vectorNorm(v: Map<string, number>): number {\n let s = 0;\n for (const x of v.values()) s += x * x;\n return Math.sqrt(s);\n}\n\nfunction cosineSimilarity(\n a: Map<string, number>,\n b: Map<string, number>,\n aNorm = vectorNorm(a),\n bNorm = vectorNorm(b),\n): number {\n if (aNorm === 0 || bNorm === 0) return 0;\n // iterate smaller map\n const [small, big] = a.size < b.size ? [a, b] : [b, a];\n let dot = 0;\n for (const [k, v] of small) {\n const w = big.get(k);\n if (w) dot += v * w;\n }\n return dot / (aNorm * bNorm);\n}\n\nfunction matchesFilter(\n metadata: Record<string, unknown>,\n filter: Record<string, unknown>,\n): boolean {\n for (const [k, v] of Object.entries(filter)) {\n if (metadata[k] !== v) return false;\n }\n return true;\n}\n\n/* ---------------------------------------------------------------- */\n/* Kernel plugin glue */\n/* ---------------------------------------------------------------- */\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\n\nexport interface KnowledgeMemoryPluginOptions {\n /** Adapter id. @default 'memory' */\n id?: string;\n}\n\n/**\n * `KnowledgeMemoryPlugin` — registers a `KnowledgeMemoryAdapter` with\n * the host's `IKnowledgeService` during `start()`.\n */\nexport class KnowledgeMemoryPlugin implements Plugin {\n name = 'com.objectstack.plugin.knowledge-memory';\n version = '0.1.0';\n type = 'standard' as const;\n\n private readonly adapter: KnowledgeMemoryAdapter;\n\n constructor(opts: KnowledgeMemoryPluginOptions = {}) {\n this.adapter = new KnowledgeMemoryAdapter(opts.id ?? 'memory');\n }\n\n async init(_ctx: PluginContext): Promise<void> {\n // No-op: registration happens in start() once IKnowledgeService is up.\n }\n\n async start(ctx: PluginContext): Promise<void> {\n let svc: IKnowledgeService | undefined;\n try {\n svc = ctx.getService<IKnowledgeService>(KNOWLEDGE_SERVICE);\n } catch {\n ctx.logger.warn?.(\n 'KnowledgeMemoryPlugin: IKnowledgeService not registered — install KnowledgeServicePlugin first.',\n );\n return;\n }\n svc.registerAdapter(this.adapter.id, this.adapter);\n ctx.logger.info?.(`KnowledgeMemoryPlugin: adapter '${this.adapter.id}' registered.`);\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/knowledge-memory",
|
|
3
|
-
"version": "17.
|
|
3
|
+
"version": "17.3.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "In-memory knowledge adapter for ObjectStack (dev / test reference implementation).",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,12 +13,13 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@objectstack/core": "17.
|
|
17
|
-
"@objectstack/service-knowledge": "17.
|
|
18
|
-
"@objectstack/spec": "17.
|
|
16
|
+
"@objectstack/core": "17.3.0",
|
|
17
|
+
"@objectstack/service-knowledge": "17.3.0",
|
|
18
|
+
"@objectstack/spec": "17.3.0"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@types/node": "^26.2.0",
|
|
22
|
+
"tsx": "^4.23.12",
|
|
22
23
|
"typescript": "^6.0.3",
|
|
23
24
|
"vitest": "^4.1.10"
|
|
24
25
|
},
|
|
@@ -35,9 +36,10 @@
|
|
|
35
36
|
"CHANGELOG.md"
|
|
36
37
|
],
|
|
37
38
|
"scripts": {
|
|
38
|
-
"build": "tsup --config ../../../tsup.config.ts",
|
|
39
|
+
"build": "tsup --config ../../../tsup.config.ts && node ../../../scripts/check-dts-emitted.mjs",
|
|
39
40
|
"dev": "tsc -w",
|
|
40
41
|
"test": "vitest run",
|
|
41
|
-
"typecheck": "tsc --noEmit"
|
|
42
|
+
"typecheck": "tsc --noEmit && pnpm check:test-typecheck",
|
|
43
|
+
"check:test-typecheck": "tsx ../../../scripts/check-test-typecheck.mts --self-test && tsx ../../../scripts/check-test-typecheck.mts --package packages/plugins/knowledge-memory --project tsconfig.test.json"
|
|
42
44
|
}
|
|
43
45
|
}
|