@siglo/monitor 0.0.0-stage → 1.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/LICENSE +21 -0
- package/README.md +507 -2
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +185 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics.d.ts +15 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +79 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware/express.d.ts +9 -0
- package/dist/middleware/express.d.ts.map +1 -0
- package/dist/middleware/express.js +33 -0
- package/dist/middleware/express.js.map +1 -0
- package/dist/middleware/fastify.d.ts +8 -0
- package/dist/middleware/fastify.d.ts.map +1 -0
- package/dist/middleware/fastify.js +29 -0
- package/dist/middleware/fastify.js.map +1 -0
- package/dist/middleware/hono.d.ts +8 -0
- package/dist/middleware/hono.d.ts.map +1 -0
- package/dist/middleware/hono.js +27 -0
- package/dist/middleware/hono.js.map +1 -0
- package/dist/server.d.ts +30 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +546 -0
- package/dist/server.js.map +1 -0
- package/dist/store.d.ts +19 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +173 -0
- package/dist/store.js.map +1 -0
- package/dist/transports/redis.d.ts +26 -0
- package/dist/transports/redis.d.ts.map +1 -0
- package/dist/transports/redis.js +70 -0
- package/dist/transports/redis.js.map +1 -0
- package/dist/transports/sse.d.ts +24 -0
- package/dist/transports/sse.d.ts.map +1 -0
- package/dist/transports/sse.js +98 -0
- package/dist/transports/sse.js.map +1 -0
- package/dist/transports/websocket.d.ts +37 -0
- package/dist/transports/websocket.d.ts.map +1 -0
- package/dist/transports/websocket.js +277 -0
- package/dist/transports/websocket.js.map +1 -0
- package/dist/types.d.ts +131 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/dashboard.d.ts +2 -0
- package/dist/ui/dashboard.d.ts.map +1 -0
- package/dist/ui/dashboard.js +43 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/wait-state.d.ts +12 -0
- package/dist/wait-state.d.ts.map +1 -0
- package/dist/wait-state.js +27 -0
- package/dist/wait-state.js.map +1 -0
- package/grafana/siglo-live-monitoring.json +109 -0
- package/package.json +54 -4
package/dist/client.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RemoteMonitorClient = void 0;
|
|
4
|
+
exports.createMonitorClient = createMonitorClient;
|
|
5
|
+
exports.attachToMonitorServer = attachToMonitorServer;
|
|
6
|
+
const core_1 = require("@siglo/core");
|
|
7
|
+
const server_1 = require("./server");
|
|
8
|
+
class RemoteMonitorClient {
|
|
9
|
+
emitter;
|
|
10
|
+
baseUrl;
|
|
11
|
+
batchSize;
|
|
12
|
+
flushIntervalMs;
|
|
13
|
+
redaction;
|
|
14
|
+
apiKey;
|
|
15
|
+
customHeaders;
|
|
16
|
+
maxQueueSize;
|
|
17
|
+
queue = [];
|
|
18
|
+
flushTimer = null;
|
|
19
|
+
isClosing = false;
|
|
20
|
+
activeFlushPromise = null;
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
if (options.url) {
|
|
23
|
+
this.baseUrl = options.url.replace(/\/+$/, '');
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const host = options.host || '127.0.0.1';
|
|
27
|
+
const port = options.port !== undefined ? options.port : 4000;
|
|
28
|
+
this.baseUrl = `http://${host}:${port}`;
|
|
29
|
+
}
|
|
30
|
+
this.batchSize = options.batchSize || 10;
|
|
31
|
+
this.flushIntervalMs = options.flushIntervalMs || 25;
|
|
32
|
+
this.redaction = options.redaction;
|
|
33
|
+
this.apiKey = options.apiKey || options.authToken;
|
|
34
|
+
this.customHeaders = options.headers ? { ...options.headers } : {};
|
|
35
|
+
this.maxQueueSize = options.maxQueueSize && options.maxQueueSize > 0 ? options.maxQueueSize : 1000;
|
|
36
|
+
this.emitter = new core_1.WorkflowEventEmitter(options.namespace);
|
|
37
|
+
// Pipe events emitted through this client to the remote server
|
|
38
|
+
this.emitter.on('*', (event) => {
|
|
39
|
+
this.queueEvent(event);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
monitor = (event) => {
|
|
43
|
+
this.queueEvent(event);
|
|
44
|
+
};
|
|
45
|
+
async sendEvent(event) {
|
|
46
|
+
this.queueEvent(event);
|
|
47
|
+
await this.flush();
|
|
48
|
+
}
|
|
49
|
+
queueEvent(event) {
|
|
50
|
+
if (this.isClosing || !event)
|
|
51
|
+
return;
|
|
52
|
+
const sanitized = (0, core_1.redactEvent)(event, this.redaction);
|
|
53
|
+
// Protect host memory: if queue capacity exceeded, drop oldest event
|
|
54
|
+
if (this.queue.length >= this.maxQueueSize) {
|
|
55
|
+
this.queue.shift();
|
|
56
|
+
}
|
|
57
|
+
this.queue.push(sanitized);
|
|
58
|
+
if (this.queue.length >= this.batchSize) {
|
|
59
|
+
this.flush().catch(() => { });
|
|
60
|
+
}
|
|
61
|
+
else if (!this.flushTimer) {
|
|
62
|
+
this.flushTimer = setTimeout(() => {
|
|
63
|
+
this.flushTimer = null;
|
|
64
|
+
this.flush().catch(() => { });
|
|
65
|
+
}, this.flushIntervalMs);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async flush() {
|
|
69
|
+
if (this.flushTimer) {
|
|
70
|
+
clearTimeout(this.flushTimer);
|
|
71
|
+
this.flushTimer = null;
|
|
72
|
+
}
|
|
73
|
+
if (this.queue.length === 0) {
|
|
74
|
+
if (this.activeFlushPromise) {
|
|
75
|
+
await this.activeFlushPromise;
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const batch = [...this.queue];
|
|
80
|
+
this.queue = [];
|
|
81
|
+
this.activeFlushPromise = (async () => {
|
|
82
|
+
try {
|
|
83
|
+
const headers = {
|
|
84
|
+
'Content-Type': 'application/json',
|
|
85
|
+
...this.customHeaders
|
|
86
|
+
};
|
|
87
|
+
if (this.apiKey && !headers['Authorization'] && !headers['authorization']) {
|
|
88
|
+
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
89
|
+
}
|
|
90
|
+
const res = await fetch(`${this.baseUrl}/api/events`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers,
|
|
93
|
+
body: JSON.stringify(batch)
|
|
94
|
+
});
|
|
95
|
+
await res.text();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Observability failures never crash host workflow execution
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
this.activeFlushPromise = null;
|
|
102
|
+
}
|
|
103
|
+
})();
|
|
104
|
+
await this.activeFlushPromise;
|
|
105
|
+
}
|
|
106
|
+
async close() {
|
|
107
|
+
this.isClosing = true;
|
|
108
|
+
await this.flush();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.RemoteMonitorClient = RemoteMonitorClient;
|
|
112
|
+
/**
|
|
113
|
+
* Creates a client that streams workflow telemetry to an external or running monitor server.
|
|
114
|
+
*/
|
|
115
|
+
function createMonitorClient(options = {}) {
|
|
116
|
+
return new RemoteMonitorClient(options);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Attaches a workflow to an already running monitor server.
|
|
120
|
+
*
|
|
121
|
+
* Supports:
|
|
122
|
+
* - No arguments: Attaches to the active in-process server if running, or defaults to http://127.0.0.1:4000.
|
|
123
|
+
* - Port number (e.g. 4000): Attaches to the in-process server on that port if present, or connects over HTTP.
|
|
124
|
+
* - URL string (e.g. 'http://localhost:4000'): Connects to the remote monitor server over HTTP.
|
|
125
|
+
* - MonitorServerInstance: Directly pipes events into the server's event emitter in memory.
|
|
126
|
+
* - MonitorClientOptions: Configures remote batching and connection parameters.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* // 1. Attach to running server on default port (4000)
|
|
131
|
+
* const orderFlow = flow(step1, step2).monitor(attachToMonitorServer());
|
|
132
|
+
*
|
|
133
|
+
* // 2. Attach to authenticated remote monitor server
|
|
134
|
+
* const orderFlow = flow(step1, step2).monitor(attachToMonitorServer('https://monitor.corp.internal:4000', {
|
|
135
|
+
* apiKey: 'secret-token'
|
|
136
|
+
* }));
|
|
137
|
+
*
|
|
138
|
+
* // 3. Attach by port
|
|
139
|
+
* const orderFlow = flow(step1, step2).monitor(attachToMonitorServer(4000));
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
function attachToMonitorServer(target, clientOptions) {
|
|
143
|
+
// 1. If target is a MonitorServerInstance in memory
|
|
144
|
+
if (target && typeof target === 'object' && 'emitter' in target) {
|
|
145
|
+
const instance = target;
|
|
146
|
+
return (event) => {
|
|
147
|
+
instance.emitter.emit(event);
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// 2. If target is undefined, check in-process singleton first
|
|
151
|
+
if (target === undefined) {
|
|
152
|
+
const local = (0, server_1.getActiveMonitorServer)();
|
|
153
|
+
if (local) {
|
|
154
|
+
return (event) => {
|
|
155
|
+
local.emitter.emit(event);
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const client = createMonitorClient({ url: 'http://127.0.0.1:4000', ...clientOptions });
|
|
159
|
+
return client.monitor;
|
|
160
|
+
}
|
|
161
|
+
// 3. If target is a port number
|
|
162
|
+
if (typeof target === 'number') {
|
|
163
|
+
const local = (0, server_1.getActiveMonitorServer)(target);
|
|
164
|
+
if (local) {
|
|
165
|
+
return (event) => {
|
|
166
|
+
local.emitter.emit(event);
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const client = createMonitorClient({ port: target, ...clientOptions });
|
|
170
|
+
return client.monitor;
|
|
171
|
+
}
|
|
172
|
+
// 4. If target is a URL string
|
|
173
|
+
if (typeof target === 'string') {
|
|
174
|
+
const client = createMonitorClient({ url: target, ...clientOptions });
|
|
175
|
+
return client.monitor;
|
|
176
|
+
}
|
|
177
|
+
// 5. If target is MonitorClientOptions
|
|
178
|
+
const mergedOptions = {
|
|
179
|
+
...target,
|
|
180
|
+
...clientOptions
|
|
181
|
+
};
|
|
182
|
+
const client = createMonitorClient(mergedOptions);
|
|
183
|
+
return client.monitor;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './store';
|
|
3
|
+
export * from './transports/sse';
|
|
4
|
+
export * from './transports/websocket';
|
|
5
|
+
export * from './transports/redis';
|
|
6
|
+
export * from './metrics';
|
|
7
|
+
export * from './ui/dashboard';
|
|
8
|
+
export * from './server';
|
|
9
|
+
export * from './client';
|
|
10
|
+
export * from './middleware/express';
|
|
11
|
+
export * from './middleware/fastify';
|
|
12
|
+
export * from './middleware/hono';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./store"), exports);
|
|
19
|
+
__exportStar(require("./transports/sse"), exports);
|
|
20
|
+
__exportStar(require("./transports/websocket"), exports);
|
|
21
|
+
__exportStar(require("./transports/redis"), exports);
|
|
22
|
+
__exportStar(require("./metrics"), exports);
|
|
23
|
+
__exportStar(require("./ui/dashboard"), exports);
|
|
24
|
+
__exportStar(require("./server"), exports);
|
|
25
|
+
__exportStar(require("./client"), exports);
|
|
26
|
+
__exportStar(require("./middleware/express"), exports);
|
|
27
|
+
__exportStar(require("./middleware/fastify"), exports);
|
|
28
|
+
__exportStar(require("./middleware/hono"), exports);
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,0CAAwB;AACxB,mDAAiC;AACjC,yDAAuC;AACvC,qDAAmC;AACnC,4CAA0B;AAC1B,iDAA+B;AAC/B,2CAAyB;AACzB,2CAAyB;AACzB,uDAAqC;AACrC,uDAAqC;AACrC,oDAAkC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { WorkflowExecutionEvent, WorkflowEventEmitter } from '@siglo/core';
|
|
2
|
+
export declare class PrometheusExporter {
|
|
3
|
+
private activeFlows;
|
|
4
|
+
private flowsCompleted;
|
|
5
|
+
private flowsFailed;
|
|
6
|
+
private flowDurationSum;
|
|
7
|
+
private flowDurationCount;
|
|
8
|
+
private stepRetriesTotal;
|
|
9
|
+
private stepsCompleted;
|
|
10
|
+
private stepsFailed;
|
|
11
|
+
attachToEmitter(emitter: WorkflowEventEmitter): this;
|
|
12
|
+
handleEvent(event: WorkflowExecutionEvent): void;
|
|
13
|
+
getMetricsAsText(): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE3E,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAa;IAEhC,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAOpD,WAAW,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI;IA6BhD,gBAAgB,IAAI,MAAM;CA4B7B"}
|
package/dist/metrics.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrometheusExporter = void 0;
|
|
4
|
+
class PrometheusExporter {
|
|
5
|
+
activeFlows = 0;
|
|
6
|
+
flowsCompleted = 0;
|
|
7
|
+
flowsFailed = 0;
|
|
8
|
+
flowDurationSum = 0;
|
|
9
|
+
flowDurationCount = 0;
|
|
10
|
+
stepRetriesTotal = 0;
|
|
11
|
+
stepsCompleted = 0;
|
|
12
|
+
stepsFailed = 0;
|
|
13
|
+
attachToEmitter(emitter) {
|
|
14
|
+
emitter.on('*', (event) => {
|
|
15
|
+
this.handleEvent(event);
|
|
16
|
+
});
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
handleEvent(event) {
|
|
20
|
+
switch (event.type) {
|
|
21
|
+
case 'flow:start':
|
|
22
|
+
this.activeFlows++;
|
|
23
|
+
break;
|
|
24
|
+
case 'flow:complete':
|
|
25
|
+
if (this.activeFlows > 0)
|
|
26
|
+
this.activeFlows--;
|
|
27
|
+
if (event.status === 'COMPLETED') {
|
|
28
|
+
this.flowsCompleted++;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.flowsFailed++;
|
|
32
|
+
}
|
|
33
|
+
this.flowDurationSum += (event.durationMs || 0) / 1000;
|
|
34
|
+
this.flowDurationCount++;
|
|
35
|
+
break;
|
|
36
|
+
case 'step:retry':
|
|
37
|
+
this.stepRetriesTotal++;
|
|
38
|
+
break;
|
|
39
|
+
case 'step:complete':
|
|
40
|
+
this.stepsCompleted++;
|
|
41
|
+
break;
|
|
42
|
+
case 'step:error':
|
|
43
|
+
this.stepsFailed++;
|
|
44
|
+
break;
|
|
45
|
+
default:
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
getMetricsAsText() {
|
|
50
|
+
const lines = [
|
|
51
|
+
'# HELP siglo_active_flows Current number of actively running workflows.',
|
|
52
|
+
'# TYPE siglo_active_flows gauge',
|
|
53
|
+
`siglo_active_flows ${this.activeFlows}`,
|
|
54
|
+
'',
|
|
55
|
+
'# HELP siglo_flows_total Total number of workflow executions completed or failed.',
|
|
56
|
+
'# TYPE siglo_flows_total counter',
|
|
57
|
+
`siglo_flows_total{status="completed"} ${this.flowsCompleted}`,
|
|
58
|
+
`siglo_flows_total{status="failed"} ${this.flowsFailed}`,
|
|
59
|
+
'',
|
|
60
|
+
'# HELP siglo_flow_duration_seconds Total execution time of workflows in seconds.',
|
|
61
|
+
'# TYPE siglo_flow_duration_seconds summary',
|
|
62
|
+
`siglo_flow_duration_seconds_sum ${this.flowDurationSum.toFixed(4)}`,
|
|
63
|
+
`siglo_flow_duration_seconds_count ${this.flowDurationCount}`,
|
|
64
|
+
'',
|
|
65
|
+
'# HELP siglo_step_retries_total Total count of step execution retries.',
|
|
66
|
+
'# TYPE siglo_step_retries_total counter',
|
|
67
|
+
`siglo_step_retries_total ${this.stepRetriesTotal}`,
|
|
68
|
+
'',
|
|
69
|
+
'# HELP siglo_steps_total Total count of step completions and failures.',
|
|
70
|
+
'# TYPE siglo_steps_total counter',
|
|
71
|
+
`siglo_steps_total{status="completed"} ${this.stepsCompleted}`,
|
|
72
|
+
`siglo_steps_total{status="failed"} ${this.stepsFailed}`,
|
|
73
|
+
''
|
|
74
|
+
];
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.PrometheusExporter = PrometheusExporter;
|
|
79
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":";;;AAEA,MAAa,kBAAkB;IACnB,WAAW,GAAW,CAAC,CAAC;IACxB,cAAc,GAAW,CAAC,CAAC;IAC3B,WAAW,GAAW,CAAC,CAAC;IACxB,eAAe,GAAW,CAAC,CAAC;IAC5B,iBAAiB,GAAW,CAAC,CAAC;IAC9B,gBAAgB,GAAW,CAAC,CAAC;IAC7B,cAAc,GAAW,CAAC,CAAC;IAC3B,WAAW,GAAW,CAAC,CAAC;IAEhC,eAAe,CAAC,OAA6B;QACzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;YACtB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,KAA6B;QACrC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,YAAY;gBACb,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM;YACV,KAAK,eAAe;gBAChB,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC;oBAAE,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC;gBACD,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;gBACvD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,MAAM;YACV,KAAK,YAAY;gBACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,MAAM;YACV,KAAK,eAAe;gBAChB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,MAAM;YACV,KAAK,YAAY;gBACb,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM;YACV;gBACI,MAAM;QACd,CAAC;IACL,CAAC;IAED,gBAAgB;QACZ,MAAM,KAAK,GAAa;YACpB,yEAAyE;YACzE,iCAAiC;YACjC,sBAAsB,IAAI,CAAC,WAAW,EAAE;YACxC,EAAE;YACF,mFAAmF;YACnF,kCAAkC;YAClC,yCAAyC,IAAI,CAAC,cAAc,EAAE;YAC9D,sCAAsC,IAAI,CAAC,WAAW,EAAE;YACxD,EAAE;YACF,kFAAkF;YAClF,4CAA4C;YAC5C,mCAAmC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACpE,qCAAqC,IAAI,CAAC,iBAAiB,EAAE;YAC7D,EAAE;YACF,wEAAwE;YACxE,yCAAyC;YACzC,4BAA4B,IAAI,CAAC,gBAAgB,EAAE;YACnD,EAAE;YACF,wEAAwE;YACxE,kCAAkC;YAClC,yCAAyC,IAAI,CAAC,cAAc,EAAE;YAC9D,sCAAsC,IAAI,CAAC,WAAW,EAAE;YACxD,EAAE;SACL,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACJ;AA1ED,gDA0EC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WorkflowEventEmitter } from '@siglo/core';
|
|
2
|
+
import { WorkflowExecutionStore } from '../store';
|
|
3
|
+
export interface ExpressMonitorOptions {
|
|
4
|
+
emitter?: WorkflowEventEmitter;
|
|
5
|
+
store?: WorkflowExecutionStore;
|
|
6
|
+
basePath?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function createExpressMonitorMiddleware(options?: ExpressMonitorOptions): (req: any, res: any, next: any) => any;
|
|
9
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAIlD,MAAM,WAAW,qBAAqB;IAClC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,8BAA8B,CAAC,OAAO,GAAE,qBAA0B,SAUjE,GAAG,OAAO,GAAG,QAAQ,GAAG,SAoBxC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createExpressMonitorMiddleware = createExpressMonitorMiddleware;
|
|
4
|
+
const core_1 = require("@siglo/core");
|
|
5
|
+
const store_1 = require("../store");
|
|
6
|
+
const sse_1 = require("../transports/sse");
|
|
7
|
+
const dashboard_1 = require("../ui/dashboard");
|
|
8
|
+
function createExpressMonitorMiddleware(options = {}) {
|
|
9
|
+
const store = options.store || new store_1.WorkflowExecutionStore();
|
|
10
|
+
const emitter = options.emitter || new core_1.WorkflowEventEmitter();
|
|
11
|
+
const sse = new sse_1.SSEBroadcaster();
|
|
12
|
+
emitter.on('*', (event) => {
|
|
13
|
+
store.addEvent(event);
|
|
14
|
+
sse.broadcast(event);
|
|
15
|
+
});
|
|
16
|
+
return (req, res, next) => {
|
|
17
|
+
const url = req.url || '/';
|
|
18
|
+
if (url === '' || url === '/' || url === '/index.html') {
|
|
19
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
20
|
+
return res.send((0, dashboard_1.getDashboardHtml)());
|
|
21
|
+
}
|
|
22
|
+
if (url.startsWith('/events')) {
|
|
23
|
+
const ns = req.query?.namespace;
|
|
24
|
+
return sse.addClient(res, ns);
|
|
25
|
+
}
|
|
26
|
+
if (url.startsWith('/api/workflows')) {
|
|
27
|
+
res.setHeader('Content-Type', 'application/json');
|
|
28
|
+
return res.json(store.listRuns());
|
|
29
|
+
}
|
|
30
|
+
next();
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":";;AAWA,wEA8BC;AAzCD,sCAAmD;AACnD,oCAAkD;AAClD,2CAAmD;AACnD,+CAAmD;AAQnD,SAAgB,8BAA8B,CAAC,UAAiC,EAAE;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,8BAAsB,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,2BAAoB,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,oBAAc,EAAE,CAAC;IAEjC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;QACtB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAE3B,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACrD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,IAAI,CAAC,IAAA,4BAAgB,GAAE,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;YAChC,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,EAAE,CAAC;IACX,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { WorkflowEventEmitter } from '@siglo/core';
|
|
2
|
+
import { WorkflowExecutionStore } from '../store';
|
|
3
|
+
export interface FastifyMonitorOptions {
|
|
4
|
+
emitter?: WorkflowEventEmitter;
|
|
5
|
+
store?: WorkflowExecutionStore;
|
|
6
|
+
}
|
|
7
|
+
export declare function fastifyMonitorPlugin(fastify: any, options: FastifyMonitorOptions, done: (err?: any) => void): void;
|
|
8
|
+
//# sourceMappingURL=fastify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../src/middleware/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAIlD,MAAM,WAAW,qBAAqB;IAClC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,QAyB3G"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fastifyMonitorPlugin = fastifyMonitorPlugin;
|
|
4
|
+
const core_1 = require("@siglo/core");
|
|
5
|
+
const store_1 = require("../store");
|
|
6
|
+
const sse_1 = require("../transports/sse");
|
|
7
|
+
const dashboard_1 = require("../ui/dashboard");
|
|
8
|
+
function fastifyMonitorPlugin(fastify, options, done) {
|
|
9
|
+
const store = options.store || new store_1.WorkflowExecutionStore();
|
|
10
|
+
const emitter = options.emitter || new core_1.WorkflowEventEmitter();
|
|
11
|
+
const sse = new sse_1.SSEBroadcaster();
|
|
12
|
+
emitter.on('*', (event) => {
|
|
13
|
+
store.addEvent(event);
|
|
14
|
+
sse.broadcast(event);
|
|
15
|
+
});
|
|
16
|
+
fastify.get('/', (req, reply) => {
|
|
17
|
+
reply.type('text/html; charset=utf-8').send((0, dashboard_1.getDashboardHtml)());
|
|
18
|
+
});
|
|
19
|
+
fastify.get('/events', (req, reply) => {
|
|
20
|
+
const rawRes = reply.raw;
|
|
21
|
+
const ns = req.query?.namespace;
|
|
22
|
+
sse.addClient(rawRes, ns);
|
|
23
|
+
});
|
|
24
|
+
fastify.get('/api/workflows', (req, reply) => {
|
|
25
|
+
reply.type('application/json').send(store.listRuns());
|
|
26
|
+
});
|
|
27
|
+
done();
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=fastify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/middleware/fastify.ts"],"names":[],"mappings":";;AAUA,oDAyBC;AAnCD,sCAAmD;AACnD,oCAAkD;AAClD,2CAAmD;AACnD,+CAAmD;AAOnD,SAAgB,oBAAoB,CAAC,OAAY,EAAE,OAA8B,EAAE,IAAyB;IACxG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,8BAAsB,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,2BAAoB,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,oBAAc,EAAE,CAAC;IAEjC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;QACtB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAQ,EAAE,KAAU,EAAE,EAAE;QACtC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAA,4BAAgB,GAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAQ,EAAE,KAAU,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;QACzB,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;QAChC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAQ,EAAE,KAAU,EAAE,EAAE;QACnD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { WorkflowEventEmitter } from '@siglo/core';
|
|
2
|
+
import { WorkflowExecutionStore } from '../store';
|
|
3
|
+
export interface HonoMonitorOptions {
|
|
4
|
+
emitter?: WorkflowEventEmitter;
|
|
5
|
+
store?: WorkflowExecutionStore;
|
|
6
|
+
}
|
|
7
|
+
export declare function honoMonitorMiddleware(options?: HonoMonitorOptions): (c: any, next: any) => Promise<any>;
|
|
8
|
+
//# sourceMappingURL=hono.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/middleware/hono.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAIlD,MAAM,WAAW,kBAAkB;IAC/B,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,kBAAuB,OAUjD,GAAG,QAAQ,GAAG,kBAUlC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.honoMonitorMiddleware = honoMonitorMiddleware;
|
|
4
|
+
const core_1 = require("@siglo/core");
|
|
5
|
+
const store_1 = require("../store");
|
|
6
|
+
const sse_1 = require("../transports/sse");
|
|
7
|
+
const dashboard_1 = require("../ui/dashboard");
|
|
8
|
+
function honoMonitorMiddleware(options = {}) {
|
|
9
|
+
const store = options.store || new store_1.WorkflowExecutionStore();
|
|
10
|
+
const emitter = options.emitter || new core_1.WorkflowEventEmitter();
|
|
11
|
+
const sse = new sse_1.SSEBroadcaster();
|
|
12
|
+
emitter.on('*', (event) => {
|
|
13
|
+
store.addEvent(event);
|
|
14
|
+
sse.broadcast(event);
|
|
15
|
+
});
|
|
16
|
+
return async (c, next) => {
|
|
17
|
+
const path = c.req.path;
|
|
18
|
+
if (path === '' || path === '/' || path.endsWith('/dashboard')) {
|
|
19
|
+
return c.html((0, dashboard_1.getDashboardHtml)());
|
|
20
|
+
}
|
|
21
|
+
if (path.endsWith('/api/workflows')) {
|
|
22
|
+
return c.json(store.listRuns());
|
|
23
|
+
}
|
|
24
|
+
await next();
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=hono.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/middleware/hono.ts"],"names":[],"mappings":";;AAUA,sDAoBC;AA9BD,sCAAmD;AACnD,oCAAkD;AAClD,2CAAmD;AACnD,+CAAmD;AAOnD,SAAgB,qBAAqB,CAAC,UAA8B,EAAE;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,8BAAsB,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,2BAAoB,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,oBAAc,EAAE,CAAC;IAEjC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;QACtB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,EAAE,CAAM,EAAE,IAAS,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,4BAAgB,GAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;IACjB,CAAC,CAAC;AACN,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as http from 'http';
|
|
2
|
+
import { WorkflowEventEmitter } from '@siglo/core';
|
|
3
|
+
import { MonitorServerOptions } from './types';
|
|
4
|
+
import { WorkflowExecutionStore } from './store';
|
|
5
|
+
import { SSEBroadcaster } from './transports/sse';
|
|
6
|
+
import { WebSocketBroadcaster } from './transports/websocket';
|
|
7
|
+
import { PrometheusExporter } from './metrics';
|
|
8
|
+
export interface MonitorServerInstance {
|
|
9
|
+
server: http.Server;
|
|
10
|
+
port: number;
|
|
11
|
+
host: string;
|
|
12
|
+
emitter: WorkflowEventEmitter;
|
|
13
|
+
store: WorkflowExecutionStore;
|
|
14
|
+
workflows: Map<string, any>;
|
|
15
|
+
sse: SSEBroadcaster;
|
|
16
|
+
ws: WebSocketBroadcaster;
|
|
17
|
+
metrics: PrometheusExporter;
|
|
18
|
+
close: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns an active monitor server instance running in the current process.
|
|
22
|
+
* If a port is specified, returns the server on that port, otherwise returns the first active server.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getActiveMonitorServer(port?: number): MonitorServerInstance | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Returns the WorkflowEventEmitter of the currently active monitor server in the process.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getMonitorEmitter(port?: number): WorkflowEventEmitter | undefined;
|
|
29
|
+
export declare function createMonitorServer(options?: MonitorServerOptions): Promise<MonitorServerInstance>;
|
|
30
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAiF,oBAAoB,EAAC,MAAM,aAAa,CAAC;AACjI,OAAO,EAAqD,oBAAoB,EAAC,MAAM,SAAS,CAAC;AACjG,OAAO,EAAC,sBAAsB,EAAC,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAC,kBAAkB,EAAC,MAAM,WAAW,CAAC;AAG7C,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,GAAG,EAAE,cAAc,CAAC;IACpB,EAAE,EAAE,oBAAoB,CAAC;IACzB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AA4FD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAMvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAEjF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA+XtG"}
|