@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.
Files changed (106) hide show
  1. package/README.md +295 -0
  2. package/dist/adapter-types.d.ts +48 -0
  3. package/dist/adapter-types.d.ts.map +1 -0
  4. package/dist/adapter-types.js +24 -0
  5. package/dist/adapter-types.js.map +1 -0
  6. package/dist/agent-helpers.d.ts +128 -0
  7. package/dist/agent-helpers.d.ts.map +1 -0
  8. package/dist/agent-helpers.js +291 -0
  9. package/dist/agent-helpers.js.map +1 -0
  10. package/dist/agentic-researcher.d.ts +63 -0
  11. package/dist/agentic-researcher.d.ts.map +1 -0
  12. package/dist/agentic-researcher.js +60 -0
  13. package/dist/agentic-researcher.js.map +1 -0
  14. package/dist/conversational-assistant.d.ts +57 -0
  15. package/dist/conversational-assistant.d.ts.map +1 -0
  16. package/dist/conversational-assistant.js +48 -0
  17. package/dist/conversational-assistant.js.map +1 -0
  18. package/dist/conversational-helpers.d.ts +26 -0
  19. package/dist/conversational-helpers.d.ts.map +1 -0
  20. package/dist/conversational-helpers.js +34 -0
  21. package/dist/conversational-helpers.js.map +1 -0
  22. package/dist/execute-wrapper.d.ts +59 -0
  23. package/dist/execute-wrapper.d.ts.map +1 -0
  24. package/dist/execute-wrapper.js +98 -0
  25. package/dist/execute-wrapper.js.map +1 -0
  26. package/dist/external-event-integrator.d.ts +66 -0
  27. package/dist/external-event-integrator.d.ts.map +1 -0
  28. package/dist/external-event-integrator.js +62 -0
  29. package/dist/external-event-integrator.js.map +1 -0
  30. package/dist/function-event-consumer.d.ts +60 -0
  31. package/dist/function-event-consumer.d.ts.map +1 -0
  32. package/dist/function-event-consumer.js +52 -0
  33. package/dist/function-event-consumer.js.map +1 -0
  34. package/dist/function-orchestrator.d.ts +45 -0
  35. package/dist/function-orchestrator.d.ts.map +1 -0
  36. package/dist/function-orchestrator.js +51 -0
  37. package/dist/function-orchestrator.js.map +1 -0
  38. package/dist/index.d.ts +25 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +27 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/llm-analyzer.d.ts +58 -0
  43. package/dist/llm-analyzer.d.ts.map +1 -0
  44. package/dist/llm-analyzer.js +53 -0
  45. package/dist/llm-analyzer.js.map +1 -0
  46. package/dist/llm-coordinator.d.ts +62 -0
  47. package/dist/llm-coordinator.d.ts.map +1 -0
  48. package/dist/llm-coordinator.js +60 -0
  49. package/dist/llm-coordinator.js.map +1 -0
  50. package/dist/llm-event-handler.d.ts +67 -0
  51. package/dist/llm-event-handler.d.ts.map +1 -0
  52. package/dist/llm-event-handler.js +65 -0
  53. package/dist/llm-event-handler.js.map +1 -0
  54. package/dist/pure-function.d.ts +34 -0
  55. package/dist/pure-function.d.ts.map +1 -0
  56. package/dist/pure-function.js +40 -0
  57. package/dist/pure-function.js.map +1 -0
  58. package/dist/result-helpers.d.ts +80 -0
  59. package/dist/result-helpers.d.ts.map +1 -0
  60. package/dist/result-helpers.js +232 -0
  61. package/dist/result-helpers.js.map +1 -0
  62. package/dist/session/errors.d.ts +11 -0
  63. package/dist/session/errors.d.ts.map +1 -0
  64. package/dist/session/errors.js +15 -0
  65. package/dist/session/errors.js.map +1 -0
  66. package/dist/session/file-session-store.d.ts +46 -0
  67. package/dist/session/file-session-store.d.ts.map +1 -0
  68. package/dist/session/file-session-store.js +149 -0
  69. package/dist/session/file-session-store.js.map +1 -0
  70. package/dist/session/index.d.ts +12 -0
  71. package/dist/session/index.d.ts.map +1 -0
  72. package/dist/session/index.js +13 -0
  73. package/dist/session/index.js.map +1 -0
  74. package/dist/session/memory-session-store.d.ts +35 -0
  75. package/dist/session/memory-session-store.d.ts.map +1 -0
  76. package/dist/session/memory-session-store.js +76 -0
  77. package/dist/session/memory-session-store.js.map +1 -0
  78. package/dist/session/session-store-helpers.d.ts +26 -0
  79. package/dist/session/session-store-helpers.d.ts.map +1 -0
  80. package/dist/session/session-store-helpers.js +54 -0
  81. package/dist/session/session-store-helpers.js.map +1 -0
  82. package/dist/session/test-helpers/index.d.ts +61 -0
  83. package/dist/session/test-helpers/index.d.ts.map +1 -0
  84. package/dist/session/test-helpers/index.js +167 -0
  85. package/dist/session/test-helpers/index.js.map +1 -0
  86. package/dist/session/types.d.ts +86 -0
  87. package/dist/session/types.d.ts.map +1 -0
  88. package/dist/session/types.js +8 -0
  89. package/dist/session/types.js.map +1 -0
  90. package/dist/shared-validation.d.ts +21 -0
  91. package/dist/shared-validation.d.ts.map +1 -0
  92. package/dist/shared-validation.js +45 -0
  93. package/dist/shared-validation.js.map +1 -0
  94. package/dist/test-helpers.d.ts +50 -0
  95. package/dist/test-helpers.d.ts.map +1 -0
  96. package/dist/test-helpers.js +47 -0
  97. package/dist/test-helpers.js.map +1 -0
  98. package/dist/two-phase-conversational.d.ts +173 -0
  99. package/dist/two-phase-conversational.d.ts.map +1 -0
  100. package/dist/two-phase-conversational.js +205 -0
  101. package/dist/two-phase-conversational.js.map +1 -0
  102. package/dist/types.d.ts +194 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +5 -0
  105. package/dist/types.js.map +1 -0
  106. 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,8 @@
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
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -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"}