@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,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"}
|