ai-workflows 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -0
- package/.turbo/turbo-test.log +104 -0
- package/README.md +285 -24
- package/dist/context.d.ts +26 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +84 -0
- package/dist/context.js.map +1 -0
- package/dist/every.d.ts +67 -0
- package/dist/every.d.ts.map +1 -0
- package/dist/every.js +268 -0
- package/dist/every.js.map +1 -0
- package/dist/index.d.ts +66 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -7
- package/dist/index.js.map +1 -0
- package/dist/on.d.ts +49 -0
- package/dist/on.d.ts.map +1 -0
- package/dist/on.js +80 -0
- package/dist/on.js.map +1 -0
- package/dist/send.d.ts +59 -0
- package/dist/send.d.ts.map +1 -0
- package/dist/send.js +112 -0
- package/dist/send.js.map +1 -0
- package/dist/types.d.ts +229 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow.d.ts +79 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +456 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +24 -65
- package/src/context.ts +108 -0
- package/src/every.ts +299 -0
- package/src/index.ts +106 -0
- package/src/on.ts +100 -0
- package/src/send.ts +131 -0
- package/src/types.ts +244 -0
- package/src/workflow.ts +569 -0
- package/test/context.test.ts +151 -0
- package/test/every.test.ts +361 -0
- package/test/on.test.ts +100 -0
- package/test/send.test.ts +118 -0
- package/test/workflow.test.ts +288 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +8 -0
- package/LICENSE +0 -21
- package/dist/index.test.d.ts +0 -1
- package/dist/index.test.js +0 -9
package/dist/send.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emission using send('Noun.event', data)
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* send('Customer.created', customer)
|
|
6
|
+
* send('Order.completed', order)
|
|
7
|
+
*/
|
|
8
|
+
import { getEventHandlers } from './on.js';
|
|
9
|
+
import { createWorkflowContext } from './context.js';
|
|
10
|
+
/**
|
|
11
|
+
* Event bus for managing event delivery
|
|
12
|
+
*/
|
|
13
|
+
class EventBus {
|
|
14
|
+
pending = [];
|
|
15
|
+
processing = false;
|
|
16
|
+
/**
|
|
17
|
+
* Emit an event
|
|
18
|
+
*/
|
|
19
|
+
async emit(event, data) {
|
|
20
|
+
this.pending.push({ event, data });
|
|
21
|
+
if (!this.processing) {
|
|
22
|
+
await this.process();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Process pending events
|
|
27
|
+
*/
|
|
28
|
+
async process() {
|
|
29
|
+
this.processing = true;
|
|
30
|
+
while (this.pending.length > 0) {
|
|
31
|
+
const item = this.pending.shift();
|
|
32
|
+
await this.deliver(item.event, item.data);
|
|
33
|
+
}
|
|
34
|
+
this.processing = false;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Deliver an event to matching handlers
|
|
38
|
+
*/
|
|
39
|
+
async deliver(event, data) {
|
|
40
|
+
const parsed = parseEvent(event);
|
|
41
|
+
if (!parsed) {
|
|
42
|
+
console.warn(`Invalid event format: ${event}. Expected Noun.event`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const handlers = getEventHandlers();
|
|
46
|
+
const matching = handlers.filter(h => h.noun === parsed.noun && h.event === parsed.event);
|
|
47
|
+
if (matching.length === 0) {
|
|
48
|
+
// No handlers registered - that's okay, event is just not handled
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Create workflow context for handlers
|
|
52
|
+
const ctx = createWorkflowContext(this);
|
|
53
|
+
// Execute all matching handlers
|
|
54
|
+
await Promise.all(matching.map(async ({ handler }) => {
|
|
55
|
+
try {
|
|
56
|
+
await handler(data, ctx);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error(`Error in handler for ${event}:`, error);
|
|
60
|
+
}
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Parse event string into noun and event
|
|
66
|
+
*/
|
|
67
|
+
export function parseEvent(event) {
|
|
68
|
+
const parts = event.split('.');
|
|
69
|
+
if (parts.length !== 2) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const [noun, eventName] = parts;
|
|
73
|
+
if (!noun || !eventName) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return { noun, event: eventName };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Global event bus instance
|
|
80
|
+
*/
|
|
81
|
+
const globalEventBus = new EventBus();
|
|
82
|
+
/**
|
|
83
|
+
* Send an event
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* import { send } from 'ai-workflows'
|
|
88
|
+
*
|
|
89
|
+
* // Emit a customer created event
|
|
90
|
+
* await send('Customer.created', {
|
|
91
|
+
* id: '123',
|
|
92
|
+
* name: 'John Doe',
|
|
93
|
+
* email: 'john@example.com'
|
|
94
|
+
* })
|
|
95
|
+
*
|
|
96
|
+
* // Emit an order completed event
|
|
97
|
+
* await send('Order.completed', {
|
|
98
|
+
* id: 'order-456',
|
|
99
|
+
* total: 99.99
|
|
100
|
+
* })
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export async function send(event, data) {
|
|
104
|
+
await globalEventBus.emit(event, data);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the global event bus (for testing/internal use)
|
|
108
|
+
*/
|
|
109
|
+
export function getEventBus() {
|
|
110
|
+
return globalEventBus;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=send.js.map
|
package/dist/send.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for ai-workflows
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Handler function with source code for remote execution
|
|
6
|
+
*/
|
|
7
|
+
export interface HandlerFunction<T = unknown> {
|
|
8
|
+
/** The actual function */
|
|
9
|
+
fn: (...args: any[]) => void | Promise<void>;
|
|
10
|
+
/** Source code string for remote execution */
|
|
11
|
+
source: string;
|
|
12
|
+
/** Handler name (for debugging) */
|
|
13
|
+
name?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Event handler function type
|
|
17
|
+
* Can return void (for send) or a result (for do/try)
|
|
18
|
+
*/
|
|
19
|
+
export type EventHandler<T = unknown, R = unknown> = (data: T, $: WorkflowContext) => R | void | Promise<R | void>;
|
|
20
|
+
/**
|
|
21
|
+
* Schedule handler function type
|
|
22
|
+
*/
|
|
23
|
+
export type ScheduleHandler = ($: WorkflowContext) => void | Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Workflow context ($) passed to handlers
|
|
26
|
+
*/
|
|
27
|
+
export interface WorkflowContext {
|
|
28
|
+
/**
|
|
29
|
+
* Send an event (fire and forget, durable)
|
|
30
|
+
* Confirms receipt but doesn't wait for result
|
|
31
|
+
*/
|
|
32
|
+
send: <T = unknown>(event: string, data: T) => Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Do an action (durable, waits for result)
|
|
35
|
+
* Retries on failure, stores result durably
|
|
36
|
+
*/
|
|
37
|
+
do: <TData = unknown, TResult = unknown>(event: string, data: TData) => Promise<TResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Try an action (non-durable, waits for result)
|
|
40
|
+
* Simple execution without durability guarantees
|
|
41
|
+
*/
|
|
42
|
+
try: <TData = unknown, TResult = unknown>(event: string, data: TData) => Promise<TResult>;
|
|
43
|
+
/** Register event handler ($.on.Noun.event) */
|
|
44
|
+
on: OnProxy;
|
|
45
|
+
/** Register schedule handler ($.every.hour, $.every.Monday.at9am) */
|
|
46
|
+
every: EveryProxy;
|
|
47
|
+
/**
|
|
48
|
+
* Workflow state - read/write context data
|
|
49
|
+
* $.state.userId = '123'
|
|
50
|
+
* const id = $.state.userId
|
|
51
|
+
*/
|
|
52
|
+
state: Record<string, unknown>;
|
|
53
|
+
/**
|
|
54
|
+
* Get the full workflow state (context + history)
|
|
55
|
+
* Returns a copy to prevent mutation
|
|
56
|
+
*/
|
|
57
|
+
getState: () => WorkflowState;
|
|
58
|
+
/**
|
|
59
|
+
* Set a value in the context
|
|
60
|
+
* Alternative to $.state.key = value
|
|
61
|
+
*/
|
|
62
|
+
set: <T = unknown>(key: string, value: T) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Get a value from the context
|
|
65
|
+
* Alternative to $.state.key
|
|
66
|
+
*/
|
|
67
|
+
get: <T = unknown>(key: string) => T | undefined;
|
|
68
|
+
/** Log message */
|
|
69
|
+
log: (message: string, data?: unknown) => void;
|
|
70
|
+
/** Access to database (if connected) */
|
|
71
|
+
db?: DatabaseContext;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Database context for workflows
|
|
75
|
+
*/
|
|
76
|
+
export interface DatabaseContext {
|
|
77
|
+
/** Record an event (immutable) */
|
|
78
|
+
recordEvent: (event: string, data: unknown) => Promise<void>;
|
|
79
|
+
/** Create an action (pending work) */
|
|
80
|
+
createAction: (action: ActionData) => Promise<void>;
|
|
81
|
+
/** Complete an action */
|
|
82
|
+
completeAction: (id: string, result: unknown) => Promise<void>;
|
|
83
|
+
/** Store an artifact */
|
|
84
|
+
storeArtifact: (artifact: ArtifactData) => Promise<void>;
|
|
85
|
+
/** Get an artifact */
|
|
86
|
+
getArtifact: (key: string) => Promise<unknown | null>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Action data for pending/active work
|
|
90
|
+
*/
|
|
91
|
+
export interface ActionData {
|
|
92
|
+
/** Actor performing the action (user, agent, system) */
|
|
93
|
+
actor: string;
|
|
94
|
+
/** Object being acted upon */
|
|
95
|
+
object: string;
|
|
96
|
+
/** Action being performed */
|
|
97
|
+
action: string;
|
|
98
|
+
/** Current status */
|
|
99
|
+
status?: 'pending' | 'active' | 'completed' | 'failed';
|
|
100
|
+
/** Optional metadata */
|
|
101
|
+
metadata?: Record<string, unknown>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Artifact data for cached compiled/parsed content
|
|
105
|
+
*/
|
|
106
|
+
export interface ArtifactData {
|
|
107
|
+
/** Unique key for the artifact */
|
|
108
|
+
key: string;
|
|
109
|
+
/** Type of artifact (ast, types, esm, worker, html, markdown) */
|
|
110
|
+
type: 'ast' | 'types' | 'esm' | 'worker' | 'html' | 'markdown' | 'bundle' | string;
|
|
111
|
+
/** Source hash (for cache invalidation) */
|
|
112
|
+
sourceHash: string;
|
|
113
|
+
/** The artifact content */
|
|
114
|
+
content: unknown;
|
|
115
|
+
/** Optional metadata */
|
|
116
|
+
metadata?: Record<string, unknown>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Event proxy type for $.on.Noun.event pattern
|
|
120
|
+
*/
|
|
121
|
+
export type OnProxy = {
|
|
122
|
+
[noun: string]: {
|
|
123
|
+
[event: string]: (handler: EventHandler) => void;
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Every proxy type for $.every patterns
|
|
128
|
+
*/
|
|
129
|
+
export type EveryProxy = {
|
|
130
|
+
(description: string, handler: ScheduleHandler): void;
|
|
131
|
+
} & {
|
|
132
|
+
[key: string]: ((handler: ScheduleHandler) => void) | ((value: number) => (handler: ScheduleHandler) => void) | {
|
|
133
|
+
[timeKey: string]: (handler: ScheduleHandler) => void;
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Workflow state
|
|
138
|
+
*/
|
|
139
|
+
export interface WorkflowState {
|
|
140
|
+
/** Current state name (for state machines) */
|
|
141
|
+
current?: string;
|
|
142
|
+
/** Context data */
|
|
143
|
+
context: Record<string, unknown>;
|
|
144
|
+
/** Execution history */
|
|
145
|
+
history: WorkflowHistoryEntry[];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* History entry for workflow execution
|
|
149
|
+
*/
|
|
150
|
+
export interface WorkflowHistoryEntry {
|
|
151
|
+
timestamp: number;
|
|
152
|
+
type: 'event' | 'schedule' | 'transition' | 'action';
|
|
153
|
+
name: string;
|
|
154
|
+
data?: unknown;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Event registration with source
|
|
158
|
+
*/
|
|
159
|
+
export interface EventRegistration {
|
|
160
|
+
noun: string;
|
|
161
|
+
event: string;
|
|
162
|
+
handler: EventHandler;
|
|
163
|
+
source: string;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Schedule registration with source
|
|
167
|
+
*/
|
|
168
|
+
export interface ScheduleRegistration {
|
|
169
|
+
interval: ScheduleInterval;
|
|
170
|
+
handler: ScheduleHandler;
|
|
171
|
+
source: string;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Schedule intervals
|
|
175
|
+
*/
|
|
176
|
+
export type ScheduleInterval = {
|
|
177
|
+
type: 'second';
|
|
178
|
+
value?: number;
|
|
179
|
+
natural?: string;
|
|
180
|
+
} | {
|
|
181
|
+
type: 'minute';
|
|
182
|
+
value?: number;
|
|
183
|
+
natural?: string;
|
|
184
|
+
} | {
|
|
185
|
+
type: 'hour';
|
|
186
|
+
value?: number;
|
|
187
|
+
natural?: string;
|
|
188
|
+
} | {
|
|
189
|
+
type: 'day';
|
|
190
|
+
value?: number;
|
|
191
|
+
natural?: string;
|
|
192
|
+
} | {
|
|
193
|
+
type: 'week';
|
|
194
|
+
value?: number;
|
|
195
|
+
natural?: string;
|
|
196
|
+
} | {
|
|
197
|
+
type: 'cron';
|
|
198
|
+
expression: string;
|
|
199
|
+
natural?: string;
|
|
200
|
+
} | {
|
|
201
|
+
type: 'natural';
|
|
202
|
+
description: string;
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Workflow definition
|
|
206
|
+
*/
|
|
207
|
+
export interface WorkflowDefinition {
|
|
208
|
+
name: string;
|
|
209
|
+
events: EventRegistration[];
|
|
210
|
+
schedules: ScheduleRegistration[];
|
|
211
|
+
initialContext?: Record<string, unknown>;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Parsed event name (Noun.event format)
|
|
215
|
+
*/
|
|
216
|
+
export interface ParsedEvent {
|
|
217
|
+
noun: string;
|
|
218
|
+
event: string;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Workflow options
|
|
222
|
+
*/
|
|
223
|
+
export interface WorkflowOptions {
|
|
224
|
+
/** Initial context data */
|
|
225
|
+
context?: Record<string, unknown>;
|
|
226
|
+
/** Database connection for persistence */
|
|
227
|
+
db?: DatabaseContext;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Workflow API
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* Workflow($ => {
|
|
6
|
+
* $.on.Customer.created(async (customer, $) => {
|
|
7
|
+
* $.log('Customer created', customer)
|
|
8
|
+
* await $.send('Email.welcome', { to: customer.email })
|
|
9
|
+
* })
|
|
10
|
+
*
|
|
11
|
+
* $.every.Monday.at9am(async ($) => {
|
|
12
|
+
* $.log('Weekly standup reminder')
|
|
13
|
+
* })
|
|
14
|
+
* })
|
|
15
|
+
*/
|
|
16
|
+
import type { WorkflowContext, WorkflowState, WorkflowDefinition, WorkflowOptions, ParsedEvent } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Parse event string into noun and event
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseEvent(event: string): ParsedEvent | null;
|
|
21
|
+
/**
|
|
22
|
+
* Workflow instance returned by Workflow()
|
|
23
|
+
*/
|
|
24
|
+
export interface WorkflowInstance {
|
|
25
|
+
/** Workflow definition with captured handlers */
|
|
26
|
+
definition: WorkflowDefinition;
|
|
27
|
+
/** Current state */
|
|
28
|
+
state: WorkflowState;
|
|
29
|
+
/** The $ context */
|
|
30
|
+
$: WorkflowContext;
|
|
31
|
+
/** Send an event */
|
|
32
|
+
send: <T = unknown>(event: string, data: T) => Promise<void>;
|
|
33
|
+
/** Start the workflow (begin processing schedules) */
|
|
34
|
+
start: () => Promise<void>;
|
|
35
|
+
/** Stop the workflow */
|
|
36
|
+
stop: () => Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a workflow with the $ context
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const workflow = Workflow($ => {
|
|
44
|
+
* $.on.Customer.created(async (customer, $) => {
|
|
45
|
+
* $.log('New customer:', customer.name)
|
|
46
|
+
* await $.send('Email.welcome', { to: customer.email })
|
|
47
|
+
* })
|
|
48
|
+
*
|
|
49
|
+
* $.every.hour(async ($) => {
|
|
50
|
+
* $.log('Hourly check')
|
|
51
|
+
* })
|
|
52
|
+
*
|
|
53
|
+
* $.every.Monday.at9am(async ($) => {
|
|
54
|
+
* $.log('Weekly standup')
|
|
55
|
+
* })
|
|
56
|
+
*
|
|
57
|
+
* $.every('first Monday of the month', async ($) => {
|
|
58
|
+
* $.log('Monthly report')
|
|
59
|
+
* })
|
|
60
|
+
* })
|
|
61
|
+
*
|
|
62
|
+
* await workflow.start()
|
|
63
|
+
* await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function Workflow(setup: ($: WorkflowContext) => void, options?: WorkflowOptions): WorkflowInstance;
|
|
67
|
+
/**
|
|
68
|
+
* Create an isolated $ context for testing
|
|
69
|
+
*/
|
|
70
|
+
export declare function createTestContext(): WorkflowContext & {
|
|
71
|
+
emittedEvents: Array<{
|
|
72
|
+
event: string;
|
|
73
|
+
data: unknown;
|
|
74
|
+
}>;
|
|
75
|
+
};
|
|
76
|
+
export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
|
|
77
|
+
export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter } from './every.js';
|
|
78
|
+
export { send } from './send.js';
|
|
79
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EAOb,kBAAkB,EAClB,eAAe,EAGf,WAAW,EAEZ,MAAM,YAAY,CAAA;AA4DnB;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAU5D;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,oBAAoB;IACpB,KAAK,EAAE,aAAa,CAAA;IACpB,oBAAoB;IACpB,CAAC,EAAE,eAAe,CAAA;IAClB,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,sDAAsD;IACtD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,EACnC,OAAO,GAAE,eAAoB,GAC5B,gBAAgB,CAuVlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,GAAG;IAAE,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,CA4DhH;AAGD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC/J,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
|