@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
@@ -1,56 +1,132 @@
1
- import { MemoryStore } from './store.js';
1
+ import { consoleLogger } from '../logger.js';
2
+ import { warnOnce } from '../providers/base.js';
3
+ import { DEFAULT_MAX_HISTORY_TOKENS, trimHistory } from '../providers/history.js';
4
+ import { isLegacyConversationStore, withAppend } from '../storage/adapt.js';
5
+ import { memoryStorage } from '../storage/memory.js';
6
+ /**
7
+ * Reads and writes conversations through a store. Writes are appends, so two
8
+ * server instances answering the same conversation don't overwrite each
9
+ * other's messages, as long as the store implements `append`.
10
+ */
2
11
  export class ConversationManager {
3
12
  store;
13
+ kv;
4
14
  maxMessages;
5
- constructor(options) {
6
- this.store = options?.store ?? new MemoryStore();
7
- this.maxMessages = options?.maxMessages ?? 100;
15
+ maxHistoryTokens;
16
+ localTurns = new Set();
17
+ constructor(options = {}) {
18
+ const store = options.storage?.conversations ?? options.store ?? memoryStorage().conversations;
19
+ if (isLegacyConversationStore(store)) {
20
+ warnOnce(options.logger ?? consoleLogger(), 'legacy-conversation-store', "The conversation store has no append(), so each write saves the whole conversation. That's fine on one server, but two instances writing the same conversation can lose a message. The store packages (@chatcops/store-*) have append().");
21
+ }
22
+ this.store = withAppend(store);
23
+ this.kv = options.storage?.kv;
24
+ this.maxMessages = options.maxMessages ?? 100;
25
+ this.maxHistoryTokens = options.maxHistoryTokens ?? DEFAULT_MAX_HISTORY_TOKENS;
8
26
  }
27
+ /**
28
+ * The stored conversation, or a new empty one. A new conversation isn't
29
+ * saved until its first message is added.
30
+ */
9
31
  async getOrCreate(id) {
10
32
  const existing = await this.store.get(id);
11
33
  if (existing)
12
34
  return existing;
13
- const conversation = {
14
- id,
15
- messages: [],
16
- createdAt: Date.now(),
17
- updatedAt: Date.now(),
18
- };
19
- await this.store.save(conversation);
20
- return conversation;
35
+ const time = Date.now();
36
+ return { id, messages: [], version: 0, createdAt: time, updatedAt: time };
21
37
  }
38
+ /** Adds one message and returns the conversation as stored afterwards. */
22
39
  async addMessage(conversationId, message) {
23
- const conversation = await this.getOrCreate(conversationId);
24
- conversation.messages.push(message);
25
- conversation.updatedAt = Date.now();
26
- if (conversation.messages.length > this.maxMessages) {
27
- const systemMessages = conversation.messages.filter((m) => m.role === 'system');
28
- let recentMessages = conversation.messages
29
- .filter((m) => m.role !== 'system')
30
- .slice(-(this.maxMessages - systemMessages.length));
31
- // Never start the kept history with an assistant turn; some providers
32
- // (Gemini) reject a conversation that doesn't open with the user.
33
- const firstUser = recentMessages.findIndex((m) => m.role === 'user');
34
- recentMessages = firstUser === -1 ? [] : recentMessages.slice(firstUser);
35
- conversation.messages = [...systemMessages, ...recentMessages];
36
- }
37
- await this.store.save(conversation);
38
- return conversation;
40
+ await this.appendMessages(conversationId, [message]);
41
+ return this.getOrCreate(conversationId);
42
+ }
43
+ /**
44
+ * Adds messages atomically and returns the new version. Pass
45
+ * `expectedVersion` to fail with a `ConflictError` when another request
46
+ * wrote first.
47
+ */
48
+ async appendMessages(conversationId, messages, options) {
49
+ const result = await this.store.append(conversationId, messages, options);
50
+ await this.enforceMaxMessages(conversationId);
51
+ return result;
52
+ }
53
+ /** Replaces a stored message with the same id. Resolves `false` when there's none. */
54
+ updateMessage(conversationId, message) {
55
+ return this.store.updateMessage(conversationId, message);
39
56
  }
40
57
  async getMessages(conversationId) {
41
58
  const conversation = await this.store.get(conversationId);
42
59
  return conversation?.messages ?? [];
43
60
  }
61
+ /**
62
+ * The messages to send to the model: user and assistant turns within the
63
+ * token budget, keeping the first user message and the newest ones.
64
+ */
65
+ async getHistory(conversationId) {
66
+ return trimHistory(await this.getMessages(conversationId), this.maxHistoryTokens);
67
+ }
44
68
  async removeMessage(conversationId, messageId) {
45
- const conversation = await this.store.get(conversationId);
46
- if (!conversation)
47
- return;
48
- conversation.messages = conversation.messages.filter((message) => message.id !== messageId);
49
- conversation.updatedAt = Date.now();
50
- await this.store.save(conversation);
69
+ await this.store.removeMessage(conversationId, messageId);
51
70
  }
52
71
  async deleteConversation(id) {
53
72
  await this.store.delete(id);
54
73
  }
74
+ /**
75
+ * Makes sure only one reply is generated for a conversation at a time.
76
+ * Resolves a release function, or `null` when another turn holds the lock.
77
+ * The lock expires after `ttlMs` in case a server dies mid-turn.
78
+ *
79
+ * With `storage.kv` (and `setIfAbsent`) the lock holds across instances;
80
+ * otherwise only within this process.
81
+ */
82
+ async acquireTurn(conversationId, ttlMs = 120_000) {
83
+ const key = `turn:${conversationId}`;
84
+ const kv = this.kv;
85
+ if (kv?.setIfAbsent) {
86
+ const token = crypto.randomUUID();
87
+ if (!(await kv.setIfAbsent(key, token, { ttlMs })))
88
+ return null;
89
+ let released = false;
90
+ return async () => {
91
+ if (released)
92
+ return;
93
+ released = true;
94
+ // Only delete the lock if it's still ours; it may have expired and
95
+ // been taken by another turn.
96
+ if ((await kv.get(key)) === token)
97
+ await kv.delete(key);
98
+ };
99
+ }
100
+ if (this.localTurns.has(key))
101
+ return null;
102
+ this.localTurns.add(key);
103
+ const timer = setTimeout(() => this.localTurns.delete(key), ttlMs);
104
+ timer.unref?.();
105
+ let released = false;
106
+ return async () => {
107
+ if (released)
108
+ return;
109
+ released = true;
110
+ clearTimeout(timer);
111
+ this.localTurns.delete(key);
112
+ };
113
+ }
114
+ /**
115
+ * Removes the oldest non-system messages past `maxMessages`, one atomic
116
+ * remove each, then any assistant turns left at the front, so the stored
117
+ * history still opens with the visitor (Gemini rejects one that doesn't).
118
+ */
119
+ async enforceMaxMessages(conversationId) {
120
+ const messages = await this.getMessages(conversationId);
121
+ if (messages.length <= this.maxMessages)
122
+ return;
123
+ const turns = messages.filter((m) => m.role !== 'system');
124
+ let cut = messages.length - this.maxMessages;
125
+ while (cut < turns.length && turns[cut].role === 'assistant')
126
+ cut++;
127
+ for (const message of turns.slice(0, cut)) {
128
+ await this.store.removeMessage(conversationId, message.id);
129
+ }
130
+ }
55
131
  }
56
132
  //# sourceMappingURL=manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAoC,yBAAyB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwBrD;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACb,KAAK,CAA8B;IACnC,EAAE,CAA4B;IAC9B,WAAW,CAAS;IACpB,gBAAgB,CAAS;IACzB,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhD,YAAY,UAAsC,EAAE;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC,aAAa,CAAC;QAC/F,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,QAAQ,CACN,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,EACjC,2BAA2B,EAC3B,0OAA0O,CAC3O,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;QAC9C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IACjF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5E,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,UAAU,CAAC,cAAsB,EAAE,OAAoB;QAC3D,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAClB,cAAsB,EACtB,QAAuB,EACvB,OAAuB;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sFAAsF;IACtF,aAAa,CAAC,cAAsB,EAAE,OAAoB;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAsB;QACtC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1D,OAAO,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,cAAsB;QACrC,OAAO,WAAW,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,cAAsB,EAAE,SAAiB;QAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,EAAU;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CAAC,cAAsB,EAAE,KAAK,GAAG,OAAO;QACvD,MAAM,GAAG,GAAG,QAAQ,cAAc,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAEnB,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,OAAO,KAAK,IAAI,EAAE;gBAChB,IAAI,QAAQ;oBAAE,OAAO;gBACrB,QAAQ,GAAG,IAAI,CAAC;gBAChB,mEAAmE;gBACnE,8BAA8B;gBAC9B,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAS,GAAG,CAAC,CAAC,KAAK,KAAK;oBAAE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAClE,KAAgC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,KAAK,IAAI,EAAE;YAChB,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAEhD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC1D,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7C,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,GAAG,EAAE,CAAC;QACpE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
@@ -1,9 +1,10 @@
1
1
  import type { Conversation } from '../types.js';
2
- export interface ConversationStore {
3
- get(id: string): Promise<Conversation | null>;
4
- save(conversation: Conversation): Promise<void>;
5
- delete(id: string): Promise<void>;
6
- }
2
+ import type { ConversationStore } from '../storage/types.js';
3
+ export type { ConversationStore } from '../storage/types.js';
4
+ /**
5
+ * The 0.4 in-memory store. Unbounded and without `append`; `memoryStorage()`
6
+ * replaces it.
7
+ */
7
8
  export declare class MemoryStore implements ConversationStore {
8
9
  private store;
9
10
  get(id: string): Promise<Conversation | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,KAAK,CAAmC;IAE1C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAI7C,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,KAAK,CAAmC;IAE1C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAI7C,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * The 0.4 in-memory store. Unbounded and without `append`; `memoryStorage()`
3
+ * replaces it.
4
+ */
1
5
  export class MemoryStore {
2
6
  store = new Map();
3
7
  async get(id) {
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,YAA0B;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACF"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,YAA0B;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,30 @@
1
- export type { ChatMessage, Conversation, ChatRequest, ChatResponse, PageContext, LeadData, ToolParameter, ToolDefinition, ToolResult, ProviderToolCall, ProviderToolExecutor, WebhookConfig, ProviderConfig, ProviderEffort, ProviderChatParams, AnalyticsEvent, LocaleStrings, } from './types.js';
2
- export type { AIProvider, NormalizedMessage } from './providers/index.js';
3
- export { createProvider, normalizeHistory, ClaudeProvider, OpenAIProvider, GeminiProvider } from './providers/index.js';
1
+ export type { ChatMessage, Conversation, ChatRequest, ChatResponse, PageContext, LeadData, ToolParameter, ToolDefinition, ToolAnnotations, ToolContext, ToolResult, ProviderToolCall, ProviderToolExecutor, WebhookConfig, ProviderConfig, ProviderEffort, ProviderChatParams, AnalyticsEvent, LocaleStrings, TokenUsage, ProviderMetadata, JSONSchema, ToolExecutor, ToolCallState, MessagePart, TextPart, ReasoningPart, SourcePart, ToolCallPart, ToolResultPart, LeadCapturedPart, HandoffPart, } from './types.js';
2
+ export { partsOf, messageText } from './parts.js';
3
+ export { consoleLogger, jsonLogger, silentLogger, type Logger, type LogFields, type JsonLoggerOptions } from './logger.js';
4
+ export { PROTOCOL_VERSION, encodeSSE, SSE_PING, SSE_DONE, SSE_HEADERS, statusForError, errorBody, describeInvalidRequest, toLegacyChunk, aiSdkEncoder, fromAiSdkRequest, AI_SDK_STREAM_HEADER } from './protocol/index.js';
5
+ export type { AiSdkChunk, LegacyChunk, WirePart, WirePartType, WireErrorCode, WireFinishReason, WireAgent, WireErrorBody, ChatRequestV1, ClientToolManifest, } from './protocol/index.js';
6
+ export type { AIProvider, NormalizedMessage, NormalizedTurn, TurnPart, FinishReason, ProviderEvent, ProviderStepParams, } from './providers/index.js';
7
+ export { createProvider, isAIProvider, normalizeHistory, normalizeTurns, trimHistory, estimateTokens } from './providers/index.js';
8
+ export { registerProvider, type ProviderFactory } from './providers/registry.js';
9
+ export { toolInputSchema, legacyParametersToSchema, validateTools, ToolDefinitionError } from './providers/index.js';
10
+ export { runTurn, DEFAULT_MAX_STEPS, toolRegistry, executorRegistry, toolOutput, MAX_TOOL_OUTPUT_CHARS, RefusalError, ContentFilterError, MaxStepsError, } from './agent/index.js';
11
+ export type { RunTurnOptions, TurnResult, ToolRegistry, ToolRunContext } from './agent/index.js';
4
12
  export type { ChatTool, LeadCaptureCallback } from './tools/index.js';
5
13
  export { toolToDefinition, LeadCaptureTool } from './tools/index.js';
6
14
  export type { KnowledgeSource, FAQPair } from './knowledge/index.js';
7
15
  export { TextKnowledgeSource, FAQKnowledgeSource } from './knowledge/index.js';
16
+ export type { Embedder, RetrievedChunk, RetrievalQuery, Retriever, Reranker, OpenAIEmbedderOptions, GeminiEmbedderOptions, VoyageEmbedderOptions, VoyageRerankerOptions, CohereRerankerOptions, WorkersAiBinding, WorkersAiEmbedderOptions, WorkersAiRerankerOptions, RetrieverKnowledgeOptions, VectorRetrieverOptions, HybridRetrieverOptions, } from './retrieval/index.js';
17
+ export { openaiEmbedder, geminiEmbedder, voyageEmbedder, voyageReranker, cohereReranker, workersAiEmbedder, workersAiReranker, retrieverKnowledge, formatSources, uniqueChunks, SOURCES_INSTRUCTION, vectorRetriever, hybridRetriever, reciprocalRankFusion, retrievalQueryText, CitationParser, parseCitations, sourcePart, sourcesContext, CITE_INSTRUCTION, NATIVE_SOURCES_INSTRUCTION, } from './retrieval/index.js';
8
18
  export type { ConversationStore } from './conversation/index.js';
9
19
  export { ConversationManager, MemoryStore } from './conversation/index.js';
10
- export { AnalyticsCollector } from './analytics/index.js';
20
+ export type { ConversationManagerOptions, ReleaseTurn } from './conversation/index.js';
21
+ export type { AppendOptions, ChatCopsStorage, ConversationSummary, CounterStore, CounterValue, EventCount, EventQuery, EventSink, KeyValueStore, ListQuery, MemoryStorageOptions, ConversationStoreWithAppend, KeywordQuery, MetadataFilter, MetadataValue, ScoredRecord, VectorQuery, VectorRecord, VectorSource, VectorStore, MemoryVectorsOptions, } from './storage/index.js';
22
+ export { ConflictError, isConflictError, CONFLICT_ERROR_CODE, memoryStorage, memoryVectors, matchesFilter, segmentWords, withAppend, isLegacyConversationStore, } from './storage/index.js';
23
+ export { createBudgetGuard, BudgetExceededError, DEFAULT_BUDGETS, withDefaultBudgets } from './limits/budget.js';
24
+ export type { Budgets, BudgetLimit, BudgetContext, BudgetGuard, BudgetScope } from './limits/budget.js';
25
+ export { createRateLimiter } from './limits/rate-limit.js';
26
+ export type { RateLimitRule, RateLimitResult, RateLimiterOptions } from './limits/rate-limit.js';
27
+ export { AnalyticsCollector, BufferedEventSink, statsFromSink, ANALYTICS_EVENTS } from './analytics/index.js';
11
28
  export type { AnalyticsStats } from './analytics/index.js';
12
29
  export { getLocale, getAvailableLocales } from './i18n/index.js';
13
30
  export { en, es, hi, fr, de, ja, zh, ar } from './i18n/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGxH,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGrE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/E,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG3H,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,sBAAsB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3N,YAAY,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnI,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGrH,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGjG,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGrE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/E,YAAY,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,SAAS,EACT,QAAQ,EACR,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGvF,YAAY,EACV,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,2BAA2B,EAC3B,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACjH,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjG,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC9G,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,23 @@
1
- export { createProvider, normalizeHistory, ClaudeProvider, OpenAIProvider, GeminiProvider } from './providers/index.js';
1
+ export { partsOf, messageText } from './parts.js';
2
+ export { consoleLogger, jsonLogger, silentLogger } from './logger.js';
3
+ // Wire protocol
4
+ export { PROTOCOL_VERSION, encodeSSE, SSE_PING, SSE_DONE, SSE_HEADERS, statusForError, errorBody, describeInvalidRequest, toLegacyChunk, aiSdkEncoder, fromAiSdkRequest, AI_SDK_STREAM_HEADER } from './protocol/index.js';
5
+ export { createProvider, isAIProvider, normalizeHistory, normalizeTurns, trimHistory, estimateTokens } from './providers/index.js';
6
+ export { registerProvider } from './providers/registry.js';
7
+ export { toolInputSchema, legacyParametersToSchema, validateTools, ToolDefinitionError } from './providers/index.js';
8
+ // Turn engine
9
+ export { runTurn, DEFAULT_MAX_STEPS, toolRegistry, executorRegistry, toolOutput, MAX_TOOL_OUTPUT_CHARS, RefusalError, ContentFilterError, MaxStepsError, } from './agent/index.js';
2
10
  export { toolToDefinition, LeadCaptureTool } from './tools/index.js';
3
11
  export { TextKnowledgeSource, FAQKnowledgeSource } from './knowledge/index.js';
12
+ export { openaiEmbedder, geminiEmbedder, voyageEmbedder, voyageReranker, cohereReranker, workersAiEmbedder, workersAiReranker, retrieverKnowledge, formatSources, uniqueChunks, SOURCES_INSTRUCTION, vectorRetriever, hybridRetriever, reciprocalRankFusion, retrievalQueryText, CitationParser, parseCitations, sourcePart, sourcesContext, CITE_INSTRUCTION, NATIVE_SOURCES_INSTRUCTION, } from './retrieval/index.js';
4
13
  export { ConversationManager, MemoryStore } from './conversation/index.js';
14
+ export { ConflictError, isConflictError, CONFLICT_ERROR_CODE, memoryStorage, memoryVectors, matchesFilter, segmentWords, withAppend, isLegacyConversationStore, } from './storage/index.js';
15
+ // Budgets
16
+ export { createBudgetGuard, BudgetExceededError, DEFAULT_BUDGETS, withDefaultBudgets } from './limits/budget.js';
17
+ // Rate limiting
18
+ export { createRateLimiter } from './limits/rate-limit.js';
5
19
  // Analytics
6
- export { AnalyticsCollector } from './analytics/index.js';
20
+ export { AnalyticsCollector, BufferedEventSink, statsFromSink, ANALYTICS_EVENTS } from './analytics/index.js';
7
21
  // i18n
8
22
  export { getLocale, getAvailableLocales } from './i18n/index.js';
9
23
  export { en, es, hi, fr, de, ja, zh, ar } from './i18n/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIxH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIrE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI/E,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3E,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO;AACP,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAuD,MAAM,aAAa,CAAC;AAE3H,gBAAgB;AAChB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,sBAAsB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAwB3N,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnI,OAAO,EAAE,gBAAgB,EAAwB,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAErH,cAAc;AACd,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIrE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAqB/E,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA2B3E,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,UAAU;AACV,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGjH,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG9G,OAAO;AACP,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,5 +1,13 @@
1
+ import type { RetrievalQuery, RetrievedChunk } from '../retrieval/types.js';
1
2
  export interface KnowledgeSource {
2
3
  type: string;
4
+ /** Text added to the model's context for a message. */
3
5
  getContext(query: string): Promise<string>;
6
+ /**
7
+ * The matching chunks themselves, with the conversation so far for
8
+ * follow-up questions. When a source has this, the server uses it instead
9
+ * of `getContext`, so answers can say which page they came from.
10
+ */
11
+ retrieve?(query: RetrievalQuery): Promise<RetrievedChunk[]>;
4
12
  }
5
13
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/knowledge/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/knowledge/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhD"}
1
+ {"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"AAKA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhD"}
@@ -1,7 +1,7 @@
1
+ import { segmentWords } from '../storage/memory-vectors.js';
2
+ const CJK_SCRIPTS = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u;
3
+ const PARTICLE = /^\p{Script=Hiragana}$/u;
1
4
  export function tokenize(query) {
2
- return query
3
- .toLowerCase()
4
- .split(/[^\p{L}\p{N}]+/u)
5
- .filter((w) => w.length > 2);
5
+ return segmentWords(query).filter((w) => !PARTICLE.test(w) && (w.length > 2 || CJK_SCRIPTS.test(w)));
6
6
  }
7
7
  //# sourceMappingURL=tokenize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,KAAK,CAAC,iBAAiB,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,WAAW,GAAG,0EAA0E,CAAC;AAC/F,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvG,CAAC"}
@@ -0,0 +1,84 @@
1
+ import type { CounterStore } from '../storage/types.js';
2
+ import type { TokenUsage } from '../types.js';
3
+ /** How much a scope may use. Unset limits don't apply. */
4
+ export interface BudgetLimit {
5
+ /** Input plus output tokens, counted at face value (cached input included). */
6
+ tokens?: number;
7
+ /** Replies. */
8
+ messages?: number;
9
+ }
10
+ /** `false` turns a scope off, including its default. */
11
+ export interface Budgets {
12
+ /** Over a conversation's lifetime (counters kept 30 days). */
13
+ perConversation?: BudgetLimit | false;
14
+ /** Per visitor IP, per UTC day. Skipped for requests without a known IP. */
15
+ perIpPerDay?: BudgetLimit | false;
16
+ /** Everything together, per UTC day: the backstop for a bill you didn't expect. */
17
+ globalPerDay?: (BudgetLimit & {
18
+ /** Dollars, priced with `price`. */
19
+ usd?: number;
20
+ }) | false;
21
+ /**
22
+ * What a step cost in dollars, for `globalPerDay.usd`. Price cached input
23
+ * at its discount here; token budgets count it in full.
24
+ */
25
+ price?: (usage: TokenUsage) => number;
26
+ }
27
+ /** Who a reply is for. */
28
+ export interface BudgetContext {
29
+ conversationId: string;
30
+ ip?: string;
31
+ }
32
+ export type BudgetScope = 'conversation' | 'ip' | 'global';
33
+ /** A budget is used up. The reply ends with `budget_exceeded`. */
34
+ export declare class BudgetExceededError extends Error {
35
+ readonly scope: BudgetScope;
36
+ readonly code = "budget_exceeded";
37
+ constructor(scope: BudgetScope);
38
+ }
39
+ export interface BudgetGuard {
40
+ /**
41
+ * Checks the budgets before a model request. Throws `BudgetExceededError`
42
+ * when one is used up. Resolves the most tokens left in any token budget,
43
+ * so the caller can cap the reply length.
44
+ */
45
+ before(context: BudgetContext, step: number): Promise<{
46
+ tokensLeft?: number;
47
+ }>;
48
+ /** Charges a model request's usage. */
49
+ after(context: BudgetContext, usage: TokenUsage): Promise<void>;
50
+ }
51
+ /**
52
+ * What applies when a scope isn't set. Replies, not tokens, per conversation:
53
+ * the widget keeps a conversation across visits, and a token count there
54
+ * would grow with the size of your system prompt. Tokens per IP per day are
55
+ * the cost backstop, since a script can start new conversations at will.
56
+ * There's no global default, because no number fits every site.
57
+ */
58
+ export declare const DEFAULT_BUDGETS: {
59
+ readonly perConversation: {
60
+ readonly messages: 200;
61
+ };
62
+ readonly perIpPerDay: {
63
+ readonly tokens: 2000000;
64
+ };
65
+ };
66
+ /**
67
+ * Fills the scopes you didn't set with `DEFAULT_BUDGETS`. A scope you set
68
+ * replaces its default whole; `false` turns it off. `false` for the whole
69
+ * option turns budgets off and resolves `undefined`.
70
+ */
71
+ export declare function withDefaultBudgets(budgets?: Budgets | false): {
72
+ budgets: Budgets;
73
+ defaulted: BudgetScope[];
74
+ } | undefined;
75
+ /**
76
+ * Token, reply and dollar budgets on a `CounterStore`, so they hold across
77
+ * server instances. Checked before each model request and charged after it,
78
+ * so a reply can go over by at most one request.
79
+ */
80
+ export declare function createBudgetGuard(counters: CounterStore, budgets: Budgets, options?: {
81
+ prefix?: string;
82
+ now?: () => number;
83
+ }): BudgetGuard;
84
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/limits/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wDAAwD;AACxD,MAAM,WAAW,OAAO;IACtB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IACtC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAClC,mFAAmF;IACnF,YAAY,CAAC,EACT,CAAC,WAAW,GAAG;QACb,oCAAoC;QACpC,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,GACF,KAAK,CAAC;IACV;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;CACvC;AAED,0BAA0B;AAC1B,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,IAAI,GAAG,QAAQ,CAAC;AAE3D,kEAAkE;AAClE,qBAAa,mBAAoB,SAAQ,KAAK;IAGhC,QAAQ,CAAC,KAAK,EAAE,WAAW;IAFvC,QAAQ,CAAC,IAAI,qBAAqB;gBAEb,KAAK,EAAE,WAAW;CAIxC;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,uCAAuC;IACvC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;;;;CAGA,CAAC;AAI7B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,SAAS,CAaxH;AAYD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GACpD,WAAW,CAgEb"}
@@ -0,0 +1,114 @@
1
+ /** A budget is used up. The reply ends with `budget_exceeded`. */
2
+ export class BudgetExceededError extends Error {
3
+ scope;
4
+ code = 'budget_exceeded';
5
+ constructor(scope) {
6
+ super(`The ${scope} budget is used up.`);
7
+ this.scope = scope;
8
+ this.name = 'BudgetExceededError';
9
+ }
10
+ }
11
+ /**
12
+ * What applies when a scope isn't set. Replies, not tokens, per conversation:
13
+ * the widget keeps a conversation across visits, and a token count there
14
+ * would grow with the size of your system prompt. Tokens per IP per day are
15
+ * the cost backstop, since a script can start new conversations at will.
16
+ * There's no global default, because no number fits every site.
17
+ */
18
+ export const DEFAULT_BUDGETS = {
19
+ perConversation: { messages: 200 },
20
+ perIpPerDay: { tokens: 2_000_000 },
21
+ };
22
+ const SCOPE_KEYS = ['perConversation', 'perIpPerDay', 'globalPerDay'];
23
+ /**
24
+ * Fills the scopes you didn't set with `DEFAULT_BUDGETS`. A scope you set
25
+ * replaces its default whole; `false` turns it off. `false` for the whole
26
+ * option turns budgets off and resolves `undefined`.
27
+ */
28
+ export function withDefaultBudgets(budgets) {
29
+ if (budgets === false)
30
+ return undefined;
31
+ const out = { ...budgets };
32
+ const defaulted = [];
33
+ if (out.perConversation === undefined) {
34
+ out.perConversation = DEFAULT_BUDGETS.perConversation;
35
+ defaulted.push('conversation');
36
+ }
37
+ if (out.perIpPerDay === undefined) {
38
+ out.perIpPerDay = DEFAULT_BUDGETS.perIpPerDay;
39
+ defaulted.push('ip');
40
+ }
41
+ return SCOPE_KEYS.some((key) => out[key]) ? { budgets: out, defaulted } : undefined;
42
+ }
43
+ const DAY_MS = 24 * 60 * 60 * 1000;
44
+ const CONVERSATION_TTL_MS = 30 * DAY_MS;
45
+ /**
46
+ * Token, reply and dollar budgets on a `CounterStore`, so they hold across
47
+ * server instances. Checked before each model request and charged after it,
48
+ * so a reply can go over by at most one request.
49
+ */
50
+ export function createBudgetGuard(counters, budgets, options = {}) {
51
+ const prefix = options.prefix ?? 'budget';
52
+ const now = options.now ?? Date.now;
53
+ if (budgets.globalPerDay && budgets.globalPerDay.usd !== undefined && !budgets.price) {
54
+ throw new Error('budgets.globalPerDay.usd needs budgets.price to know what a request costs.');
55
+ }
56
+ for (const name of SCOPE_KEYS) {
57
+ const limit = budgets[name];
58
+ if (limit === undefined || limit === false)
59
+ continue;
60
+ if (typeof limit !== 'object' || limit === null)
61
+ throw new Error(`budgets.${name} must be an object or false.`);
62
+ for (const [field, value] of Object.entries(limit)) {
63
+ if (typeof value !== 'number' || !(value > 0))
64
+ throw new Error(`budgets.${name}.${field} must be a positive number.`);
65
+ }
66
+ }
67
+ function scopes(context) {
68
+ const day = Math.floor(now() / DAY_MS);
69
+ const out = [];
70
+ if (budgets.perConversation) {
71
+ out.push({ scope: 'conversation', limit: budgets.perConversation, key: `${prefix}:c:${context.conversationId}`, ttlMs: CONVERSATION_TTL_MS });
72
+ }
73
+ if (budgets.perIpPerDay && context.ip) {
74
+ out.push({ scope: 'ip', limit: budgets.perIpPerDay, key: `${prefix}:ip:${context.ip}:${day}`, ttlMs: 2 * DAY_MS });
75
+ }
76
+ if (budgets.globalPerDay) {
77
+ out.push({ scope: 'global', limit: budgets.globalPerDay, key: `${prefix}:g:${day}`, ttlMs: 2 * DAY_MS });
78
+ }
79
+ return out;
80
+ }
81
+ const used = async (key) => (await counters.get(key))?.value ?? 0;
82
+ return {
83
+ async before(context, step) {
84
+ let tokensLeft;
85
+ for (const { scope, limit, key, ttlMs } of scopes(context)) {
86
+ if (limit.messages !== undefined && step === 1) {
87
+ // Counted when the reply starts, atomically, so a burst can't all pass.
88
+ const { value } = await counters.increment(`${key}:messages`, 1, ttlMs);
89
+ if (value > limit.messages)
90
+ throw new BudgetExceededError(scope);
91
+ }
92
+ if (limit.tokens !== undefined) {
93
+ const left = limit.tokens - (await used(`${key}:tokens`));
94
+ if (left <= 0)
95
+ throw new BudgetExceededError(scope);
96
+ tokensLeft = Math.min(tokensLeft ?? left, left);
97
+ }
98
+ if (limit.usd !== undefined && (await used(`${key}:usd`)) >= limit.usd) {
99
+ throw new BudgetExceededError(scope);
100
+ }
101
+ }
102
+ return tokensLeft === undefined ? {} : { tokensLeft };
103
+ },
104
+ async after(context, usage) {
105
+ const tokens = usage.inputTokens + usage.outputTokens;
106
+ const usd = budgets.price ? budgets.price(usage) : 0;
107
+ await Promise.all(scopes(context).flatMap(({ limit, key, ttlMs }) => [
108
+ ...(limit.tokens !== undefined && tokens > 0 ? [counters.increment(`${key}:tokens`, tokens, ttlMs)] : []),
109
+ ...(limit.usd !== undefined && usd > 0 ? [counters.increment(`${key}:usd`, usd, ttlMs)] : []),
110
+ ]));
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/limits/budget.ts"],"names":[],"mappings":"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"}