@chatcops/core 0.4.0 → 0.6.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 (243) hide show
  1. package/dist/agent/chat.d.ts +13 -0
  2. package/dist/agent/chat.d.ts.map +1 -0
  3. package/dist/agent/chat.js +42 -0
  4. package/dist/agent/chat.js.map +1 -0
  5. package/dist/agent/errors.d.ts +14 -0
  6. package/dist/agent/errors.d.ts.map +1 -0
  7. package/dist/agent/errors.js +24 -0
  8. package/dist/agent/errors.js.map +1 -0
  9. package/dist/agent/index.d.ts +5 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +5 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/run-turn.d.ts +79 -0
  14. package/dist/agent/run-turn.d.ts.map +1 -0
  15. package/dist/agent/run-turn.js +400 -0
  16. package/dist/agent/run-turn.js.map +1 -0
  17. package/dist/agent/tool-registry.d.ts +30 -0
  18. package/dist/agent/tool-registry.d.ts.map +1 -0
  19. package/dist/agent/tool-registry.js +66 -0
  20. package/dist/agent/tool-registry.js.map +1 -0
  21. package/dist/analytics/collector.d.ts +2 -0
  22. package/dist/analytics/collector.d.ts.map +1 -1
  23. package/dist/analytics/collector.js +16 -10
  24. package/dist/analytics/collector.js.map +1 -1
  25. package/dist/analytics/index.d.ts +2 -0
  26. package/dist/analytics/index.d.ts.map +1 -1
  27. package/dist/analytics/index.js +2 -0
  28. package/dist/analytics/index.js.map +1 -1
  29. package/dist/analytics/names.d.ts +21 -0
  30. package/dist/analytics/names.d.ts.map +1 -0
  31. package/dist/analytics/names.js +41 -0
  32. package/dist/analytics/names.js.map +1 -0
  33. package/dist/analytics/sink.d.ts +27 -0
  34. package/dist/analytics/sink.d.ts.map +1 -0
  35. package/dist/analytics/sink.js +109 -0
  36. package/dist/analytics/sink.js.map +1 -0
  37. package/dist/conversation/index.d.ts +1 -0
  38. package/dist/conversation/index.d.ts.map +1 -1
  39. package/dist/conversation/index.js.map +1 -1
  40. package/dist/conversation/manager.d.ts +65 -6
  41. package/dist/conversation/manager.d.ts.map +1 -1
  42. package/dist/conversation/manager.js +110 -34
  43. package/dist/conversation/manager.js.map +1 -1
  44. package/dist/conversation/store.d.ts +6 -5
  45. package/dist/conversation/store.d.ts.map +1 -1
  46. package/dist/conversation/store.js +4 -0
  47. package/dist/conversation/store.js.map +1 -1
  48. package/dist/index.d.ts +21 -4
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +16 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/knowledge/base.d.ts +8 -0
  53. package/dist/knowledge/base.d.ts.map +1 -1
  54. package/dist/knowledge/tokenize.d.ts.map +1 -1
  55. package/dist/knowledge/tokenize.js +4 -4
  56. package/dist/knowledge/tokenize.js.map +1 -1
  57. package/dist/limits/budget.d.ts +84 -0
  58. package/dist/limits/budget.d.ts.map +1 -0
  59. package/dist/limits/budget.js +114 -0
  60. package/dist/limits/budget.js.map +1 -0
  61. package/dist/limits/rate-limit.d.ts +53 -0
  62. package/dist/limits/rate-limit.d.ts.map +1 -0
  63. package/dist/limits/rate-limit.js +68 -0
  64. package/dist/limits/rate-limit.js.map +1 -0
  65. package/dist/logger.d.ts +36 -0
  66. package/dist/logger.d.ts.map +1 -0
  67. package/dist/logger.js +40 -0
  68. package/dist/logger.js.map +1 -0
  69. package/dist/parts.d.ts +9 -0
  70. package/dist/parts.d.ts.map +1 -0
  71. package/dist/parts.js +17 -0
  72. package/dist/parts.js.map +1 -0
  73. package/dist/protocol/ai-sdk.d.ts +27 -0
  74. package/dist/protocol/ai-sdk.d.ts.map +1 -0
  75. package/dist/protocol/ai-sdk.js +127 -0
  76. package/dist/protocol/ai-sdk.js.map +1 -0
  77. package/dist/protocol/errors.d.ts +10 -0
  78. package/dist/protocol/errors.d.ts.map +1 -0
  79. package/dist/protocol/errors.js +42 -0
  80. package/dist/protocol/errors.js.map +1 -0
  81. package/dist/protocol/index.d.ts +9 -0
  82. package/dist/protocol/index.d.ts.map +1 -0
  83. package/dist/protocol/index.js +6 -0
  84. package/dist/protocol/index.js.map +1 -0
  85. package/dist/protocol/legacy.d.ts +18 -0
  86. package/dist/protocol/legacy.d.ts.map +1 -0
  87. package/dist/protocol/legacy.js +41 -0
  88. package/dist/protocol/legacy.js.map +1 -0
  89. package/dist/protocol/sse.d.ts +10 -0
  90. package/dist/protocol/sse.d.ts.map +1 -0
  91. package/dist/protocol/sse.js +15 -0
  92. package/dist/protocol/sse.js.map +1 -0
  93. package/dist/protocol/v1.d.ts +140 -0
  94. package/dist/protocol/v1.d.ts.map +1 -0
  95. package/dist/protocol/v1.js +15 -0
  96. package/dist/protocol/v1.js.map +1 -0
  97. package/dist/providers/base.d.ts +13 -28
  98. package/dist/providers/base.d.ts.map +1 -1
  99. package/dist/providers/base.js +36 -47
  100. package/dist/providers/base.js.map +1 -1
  101. package/dist/providers/claude.d.ts +41 -6
  102. package/dist/providers/claude.d.ts.map +1 -1
  103. package/dist/providers/claude.js +223 -96
  104. package/dist/providers/claude.js.map +1 -1
  105. package/dist/providers/gemini.d.ts +18 -3
  106. package/dist/providers/gemini.d.ts.map +1 -1
  107. package/dist/providers/gemini.js +208 -91
  108. package/dist/providers/gemini.js.map +1 -1
  109. package/dist/providers/history.d.ts +52 -0
  110. package/dist/providers/history.d.ts.map +1 -0
  111. package/dist/providers/history.js +212 -0
  112. package/dist/providers/history.js.map +1 -0
  113. package/dist/providers/index.d.ts +5 -5
  114. package/dist/providers/index.d.ts.map +1 -1
  115. package/dist/providers/index.js +5 -4
  116. package/dist/providers/index.js.map +1 -1
  117. package/dist/providers/openai.d.ts +28 -6
  118. package/dist/providers/openai.d.ts.map +1 -1
  119. package/dist/providers/openai.js +213 -113
  120. package/dist/providers/openai.js.map +1 -1
  121. package/dist/providers/registry.d.ts +7 -0
  122. package/dist/providers/registry.d.ts.map +1 -0
  123. package/dist/providers/registry.js +12 -0
  124. package/dist/providers/registry.js.map +1 -0
  125. package/dist/providers/schema.d.ts +16 -0
  126. package/dist/providers/schema.d.ts.map +1 -0
  127. package/dist/providers/schema.js +80 -0
  128. package/dist/providers/schema.js.map +1 -0
  129. package/dist/providers/tool-execution.d.ts +13 -0
  130. package/dist/providers/tool-execution.d.ts.map +1 -1
  131. package/dist/providers/tool-execution.js +49 -13
  132. package/dist/providers/tool-execution.js.map +1 -1
  133. package/dist/providers/types.d.ts +89 -0
  134. package/dist/providers/types.d.ts.map +1 -0
  135. package/dist/providers/types.js +2 -0
  136. package/dist/providers/types.js.map +1 -0
  137. package/dist/retrieval/citations.d.ts +44 -0
  138. package/dist/retrieval/citations.d.ts.map +1 -0
  139. package/dist/retrieval/citations.js +97 -0
  140. package/dist/retrieval/citations.js.map +1 -0
  141. package/dist/retrieval/cohere-reranker.d.ts +13 -0
  142. package/dist/retrieval/cohere-reranker.d.ts.map +1 -0
  143. package/dist/retrieval/cohere-reranker.js +33 -0
  144. package/dist/retrieval/cohere-reranker.js.map +1 -0
  145. package/dist/retrieval/gemini-embedder.d.ts +26 -0
  146. package/dist/retrieval/gemini-embedder.d.ts.map +1 -0
  147. package/dist/retrieval/gemini-embedder.js +36 -0
  148. package/dist/retrieval/gemini-embedder.js.map +1 -0
  149. package/dist/retrieval/http.d.ts +20 -0
  150. package/dist/retrieval/http.d.ts.map +1 -0
  151. package/dist/retrieval/http.js +68 -0
  152. package/dist/retrieval/http.js.map +1 -0
  153. package/dist/retrieval/index.d.ts +14 -0
  154. package/dist/retrieval/index.d.ts.map +1 -0
  155. package/dist/retrieval/index.js +13 -0
  156. package/dist/retrieval/index.js.map +1 -0
  157. package/dist/retrieval/knowledge.d.ts +16 -0
  158. package/dist/retrieval/knowledge.d.ts.map +1 -0
  159. package/dist/retrieval/knowledge.js +21 -0
  160. package/dist/retrieval/knowledge.js.map +1 -0
  161. package/dist/retrieval/openai-embedder.d.ts +25 -0
  162. package/dist/retrieval/openai-embedder.d.ts.map +1 -0
  163. package/dist/retrieval/openai-embedder.js +30 -0
  164. package/dist/retrieval/openai-embedder.js.map +1 -0
  165. package/dist/retrieval/query.d.ts +8 -0
  166. package/dist/retrieval/query.d.ts.map +1 -0
  167. package/dist/retrieval/query.js +19 -0
  168. package/dist/retrieval/query.js.map +1 -0
  169. package/dist/retrieval/retrievers.d.ts +30 -0
  170. package/dist/retrieval/retrievers.d.ts.map +1 -0
  171. package/dist/retrieval/retrievers.js +89 -0
  172. package/dist/retrieval/retrievers.js.map +1 -0
  173. package/dist/retrieval/sources.d.ts +16 -0
  174. package/dist/retrieval/sources.d.ts.map +1 -0
  175. package/dist/retrieval/sources.js +37 -0
  176. package/dist/retrieval/sources.js.map +1 -0
  177. package/dist/retrieval/types.d.ts +50 -0
  178. package/dist/retrieval/types.d.ts.map +1 -0
  179. package/dist/retrieval/types.js +2 -0
  180. package/dist/retrieval/types.js.map +1 -0
  181. package/dist/retrieval/voyage-embedder.d.ts +33 -0
  182. package/dist/retrieval/voyage-embedder.d.ts.map +1 -0
  183. package/dist/retrieval/voyage-embedder.js +33 -0
  184. package/dist/retrieval/voyage-embedder.js.map +1 -0
  185. package/dist/retrieval/voyage-reranker.d.ts +13 -0
  186. package/dist/retrieval/voyage-reranker.d.ts.map +1 -0
  187. package/dist/retrieval/voyage-reranker.js +38 -0
  188. package/dist/retrieval/voyage-reranker.js.map +1 -0
  189. package/dist/retrieval/workers-ai-embedder.d.ts +21 -0
  190. package/dist/retrieval/workers-ai-embedder.d.ts.map +1 -0
  191. package/dist/retrieval/workers-ai-embedder.js +42 -0
  192. package/dist/retrieval/workers-ai-embedder.js.map +1 -0
  193. package/dist/retrieval/workers-ai-reranker.d.ts +11 -0
  194. package/dist/retrieval/workers-ai-reranker.d.ts.map +1 -0
  195. package/dist/retrieval/workers-ai-reranker.js +54 -0
  196. package/dist/retrieval/workers-ai-reranker.js.map +1 -0
  197. package/dist/storage/adapt.d.ts +15 -0
  198. package/dist/storage/adapt.d.ts.map +1 -0
  199. package/dist/storage/adapt.js +83 -0
  200. package/dist/storage/adapt.js.map +1 -0
  201. package/dist/storage/errors.d.ts +18 -0
  202. package/dist/storage/errors.d.ts.map +1 -0
  203. package/dist/storage/errors.js +28 -0
  204. package/dist/storage/errors.js.map +1 -0
  205. package/dist/storage/index.d.ts +6 -0
  206. package/dist/storage/index.d.ts.map +1 -0
  207. package/dist/storage/index.js +5 -0
  208. package/dist/storage/index.js.map +1 -0
  209. package/dist/storage/memory-vectors.d.ts +22 -0
  210. package/dist/storage/memory-vectors.d.ts.map +1 -0
  211. package/dist/storage/memory-vectors.js +140 -0
  212. package/dist/storage/memory-vectors.js.map +1 -0
  213. package/dist/storage/memory.d.ts +24 -0
  214. package/dist/storage/memory.d.ts.map +1 -0
  215. package/dist/storage/memory.js +265 -0
  216. package/dist/storage/memory.js.map +1 -0
  217. package/dist/storage/types.d.ts +188 -0
  218. package/dist/storage/types.d.ts.map +1 -0
  219. package/dist/storage/types.js +2 -0
  220. package/dist/storage/types.js.map +1 -0
  221. package/dist/testing/conformance.d.ts +30 -0
  222. package/dist/testing/conformance.d.ts.map +1 -0
  223. package/dist/testing/conformance.js +505 -0
  224. package/dist/testing/conformance.js.map +1 -0
  225. package/dist/testing/index.d.ts +3 -0
  226. package/dist/testing/index.d.ts.map +1 -0
  227. package/dist/testing/index.js +5 -0
  228. package/dist/testing/index.js.map +1 -0
  229. package/dist/testing/provider.d.ts +47 -0
  230. package/dist/testing/provider.d.ts.map +1 -0
  231. package/dist/testing/provider.js +83 -0
  232. package/dist/testing/provider.js.map +1 -0
  233. package/dist/tools/base.d.ts +14 -4
  234. package/dist/tools/base.d.ts.map +1 -1
  235. package/dist/tools/base.js +4 -2
  236. package/dist/tools/base.js.map +1 -1
  237. package/dist/tools/lead-capture.d.ts +4 -2
  238. package/dist/tools/lead-capture.d.ts.map +1 -1
  239. package/dist/tools/lead-capture.js +7 -2
  240. package/dist/tools/lead-capture.js.map +1 -1
  241. package/dist/types.d.ts +146 -7
  242. package/dist/types.d.ts.map +1 -1
  243. package/package.json +51 -3
@@ -0,0 +1,42 @@
1
+ import { batchSizeFor, checkedVectors, inBatches } from './http.js';
2
+ const DEFAULT_MODEL = '@cf/baai/bge-m3';
3
+ const DEFAULT_DIMENSIONS = 1024;
4
+ const DEFAULT_BATCH_SIZE = 100;
5
+ /**
6
+ * Embeddings from Cloudflare Workers AI via binding (`env.AI`).
7
+ * Calls `ai.run` in batches (default up to 100 texts), validating
8
+ * response shape, vector count and dimensions.
9
+ */
10
+ export function workersAiEmbedder(options) {
11
+ if (!options?.ai || typeof options.ai.run !== 'function') {
12
+ throw new Error('workersAiEmbedder requires an ai binding with a run() method.');
13
+ }
14
+ const model = options.model ?? DEFAULT_MODEL;
15
+ const dimensions = options.dimensions ?? DEFAULT_DIMENSIONS;
16
+ const batchSize = batchSizeFor(options.batchSize, DEFAULT_BATCH_SIZE, DEFAULT_BATCH_SIZE);
17
+ const ai = options.ai;
18
+ return {
19
+ id: `workers-ai:${model}@${dimensions}`,
20
+ dimensions,
21
+ async embed(texts, _kind, embedOptions = {}) {
22
+ if (embedOptions.signal?.aborted) {
23
+ throw embedOptions.signal.reason;
24
+ }
25
+ return inBatches(texts, batchSize, async (batch) => {
26
+ if (embedOptions.signal?.aborted) {
27
+ throw embedOptions.signal.reason;
28
+ }
29
+ const response = await ai.run(model, { text: batch });
30
+ if (!response || typeof response !== 'object' || !('data' in response) || !Array.isArray(response.data)) {
31
+ throw new Error(`Workers AI returned an invalid response for ${model}.`);
32
+ }
33
+ const data = response.data;
34
+ if (data.some((embedding) => !Array.isArray(embedding) && !(embedding instanceof Float32Array))) {
35
+ throw new Error(`Workers AI returned an invalid embedding for ${model}.`);
36
+ }
37
+ return checkedVectors('Workers AI', model, data, batch.length, dimensions);
38
+ });
39
+ },
40
+ };
41
+ }
42
+ //# sourceMappingURL=workers-ai-embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers-ai-embedder.js","sourceRoot":"","sources":["../../src/retrieval/workers-ai-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAkBpE,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAiC;IACjE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,OAAO,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAC5D,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAC1F,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAEtB,OAAO;QACL,EAAE,EAAE,cAAc,KAAK,IAAI,UAAU,EAAE;QACvC,UAAU;QACV,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,GAAG,EAAE;YACzC,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACjC,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;YACnC,CAAC;YACD,OAAO,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACjD,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBACjC,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;gBACnC,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,QAA+B,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChI,MAAM,IAAI,KAAK,CAAC,+CAA+C,KAAK,GAAG,CAAC,CAAC;gBAC3E,CAAC;gBACD,MAAM,IAAI,GAAI,QAAgC,CAAC,IAAI,CAAC;gBACpD,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,YAAY,YAAY,CAAC,CAAC,EAAE,CAAC;oBAChG,MAAM,IAAI,KAAK,CAAC,gDAAgD,KAAK,GAAG,CAAC,CAAC;gBAC5E,CAAC;gBACD,OAAO,cAAc,CAAC,YAAY,EAAE,KAAK,EAAE,IAA6B,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACtG,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Reranker } from './types.js';
2
+ import type { WorkersAiBinding } from './workers-ai-embedder.js';
3
+ export interface WorkersAiRerankerOptions {
4
+ /** The Cloudflare Workers AI binding (`env.AI`). */
5
+ ai: WorkersAiBinding;
6
+ /** Default `@cf/baai/bge-reranker-base`. */
7
+ model?: string;
8
+ }
9
+ /** Reranks retrieved chunks with Cloudflare Workers AI via the native binding. */
10
+ export declare function workersAiReranker(options: WorkersAiRerankerOptions): Reranker;
11
+ //# sourceMappingURL=workers-ai-reranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers-ai-reranker.d.ts","sourceRoot":"","sources":["../../src/retrieval/workers-ai-reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,EAAE,EAAE,gBAAgB,CAAC;IACrB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,QAAQ,CAuD7E"}
@@ -0,0 +1,54 @@
1
+ const DEFAULT_MODEL = '@cf/baai/bge-reranker-base';
2
+ /** Reranks retrieved chunks with Cloudflare Workers AI via the native binding. */
3
+ export function workersAiReranker(options) {
4
+ if (!options?.ai || typeof options.ai.run !== 'function') {
5
+ throw new Error('workersAiReranker requires an ai binding with a run() method.');
6
+ }
7
+ const model = options.model ?? DEFAULT_MODEL;
8
+ const ai = options.ai;
9
+ return {
10
+ async rerank(query, chunks, topN, rerankOptions = {}) {
11
+ if (rerankOptions.signal?.aborted)
12
+ throw rerankOptions.signal.reason;
13
+ const requestedLimit = Number.isFinite(topN) && topN > 0 ? Math.floor(topN) : 0;
14
+ if (!requestedLimit || !chunks.length)
15
+ return [];
16
+ const limit = Math.min(requestedLimit, chunks.length);
17
+ const response = await ai.run(model, {
18
+ query,
19
+ contexts: chunks.map(({ text }) => ({ text })),
20
+ top_k: limit,
21
+ });
22
+ if (rerankOptions.signal?.aborted)
23
+ throw rerankOptions.signal.reason;
24
+ if (!response || typeof response !== 'object' || !('response' in response) || !Array.isArray(response.response)) {
25
+ throw new Error(`Workers AI returned an invalid reranking response for ${model}.`);
26
+ }
27
+ const ranked = response.response.map((item) => {
28
+ if (!item ||
29
+ typeof item !== 'object' ||
30
+ !('id' in item) ||
31
+ !Number.isInteger(item.id) ||
32
+ !('score' in item) ||
33
+ typeof item.score !== 'number' ||
34
+ !Number.isFinite(item.score) ||
35
+ item.id < 0 ||
36
+ item.id >= chunks.length) {
37
+ throw new Error(`Workers AI returned an invalid reranking result for ${model}.`);
38
+ }
39
+ return { id: item.id, score: item.score };
40
+ });
41
+ const seen = new Set();
42
+ for (const result of ranked) {
43
+ if (seen.has(result.id))
44
+ throw new Error(`Workers AI returned a duplicate reranking result for ${model}.`);
45
+ seen.add(result.id);
46
+ }
47
+ return ranked
48
+ .sort((a, b) => b.score - a.score)
49
+ .slice(0, limit)
50
+ .map(({ id, score }) => ({ ...chunks[id], score }));
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=workers-ai-reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers-ai-reranker.js","sourceRoot":"","sources":["../../src/retrieval/workers-ai-reranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ConversationStore } from './types.js';
2
+ /** A store with the message-level writes the server uses. */
3
+ export type ConversationStoreWithAppend = ConversationStore & Required<Pick<ConversationStore, 'append' | 'updateMessage' | 'removeMessage'>>;
4
+ /** True when the store only has the 0.4 methods (`get`, `save`, `delete`). */
5
+ export declare function isLegacyConversationStore(store: ConversationStore): boolean;
6
+ /**
7
+ * Gives any store `append`, `updateMessage` and `removeMessage`. Methods the
8
+ * store has are used as they are. The missing ones read the conversation,
9
+ * change it and save it back, one write at a time per conversation within
10
+ * this process. That's safe for a single server, but two instances writing
11
+ * the same conversation can still overwrite each other, which is why stores
12
+ * should implement `append` themselves.
13
+ */
14
+ export declare function withAppend(store: ConversationStore): ConversationStoreWithAppend;
15
+ //# sourceMappingURL=adapt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapt.d.ts","sourceRoot":"","sources":["../../src/storage/adapt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,6DAA6D;AAC7D,MAAM,MAAM,2BAA2B,GAAG,iBAAiB,GACzD,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC;AAElF,8EAA8E;AAC9E,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,2BAA2B,CAsFhF"}
@@ -0,0 +1,83 @@
1
+ import { ConflictError } from './errors.js';
2
+ /** True when the store only has the 0.4 methods (`get`, `save`, `delete`). */
3
+ export function isLegacyConversationStore(store) {
4
+ return !store.append;
5
+ }
6
+ /**
7
+ * Gives any store `append`, `updateMessage` and `removeMessage`. Methods the
8
+ * store has are used as they are. The missing ones read the conversation,
9
+ * change it and save it back, one write at a time per conversation within
10
+ * this process. That's safe for a single server, but two instances writing
11
+ * the same conversation can still overwrite each other, which is why stores
12
+ * should implement `append` themselves.
13
+ */
14
+ export function withAppend(store) {
15
+ if (store.append && store.updateMessage && store.removeMessage) {
16
+ return store;
17
+ }
18
+ const queues = new Map();
19
+ function serialized(id, fn) {
20
+ const previous = queues.get(id) ?? Promise.resolve();
21
+ const run = previous.then(fn, fn);
22
+ const settled = run.then(() => undefined, () => undefined);
23
+ queues.set(id, settled);
24
+ void settled.then(() => {
25
+ if (queues.get(id) === settled)
26
+ queues.delete(id);
27
+ });
28
+ return run;
29
+ }
30
+ async function rewrite(id, change) {
31
+ const current = await store.get(id);
32
+ if (!current)
33
+ return false;
34
+ const next = change(current);
35
+ if (!next)
36
+ return false;
37
+ await store.save({ ...next, version: (current.version ?? 0) + 1, updatedAt: Date.now() });
38
+ return true;
39
+ }
40
+ return {
41
+ get: (id) => store.get(id),
42
+ save: (conversation) => store.save(conversation),
43
+ delete: (id) => store.delete(id),
44
+ ...(store.list ? { list: store.list.bind(store) } : {}),
45
+ ...(store.purge ? { purge: store.purge.bind(store) } : {}),
46
+ append: store.append
47
+ ? store.append.bind(store)
48
+ : (id, messages, options = {}) => serialized(id, async () => {
49
+ const current = await store.get(id);
50
+ const version = current?.version ?? 0;
51
+ if (options.expectedVersion !== undefined && options.expectedVersion !== version) {
52
+ throw new ConflictError(id, options.expectedVersion, version);
53
+ }
54
+ const time = Date.now();
55
+ const metadata = options.metadata || current?.metadata ? { ...current?.metadata, ...options.metadata } : undefined;
56
+ await store.save({
57
+ id,
58
+ messages: [...(current?.messages ?? []), ...messages],
59
+ ...(metadata ? { metadata } : {}),
60
+ version: version + 1,
61
+ createdAt: current?.createdAt ?? time,
62
+ updatedAt: time,
63
+ });
64
+ return { version: version + 1 };
65
+ }),
66
+ updateMessage: store.updateMessage
67
+ ? store.updateMessage.bind(store)
68
+ : (id, message) => serialized(id, () => rewrite(id, (current) => {
69
+ const index = current.messages.findIndex((m) => m.id === message.id);
70
+ if (index === -1)
71
+ return null;
72
+ const messages = [...current.messages];
73
+ messages[index] = message;
74
+ return { ...current, messages };
75
+ })),
76
+ removeMessage: store.removeMessage
77
+ ? store.removeMessage.bind(store)
78
+ : (id, messageId) => serialized(id, () => rewrite(id, (current) => current.messages.some((m) => m.id === messageId)
79
+ ? { ...current, messages: current.messages.filter((m) => m.id !== messageId) }
80
+ : null)),
81
+ };
82
+ }
83
+ //# sourceMappingURL=adapt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapt.js","sourceRoot":"","sources":["../../src/storage/adapt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5C,8EAA8E;AAC9E,MAAM,UAAU,yBAAyB,CAAC,KAAwB;IAChE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,KAAwB;IACjD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC/D,OAAO,KAAoC,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACnD,SAAS,UAAU,CAAI,EAAU,EAAE,EAAoB;QACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CACtB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACxB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO;gBAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,UAAU,OAAO,CACpB,EAAU,EACV,MAAsD;QAEtD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;QAChD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1D,MAAM,EAAE,KAAK,CAAC,MAAM;YAClB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC,EAAU,EAAE,QAAuB,EAAE,UAAyB,EAAE,EAAE,EAAE,CACnE,UAAU,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;gBACxB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC;gBACtC,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,CAAC,eAAe,KAAK,OAAO,EAAE,CAAC;oBACjF,MAAM,IAAI,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACxB,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpG,MAAM,KAAK,CAAC,IAAI,CAAC;oBACf,EAAE;oBACF,QAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC;oBACrD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjC,OAAO,EAAE,OAAO,GAAG,CAAC;oBACpB,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;oBACrC,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC;YAClC,CAAC,CAAC;QAER,aAAa,EAAE,KAAK,CAAC,aAAa;YAChC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;YACjC,CAAC,CAAC,CAAC,EAAU,EAAE,OAAoB,EAAE,EAAE,CACnC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,CAClB,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE;gBACtB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;gBACrE,IAAI,KAAK,KAAK,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;gBAC1B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC;YAClC,CAAC,CAAC,CACH;QAEP,aAAa,EAAE,KAAK,CAAC,aAAa;YAChC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;YACjC,CAAC,CAAC,CAAC,EAAU,EAAE,SAAiB,EAAE,EAAE,CAChC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,CAClB,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;gBAC9C,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE;gBAC9E,CAAC,CAAC,IAAI,CACT,CACF;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare const CONFLICT_ERROR_CODE = "chatcops_conversation_conflict";
2
+ /**
3
+ * Thrown by `ConversationStore.append` when `expectedVersion` doesn't match.
4
+ * Another request wrote to the conversation since it was read.
5
+ */
6
+ export declare class ConflictError extends Error {
7
+ readonly conversationId: string;
8
+ readonly expectedVersion: number;
9
+ readonly actualVersion: number;
10
+ readonly code = "chatcops_conversation_conflict";
11
+ constructor(conversationId: string, expectedVersion: number, actualVersion: number);
12
+ }
13
+ /**
14
+ * Checks by `code` rather than `instanceof`, so it also works when a store
15
+ * package ends up with its own copy of `@chatcops/core`.
16
+ */
17
+ export declare function isConflictError(error: unknown): error is ConflictError;
18
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/storage/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AAEpE;;;GAGG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAIpC,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM;IALhC,QAAQ,CAAC,IAAI,oCAAuB;gBAGzB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM;CAOjC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAMtE"}
@@ -0,0 +1,28 @@
1
+ export const CONFLICT_ERROR_CODE = 'chatcops_conversation_conflict';
2
+ /**
3
+ * Thrown by `ConversationStore.append` when `expectedVersion` doesn't match.
4
+ * Another request wrote to the conversation since it was read.
5
+ */
6
+ export class ConflictError extends Error {
7
+ conversationId;
8
+ expectedVersion;
9
+ actualVersion;
10
+ code = CONFLICT_ERROR_CODE;
11
+ constructor(conversationId, expectedVersion, actualVersion) {
12
+ super(`Conversation ${conversationId} is at version ${actualVersion}, expected ${expectedVersion}. Another request wrote to it first.`);
13
+ this.conversationId = conversationId;
14
+ this.expectedVersion = expectedVersion;
15
+ this.actualVersion = actualVersion;
16
+ this.name = 'ConflictError';
17
+ }
18
+ }
19
+ /**
20
+ * Checks by `code` rather than `instanceof`, so it also works when a store
21
+ * package ends up with its own copy of `@chatcops/core`.
22
+ */
23
+ export function isConflictError(error) {
24
+ return (typeof error === 'object' &&
25
+ error !== null &&
26
+ error.code === CONFLICT_ERROR_CODE);
27
+ }
28
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/storage/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,gCAAgC,CAAC;AAEpE;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAI3B;IACA;IACA;IALF,IAAI,GAAG,mBAAmB,CAAC;IAEpC,YACW,cAAsB,EACtB,eAAuB,EACvB,aAAqB;QAE9B,KAAK,CACH,gBAAgB,cAAc,kBAAkB,aAAa,cAAc,eAAe,sCAAsC,CACjI,CAAC;QANO,mBAAc,GAAd,cAAc,CAAQ;QACtB,oBAAe,GAAf,eAAe,CAAQ;QACvB,kBAAa,GAAb,aAAa,CAAQ;QAK9B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA4B,CAAC,IAAI,KAAK,mBAAmB,CAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { AppendOptions, ChatCopsStorage, ConversationStore, ConversationSummary, CounterStore, CounterValue, EventCount, EventQuery, EventSink, KeyValueStore, ListQuery, KeywordQuery, MetadataFilter, MetadataValue, ScoredRecord, VectorQuery, VectorRecord, VectorSource, VectorStore, } from './types.js';
2
+ export { ConflictError, isConflictError, CONFLICT_ERROR_CODE } from './errors.js';
3
+ export { memoryStorage, type MemoryStorageOptions } from './memory.js';
4
+ export { memoryVectors, matchesFilter, segmentWords, type MemoryVectorsOptions } from './memory-vectors.js';
5
+ export { withAppend, isLegacyConversationStore, type ConversationStoreWithAppend } from './adapt.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,UAAU,EAAE,yBAAyB,EAAE,KAAK,2BAA2B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { ConflictError, isConflictError, CONFLICT_ERROR_CODE } from './errors.js';
2
+ export { memoryStorage } from './memory.js';
3
+ export { memoryVectors, matchesFilter, segmentWords } from './memory-vectors.js';
4
+ export { withAppend, isLegacyConversationStore } from './adapt.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAA6B,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,UAAU,EAAE,yBAAyB,EAAoC,MAAM,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { MetadataFilter, MetadataValue, VectorStore } from './types.js';
2
+ export interface MemoryVectorsOptions {
3
+ /** The length of every vector, set by the embedder (1024 for the default). */
4
+ dimensions: number;
5
+ /** Upserts that would go past this many records fail. Default 50,000. */
6
+ maxRecords?: number;
7
+ }
8
+ /**
9
+ * The words in a text, lowercased. `Intl.Segmenter` finds word boundaries in
10
+ * languages written without spaces (Japanese, Chinese, Thai), where splitting
11
+ * on whitespace would make a whole sentence one word.
12
+ */
13
+ export declare function segmentWords(text: string): string[];
14
+ /**
15
+ * Vectors kept in this process, searched by comparing against every record.
16
+ * Fine for tests, local development and a few thousand chunks; use a store
17
+ * package with a vector index for more.
18
+ */
19
+ export declare function memoryVectors(options: MemoryVectorsOptions): VectorStore;
20
+ /** Whether metadata passes a filter, by the rules on `MetadataFilter`. */
21
+ export declare function matchesFilter(metadata: Record<string, MetadataValue> | undefined, filter: MetadataFilter): boolean;
22
+ //# sourceMappingURL=memory-vectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-vectors.d.ts","sourceRoot":"","sources":["../../src/storage/memory-vectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,aAAa,EAIb,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,CAMxE;AA+FD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAMlH"}
@@ -0,0 +1,140 @@
1
+ // BM25's usual constants.
2
+ const K1 = 1.2;
3
+ const B = 0.75;
4
+ const segmenter = new Intl.Segmenter(undefined, { granularity: 'word' });
5
+ /**
6
+ * The words in a text, lowercased. `Intl.Segmenter` finds word boundaries in
7
+ * languages written without spaces (Japanese, Chinese, Thai), where splitting
8
+ * on whitespace would make a whole sentence one word.
9
+ */
10
+ export function segmentWords(text) {
11
+ const words = [];
12
+ for (const part of segmenter.segment(text.normalize('NFKC').toLowerCase())) {
13
+ if (part.isWordLike)
14
+ words.push(part.segment);
15
+ }
16
+ return words;
17
+ }
18
+ /**
19
+ * Vectors kept in this process, searched by comparing against every record.
20
+ * Fine for tests, local development and a few thousand chunks; use a store
21
+ * package with a vector index for more.
22
+ */
23
+ export function memoryVectors(options) {
24
+ const { dimensions } = options;
25
+ if (!Number.isInteger(dimensions) || dimensions < 1) {
26
+ throw new Error(`memoryVectors needs dimensions as a positive whole number, got ${dimensions}.`);
27
+ }
28
+ return new MemoryVectorStore(dimensions, options.maxRecords ?? 50_000);
29
+ }
30
+ class MemoryVectorStore {
31
+ dimensions;
32
+ maxRecords;
33
+ records = new Map();
34
+ constructor(dimensions, maxRecords) {
35
+ this.dimensions = dimensions;
36
+ this.maxRecords = maxRecords;
37
+ }
38
+ async upsert(records) {
39
+ for (const record of records)
40
+ this.checkVector(record.vector, `record ${record.id}`);
41
+ const added = new Set(records.map((record) => record.id).filter((id) => !this.records.has(id))).size;
42
+ if (this.records.size + added > this.maxRecords) {
43
+ throw new Error(`memoryVectors holds at most ${this.maxRecords} records, and this upsert would make ${this.records.size + added}. Use a store package for an index this size.`);
44
+ }
45
+ for (const { vector, ...rest } of records) {
46
+ const copy = Float32Array.from(vector);
47
+ const words = segmentWords(rest.text);
48
+ const terms = new Map();
49
+ for (const word of words)
50
+ terms.set(word, (terms.get(word) ?? 0) + 1);
51
+ this.records.set(rest.id, {
52
+ record: structuredClone(rest),
53
+ vector: copy,
54
+ norm: length(copy),
55
+ terms,
56
+ length: words.length,
57
+ });
58
+ }
59
+ }
60
+ async query({ vector, topK, filter }) {
61
+ this.checkVector(vector, 'the query');
62
+ const norm = length(vector);
63
+ const scored = [];
64
+ for (const stored of this.matching(filter)) {
65
+ let dot = 0;
66
+ for (let i = 0; i < vector.length; i++)
67
+ dot += vector[i] * stored.vector[i];
68
+ scored.push([stored, norm === 0 || stored.norm === 0 ? 0 : dot / (norm * stored.norm)]);
69
+ }
70
+ return best(scored, topK);
71
+ }
72
+ async keywordQuery({ text, topK, filter }) {
73
+ const words = [...new Set(segmentWords(text))];
74
+ const candidates = [...this.matching(filter)];
75
+ if (words.length === 0 || candidates.length === 0)
76
+ return [];
77
+ const averageLength = candidates.reduce((sum, stored) => sum + stored.length, 0) / candidates.length || 1;
78
+ const scored = [];
79
+ const idf = new Map(words.map((word) => {
80
+ const withWord = candidates.filter((stored) => stored.terms.has(word)).length;
81
+ return [word, Math.log(1 + (candidates.length - withWord + 0.5) / (withWord + 0.5))];
82
+ }));
83
+ for (const stored of candidates) {
84
+ let score = 0;
85
+ for (const word of words) {
86
+ const count = stored.terms.get(word);
87
+ if (!count)
88
+ continue;
89
+ score += (idf.get(word) ?? 0) * ((count * (K1 + 1)) / (count + K1 * (1 - B + (B * stored.length) / averageLength)));
90
+ }
91
+ if (score > 0)
92
+ scored.push([stored, score]);
93
+ }
94
+ return best(scored, topK);
95
+ }
96
+ async deleteBySource(sourceId) {
97
+ for (const [id, stored] of this.records) {
98
+ if (stored.record.source.id === sourceId)
99
+ this.records.delete(id);
100
+ }
101
+ }
102
+ *matching(filter) {
103
+ for (const stored of this.records.values()) {
104
+ if (!filter || matchesFilter(stored.record.metadata, filter))
105
+ yield stored;
106
+ }
107
+ }
108
+ checkVector(vector, what) {
109
+ if (vector.length !== this.dimensions) {
110
+ throw new Error(`The vector for ${what} has ${vector.length} dimensions, but this store holds ${this.dimensions}.`);
111
+ }
112
+ if (!vector.every(Number.isFinite))
113
+ throw new Error(`The vector for ${what} has a value that isn't a finite number.`);
114
+ }
115
+ }
116
+ function length(vector) {
117
+ let sum = 0;
118
+ for (const value of vector)
119
+ sum += value * value;
120
+ return Math.sqrt(sum);
121
+ }
122
+ /** Whether metadata passes a filter, by the rules on `MetadataFilter`. */
123
+ export function matchesFilter(metadata, filter) {
124
+ return Object.entries(filter).every(([key, wanted]) => {
125
+ if (!metadata || !Object.hasOwn(metadata, key))
126
+ return false;
127
+ const value = metadata[key];
128
+ return Array.isArray(wanted) ? wanted.includes(value) : wanted === value;
129
+ });
130
+ }
131
+ /** The `topK` highest scores, best first, ties broken by id so results are stable. */
132
+ function best(scored, topK) {
133
+ if (!(topK >= 1))
134
+ return [];
135
+ return scored
136
+ .sort(([a, x], [b, y]) => y - x || (a.record.id < b.record.id ? -1 : 1))
137
+ .slice(0, Math.floor(topK))
138
+ .map(([stored, score]) => ({ ...structuredClone(stored.record), score }));
139
+ }
140
+ //# sourceMappingURL=memory-vectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-vectors.js","sourceRoot":"","sources":["../../src/storage/memory-vectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ChatCopsStorage } from './types.js';
2
+ export interface MemoryStorageOptions {
3
+ /** Least recently used conversations go first past this. Default 1000. */
4
+ maxConversations?: number;
5
+ /** Conversations not touched for this long are dropped. Default 7 days. */
6
+ conversationTtlMs?: number;
7
+ /** Counters and keys each, past which expired ones are swept and then the oldest dropped. Default 10,000. */
8
+ maxKeys?: number;
9
+ /** Oldest events go first past this. Default 10,000. */
10
+ maxEvents?: number;
11
+ /** Clock, for tests. */
12
+ now?: () => number;
13
+ }
14
+ /**
15
+ * Keeps everything in this process. Fine for local development and a single
16
+ * long-running server; on serverless each instance has its own copy, so
17
+ * conversations and limits don't carry over between requests.
18
+ *
19
+ * Every capability is bounded, and nothing runs on a timer: expired entries
20
+ * are dropped when they're next read or when a map reaches its cap. Objects
21
+ * are copied in and out, so callers can't change stored data by accident.
22
+ */
23
+ export declare function memoryStorage(options?: MemoryStorageOptions): ChatCopsStorage;
24
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,eAAe,EAUhB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6GAA6G;IAC7G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,eAAe,CAYjF"}