@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,232 @@
1
+ /**
2
+ * Helper functions for working with agent results.
3
+ * Provides Railway-Oriented Programming patterns for orchestration.
4
+ */
5
+ import { EVENT_TIMEOUT, EVENT_UNAVAILABLE, LLM_RATE_LIMIT, LLM_TIMEOUT, LLM_UNAVAILABLE, RESULT_SUCCESS, RETRYABLE_EVENT_ERRORS, RETRYABLE_LLM_ERRORS, } from '@vibe-agent-toolkit/agent-schema';
6
+ /**
7
+ * Map success value, propagate errors.
8
+ * Classic functor map operation.
9
+ *
10
+ * @example
11
+ * const result = { status: 'success', data: 5 };
12
+ * const doubled = mapResult(result, x => x * 2);
13
+ * // doubled = { status: 'success', data: 10 }
14
+ */
15
+ export function mapResult(result, fn) {
16
+ if (result.status === 'success') {
17
+ return {
18
+ status: 'success',
19
+ data: fn(result.data),
20
+ ...(result.confidence !== undefined && { confidence: result.confidence }),
21
+ ...(result.warnings && { warnings: result.warnings }),
22
+ ...(result.execution && { execution: result.execution }),
23
+ };
24
+ }
25
+ return result;
26
+ }
27
+ /**
28
+ * Chain dependent operations (monadic bind).
29
+ * Only runs next operation if current succeeded.
30
+ *
31
+ * @example
32
+ * const result1 = await agent1.execute(input);
33
+ * const result2 = await andThen(result1.result, async (data) => {
34
+ * const output = await agent2.execute(data);
35
+ * return output.result;
36
+ * });
37
+ */
38
+ export async function andThen(result, fn) {
39
+ if (result.status === 'success') {
40
+ return await fn(result.data);
41
+ }
42
+ return result;
43
+ }
44
+ /**
45
+ * Pattern matching on result status.
46
+ * Exhaustive handling of all cases.
47
+ *
48
+ * @example
49
+ * const message = match(result, {
50
+ * success: (data) => `Success: ${data}`,
51
+ * error: (err) => `Error: ${err}`,
52
+ * inProgress: () => 'Still working...'
53
+ * });
54
+ */
55
+ export function match(result, handlers) {
56
+ switch (result.status) {
57
+ case 'success':
58
+ return handlers.success(result.data);
59
+ case 'error':
60
+ return handlers.error(result.error);
61
+ case 'in-progress':
62
+ return handlers.inProgress?.(result.metadata);
63
+ }
64
+ }
65
+ /**
66
+ * Unwrap result or throw error.
67
+ * Use when you want to convert to exception-based flow.
68
+ *
69
+ * @example
70
+ * try {
71
+ * const data = unwrap(result);
72
+ * console.log('Success:', data);
73
+ * } catch (err) {
74
+ * console.error('Failed:', err);
75
+ * }
76
+ */
77
+ export function unwrap(result) {
78
+ if (result.status === 'success') {
79
+ return result.data;
80
+ }
81
+ throw new Error(`Agent error: ${String(result.error)}`);
82
+ }
83
+ // ============================================================================
84
+ // Orchestration Helpers
85
+ // ============================================================================
86
+ /**
87
+ * Backoff delays for different error types (milliseconds).
88
+ * Orchestrators use these for exponential backoff retry logic.
89
+ *
90
+ * @internal
91
+ */
92
+ const BACKOFF_DELAYS = {
93
+ [LLM_RATE_LIMIT]: 5000, // Rate limits need longer waits
94
+ [LLM_TIMEOUT]: 1000, // Timeouts can retry quickly
95
+ [LLM_UNAVAILABLE]: 10000, // Service issues need long waits
96
+ [EVENT_TIMEOUT]: 2000,
97
+ [EVENT_UNAVAILABLE]: 5000,
98
+ };
99
+ /**
100
+ * Check if an error type is retryable.
101
+ *
102
+ * @internal
103
+ */
104
+ function isRetryable(error) {
105
+ return (RETRYABLE_LLM_ERRORS.has(error) ||
106
+ RETRYABLE_EVENT_ERRORS.has(error));
107
+ }
108
+ /**
109
+ * Calculate exponential backoff delay for retry.
110
+ *
111
+ * @internal
112
+ */
113
+ function getBackoffDelay(error, attempt) {
114
+ const baseDelay = BACKOFF_DELAYS[error] ?? 2000;
115
+ return Math.min(baseDelay * Math.pow(2, attempt), 30000); // Cap at 30s
116
+ }
117
+ /**
118
+ * Sleep for a given number of milliseconds.
119
+ *
120
+ * @internal
121
+ */
122
+ function sleep(ms) {
123
+ return new Promise((resolve) => setTimeout(resolve, ms));
124
+ }
125
+ /**
126
+ * Wrap agent execution with retry logic.
127
+ *
128
+ * Automatically retries on transient failures (timeouts, rate limits, unavailable),
129
+ * injects retry count into execution metadata, and uses exponential backoff.
130
+ *
131
+ * @example
132
+ * const agent = createAgent({...});
133
+ * const withRetries = withRetry(() => agent.execute(input), 5);
134
+ * const output = await withRetries;
135
+ * // output.result.execution.retryCount shows how many retries were needed
136
+ */
137
+ export async function withRetry(agentFn, maxAttempts = 5) {
138
+ let lastOutput;
139
+ let totalDurationMs = 0;
140
+ let totalTokensUsed = 0;
141
+ let totalCost = 0;
142
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
143
+ lastOutput = await agentFn();
144
+ // Accumulate metrics across attempts
145
+ if (lastOutput.result.execution) {
146
+ totalDurationMs += lastOutput.result.execution.durationMs ?? 0;
147
+ totalTokensUsed += lastOutput.result.execution.tokensUsed ?? 0;
148
+ totalCost += lastOutput.result.execution.cost ?? 0;
149
+ }
150
+ // Success: inject retry count and accumulated metrics
151
+ if (lastOutput.result.status === RESULT_SUCCESS) {
152
+ return {
153
+ ...lastOutput,
154
+ result: {
155
+ ...lastOutput.result,
156
+ execution: {
157
+ ...lastOutput.result.execution,
158
+ retryCount: attempt,
159
+ durationMs: totalDurationMs,
160
+ tokensUsed: totalTokensUsed,
161
+ cost: totalCost,
162
+ },
163
+ },
164
+ };
165
+ }
166
+ // Non-retryable error: inject retry count and return
167
+ if (!isRetryable(lastOutput.result.error)) {
168
+ return {
169
+ ...lastOutput,
170
+ result: {
171
+ ...lastOutput.result,
172
+ execution: {
173
+ ...lastOutput.result.execution,
174
+ retryCount: attempt,
175
+ durationMs: totalDurationMs,
176
+ tokensUsed: totalTokensUsed,
177
+ cost: totalCost,
178
+ },
179
+ },
180
+ };
181
+ }
182
+ // Wait before next retry (except on last attempt)
183
+ if (attempt < maxAttempts - 1) {
184
+ await sleep(getBackoffDelay(lastOutput.result.error, attempt));
185
+ }
186
+ }
187
+ // Max retries exceeded: return last error with retry count
188
+ // lastOutput is guaranteed to be defined here because loop runs at least once
189
+ if (!lastOutput) {
190
+ throw new Error('withRetry: lastOutput is undefined (should never happen)');
191
+ }
192
+ return {
193
+ ...lastOutput,
194
+ result: {
195
+ ...lastOutput.result,
196
+ execution: {
197
+ ...lastOutput.result.execution,
198
+ retryCount: maxAttempts - 1,
199
+ durationMs: totalDurationMs,
200
+ tokensUsed: totalTokensUsed,
201
+ cost: totalCost,
202
+ },
203
+ },
204
+ };
205
+ }
206
+ /**
207
+ * Wrap agent execution with timing metadata.
208
+ *
209
+ * Measures execution duration and injects it into ExecutionMetadata.
210
+ *
211
+ * @example
212
+ * const output = await withTiming(() => agent.execute(input));
213
+ * console.log(`Execution took ${output.result.execution?.durationMs}ms`);
214
+ */
215
+ export async function withTiming(agentFn) {
216
+ const startTime = Date.now();
217
+ const timestamp = new Date(startTime).toISOString();
218
+ const output = await agentFn();
219
+ const durationMs = Date.now() - startTime;
220
+ return {
221
+ ...output,
222
+ result: {
223
+ ...output.result,
224
+ execution: {
225
+ ...output.result.execution,
226
+ durationMs,
227
+ timestamp,
228
+ },
229
+ },
230
+ };
231
+ }
232
+ //# sourceMappingURL=result-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-helpers.js","sourceRoot":"","sources":["../src/result-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Session management errors for VAT runtime.
3
+ */
4
+ /**
5
+ * Error thrown when session not found
6
+ */
7
+ export declare class SessionNotFoundError extends Error {
8
+ sessionId: string;
9
+ constructor(sessionId: string);
10
+ }
11
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC1B,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAIrC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Session management errors for VAT runtime.
3
+ */
4
+ /**
5
+ * Error thrown when session not found
6
+ */
7
+ export class SessionNotFoundError extends Error {
8
+ sessionId;
9
+ constructor(sessionId) {
10
+ super(`Session not found: ${sessionId}`);
11
+ this.sessionId = sessionId;
12
+ this.name = 'SessionNotFoundError';
13
+ }
14
+ }
15
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC1B;IAAnB,YAAmB,SAAiB;QAClC,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QADxB,cAAS,GAAT,SAAS,CAAQ;QAElC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * File-based session store for Claude Agent SDK runtime.
3
+ *
4
+ * Uses local file system for durable session storage following
5
+ * Claude Agent SDK's storage patterns.
6
+ */
7
+ import type { RuntimeSession, SessionStore, SessionStoreOptions } from '@vibe-agent-toolkit/agent-runtime';
8
+ /**
9
+ * File-based session store for VAT agents.
10
+ *
11
+ * Storage location: ~/.vat-sessions/{session-id}/ (configurable via baseDir option)
12
+ *
13
+ * Use cases:
14
+ * - Local development with session persistence
15
+ * - Single-machine deployments
16
+ * - Session debugging and inspection
17
+ *
18
+ * Characteristics:
19
+ * - Durable (survives process restart)
20
+ * - Local (single machine only)
21
+ * - Runtime-agnostic (works with any LLM runtime)
22
+ */
23
+ export declare class FileSessionStore<TState = unknown> implements SessionStore<TState> {
24
+ private readonly baseDir;
25
+ private readonly generateId;
26
+ private readonly createInitialState;
27
+ private readonly ttl;
28
+ constructor(options?: FileSessionStoreOptions<TState>);
29
+ create(initialState?: TState): Promise<string>;
30
+ load(sessionId: string): Promise<RuntimeSession<TState>>;
31
+ save(session: RuntimeSession<TState>): Promise<void>;
32
+ delete(sessionId: string): Promise<void>;
33
+ exists(sessionId: string): Promise<boolean>;
34
+ list(): Promise<string[]>;
35
+ cleanup(): Promise<number>;
36
+ private getSessionPath;
37
+ /**
38
+ * Get checkpoint directory for this session (for Claude Agent SDK integration)
39
+ */
40
+ getCheckpointDir(sessionId: string): string;
41
+ }
42
+ export interface FileSessionStoreOptions<TState = unknown> extends SessionStoreOptions<TState> {
43
+ /** Base directory for sessions (default: ~/.vat-sessions) */
44
+ baseDir?: string;
45
+ }
46
+ //# sourceMappingURL=file-session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-session-store.d.ts","sourceRoot":"","sources":["../../src/session/file-session-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACpB,MAAM,mCAAmC,CAAC;AAS3C;;;;;;;;;;;;;;GAcG;AACH,qBAAa,gBAAgB,CAAC,MAAM,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,MAAM,CAAC;IAC7E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAChE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;gBAE7B,OAAO,GAAE,uBAAuB,CAAC,MAAM,CAAM;IAOnD,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO9C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAoCxD,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3C,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAazB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAqBhC,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI5C;AAED,MAAM,WAAW,uBAAuB,CAAC,MAAM,GAAG,OAAO,CAAE,SAAQ,mBAAmB,CAAC,MAAM,CAAC;IAC5F,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * File-based session store for Claude Agent SDK runtime.
3
+ *
4
+ * Uses local file system for durable session storage following
5
+ * Claude Agent SDK's storage patterns.
6
+ */
7
+ import { mkdir, readFile, readdir, unlink, writeFile } from 'node:fs/promises';
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { createInitialSession, isSessionExpired, updateSessionAccess, SessionNotFoundError, validateSessionId, } from '@vibe-agent-toolkit/agent-runtime';
11
+ /**
12
+ * File-based session store for VAT agents.
13
+ *
14
+ * Storage location: ~/.vat-sessions/{session-id}/ (configurable via baseDir option)
15
+ *
16
+ * Use cases:
17
+ * - Local development with session persistence
18
+ * - Single-machine deployments
19
+ * - Session debugging and inspection
20
+ *
21
+ * Characteristics:
22
+ * - Durable (survives process restart)
23
+ * - Local (single machine only)
24
+ * - Runtime-agnostic (works with any LLM runtime)
25
+ */
26
+ export class FileSessionStore {
27
+ baseDir;
28
+ generateId;
29
+ createInitialState;
30
+ ttl;
31
+ constructor(options = {}) {
32
+ this.baseDir = options.baseDir ?? join(homedir(), '.vat-sessions');
33
+ this.generateId = options.generateId ?? (() => crypto.randomUUID());
34
+ this.createInitialState = options.createInitialState;
35
+ this.ttl = options.ttl;
36
+ }
37
+ async create(initialState) {
38
+ const id = this.generateId();
39
+ const session = createInitialSession(id, initialState, this.createInitialState, this.ttl);
40
+ await this.save(session);
41
+ return id;
42
+ }
43
+ async load(sessionId) {
44
+ const sessionPath = this.getSessionPath(sessionId);
45
+ try {
46
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- sessionId validated by getSessionPath
47
+ const data = await readFile(sessionPath, 'utf-8');
48
+ const session = JSON.parse(data);
49
+ // Parse dates
50
+ session.metadata.createdAt = new Date(session.metadata.createdAt);
51
+ session.metadata.lastAccessedAt = new Date(session.metadata.lastAccessedAt);
52
+ if (session.metadata.expiresAt) {
53
+ session.metadata.expiresAt = new Date(session.metadata.expiresAt);
54
+ }
55
+ // Check expiration
56
+ if (isSessionExpired(session)) {
57
+ await this.delete(sessionId);
58
+ throw new SessionNotFoundError(sessionId);
59
+ }
60
+ // Update last access and extend TTL
61
+ updateSessionAccess(session, this.ttl);
62
+ // Save updated access time
63
+ await this.save(session);
64
+ return session;
65
+ }
66
+ catch (error) {
67
+ if (error.code === 'ENOENT') {
68
+ throw new SessionNotFoundError(sessionId);
69
+ }
70
+ throw error;
71
+ }
72
+ }
73
+ async save(session) {
74
+ const sessionPath = this.getSessionPath(session.id);
75
+ const sessionDir = join(this.baseDir, session.id);
76
+ // Ensure directory exists
77
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- session.id validated by getSessionPath
78
+ await mkdir(sessionDir, { recursive: true });
79
+ // Write session data
80
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- sessionPath validated by getSessionPath
81
+ await writeFile(sessionPath, JSON.stringify(session, null, 2), 'utf-8');
82
+ }
83
+ async delete(sessionId) {
84
+ const sessionPath = this.getSessionPath(sessionId);
85
+ try {
86
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- sessionPath validated by getSessionPath
87
+ await unlink(sessionPath);
88
+ }
89
+ catch (error) {
90
+ if (error.code !== 'ENOENT') {
91
+ throw error;
92
+ }
93
+ }
94
+ }
95
+ async exists(sessionId) {
96
+ try {
97
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- sessionId validated by getSessionPath
98
+ await readFile(this.getSessionPath(sessionId));
99
+ return true;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ async list() {
106
+ try {
107
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- baseDir set in constructor
108
+ const entries = await readdir(this.baseDir, { withFileTypes: true });
109
+ return entries.filter(e => e.isDirectory()).map(e => e.name);
110
+ }
111
+ catch (error) {
112
+ if (error.code === 'ENOENT') {
113
+ return [];
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ async cleanup() {
119
+ const sessionIds = await this.list();
120
+ let cleaned = 0;
121
+ for (const id of sessionIds) {
122
+ try {
123
+ const session = await this.load(id);
124
+ if (isSessionExpired(session)) {
125
+ await this.delete(id);
126
+ cleaned++;
127
+ }
128
+ }
129
+ catch (error) {
130
+ if (error instanceof SessionNotFoundError) {
131
+ cleaned++;
132
+ }
133
+ }
134
+ }
135
+ return cleaned;
136
+ }
137
+ getSessionPath(sessionId) {
138
+ validateSessionId(sessionId);
139
+ return join(this.baseDir, sessionId, 'session.json');
140
+ }
141
+ /**
142
+ * Get checkpoint directory for this session (for Claude Agent SDK integration)
143
+ */
144
+ getCheckpointDir(sessionId) {
145
+ validateSessionId(sessionId);
146
+ return join(this.baseDir, sessionId, 'checkpoints');
147
+ }
148
+ }
149
+ //# sourceMappingURL=file-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-session-store.js","sourceRoot":"","sources":["../../src/session/file-session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Session management for VAT runtime.
3
+ *
4
+ * Provides pluggable session persistence strategies independent
5
+ * of transport layer.
6
+ */
7
+ export type { Message, RuntimeSession, SessionMetadata, SessionStore, SessionStoreOptions, } from './types.js';
8
+ export { SessionNotFoundError } from './errors.js';
9
+ export { MemorySessionStore } from './memory-session-store.js';
10
+ export { FileSessionStore, type FileSessionStoreOptions } from './file-session-store.js';
11
+ export { createInitialSession, isSessionExpired, updateSessionAccess, validateSessionId, } from './session-store-helpers.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,YAAY,EACZ,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Session management for VAT runtime.
3
+ *
4
+ * Provides pluggable session persistence strategies independent
5
+ * of transport layer.
6
+ */
7
+ export { SessionNotFoundError } from './errors.js';
8
+ export { MemorySessionStore } from './memory-session-store.js';
9
+ export { FileSessionStore } from './file-session-store.js';
10
+ export { createInitialSession, isSessionExpired, updateSessionAccess, validateSessionId, } from './session-store-helpers.js';
11
+ // NOTE: test-helpers is NOT exported from main index to avoid importing vitest
12
+ // in production code. Import from '@vibe-agent-toolkit/agent-runtime/session/test-helpers' in test files.
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAgC,MAAM,yBAAyB,CAAC;AACzF,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,+EAA+E;AAC/E,0GAA0G"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * In-memory session store for VAT runtime.
3
+ *
4
+ * Provides ephemeral session storage suitable for development,
5
+ * testing, and single-process deployments.
6
+ */
7
+ import type { RuntimeSession, SessionStore, SessionStoreOptions } from './types.js';
8
+ /**
9
+ * In-memory session store (ephemeral, process-local).
10
+ *
11
+ * Use cases:
12
+ * - Development and testing
13
+ * - Single-process deployments
14
+ * - Stateless functions with short-lived sessions
15
+ *
16
+ * Characteristics:
17
+ * - Fast (no I/O)
18
+ * - Volatile (lost on process restart)
19
+ * - No cross-process sharing
20
+ */
21
+ export declare class MemorySessionStore<TState = unknown> implements SessionStore<TState> {
22
+ private readonly sessions;
23
+ private readonly ttl;
24
+ private readonly generateId;
25
+ private readonly createInitialState;
26
+ constructor(options?: SessionStoreOptions<TState>);
27
+ create(initialState?: TState): Promise<string>;
28
+ load(sessionId: string): Promise<RuntimeSession<TState>>;
29
+ save(session: RuntimeSession<TState>): Promise<void>;
30
+ delete(sessionId: string): Promise<void>;
31
+ exists(sessionId: string): Promise<boolean>;
32
+ list(): Promise<string[]>;
33
+ cleanup(): Promise<number>;
34
+ }
35
+ //# sourceMappingURL=memory-session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-session-store.d.ts","sourceRoot":"","sources":["../../src/session/memory-session-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpF;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAkB,CAAC,MAAM,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,MAAM,CAAC;IAC/E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IACtE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;gBAEpD,OAAO,GAAE,mBAAmB,CAAC,MAAM,CAAM;IAM/C,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO9C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAkBxD,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3C,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAYjC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * In-memory session store for VAT runtime.
3
+ *
4
+ * Provides ephemeral session storage suitable for development,
5
+ * testing, and single-process deployments.
6
+ */
7
+ import { SessionNotFoundError } from './errors.js';
8
+ import { createInitialSession, isSessionExpired, updateSessionAccess, } from './session-store-helpers.js';
9
+ /**
10
+ * In-memory session store (ephemeral, process-local).
11
+ *
12
+ * Use cases:
13
+ * - Development and testing
14
+ * - Single-process deployments
15
+ * - Stateless functions with short-lived sessions
16
+ *
17
+ * Characteristics:
18
+ * - Fast (no I/O)
19
+ * - Volatile (lost on process restart)
20
+ * - No cross-process sharing
21
+ */
22
+ export class MemorySessionStore {
23
+ sessions = new Map();
24
+ ttl;
25
+ generateId;
26
+ createInitialState;
27
+ constructor(options = {}) {
28
+ this.ttl = options.ttl;
29
+ this.generateId = options.generateId ?? (() => crypto.randomUUID());
30
+ this.createInitialState = options.createInitialState;
31
+ }
32
+ async create(initialState) {
33
+ const id = this.generateId();
34
+ const session = createInitialSession(id, initialState, this.createInitialState, this.ttl);
35
+ this.sessions.set(id, session);
36
+ return id;
37
+ }
38
+ async load(sessionId) {
39
+ const session = this.sessions.get(sessionId);
40
+ if (!session) {
41
+ throw new SessionNotFoundError(sessionId);
42
+ }
43
+ // Check expiration
44
+ if (isSessionExpired(session)) {
45
+ this.sessions.delete(sessionId);
46
+ throw new SessionNotFoundError(sessionId);
47
+ }
48
+ // Update last access and extend TTL
49
+ updateSessionAccess(session, this.ttl);
50
+ return session;
51
+ }
52
+ async save(session) {
53
+ session.metadata.lastAccessedAt = new Date();
54
+ this.sessions.set(session.id, session);
55
+ }
56
+ async delete(sessionId) {
57
+ this.sessions.delete(sessionId);
58
+ }
59
+ async exists(sessionId) {
60
+ return this.sessions.has(sessionId);
61
+ }
62
+ async list() {
63
+ return [...this.sessions.keys()];
64
+ }
65
+ async cleanup() {
66
+ let cleaned = 0;
67
+ for (const [id, session] of this.sessions.entries()) {
68
+ if (isSessionExpired(session)) {
69
+ this.sessions.delete(id);
70
+ cleaned++;
71
+ }
72
+ }
73
+ return cleaned;
74
+ }
75
+ }
76
+ //# sourceMappingURL=memory-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-session-store.js","sourceRoot":"","sources":["../../src/session/memory-session-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAGpC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,kBAAkB;IACZ,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IACrD,GAAG,CAAqB;IACxB,UAAU,CAAe;IACzB,kBAAkB,CAA6B;IAEhE,YAAY,UAAuC,EAAE;QACnD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAqB;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,mBAAmB;QACnB,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,oCAAoC;QACpC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA+B;QACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}