@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.
- package/dist/agent/chat.d.ts +13 -0
- package/dist/agent/chat.d.ts.map +1 -0
- package/dist/agent/chat.js +42 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/errors.d.ts +14 -0
- package/dist/agent/errors.d.ts.map +1 -0
- package/dist/agent/errors.js +24 -0
- package/dist/agent/errors.js.map +1 -0
- package/dist/agent/index.d.ts +5 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/run-turn.d.ts +68 -0
- package/dist/agent/run-turn.d.ts.map +1 -0
- package/dist/agent/run-turn.js +344 -0
- package/dist/agent/run-turn.js.map +1 -0
- package/dist/agent/tool-registry.d.ts +28 -0
- package/dist/agent/tool-registry.d.ts.map +1 -0
- package/dist/agent/tool-registry.js +69 -0
- package/dist/agent/tool-registry.js.map +1 -0
- package/dist/analytics/index.d.ts +1 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +1 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/sink.d.ts +24 -0
- package/dist/analytics/sink.d.ts.map +1 -0
- package/dist/analytics/sink.js +106 -0
- package/dist/analytics/sink.js.map +1 -0
- package/dist/conversation/index.d.ts +1 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/manager.d.ts +62 -6
- package/dist/conversation/manager.d.ts.map +1 -1
- package/dist/conversation/manager.js +109 -30
- package/dist/conversation/manager.js.map +1 -1
- package/dist/conversation/store.d.ts +6 -5
- package/dist/conversation/store.d.ts.map +1 -1
- package/dist/conversation/store.js +4 -0
- package/dist/conversation/store.js.map +1 -1
- package/dist/index.d.ts +18 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/limits/budget.d.ts +84 -0
- package/dist/limits/budget.d.ts.map +1 -0
- package/dist/limits/budget.js +114 -0
- package/dist/limits/budget.js.map +1 -0
- package/dist/limits/rate-limit.d.ts +53 -0
- package/dist/limits/rate-limit.d.ts.map +1 -0
- package/dist/limits/rate-limit.js +68 -0
- package/dist/limits/rate-limit.js.map +1 -0
- package/dist/parts.d.ts +9 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +17 -0
- package/dist/parts.js.map +1 -0
- package/dist/protocol/ai-sdk.d.ts +27 -0
- package/dist/protocol/ai-sdk.d.ts.map +1 -0
- package/dist/protocol/ai-sdk.js +127 -0
- package/dist/protocol/ai-sdk.js.map +1 -0
- package/dist/protocol/errors.d.ts +10 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +42 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/index.d.ts +9 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +6 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/legacy.d.ts +18 -0
- package/dist/protocol/legacy.d.ts.map +1 -0
- package/dist/protocol/legacy.js +41 -0
- package/dist/protocol/legacy.js.map +1 -0
- package/dist/protocol/sse.d.ts +10 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js +15 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/protocol/v1.d.ts +140 -0
- package/dist/protocol/v1.d.ts.map +1 -0
- package/dist/protocol/v1.js +15 -0
- package/dist/protocol/v1.js.map +1 -0
- package/dist/providers/base.d.ts +17 -15
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +43 -31
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/claude.d.ts +40 -2
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +250 -113
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts +23 -3
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +245 -102
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/history.d.ts +52 -0
- package/dist/providers/history.d.ts.map +1 -0
- package/dist/providers/history.js +212 -0
- package/dist/providers/history.js.map +1 -0
- package/dist/providers/index.d.ts +5 -5
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -4
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +37 -3
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +246 -140
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +7 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +12 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/schema.d.ts +16 -0
- package/dist/providers/schema.d.ts.map +1 -0
- package/dist/providers/schema.js +80 -0
- package/dist/providers/schema.js.map +1 -0
- package/dist/providers/tool-execution.d.ts +10 -0
- package/dist/providers/tool-execution.d.ts.map +1 -1
- package/dist/providers/tool-execution.js +38 -12
- package/dist/providers/tool-execution.js.map +1 -1
- package/dist/providers/types.d.ts +71 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/storage/adapt.d.ts +15 -0
- package/dist/storage/adapt.d.ts.map +1 -0
- package/dist/storage/adapt.js +83 -0
- package/dist/storage/adapt.js.map +1 -0
- package/dist/storage/errors.d.ts +18 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +28 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory.d.ts +24 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +265 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/types.d.ts +118 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/conformance.d.ts +29 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +335 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider.d.ts +45 -0
- package/dist/testing/provider.d.ts.map +1 -0
- package/dist/testing/provider.js +82 -0
- package/dist/testing/provider.js.map +1 -0
- package/dist/tools/base.d.ts +14 -4
- package/dist/tools/base.d.ts.map +1 -1
- package/dist/tools/base.js +4 -2
- package/dist/tools/base.js.map +1 -1
- package/dist/tools/lead-capture.d.ts +3 -1
- package/dist/tools/lead-capture.d.ts.map +1 -1
- package/dist/tools/lead-capture.js +6 -1
- package/dist/tools/lead-capture.js.map +1 -1
- package/dist/types.d.ts +168 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +53 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { AnalyticsEvent, ChatMessage, Conversation } from '../types.js';
|
|
2
|
+
export interface AppendOptions {
|
|
3
|
+
/**
|
|
4
|
+
* The version the caller last read. When the stored conversation has moved
|
|
5
|
+
* on, the append fails with a `ConflictError` and writes nothing. A
|
|
6
|
+
* conversation that doesn't exist yet is at version 0.
|
|
7
|
+
*/
|
|
8
|
+
expectedVersion?: number;
|
|
9
|
+
/** Merged into the conversation's metadata (shallow, new keys win). */
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface ConversationSummary {
|
|
13
|
+
id: string;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
updatedAt: number;
|
|
16
|
+
messageCount: number;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface ListQuery {
|
|
20
|
+
limit: number;
|
|
21
|
+
/** From the previous page's `cursor`. */
|
|
22
|
+
cursor?: string;
|
|
23
|
+
/** Only conversations updated after this time (ms). */
|
|
24
|
+
updatedAfter?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Where conversations live.
|
|
28
|
+
*
|
|
29
|
+
* `get`, `save` and `delete` are the 0.4 interface and still all a store
|
|
30
|
+
* needs. A store that also has `append` lets two server instances write to the
|
|
31
|
+
* same conversation without losing messages; without it the server reads,
|
|
32
|
+
* changes and writes back the whole conversation, and warns once.
|
|
33
|
+
*/
|
|
34
|
+
export interface ConversationStore {
|
|
35
|
+
get(id: string): Promise<Conversation | null>;
|
|
36
|
+
/** Replaces the whole conversation. */
|
|
37
|
+
save(conversation: Conversation): Promise<void>;
|
|
38
|
+
delete(id: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Adds messages at the end, creating the conversation when it doesn't
|
|
41
|
+
* exist, and returns the new version. Atomic: concurrent appends never
|
|
42
|
+
* lose a message.
|
|
43
|
+
*/
|
|
44
|
+
append?(id: string, messages: ChatMessage[], options?: AppendOptions): Promise<{
|
|
45
|
+
version: number;
|
|
46
|
+
}>;
|
|
47
|
+
/** Replaces the message with the same id. Resolves `false` when there is none. */
|
|
48
|
+
updateMessage?(id: string, message: ChatMessage): Promise<boolean>;
|
|
49
|
+
/** Resolves `false` when there is no such message. */
|
|
50
|
+
removeMessage?(id: string, messageId: string): Promise<boolean>;
|
|
51
|
+
/** Most recently updated first. */
|
|
52
|
+
list?(query: ListQuery): Promise<{
|
|
53
|
+
items: ConversationSummary[];
|
|
54
|
+
cursor?: string;
|
|
55
|
+
}>;
|
|
56
|
+
/** Deletes conversations last updated before `before` (ms) and returns how many. */
|
|
57
|
+
purge?(before: number): Promise<number>;
|
|
58
|
+
}
|
|
59
|
+
export interface CounterValue {
|
|
60
|
+
value: number;
|
|
61
|
+
/** When the counter resets (ms). */
|
|
62
|
+
expiresAt: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Atomic counters that reset after a while. Rate limits and token budgets
|
|
66
|
+
* are built on this, so it has to be exact under concurrent requests.
|
|
67
|
+
*/
|
|
68
|
+
export interface CounterStore {
|
|
69
|
+
/**
|
|
70
|
+
* Adds `by` and returns the new value. A missing or expired counter starts
|
|
71
|
+
* from zero and expires `ttlMs` from now; later increments keep that expiry.
|
|
72
|
+
*/
|
|
73
|
+
increment(key: string, by: number, ttlMs: number): Promise<CounterValue>;
|
|
74
|
+
get(key: string): Promise<CounterValue | null>;
|
|
75
|
+
}
|
|
76
|
+
export interface KeyValueStore {
|
|
77
|
+
get<T = unknown>(key: string): Promise<T | null>;
|
|
78
|
+
set(key: string, value: unknown, options?: {
|
|
79
|
+
ttlMs?: number;
|
|
80
|
+
}): Promise<void>;
|
|
81
|
+
/** Sets the value only when the key is missing or expired. Resolves whether it did. */
|
|
82
|
+
setIfAbsent?(key: string, value: unknown, options?: {
|
|
83
|
+
ttlMs?: number;
|
|
84
|
+
}): Promise<boolean>;
|
|
85
|
+
delete(key: string): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
export interface EventQuery {
|
|
88
|
+
type?: string;
|
|
89
|
+
/** Start time (ms), inclusive. */
|
|
90
|
+
from: number;
|
|
91
|
+
/** End time (ms), exclusive. */
|
|
92
|
+
to: number;
|
|
93
|
+
groupBy?: 'day' | 'hour';
|
|
94
|
+
}
|
|
95
|
+
export interface EventCount {
|
|
96
|
+
/** Start of the bucket (ms, UTC). */
|
|
97
|
+
bucket: number;
|
|
98
|
+
type: string;
|
|
99
|
+
count: number;
|
|
100
|
+
}
|
|
101
|
+
export interface EventSink {
|
|
102
|
+
write(events: AnalyticsEvent[]): Promise<void>;
|
|
103
|
+
query?(query: EventQuery): Promise<EventCount[]>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Everything the server stores. Only `conversations` is required. Without
|
|
107
|
+
* `counters`, rate limits are kept per process; without `kv`, per-conversation
|
|
108
|
+
* locks are too.
|
|
109
|
+
*/
|
|
110
|
+
export interface ChatCopsStorage {
|
|
111
|
+
conversations: ConversationStore;
|
|
112
|
+
counters?: CounterStore;
|
|
113
|
+
kv?: KeyValueStore;
|
|
114
|
+
events?: EventSink;
|
|
115
|
+
/** Closes connections, for scripts and tests. */
|
|
116
|
+
close?(): Promise<void>;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ChatCopsStorage } from '../storage/types.js';
|
|
2
|
+
export interface StorageConformanceOptions {
|
|
3
|
+
/**
|
|
4
|
+
* TTL used by the expiry checks, in ms. The checks wait about twice this.
|
|
5
|
+
* Default 150. Raise it for stores that round expiry to seconds.
|
|
6
|
+
*/
|
|
7
|
+
ttlMs?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Checks to leave out, for backends that can't meet them in a test run. For
|
|
10
|
+
* example Workers KV has a 60 second minimum TTL, so `'kv-ttl'`.
|
|
11
|
+
*/
|
|
12
|
+
skip?: Array<'kv-ttl' | 'counter-ttl' | 'conversation-concurrency' | 'counter-concurrency'>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The behavior every ChatCops store must have. Call it from a test file with a
|
|
16
|
+
* factory for your storage:
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { runStorageConformance } from '@chatcops/core/testing';
|
|
20
|
+
* runStorageConformance('redis', () => redisStorage({ redis }));
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Optional capabilities (`counters`, `kv`, `events`, `list`, `purge`,
|
|
24
|
+
* `setIfAbsent`, `query`) are checked only when the storage has them.
|
|
25
|
+
* `conversations.append`, `updateMessage` and `removeMessage` are required
|
|
26
|
+
* here: a store without them only gets the 0.4 behavior.
|
|
27
|
+
*/
|
|
28
|
+
export declare function runStorageConformance(name: string, factory: () => ChatCopsStorage | Promise<ChatCopsStorage>, options?: StorageConformanceOptions): void;
|
|
29
|
+
//# sourceMappingURL=conformance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,aAAa,GAAG,0BAA0B,GAAG,qBAAqB,CAAC,CAAC;CAC7F;AAeD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,EACzD,OAAO,GAAE,yBAA8B,GACtC,IAAI,CAyUN"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
2
|
+
import { isConflictError } from '../storage/errors.js';
|
|
3
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
4
|
+
let sequence = 0;
|
|
5
|
+
/** Ids unique to this run, so a shared database needs no cleanup between tests. */
|
|
6
|
+
function uniqueId(prefix) {
|
|
7
|
+
sequence += 1;
|
|
8
|
+
return `${prefix}-${Date.now().toString(36)}-${sequence}-${Math.random().toString(36).slice(2, 8)}`;
|
|
9
|
+
}
|
|
10
|
+
function message(id, role, content, extra = {}) {
|
|
11
|
+
return { id, role, content, timestamp: 1_700_000_000_000, ...extra };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The behavior every ChatCops store must have. Call it from a test file with a
|
|
15
|
+
* factory for your storage:
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { runStorageConformance } from '@chatcops/core/testing';
|
|
19
|
+
* runStorageConformance('redis', () => redisStorage({ redis }));
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Optional capabilities (`counters`, `kv`, `events`, `list`, `purge`,
|
|
23
|
+
* `setIfAbsent`, `query`) are checked only when the storage has them.
|
|
24
|
+
* `conversations.append`, `updateMessage` and `removeMessage` are required
|
|
25
|
+
* here: a store without them only gets the 0.4 behavior.
|
|
26
|
+
*/
|
|
27
|
+
export function runStorageConformance(name, factory, options = {}) {
|
|
28
|
+
const ttlMs = options.ttlMs ?? 150;
|
|
29
|
+
const skip = new Set(options.skip ?? []);
|
|
30
|
+
describe(`storage conformance: ${name}`, () => {
|
|
31
|
+
let storage;
|
|
32
|
+
beforeAll(async () => {
|
|
33
|
+
storage = await factory();
|
|
34
|
+
});
|
|
35
|
+
afterAll(async () => {
|
|
36
|
+
await storage?.close?.();
|
|
37
|
+
});
|
|
38
|
+
describe('conversations', () => {
|
|
39
|
+
it('returns null for a conversation that does not exist', async () => {
|
|
40
|
+
expect(await storage.conversations.get(uniqueId('missing'))).toBeNull();
|
|
41
|
+
});
|
|
42
|
+
it('creates a conversation on the first append and keeps messages in order', async () => {
|
|
43
|
+
const store = requireAppend(storage);
|
|
44
|
+
const id = uniqueId('order');
|
|
45
|
+
const first = await store.append(id, [message('u1', 'user', 'Hello')]);
|
|
46
|
+
const second = await store.append(id, [message('a1', 'assistant', 'Hi'), message('u2', 'user', 'Prices?')]);
|
|
47
|
+
expect(first.version).toBe(1);
|
|
48
|
+
expect(second.version).toBe(2);
|
|
49
|
+
const conversation = await store.get(id);
|
|
50
|
+
expect(conversation?.id).toBe(id);
|
|
51
|
+
expect(conversation?.messages.map((m) => m.id)).toEqual(['u1', 'a1', 'u2']);
|
|
52
|
+
expect(conversation?.version).toBe(2);
|
|
53
|
+
expect(conversation?.createdAt).toEqual(expect.any(Number));
|
|
54
|
+
expect(conversation?.updatedAt).toBeGreaterThanOrEqual(conversation?.createdAt ?? 0);
|
|
55
|
+
});
|
|
56
|
+
it('round trips every message field', async () => {
|
|
57
|
+
const store = requireAppend(storage);
|
|
58
|
+
const id = uniqueId('fields');
|
|
59
|
+
const assistant = message('a1', 'assistant', 'Saved. ', {
|
|
60
|
+
parts: [
|
|
61
|
+
{ type: 'reasoning', text: 'think', providerMetadata: { claude: { signature: 'sig==' } } },
|
|
62
|
+
{ type: 'text', text: 'Saved. ' },
|
|
63
|
+
{
|
|
64
|
+
type: 'tool-call',
|
|
65
|
+
toolCallId: 'call_1',
|
|
66
|
+
toolName: 'capture_lead',
|
|
67
|
+
input: { email: 'a@b.co', tags: ['x', 'y'], nested: { n: 1 } },
|
|
68
|
+
executor: 'server',
|
|
69
|
+
state: 'done',
|
|
70
|
+
},
|
|
71
|
+
{ type: 'tool-result', toolCallId: 'call_1', toolName: 'capture_lead', output: { success: true } },
|
|
72
|
+
],
|
|
73
|
+
status: 'complete',
|
|
74
|
+
usage: { inputTokens: 120, outputTokens: 30, cacheReadTokens: 100 },
|
|
75
|
+
aiGenerated: true,
|
|
76
|
+
metadata: { model: 'm', unicode: 'Grüße 你好 🙂' },
|
|
77
|
+
});
|
|
78
|
+
await store.append(id, [message('u1', 'user', 'Line one\nline two'), assistant]);
|
|
79
|
+
const conversation = await store.get(id);
|
|
80
|
+
expect(conversation?.messages[0]).toEqual(message('u1', 'user', 'Line one\nline two'));
|
|
81
|
+
expect(conversation?.messages[1]).toEqual(assistant);
|
|
82
|
+
});
|
|
83
|
+
it('rejects an append with a stale expectedVersion and writes nothing', async () => {
|
|
84
|
+
const store = requireAppend(storage);
|
|
85
|
+
const id = uniqueId('conflict');
|
|
86
|
+
await store.append(id, [message('u1', 'user', 'Hello')], { expectedVersion: 0 });
|
|
87
|
+
const error = await store
|
|
88
|
+
.append(id, [message('u2', 'user', 'Again')], { expectedVersion: 0 })
|
|
89
|
+
.catch((err) => err);
|
|
90
|
+
expect(isConflictError(error)).toBe(true);
|
|
91
|
+
const conversation = await store.get(id);
|
|
92
|
+
expect(conversation?.messages.map((m) => m.id)).toEqual(['u1']);
|
|
93
|
+
expect(conversation?.version).toBe(1);
|
|
94
|
+
});
|
|
95
|
+
it('rejects expectedVersion above 0 for a conversation that does not exist', async () => {
|
|
96
|
+
const store = requireAppend(storage);
|
|
97
|
+
const id = uniqueId('conflict-new');
|
|
98
|
+
const error = await store.append(id, [message('u1', 'user', 'Hi')], { expectedVersion: 3 }).catch((e) => e);
|
|
99
|
+
expect(isConflictError(error)).toBe(true);
|
|
100
|
+
expect(await store.get(id)).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
it('merges metadata on append', async () => {
|
|
103
|
+
const store = requireAppend(storage);
|
|
104
|
+
const id = uniqueId('metadata');
|
|
105
|
+
await store.append(id, [message('u1', 'user', 'Hi')], { metadata: { siteId: 's1', a: 1 } });
|
|
106
|
+
await store.append(id, [message('u2', 'user', 'Hi again')], { metadata: { a: 2, b: 'x' } });
|
|
107
|
+
expect((await store.get(id))?.metadata).toEqual({ siteId: 's1', a: 2, b: 'x' });
|
|
108
|
+
});
|
|
109
|
+
it.skipIf(skip.has('conversation-concurrency'))('loses no message under concurrent appends', async () => {
|
|
110
|
+
const store = requireAppend(storage);
|
|
111
|
+
const id = uniqueId('concurrent');
|
|
112
|
+
await Promise.all(Array.from({ length: 20 }, (_, i) => store.append(id, [message(`m${i}`, 'user', `#${i}`)])));
|
|
113
|
+
const conversation = await store.get(id);
|
|
114
|
+
expect(conversation?.messages).toHaveLength(20);
|
|
115
|
+
expect(new Set(conversation?.messages.map((m) => m.id)).size).toBe(20);
|
|
116
|
+
expect(conversation?.version).toBe(20);
|
|
117
|
+
});
|
|
118
|
+
it.skipIf(skip.has('conversation-concurrency'))('lets exactly one of several appends with the same expectedVersion through', async () => {
|
|
119
|
+
const store = requireAppend(storage);
|
|
120
|
+
const id = uniqueId('race');
|
|
121
|
+
await store.append(id, [message('u0', 'user', 'start')]);
|
|
122
|
+
const results = await Promise.allSettled(Array.from({ length: 8 }, (_, i) => store.append(id, [message(`r${i}`, 'user', 'x')], { expectedVersion: 1 })));
|
|
123
|
+
expect(results.filter((r) => r.status === 'fulfilled')).toHaveLength(1);
|
|
124
|
+
for (const result of results) {
|
|
125
|
+
if (result.status === 'rejected')
|
|
126
|
+
expect(isConflictError(result.reason)).toBe(true);
|
|
127
|
+
}
|
|
128
|
+
expect((await store.get(id))?.messages).toHaveLength(2);
|
|
129
|
+
});
|
|
130
|
+
it('replaces a message in place with updateMessage', async () => {
|
|
131
|
+
const store = requireAppend(storage);
|
|
132
|
+
const id = uniqueId('update');
|
|
133
|
+
await store.append(id, [message('u1', 'user', 'Hi'), message('a1', 'assistant', 'Hel'), message('u2', 'user', 'More')]);
|
|
134
|
+
const updated = message('a1', 'assistant', 'Hello there', { status: 'complete', parts: [{ type: 'text', text: 'Hello there' }] });
|
|
135
|
+
expect(await store.updateMessage(id, updated)).toBe(true);
|
|
136
|
+
const conversation = await store.get(id);
|
|
137
|
+
expect(conversation?.messages.map((m) => m.id)).toEqual(['u1', 'a1', 'u2']);
|
|
138
|
+
expect(conversation?.messages[1]).toEqual(updated);
|
|
139
|
+
expect(conversation?.version).toBe(2);
|
|
140
|
+
expect(await store.updateMessage(id, message('nope', 'assistant', 'x'))).toBe(false);
|
|
141
|
+
expect(await store.updateMessage(uniqueId('missing'), updated)).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
it('removes a message with removeMessage', async () => {
|
|
144
|
+
const store = requireAppend(storage);
|
|
145
|
+
const id = uniqueId('remove');
|
|
146
|
+
await store.append(id, [message('u1', 'user', 'Hi'), message('a1', 'assistant', 'Hello')]);
|
|
147
|
+
expect(await store.removeMessage(id, 'a1')).toBe(true);
|
|
148
|
+
expect((await store.get(id))?.messages.map((m) => m.id)).toEqual(['u1']);
|
|
149
|
+
expect(await store.removeMessage(id, 'a1')).toBe(false);
|
|
150
|
+
});
|
|
151
|
+
it('hands out copies, so changing a result does not change the store', async () => {
|
|
152
|
+
const store = requireAppend(storage);
|
|
153
|
+
const id = uniqueId('copy');
|
|
154
|
+
await store.append(id, [message('u1', 'user', 'Hi')]);
|
|
155
|
+
const first = await store.get(id);
|
|
156
|
+
first?.messages.push(message('x', 'user', 'sneaky'));
|
|
157
|
+
if (first?.messages[0])
|
|
158
|
+
first.messages[0].content = 'changed';
|
|
159
|
+
expect((await store.get(id))?.messages).toEqual([message('u1', 'user', 'Hi')]);
|
|
160
|
+
});
|
|
161
|
+
it('still supports the 0.4 save() and get() round trip', async () => {
|
|
162
|
+
const store = requireAppend(storage);
|
|
163
|
+
const id = uniqueId('legacy');
|
|
164
|
+
const conversation = {
|
|
165
|
+
id,
|
|
166
|
+
messages: [message('u1', 'user', 'Hi'), message('a1', 'assistant', 'Hello')],
|
|
167
|
+
metadata: { from: 'save' },
|
|
168
|
+
createdAt: 1_700_000_000_000,
|
|
169
|
+
updatedAt: 1_700_000_000_000,
|
|
170
|
+
};
|
|
171
|
+
await store.save(conversation);
|
|
172
|
+
const loaded = await store.get(id);
|
|
173
|
+
expect(loaded?.messages).toEqual(conversation.messages);
|
|
174
|
+
expect(loaded?.metadata).toEqual({ from: 'save' });
|
|
175
|
+
expect(loaded?.createdAt).toBe(conversation.createdAt);
|
|
176
|
+
const { version } = await store.append(id, [message('u2', 'user', 'After save')]);
|
|
177
|
+
expect(version).toBe((loaded?.version ?? 0) + 1);
|
|
178
|
+
expect((await store.get(id))?.messages.map((m) => m.id)).toEqual(['u1', 'a1', 'u2']);
|
|
179
|
+
});
|
|
180
|
+
it('deletes a conversation and its messages', async () => {
|
|
181
|
+
const store = requireAppend(storage);
|
|
182
|
+
const id = uniqueId('delete');
|
|
183
|
+
await store.append(id, [message('u1', 'user', 'Hi')]);
|
|
184
|
+
await store.delete(id);
|
|
185
|
+
expect(await store.get(id)).toBeNull();
|
|
186
|
+
expect((await store.append(id, [message('u2', 'user', 'New')])).version).toBe(1);
|
|
187
|
+
});
|
|
188
|
+
it('lists conversations, most recently updated first, across pages', async (ctx) => {
|
|
189
|
+
if (!storage.conversations.list)
|
|
190
|
+
return ctx.skip();
|
|
191
|
+
const ids = [uniqueId('list'), uniqueId('list'), uniqueId('list')];
|
|
192
|
+
for (const id of ids) {
|
|
193
|
+
await requireAppend(storage).append(id, [message('u1', 'user', 'Hi')]);
|
|
194
|
+
await sleep(5);
|
|
195
|
+
}
|
|
196
|
+
const seen = [];
|
|
197
|
+
let cursor;
|
|
198
|
+
do {
|
|
199
|
+
const page = await storage.conversations.list({ limit: 2, cursor });
|
|
200
|
+
expect(page.items.length).toBeLessThanOrEqual(2);
|
|
201
|
+
seen.push(...page.items.map((item) => item.id));
|
|
202
|
+
cursor = page.cursor;
|
|
203
|
+
} while (cursor);
|
|
204
|
+
const ours = seen.filter((id) => ids.includes(id));
|
|
205
|
+
expect(ours).toEqual([...ids].reverse());
|
|
206
|
+
expect(new Set(seen).size).toBe(seen.length);
|
|
207
|
+
});
|
|
208
|
+
it('purges conversations last updated before a time', async (ctx) => {
|
|
209
|
+
if (!storage.conversations.purge)
|
|
210
|
+
return ctx.skip();
|
|
211
|
+
const store = requireAppend(storage);
|
|
212
|
+
const old = uniqueId('purge-old');
|
|
213
|
+
await store.append(old, [message('u1', 'user', 'old')]);
|
|
214
|
+
await sleep(50);
|
|
215
|
+
const cutoff = Date.now();
|
|
216
|
+
await sleep(50);
|
|
217
|
+
const recent = uniqueId('purge-new');
|
|
218
|
+
await store.append(recent, [message('u1', 'user', 'new')]);
|
|
219
|
+
expect(await storage.conversations.purge(cutoff)).toBeGreaterThanOrEqual(1);
|
|
220
|
+
expect(await store.get(old)).toBeNull();
|
|
221
|
+
expect(await store.get(recent)).not.toBeNull();
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe('counters', () => {
|
|
225
|
+
it('starts at the increment and keeps its expiry', async (ctx) => {
|
|
226
|
+
const counters = storage.counters;
|
|
227
|
+
if (!counters)
|
|
228
|
+
return ctx.skip();
|
|
229
|
+
const key = uniqueId('counter');
|
|
230
|
+
const before = Date.now();
|
|
231
|
+
const first = await counters.increment(key, 1, 60_000);
|
|
232
|
+
expect(first.value).toBe(1);
|
|
233
|
+
expect(first.expiresAt).toBeGreaterThanOrEqual(before + 59_000);
|
|
234
|
+
expect(first.expiresAt).toBeLessThanOrEqual(Date.now() + 61_000);
|
|
235
|
+
const second = await counters.increment(key, 5, 60_000);
|
|
236
|
+
expect(second.value).toBe(6);
|
|
237
|
+
expect(second.expiresAt).toBe(first.expiresAt);
|
|
238
|
+
expect(await counters.get(key)).toEqual(second);
|
|
239
|
+
expect(await counters.get(uniqueId('counter-missing'))).toBeNull();
|
|
240
|
+
});
|
|
241
|
+
it.skipIf(skip.has('counter-concurrency'))('counts every concurrent increment exactly once', async (ctx) => {
|
|
242
|
+
const counters = storage.counters;
|
|
243
|
+
if (!counters)
|
|
244
|
+
return ctx.skip();
|
|
245
|
+
const key = uniqueId('counter-race');
|
|
246
|
+
const results = await Promise.all(Array.from({ length: 50 }, () => counters.increment(key, 1, 60_000)));
|
|
247
|
+
expect(results.map((r) => r.value).sort((a, b) => a - b)).toEqual(Array.from({ length: 50 }, (_, i) => i + 1));
|
|
248
|
+
expect((await counters.get(key))?.value).toBe(50);
|
|
249
|
+
});
|
|
250
|
+
it.skipIf(skip.has('counter-ttl'))('starts again after it expires', async (ctx) => {
|
|
251
|
+
const counters = storage.counters;
|
|
252
|
+
if (!counters)
|
|
253
|
+
return ctx.skip();
|
|
254
|
+
const key = uniqueId('counter-ttl');
|
|
255
|
+
await counters.increment(key, 3, ttlMs);
|
|
256
|
+
await sleep(ttlMs * 2 + 50);
|
|
257
|
+
expect(await counters.get(key)).toBeNull();
|
|
258
|
+
expect((await counters.increment(key, 1, ttlMs)).value).toBe(1);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
describe('key-value', () => {
|
|
262
|
+
it('sets, overwrites and deletes JSON values', async (ctx) => {
|
|
263
|
+
const kv = storage.kv;
|
|
264
|
+
if (!kv)
|
|
265
|
+
return ctx.skip();
|
|
266
|
+
const key = uniqueId('kv');
|
|
267
|
+
expect(await kv.get(key)).toBeNull();
|
|
268
|
+
await kv.set(key, { a: 1, list: [1, 'two'], nested: { ok: true } });
|
|
269
|
+
expect(await kv.get(key)).toEqual({ a: 1, list: [1, 'two'], nested: { ok: true } });
|
|
270
|
+
await kv.set(key, 'replaced');
|
|
271
|
+
expect(await kv.get(key)).toBe('replaced');
|
|
272
|
+
await kv.delete(key);
|
|
273
|
+
expect(await kv.get(key)).toBeNull();
|
|
274
|
+
});
|
|
275
|
+
it('sets only when absent with setIfAbsent', async (ctx) => {
|
|
276
|
+
const kv = storage.kv;
|
|
277
|
+
if (!kv?.setIfAbsent)
|
|
278
|
+
return ctx.skip();
|
|
279
|
+
const key = uniqueId('kv-nx');
|
|
280
|
+
expect(await kv.setIfAbsent(key, 'first')).toBe(true);
|
|
281
|
+
expect(await kv.setIfAbsent(key, 'second')).toBe(false);
|
|
282
|
+
expect(await kv.get(key)).toBe('first');
|
|
283
|
+
});
|
|
284
|
+
it('lets only one concurrent setIfAbsent win', async (ctx) => {
|
|
285
|
+
const kv = storage.kv;
|
|
286
|
+
if (!kv?.setIfAbsent)
|
|
287
|
+
return ctx.skip();
|
|
288
|
+
const key = uniqueId('kv-nx-race');
|
|
289
|
+
const results = await Promise.all(Array.from({ length: 10 }, (_, i) => kv.setIfAbsent?.(key, i)));
|
|
290
|
+
expect(results.filter(Boolean)).toHaveLength(1);
|
|
291
|
+
});
|
|
292
|
+
it.skipIf(skip.has('kv-ttl'))('expires values with a TTL', async (ctx) => {
|
|
293
|
+
const kv = storage.kv;
|
|
294
|
+
if (!kv)
|
|
295
|
+
return ctx.skip();
|
|
296
|
+
const key = uniqueId('kv-ttl');
|
|
297
|
+
await kv.set(key, 'short', { ttlMs });
|
|
298
|
+
expect(await kv.get(key)).toBe('short');
|
|
299
|
+
await sleep(ttlMs * 2 + 50);
|
|
300
|
+
expect(await kv.get(key)).toBeNull();
|
|
301
|
+
if (kv.setIfAbsent)
|
|
302
|
+
expect(await kv.setIfAbsent(key, 'again', { ttlMs })).toBe(true);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
describe('events', () => {
|
|
306
|
+
it('writes events and counts them by day', async (ctx) => {
|
|
307
|
+
const events = storage.events;
|
|
308
|
+
if (!events)
|
|
309
|
+
return ctx.skip();
|
|
310
|
+
const type = uniqueId('event');
|
|
311
|
+
const day = Date.UTC(2026, 9, 20);
|
|
312
|
+
await events.write([
|
|
313
|
+
{ type, timestamp: day + 1_000 },
|
|
314
|
+
{ type, timestamp: day + 2_000, data: { conversationId: 'c1' } },
|
|
315
|
+
{ type, timestamp: day + 25 * 60 * 60 * 1000 },
|
|
316
|
+
]);
|
|
317
|
+
if (!events.query)
|
|
318
|
+
return;
|
|
319
|
+
const counts = await events.query({ type, from: day, to: day + 3 * 24 * 60 * 60 * 1000, groupBy: 'day' });
|
|
320
|
+
expect(counts).toEqual([
|
|
321
|
+
{ bucket: day, type, count: 2 },
|
|
322
|
+
{ bucket: day + 24 * 60 * 60 * 1000, type, count: 1 },
|
|
323
|
+
]);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
function requireAppend(storage) {
|
|
329
|
+
const store = storage.conversations;
|
|
330
|
+
if (!store.append || !store.updateMessage || !store.removeMessage) {
|
|
331
|
+
throw new Error('conversations needs append, updateMessage and removeMessage to pass conformance. Wrap a 0.4 store with withAppend().');
|
|
332
|
+
}
|
|
333
|
+
return store;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Test helpers for store authors. Imports vitest, so it's a separate entry
|
|
2
|
+
// point (`@chatcops/core/testing`) and never part of the main bundle.
|
|
3
|
+
export { runStorageConformance } from './conformance.js';
|
|
4
|
+
export { scriptedProvider, textStep, toolStep } from './provider.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,sEAAsE;AACtE,OAAO,EAAE,qBAAqB,EAAkC,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAA0E,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { AIProvider, ProviderEvent, ProviderStepParams } from '../providers/types.js';
|
|
2
|
+
import type { TokenUsage } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* One scripted model step: the events to yield, a function that builds them
|
|
5
|
+
* from the request, an `Error` to throw, or `'hang'` to wait until the
|
|
6
|
+
* request is aborted (for testing disconnects).
|
|
7
|
+
*/
|
|
8
|
+
export type ScriptedStep = ProviderEvent[] | ((params: ProviderStepParams) => ProviderEvent[]) | Error | 'hang';
|
|
9
|
+
export interface ScriptedProviderOptions {
|
|
10
|
+
name?: string;
|
|
11
|
+
/** Wait this long before each event, to test streaming and timeouts. */
|
|
12
|
+
delayMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ScriptedProvider extends AIProvider {
|
|
15
|
+
step(params: ProviderStepParams): AsyncGenerator<ProviderEvent>;
|
|
16
|
+
/** The params of every step so far, in order, with the messages as they were then. */
|
|
17
|
+
readonly calls: ProviderStepParams[];
|
|
18
|
+
}
|
|
19
|
+
/** A step that answers with `text`, streamed in pieces of `chunkSize` characters. */
|
|
20
|
+
export declare function textStep(text: string, options?: {
|
|
21
|
+
chunkSize?: number;
|
|
22
|
+
usage?: TokenUsage;
|
|
23
|
+
}): ProviderEvent[];
|
|
24
|
+
/** A step that calls tools, optionally after some text. */
|
|
25
|
+
export declare function toolStep(calls: Array<{
|
|
26
|
+
id?: string;
|
|
27
|
+
name: string;
|
|
28
|
+
input?: Record<string, unknown>;
|
|
29
|
+
}>, options?: {
|
|
30
|
+
text?: string;
|
|
31
|
+
usage?: TokenUsage;
|
|
32
|
+
}): ProviderEvent[];
|
|
33
|
+
/**
|
|
34
|
+
* A provider that plays back a script instead of calling a model, for tests
|
|
35
|
+
* of anything built on ChatCops: each `step()` call takes the next entry.
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* const provider = scriptedProvider([
|
|
39
|
+
* toolStep([{ name: 'lookup_order', input: { id: 'A-1' } }]),
|
|
40
|
+
* textStep('Your order shipped on Monday.'),
|
|
41
|
+
* ]);
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function scriptedProvider(script: ScriptedStep[], options?: ScriptedProviderOptions): ScriptedProvider;
|
|
45
|
+
//# sourceMappingURL=provider.d.ts.map
|