@vibe-agent-toolkit/agent-runtime 0.1.2-rc.3
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/README.md +295 -0
- package/dist/adapter-types.d.ts +48 -0
- package/dist/adapter-types.d.ts.map +1 -0
- package/dist/adapter-types.js +24 -0
- package/dist/adapter-types.js.map +1 -0
- package/dist/agent-helpers.d.ts +128 -0
- package/dist/agent-helpers.d.ts.map +1 -0
- package/dist/agent-helpers.js +291 -0
- package/dist/agent-helpers.js.map +1 -0
- package/dist/agentic-researcher.d.ts +63 -0
- package/dist/agentic-researcher.d.ts.map +1 -0
- package/dist/agentic-researcher.js +60 -0
- package/dist/agentic-researcher.js.map +1 -0
- package/dist/conversational-assistant.d.ts +57 -0
- package/dist/conversational-assistant.d.ts.map +1 -0
- package/dist/conversational-assistant.js +48 -0
- package/dist/conversational-assistant.js.map +1 -0
- package/dist/conversational-helpers.d.ts +26 -0
- package/dist/conversational-helpers.d.ts.map +1 -0
- package/dist/conversational-helpers.js +34 -0
- package/dist/conversational-helpers.js.map +1 -0
- package/dist/execute-wrapper.d.ts +59 -0
- package/dist/execute-wrapper.d.ts.map +1 -0
- package/dist/execute-wrapper.js +98 -0
- package/dist/execute-wrapper.js.map +1 -0
- package/dist/external-event-integrator.d.ts +66 -0
- package/dist/external-event-integrator.d.ts.map +1 -0
- package/dist/external-event-integrator.js +62 -0
- package/dist/external-event-integrator.js.map +1 -0
- package/dist/function-event-consumer.d.ts +60 -0
- package/dist/function-event-consumer.d.ts.map +1 -0
- package/dist/function-event-consumer.js +52 -0
- package/dist/function-event-consumer.js.map +1 -0
- package/dist/function-orchestrator.d.ts +45 -0
- package/dist/function-orchestrator.d.ts.map +1 -0
- package/dist/function-orchestrator.js +51 -0
- package/dist/function-orchestrator.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-analyzer.d.ts +58 -0
- package/dist/llm-analyzer.d.ts.map +1 -0
- package/dist/llm-analyzer.js +53 -0
- package/dist/llm-analyzer.js.map +1 -0
- package/dist/llm-coordinator.d.ts +62 -0
- package/dist/llm-coordinator.d.ts.map +1 -0
- package/dist/llm-coordinator.js +60 -0
- package/dist/llm-coordinator.js.map +1 -0
- package/dist/llm-event-handler.d.ts +67 -0
- package/dist/llm-event-handler.d.ts.map +1 -0
- package/dist/llm-event-handler.js +65 -0
- package/dist/llm-event-handler.js.map +1 -0
- package/dist/pure-function.d.ts +34 -0
- package/dist/pure-function.d.ts.map +1 -0
- package/dist/pure-function.js +40 -0
- package/dist/pure-function.js.map +1 -0
- package/dist/result-helpers.d.ts +80 -0
- package/dist/result-helpers.d.ts.map +1 -0
- package/dist/result-helpers.js +232 -0
- package/dist/result-helpers.js.map +1 -0
- package/dist/session/errors.d.ts +11 -0
- package/dist/session/errors.d.ts.map +1 -0
- package/dist/session/errors.js +15 -0
- package/dist/session/errors.js.map +1 -0
- package/dist/session/file-session-store.d.ts +46 -0
- package/dist/session/file-session-store.d.ts.map +1 -0
- package/dist/session/file-session-store.js +149 -0
- package/dist/session/file-session-store.js.map +1 -0
- package/dist/session/index.d.ts +12 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +13 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/memory-session-store.d.ts +35 -0
- package/dist/session/memory-session-store.d.ts.map +1 -0
- package/dist/session/memory-session-store.js +76 -0
- package/dist/session/memory-session-store.js.map +1 -0
- package/dist/session/session-store-helpers.d.ts +26 -0
- package/dist/session/session-store-helpers.d.ts.map +1 -0
- package/dist/session/session-store-helpers.js +54 -0
- package/dist/session/session-store-helpers.js.map +1 -0
- package/dist/session/test-helpers/index.d.ts +61 -0
- package/dist/session/test-helpers/index.d.ts.map +1 -0
- package/dist/session/test-helpers/index.js +167 -0
- package/dist/session/test-helpers/index.js.map +1 -0
- package/dist/session/types.d.ts +86 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +8 -0
- package/dist/session/types.js.map +1 -0
- package/dist/shared-validation.d.ts +21 -0
- package/dist/shared-validation.d.ts.map +1 -0
- package/dist/shared-validation.js +45 -0
- package/dist/shared-validation.js.map +1 -0
- package/dist/test-helpers.d.ts +50 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +47 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/two-phase-conversational.d.ts +173 -0
- package/dist/two-phase-conversational.d.ts.map +1 -0
- package/dist/two-phase-conversational.js +205 -0
- package/dist/two-phase-conversational.js.map +1 -0
- package/dist/types.d.ts +194 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper functions for session store implementations.
|
|
3
|
+
*
|
|
4
|
+
* These functions eliminate code duplication between MemorySessionStore
|
|
5
|
+
* and FileSessionStore by providing common validation and state management logic.
|
|
6
|
+
*/
|
|
7
|
+
import type { RuntimeSession } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Validate session ID to prevent path traversal and other security issues.
|
|
10
|
+
* @throws Error if session ID is invalid
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateSessionId(sessionId: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Create an initial session with proper metadata.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createInitialSession<TState>(id: string, initialState: TState | undefined, createInitialState: (() => TState) | undefined, ttl: number | undefined): RuntimeSession<TState>;
|
|
17
|
+
/**
|
|
18
|
+
* Update session access timestamp and extend TTL if configured.
|
|
19
|
+
* Mutates the session object in place.
|
|
20
|
+
*/
|
|
21
|
+
export declare function updateSessionAccess<TState>(session: RuntimeSession<TState>, ttl: number | undefined): void;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a session has expired.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isSessionExpired(session: RuntimeSession<unknown>): boolean;
|
|
26
|
+
//# sourceMappingURL=session-store-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store-helpers.d.ts","sourceRoot":"","sources":["../../src/session/session-store-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CASzD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EACzC,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,kBAAkB,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,EAC9C,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,cAAc,CAAC,MAAM,CAAC,CAYxB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EACxC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,EAC/B,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAE1E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper functions for session store implementations.
|
|
3
|
+
*
|
|
4
|
+
* These functions eliminate code duplication between MemorySessionStore
|
|
5
|
+
* and FileSessionStore by providing common validation and state management logic.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validate session ID to prevent path traversal and other security issues.
|
|
9
|
+
* @throws Error if session ID is invalid
|
|
10
|
+
*/
|
|
11
|
+
export function validateSessionId(sessionId) {
|
|
12
|
+
// Prevent path traversal attacks
|
|
13
|
+
if (sessionId.includes('/') || sessionId.includes('\\') || sessionId.includes('..')) {
|
|
14
|
+
throw new Error(`Invalid session ID: contains path separators`);
|
|
15
|
+
}
|
|
16
|
+
// Prevent empty or unreasonably long IDs
|
|
17
|
+
if (sessionId.length === 0 || sessionId.length > 255) {
|
|
18
|
+
throw new Error(`Invalid session ID: invalid length`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create an initial session with proper metadata.
|
|
23
|
+
*/
|
|
24
|
+
export function createInitialSession(id, initialState, createInitialState, ttl) {
|
|
25
|
+
const now = new Date();
|
|
26
|
+
return {
|
|
27
|
+
id,
|
|
28
|
+
history: [],
|
|
29
|
+
state: initialState ?? createInitialState?.() ?? {},
|
|
30
|
+
metadata: {
|
|
31
|
+
createdAt: now,
|
|
32
|
+
lastAccessedAt: now,
|
|
33
|
+
...(ttl && { expiresAt: new Date(now.getTime() + ttl) }),
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Update session access timestamp and extend TTL if configured.
|
|
39
|
+
* Mutates the session object in place.
|
|
40
|
+
*/
|
|
41
|
+
export function updateSessionAccess(session, ttl) {
|
|
42
|
+
session.metadata.lastAccessedAt = new Date();
|
|
43
|
+
// Extend TTL if configured
|
|
44
|
+
if (ttl) {
|
|
45
|
+
session.metadata.expiresAt = new Date(Date.now() + ttl);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if a session has expired.
|
|
50
|
+
*/
|
|
51
|
+
export function isSessionExpired(session) {
|
|
52
|
+
return !!(session.metadata.expiresAt && session.metadata.expiresAt < new Date());
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=session-store-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store-helpers.js","sourceRoot":"","sources":["../../src/session/session-store-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,iCAAiC;IACjC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,yCAAyC;IACzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAU,EACV,YAAgC,EAChC,kBAA8C,EAC9C,GAAuB;IAEvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO;QACL,EAAE;QACF,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,YAAY,IAAI,kBAAkB,EAAE,EAAE,IAAK,EAAa;QAC/D,QAAQ,EAAE;YACR,SAAS,EAAE,GAAG;YACd,cAAc,EAAE,GAAG;YACnB,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;SACzD;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA+B,EAC/B,GAAuB;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;IAE7C,2BAA2B;IAC3B,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test utilities for session store testing.
|
|
3
|
+
*
|
|
4
|
+
* Eliminates duplication between MemorySessionStore and FileSessionStore tests.
|
|
5
|
+
*/
|
|
6
|
+
import type { SessionStore } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Test suite state for session store tests
|
|
9
|
+
*/
|
|
10
|
+
export interface SessionStoreTestSuite<TState> {
|
|
11
|
+
store: SessionStore<TState>;
|
|
12
|
+
setup: () => Promise<void>;
|
|
13
|
+
teardown: () => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Shared constants for tests
|
|
17
|
+
*/
|
|
18
|
+
export declare const TEST_CONSTANTS: {
|
|
19
|
+
readonly NON_EXISTENT_SESSION_ID: "non-existent";
|
|
20
|
+
readonly INVALID_SESSION_MSG: "Invalid session ID";
|
|
21
|
+
readonly SHORT_TTL: 10;
|
|
22
|
+
readonly MEDIUM_TTL: 1000;
|
|
23
|
+
readonly LONG_TTL: 60000;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Common test cases for create() method
|
|
27
|
+
*/
|
|
28
|
+
export declare function testCreateMethod<TState>(getSuite: () => SessionStoreTestSuite<TState>, expectedInitialState: TState): Record<string, () => Promise<void>>;
|
|
29
|
+
/**
|
|
30
|
+
* Common test cases for load() method
|
|
31
|
+
*/
|
|
32
|
+
export declare function testLoadMethod<TState>(getSuite: () => SessionStoreTestSuite<TState>, SessionNotFoundError: new (id: string) => Error): Record<string, () => Promise<void>>;
|
|
33
|
+
/**
|
|
34
|
+
* Common test cases for save() method
|
|
35
|
+
*/
|
|
36
|
+
export declare function testSaveMethod<TState extends {
|
|
37
|
+
count: number;
|
|
38
|
+
}>(getSuite: () => SessionStoreTestSuite<TState>): Record<string, () => Promise<void>>;
|
|
39
|
+
/**
|
|
40
|
+
* Common test cases for delete() method
|
|
41
|
+
*/
|
|
42
|
+
export declare function testDeleteMethod<TState>(getSuite: () => SessionStoreTestSuite<TState>, SessionNotFoundError: new (id: string) => Error): Record<string, () => Promise<void>>;
|
|
43
|
+
/**
|
|
44
|
+
* Common test cases for exists() method
|
|
45
|
+
*/
|
|
46
|
+
export declare function testExistsMethod<TState>(getSuite: () => SessionStoreTestSuite<TState>): Record<string, () => Promise<void>>;
|
|
47
|
+
/**
|
|
48
|
+
* Common test cases for list() method
|
|
49
|
+
*/
|
|
50
|
+
export declare function testListMethod<TState>(getSuite: () => SessionStoreTestSuite<TState>): Record<string, () => Promise<void>>;
|
|
51
|
+
/**
|
|
52
|
+
* Helper to register test cases from a test method
|
|
53
|
+
*/
|
|
54
|
+
export declare function registerTests(tests: Record<string, () => Promise<void>>): void;
|
|
55
|
+
/**
|
|
56
|
+
* Register all common test suites for a SessionStore implementation
|
|
57
|
+
*/
|
|
58
|
+
export declare function registerCommonSessionStoreTests<TState extends {
|
|
59
|
+
count: number;
|
|
60
|
+
}>(getSuite: () => SessionStoreTestSuite<TState>, _expectedInitialState: TState, SessionNotFoundError: new (id: string) => Error): void;
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/test-helpers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,MAAM;IAC3C,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EACrC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,EAC7C,oBAAoB,EAAE,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CA0BrC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EACnC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,EAC7C,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,KAAK,KAAK,GAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAgCrC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAC7D,QAAQ,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAiBrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EACrC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,EAC7C,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,KAAK,KAAK,GAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAerC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EACrC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAarC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EACnC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAqBrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAI9E;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAC9E,QAAQ,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,EAC7C,qBAAqB,EAAE,MAAM,EAC7B,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,KAAK,KAAK,GAC9C,IAAI,CAYN"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test utilities for session store testing.
|
|
3
|
+
*
|
|
4
|
+
* Eliminates duplication between MemorySessionStore and FileSessionStore tests.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it } from 'vitest';
|
|
7
|
+
/**
|
|
8
|
+
* Shared constants for tests
|
|
9
|
+
*/
|
|
10
|
+
export const TEST_CONSTANTS = {
|
|
11
|
+
NON_EXISTENT_SESSION_ID: 'non-existent',
|
|
12
|
+
INVALID_SESSION_MSG: 'Invalid session ID',
|
|
13
|
+
SHORT_TTL: 10, // milliseconds
|
|
14
|
+
MEDIUM_TTL: 1000, // 1 second
|
|
15
|
+
LONG_TTL: 60000, // 1 minute
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Common test cases for create() method
|
|
19
|
+
*/
|
|
20
|
+
export function testCreateMethod(getSuite, expectedInitialState) {
|
|
21
|
+
return {
|
|
22
|
+
'should create a new session with default initial state': async () => {
|
|
23
|
+
const { store } = getSuite();
|
|
24
|
+
const sessionId = await store.create();
|
|
25
|
+
expect(sessionId).toBeDefined();
|
|
26
|
+
expect(typeof sessionId).toBe('string');
|
|
27
|
+
const session = await store.load(sessionId);
|
|
28
|
+
expect(session.id).toBe(sessionId);
|
|
29
|
+
expect(session.history).toEqual([]);
|
|
30
|
+
expect(session.state).toEqual(expectedInitialState);
|
|
31
|
+
expect(session.metadata.createdAt).toBeInstanceOf(Date);
|
|
32
|
+
expect(session.metadata.lastAccessedAt).toBeInstanceOf(Date);
|
|
33
|
+
},
|
|
34
|
+
'should create a new session with custom initial state': async () => {
|
|
35
|
+
const { store } = getSuite();
|
|
36
|
+
const customState = { count: 10 };
|
|
37
|
+
const sessionId = await store.create(customState);
|
|
38
|
+
const session = await store.load(sessionId);
|
|
39
|
+
expect(session.state).toEqual(customState);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Common test cases for load() method
|
|
45
|
+
*/
|
|
46
|
+
export function testLoadMethod(getSuite, SessionNotFoundError) {
|
|
47
|
+
return {
|
|
48
|
+
'should load existing session': async () => {
|
|
49
|
+
const { store } = getSuite();
|
|
50
|
+
const sessionId = await store.create();
|
|
51
|
+
const session = await store.load(sessionId);
|
|
52
|
+
expect(session.id).toBe(sessionId);
|
|
53
|
+
},
|
|
54
|
+
'should throw SessionNotFoundError for non-existent session': async () => {
|
|
55
|
+
const { store } = getSuite();
|
|
56
|
+
await expect(store.load(TEST_CONSTANTS.NON_EXISTENT_SESSION_ID)).rejects.toThrow(SessionNotFoundError);
|
|
57
|
+
},
|
|
58
|
+
'should update lastAccessedAt on load': async () => {
|
|
59
|
+
const { store } = getSuite();
|
|
60
|
+
const sessionId = await store.create();
|
|
61
|
+
const session1 = await store.load(sessionId);
|
|
62
|
+
const timestamp1 = session1.metadata.lastAccessedAt.getTime();
|
|
63
|
+
// Wait enough time to ensure different timestamp
|
|
64
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
65
|
+
const session2 = await store.load(sessionId);
|
|
66
|
+
const timestamp2 = session2.metadata.lastAccessedAt.getTime();
|
|
67
|
+
expect(timestamp2).toBeGreaterThan(timestamp1);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Common test cases for save() method
|
|
73
|
+
*/
|
|
74
|
+
export function testSaveMethod(getSuite) {
|
|
75
|
+
return {
|
|
76
|
+
'should save session changes': async () => {
|
|
77
|
+
const { store } = getSuite();
|
|
78
|
+
const sessionId = await store.create();
|
|
79
|
+
const session = await store.load(sessionId);
|
|
80
|
+
session.state.count = 5;
|
|
81
|
+
session.history.push({ role: 'user', content: 'Hello' });
|
|
82
|
+
await store.save(session);
|
|
83
|
+
const loaded = await store.load(sessionId);
|
|
84
|
+
expect(loaded.state.count).toBe(5);
|
|
85
|
+
expect(loaded.history).toHaveLength(1);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Common test cases for delete() method
|
|
91
|
+
*/
|
|
92
|
+
export function testDeleteMethod(getSuite, SessionNotFoundError) {
|
|
93
|
+
return {
|
|
94
|
+
'should delete existing session': async () => {
|
|
95
|
+
const { store } = getSuite();
|
|
96
|
+
const sessionId = await store.create();
|
|
97
|
+
await store.delete(sessionId);
|
|
98
|
+
await expect(store.load(sessionId)).rejects.toThrow(SessionNotFoundError);
|
|
99
|
+
},
|
|
100
|
+
'should not throw error when deleting non-existent session': async () => {
|
|
101
|
+
const { store } = getSuite();
|
|
102
|
+
await expect(store.delete(TEST_CONSTANTS.NON_EXISTENT_SESSION_ID)).resolves.toBeUndefined();
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Common test cases for exists() method
|
|
108
|
+
*/
|
|
109
|
+
export function testExistsMethod(getSuite) {
|
|
110
|
+
return {
|
|
111
|
+
'should return true for existing session': async () => {
|
|
112
|
+
const { store } = getSuite();
|
|
113
|
+
const sessionId = await store.create();
|
|
114
|
+
expect(await store.exists(sessionId)).toBe(true);
|
|
115
|
+
},
|
|
116
|
+
'should return false for non-existent session': async () => {
|
|
117
|
+
const { store } = getSuite();
|
|
118
|
+
expect(await store.exists(TEST_CONSTANTS.NON_EXISTENT_SESSION_ID)).toBe(false);
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Common test cases for list() method
|
|
124
|
+
*/
|
|
125
|
+
export function testListMethod(getSuite) {
|
|
126
|
+
return {
|
|
127
|
+
'should return empty array for empty store': async () => {
|
|
128
|
+
const { store } = getSuite();
|
|
129
|
+
const sessionIds = await store.list();
|
|
130
|
+
expect(sessionIds).toEqual([]);
|
|
131
|
+
},
|
|
132
|
+
'should list all session IDs': async () => {
|
|
133
|
+
const { store } = getSuite();
|
|
134
|
+
const id1 = await store.create();
|
|
135
|
+
const id2 = await store.create();
|
|
136
|
+
const id3 = await store.create();
|
|
137
|
+
const sessionIds = await store.list();
|
|
138
|
+
expect(sessionIds).toHaveLength(3);
|
|
139
|
+
expect(sessionIds).toContain(id1);
|
|
140
|
+
expect(sessionIds).toContain(id2);
|
|
141
|
+
expect(sessionIds).toContain(id3);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Helper to register test cases from a test method
|
|
147
|
+
*/
|
|
148
|
+
export function registerTests(tests) {
|
|
149
|
+
for (const [name, testFn] of Object.entries(tests)) {
|
|
150
|
+
it(name, testFn);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Register all common test suites for a SessionStore implementation
|
|
155
|
+
*/
|
|
156
|
+
export function registerCommonSessionStoreTests(getSuite, _expectedInitialState, SessionNotFoundError) {
|
|
157
|
+
describe('delete', () => {
|
|
158
|
+
registerTests(testDeleteMethod(getSuite, SessionNotFoundError));
|
|
159
|
+
});
|
|
160
|
+
describe('exists', () => {
|
|
161
|
+
registerTests(testExistsMethod(getSuite));
|
|
162
|
+
});
|
|
163
|
+
describe('list', () => {
|
|
164
|
+
registerTests(testListMethod(getSuite));
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/test-helpers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management types for VAT runtime.
|
|
3
|
+
*
|
|
4
|
+
* These types enable pluggable session persistence strategies
|
|
5
|
+
* (memory, file, cloud) independent of transport layer.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* A message in the conversation history.
|
|
9
|
+
*/
|
|
10
|
+
export type Message = {
|
|
11
|
+
role: 'user' | 'assistant' | 'system';
|
|
12
|
+
content: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Session data stored by runtime
|
|
16
|
+
*/
|
|
17
|
+
export interface RuntimeSession<TState = unknown> {
|
|
18
|
+
/** Unique session identifier */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Conversation history */
|
|
21
|
+
history: Message[];
|
|
22
|
+
/** Application-specific state */
|
|
23
|
+
state: TState;
|
|
24
|
+
/** Session metadata */
|
|
25
|
+
metadata: SessionMetadata;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Session metadata
|
|
29
|
+
*/
|
|
30
|
+
export interface SessionMetadata {
|
|
31
|
+
/** Creation timestamp */
|
|
32
|
+
createdAt: Date;
|
|
33
|
+
/** Last access timestamp */
|
|
34
|
+
lastAccessedAt: Date;
|
|
35
|
+
/** Optional expiration timestamp */
|
|
36
|
+
expiresAt?: Date;
|
|
37
|
+
/** Runtime-specific data (checkpoints, etc.) */
|
|
38
|
+
runtimeData?: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Pluggable session storage interface
|
|
42
|
+
*/
|
|
43
|
+
export interface SessionStore<TState = unknown> {
|
|
44
|
+
/**
|
|
45
|
+
* Create a new session with optional initial state
|
|
46
|
+
* @returns Session ID
|
|
47
|
+
*/
|
|
48
|
+
create(initialState?: TState): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Load session by ID
|
|
51
|
+
* @throws SessionNotFoundError if session doesn't exist
|
|
52
|
+
*/
|
|
53
|
+
load(sessionId: string): Promise<RuntimeSession<TState>>;
|
|
54
|
+
/**
|
|
55
|
+
* Save session (create or update)
|
|
56
|
+
*/
|
|
57
|
+
save(session: RuntimeSession<TState>): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Delete session
|
|
60
|
+
*/
|
|
61
|
+
delete(sessionId: string): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if session exists
|
|
64
|
+
*/
|
|
65
|
+
exists(sessionId: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* List all session IDs (for debugging/admin)
|
|
68
|
+
*/
|
|
69
|
+
list(): Promise<string[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Clean up expired sessions
|
|
72
|
+
*/
|
|
73
|
+
cleanup(): Promise<number>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Session store factory options
|
|
77
|
+
*/
|
|
78
|
+
export interface SessionStoreOptions<TState = unknown> {
|
|
79
|
+
/** Session TTL in milliseconds (optional) */
|
|
80
|
+
ttl?: number;
|
|
81
|
+
/** Custom session ID generator */
|
|
82
|
+
generateId?: () => string;
|
|
83
|
+
/** Initial state factory */
|
|
84
|
+
createInitialState?: () => TState;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,OAAO;IAC9C,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,4BAA4B;IAC5B,cAAc,EAAE,IAAI,CAAC;IACrB,oCAAoC;IACpC,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO;IAC5C;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/C;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5C;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1B;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,MAAM,GAAG,OAAO;IACnD,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a Zod schema to JSON Schema
|
|
4
|
+
*/
|
|
5
|
+
export declare function convertToJsonSchema(zodSchema: z.ZodType, name: string): Record<string, unknown>;
|
|
6
|
+
/**
|
|
7
|
+
* Validates input using a Zod schema
|
|
8
|
+
* @throws Error if validation fails
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateInput<T>(input: unknown, schema: z.ZodType<T>, agentName: string): T;
|
|
11
|
+
/**
|
|
12
|
+
* Validates output using a Zod schema
|
|
13
|
+
* @throws Error if validation fails
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateOutput<T>(output: unknown, schema: z.ZodType<T>, agentName: string): T;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a validated execute function wrapper
|
|
18
|
+
* This eliminates duplication across all archetype definitions
|
|
19
|
+
*/
|
|
20
|
+
export declare function createValidatedExecute<TInput, TOutput, TContext>(inputSchema: z.ZodType<TInput>, outputSchema: z.ZodType<TOutput>, agentName: string, handler: (input: TInput, ctx: TContext) => Promise<TOutput>): (input: TInput, ...args: unknown[]) => Promise<TOutput>;
|
|
21
|
+
//# sourceMappingURL=shared-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-validation.d.ts","sourceRoot":"","sources":["../src/shared-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,CAAC,CAAC,OAAO,EACpB,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,EAAE,MAAM,GAChB,CAAC,CAMH;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,EAAE,MAAM,GAChB,CAAC,CAMH;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAC9D,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAC9B,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,GAC1D,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAOzD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a Zod schema to JSON Schema
|
|
4
|
+
*/
|
|
5
|
+
export function convertToJsonSchema(zodSchema, name) {
|
|
6
|
+
return zodToJsonSchema(zodSchema, {
|
|
7
|
+
name,
|
|
8
|
+
$refStrategy: 'none',
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validates input using a Zod schema
|
|
13
|
+
* @throws Error if validation fails
|
|
14
|
+
*/
|
|
15
|
+
export function validateInput(input, schema, agentName) {
|
|
16
|
+
const result = schema.safeParse(input);
|
|
17
|
+
if (!result.success) {
|
|
18
|
+
throw new Error(`Invalid input for agent "${agentName}": ${result.error.message}`);
|
|
19
|
+
}
|
|
20
|
+
return result.data;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validates output using a Zod schema
|
|
24
|
+
* @throws Error if validation fails
|
|
25
|
+
*/
|
|
26
|
+
export function validateOutput(output, schema, agentName) {
|
|
27
|
+
const result = schema.safeParse(output);
|
|
28
|
+
if (!result.success) {
|
|
29
|
+
throw new Error(`Invalid output from agent "${agentName}": ${result.error.message}`);
|
|
30
|
+
}
|
|
31
|
+
return result.data;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Creates a validated execute function wrapper
|
|
35
|
+
* This eliminates duplication across all archetype definitions
|
|
36
|
+
*/
|
|
37
|
+
export function createValidatedExecute(inputSchema, outputSchema, agentName, handler) {
|
|
38
|
+
return async (input, ...args) => {
|
|
39
|
+
const ctx = args[0];
|
|
40
|
+
const validatedInput = validateInput(input, inputSchema, agentName);
|
|
41
|
+
const output = await handler(validatedInput, ctx);
|
|
42
|
+
return validateOutput(output, outputSchema, agentName);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=shared-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-validation.js","sourceRoot":"","sources":["../src/shared-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAoB,EACpB,IAAY;IAEZ,OAAO,eAAe,CAAC,SAAS,EAAE;QAChC,IAAI;QACJ,YAAY,EAAE,MAAM;KACrB,CAA4B,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAc,EACd,MAAoB,EACpB,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAe,EACf,MAAoB,EACpB,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAA8B,EAC9B,YAAgC,EAChC,SAAiB,EACjB,OAA2D;IAE3D,OAAO,KAAK,EAAE,KAAa,EAAE,GAAG,IAAe,EAAoB,EAAE;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAa,CAAC;QAChC,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test helpers for asserting on agent results.
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentResult, StatefulAgentResult } from '@vibe-agent-toolkit/agent-schema';
|
|
5
|
+
/**
|
|
6
|
+
* Test matchers for agent results.
|
|
7
|
+
*
|
|
8
|
+
* Provides type-safe assertions that narrow TypeScript types.
|
|
9
|
+
*/
|
|
10
|
+
export declare const resultMatchers: {
|
|
11
|
+
/**
|
|
12
|
+
* Assert result is success and extract data.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const output = await agent.execute(input);
|
|
16
|
+
* resultMatchers.expectSuccess(output.result);
|
|
17
|
+
* // TypeScript knows output.result.data exists here
|
|
18
|
+
* expect(output.result.data.field).toBe('value');
|
|
19
|
+
*/
|
|
20
|
+
expectSuccess<T, E extends string>(result: AgentResult<T, E>): asserts result is {
|
|
21
|
+
status: "success";
|
|
22
|
+
data: T;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Assert result is error and extract error.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const output = await agent.execute(badInput);
|
|
29
|
+
* resultMatchers.expectError(output.result);
|
|
30
|
+
* // TypeScript knows output.result.error exists here
|
|
31
|
+
* expect(output.result.error).toBe('invalid-input');
|
|
32
|
+
*/
|
|
33
|
+
expectError<T, E extends string>(result: AgentResult<T, E>): asserts result is {
|
|
34
|
+
status: "error";
|
|
35
|
+
error: E;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Assert result is in-progress.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const output = await conversationalAgent.execute(message);
|
|
42
|
+
* resultMatchers.expectInProgress(output.result);
|
|
43
|
+
* // TypeScript knows output.result.metadata might exist
|
|
44
|
+
*/
|
|
45
|
+
expectInProgress<T, E extends string, M>(result: StatefulAgentResult<T, E, M>): asserts result is {
|
|
46
|
+
status: "in-progress";
|
|
47
|
+
metadata?: M;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=test-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGzF;;;;GAIG;AACH,eAAO,MAAM,cAAc;IACzB;;;;;;;;OAQG;kBACW,CAAC,EAAE,CAAC,SAAS,MAAM,UACvB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GACxB,QAAQ,MAAM,IAAI;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE;IAInD;;;;;;;;OAQG;gBACS,CAAC,EAAE,CAAC,SAAS,MAAM,UACrB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GACxB,QAAQ,MAAM,IAAI;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE;IAIlD;;;;;;;OAOG;qBACc,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,UAC7B,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACnC,QAAQ,MAAM,IAAI;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;KAAE;CAG7D,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test helpers for asserting on agent results.
|
|
3
|
+
*/
|
|
4
|
+
import { expect } from 'vitest';
|
|
5
|
+
/**
|
|
6
|
+
* Test matchers for agent results.
|
|
7
|
+
*
|
|
8
|
+
* Provides type-safe assertions that narrow TypeScript types.
|
|
9
|
+
*/
|
|
10
|
+
export const resultMatchers = {
|
|
11
|
+
/**
|
|
12
|
+
* Assert result is success and extract data.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const output = await agent.execute(input);
|
|
16
|
+
* resultMatchers.expectSuccess(output.result);
|
|
17
|
+
* // TypeScript knows output.result.data exists here
|
|
18
|
+
* expect(output.result.data.field).toBe('value');
|
|
19
|
+
*/
|
|
20
|
+
expectSuccess(result) {
|
|
21
|
+
expect(result.status).toBe('success');
|
|
22
|
+
},
|
|
23
|
+
/**
|
|
24
|
+
* Assert result is error and extract error.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const output = await agent.execute(badInput);
|
|
28
|
+
* resultMatchers.expectError(output.result);
|
|
29
|
+
* // TypeScript knows output.result.error exists here
|
|
30
|
+
* expect(output.result.error).toBe('invalid-input');
|
|
31
|
+
*/
|
|
32
|
+
expectError(result) {
|
|
33
|
+
expect(result.status).toBe('error');
|
|
34
|
+
},
|
|
35
|
+
/**
|
|
36
|
+
* Assert result is in-progress.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* const output = await conversationalAgent.execute(message);
|
|
40
|
+
* resultMatchers.expectInProgress(output.result);
|
|
41
|
+
* // TypeScript knows output.result.metadata might exist
|
|
42
|
+
*/
|
|
43
|
+
expectInProgress(result) {
|
|
44
|
+
expect(result.status).toBe('in-progress');
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=test-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B;;;;;;;;OAQG;IACH,aAAa,CACX,MAAyB;QAEzB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW,CACT,MAAyB;QAEzB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,gBAAgB,CACd,MAAoC;QAEpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC"}
|