@chatcops/core 0.3.2 → 0.5.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 (162) 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 +68 -0
  14. package/dist/agent/run-turn.d.ts.map +1 -0
  15. package/dist/agent/run-turn.js +344 -0
  16. package/dist/agent/run-turn.js.map +1 -0
  17. package/dist/agent/tool-registry.d.ts +28 -0
  18. package/dist/agent/tool-registry.d.ts.map +1 -0
  19. package/dist/agent/tool-registry.js +69 -0
  20. package/dist/agent/tool-registry.js.map +1 -0
  21. package/dist/analytics/index.d.ts +1 -0
  22. package/dist/analytics/index.d.ts.map +1 -1
  23. package/dist/analytics/index.js +1 -0
  24. package/dist/analytics/index.js.map +1 -1
  25. package/dist/analytics/sink.d.ts +24 -0
  26. package/dist/analytics/sink.d.ts.map +1 -0
  27. package/dist/analytics/sink.js +106 -0
  28. package/dist/analytics/sink.js.map +1 -0
  29. package/dist/conversation/index.d.ts +1 -0
  30. package/dist/conversation/index.d.ts.map +1 -1
  31. package/dist/conversation/index.js.map +1 -1
  32. package/dist/conversation/manager.d.ts +62 -6
  33. package/dist/conversation/manager.d.ts.map +1 -1
  34. package/dist/conversation/manager.js +109 -30
  35. package/dist/conversation/manager.js.map +1 -1
  36. package/dist/conversation/store.d.ts +6 -5
  37. package/dist/conversation/store.d.ts.map +1 -1
  38. package/dist/conversation/store.js +4 -0
  39. package/dist/conversation/store.js.map +1 -1
  40. package/dist/index.d.ts +18 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +14 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/limits/budget.d.ts +84 -0
  45. package/dist/limits/budget.d.ts.map +1 -0
  46. package/dist/limits/budget.js +114 -0
  47. package/dist/limits/budget.js.map +1 -0
  48. package/dist/limits/rate-limit.d.ts +53 -0
  49. package/dist/limits/rate-limit.d.ts.map +1 -0
  50. package/dist/limits/rate-limit.js +68 -0
  51. package/dist/limits/rate-limit.js.map +1 -0
  52. package/dist/parts.d.ts +9 -0
  53. package/dist/parts.d.ts.map +1 -0
  54. package/dist/parts.js +17 -0
  55. package/dist/parts.js.map +1 -0
  56. package/dist/protocol/ai-sdk.d.ts +27 -0
  57. package/dist/protocol/ai-sdk.d.ts.map +1 -0
  58. package/dist/protocol/ai-sdk.js +127 -0
  59. package/dist/protocol/ai-sdk.js.map +1 -0
  60. package/dist/protocol/errors.d.ts +10 -0
  61. package/dist/protocol/errors.d.ts.map +1 -0
  62. package/dist/protocol/errors.js +42 -0
  63. package/dist/protocol/errors.js.map +1 -0
  64. package/dist/protocol/index.d.ts +9 -0
  65. package/dist/protocol/index.d.ts.map +1 -0
  66. package/dist/protocol/index.js +6 -0
  67. package/dist/protocol/index.js.map +1 -0
  68. package/dist/protocol/legacy.d.ts +18 -0
  69. package/dist/protocol/legacy.d.ts.map +1 -0
  70. package/dist/protocol/legacy.js +41 -0
  71. package/dist/protocol/legacy.js.map +1 -0
  72. package/dist/protocol/sse.d.ts +10 -0
  73. package/dist/protocol/sse.d.ts.map +1 -0
  74. package/dist/protocol/sse.js +15 -0
  75. package/dist/protocol/sse.js.map +1 -0
  76. package/dist/protocol/v1.d.ts +140 -0
  77. package/dist/protocol/v1.d.ts.map +1 -0
  78. package/dist/protocol/v1.js +15 -0
  79. package/dist/protocol/v1.js.map +1 -0
  80. package/dist/providers/base.d.ts +17 -15
  81. package/dist/providers/base.d.ts.map +1 -1
  82. package/dist/providers/base.js +43 -31
  83. package/dist/providers/base.js.map +1 -1
  84. package/dist/providers/claude.d.ts +40 -2
  85. package/dist/providers/claude.d.ts.map +1 -1
  86. package/dist/providers/claude.js +250 -113
  87. package/dist/providers/claude.js.map +1 -1
  88. package/dist/providers/gemini.d.ts +23 -3
  89. package/dist/providers/gemini.d.ts.map +1 -1
  90. package/dist/providers/gemini.js +245 -102
  91. package/dist/providers/gemini.js.map +1 -1
  92. package/dist/providers/history.d.ts +52 -0
  93. package/dist/providers/history.d.ts.map +1 -0
  94. package/dist/providers/history.js +212 -0
  95. package/dist/providers/history.js.map +1 -0
  96. package/dist/providers/index.d.ts +5 -5
  97. package/dist/providers/index.d.ts.map +1 -1
  98. package/dist/providers/index.js +5 -4
  99. package/dist/providers/index.js.map +1 -1
  100. package/dist/providers/openai.d.ts +37 -3
  101. package/dist/providers/openai.d.ts.map +1 -1
  102. package/dist/providers/openai.js +246 -140
  103. package/dist/providers/openai.js.map +1 -1
  104. package/dist/providers/registry.d.ts +7 -0
  105. package/dist/providers/registry.d.ts.map +1 -0
  106. package/dist/providers/registry.js +12 -0
  107. package/dist/providers/registry.js.map +1 -0
  108. package/dist/providers/schema.d.ts +16 -0
  109. package/dist/providers/schema.d.ts.map +1 -0
  110. package/dist/providers/schema.js +80 -0
  111. package/dist/providers/schema.js.map +1 -0
  112. package/dist/providers/tool-execution.d.ts +10 -0
  113. package/dist/providers/tool-execution.d.ts.map +1 -1
  114. package/dist/providers/tool-execution.js +38 -12
  115. package/dist/providers/tool-execution.js.map +1 -1
  116. package/dist/providers/types.d.ts +71 -0
  117. package/dist/providers/types.d.ts.map +1 -0
  118. package/dist/providers/types.js +2 -0
  119. package/dist/providers/types.js.map +1 -0
  120. package/dist/storage/adapt.d.ts +15 -0
  121. package/dist/storage/adapt.d.ts.map +1 -0
  122. package/dist/storage/adapt.js +83 -0
  123. package/dist/storage/adapt.js.map +1 -0
  124. package/dist/storage/errors.d.ts +18 -0
  125. package/dist/storage/errors.d.ts.map +1 -0
  126. package/dist/storage/errors.js +28 -0
  127. package/dist/storage/errors.js.map +1 -0
  128. package/dist/storage/index.d.ts +5 -0
  129. package/dist/storage/index.d.ts.map +1 -0
  130. package/dist/storage/index.js +4 -0
  131. package/dist/storage/index.js.map +1 -0
  132. package/dist/storage/memory.d.ts +24 -0
  133. package/dist/storage/memory.d.ts.map +1 -0
  134. package/dist/storage/memory.js +265 -0
  135. package/dist/storage/memory.js.map +1 -0
  136. package/dist/storage/types.d.ts +118 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +2 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/testing/conformance.d.ts +29 -0
  141. package/dist/testing/conformance.d.ts.map +1 -0
  142. package/dist/testing/conformance.js +335 -0
  143. package/dist/testing/conformance.js.map +1 -0
  144. package/dist/testing/index.d.ts +3 -0
  145. package/dist/testing/index.d.ts.map +1 -0
  146. package/dist/testing/index.js +5 -0
  147. package/dist/testing/index.js.map +1 -0
  148. package/dist/testing/provider.d.ts +45 -0
  149. package/dist/testing/provider.d.ts.map +1 -0
  150. package/dist/testing/provider.js +82 -0
  151. package/dist/testing/provider.js.map +1 -0
  152. package/dist/tools/base.d.ts +14 -4
  153. package/dist/tools/base.d.ts.map +1 -1
  154. package/dist/tools/base.js +4 -2
  155. package/dist/tools/base.js.map +1 -1
  156. package/dist/tools/lead-capture.d.ts +3 -1
  157. package/dist/tools/lead-capture.d.ts.map +1 -1
  158. package/dist/tools/lead-capture.js +6 -1
  159. package/dist/tools/lead-capture.js.map +1 -1
  160. package/dist/types.d.ts +168 -4
  161. package/dist/types.d.ts.map +1 -1
  162. package/package.json +53 -5
@@ -0,0 +1,69 @@
1
+ import { runToolWithTimeout, serializeToolResult } from '../providers/tool-execution.js';
2
+ import { toolToDefinition } from '../tools/base.js';
3
+ /**
4
+ * Lead capture before tools could emit parts: a successful `capture_lead`
5
+ * call adds a `lead-captured` part with the result's data. Kept for custom
6
+ * lead tools written for 0.4.
7
+ */
8
+ function legacyLeadPart(name, result) {
9
+ if (name !== 'capture_lead' || !result.success || !result.data)
10
+ return [];
11
+ return [{ type: 'lead-captured', lead: result.data }];
12
+ }
13
+ /** A registry over `ChatTool` objects, as the server configures them. */
14
+ export function toolRegistry(tools = []) {
15
+ const byName = new Map(tools.map((tool) => [tool.name, tool]));
16
+ return {
17
+ definitions: tools.map(toolToDefinition),
18
+ run(call, { conversationId, signal, timeoutMs }) {
19
+ const tool = byName.get(call.name);
20
+ if (!tool)
21
+ return Promise.resolve({ success: false, message: `Unknown tool: ${call.name}` });
22
+ return runToolWithTimeout((toolSignal) => tool.execute(call.input, { conversationId, signal: toolSignal }), {
23
+ timeoutMs,
24
+ signal,
25
+ });
26
+ },
27
+ emits(call, result) {
28
+ const tool = byName.get(call.name);
29
+ return tool?.emits ? tool.emits(result) : legacyLeadPart(call.name, result);
30
+ },
31
+ };
32
+ }
33
+ /**
34
+ * A registry over tool definitions and one executor function, the 0.4
35
+ * `toolExecutor` shape. The executor gets the call and nothing else.
36
+ */
37
+ export function executorRegistry(definitions = [], executor) {
38
+ return {
39
+ definitions,
40
+ run(call, { signal, timeoutMs }) {
41
+ if (!executor) {
42
+ return Promise.resolve({ success: false, message: `No tool executor is configured for "${call.name}".` });
43
+ }
44
+ return runToolWithTimeout(() => executor(call), { timeoutMs, signal });
45
+ },
46
+ emits: (call, result) => legacyLeadPart(call.name, result),
47
+ };
48
+ }
49
+ /** Tool output is stored with the conversation, so it's kept to JSON and a size. */
50
+ export const MAX_TOOL_OUTPUT_CHARS = 64_000;
51
+ /** The stored output of a call: what the model saw, as plain JSON. */
52
+ export function toolOutput(result) {
53
+ const output = serializeToolResult(result);
54
+ let json;
55
+ try {
56
+ json = JSON.stringify(output);
57
+ }
58
+ catch {
59
+ return { success: false, message: "The tool returned something that isn't JSON." };
60
+ }
61
+ if (json.length <= MAX_TOOL_OUTPUT_CHARS)
62
+ return JSON.parse(json);
63
+ return {
64
+ success: result.success,
65
+ data: `${JSON.stringify(output.data).slice(0, MAX_TOOL_OUTPUT_CHARS)}... (cut off: the tool returned more than ${MAX_TOOL_OUTPUT_CHARS} characters)`,
66
+ ...(result.message ? { message: result.message } : {}),
67
+ };
68
+ }
69
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/agent/tool-registry.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export { AnalyticsCollector } from './collector.js';
2
2
  export type { AnalyticsStats } from './collector.js';
3
+ export { BufferedEventSink, statsFromSink } from './sink.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { AnalyticsCollector } from './collector.js';
2
+ export { BufferedEventSink, statsFromSink } from './sink.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { EventSink } from '../storage/types.js';
2
+ import type { AnalyticsStats } from './collector.js';
3
+ export declare class BufferedEventSink {
4
+ private readonly sink;
5
+ private readonly events;
6
+ private readonly maxBatch;
7
+ private readonly flushMs;
8
+ private timer;
9
+ private flushPromise;
10
+ constructor(sink: EventSink, options?: {
11
+ maxBatch?: number;
12
+ flushMs?: number;
13
+ });
14
+ track(type: string, data?: Record<string, unknown>): void;
15
+ flush(): Promise<void>;
16
+ private scheduleFlush;
17
+ private clearTimer;
18
+ private startAutomaticFlush;
19
+ }
20
+ export declare function statsFromSink(sink: EventSink, range: {
21
+ from: number;
22
+ to: number;
23
+ }): Promise<AnalyticsStats>;
24
+ //# sourceMappingURL=sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../src/analytics/sink.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKrD,qBAAa,iBAAiB;IAQ1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,YAAY,CAA4B;gBAG7B,IAAI,EAAE,SAAS,EAChC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAanD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,mBAAmB;CAK5B;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAClC,OAAO,CAAC,cAAc,CAAC,CAsBzB"}
@@ -0,0 +1,106 @@
1
+ const DEFAULT_MAX_BATCH = 50;
2
+ const DEFAULT_FLUSH_MS = 2000;
3
+ export class BufferedEventSink {
4
+ sink;
5
+ events = [];
6
+ maxBatch;
7
+ flushMs;
8
+ timer;
9
+ flushPromise;
10
+ constructor(sink, options) {
11
+ this.sink = sink;
12
+ this.maxBatch = options?.maxBatch ?? DEFAULT_MAX_BATCH;
13
+ this.flushMs = options?.flushMs ?? DEFAULT_FLUSH_MS;
14
+ if (!Number.isInteger(this.maxBatch) || this.maxBatch < 1) {
15
+ throw new RangeError('maxBatch must be a positive integer.');
16
+ }
17
+ if (!Number.isFinite(this.flushMs) || this.flushMs < 0) {
18
+ throw new RangeError('flushMs must be a non-negative finite number.');
19
+ }
20
+ }
21
+ track(type, data) {
22
+ const wasEmpty = this.events.length === 0;
23
+ this.events.push({ type, data, timestamp: Date.now() });
24
+ if (wasEmpty)
25
+ this.scheduleFlush();
26
+ if (this.events.length >= this.maxBatch)
27
+ this.startAutomaticFlush();
28
+ }
29
+ flush() {
30
+ if (this.flushPromise)
31
+ return this.flushPromise;
32
+ this.clearTimer();
33
+ const drain = Promise.resolve().then(async () => {
34
+ while (this.events.length > 0) {
35
+ this.clearTimer();
36
+ const batch = this.events.splice(0, this.maxBatch);
37
+ try {
38
+ await this.sink.write(batch);
39
+ }
40
+ catch (error) {
41
+ console.error(`[chatcops] analytics write failed: ${errorMessage(error)}`);
42
+ }
43
+ }
44
+ });
45
+ const flushPromise = drain.finally(() => {
46
+ if (this.flushPromise === flushPromise)
47
+ this.flushPromise = undefined;
48
+ if (this.events.length > 0)
49
+ this.startAutomaticFlush();
50
+ });
51
+ this.flushPromise = flushPromise;
52
+ return flushPromise;
53
+ }
54
+ scheduleFlush() {
55
+ try {
56
+ const timer = setTimeout(() => {
57
+ this.timer = undefined;
58
+ this.startAutomaticFlush();
59
+ }, this.flushMs);
60
+ this.timer = timer;
61
+ if (typeof timer === 'object' && timer !== null && 'unref' in timer && typeof timer.unref === 'function') {
62
+ timer.unref();
63
+ }
64
+ }
65
+ catch (error) {
66
+ this.clearTimer();
67
+ console.error(`[chatcops] analytics timer failed: ${errorMessage(error)}`);
68
+ this.startAutomaticFlush();
69
+ }
70
+ }
71
+ clearTimer() {
72
+ if (this.timer === undefined)
73
+ return;
74
+ clearTimeout(this.timer);
75
+ this.timer = undefined;
76
+ }
77
+ startAutomaticFlush() {
78
+ void this.flush().catch((error) => {
79
+ console.error(`[chatcops] analytics flush failed: ${errorMessage(error)}`);
80
+ });
81
+ }
82
+ }
83
+ export async function statsFromSink(sink, range) {
84
+ if (!sink.query) {
85
+ throw new Error('Event sink does not support querying; implement EventSink.query to calculate analytics statistics.');
86
+ }
87
+ const counts = await sink.query(range);
88
+ const eventCounts = new Map();
89
+ for (const { type, count } of counts) {
90
+ eventCounts.set(type, (eventCounts.get(type) ?? 0) + count);
91
+ }
92
+ const totalConversations = eventCounts.get('conversation:started') ?? 0;
93
+ const totalMessages = (eventCounts.get('message:sent') ?? 0) + (eventCounts.get('message:received') ?? 0);
94
+ return {
95
+ totalConversations,
96
+ totalMessages,
97
+ leadsCapture: eventCounts.get('lead:captured') ?? 0,
98
+ averageMessagesPerConversation: totalConversations > 0 ? totalMessages / totalConversations : 0,
99
+ eventCounts: Object.fromEntries(eventCounts),
100
+ };
101
+ }
102
+ function errorMessage(error) {
103
+ const message = error instanceof Error ? error.message : String(error);
104
+ return message.replace(/[\r\n]+/g, ' ');
105
+ }
106
+ //# sourceMappingURL=sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sink.js","sourceRoot":"","sources":["../../src/analytics/sink.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export { ConversationManager } from './manager.js';
2
+ export type { ConversationManagerOptions, ReleaseTurn } from './manager.js';
2
3
  export type { ConversationStore } from './store.js';
3
4
  export { MemoryStore } from './store.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -1,16 +1,72 @@
1
+ import type { AppendOptions, ChatCopsStorage } from '../storage/types.js';
1
2
  import type { ChatMessage, Conversation } from '../types.js';
2
3
  import type { ConversationStore } from './store.js';
4
+ export interface ConversationManagerOptions {
5
+ /** Where everything is stored. Takes precedence over `store`. */
6
+ storage?: ChatCopsStorage;
7
+ /** A conversation store on its own, as in 0.4. */
8
+ store?: ConversationStore;
9
+ /**
10
+ * Most messages kept per conversation. Older ones are removed after each
11
+ * write; system messages stay. Default 100.
12
+ */
13
+ maxMessages?: number;
14
+ /** Token budget for the history sent to the model. Default 32,000. */
15
+ maxHistoryTokens?: number;
16
+ }
17
+ /** Releases a turn lock. Safe to call more than once. */
18
+ export type ReleaseTurn = () => Promise<void>;
19
+ /**
20
+ * Reads and writes conversations through a store. Writes are appends, so two
21
+ * server instances answering the same conversation don't overwrite each
22
+ * other's messages, as long as the store implements `append`.
23
+ */
3
24
  export declare class ConversationManager {
4
- private store;
5
- private maxMessages;
6
- constructor(options?: {
7
- store?: ConversationStore;
8
- maxMessages?: number;
9
- });
25
+ private readonly store;
26
+ private readonly kv;
27
+ private readonly maxMessages;
28
+ private readonly maxHistoryTokens;
29
+ private readonly localTurns;
30
+ constructor(options?: ConversationManagerOptions);
31
+ /**
32
+ * The stored conversation, or a new empty one. A new conversation isn't
33
+ * saved until its first message is added.
34
+ */
10
35
  getOrCreate(id: string): Promise<Conversation>;
36
+ /** Adds one message and returns the conversation as stored afterwards. */
11
37
  addMessage(conversationId: string, message: ChatMessage): Promise<Conversation>;
38
+ /**
39
+ * Adds messages atomically and returns the new version. Pass
40
+ * `expectedVersion` to fail with a `ConflictError` when another request
41
+ * wrote first.
42
+ */
43
+ appendMessages(conversationId: string, messages: ChatMessage[], options?: AppendOptions): Promise<{
44
+ version: number;
45
+ }>;
46
+ /** Replaces a stored message with the same id. Resolves `false` when there's none. */
47
+ updateMessage(conversationId: string, message: ChatMessage): Promise<boolean>;
12
48
  getMessages(conversationId: string): Promise<ChatMessage[]>;
49
+ /**
50
+ * The messages to send to the model: user and assistant turns within the
51
+ * token budget, keeping the first user message and the newest ones.
52
+ */
53
+ getHistory(conversationId: string): Promise<ChatMessage[]>;
13
54
  removeMessage(conversationId: string, messageId: string): Promise<void>;
14
55
  deleteConversation(id: string): Promise<void>;
56
+ /**
57
+ * Makes sure only one reply is generated for a conversation at a time.
58
+ * Resolves a release function, or `null` when another turn holds the lock.
59
+ * The lock expires after `ttlMs` in case a server dies mid-turn.
60
+ *
61
+ * With `storage.kv` (and `setIfAbsent`) the lock holds across instances;
62
+ * otherwise only within this process.
63
+ */
64
+ acquireTurn(conversationId: string, ttlMs?: number): Promise<ReleaseTurn | null>;
65
+ /**
66
+ * Removes the oldest non-system messages past `maxMessages`, one atomic
67
+ * remove each, then any assistant turns left at the front, so the stored
68
+ * history still opens with the visitor (Gemini rejects one that doesn't).
69
+ */
70
+ private enforceMaxMessages;
15
71
  }
16
72
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,iBAAiB,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAKnE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAc9C,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB/E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAK3D,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvE,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpD"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAiB,MAAM,qBAAqB,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,kDAAkD;IAClD,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9C;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;gBAEpC,OAAO,GAAE,0BAA+B;IAcpD;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOpD,0EAA0E;IACpE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAKrF;;;;OAIG;IACG,cAAc,CAClB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAM/B,sFAAsF;IACtF,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAKjE;;;OAGG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI1D,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;;;;;;OAOG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,SAAU,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA8BvF;;;;OAIG;YACW,kBAAkB;CAWjC"}
@@ -1,52 +1,131 @@
1
- import { MemoryStore } from './store.js';
1
+ import { warnOnce } from '../providers/base.js';
2
+ import { DEFAULT_MAX_HISTORY_TOKENS, trimHistory } from '../providers/history.js';
3
+ import { isLegacyConversationStore, withAppend } from '../storage/adapt.js';
4
+ import { memoryStorage } from '../storage/memory.js';
5
+ /**
6
+ * Reads and writes conversations through a store. Writes are appends, so two
7
+ * server instances answering the same conversation don't overwrite each
8
+ * other's messages, as long as the store implements `append`.
9
+ */
2
10
  export class ConversationManager {
3
11
  store;
12
+ kv;
4
13
  maxMessages;
5
- constructor(options) {
6
- this.store = options?.store ?? new MemoryStore();
7
- this.maxMessages = options?.maxMessages ?? 100;
14
+ maxHistoryTokens;
15
+ localTurns = new Set();
16
+ constructor(options = {}) {
17
+ const store = options.storage?.conversations ?? options.store ?? memoryStorage().conversations;
18
+ if (isLegacyConversationStore(store)) {
19
+ warnOnce('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().");
20
+ }
21
+ this.store = withAppend(store);
22
+ this.kv = options.storage?.kv;
23
+ this.maxMessages = options.maxMessages ?? 100;
24
+ this.maxHistoryTokens = options.maxHistoryTokens ?? DEFAULT_MAX_HISTORY_TOKENS;
8
25
  }
26
+ /**
27
+ * The stored conversation, or a new empty one. A new conversation isn't
28
+ * saved until its first message is added.
29
+ */
9
30
  async getOrCreate(id) {
10
31
  const existing = await this.store.get(id);
11
32
  if (existing)
12
33
  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;
34
+ const time = Date.now();
35
+ return { id, messages: [], version: 0, createdAt: time, updatedAt: time };
21
36
  }
37
+ /** Adds one message and returns the conversation as stored afterwards. */
22
38
  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
- const recentMessages = conversation.messages
29
- .filter((m) => m.role !== 'system')
30
- .slice(-(this.maxMessages - systemMessages.length));
31
- conversation.messages = [...systemMessages, ...recentMessages];
32
- }
33
- await this.store.save(conversation);
34
- return conversation;
39
+ await this.appendMessages(conversationId, [message]);
40
+ return this.getOrCreate(conversationId);
41
+ }
42
+ /**
43
+ * Adds messages atomically and returns the new version. Pass
44
+ * `expectedVersion` to fail with a `ConflictError` when another request
45
+ * wrote first.
46
+ */
47
+ async appendMessages(conversationId, messages, options) {
48
+ const result = await this.store.append(conversationId, messages, options);
49
+ await this.enforceMaxMessages(conversationId);
50
+ return result;
51
+ }
52
+ /** Replaces a stored message with the same id. Resolves `false` when there's none. */
53
+ updateMessage(conversationId, message) {
54
+ return this.store.updateMessage(conversationId, message);
35
55
  }
36
56
  async getMessages(conversationId) {
37
57
  const conversation = await this.store.get(conversationId);
38
58
  return conversation?.messages ?? [];
39
59
  }
60
+ /**
61
+ * The messages to send to the model: user and assistant turns within the
62
+ * token budget, keeping the first user message and the newest ones.
63
+ */
64
+ async getHistory(conversationId) {
65
+ return trimHistory(await this.getMessages(conversationId), this.maxHistoryTokens);
66
+ }
40
67
  async removeMessage(conversationId, messageId) {
41
- const conversation = await this.store.get(conversationId);
42
- if (!conversation)
43
- return;
44
- conversation.messages = conversation.messages.filter((message) => message.id !== messageId);
45
- conversation.updatedAt = Date.now();
46
- await this.store.save(conversation);
68
+ await this.store.removeMessage(conversationId, messageId);
47
69
  }
48
70
  async deleteConversation(id) {
49
71
  await this.store.delete(id);
50
72
  }
73
+ /**
74
+ * Makes sure only one reply is generated for a conversation at a time.
75
+ * Resolves a release function, or `null` when another turn holds the lock.
76
+ * The lock expires after `ttlMs` in case a server dies mid-turn.
77
+ *
78
+ * With `storage.kv` (and `setIfAbsent`) the lock holds across instances;
79
+ * otherwise only within this process.
80
+ */
81
+ async acquireTurn(conversationId, ttlMs = 120_000) {
82
+ const key = `turn:${conversationId}`;
83
+ const kv = this.kv;
84
+ if (kv?.setIfAbsent) {
85
+ const token = crypto.randomUUID();
86
+ if (!(await kv.setIfAbsent(key, token, { ttlMs })))
87
+ return null;
88
+ let released = false;
89
+ return async () => {
90
+ if (released)
91
+ return;
92
+ released = true;
93
+ // Only delete the lock if it's still ours; it may have expired and
94
+ // been taken by another turn.
95
+ if ((await kv.get(key)) === token)
96
+ await kv.delete(key);
97
+ };
98
+ }
99
+ if (this.localTurns.has(key))
100
+ return null;
101
+ this.localTurns.add(key);
102
+ const timer = setTimeout(() => this.localTurns.delete(key), ttlMs);
103
+ timer.unref?.();
104
+ let released = false;
105
+ return async () => {
106
+ if (released)
107
+ return;
108
+ released = true;
109
+ clearTimeout(timer);
110
+ this.localTurns.delete(key);
111
+ };
112
+ }
113
+ /**
114
+ * Removes the oldest non-system messages past `maxMessages`, one atomic
115
+ * remove each, then any assistant turns left at the front, so the stored
116
+ * history still opens with the visitor (Gemini rejects one that doesn't).
117
+ */
118
+ async enforceMaxMessages(conversationId) {
119
+ const messages = await this.getMessages(conversationId);
120
+ if (messages.length <= this.maxMessages)
121
+ return;
122
+ const turns = messages.filter((m) => m.role !== 'system');
123
+ let cut = messages.length - this.maxMessages;
124
+ while (cut < turns.length && turns[cut].role === 'assistant')
125
+ cut++;
126
+ for (const message of turns.slice(0, cut)) {
127
+ await this.store.removeMessage(conversationId, message.id);
128
+ }
129
+ }
51
130
  }
52
131
  //# sourceMappingURL=manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,OAAO,mBAAmB;IACtB,KAAK,CAAoB;IACzB,WAAW,CAAS;IAE5B,YAAY,OAA6D;QACvE,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,GAAG,CAAC;IACjD,CAAC;IAED,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;QAE9B,MAAM,YAAY,GAAiB;YACjC,EAAE;YACF,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,cAAsB,EAAE,OAAoB;QAC3D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC5D,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAChF,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ;iBACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iBAClC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;YACtD,YAAY,CAAC,QAAQ,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,OAAO,YAAY,CAAC;IACtB,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,KAAK,CAAC,aAAa,CAAC,cAAsB,EAAE,SAAiB;QAC3D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,YAAY,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC5F,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,EAAU;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"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"}
@@ -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,27 @@
1
- export type { ChatMessage, Conversation, ChatRequest, ChatResponse, PageContext, LeadData, ToolParameter, ToolDefinition, ToolResult, ProviderToolCall, ProviderToolExecutor, WebhookConfig, ProviderConfig, ProviderChatParams, AnalyticsEvent, LocaleStrings, } from './types.js';
2
- export type { AIProvider } from './providers/index.js';
3
- export { createProvider, 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 { PROTOCOL_VERSION, encodeSSE, SSE_PING, SSE_DONE, SSE_HEADERS, statusForError, errorBody, describeInvalidRequest, toLegacyChunk, aiSdkEncoder, fromAiSdkRequest, AI_SDK_STREAM_HEADER } from './protocol/index.js';
4
+ export type { AiSdkChunk, LegacyChunk, WirePart, WirePartType, WireErrorCode, WireFinishReason, WireAgent, WireErrorBody, ChatRequestV1, ClientToolManifest, } from './protocol/index.js';
5
+ export type { AIProvider, NormalizedMessage, NormalizedTurn, TurnPart, FinishReason, ProviderEvent, ProviderStepParams, } from './providers/index.js';
6
+ export { createProvider, isAIProvider, normalizeHistory, normalizeTurns, trimHistory, estimateTokens } from './providers/index.js';
7
+ export { registerProvider, type ProviderFactory } from './providers/registry.js';
8
+ export { toolInputSchema, legacyParametersToSchema, validateTools, ToolDefinitionError } from './providers/index.js';
9
+ export { runTurn, DEFAULT_MAX_STEPS, toolRegistry, executorRegistry, toolOutput, MAX_TOOL_OUTPUT_CHARS, RefusalError, ContentFilterError, MaxStepsError, } from './agent/index.js';
10
+ export type { RunTurnOptions, TurnResult, ToolRegistry, ToolRunContext } from './agent/index.js';
4
11
  export type { ChatTool, LeadCaptureCallback } from './tools/index.js';
5
12
  export { toolToDefinition, LeadCaptureTool } from './tools/index.js';
6
13
  export type { KnowledgeSource, FAQPair } from './knowledge/index.js';
7
14
  export { TextKnowledgeSource, FAQKnowledgeSource } from './knowledge/index.js';
8
15
  export type { ConversationStore } from './conversation/index.js';
9
16
  export { ConversationManager, MemoryStore } from './conversation/index.js';
10
- export { AnalyticsCollector } from './analytics/index.js';
17
+ export type { ConversationManagerOptions, ReleaseTurn } from './conversation/index.js';
18
+ export type { AppendOptions, ChatCopsStorage, ConversationSummary, CounterStore, CounterValue, EventCount, EventQuery, EventSink, KeyValueStore, ListQuery, MemoryStorageOptions, ConversationStoreWithAppend, } from './storage/index.js';
19
+ export { ConflictError, isConflictError, CONFLICT_ERROR_CODE, memoryStorage, withAppend, isLegacyConversationStore, } from './storage/index.js';
20
+ export { createBudgetGuard, BudgetExceededError, DEFAULT_BUDGETS, withDefaultBudgets } from './limits/budget.js';
21
+ export type { Budgets, BudgetLimit, BudgetContext, BudgetGuard, BudgetScope } from './limits/budget.js';
22
+ export { createRateLimiter } from './limits/rate-limit.js';
23
+ export type { RateLimitRule, RateLimitResult, RateLimiterOptions } from './limits/rate-limit.js';
24
+ export { AnalyticsCollector, BufferedEventSink, statsFromSink } from './analytics/index.js';
11
25
  export type { AnalyticsStats } from './analytics/index.js';
12
26
  export { getLocale, getAvailableLocales } from './i18n/index.js';
13
27
  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,kBAAkB,EAClB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtG,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":"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"}