@agentuity/runtime 1.0.48 → 2.0.0-beta.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.
Files changed (104) hide show
  1. package/dist/_globals.d.ts +58 -0
  2. package/dist/_globals.d.ts.map +1 -0
  3. package/dist/_globals.js +71 -0
  4. package/dist/_globals.js.map +1 -0
  5. package/dist/_metadata.d.ts.map +1 -1
  6. package/dist/_metadata.js +14 -0
  7. package/dist/_metadata.js.map +1 -1
  8. package/dist/_process-protection.d.ts +2 -0
  9. package/dist/_process-protection.d.ts.map +1 -1
  10. package/dist/_process-protection.js +14 -23
  11. package/dist/_process-protection.js.map +1 -1
  12. package/dist/_server.d.ts +4 -0
  13. package/dist/_server.d.ts.map +1 -1
  14. package/dist/_server.js +4 -0
  15. package/dist/_server.js.map +1 -1
  16. package/dist/_services.d.ts +1 -1
  17. package/dist/_services.d.ts.map +1 -1
  18. package/dist/_services.js +5 -1
  19. package/dist/_services.js.map +1 -1
  20. package/dist/_standalone.d.ts.map +1 -1
  21. package/dist/_standalone.js +3 -9
  22. package/dist/_standalone.js.map +1 -1
  23. package/dist/agent.d.ts.map +1 -1
  24. package/dist/agent.js +1 -0
  25. package/dist/agent.js.map +1 -1
  26. package/dist/app.d.ts +149 -71
  27. package/dist/app.d.ts.map +1 -1
  28. package/dist/app.js +121 -156
  29. package/dist/app.js.map +1 -1
  30. package/dist/bootstrap.d.ts +44 -0
  31. package/dist/bootstrap.d.ts.map +1 -0
  32. package/dist/bootstrap.js +256 -0
  33. package/dist/bootstrap.js.map +1 -0
  34. package/dist/dev-patches/aisdk.d.ts.map +1 -1
  35. package/dist/dev-patches/aisdk.js +6 -8
  36. package/dist/dev-patches/aisdk.js.map +1 -1
  37. package/dist/dev-patches/gateway.d.ts.map +1 -1
  38. package/dist/dev-patches/gateway.js +7 -8
  39. package/dist/dev-patches/gateway.js.map +1 -1
  40. package/dist/handlers/_route-meta.d.ts +20 -0
  41. package/dist/handlers/_route-meta.d.ts.map +1 -0
  42. package/dist/handlers/_route-meta.js +25 -0
  43. package/dist/handlers/_route-meta.js.map +1 -0
  44. package/dist/handlers/cron.d.ts.map +1 -1
  45. package/dist/handlers/cron.js +3 -1
  46. package/dist/handlers/cron.js.map +1 -1
  47. package/dist/handlers/sse.d.ts +3 -3
  48. package/dist/handlers/sse.d.ts.map +1 -1
  49. package/dist/handlers/sse.js +4 -16
  50. package/dist/handlers/sse.js.map +1 -1
  51. package/dist/handlers/stream.d.ts.map +1 -1
  52. package/dist/handlers/stream.js +4 -12
  53. package/dist/handlers/stream.js.map +1 -1
  54. package/dist/handlers/websocket.d.ts +3 -1
  55. package/dist/handlers/websocket.d.ts.map +1 -1
  56. package/dist/handlers/websocket.js +6 -37
  57. package/dist/handlers/websocket.js.map +1 -1
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +1 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/middleware.d.ts +1 -8
  63. package/dist/middleware.d.ts.map +1 -1
  64. package/dist/middleware.js +29 -71
  65. package/dist/middleware.js.map +1 -1
  66. package/dist/otel/logger.d.ts.map +1 -1
  67. package/dist/otel/logger.js +4 -7
  68. package/dist/otel/logger.js.map +1 -1
  69. package/dist/otel/otel.d.ts +4 -1
  70. package/dist/otel/otel.d.ts.map +1 -1
  71. package/dist/otel/otel.js +13 -2
  72. package/dist/otel/otel.js.map +1 -1
  73. package/dist/router.d.ts +10 -62
  74. package/dist/router.d.ts.map +1 -1
  75. package/dist/router.js +9 -146
  76. package/dist/router.js.map +1 -1
  77. package/dist/workbench.d.ts +1 -1
  78. package/dist/workbench.d.ts.map +1 -1
  79. package/dist/workbench.js +120 -12
  80. package/dist/workbench.js.map +1 -1
  81. package/package.json +7 -7
  82. package/src/_globals.ts +92 -0
  83. package/src/_metadata.ts +14 -0
  84. package/src/_process-protection.ts +17 -28
  85. package/src/_server.ts +4 -0
  86. package/src/_services.ts +6 -2
  87. package/src/_standalone.ts +4 -9
  88. package/src/agent.ts +1 -0
  89. package/src/app.ts +294 -195
  90. package/src/bootstrap.ts +316 -0
  91. package/src/dev-patches/aisdk.ts +8 -11
  92. package/src/dev-patches/gateway.ts +9 -11
  93. package/src/globals.d.ts +28 -0
  94. package/src/handlers/_route-meta.ts +31 -0
  95. package/src/handlers/cron.ts +4 -1
  96. package/src/handlers/sse.ts +8 -19
  97. package/src/handlers/stream.ts +5 -12
  98. package/src/handlers/websocket.ts +11 -37
  99. package/src/index.ts +2 -3
  100. package/src/middleware.ts +40 -99
  101. package/src/otel/logger.ts +5 -8
  102. package/src/otel/otel.ts +14 -2
  103. package/src/router.ts +12 -216
  104. package/src/workbench.ts +135 -12
package/dist/app.js CHANGED
@@ -7,137 +7,134 @@ export function getApp() {
7
7
  }
8
8
  // Re-export event functions from _events
9
9
  export { fireEvent } from './_events';
10
- import { addEventListener as globalAddEventListener, removeEventListener as globalRemoveEventListener, } from './_events';
11
- import { getLogger, getRouter } from './_server';
12
10
  /**
13
- * Create an Agentuity application with lifecycle management.
11
+ * Create and start an Agentuity application.
14
12
  *
15
- * In Vite-native architecture:
16
- * - This only handles setup/shutdown lifecycle
17
- * - Router creation and middleware are handled by the generated entry file
18
- * - Server is managed by Vite (dev) or Bun.serve (prod)
19
- *
20
- * @template TAppState - Type of application state from setup()
13
+ * This is the single entry point for the entire server lifecycle:
14
+ * OTel, middleware, route mounting, services, and Bun.serve().
21
15
  *
22
16
  * @example
23
17
  * ```typescript
24
- * // app.ts
25
18
  * import { createApp } from '@agentuity/runtime';
19
+ * import router from './src/api/router';
20
+ * import agents from './src/agent';
26
21
  *
27
- * const app = await createApp({
28
- * setup: async () => {
29
- * const db = await connectDB();
30
- * return { db };
31
- * },
32
- * shutdown: async (state) => {
33
- * await state.db.close();
34
- * }
22
+ * export default await createApp({
23
+ * router: { path: '/api', router },
24
+ * agents,
35
25
  * });
36
- *
37
- * // Access state in agents via ctx.app.db
38
26
  * ```
39
27
  */
40
28
  export async function createApp(config) {
41
- // Run setup to get app state
42
- const state = config?.setup ? await config.setup() : {};
43
- // Store state and config globally for generated entry file to access
44
- globalThis.__AGENTUITY_APP_STATE__ = state;
45
- globalThis.__AGENTUITY_APP_CONFIG__ = config;
46
- // Store user-provided router(s) normalized as RouteMount[] for the entry file.
47
- // When set, the entry file mounts these instead of auto-discovered route files.
48
- if (config?.router) {
49
- globalThis.__AGENTUITY_USER_ROUTER__ = normalizeRouterConfig(config.router);
29
+ // --- Imports (lazy to avoid circular deps) ---
30
+ const { bootstrapRuntimeEnv } = await import('@agentuity/server');
31
+ const { register } = await import('./otel/config');
32
+ const { setGlobalLogger, setGlobalTracer, setGlobalRouter, getSpanProcessors } = await import('./_server');
33
+ const { createServices, getThreadProvider, getSessionProvider } = await import('./_services');
34
+ const { createBaseMiddleware, createCorsMiddleware, createOtelMiddleware, createCompressionMiddleware, } = await import('./middleware');
35
+ const { runAgentSetups, createAgentMiddleware } = await import('./agent');
36
+ const { loadBuildMetadata } = await import('./_metadata');
37
+ const { patchBunS3ForStorageDev } = await import('./bun-s3-patch');
38
+ const { createWorkbenchRouter } = await import('./workbench');
39
+ const { isDevelopment, resolveAnalyticsConfig, resolveWorkbenchConfig, registerHealthRoutes, registerAnalyticsRoutes, registerWebRoutes, registerWorkbenchUI, startServer, } = await import('./bootstrap');
40
+ const { websocket } = await import('hono/bun');
41
+ // --- Step 0: Environment ---
42
+ if (isDevelopment()) {
43
+ bootstrapRuntimeEnv();
50
44
  }
51
- // Store shutdown function for cleanup
52
- const shutdown = config?.shutdown;
53
- if (shutdown) {
54
- globalThis.__AGENTUITY_SHUTDOWN__ = shutdown;
45
+ if (isDevelopment() && process.env.AGENTUITY_NO_BUNDLE === 'true') {
46
+ const { applyDevPatches } = await import('./dev-patches');
47
+ await applyDevPatches();
55
48
  }
56
- // Return a logger proxy that lazily resolves to the global logger
57
- // This is necessary because Vite bundling inlines and reorders module code,
58
- // causing app.ts to execute before entry file sets the global logger.
59
- // The proxy ensures logger works correctly when actually used (in handlers/callbacks).
60
- const logger = {
61
- trace: (...args) => {
62
- const gl = getLogger();
63
- if (gl)
64
- gl.trace(...args);
65
- },
66
- debug: (...args) => {
67
- const gl = getLogger();
68
- if (gl)
69
- gl.debug(...args);
70
- },
71
- info: (...args) => {
72
- const gl = getLogger();
73
- if (gl)
74
- gl.info(...args);
75
- else
76
- console.log('[INFO]', ...args);
77
- },
78
- warn: (...args) => {
79
- const gl = getLogger();
80
- if (gl)
81
- gl.warn(...args);
82
- else
83
- console.warn('[WARN]', ...args);
84
- },
85
- error: (...args) => {
86
- const gl = getLogger();
87
- if (gl)
88
- gl.error(...args);
89
- else
90
- console.error('[ERROR]', ...args);
91
- },
92
- fatal: (...args) => {
93
- const gl = getLogger();
94
- if (gl)
95
- return gl.fatal(...args);
96
- // Fallback: log to console but let the real logger handle exit
97
- console.error('[FATAL]', ...args);
98
- throw new Error('Fatal error');
99
- },
100
- child: (bindings) => {
101
- const gl = getLogger();
102
- return gl ? gl.child(bindings) : logger;
103
- },
104
- };
105
- // Create server info from environment
49
+ loadBuildMetadata();
50
+ patchBunS3ForStorageDev();
51
+ // --- Step 1: Telemetry ---
52
+ const otel = register({
53
+ processors: getSpanProcessors(),
54
+ logLevel: (process.env.AGENTUITY_LOG_LEVEL || 'info'),
55
+ });
56
+ setGlobalLogger(otel.logger);
57
+ setGlobalTracer(otel.tracer);
58
+ // --- Step 2: Router + middleware ---
59
+ const { createRouter } = await import('./router');
60
+ const app = createRouter();
61
+ setGlobalRouter(app);
62
+ app.use('*', createCompressionMiddleware(config?.compression));
63
+ app.use('*', createBaseMiddleware({
64
+ logger: otel.logger,
65
+ tracer: otel.tracer,
66
+ meter: otel.meter,
67
+ }));
68
+ app.use('/_agentuity/workbench/*', createOtelMiddleware());
69
+ // --- Step 3: Services ---
106
70
  const port = process.env.PORT || '3500';
107
- const server = {
108
- url: `http://127.0.0.1:${port}`,
109
- };
110
- // Get router from global (set by entry file before app.ts import)
111
- // In dev mode, router may not be available during bundling
112
- const globalRouter = getRouter();
113
- if (!globalRouter) {
114
- throw new Error('Router is not available. Ensure router is initialized before calling createApp(). This typically happens during bundling or when the entry file has not properly set up the router.');
71
+ const serverUrl = `http://127.0.0.1:${port}`;
72
+ createServices(otel.logger, config, serverUrl);
73
+ const threadProvider = getThreadProvider();
74
+ const sessionProvider = getSessionProvider();
75
+ await threadProvider.initialize({});
76
+ await sessionProvider.initialize({});
77
+ // --- Step 4: Routes ---
78
+ const analyticsConfig = resolveAnalyticsConfig(config?.analytics);
79
+ const workbenchConfig = resolveWorkbenchConfig(config?.workbench);
80
+ registerHealthRoutes(app);
81
+ if (analyticsConfig.enabled) {
82
+ registerAnalyticsRoutes(app, analyticsConfig);
83
+ }
84
+ // Mount user routers
85
+ if (config?.router) {
86
+ const mounts = normalizeRouterConfig(config.router);
87
+ for (const mount of mounts) {
88
+ const prefix = mount.path.endsWith('/') ? mount.path + '*' : mount.path + '/*';
89
+ app.use(prefix, createCorsMiddleware(config?.cors));
90
+ app.use(prefix, createOtelMiddleware());
91
+ app.use(prefix, createAgentMiddleware(''));
92
+ app.route(mount.path, mount.router);
93
+ }
115
94
  }
116
- const router = globalRouter;
117
- return {
118
- state,
119
- shutdown,
95
+ // Workbench
96
+ const workbenchRouter = createWorkbenchRouter();
97
+ app.route('/', workbenchRouter);
98
+ registerWorkbenchUI(app, workbenchConfig);
99
+ // Web (production static serving)
100
+ registerWebRoutes(app, analyticsConfig);
101
+ // --- Step 5: Agent lifecycle + server ---
102
+ await runAgentSetups({});
103
+ // In dev mode with --hot, Bun manages the server via the default export's
104
+ // `fetch` property. In production, we start Bun.serve() explicitly.
105
+ if (!isDevelopment()) {
106
+ startServer(app, { requestTimeout: config?.requestTimeout });
107
+ }
108
+ // Only log on first startup, not on --hot reloads
109
+ const { serverStarted } = await import('./_globals');
110
+ if (!serverStarted.get()) {
111
+ serverStarted.set(true);
112
+ otel.logger.debug('Server listening on %s', serverUrl);
113
+ }
114
+ const portNumber = parseInt(port, 10);
115
+ const result = {
120
116
  config,
121
- router,
122
- server,
123
- logger,
124
- addEventListener: globalAddEventListener,
125
- removeEventListener: globalRemoveEventListener,
117
+ router: app,
118
+ server: { url: serverUrl },
119
+ logger: otel.logger,
120
+ // Bun --hot picks up `fetch` and `port` on the default export to
121
+ // hot-swap the running server's request handler without restarting.
122
+ fetch: app.fetch,
123
+ port: portNumber,
124
+ hostname: '127.0.0.1',
125
+ websocket,
126
126
  };
127
- }
128
- /**
129
- * Get the global app state
130
- * Used by generated entry file and middleware
131
- */
132
- export function getAppState() {
133
- return globalThis.__AGENTUITY_APP_STATE__ || {};
134
- }
135
- /**
136
- * Get the global app config
137
- * Used by generated entry file for middleware setup
138
- */
139
- export function getAppConfig() {
140
- return globalThis.__AGENTUITY_APP_CONFIG__;
127
+ // In production, startServer() already called Bun.serve(). If we leave
128
+ // `fetch` + `port` on the default export, Bun v1.2+ auto-serves from it
129
+ // too causing EADDRINUSE. Strip those properties so only the explicit
130
+ // Bun.serve() is active.
131
+ if (!isDevelopment()) {
132
+ delete result.fetch;
133
+ delete result.port;
134
+ delete result.hostname;
135
+ delete result.websocket;
136
+ }
137
+ return result;
141
138
  }
142
139
  /**
143
140
  * Normalize the router config into a consistent RouteMount[] form.
@@ -146,7 +143,7 @@ export function getAppConfig() {
146
143
  * - [{ path, router }, ...] → as-is
147
144
  * @internal
148
145
  */
149
- function normalizeRouterConfig(
146
+ export function normalizeRouterConfig(
150
147
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
151
148
  router) {
152
149
  if (Array.isArray(router)) {
@@ -158,40 +155,17 @@ router) {
158
155
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
156
  return [{ path: '/api', router: router }];
160
157
  }
161
- /**
162
- * Get the user-provided router mounts from createApp({ router }).
163
- * Returns undefined if no user router was provided (file-based routing).
164
- * Used by generated entry file to skip file-based route discovery.
165
- * @internal
166
- */
167
- export function getUserRouter() {
168
- return globalThis.__AGENTUITY_USER_ROUTER__;
169
- }
170
- /**
171
- * Set the global app config (for testing purposes)
172
- * @internal
173
- */
174
- export function setAppConfig(config) {
175
- if (config === undefined) {
176
- delete globalThis.__AGENTUITY_APP_CONFIG__;
177
- }
178
- else {
179
- globalThis.__AGENTUITY_APP_CONFIG__ = config;
180
- }
181
- }
182
- /**
183
- * Symbol used to store shutdown hooks in globalThis.
184
- */
185
- const SHUTDOWN_HOOKS_KEY = Symbol.for('@agentuity/runtime:shutdown-hooks');
186
158
  /**
187
159
  * Gets the global shutdown hooks registry.
188
160
  */
189
161
  function getShutdownHooks() {
190
- const global = globalThis;
191
- if (!global[SHUTDOWN_HOOKS_KEY]) {
192
- global[SHUTDOWN_HOOKS_KEY] = [];
162
+ const key = Symbol.for('@agentuity/runtime:shutdown-hooks');
163
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
164
+ const g = globalThis;
165
+ if (!g[key]) {
166
+ g[key] = [];
193
167
  }
194
- return global[SHUTDOWN_HOOKS_KEY];
168
+ return g[key];
195
169
  }
196
170
  /**
197
171
  * Registers a shutdown hook to be called during graceful shutdown.
@@ -229,21 +203,12 @@ export function registerShutdownHook(hook) {
229
203
  };
230
204
  }
231
205
  /**
232
- * Run the global shutdown function and all registered shutdown hooks.
233
- * Called by generated entry file on cleanup.
206
+ * Run all registered shutdown hooks.
207
+ * Called during graceful shutdown (SIGTERM/SIGINT).
234
208
  *
235
- * Shutdown order:
236
- * 1. App's shutdown callback (if defined)
237
- * 2. Registered shutdown hooks (in reverse order - LIFO)
209
+ * Hooks are called in reverse order of registration (LIFO).
238
210
  */
239
211
  export async function runShutdown() {
240
- // Run app's shutdown callback first
241
- const shutdown = globalThis.__AGENTUITY_SHUTDOWN__;
242
- if (shutdown) {
243
- const state = getAppState();
244
- await shutdown(state);
245
- }
246
- // Run registered shutdown hooks in reverse order (LIFO)
247
212
  const hooks = getShutdownHooks();
248
213
  for (let i = hooks.length - 1; i >= 0; i--) {
249
214
  const hook = hooks[i];
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Server lifecycle helpers.
3
+ *
4
+ * These functions are called by createApp() to set up routes, middleware,
5
+ * and the Bun HTTP server. They're kept separate to keep createApp() focused
6
+ * on orchestration while these handle the details.
7
+ */
8
+ import type { AnalyticsOptions, WorkbenchOptions } from './app';
9
+ import { createRouter } from './router';
10
+ /**
11
+ * Check if running in development mode.
12
+ *
13
+ * The CLI dev server explicitly sets NODE_ENV='development'. In production
14
+ * (cloud deployment, CI integration test running a built app.js), NODE_ENV
15
+ * may be 'production' or unset entirely. When unset, we assume production
16
+ * — the dev server always sets it, so absence means production.
17
+ */
18
+ export declare const isDevelopment: () => boolean;
19
+ /** Resolve analytics config with defaults */
20
+ export declare function resolveAnalyticsConfig(analytics: boolean | AnalyticsOptions | undefined): AnalyticsOptions & {
21
+ enabled: boolean;
22
+ };
23
+ /** Resolve workbench config */
24
+ export declare function resolveWorkbenchConfig(workbench: boolean | string | WorkbenchOptions | undefined): {
25
+ enabled: boolean;
26
+ route: string;
27
+ headers: Record<string, string>;
28
+ };
29
+ /** Register analytics routes on the app */
30
+ export declare function registerAnalyticsRoutes(app: ReturnType<typeof createRouter>, _analyticsConfig: AnalyticsOptions & {
31
+ enabled: boolean;
32
+ }): void;
33
+ export declare function registerHealthRoutes(app: ReturnType<typeof createRouter>): void;
34
+ export declare function registerWebRoutes(app: ReturnType<typeof createRouter>, analyticsConfig: AnalyticsOptions & {
35
+ enabled: boolean;
36
+ }): void;
37
+ export declare function registerWorkbenchUI(app: ReturnType<typeof createRouter>, workbenchConfig: {
38
+ enabled: boolean;
39
+ route: string;
40
+ }): void;
41
+ export declare function startServer(app: ReturnType<typeof createRouter>, options?: {
42
+ requestTimeout?: number;
43
+ }): void;
44
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAiBxC;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,eAAuD,CAAC;AAMlF,6CAA6C;AAC7C,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,GAC/C,gBAAgB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAmBzC;AAED,+BAA+B;AAC/B,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,gBAAgB,GAAG,SAAS,GACxD;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAetE;AA2CD,2CAA2C;AAC3C,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EACpC,gBAAgB,EAAE,gBAAgB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACvD,IAAI,CA2BN;AAMD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,IAAI,CA2B/E;AAMD,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EACpC,eAAe,EAAE,gBAAgB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACtD,IAAI,CA6CN;AAMD,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EACpC,eAAe,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD,IAAI,CAaN;AAMD,wBAAgB,WAAW,CAC1B,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EACpC,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,IAAI,CAkCN"}