@onkeiki/agents 0.1.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/dist/Alert.d.ts +56 -0
- package/dist/Alert.d.ts.map +1 -0
- package/dist/Alert.js +8 -0
- package/dist/Alert.js.map +1 -0
- package/dist/Entity.d.ts +158 -0
- package/dist/Entity.d.ts.map +1 -0
- package/dist/Entity.js +289 -0
- package/dist/Entity.js.map +1 -0
- package/dist/Kit.d.ts +138 -0
- package/dist/Kit.d.ts.map +1 -0
- package/dist/Kit.js +517 -0
- package/dist/Kit.js.map +1 -0
- package/dist/OpenApi.d.ts +151 -0
- package/dist/OpenApi.d.ts.map +1 -0
- package/dist/OpenApi.js +222 -0
- package/dist/OpenApi.js.map +1 -0
- package/dist/Plugin.d.ts +183 -0
- package/dist/Plugin.d.ts.map +1 -0
- package/dist/Plugin.js +10 -0
- package/dist/Plugin.js.map +1 -0
- package/dist/Server.d.ts +71 -0
- package/dist/Server.d.ts.map +1 -0
- package/dist/Server.js +476 -0
- package/dist/Server.js.map +1 -0
- package/dist/Tool.d.ts +86 -0
- package/dist/Tool.d.ts.map +1 -0
- package/dist/Tool.js +27 -0
- package/dist/Tool.js.map +1 -0
- package/dist/bundle.d.ts +17 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +101 -0
- package/dist/bundle.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/services/Blackboard.d.ts +18 -0
- package/dist/services/Blackboard.d.ts.map +1 -0
- package/dist/services/Blackboard.js +4 -0
- package/dist/services/Blackboard.js.map +1 -0
- package/dist/services/Observability.d.ts +102 -0
- package/dist/services/Observability.d.ts.map +1 -0
- package/dist/services/Observability.js +238 -0
- package/dist/services/Observability.js.map +1 -0
- package/dist/services/Platform.d.ts +112 -0
- package/dist/services/Platform.d.ts.map +1 -0
- package/dist/services/Platform.js +13 -0
- package/dist/services/Platform.js.map +1 -0
- package/dist/services/PluginDb.d.ts +44 -0
- package/dist/services/PluginDb.d.ts.map +1 -0
- package/dist/services/PluginDb.js +5 -0
- package/dist/services/PluginDb.js.map +1 -0
- package/dist/services/Sandbox.d.ts +68 -0
- package/dist/services/Sandbox.d.ts.map +1 -0
- package/dist/services/Sandbox.js +4 -0
- package/dist/services/Sandbox.js.map +1 -0
- package/dist/services/Steering.d.ts +46 -0
- package/dist/services/Steering.d.ts.map +1 -0
- package/dist/services/Steering.js +4 -0
- package/dist/services/Steering.js.map +1 -0
- package/dist/services/Storage.d.ts +63 -0
- package/dist/services/Storage.d.ts.map +1 -0
- package/dist/services/Storage.js +13 -0
- package/dist/services/Storage.js.map +1 -0
- package/dist/services/Transport.d.ts +19 -0
- package/dist/services/Transport.d.ts.map +1 -0
- package/dist/services/Transport.js +4 -0
- package/dist/services/Transport.js.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/types/config.d.ts +526 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message.d.ts +54 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +47 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/user.d.ts +16 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +14 -0
- package/dist/types/user.js.map +1 -0
- package/package.json +39 -0
- package/src/Alert.ts +51 -0
- package/src/Entity.ts +543 -0
- package/src/Kit.ts +705 -0
- package/src/OpenApi.ts +343 -0
- package/src/Plugin.ts +209 -0
- package/src/Server.ts +618 -0
- package/src/Tool.ts +110 -0
- package/src/bundle.ts +114 -0
- package/src/index.ts +209 -0
- package/src/services/Blackboard.ts +19 -0
- package/src/services/Observability.ts +320 -0
- package/src/services/Platform.ts +125 -0
- package/src/services/PluginDb.ts +48 -0
- package/src/services/Sandbox.ts +74 -0
- package/src/services/Steering.ts +45 -0
- package/src/services/Storage.ts +76 -0
- package/src/services/Transport.ts +21 -0
- package/src/services/index.ts +8 -0
- package/src/types/config.ts +531 -0
- package/src/types/index.ts +3 -0
- package/src/types/message.ts +60 -0
- package/src/types/user.ts +17 -0
package/dist/Server.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { AgentKitConfig } from './types/config.js';
|
|
2
|
+
import type { InboundMessage } from './types/index.js';
|
|
3
|
+
import type { AlertMedia, AlertDefinition } from './Alert.js';
|
|
4
|
+
import { type ResolvedPlugins } from './Kit.js';
|
|
5
|
+
import type { PluginDbService } from './services/PluginDb.js';
|
|
6
|
+
/**
|
|
7
|
+
* HTTP server that receives turn requests from the Orchid platform.
|
|
8
|
+
*
|
|
9
|
+
* Routes:
|
|
10
|
+
* - POST /turn — Platform sends inbound messages for processing
|
|
11
|
+
* - POST /delivery — Platform proxies delivery status webhooks
|
|
12
|
+
* - POST /events/:type — Platform proxies event webhooks
|
|
13
|
+
* - GET /health — Health check
|
|
14
|
+
* - ...plugin routes — Contributed by plugins
|
|
15
|
+
*/
|
|
16
|
+
export type TurnRequest = {
|
|
17
|
+
readonly message: InboundMessage;
|
|
18
|
+
readonly context: {
|
|
19
|
+
readonly memories: ReadonlyArray<{
|
|
20
|
+
content: string;
|
|
21
|
+
category: string;
|
|
22
|
+
}>;
|
|
23
|
+
readonly history: ReadonlyArray<{
|
|
24
|
+
content: string;
|
|
25
|
+
direction: 'inbound' | 'outbound';
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export type TurnResponse = {
|
|
30
|
+
readonly reply: string;
|
|
31
|
+
readonly media?: {
|
|
32
|
+
url: string;
|
|
33
|
+
mimeType: string;
|
|
34
|
+
};
|
|
35
|
+
readonly toolCalls?: ReadonlyArray<{
|
|
36
|
+
name: string;
|
|
37
|
+
input: unknown;
|
|
38
|
+
output: unknown;
|
|
39
|
+
}>;
|
|
40
|
+
readonly shouldLearn?: boolean;
|
|
41
|
+
};
|
|
42
|
+
/** One outbound message produced by an alert run, as returned to the platform. */
|
|
43
|
+
export type AlertDelivery = {
|
|
44
|
+
readonly phone: string;
|
|
45
|
+
readonly text: string;
|
|
46
|
+
readonly media?: AlertMedia;
|
|
47
|
+
/** Recipient-scoped claim key: the platform skips a delivery whose key was already claimed. */
|
|
48
|
+
readonly dedupKey?: string;
|
|
49
|
+
};
|
|
50
|
+
export declare function createServer(config: AgentKitConfig, resolved: ResolvedPlugins): {
|
|
51
|
+
fetch: (req: Request) => Promise<Response>;
|
|
52
|
+
};
|
|
53
|
+
export type AlertExecuteBody = {
|
|
54
|
+
alertName: string;
|
|
55
|
+
subscribers: Array<{
|
|
56
|
+
phone: string;
|
|
57
|
+
preferences?: Record<string, unknown>;
|
|
58
|
+
}>;
|
|
59
|
+
secrets?: Record<string, string>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Run one alert against its subscribers and flatten the results into ordered
|
|
63
|
+
* {@link AlertDelivery} entries. Shared by the built-in `/alerts/execute`
|
|
64
|
+
* route and the alerts plugin, so the two paths cannot diverge.
|
|
65
|
+
*/
|
|
66
|
+
export declare function executeAlert(alert: AlertDefinition, body: AlertExecuteBody, pluginDb?: PluginDbService): Promise<{
|
|
67
|
+
sent: number;
|
|
68
|
+
skipped: number;
|
|
69
|
+
deliveries: AlertDelivery[];
|
|
70
|
+
}>;
|
|
71
|
+
//# sourceMappingURL=Server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Server.d.ts","sourceRoot":"","sources":["../src/Server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAA;AAEtE,OAAO,KAAK,EAAmC,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE9F,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QACvE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAA;SAAE,CAAC,CAAA;KACxF,CAAA;CACF,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACrF,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AAED,kFAAkF;AAClF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAA;IAC3B,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe;IAI1E,KAAK,QAAc,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;EA2DjD;AAuED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC,CAAA;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,gBAAgB,EACtB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAmDzE"}
|
package/dist/Server.js
ADDED
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { Effect, Schema, JSONSchema } from 'effect';
|
|
2
|
+
import { mergedAlerts } from './Kit.js';
|
|
3
|
+
import { StorageError } from './services/Storage.js';
|
|
4
|
+
export function createServer(config, resolved) {
|
|
5
|
+
const routeCtx = { config, request: null };
|
|
6
|
+
return {
|
|
7
|
+
fetch: async (req) => {
|
|
8
|
+
// Run plugin onRequest interceptors
|
|
9
|
+
for (const onReq of resolved.onRequest) {
|
|
10
|
+
const result = await Effect.runPromise(onReq(req).pipe(Effect.orDie));
|
|
11
|
+
if (result instanceof Response)
|
|
12
|
+
return result;
|
|
13
|
+
if (result instanceof Request)
|
|
14
|
+
req = result;
|
|
15
|
+
}
|
|
16
|
+
// Run plugin middleware
|
|
17
|
+
for (const mw of resolved.middleware) {
|
|
18
|
+
const url = new URL(req.url);
|
|
19
|
+
if (url.pathname.startsWith(mw.path)) {
|
|
20
|
+
const mwResult = await Effect.runPromise(mw.handler(req, { ...routeCtx, request: req }).pipe(Effect.orDie));
|
|
21
|
+
if (mwResult instanceof Response)
|
|
22
|
+
return mwResult;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const url = new URL(req.url);
|
|
26
|
+
// Check plugin routes first
|
|
27
|
+
const pluginRoute = resolved.routes[url.pathname];
|
|
28
|
+
if (pluginRoute) {
|
|
29
|
+
const response = await pluginRoute(req, { ...routeCtx, request: req });
|
|
30
|
+
return applyOnResponse(response, resolved);
|
|
31
|
+
}
|
|
32
|
+
let response;
|
|
33
|
+
switch (url.pathname) {
|
|
34
|
+
case '/health':
|
|
35
|
+
response = new Response(JSON.stringify({ status: 'ok', version: '0.1.0' }), {
|
|
36
|
+
headers: { 'Content-Type': 'application/json' },
|
|
37
|
+
});
|
|
38
|
+
break;
|
|
39
|
+
case '/turn':
|
|
40
|
+
response = await handleTurn(req, config, resolved);
|
|
41
|
+
break;
|
|
42
|
+
case '/alerts/execute':
|
|
43
|
+
response = await handleAlertExecute(req, config, resolved);
|
|
44
|
+
break;
|
|
45
|
+
case '/delivery':
|
|
46
|
+
response = await handleDelivery(req, config);
|
|
47
|
+
break;
|
|
48
|
+
default:
|
|
49
|
+
if (url.pathname.startsWith('/events/')) {
|
|
50
|
+
response = await handleEvent(req, config, url.pathname.slice(8));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
response = new Response('Not found', { status: 404 });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return applyOnResponse(response, resolved);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function applyOnResponse(res, resolved) {
|
|
61
|
+
for (const onRes of resolved.onResponse) {
|
|
62
|
+
res = await Effect.runPromise(onRes(res).pipe(Effect.orDie));
|
|
63
|
+
}
|
|
64
|
+
return res;
|
|
65
|
+
}
|
|
66
|
+
async function handleTurn(req, config, resolved) {
|
|
67
|
+
const authHeader = req.headers.get('Authorization');
|
|
68
|
+
const isPlatformForward = req.headers.get('X-Orchid-Platform') === 'true';
|
|
69
|
+
if (!isPlatformForward && (!authHeader?.startsWith('Bearer ') || authHeader.slice(7) !== config.apiKey)) {
|
|
70
|
+
return new Response('Unauthorized', { status: 401 });
|
|
71
|
+
}
|
|
72
|
+
const body = (await req.json());
|
|
73
|
+
// Run beforeTurn hooks
|
|
74
|
+
let turnEvent = {
|
|
75
|
+
phone: body.message.phone,
|
|
76
|
+
messages: [
|
|
77
|
+
...body.context.history.map((h) => ({ content: h.content, direction: h.direction })),
|
|
78
|
+
{ content: body.message.text, direction: 'inbound' },
|
|
79
|
+
],
|
|
80
|
+
context: {},
|
|
81
|
+
};
|
|
82
|
+
for (const hook of resolved.hooks.beforeTurn) {
|
|
83
|
+
turnEvent = await Effect.runPromise(hook(turnEvent).pipe(Effect.orDie));
|
|
84
|
+
}
|
|
85
|
+
const startTime = Date.now();
|
|
86
|
+
const result = await Effect.runPromise(runAgentTurn(config, body, resolved));
|
|
87
|
+
// Run afterTurn hooks
|
|
88
|
+
const turnResult = {
|
|
89
|
+
phone: body.message.phone,
|
|
90
|
+
response: result.reply,
|
|
91
|
+
toolCalls: result.toolCalls ?? [],
|
|
92
|
+
tokensUsed: { in: result.tokensIn ?? 0, out: result.tokensOut ?? 0 },
|
|
93
|
+
durationMs: Date.now() - startTime,
|
|
94
|
+
};
|
|
95
|
+
for (const hook of resolved.hooks.afterTurn) {
|
|
96
|
+
await Effect.runPromise(hook(turnResult).pipe(Effect.orDie));
|
|
97
|
+
}
|
|
98
|
+
return new Response(JSON.stringify(result), {
|
|
99
|
+
headers: { 'Content-Type': 'application/json' },
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async function handleAlertExecute(req, config, resolved) {
|
|
103
|
+
const isPlatformForward = req.headers.get('X-Orchid-Platform') === 'true';
|
|
104
|
+
if (!isPlatformForward)
|
|
105
|
+
return new Response('Unauthorized', { status: 401 });
|
|
106
|
+
const body = await req.json();
|
|
107
|
+
const alert = mergedAlerts(config, resolved).find((a) => a.name === body.alertName);
|
|
108
|
+
if (!alert)
|
|
109
|
+
return new Response(`Alert not found: ${body.alertName}`, { status: 404 });
|
|
110
|
+
const pluginDb = config.storage && 'pluginDb' in config.storage ? config.storage.pluginDb : undefined;
|
|
111
|
+
const result = await executeAlert(alert, body, pluginDb);
|
|
112
|
+
return new Response(JSON.stringify(result), {
|
|
113
|
+
headers: { 'Content-Type': 'application/json' },
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Run one alert against its subscribers and flatten the results into ordered
|
|
118
|
+
* {@link AlertDelivery} entries. Shared by the built-in `/alerts/execute`
|
|
119
|
+
* route and the alerts plugin, so the two paths cannot diverge.
|
|
120
|
+
*/
|
|
121
|
+
export async function executeAlert(alert, body, pluginDb) {
|
|
122
|
+
let sent = 0;
|
|
123
|
+
let skipped = 0;
|
|
124
|
+
const deliveries = [];
|
|
125
|
+
for (const subscriber of body.subscribers ?? []) {
|
|
126
|
+
const ctx = {
|
|
127
|
+
subscriber: {
|
|
128
|
+
phone: subscriber.phone,
|
|
129
|
+
chatId: `sdk-alert:${subscriber.phone}`,
|
|
130
|
+
preferences: subscriber.preferences ?? {},
|
|
131
|
+
},
|
|
132
|
+
now: new Date(),
|
|
133
|
+
secrets: body.secrets ?? {},
|
|
134
|
+
state: makeAlertState(pluginDb, body.alertName, subscriber.phone),
|
|
135
|
+
};
|
|
136
|
+
const ok = alert.shouldSend ? await Effect.runPromise(alert.shouldSend(ctx)) : true;
|
|
137
|
+
if (!ok) {
|
|
138
|
+
skipped++;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const content = await Effect.runPromise(alert.generate(ctx));
|
|
142
|
+
if (!content || (!content.text && !content.media && !(content.messages?.length))) {
|
|
143
|
+
skipped++;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
sent++;
|
|
147
|
+
const subscriberDeliveries = [];
|
|
148
|
+
if (content.text || content.media) {
|
|
149
|
+
subscriberDeliveries.push({ phone: subscriber.phone, text: content.text, media: content.media });
|
|
150
|
+
}
|
|
151
|
+
for (const extra of content.messages ?? []) {
|
|
152
|
+
if (!extra.text && !(extra.media?.length))
|
|
153
|
+
continue;
|
|
154
|
+
subscriberDeliveries.push({ phone: subscriber.phone, text: extra.text, media: extra.media?.[0] });
|
|
155
|
+
for (const m of extra.media?.slice(1) ?? []) {
|
|
156
|
+
subscriberDeliveries.push({ phone: subscriber.phone, text: '', media: m });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// The claim key rides on the first delivery that will actually be sent,
|
|
160
|
+
// so a content shape with an empty primary message still gets claimed.
|
|
161
|
+
const dedupKey = alert.dedupKey?.(ctx);
|
|
162
|
+
if (dedupKey && subscriberDeliveries[0]) {
|
|
163
|
+
subscriberDeliveries[0] = { ...subscriberDeliveries[0], dedupKey };
|
|
164
|
+
}
|
|
165
|
+
deliveries.push(...subscriberDeliveries);
|
|
166
|
+
}
|
|
167
|
+
return { sent, skipped, deliveries };
|
|
168
|
+
}
|
|
169
|
+
async function handleDelivery(req, config) {
|
|
170
|
+
const body = (await req.json());
|
|
171
|
+
if (config.events?.onDeliveryStatus) {
|
|
172
|
+
await Effect.runPromise(config.events.onDeliveryStatus(body));
|
|
173
|
+
}
|
|
174
|
+
return new Response('ok');
|
|
175
|
+
}
|
|
176
|
+
async function handleEvent(req, config, eventType) {
|
|
177
|
+
const body = await req.json();
|
|
178
|
+
switch (eventType) {
|
|
179
|
+
case 'new-user':
|
|
180
|
+
if (config.events?.onNewUser) {
|
|
181
|
+
await Effect.runPromise(config.events.onNewUser(body));
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
case 'opt-out':
|
|
185
|
+
if (config.events?.onOptOut) {
|
|
186
|
+
await Effect.runPromise(config.events.onOptOut(body));
|
|
187
|
+
}
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
return new Response('ok');
|
|
191
|
+
}
|
|
192
|
+
const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY ?? '';
|
|
193
|
+
const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
|
|
194
|
+
/** Most reply-review rejections ({@link TurnHooks.reviewReply}) honored per turn. */
|
|
195
|
+
const MAX_REPLY_REVIEW_RETRIES = 2;
|
|
196
|
+
function runAgentTurn(config, turn, resolved) {
|
|
197
|
+
return Effect.tryPromise({
|
|
198
|
+
try: async () => {
|
|
199
|
+
const promptCtx = {
|
|
200
|
+
user: { phone: turn.message.phone, timezone: null, currency: null, metadata: {}, firstSeenAt: new Date() },
|
|
201
|
+
now: new Date(),
|
|
202
|
+
phone: turn.message.phone,
|
|
203
|
+
context: {
|
|
204
|
+
memorySummary: turn.context.memories.map((m) => `[${m.category}] ${m.content}`).join('\n') || null,
|
|
205
|
+
relevantFacts: turn.context.memories.map((m) => ({ fact: m.content, category: m.category })),
|
|
206
|
+
},
|
|
207
|
+
isFirstInteraction: turn.context.history.length === 0,
|
|
208
|
+
history: turn.context.history,
|
|
209
|
+
};
|
|
210
|
+
const hooks = config.agent.hooks;
|
|
211
|
+
const finishReply = (reply) => hooks?.transformReply ? hooks.transformReply(reply, promptCtx) : reply;
|
|
212
|
+
const systemPrompt = config.agent.systemPrompt(promptCtx);
|
|
213
|
+
// Merge agent tools + plugin tools
|
|
214
|
+
const allTools = [...config.agent.tools, ...resolved.tools];
|
|
215
|
+
// Convert SDK tools to OpenAI format
|
|
216
|
+
const openaiTools = allTools.map((t) => ({
|
|
217
|
+
type: 'function',
|
|
218
|
+
function: {
|
|
219
|
+
name: t.name,
|
|
220
|
+
description: t.description,
|
|
221
|
+
parameters: JSONSchema.make(t.input),
|
|
222
|
+
},
|
|
223
|
+
}));
|
|
224
|
+
// Build LLM messages
|
|
225
|
+
const llmMessages = [
|
|
226
|
+
{ role: 'system', content: systemPrompt },
|
|
227
|
+
...turn.context.history.map((h) => ({
|
|
228
|
+
role: h.direction === 'inbound' ? 'user' : 'assistant',
|
|
229
|
+
content: h.content,
|
|
230
|
+
})),
|
|
231
|
+
{ role: 'user', content: turn.message.text },
|
|
232
|
+
];
|
|
233
|
+
const model = config.agent.model.startsWith('openrouter/')
|
|
234
|
+
? config.agent.model.slice('openrouter/'.length)
|
|
235
|
+
: config.agent.model;
|
|
236
|
+
// Agentic loop
|
|
237
|
+
let totalTokensIn = 0;
|
|
238
|
+
let totalTokensOut = 0;
|
|
239
|
+
let lastToolName;
|
|
240
|
+
let lastToolError;
|
|
241
|
+
let lastToolInput;
|
|
242
|
+
let identicalFailureStreak = 0;
|
|
243
|
+
let stoppedByHook = false;
|
|
244
|
+
let reviewAttempts = 0;
|
|
245
|
+
const rejectedReplies = new Set();
|
|
246
|
+
const toolCallResults = [];
|
|
247
|
+
for (let step = 0; step < config.agent.maxSteps; step++) {
|
|
248
|
+
const hookState = { step, toolCalls: toolCallResults.length, lastToolName, lastToolError, lastToolInput, identicalFailureStreak };
|
|
249
|
+
const prepared = hooks?.prepareStep?.(hookState, promptCtx);
|
|
250
|
+
const stepMessages = prepared?.appendSystem
|
|
251
|
+
? [...llmMessages, { role: 'system', content: prepared.appendSystem }]
|
|
252
|
+
: llmMessages;
|
|
253
|
+
const body = {
|
|
254
|
+
model,
|
|
255
|
+
messages: stepMessages,
|
|
256
|
+
reasoning: { effort: 'low', exclude: true },
|
|
257
|
+
};
|
|
258
|
+
if (openaiTools.length > 0)
|
|
259
|
+
body.tools = openaiTools;
|
|
260
|
+
const res = await fetch(`${OPENROUTER_BASE_URL}/chat/completions`, {
|
|
261
|
+
method: 'POST',
|
|
262
|
+
headers: {
|
|
263
|
+
'Authorization': `Bearer ${OPENROUTER_API_KEY}`,
|
|
264
|
+
'Content-Type': 'application/json',
|
|
265
|
+
'HTTP-Referer': 'https://onkeiki.com',
|
|
266
|
+
'X-Title': 'Keiki SDK',
|
|
267
|
+
},
|
|
268
|
+
body: JSON.stringify(body),
|
|
269
|
+
});
|
|
270
|
+
if (!res.ok)
|
|
271
|
+
throw new Error(`OpenRouter ${res.status}: ${await res.text()}`);
|
|
272
|
+
const data = await res.json();
|
|
273
|
+
totalTokensIn += data.usage?.prompt_tokens ?? 0;
|
|
274
|
+
totalTokensOut += data.usage?.completion_tokens ?? 0;
|
|
275
|
+
const msg = data.choices?.[0]?.message;
|
|
276
|
+
if (!msg)
|
|
277
|
+
throw new Error('No response from LLM');
|
|
278
|
+
// No tool calls — final response. Review gates the delivered
|
|
279
|
+
// (post-transformReply) text and fails closed: a rejected candidate is
|
|
280
|
+
// never delivered, even when retries run out.
|
|
281
|
+
if (!msg.tool_calls || msg.tool_calls.length === 0) {
|
|
282
|
+
const candidate = finishReply(msg.content ?? '');
|
|
283
|
+
const review = hooks?.reviewReply?.(candidate, promptCtx, { toolResults: toolCallResults, attempt: reviewAttempts });
|
|
284
|
+
if (review?.retryWith) {
|
|
285
|
+
rejectedReplies.add(msg.content ?? '');
|
|
286
|
+
if (reviewAttempts < MAX_REPLY_REVIEW_RETRIES) {
|
|
287
|
+
reviewAttempts++;
|
|
288
|
+
llmMessages.push({ role: 'assistant', content: msg.content ?? '' });
|
|
289
|
+
llmMessages.push({ role: 'system', content: review.retryWith });
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
reply: '',
|
|
294
|
+
toolCalls: toolCallResults.length > 0 ? toolCallResults : undefined,
|
|
295
|
+
shouldLearn: config.agent.memory?.enabled ?? false,
|
|
296
|
+
tokensIn: totalTokensIn,
|
|
297
|
+
tokensOut: totalTokensOut,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
reply: candidate,
|
|
302
|
+
toolCalls: toolCallResults.length > 0 ? toolCallResults : undefined,
|
|
303
|
+
shouldLearn: config.agent.memory?.enabled ?? false,
|
|
304
|
+
tokensIn: totalTokensIn,
|
|
305
|
+
tokensOut: totalTokensOut,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// Add assistant message with tool_calls
|
|
309
|
+
llmMessages.push({
|
|
310
|
+
role: 'assistant',
|
|
311
|
+
content: msg.content || null,
|
|
312
|
+
tool_calls: msg.tool_calls,
|
|
313
|
+
});
|
|
314
|
+
// Execute each tool call via Effect
|
|
315
|
+
for (const toolCall of msg.tool_calls) {
|
|
316
|
+
const toolDef = allTools.find((t) => t.name === toolCall.function.name);
|
|
317
|
+
if (!toolDef) {
|
|
318
|
+
llmMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: `Error: Unknown tool ${toolCall.function.name}` });
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
// Run beforeToolCall hooks
|
|
322
|
+
let toolCallEvent = { phone: turn.message.phone, toolName: toolCall.function.name, input: null };
|
|
323
|
+
for (const hook of resolved.hooks.beforeToolCall) {
|
|
324
|
+
toolCallEvent = await Effect.runPromise(hook(toolCallEvent).pipe(Effect.orDie));
|
|
325
|
+
}
|
|
326
|
+
const toolStart = Date.now();
|
|
327
|
+
try {
|
|
328
|
+
const args = JSON.parse(toolCall.function.arguments);
|
|
329
|
+
toolCallEvent.input = args;
|
|
330
|
+
const decoded = Schema.decodeUnknownSync(toolDef.input)(args);
|
|
331
|
+
const result = await Effect.runPromise(toolDef.execute(decoded, {
|
|
332
|
+
phone: turn.message.phone,
|
|
333
|
+
user: promptCtx.user,
|
|
334
|
+
blackboard: {},
|
|
335
|
+
platform: {},
|
|
336
|
+
userState: makeNoopUserState(),
|
|
337
|
+
secrets: makeNoopSecrets(),
|
|
338
|
+
db: (config.storage && 'pluginDb' in config.storage ? config.storage.pluginDb : undefined) ?? makeNoopPluginDb(),
|
|
339
|
+
sandbox: makeNoopSandbox(),
|
|
340
|
+
}));
|
|
341
|
+
const resultStr = typeof result === 'string' ? result : JSON.stringify(result);
|
|
342
|
+
toolCallResults.push({ name: toolCall.function.name, input: args, output: result });
|
|
343
|
+
lastToolName = toolCall.function.name;
|
|
344
|
+
lastToolError = undefined;
|
|
345
|
+
lastToolInput = toolCall.function.arguments;
|
|
346
|
+
identicalFailureStreak = 0;
|
|
347
|
+
llmMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: resultStr });
|
|
348
|
+
// Run afterToolCall hooks
|
|
349
|
+
for (const hook of resolved.hooks.afterToolCall) {
|
|
350
|
+
await Effect.runPromise(hook({
|
|
351
|
+
phone: turn.message.phone,
|
|
352
|
+
toolName: toolCall.function.name,
|
|
353
|
+
input: args,
|
|
354
|
+
output: result,
|
|
355
|
+
durationMs: Date.now() - toolStart,
|
|
356
|
+
}).pipe(Effect.orDie));
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch (err) {
|
|
360
|
+
const errStr = `Error: ${err instanceof Error ? err.message : String(err)}`;
|
|
361
|
+
llmMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: errStr });
|
|
362
|
+
const sameFailure = lastToolName === toolCall.function.name &&
|
|
363
|
+
lastToolInput === toolCall.function.arguments &&
|
|
364
|
+
lastToolError === errStr;
|
|
365
|
+
identicalFailureStreak = sameFailure ? identicalFailureStreak + 1 : 1;
|
|
366
|
+
lastToolName = toolCall.function.name;
|
|
367
|
+
lastToolError = errStr;
|
|
368
|
+
lastToolInput = toolCall.function.arguments;
|
|
369
|
+
// Run afterToolCall hooks with error
|
|
370
|
+
for (const hook of resolved.hooks.afterToolCall) {
|
|
371
|
+
await Effect.runPromise(hook({
|
|
372
|
+
phone: turn.message.phone,
|
|
373
|
+
toolName: toolCall.function.name,
|
|
374
|
+
input: toolCallEvent.input,
|
|
375
|
+
output: null,
|
|
376
|
+
durationMs: Date.now() - toolStart,
|
|
377
|
+
error: errStr,
|
|
378
|
+
}).pipe(Effect.orDie));
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// Developer stop condition: end the turn with the last assistant text.
|
|
383
|
+
if (hooks?.stopWhen?.({ step, toolCalls: toolCallResults.length, lastToolName, lastToolError, lastToolInput, identicalFailureStreak }, promptCtx)) {
|
|
384
|
+
stoppedByHook = true;
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
// Loop ended without a tool-free reply: use the last assistant text the
|
|
389
|
+
// model produced. Only real step exhaustion gets the apology — a
|
|
390
|
+
// developer stop condition is intentional and must not read as a failure.
|
|
391
|
+
const lastAssistantText = llmMessages
|
|
392
|
+
.filter((m) => m.role === 'assistant' && typeof m.content === 'string' && m.content && !rejectedReplies.has(m.content))
|
|
393
|
+
.pop()?.content;
|
|
394
|
+
return {
|
|
395
|
+
reply: finishReply(lastAssistantText ?? (stoppedByHook ? '' : 'I apologize, I ran out of steps processing your request.')),
|
|
396
|
+
toolCalls: toolCallResults.length > 0 ? toolCallResults : undefined,
|
|
397
|
+
shouldLearn: config.agent.memory?.enabled ?? false,
|
|
398
|
+
tokensIn: totalTokensIn,
|
|
399
|
+
tokensOut: totalTokensOut,
|
|
400
|
+
};
|
|
401
|
+
},
|
|
402
|
+
catch: (e) => e,
|
|
403
|
+
}).pipe(Effect.orDie);
|
|
404
|
+
}
|
|
405
|
+
/** Whether the durable alert-state table has been ensured this process. */
|
|
406
|
+
let alertStateTableEnsured = false;
|
|
407
|
+
/**
|
|
408
|
+
* Durable per-(alert, subscriber) KV state, persisted through the configured
|
|
409
|
+
* PluginDb. Falls back to per-run in-memory state when no PluginDb is
|
|
410
|
+
* configured, so alerts still run (just without cross-run durability).
|
|
411
|
+
*/
|
|
412
|
+
function makeAlertState(pluginDb, alertName, phone) {
|
|
413
|
+
if (!pluginDb) {
|
|
414
|
+
const mem = new Map();
|
|
415
|
+
return {
|
|
416
|
+
get: (key) => Effect.succeed(mem.get(key) ?? null),
|
|
417
|
+
set: (key, value) => Effect.sync(() => { mem.set(key, value); }),
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
const ensureTable = Effect.suspend(() => {
|
|
421
|
+
if (alertStateTableEnsured)
|
|
422
|
+
return Effect.void;
|
|
423
|
+
return pluginDb.execute(`CREATE TABLE IF NOT EXISTS smskit_alert_state (
|
|
424
|
+
alert_name TEXT NOT NULL,
|
|
425
|
+
phone TEXT NOT NULL,
|
|
426
|
+
key TEXT NOT NULL,
|
|
427
|
+
value JSONB,
|
|
428
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
429
|
+
PRIMARY KEY (alert_name, phone, key)
|
|
430
|
+
)`).pipe(Effect.tap(() => Effect.sync(() => { alertStateTableEnsured = true; })),
|
|
431
|
+
// Concurrent CREATE TABLE IF NOT EXISTS can race itself in Postgres
|
|
432
|
+
// (duplicate-relation error); the table exists either way, so swallow
|
|
433
|
+
// the DDL failure and let the actual read/write surface real errors.
|
|
434
|
+
Effect.catchAll(() => Effect.void));
|
|
435
|
+
});
|
|
436
|
+
return {
|
|
437
|
+
get: (key) => ensureTable.pipe(Effect.andThen(pluginDb.queryOne(`SELECT value FROM smskit_alert_state WHERE alert_name = $1 AND phone = $2 AND key = $3`, [alertName, phone, key])), Effect.map((row) => row?.value ?? null), Effect.orDie),
|
|
438
|
+
set: (key, value) => ensureTable.pipe(Effect.andThen(pluginDb.execute(`INSERT INTO smskit_alert_state (alert_name, phone, key, value, updated_at)
|
|
439
|
+
VALUES ($1, $2, $3, $4, now())
|
|
440
|
+
ON CONFLICT (alert_name, phone, key) DO UPDATE SET value = EXCLUDED.value, updated_at = now()`, [alertName, phone, key, JSON.stringify(value ?? null)])), Effect.orDie),
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
function makeNoopUserState() {
|
|
444
|
+
const store = new Map();
|
|
445
|
+
return {
|
|
446
|
+
get: (key) => Effect.succeed(store.get(key) ?? null),
|
|
447
|
+
set: (key, value) => Effect.sync(() => { store.set(key, value); }),
|
|
448
|
+
delete: (key) => Effect.succeed(store.delete(key)),
|
|
449
|
+
getAll: () => Effect.succeed(Object.fromEntries(store)),
|
|
450
|
+
setMany: (entries) => Effect.sync(() => { for (const [k, v] of Object.entries(entries))
|
|
451
|
+
store.set(k, v); }),
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
function makeNoopSecrets() {
|
|
455
|
+
return {
|
|
456
|
+
get: () => Effect.succeed(null),
|
|
457
|
+
getAll: () => Effect.succeed({}),
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
function makeNoopPluginDb() {
|
|
461
|
+
const err = new StorageError('PluginDb not configured. Use PostgresStorage() instead of PostgresStorageLive().');
|
|
462
|
+
return {
|
|
463
|
+
query: () => Effect.fail(err),
|
|
464
|
+
queryOne: () => Effect.fail(err),
|
|
465
|
+
execute: () => Effect.fail(err),
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
function makeNoopSandbox() {
|
|
469
|
+
const err = () => { throw new Error('SandboxProvider not configured. Enable the Sandbox capability via the sandbox() plugin.'); };
|
|
470
|
+
return {
|
|
471
|
+
exec: err,
|
|
472
|
+
getPublicUrl: err,
|
|
473
|
+
getHomeDir: err,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=Server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Server.js","sourceRoot":"","sources":["../src/Server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAMnD,OAAO,EAAE,YAAY,EAAwB,MAAM,UAAU,CAAA;AAI7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAqCpD,MAAM,UAAU,YAAY,CAAC,MAAsB,EAAE,QAAyB;IAC5E,MAAM,QAAQ,GAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAW,EAAE,CAAA;IAE/D,OAAO;QACL,KAAK,EAAE,KAAK,EAAE,GAAY,EAAqB,EAAE;YAC/C,oCAAoC;YACpC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBACrE,IAAI,MAAM,YAAY,QAAQ;oBAAE,OAAO,MAAM,CAAA;gBAC7C,IAAI,MAAM,YAAY,OAAO;oBAAE,GAAG,GAAG,MAAM,CAAA;YAC7C,CAAC;YAED,wBAAwB;YACxB,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CACtC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAClE,CAAA;oBACD,IAAI,QAAQ,YAAY,QAAQ;wBAAE,OAAO,QAAQ,CAAA;gBACnD,CAAC;YACH,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAE5B,4BAA4B;YAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACjD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;gBACtE,OAAO,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC5C,CAAC;YAED,IAAI,QAAkB,CAAA;YACtB,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACrB,KAAK,SAAS;oBACZ,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE;wBAC1E,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;qBAChD,CAAC,CAAA;oBACF,MAAK;gBAEP,KAAK,OAAO;oBACV,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;oBAClD,MAAK;gBAEP,KAAK,iBAAiB;oBACpB,QAAQ,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;oBAC1D,MAAK;gBAEP,KAAK,WAAW;oBACd,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;oBAC5C,MAAK;gBAEP;oBACE,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBACxC,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;oBAClE,CAAC;yBAAM,CAAC;wBACN,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;oBACvD,CAAC;YACL,CAAC;YAED,OAAO,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAC5C,CAAC;KACF,CAAA;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAa,EAAE,QAAyB;IACrE,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxC,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAY,EAAE,MAAsB,EAAE,QAAyB;IACvF,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACnD,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,MAAM,CAAA;IACzE,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxG,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAA;IAE9C,uBAAuB;IACvB,IAAI,SAAS,GAAc;QACzB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;QACzB,QAAQ,EAAE;YACR,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACpF,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,SAAkB,EAAE;SAC9D;QACD,OAAO,EAAE,EAAE;KACZ,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC7C,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACzE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE5E,sBAAsB;IACtB,MAAM,UAAU,GAAe;QAC7B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;QACzB,QAAQ,EAAE,MAAM,CAAC,KAAK;QACtB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,UAAU,EAAE,EAAE,EAAE,EAAG,MAAc,CAAC,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAG,MAAc,CAAC,SAAS,IAAI,CAAC,EAAE;QACtF,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACnC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;QAC1C,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAY,EACZ,MAAsB,EACtB,QAAyB;IAEzB,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,MAAM,CAAA;IACzE,IAAI,CAAC,iBAAiB;QAAE,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAE5E,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAsB,CAAA;IACjD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAA;IACnF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,QAAQ,CAAC,oBAAoB,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAEtF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;IACrG,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAExD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;QAC1C,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAA;AACJ,CAAC;AAQD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAsB,EACtB,IAAsB,EACtB,QAA0B;IAE1B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,UAAU,GAAoB,EAAE,CAAA;IAEtC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAiB;YACxB,UAAU,EAAE;gBACV,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,MAAM,EAAE,aAAa,UAAU,CAAC,KAAK,EAAE;gBACvC,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE;aAC1C;YACD,GAAG,EAAE,IAAI,IAAI,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,KAAK,EAAE,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC;SAClE,CAAA;QAED,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACnF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,CAAA;YACT,SAAQ;QACV,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5D,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACjF,OAAO,EAAE,CAAA;YACT,SAAQ;QACV,CAAC;QAED,IAAI,EAAE,CAAA;QACN,MAAM,oBAAoB,GAAoB,EAAE,CAAA;QAChD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClC,oBAAoB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QAClG,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;gBAAE,SAAQ;YACnD,oBAAoB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACjG,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5C,oBAAoB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC;QACD,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,QAAQ,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,oBAAoB,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,oBAAoB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;QACpE,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAA;IAC1C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AACtC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAY,EAAE,MAAsB;IAChE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAA;IACjD,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAY,EAAE,MAAsB,EAAE,SAAiB;IAChF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAE7B,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,UAAU;YACb,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;YACxD,CAAC;YACD,MAAK;QACP,KAAK,SAAS;YACZ,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;gBAC5B,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;YACvD,CAAC;YACD,MAAK;IACT,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAA;AAC/D,MAAM,mBAAmB,GAAG,8BAA8B,CAAA;AAE1D,qFAAqF;AACrF,MAAM,wBAAwB,GAAG,CAAC,CAAA;AASlC,SAAS,YAAY,CAAC,MAAsB,EAAE,IAAiB,EAAE,QAAyB;IACxF,OAAO,MAAM,CAAC,UAAU,CAAC;QACvB,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,SAAS,GAAG;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE;gBAC1G,GAAG,EAAE,IAAI,IAAI,EAAE;gBACf,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,OAAO,EAAE;oBACP,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI;oBAClG,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;iBAC7F;gBACD,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBACrD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;aAC9B,CAAA;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA;YAChC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CACpC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;YAExE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;YAEzD,mCAAmC;YACnC,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;YAE3D,qCAAqC;YACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,UAAmB;gBACzB,QAAQ,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;iBACrC;aACF,CAAC,CAAC,CAAA;YAEH,qBAAqB;YACrB,MAAM,WAAW,GAAiB;gBAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACzC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAClC,IAAI,EAAE,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;oBACtD,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;gBACH,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;aAC7C,CAAA;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;gBACxD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;gBAChD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA;YAEtB,eAAe;YACf,IAAI,aAAa,GAAG,CAAC,CAAA;YACrB,IAAI,cAAc,GAAG,CAAC,CAAA;YACtB,IAAI,YAAgC,CAAA;YACpC,IAAI,aAAiC,CAAA;YACrC,IAAI,aAAiC,CAAA;YACrC,IAAI,sBAAsB,GAAG,CAAC,CAAA;YAC9B,IAAI,aAAa,GAAG,KAAK,CAAA;YACzB,IAAI,cAAc,GAAG,CAAC,CAAA;YACtB,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAA;YACzC,MAAM,eAAe,GAA6D,EAAE,CAAA;YAEpF,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;gBACxD,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAA;gBACjI,MAAM,QAAQ,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBAC3D,MAAM,YAAY,GAAG,QAAQ,EAAE,YAAY;oBACzC,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;oBACtE,CAAC,CAAC,WAAW,CAAA;gBACf,MAAM,IAAI,GAA4B;oBACpC,KAAK;oBACL,QAAQ,EAAE,YAAY;oBACtB,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;iBAC5C,CAAA;gBACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;gBAEpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,mBAAmB,mBAAmB,EAAE;oBACjE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,eAAe,EAAE,UAAU,kBAAkB,EAAE;wBAC/C,cAAc,EAAE,kBAAkB;wBAClC,cAAc,EAAE,qBAAqB;wBACrC,SAAS,EAAE,WAAW;qBACvB;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;iBAC3B,CAAC,CAAA;gBAEF,IAAI,CAAC,GAAG,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;gBAE7E,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAG1B,CAAA;gBAED,aAAa,IAAI,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAA;gBAC/C,cAAc,IAAI,IAAI,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC,CAAA;gBAEpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAA;gBACtC,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;gBAEjD,6DAA6D;gBAC7D,uEAAuE;gBACvE,8CAA8C;gBAC9C,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACnD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;oBAChD,MAAM,MAAM,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;oBACpH,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;wBACtB,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;wBACtC,IAAI,cAAc,GAAG,wBAAwB,EAAE,CAAC;4BAC9C,cAAc,EAAE,CAAA;4BAChB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAA;4BACnE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;4BAC/D,SAAQ;wBACV,CAAC;wBACD,OAAO;4BACL,KAAK,EAAE,EAAE;4BACT,SAAS,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;4BACnE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK;4BAClD,QAAQ,EAAE,aAAa;4BACvB,SAAS,EAAE,cAAc;yBACV,CAAA;oBACnB,CAAC;oBACD,OAAO;wBACL,KAAK,EAAE,SAAS;wBAChB,SAAS,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;wBACnE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK;wBAClD,QAAQ,EAAE,aAAa;wBACvB,SAAS,EAAE,cAAc;qBACV,CAAA;gBACnB,CAAC;gBAED,wCAAwC;gBACxC,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;oBAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;iBAC3B,CAAC,CAAA;gBAEF,oCAAoC;gBACpC,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;oBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oBACvE,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,uBAAuB,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;wBACvH,SAAQ;oBACV,CAAC;oBAED,2BAA2B;oBAC3B,IAAI,aAAa,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,IAAe,EAAE,CAAA;oBAC3G,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;wBACjD,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;oBACjF,CAAC;oBAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;oBAC5B,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;wBACpD,aAAa,CAAC,KAAK,GAAG,IAAI,CAAA;wBAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;wBAC7D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CACnC,OAAO,CAAC,OAAwD,CAAC,OAAO,EAAE;4BACzE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;4BACzB,IAAI,EAAE,SAAS,CAAC,IAAI;4BACpB,UAAU,EAAE,EAAS;4BACrB,QAAQ,EAAE,EAAS;4BACnB,SAAS,EAAE,iBAAiB,EAAE;4BAC9B,OAAO,EAAE,eAAe,EAAE;4BAC1B,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,gBAAgB,EAAE;4BAChH,OAAO,EAAE,eAAe,EAAE;yBAC3B,CAAC,CACH,CAAA;wBACD,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;wBAC9E,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;wBACnF,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAA;wBACrC,aAAa,GAAG,SAAS,CAAA;wBACzB,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAA;wBAC3C,sBAAsB,GAAG,CAAC,CAAA;wBAC1B,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;wBAEjF,0BAA0B;wBAC1B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;4BAChD,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gCAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gCACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;gCAChC,KAAK,EAAE,IAAI;gCACX,MAAM,EAAE,MAAM;gCACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;6BACnC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;wBACxB,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,MAAM,GAAG,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;wBAC3E,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;wBAC9E,MAAM,WAAW,GACf,YAAY,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI;4BACvC,aAAa,KAAK,QAAQ,CAAC,QAAQ,CAAC,SAAS;4BAC7C,aAAa,KAAK,MAAM,CAAA;wBAC1B,sBAAsB,GAAG,WAAW,CAAC,CAAC,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;wBACrE,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAA;wBACrC,aAAa,GAAG,MAAM,CAAA;wBACtB,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAA;wBAE3C,qCAAqC;wBACrC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;4BAChD,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gCAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gCACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;gCAChC,KAAK,EAAE,aAAa,CAAC,KAAK;gCAC1B,MAAM,EAAE,IAAI;gCACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gCAClC,KAAK,EAAE,MAAM;6BACd,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;wBACxB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,uEAAuE;gBACvE,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;oBAClJ,aAAa,GAAG,IAAI,CAAA;oBACpB,MAAK;gBACP,CAAC;YACH,CAAC;YAED,wEAAwE;YACxE,iEAAiE;YACjE,0EAA0E;YAC1E,MAAM,iBAAiB,GAAG,WAAW;iBAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;iBACtH,GAAG,EAAE,EAAE,OAA6B,CAAA;YACvC,OAAO;gBACL,KAAK,EAAE,WAAW,CAAC,iBAAiB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0DAA0D,CAAC,CAAC;gBAC1H,SAAS,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;gBACnE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK;gBAClD,QAAQ,EAAE,aAAa;gBACvB,SAAS,EAAE,cAAc;aACV,CAAA;QACnB,CAAC;QACD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU;KACzB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC;AAED,2EAA2E;AAC3E,IAAI,sBAAsB,GAAG,KAAK,CAAA;AAElC;;;;GAIG;AACH,SAAS,cAAc,CAAC,QAAqC,EAAE,SAAiB,EAAE,KAAa;IAC7F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAA;QACtC,OAAO;YACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;YAClD,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC;SAChE,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;QACtC,IAAI,sBAAsB;YAAE,OAAO,MAAM,CAAC,IAAI,CAAA;QAC9C,OAAO,QAAQ,CAAC,OAAO,CACrB;;;;;;;QAOE,CACH,CAAC,IAAI,CACJ,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,GAAG,IAAI,CAAA,CAAC,CAAC,CAAC,CAAC;QACtE,oEAAoE;QACpE,sEAAsE;QACtE,qEAAqE;QACrE,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CACnC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CACX,WAAW,CAAC,IAAI,CACd,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAC9B,wFAAwF,EACxF,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CACxB,CAAC,EACF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC,EACvC,MAAM,CAAC,KAAK,CACb;QACH,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAClB,WAAW,CAAC,IAAI,CACd,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC7B;;yGAE+F,EAC/F,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CACvD,CAAC,EACF,MAAM,CAAC,KAAK,CACb;KACJ,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAA;IACxC,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QACpD,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;KAC3G,CAAA;AACH,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;KACjC,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,kFAAkF,CAAC,CAAA;IAChH,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;KAChC,CAAA;AACH,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA,CAAC,CAAC,CAAA;IAChI,OAAO;QACL,IAAI,EAAE,GAAuC;QAC7C,YAAY,EAAE,GAA4B;QAC1C,UAAU,EAAE,GAA4B;KACzC,CAAA;AACH,CAAC"}
|