@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.
Files changed (100) hide show
  1. package/README.md +127 -108
  2. package/dist/core/EngineConfig.d.ts +1 -1
  3. package/dist/core/EngineConfig.d.ts.map +1 -1
  4. package/dist/core/EngineConfig.js +55 -0
  5. package/dist/core/EngineConfig.js.map +1 -1
  6. package/dist/core/OrbytEngine.d.ts +27 -1
  7. package/dist/core/OrbytEngine.d.ts.map +1 -1
  8. package/dist/core/OrbytEngine.js +475 -6
  9. package/dist/core/OrbytEngine.js.map +1 -1
  10. package/dist/distributed/DistributedStepWorker.d.ts +40 -0
  11. package/dist/distributed/DistributedStepWorker.d.ts.map +1 -0
  12. package/dist/distributed/DistributedStepWorker.js +96 -0
  13. package/dist/distributed/DistributedStepWorker.js.map +1 -0
  14. package/dist/distributed/DistributedWorkflowOrchestrator.d.ts +51 -0
  15. package/dist/distributed/DistributedWorkflowOrchestrator.d.ts.map +1 -0
  16. package/dist/distributed/DistributedWorkflowOrchestrator.js +430 -0
  17. package/dist/distributed/DistributedWorkflowOrchestrator.js.map +1 -0
  18. package/dist/distributed/FileDistributedJobQueue.d.ts +29 -0
  19. package/dist/distributed/FileDistributedJobQueue.d.ts.map +1 -0
  20. package/dist/distributed/FileDistributedJobQueue.js +170 -0
  21. package/dist/distributed/FileDistributedJobQueue.js.map +1 -0
  22. package/dist/distributed/InMemoryDistributedJobQueue.d.ts +26 -0
  23. package/dist/distributed/InMemoryDistributedJobQueue.d.ts.map +1 -0
  24. package/dist/distributed/InMemoryDistributedJobQueue.js +130 -0
  25. package/dist/distributed/InMemoryDistributedJobQueue.js.map +1 -0
  26. package/dist/distributed/index.d.ts +5 -0
  27. package/dist/distributed/index.d.ts.map +1 -0
  28. package/dist/distributed/index.js +5 -0
  29. package/dist/distributed/index.js.map +1 -0
  30. package/dist/errors/FieldRegistry.d.ts +6 -2
  31. package/dist/errors/FieldRegistry.d.ts.map +1 -1
  32. package/dist/errors/FieldRegistry.js +11 -0
  33. package/dist/errors/FieldRegistry.js.map +1 -1
  34. package/dist/execution/ExecutionEngine.d.ts.map +1 -1
  35. package/dist/execution/ExecutionEngine.js +2 -1
  36. package/dist/execution/ExecutionEngine.js.map +1 -1
  37. package/dist/execution/InternalExecutionContext.d.ts.map +1 -1
  38. package/dist/execution/InternalExecutionContext.js +3 -1
  39. package/dist/execution/InternalExecutionContext.js.map +1 -1
  40. package/dist/execution/WorkflowExecutor.d.ts +5 -0
  41. package/dist/execution/WorkflowExecutor.d.ts.map +1 -1
  42. package/dist/execution/WorkflowExecutor.js +195 -7
  43. package/dist/execution/WorkflowExecutor.js.map +1 -1
  44. package/dist/explanation/ExplanationGenerator.d.ts.map +1 -1
  45. package/dist/explanation/ExplanationGenerator.js +6 -0
  46. package/dist/explanation/ExplanationGenerator.js.map +1 -1
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +1 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/parser/SchemaValidator.d.ts +13 -0
  52. package/dist/parser/SchemaValidator.d.ts.map +1 -1
  53. package/dist/parser/SchemaValidator.js +175 -1
  54. package/dist/parser/SchemaValidator.js.map +1 -1
  55. package/dist/parser/WorkflowParser.d.ts +5 -0
  56. package/dist/parser/WorkflowParser.d.ts.map +1 -1
  57. package/dist/parser/WorkflowParser.js +20 -0
  58. package/dist/parser/WorkflowParser.js.map +1 -1
  59. package/dist/scheduling/JobScheduler.d.ts +12 -0
  60. package/dist/scheduling/JobScheduler.d.ts.map +1 -1
  61. package/dist/scheduling/JobScheduler.js +136 -20
  62. package/dist/scheduling/JobScheduler.js.map +1 -1
  63. package/dist/scheduling/Scheduler.d.ts +3 -0
  64. package/dist/scheduling/Scheduler.d.ts.map +1 -1
  65. package/dist/scheduling/Scheduler.js +3 -0
  66. package/dist/scheduling/Scheduler.js.map +1 -1
  67. package/dist/scheduling/workers/workflow-worker.js +59 -3
  68. package/dist/scheduling/workers/workflow-worker.js.map +1 -1
  69. package/dist/storage/CheckpointStore.d.ts +59 -0
  70. package/dist/storage/CheckpointStore.d.ts.map +1 -0
  71. package/dist/storage/CheckpointStore.js +62 -0
  72. package/dist/storage/CheckpointStore.js.map +1 -0
  73. package/dist/storage/index.d.ts +1 -0
  74. package/dist/storage/index.d.ts.map +1 -1
  75. package/dist/storage/index.js +1 -0
  76. package/dist/storage/index.js.map +1 -1
  77. package/dist/testing/integration/distributed/distributed-smoke.d.ts +3 -0
  78. package/dist/testing/integration/distributed/distributed-smoke.d.ts.map +1 -0
  79. package/dist/testing/integration/distributed/distributed-smoke.js +80 -0
  80. package/dist/testing/integration/distributed/distributed-smoke.js.map +1 -0
  81. package/dist/types/core-types.d.ts +278 -1
  82. package/dist/types/core-types.d.ts.map +1 -1
  83. package/dist/types/core-types.js.map +1 -1
  84. package/dist/usage/FileSpoolUsageCollector.d.ts +74 -0
  85. package/dist/usage/FileSpoolUsageCollector.d.ts.map +1 -0
  86. package/dist/usage/FileSpoolUsageCollector.js +225 -0
  87. package/dist/usage/FileSpoolUsageCollector.js.map +1 -0
  88. package/dist/usage/NoOpUsageCollector.d.ts +35 -0
  89. package/dist/usage/NoOpUsageCollector.d.ts.map +1 -0
  90. package/dist/usage/NoOpUsageCollector.js +40 -0
  91. package/dist/usage/NoOpUsageCollector.js.map +1 -0
  92. package/dist/usage/UsageEventFactory.d.ts +80 -0
  93. package/dist/usage/UsageEventFactory.d.ts.map +1 -0
  94. package/dist/usage/UsageEventFactory.js +117 -0
  95. package/dist/usage/UsageEventFactory.js.map +1 -0
  96. package/dist/usage/index.d.ts +11 -0
  97. package/dist/usage/index.d.ts.map +1 -0
  98. package/dist/usage/index.js +11 -0
  99. package/dist/usage/index.js.map +1 -0
  100. 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"}