@agentplugins/core 0.1.0 → 0.2.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/README.md +2 -2
- package/dist/adapter.d.ts +15 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +14 -0
- package/dist/adapter.js.map +1 -0
- package/dist/codegen.d.ts +22 -0
- package/dist/codegen.d.ts.map +1 -0
- package/dist/codegen.js +178 -0
- package/dist/codegen.js.map +1 -0
- package/dist/index.d.ts +6 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/lint.d.ts +29 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +238 -0
- package/dist/lint.js.map +1 -0
- package/dist/store.d.ts +178 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +620 -0
- package/dist/store.js.map +1 -0
- package/package.json +14 -9
- package/dist/profiling-hof.d.ts +0 -11
- package/dist/profiling-hof.d.ts.map +0 -1
- package/dist/profiling-hof.js +0 -80
- package/dist/profiling-hof.js.map +0 -1
- package/dist/profiling.d.ts +0 -64
- package/dist/profiling.d.ts.map +0 -1
- package/dist/profiling.js +0 -58
- package/dist/profiling.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentplugins/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Core types, validation, and plugin registry for AgentPlugins",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -9,15 +9,12 @@
|
|
|
9
9
|
".": {
|
|
10
10
|
"import": "./dist/index.js",
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./adapter": {
|
|
14
|
+
"import": "./dist/adapter.js",
|
|
15
|
+
"types": "./dist/adapter.d.ts"
|
|
12
16
|
}
|
|
13
17
|
},
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsc",
|
|
16
|
-
"dev": "tsc --watch",
|
|
17
|
-
"clean": "rm -rf dist",
|
|
18
|
-
"test": "vitest",
|
|
19
|
-
"test:run": "vitest run __tests__/placeholder.test.ts"
|
|
20
|
-
},
|
|
21
18
|
"files": [
|
|
22
19
|
"dist",
|
|
23
20
|
"README.md"
|
|
@@ -36,7 +33,15 @@
|
|
|
36
33
|
"zod": "^3.25.76"
|
|
37
34
|
},
|
|
38
35
|
"devDependencies": {
|
|
36
|
+
"@types/node": "^20.0.0",
|
|
39
37
|
"typescript": "^5.9.3",
|
|
40
38
|
"vitest": "^3.1.4"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsc",
|
|
42
|
+
"dev": "tsc --watch",
|
|
43
|
+
"clean": "rm -rf dist",
|
|
44
|
+
"test": "vitest",
|
|
45
|
+
"test:run": "vitest run __tests__/placeholder.test.ts"
|
|
41
46
|
}
|
|
42
|
-
}
|
|
47
|
+
}
|
package/dist/profiling-hof.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { HookContext, HookResult } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Higher-order function that wraps an inline hook handler with timing instrumentation.
|
|
4
|
-
*
|
|
5
|
-
* @param handler - The inline hook handler to wrap
|
|
6
|
-
* @param hookName - Name of the hook event (e.g. 'preToolUse')
|
|
7
|
-
* @param platform - Platform identifier (e.g. 'opencode', 'pimono')
|
|
8
|
-
* @returns The same handler, wrapped with timing and profiling
|
|
9
|
-
*/
|
|
10
|
-
export declare function withTiming<T extends (ctx: HookContext) => Promise<HookResult>>(handler: T, hookName: string, platform: string): T;
|
|
11
|
-
//# sourceMappingURL=profiling-hof.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiling-hof.d.ts","sourceRoot":"","sources":["../src/profiling-hof.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgB1D;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,CAAC,SAAS,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,EACnD,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAqEnD"}
|
package/dist/profiling-hof.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { createHookId, startTimer, emitProfilingEvent, shouldProfile, getProfilingOutput, } from './profiling.js';
|
|
2
|
-
/**
|
|
3
|
-
* Sequence counter for ordering profiling events within a session.
|
|
4
|
-
* Incremented on each withTiming call.
|
|
5
|
-
*/
|
|
6
|
-
let sequenceCounter = 0;
|
|
7
|
-
/**
|
|
8
|
-
* Higher-order function that wraps an inline hook handler with timing instrumentation.
|
|
9
|
-
*
|
|
10
|
-
* @param handler - The inline hook handler to wrap
|
|
11
|
-
* @param hookName - Name of the hook event (e.g. 'preToolUse')
|
|
12
|
-
* @param platform - Platform identifier (e.g. 'opencode', 'pimono')
|
|
13
|
-
* @returns The same handler, wrapped with timing and profiling
|
|
14
|
-
*/
|
|
15
|
-
export function withTiming(handler, hookName, platform) {
|
|
16
|
-
return (async (ctx) => {
|
|
17
|
-
// Inject timing fields into context before handler execution
|
|
18
|
-
const hookId = createHookId();
|
|
19
|
-
const timestamp = Date.now();
|
|
20
|
-
const getElapsed = startTimer();
|
|
21
|
-
ctx.timestamp = timestamp;
|
|
22
|
-
ctx.hookId = hookId;
|
|
23
|
-
let result;
|
|
24
|
-
let error;
|
|
25
|
-
try {
|
|
26
|
-
result = await handler(ctx);
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
error = err instanceof Error ? err.message : String(err);
|
|
30
|
-
// Emit error profiling event when profiling is enabled
|
|
31
|
-
if (shouldProfile()) {
|
|
32
|
-
const event = {
|
|
33
|
-
type: 'hook_invocation',
|
|
34
|
-
hookName,
|
|
35
|
-
hookId,
|
|
36
|
-
sequenceId: ++sequenceCounter,
|
|
37
|
-
timestamp,
|
|
38
|
-
hookDurationMs: getElapsed(),
|
|
39
|
-
platform,
|
|
40
|
-
sessionId: ctx.sessionId,
|
|
41
|
-
toolName: ctx.toolName,
|
|
42
|
-
error,
|
|
43
|
-
};
|
|
44
|
-
try {
|
|
45
|
-
emitProfilingEvent(event, getProfilingOutput());
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// profiling failure must never break the hook
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
throw err;
|
|
52
|
-
}
|
|
53
|
-
// Record duration after handler completes
|
|
54
|
-
const hookDurationMs = getElapsed();
|
|
55
|
-
ctx.hookDurationMs = hookDurationMs;
|
|
56
|
-
// Emit profiling event when profiling is enabled
|
|
57
|
-
if (shouldProfile()) {
|
|
58
|
-
const event = {
|
|
59
|
-
type: 'hook_invocation',
|
|
60
|
-
hookName,
|
|
61
|
-
hookId,
|
|
62
|
-
sequenceId: ++sequenceCounter,
|
|
63
|
-
timestamp,
|
|
64
|
-
hookDurationMs,
|
|
65
|
-
platform,
|
|
66
|
-
sessionId: ctx.sessionId,
|
|
67
|
-
toolName: ctx.toolName,
|
|
68
|
-
result,
|
|
69
|
-
};
|
|
70
|
-
try {
|
|
71
|
-
emitProfilingEvent(event, getProfilingOutput());
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// profiling failure must never break the hook
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return result;
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=profiling-hof.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiling-hof.js","sourceRoot":"","sources":["../src/profiling-hof.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAExB,OAAU,EAAE,QAAgB,EAAE,QAAgB;IAC9C,OAAO,CAAC,KAAK,EAAE,GAAgB,EAAuB,EAAE;QACtD,6DAA6D;QAC7D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;QAEhC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1B,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QAEpB,IAAI,MAAkB,CAAC;QACvB,IAAI,KAAyB,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEzD,uDAAuD;YACvD,IAAI,aAAa,EAAE,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAmB;oBAC5B,IAAI,EAAE,iBAAiB;oBACvB,QAAQ;oBACR,MAAM;oBACN,UAAU,EAAE,EAAE,eAAe;oBAC7B,SAAS;oBACT,cAAc,EAAE,UAAU,EAAE;oBAC5B,QAAQ;oBACR,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,KAAK;iBACN,CAAC;gBACF,IAAI,CAAC;oBACH,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAClD,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;YACH,CAAC;YAED,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,0CAA0C;QAC1C,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;QACpC,GAAG,CAAC,cAAc,GAAG,cAAc,CAAC;QAEpC,iDAAiD;QACjD,IAAI,aAAa,EAAE,EAAE,CAAC;YACpB,MAAM,KAAK,GAAmB;gBAC5B,IAAI,EAAE,iBAAiB;gBACvB,QAAQ;gBACR,MAAM;gBACN,UAAU,EAAE,EAAE,eAAe;gBAC7B,SAAS;gBACT,cAAc;gBACd,QAAQ;gBACR,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,MAAM;aACP,CAAC;YACF,IAAI,CAAC;gBACH,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAM,CAAC;AACV,CAAC"}
|
package/dist/profiling.d.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Profiling event emitted as JSONL for external profiler consumption.
|
|
3
|
-
* Mirrors schemas/profiling-event.json.
|
|
4
|
-
*/
|
|
5
|
-
export interface ProfilingEvent {
|
|
6
|
-
/** Discriminator: always "hook_invocation" */
|
|
7
|
-
type: 'hook_invocation';
|
|
8
|
-
/** Name of the hook being invoked */
|
|
9
|
-
hookName: string;
|
|
10
|
-
/** Unique identifier for this hook invocation instance */
|
|
11
|
-
hookId: string;
|
|
12
|
-
/** Monotonically increasing sequence number for ordering events */
|
|
13
|
-
sequenceId: number;
|
|
14
|
-
/** Unix epoch timestamp in milliseconds when the hook was invoked */
|
|
15
|
-
timestamp: number;
|
|
16
|
-
/** Duration of the hook execution in milliseconds */
|
|
17
|
-
hookDurationMs: number;
|
|
18
|
-
/** Platform on which the hook ran (e.g. 'python', 'node', 'cli') */
|
|
19
|
-
platform: string;
|
|
20
|
-
/** Optional session identifier to correlate events */
|
|
21
|
-
sessionId?: string;
|
|
22
|
-
/** Optional name of the tool/agent associated with this hook invocation */
|
|
23
|
-
toolName?: string;
|
|
24
|
-
/** Optional result payload returned by the hook */
|
|
25
|
-
result?: object;
|
|
26
|
-
/** Optional error message if the hook invocation failed */
|
|
27
|
-
error?: string;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Generates a unique hook invocation ID using crypto.randomUUID().
|
|
31
|
-
*/
|
|
32
|
-
export declare function createHookId(): string;
|
|
33
|
-
/**
|
|
34
|
-
* Creates a timer. When the returned function is called, it returns
|
|
35
|
-
* the elapsed milliseconds since the timer was created (via Date.now()).
|
|
36
|
-
*/
|
|
37
|
-
export declare function startTimer(): () => number;
|
|
38
|
-
/**
|
|
39
|
-
* Writes a profiling event as a single JSONL line.
|
|
40
|
-
*
|
|
41
|
-
* - If `destination` is `'stderr'`, writes to `process.stderr` (without newline — JSONL
|
|
42
|
-
* consumers typically handle line separation; we add `\n` for readability).
|
|
43
|
-
* - If `destination` is a file path, appends a JSONL line via `fs.appendFileSync`.
|
|
44
|
-
*/
|
|
45
|
-
export declare function emitProfilingEvent(event: ProfilingEvent, destination: string): void;
|
|
46
|
-
/**
|
|
47
|
-
* Reads the `AGENTBRIDGE_PROFILING_OUTPUT` environment variable.
|
|
48
|
-
* Returns `'stderr'` if the variable is not set.
|
|
49
|
-
*/
|
|
50
|
-
export declare function getProfilingOutput(): string;
|
|
51
|
-
/**
|
|
52
|
-
* Returns `true` when profiling is enabled (i.e. the
|
|
53
|
-
* `AGENTBRIDGE_PROFILING_OUTPUT` environment variable is set to a non-empty value).
|
|
54
|
-
*/
|
|
55
|
-
export declare function shouldProfile(): boolean;
|
|
56
|
-
/**
|
|
57
|
-
* Creates a session-scoped sequence ID counter.
|
|
58
|
-
* Returns `next()` which yields a monotonically increasing integer per session.
|
|
59
|
-
* Used by generated wrappers to produce `sequenceId` values in profiling events.
|
|
60
|
-
*/
|
|
61
|
-
export declare function createSequenceId(): {
|
|
62
|
-
next: () => number;
|
|
63
|
-
};
|
|
64
|
-
//# sourceMappingURL=profiling.d.ts.map
|
package/dist/profiling.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiling.d.ts","sourceRoot":"","sources":["../src/profiling.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,IAAI,EAAE,iBAAiB,CAAC;IACxB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,MAAM,CAGzC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,MAAM,GAClB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAGvC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI;IAAE,IAAI,EAAE,MAAM,MAAM,CAAA;CAAE,CAGzD"}
|
package/dist/profiling.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import crypto from 'node:crypto';
|
|
3
|
-
const PROFILING_ENV_VAR = 'AGENTBRIDGE_PROFILING_OUTPUT';
|
|
4
|
-
/**
|
|
5
|
-
* Generates a unique hook invocation ID using crypto.randomUUID().
|
|
6
|
-
*/
|
|
7
|
-
export function createHookId() {
|
|
8
|
-
return crypto.randomUUID();
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Creates a timer. When the returned function is called, it returns
|
|
12
|
-
* the elapsed milliseconds since the timer was created (via Date.now()).
|
|
13
|
-
*/
|
|
14
|
-
export function startTimer() {
|
|
15
|
-
const start = Date.now();
|
|
16
|
-
return () => Date.now() - start;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Writes a profiling event as a single JSONL line.
|
|
20
|
-
*
|
|
21
|
-
* - If `destination` is `'stderr'`, writes to `process.stderr` (without newline — JSONL
|
|
22
|
-
* consumers typically handle line separation; we add `\n` for readability).
|
|
23
|
-
* - If `destination` is a file path, appends a JSONL line via `fs.appendFileSync`.
|
|
24
|
-
*/
|
|
25
|
-
export function emitProfilingEvent(event, destination) {
|
|
26
|
-
const line = JSON.stringify(event) + '\n';
|
|
27
|
-
if (destination === 'stderr') {
|
|
28
|
-
process.stderr.write(line);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
fs.appendFileSync(destination, line, 'utf-8');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Reads the `AGENTBRIDGE_PROFILING_OUTPUT` environment variable.
|
|
36
|
-
* Returns `'stderr'` if the variable is not set.
|
|
37
|
-
*/
|
|
38
|
-
export function getProfilingOutput() {
|
|
39
|
-
return process.env[PROFILING_ENV_VAR] ?? 'stderr';
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Returns `true` when profiling is enabled (i.e. the
|
|
43
|
-
* `AGENTBRIDGE_PROFILING_OUTPUT` environment variable is set to a non-empty value).
|
|
44
|
-
*/
|
|
45
|
-
export function shouldProfile() {
|
|
46
|
-
const value = process.env[PROFILING_ENV_VAR];
|
|
47
|
-
return value !== undefined && value !== '';
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Creates a session-scoped sequence ID counter.
|
|
51
|
-
* Returns `next()` which yields a monotonically increasing integer per session.
|
|
52
|
-
* Used by generated wrappers to produce `sequenceId` values in profiling events.
|
|
53
|
-
*/
|
|
54
|
-
export function createSequenceId() {
|
|
55
|
-
let counter = 0;
|
|
56
|
-
return { next: () => ++counter };
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=profiling.js.map
|
package/dist/profiling.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiling.js","sourceRoot":"","sources":["../src/profiling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AA+BzD;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAqB,EACrB,WAAmB;IAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAE1C,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC7C,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}
|