@orbytautomation/engine 0.8.3 → 0.9.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 +127 -108
- package/dist/core/EngineConfig.d.ts +1 -1
- package/dist/core/EngineConfig.d.ts.map +1 -1
- package/dist/core/EngineConfig.js +55 -0
- package/dist/core/EngineConfig.js.map +1 -1
- package/dist/core/OrbytEngine.d.ts +27 -1
- package/dist/core/OrbytEngine.d.ts.map +1 -1
- package/dist/core/OrbytEngine.js +475 -6
- package/dist/core/OrbytEngine.js.map +1 -1
- package/dist/distributed/DistributedStepWorker.d.ts +40 -0
- package/dist/distributed/DistributedStepWorker.d.ts.map +1 -0
- package/dist/distributed/DistributedStepWorker.js +96 -0
- package/dist/distributed/DistributedStepWorker.js.map +1 -0
- package/dist/distributed/DistributedWorkflowOrchestrator.d.ts +51 -0
- package/dist/distributed/DistributedWorkflowOrchestrator.d.ts.map +1 -0
- package/dist/distributed/DistributedWorkflowOrchestrator.js +430 -0
- package/dist/distributed/DistributedWorkflowOrchestrator.js.map +1 -0
- package/dist/distributed/FileDistributedJobQueue.d.ts +29 -0
- package/dist/distributed/FileDistributedJobQueue.d.ts.map +1 -0
- package/dist/distributed/FileDistributedJobQueue.js +170 -0
- package/dist/distributed/FileDistributedJobQueue.js.map +1 -0
- package/dist/distributed/InMemoryDistributedJobQueue.d.ts +26 -0
- package/dist/distributed/InMemoryDistributedJobQueue.d.ts.map +1 -0
- package/dist/distributed/InMemoryDistributedJobQueue.js +130 -0
- package/dist/distributed/InMemoryDistributedJobQueue.js.map +1 -0
- package/dist/distributed/index.d.ts +5 -0
- package/dist/distributed/index.d.ts.map +1 -0
- package/dist/distributed/index.js +5 -0
- package/dist/distributed/index.js.map +1 -0
- package/dist/errors/FieldRegistry.d.ts +6 -2
- package/dist/errors/FieldRegistry.d.ts.map +1 -1
- package/dist/errors/FieldRegistry.js +11 -0
- package/dist/errors/FieldRegistry.js.map +1 -1
- package/dist/execution/ExecutionEngine.d.ts.map +1 -1
- package/dist/execution/ExecutionEngine.js +2 -1
- package/dist/execution/ExecutionEngine.js.map +1 -1
- package/dist/execution/InternalExecutionContext.d.ts.map +1 -1
- package/dist/execution/InternalExecutionContext.js +3 -1
- package/dist/execution/InternalExecutionContext.js.map +1 -1
- package/dist/execution/WorkflowExecutor.d.ts +5 -0
- package/dist/execution/WorkflowExecutor.d.ts.map +1 -1
- package/dist/execution/WorkflowExecutor.js +195 -7
- package/dist/execution/WorkflowExecutor.js.map +1 -1
- package/dist/explanation/ExplanationGenerator.d.ts.map +1 -1
- package/dist/explanation/ExplanationGenerator.js +6 -0
- package/dist/explanation/ExplanationGenerator.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/parser/SchemaValidator.d.ts +13 -0
- package/dist/parser/SchemaValidator.d.ts.map +1 -1
- package/dist/parser/SchemaValidator.js +175 -1
- package/dist/parser/SchemaValidator.js.map +1 -1
- package/dist/parser/WorkflowParser.d.ts +5 -0
- package/dist/parser/WorkflowParser.d.ts.map +1 -1
- package/dist/parser/WorkflowParser.js +20 -0
- package/dist/parser/WorkflowParser.js.map +1 -1
- package/dist/scheduling/JobScheduler.d.ts +12 -0
- package/dist/scheduling/JobScheduler.d.ts.map +1 -1
- package/dist/scheduling/JobScheduler.js +136 -20
- package/dist/scheduling/JobScheduler.js.map +1 -1
- package/dist/scheduling/Scheduler.d.ts +3 -0
- package/dist/scheduling/Scheduler.d.ts.map +1 -1
- package/dist/scheduling/Scheduler.js +3 -0
- package/dist/scheduling/Scheduler.js.map +1 -1
- package/dist/scheduling/workers/workflow-worker.js +59 -3
- package/dist/scheduling/workers/workflow-worker.js.map +1 -1
- package/dist/storage/CheckpointStore.d.ts +59 -0
- package/dist/storage/CheckpointStore.d.ts.map +1 -0
- package/dist/storage/CheckpointStore.js +62 -0
- package/dist/storage/CheckpointStore.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/testing/integration/distributed/distributed-smoke.d.ts +3 -0
- package/dist/testing/integration/distributed/distributed-smoke.d.ts.map +1 -0
- package/dist/testing/integration/distributed/distributed-smoke.js +80 -0
- package/dist/testing/integration/distributed/distributed-smoke.js.map +1 -0
- package/dist/types/core-types.d.ts +278 -1
- package/dist/types/core-types.d.ts.map +1 -1
- package/dist/types/core-types.js.map +1 -1
- package/dist/usage/FileSpoolUsageCollector.d.ts +74 -0
- package/dist/usage/FileSpoolUsageCollector.d.ts.map +1 -0
- package/dist/usage/FileSpoolUsageCollector.js +225 -0
- package/dist/usage/FileSpoolUsageCollector.js.map +1 -0
- package/dist/usage/NoOpUsageCollector.d.ts +35 -0
- package/dist/usage/NoOpUsageCollector.d.ts.map +1 -0
- package/dist/usage/NoOpUsageCollector.js +40 -0
- package/dist/usage/NoOpUsageCollector.js.map +1 -0
- package/dist/usage/UsageEventFactory.d.ts +80 -0
- package/dist/usage/UsageEventFactory.d.ts.map +1 -0
- package/dist/usage/UsageEventFactory.js +117 -0
- package/dist/usage/UsageEventFactory.js.map +1 -0
- package/dist/usage/index.d.ts +11 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +11 -0
- package/dist/usage/index.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { UsageCollector, UsageEvent } from '@dev-ecosystem/core';
|
|
2
|
+
/**
|
|
3
|
+
* Transport contract for shipping usage batches to an external ingestion endpoint.
|
|
4
|
+
*/
|
|
5
|
+
export interface UsageBatchTransport {
|
|
6
|
+
sendBatch(events: UsageEvent[]): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export interface HttpUsageBatchTransportOptions {
|
|
9
|
+
endpoint: string;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Minimal HTTP transport used by the file spool collector.
|
|
15
|
+
*
|
|
16
|
+
* The collector remains durable even if this transport is down because pending
|
|
17
|
+
* files are retried later.
|
|
18
|
+
*/
|
|
19
|
+
export declare class HttpUsageBatchTransport implements UsageBatchTransport {
|
|
20
|
+
private readonly endpoint;
|
|
21
|
+
private readonly apiKey?;
|
|
22
|
+
private readonly timeoutMs;
|
|
23
|
+
constructor(options: HttpUsageBatchTransportOptions);
|
|
24
|
+
sendBatch(events: UsageEvent[]): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export interface FileSpoolUsageCollectorOptions {
|
|
27
|
+
baseDir: string;
|
|
28
|
+
batchSize?: number;
|
|
29
|
+
flushIntervalMs?: number;
|
|
30
|
+
maxRetryAttempts?: number;
|
|
31
|
+
transport?: UsageBatchTransport;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Durable usage collector backed by filesystem spool directories.
|
|
35
|
+
*
|
|
36
|
+
* Storage layout under baseDir:
|
|
37
|
+
* - pending/: unsent envelopes
|
|
38
|
+
* - sent/: successfully delivered envelopes
|
|
39
|
+
* - failed/: envelopes that exceeded retry attempts
|
|
40
|
+
* - events/: append-only raw JSONL archive by day
|
|
41
|
+
*
|
|
42
|
+
* All operations are intentionally non-fatal so billing telemetry never blocks
|
|
43
|
+
* workflow execution.
|
|
44
|
+
*/
|
|
45
|
+
export declare class FileSpoolUsageCollector implements UsageCollector {
|
|
46
|
+
readonly contractVersion: "1.0";
|
|
47
|
+
readonly target: "billing-engine";
|
|
48
|
+
private readonly baseDir;
|
|
49
|
+
private readonly pendingDir;
|
|
50
|
+
private readonly sentDir;
|
|
51
|
+
private readonly failedDir;
|
|
52
|
+
private readonly eventsDir;
|
|
53
|
+
private readonly batchSize;
|
|
54
|
+
private readonly flushIntervalMs;
|
|
55
|
+
private readonly maxRetryAttempts;
|
|
56
|
+
private readonly transport?;
|
|
57
|
+
private flushTimer?;
|
|
58
|
+
private isFlushing;
|
|
59
|
+
private lastSuccessAt?;
|
|
60
|
+
constructor(options: FileSpoolUsageCollectorOptions);
|
|
61
|
+
record(event: UsageEvent): Promise<void>;
|
|
62
|
+
recordBatch(events: UsageEvent[]): Promise<void>;
|
|
63
|
+
flush(): Promise<void>;
|
|
64
|
+
healthCheck(): Promise<{
|
|
65
|
+
healthy: boolean;
|
|
66
|
+
detail?: string;
|
|
67
|
+
lastSuccessAt?: number;
|
|
68
|
+
}>;
|
|
69
|
+
close(): Promise<void>;
|
|
70
|
+
private ensureDirs;
|
|
71
|
+
private fileNameForEvent;
|
|
72
|
+
private readEnvelope;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=FileSpoolUsageCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSpoolUsageCollector.d.ts","sourceRoot":"","sources":["../../src/usage/FileSpoolUsageCollector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,8BAA8B;IAM7C,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBvD;AASD,MAAM,WAAW,8BAA8B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,cAAc;IAC1D,QAAQ,CAAC,eAAe,EAAG,KAAK,CAAU;IAC1C,QAAQ,CAAC,MAAM,EAAG,gBAAgB,CAAU;IAE5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAsB;IAEjD,OAAO,CAAC,UAAU,CAAC,CAAiC;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,OAAO,EAAE,8BAA8B;IAsB7C,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxC,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwEtB,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBrF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,YAAY;CAQvB"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Minimal HTTP transport used by the file spool collector.
|
|
5
|
+
*
|
|
6
|
+
* The collector remains durable even if this transport is down because pending
|
|
7
|
+
* files are retried later.
|
|
8
|
+
*/
|
|
9
|
+
export class HttpUsageBatchTransport {
|
|
10
|
+
endpoint;
|
|
11
|
+
apiKey;
|
|
12
|
+
timeoutMs;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.endpoint = options.endpoint;
|
|
15
|
+
this.apiKey = options.apiKey;
|
|
16
|
+
this.timeoutMs = options.timeoutMs ?? 10_000;
|
|
17
|
+
}
|
|
18
|
+
async sendBatch(events) {
|
|
19
|
+
const controller = new AbortController();
|
|
20
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch(this.endpoint, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: {
|
|
25
|
+
'content-type': 'application/json',
|
|
26
|
+
...(this.apiKey ? { authorization: `Bearer ${this.apiKey}` } : {}),
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify({ events }),
|
|
29
|
+
signal: controller.signal,
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`Billing ingestion failed (${response.status})`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
clearTimeout(timeout);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Durable usage collector backed by filesystem spool directories.
|
|
42
|
+
*
|
|
43
|
+
* Storage layout under baseDir:
|
|
44
|
+
* - pending/: unsent envelopes
|
|
45
|
+
* - sent/: successfully delivered envelopes
|
|
46
|
+
* - failed/: envelopes that exceeded retry attempts
|
|
47
|
+
* - events/: append-only raw JSONL archive by day
|
|
48
|
+
*
|
|
49
|
+
* All operations are intentionally non-fatal so billing telemetry never blocks
|
|
50
|
+
* workflow execution.
|
|
51
|
+
*/
|
|
52
|
+
export class FileSpoolUsageCollector {
|
|
53
|
+
contractVersion = '1.0';
|
|
54
|
+
target = 'billing-engine';
|
|
55
|
+
baseDir;
|
|
56
|
+
pendingDir;
|
|
57
|
+
sentDir;
|
|
58
|
+
failedDir;
|
|
59
|
+
eventsDir;
|
|
60
|
+
batchSize;
|
|
61
|
+
flushIntervalMs;
|
|
62
|
+
maxRetryAttempts;
|
|
63
|
+
transport;
|
|
64
|
+
flushTimer;
|
|
65
|
+
isFlushing = false;
|
|
66
|
+
lastSuccessAt;
|
|
67
|
+
constructor(options) {
|
|
68
|
+
this.baseDir = options.baseDir;
|
|
69
|
+
this.pendingDir = join(this.baseDir, 'pending');
|
|
70
|
+
this.sentDir = join(this.baseDir, 'sent');
|
|
71
|
+
this.failedDir = join(this.baseDir, 'failed');
|
|
72
|
+
this.eventsDir = join(this.baseDir, 'events');
|
|
73
|
+
this.batchSize = options.batchSize ?? 200;
|
|
74
|
+
this.flushIntervalMs = options.flushIntervalMs ?? 60_000;
|
|
75
|
+
this.maxRetryAttempts = options.maxRetryAttempts ?? 10;
|
|
76
|
+
this.transport = options.transport;
|
|
77
|
+
this.ensureDirs();
|
|
78
|
+
if (this.transport) {
|
|
79
|
+
// Background flush is best-effort; explicit close() also triggers a flush.
|
|
80
|
+
this.flushTimer = setInterval(() => {
|
|
81
|
+
void this.flush();
|
|
82
|
+
}, this.flushIntervalMs);
|
|
83
|
+
this.flushTimer.unref?.();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async record(event) {
|
|
87
|
+
try {
|
|
88
|
+
this.ensureDirs();
|
|
89
|
+
const envelope = {
|
|
90
|
+
event,
|
|
91
|
+
retries: 0,
|
|
92
|
+
firstSeenAt: Date.now(),
|
|
93
|
+
};
|
|
94
|
+
const pendingFile = join(this.pendingDir, this.fileNameForEvent(event));
|
|
95
|
+
writeFileSync(pendingFile, JSON.stringify(envelope, null, 2), 'utf8');
|
|
96
|
+
// Keep an immutable day-partitioned archive for audits/reconciliation.
|
|
97
|
+
const day = new Date(event.timestamp).toISOString().slice(0, 10);
|
|
98
|
+
const archiveFile = join(this.eventsDir, `${day}.jsonl`);
|
|
99
|
+
appendFileSync(archiveFile, `${JSON.stringify(event)}\n`, 'utf8');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Non-fatal by design
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async recordBatch(events) {
|
|
106
|
+
for (const event of events) {
|
|
107
|
+
await this.record(event);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async flush() {
|
|
111
|
+
if (!this.transport || this.isFlushing) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this.isFlushing = true;
|
|
115
|
+
try {
|
|
116
|
+
this.ensureDirs();
|
|
117
|
+
const files = readdirSync(this.pendingDir)
|
|
118
|
+
.filter((name) => name.endsWith('.json'))
|
|
119
|
+
.sort();
|
|
120
|
+
for (let i = 0; i < files.length; i += this.batchSize) {
|
|
121
|
+
const chunk = files.slice(i, i + this.batchSize);
|
|
122
|
+
const envelopes = chunk
|
|
123
|
+
.map((name) => ({
|
|
124
|
+
name,
|
|
125
|
+
path: join(this.pendingDir, name),
|
|
126
|
+
}))
|
|
127
|
+
.map(({ name, path }) => ({
|
|
128
|
+
name,
|
|
129
|
+
path,
|
|
130
|
+
envelope: this.readEnvelope(path),
|
|
131
|
+
}))
|
|
132
|
+
.filter((entry) => entry.envelope !== null);
|
|
133
|
+
if (envelopes.length === 0) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const events = envelopes.map((entry) => entry.envelope.event);
|
|
137
|
+
try {
|
|
138
|
+
await this.transport.sendBatch(events);
|
|
139
|
+
this.lastSuccessAt = Date.now();
|
|
140
|
+
// Move successfully sent files out of pending atomically.
|
|
141
|
+
for (const entry of envelopes) {
|
|
142
|
+
const target = join(this.sentDir, entry.name);
|
|
143
|
+
renameSync(entry.path, target);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
148
|
+
for (const entry of envelopes) {
|
|
149
|
+
const retries = entry.envelope.retries + 1;
|
|
150
|
+
const updated = {
|
|
151
|
+
...entry.envelope,
|
|
152
|
+
retries,
|
|
153
|
+
lastError: errorMessage,
|
|
154
|
+
};
|
|
155
|
+
if (retries >= this.maxRetryAttempts) {
|
|
156
|
+
// Preserve terminal failure context for manual replay.
|
|
157
|
+
const failedPath = join(this.failedDir, `${Date.now()}-${entry.name}`);
|
|
158
|
+
writeFileSync(failedPath, JSON.stringify(updated, null, 2), 'utf8');
|
|
159
|
+
unlinkSync(entry.path);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
writeFileSync(entry.path, JSON.stringify(updated, null, 2), 'utf8');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Non-fatal by design
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
this.isFlushing = false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async healthCheck() {
|
|
177
|
+
try {
|
|
178
|
+
this.ensureDirs();
|
|
179
|
+
const pending = readdirSync(this.pendingDir).filter((f) => f.endsWith('.json')).length;
|
|
180
|
+
const failed = readdirSync(this.failedDir).filter((f) => f.endsWith('.json')).length;
|
|
181
|
+
return {
|
|
182
|
+
healthy: true,
|
|
183
|
+
detail: `pending=${pending}, failed=${failed}`,
|
|
184
|
+
lastSuccessAt: this.lastSuccessAt,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return {
|
|
189
|
+
healthy: false,
|
|
190
|
+
detail: 'Unable to inspect usage spool directories',
|
|
191
|
+
lastSuccessAt: this.lastSuccessAt,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async close() {
|
|
196
|
+
if (this.flushTimer) {
|
|
197
|
+
clearInterval(this.flushTimer);
|
|
198
|
+
this.flushTimer = undefined;
|
|
199
|
+
}
|
|
200
|
+
await this.flush();
|
|
201
|
+
}
|
|
202
|
+
ensureDirs() {
|
|
203
|
+
for (const dir of [this.baseDir, this.pendingDir, this.sentDir, this.failedDir, this.eventsDir]) {
|
|
204
|
+
if (!existsSync(dir)) {
|
|
205
|
+
mkdirSync(dir, { recursive: true });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
fileNameForEvent(event) {
|
|
210
|
+
// Keep names filesystem-safe and mostly time-ordered.
|
|
211
|
+
const ts = String(event.timestamp);
|
|
212
|
+
const id = event.id.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
213
|
+
return `${ts}-${id}.json`;
|
|
214
|
+
}
|
|
215
|
+
readEnvelope(path) {
|
|
216
|
+
try {
|
|
217
|
+
const raw = readFileSync(path, 'utf8');
|
|
218
|
+
return JSON.parse(raw);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=FileSpoolUsageCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSpoolUsageCollector.js","sourceRoot":"","sources":["../../src/usage/FileSpoolUsageCollector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-Op Usage Collector
|
|
3
|
+
*
|
|
4
|
+
* Default usage collector that silently drops all events.
|
|
5
|
+
* Used when no collector is configured.
|
|
6
|
+
*
|
|
7
|
+
* This ensures:
|
|
8
|
+
* - No execution blocking
|
|
9
|
+
* - No external dependencies required
|
|
10
|
+
* - Zero cost if usage tracking is not enabled
|
|
11
|
+
*
|
|
12
|
+
* @module usage
|
|
13
|
+
*/
|
|
14
|
+
import type { UsageCollector, UsageEvent } from '@dev-ecosystem/core';
|
|
15
|
+
/**
|
|
16
|
+
* No-operation usage collector
|
|
17
|
+
*
|
|
18
|
+
* Implements the UsageCollector interface but does nothing with events.
|
|
19
|
+
* Used as the default collector when none is explicitly configured.
|
|
20
|
+
*/
|
|
21
|
+
export declare class NoOpUsageCollector implements UsageCollector {
|
|
22
|
+
/**
|
|
23
|
+
* Record a single usage event (does nothing)
|
|
24
|
+
*/
|
|
25
|
+
record(_event: UsageEvent): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Record multiple usage events in batch (does nothing)
|
|
28
|
+
*/
|
|
29
|
+
recordBatch(_events: UsageEvent[]): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Flush pending events (does nothing)
|
|
32
|
+
*/
|
|
33
|
+
flush(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=NoOpUsageCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoOpUsageCollector.d.ts","sourceRoot":"","sources":["../../src/usage/NoOpUsageCollector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtE;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-Op Usage Collector
|
|
3
|
+
*
|
|
4
|
+
* Default usage collector that silently drops all events.
|
|
5
|
+
* Used when no collector is configured.
|
|
6
|
+
*
|
|
7
|
+
* This ensures:
|
|
8
|
+
* - No execution blocking
|
|
9
|
+
* - No external dependencies required
|
|
10
|
+
* - Zero cost if usage tracking is not enabled
|
|
11
|
+
*
|
|
12
|
+
* @module usage
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* No-operation usage collector
|
|
16
|
+
*
|
|
17
|
+
* Implements the UsageCollector interface but does nothing with events.
|
|
18
|
+
* Used as the default collector when none is explicitly configured.
|
|
19
|
+
*/
|
|
20
|
+
export class NoOpUsageCollector {
|
|
21
|
+
/**
|
|
22
|
+
* Record a single usage event (does nothing)
|
|
23
|
+
*/
|
|
24
|
+
async record(_event) {
|
|
25
|
+
// No-op
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Record multiple usage events in batch (does nothing)
|
|
29
|
+
*/
|
|
30
|
+
async recordBatch(_events) {
|
|
31
|
+
// No-op
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Flush pending events (does nothing)
|
|
35
|
+
*/
|
|
36
|
+
async flush() {
|
|
37
|
+
// No-op
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=NoOpUsageCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoOpUsageCollector.js","sourceRoot":"","sources":["../../src/usage/NoOpUsageCollector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAkB;QAC7B,QAAQ;IACV,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAqB;QACrC,QAAQ;IACV,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,QAAQ;IACV,CAAC;CACF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Event Factory
|
|
3
|
+
*
|
|
4
|
+
* Helper utilities for creating consistent usage events.
|
|
5
|
+
* Handles ID generation, timestamps, and defaults.
|
|
6
|
+
*
|
|
7
|
+
* @module usage
|
|
8
|
+
*/
|
|
9
|
+
import type { UsageEvent, UsageEventMetadata } from '@dev-ecosystem/core';
|
|
10
|
+
/**
|
|
11
|
+
* Generate a unique event ID
|
|
12
|
+
*
|
|
13
|
+
* Uses random UUID-like format for distributed uniqueness.
|
|
14
|
+
* Format: timestamp-random (millisecond precision + random suffix)
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateUsageEventId(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Create a workflow run usage event
|
|
19
|
+
*/
|
|
20
|
+
export declare function createWorkflowRunEvent(options: {
|
|
21
|
+
executionId: string;
|
|
22
|
+
workflowId?: string;
|
|
23
|
+
userId?: string;
|
|
24
|
+
workspaceId?: string;
|
|
25
|
+
metadata?: UsageEventMetadata;
|
|
26
|
+
executionMode?: string;
|
|
27
|
+
pricingTier?: string;
|
|
28
|
+
billable?: boolean;
|
|
29
|
+
}): UsageEvent;
|
|
30
|
+
/**
|
|
31
|
+
* Create a step execution usage event
|
|
32
|
+
*/
|
|
33
|
+
export declare function createStepExecuteEvent(options: {
|
|
34
|
+
executionId: string;
|
|
35
|
+
stepId: string;
|
|
36
|
+
workflowId?: string;
|
|
37
|
+
userId?: string;
|
|
38
|
+
workspaceId?: string;
|
|
39
|
+
adapterType?: string;
|
|
40
|
+
adapterName?: string;
|
|
41
|
+
durationMs?: number;
|
|
42
|
+
success?: boolean;
|
|
43
|
+
retries?: number;
|
|
44
|
+
error?: string;
|
|
45
|
+
metadata?: UsageEventMetadata;
|
|
46
|
+
pricingTier?: string;
|
|
47
|
+
billable?: boolean;
|
|
48
|
+
}): UsageEvent;
|
|
49
|
+
/**
|
|
50
|
+
* Create an adapter call usage event
|
|
51
|
+
*/
|
|
52
|
+
export declare function createAdapterCallEvent(options: {
|
|
53
|
+
executionId: string;
|
|
54
|
+
stepId?: string;
|
|
55
|
+
adapterType: string;
|
|
56
|
+
adapterName?: string;
|
|
57
|
+
workflowId?: string;
|
|
58
|
+
userId?: string;
|
|
59
|
+
workspaceId?: string;
|
|
60
|
+
durationMs?: number;
|
|
61
|
+
success?: boolean;
|
|
62
|
+
retries?: number;
|
|
63
|
+
error?: string;
|
|
64
|
+
metadata?: UsageEventMetadata;
|
|
65
|
+
pricingTier?: string;
|
|
66
|
+
billable?: boolean;
|
|
67
|
+
}): UsageEvent;
|
|
68
|
+
/**
|
|
69
|
+
* Create a trigger fire usage event
|
|
70
|
+
*/
|
|
71
|
+
export declare function createTriggerFireEvent(options: {
|
|
72
|
+
executionId: string;
|
|
73
|
+
workflowId?: string;
|
|
74
|
+
userId?: string;
|
|
75
|
+
workspaceId?: string;
|
|
76
|
+
metadata?: UsageEventMetadata;
|
|
77
|
+
pricingTier?: string;
|
|
78
|
+
billable?: boolean;
|
|
79
|
+
}): UsageEvent;
|
|
80
|
+
//# sourceMappingURL=UsageEventFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageEventFactory.d.ts","sourceRoot":"","sources":["../../src/usage/UsageEventFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG1E;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,UAAU,CAiBb;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,UAAU,CAuBb;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,UAAU,CAuBb;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,UAAU,CAgBb"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Event Factory
|
|
3
|
+
*
|
|
4
|
+
* Helper utilities for creating consistent usage events.
|
|
5
|
+
* Handles ID generation, timestamps, and defaults.
|
|
6
|
+
*
|
|
7
|
+
* @module usage
|
|
8
|
+
*/
|
|
9
|
+
import { randomBytes } from 'node:crypto';
|
|
10
|
+
import { UsageEventType as CoreUsageEventType } from '@dev-ecosystem/core';
|
|
11
|
+
/**
|
|
12
|
+
* Generate a unique event ID
|
|
13
|
+
*
|
|
14
|
+
* Uses random UUID-like format for distributed uniqueness.
|
|
15
|
+
* Format: timestamp-random (millisecond precision + random suffix)
|
|
16
|
+
*/
|
|
17
|
+
export function generateUsageEventId() {
|
|
18
|
+
const timestamp = Date.now().toString(36);
|
|
19
|
+
const random = randomBytes(8).toString('hex');
|
|
20
|
+
return `${timestamp}-${random}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a workflow run usage event
|
|
24
|
+
*/
|
|
25
|
+
export function createWorkflowRunEvent(options) {
|
|
26
|
+
return {
|
|
27
|
+
id: generateUsageEventId(),
|
|
28
|
+
type: CoreUsageEventType.WORKFLOW_RUN,
|
|
29
|
+
timestamp: Date.now(),
|
|
30
|
+
product: 'orbyt',
|
|
31
|
+
executionId: options.executionId,
|
|
32
|
+
workflowId: options.workflowId,
|
|
33
|
+
userId: options.userId,
|
|
34
|
+
workspaceId: options.workspaceId,
|
|
35
|
+
executionMode: options.executionMode,
|
|
36
|
+
pricingTier: options.pricingTier,
|
|
37
|
+
billable: options.billable ?? true,
|
|
38
|
+
metadata: options.metadata ?? {
|
|
39
|
+
success: true,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a step execution usage event
|
|
45
|
+
*/
|
|
46
|
+
export function createStepExecuteEvent(options) {
|
|
47
|
+
return {
|
|
48
|
+
id: generateUsageEventId(),
|
|
49
|
+
type: CoreUsageEventType.STEP_EXECUTE,
|
|
50
|
+
timestamp: Date.now(),
|
|
51
|
+
product: 'orbyt',
|
|
52
|
+
executionId: options.executionId,
|
|
53
|
+
stepId: options.stepId,
|
|
54
|
+
workflowId: options.workflowId,
|
|
55
|
+
userId: options.userId,
|
|
56
|
+
workspaceId: options.workspaceId,
|
|
57
|
+
adapterType: options.adapterType,
|
|
58
|
+
adapterName: options.adapterName,
|
|
59
|
+
pricingTier: options.pricingTier,
|
|
60
|
+
billable: options.billable ?? true,
|
|
61
|
+
metadata: {
|
|
62
|
+
...options.metadata,
|
|
63
|
+
durationMs: options.durationMs,
|
|
64
|
+
success: options.success ?? true,
|
|
65
|
+
retries: options.retries ?? 0,
|
|
66
|
+
...(options.error && { error: options.error }),
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create an adapter call usage event
|
|
72
|
+
*/
|
|
73
|
+
export function createAdapterCallEvent(options) {
|
|
74
|
+
return {
|
|
75
|
+
id: generateUsageEventId(),
|
|
76
|
+
type: CoreUsageEventType.ADAPTER_CALL,
|
|
77
|
+
timestamp: Date.now(),
|
|
78
|
+
product: 'orbyt',
|
|
79
|
+
executionId: options.executionId,
|
|
80
|
+
stepId: options.stepId,
|
|
81
|
+
workflowId: options.workflowId,
|
|
82
|
+
userId: options.userId,
|
|
83
|
+
workspaceId: options.workspaceId,
|
|
84
|
+
adapterType: options.adapterType,
|
|
85
|
+
adapterName: options.adapterName,
|
|
86
|
+
pricingTier: options.pricingTier,
|
|
87
|
+
billable: options.billable ?? true,
|
|
88
|
+
metadata: {
|
|
89
|
+
...options.metadata,
|
|
90
|
+
durationMs: options.durationMs,
|
|
91
|
+
success: options.success ?? true,
|
|
92
|
+
retries: options.retries ?? 0,
|
|
93
|
+
...(options.error && { error: options.error }),
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create a trigger fire usage event
|
|
99
|
+
*/
|
|
100
|
+
export function createTriggerFireEvent(options) {
|
|
101
|
+
return {
|
|
102
|
+
id: generateUsageEventId(),
|
|
103
|
+
type: CoreUsageEventType.TRIGGER_FIRE,
|
|
104
|
+
timestamp: Date.now(),
|
|
105
|
+
product: 'orbyt',
|
|
106
|
+
executionId: options.executionId,
|
|
107
|
+
workflowId: options.workflowId,
|
|
108
|
+
userId: options.userId,
|
|
109
|
+
workspaceId: options.workspaceId,
|
|
110
|
+
pricingTier: options.pricingTier,
|
|
111
|
+
billable: options.billable ?? true,
|
|
112
|
+
metadata: options.metadata ?? {
|
|
113
|
+
success: true,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=UsageEventFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageEventFactory.js","sourceRoot":"","sources":["../../src/usage/UsageEventFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Event Collection and Emission
|
|
3
|
+
*
|
|
4
|
+
* Implements canonical usage event recording for billing, analytics, and quotas.
|
|
5
|
+
*
|
|
6
|
+
* @module usage
|
|
7
|
+
*/
|
|
8
|
+
export { NoOpUsageCollector } from './NoOpUsageCollector.js';
|
|
9
|
+
export { FileSpoolUsageCollector, HttpUsageBatchTransport, type UsageBatchTransport } from './FileSpoolUsageCollector.js';
|
|
10
|
+
export { generateUsageEventId, createWorkflowRunEvent, createStepExecuteEvent, createAdapterCallEvent, createTriggerFireEvent, } from './UsageEventFactory.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC1H,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Event Collection and Emission
|
|
3
|
+
*
|
|
4
|
+
* Implements canonical usage event recording for billing, analytics, and quotas.
|
|
5
|
+
*
|
|
6
|
+
* @module usage
|
|
7
|
+
*/
|
|
8
|
+
export { NoOpUsageCollector } from './NoOpUsageCollector.js';
|
|
9
|
+
export { FileSpoolUsageCollector, HttpUsageBatchTransport } from './FileSpoolUsageCollector.js';
|
|
10
|
+
export { generateUsageEventId, createWorkflowRunEvent, createStepExecuteEvent, createAdapterCallEvent, createTriggerFireEvent, } from './UsageEventFactory.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAA4B,MAAM,8BAA8B,CAAC;AAC1H,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|