@orgloop/core 0.1.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 (46) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/bus.d.ts +35 -0
  3. package/dist/bus.d.ts.map +1 -0
  4. package/dist/bus.js +76 -0
  5. package/dist/bus.js.map +1 -0
  6. package/dist/engine.d.ts +88 -0
  7. package/dist/engine.d.ts.map +1 -0
  8. package/dist/engine.js +401 -0
  9. package/dist/engine.js.map +1 -0
  10. package/dist/errors.d.ts +31 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +55 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/http.d.ts +18 -0
  15. package/dist/http.d.ts.map +1 -0
  16. package/dist/http.js +75 -0
  17. package/dist/http.js.map +1 -0
  18. package/dist/index.d.ts +22 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +26 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/logger.d.ts +22 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +49 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/router.d.ts +17 -0
  27. package/dist/router.d.ts.map +1 -0
  28. package/dist/router.js +55 -0
  29. package/dist/router.js.map +1 -0
  30. package/dist/scheduler.d.ts +27 -0
  31. package/dist/scheduler.d.ts.map +1 -0
  32. package/dist/scheduler.js +62 -0
  33. package/dist/scheduler.js.map +1 -0
  34. package/dist/schema.d.ts +24 -0
  35. package/dist/schema.d.ts.map +1 -0
  36. package/dist/schema.js +186 -0
  37. package/dist/schema.js.map +1 -0
  38. package/dist/store.d.ts +51 -0
  39. package/dist/store.d.ts.map +1 -0
  40. package/dist/store.js +133 -0
  41. package/dist/store.js.map +1 -0
  42. package/dist/transform.d.ts +32 -0
  43. package/dist/transform.d.ts.map +1 -0
  44. package/dist/transform.js +158 -0
  45. package/dist/transform.js.map +1 -0
  46. package/package.json +38 -0
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OrgLoop contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/bus.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Event bus implementations.
3
+ *
4
+ * InMemoryBus: simple pub/sub for dev/testing.
5
+ * FileWalBus: wraps EventStore for durable at-least-once delivery.
6
+ */
7
+ import type { EventFilter, OrgLoopEvent, Subscription } from '@orgloop/sdk';
8
+ import type { EventStore } from './store.js';
9
+ export type BusHandler = (event: OrgLoopEvent) => Promise<void>;
10
+ export interface EventBus {
11
+ publish(event: OrgLoopEvent): Promise<void>;
12
+ subscribe(filter: EventFilter, handler: BusHandler): Subscription;
13
+ ack(eventId: string): Promise<void>;
14
+ unacked(): Promise<OrgLoopEvent[]>;
15
+ }
16
+ export declare class InMemoryBus implements EventBus {
17
+ private nextId;
18
+ private readonly subscriptions;
19
+ private readonly pending;
20
+ publish(event: OrgLoopEvent): Promise<void>;
21
+ subscribe(filter: EventFilter, handler: BusHandler): Subscription;
22
+ ack(eventId: string): Promise<void>;
23
+ unacked(): Promise<OrgLoopEvent[]>;
24
+ }
25
+ export declare class FileWalBus implements EventBus {
26
+ private readonly store;
27
+ private nextId;
28
+ private readonly subscriptions;
29
+ constructor(store: EventStore);
30
+ publish(event: OrgLoopEvent): Promise<void>;
31
+ subscribe(filter: EventFilter, handler: BusHandler): Subscription;
32
+ ack(eventId: string): Promise<void>;
33
+ unacked(): Promise<OrgLoopEvent[]>;
34
+ }
35
+ //# sourceMappingURL=bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhE,MAAM,WAAW,QAAQ;IACxB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,CAAC;IAClE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACnC;AAkBD,qBAAa,WAAY,YAAW,QAAQ;IAC3C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAErD,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY;IAY3D,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAGxC;AAID,qBAAa,UAAW,YAAW,QAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;gBAE7C,KAAK,EAAE,UAAU;IAIvB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY;IAY3D,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAIxC"}
package/dist/bus.js ADDED
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Event bus implementations.
3
+ *
4
+ * InMemoryBus: simple pub/sub for dev/testing.
5
+ * FileWalBus: wraps EventStore for durable at-least-once delivery.
6
+ */
7
+ // ─── Filter matching ──────────────────────────────────────────────────────────
8
+ function matchesFilter(event, filter) {
9
+ if (filter.source && event.source !== filter.source)
10
+ return false;
11
+ if (filter.type && event.type !== filter.type)
12
+ return false;
13
+ return true;
14
+ }
15
+ export class InMemoryBus {
16
+ nextId = 0;
17
+ subscriptions = [];
18
+ pending = new Map();
19
+ async publish(event) {
20
+ this.pending.set(event.id, event);
21
+ const matching = this.subscriptions.filter((s) => matchesFilter(event, s.filter));
22
+ await Promise.all(matching.map((s) => s.handler(event)));
23
+ }
24
+ subscribe(filter, handler) {
25
+ const id = this.nextId++;
26
+ const entry = { id, filter, handler };
27
+ this.subscriptions.push(entry);
28
+ return {
29
+ unsubscribe: () => {
30
+ const idx = this.subscriptions.findIndex((s) => s.id === id);
31
+ if (idx >= 0)
32
+ this.subscriptions.splice(idx, 1);
33
+ },
34
+ };
35
+ }
36
+ async ack(eventId) {
37
+ this.pending.delete(eventId);
38
+ }
39
+ async unacked() {
40
+ return [...this.pending.values()];
41
+ }
42
+ }
43
+ // ─── File WAL Bus ─────────────────────────────────────────────────────────────
44
+ export class FileWalBus {
45
+ store;
46
+ nextId = 0;
47
+ subscriptions = [];
48
+ constructor(store) {
49
+ this.store = store;
50
+ }
51
+ async publish(event) {
52
+ await this.store.write(event);
53
+ const matching = this.subscriptions.filter((s) => matchesFilter(event, s.filter));
54
+ await Promise.all(matching.map((s) => s.handler(event)));
55
+ }
56
+ subscribe(filter, handler) {
57
+ const id = this.nextId++;
58
+ const entry = { id, filter, handler };
59
+ this.subscriptions.push(entry);
60
+ return {
61
+ unsubscribe: () => {
62
+ const idx = this.subscriptions.findIndex((s) => s.id === id);
63
+ if (idx >= 0)
64
+ this.subscriptions.splice(idx, 1);
65
+ },
66
+ };
67
+ }
68
+ async ack(eventId) {
69
+ await this.store.ack(eventId);
70
+ }
71
+ async unacked() {
72
+ const entries = await this.store.unacked();
73
+ return entries.map((e) => e.event);
74
+ }
75
+ }
76
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * OrgLoop — the main runtime engine.
3
+ *
4
+ * Library-first API:
5
+ * const loop = new OrgLoop(config);
6
+ * await loop.start();
7
+ * await loop.stop();
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import type { ActorConnector, Logger, OrgLoopConfig, OrgLoopEvent, SourceConnector } from '@orgloop/sdk';
11
+ import type { Transform } from '@orgloop/sdk';
12
+ import type { EventBus } from './bus.js';
13
+ import { LoggerManager } from './logger.js';
14
+ import type { CheckpointStore } from './store.js';
15
+ export interface OrgLoopOptions {
16
+ /** Pre-instantiated source connectors (keyed by source ID) */
17
+ sources?: Map<string, SourceConnector>;
18
+ /** Pre-instantiated actor connectors (keyed by actor ID) */
19
+ actors?: Map<string, ActorConnector>;
20
+ /** Pre-instantiated package transforms (keyed by transform name) */
21
+ transforms?: Map<string, Transform>;
22
+ /** Pre-instantiated loggers (keyed by logger name) */
23
+ loggers?: Map<string, Logger>;
24
+ /** Custom event bus (default: InMemoryBus) */
25
+ bus?: EventBus;
26
+ /** Custom checkpoint store */
27
+ checkpointStore?: CheckpointStore;
28
+ /** HTTP port for webhook server (default: 4800, or ORGLOOP_PORT env var) */
29
+ httpPort?: number;
30
+ }
31
+ export interface EngineStatus {
32
+ running: boolean;
33
+ sources: string[];
34
+ actors: string[];
35
+ routes: number;
36
+ uptime_ms: number;
37
+ httpPort?: number;
38
+ }
39
+ export interface OrgLoopEvents {
40
+ event: [OrgLoopEvent];
41
+ delivery: [{
42
+ event: OrgLoopEvent;
43
+ route: string;
44
+ actor: string;
45
+ status: string;
46
+ }];
47
+ error: [Error];
48
+ }
49
+ export declare class OrgLoop extends EventEmitter {
50
+ private readonly config;
51
+ private readonly sources;
52
+ private readonly actors;
53
+ private readonly packageTransforms;
54
+ private readonly resolvedLoggers;
55
+ private readonly bus;
56
+ private readonly checkpointStore;
57
+ private readonly loggerManager;
58
+ private readonly scheduler;
59
+ private readonly httpPort;
60
+ private webhookServer;
61
+ private readonly webhookSources;
62
+ private running;
63
+ private startedAt;
64
+ constructor(config: OrgLoopConfig, options?: OrgLoopOptions);
65
+ /**
66
+ * Start the engine: initialize connectors, start scheduler, begin processing.
67
+ */
68
+ start(): Promise<void>;
69
+ /**
70
+ * Stop the engine gracefully.
71
+ */
72
+ stop(): Promise<void>;
73
+ /**
74
+ * Inject an event programmatically (for testing or API use).
75
+ */
76
+ inject(event: OrgLoopEvent): Promise<void>;
77
+ /**
78
+ * Get runtime status.
79
+ */
80
+ status(): EngineStatus;
81
+ /** Get the logger manager (for adding loggers externally) */
82
+ get loggers(): LoggerManager;
83
+ private pollSource;
84
+ private processEvent;
85
+ private deliverToActor;
86
+ private emitLog;
87
+ }
88
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/engine.js ADDED
@@ -0,0 +1,401 @@
1
+ /**
2
+ * OrgLoop — the main runtime engine.
3
+ *
4
+ * Library-first API:
5
+ * const loop = new OrgLoop(config);
6
+ * await loop.start();
7
+ * await loop.stop();
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import { readFile } from 'node:fs/promises';
11
+ import { generateTraceId } from '@orgloop/sdk';
12
+ import { InMemoryBus } from './bus.js';
13
+ import { ConnectorError, DeliveryError } from './errors.js';
14
+ import { DEFAULT_HTTP_PORT, WebhookServer } from './http.js';
15
+ import { LoggerManager } from './logger.js';
16
+ import { matchRoutes } from './router.js';
17
+ import { Scheduler } from './scheduler.js';
18
+ import { InMemoryCheckpointStore } from './store.js';
19
+ import { executeTransformPipeline } from './transform.js';
20
+ // ─── OrgLoop Class ────────────────────────────────────────────────────────────
21
+ export class OrgLoop extends EventEmitter {
22
+ config;
23
+ sources;
24
+ actors;
25
+ packageTransforms;
26
+ resolvedLoggers;
27
+ bus;
28
+ checkpointStore;
29
+ loggerManager = new LoggerManager();
30
+ scheduler = new Scheduler();
31
+ httpPort;
32
+ webhookServer = null;
33
+ webhookSources = new Set();
34
+ running = false;
35
+ startedAt = 0;
36
+ constructor(config, options) {
37
+ super();
38
+ this.config = config;
39
+ this.sources = options?.sources ?? new Map();
40
+ this.actors = options?.actors ?? new Map();
41
+ this.packageTransforms = options?.transforms ?? new Map();
42
+ this.resolvedLoggers = options?.loggers ?? new Map();
43
+ this.bus = options?.bus ?? new InMemoryBus();
44
+ this.checkpointStore = options?.checkpointStore ?? new InMemoryCheckpointStore();
45
+ this.httpPort =
46
+ options?.httpPort ??
47
+ (process.env.ORGLOOP_PORT
48
+ ? Number.parseInt(process.env.ORGLOOP_PORT, 10)
49
+ : DEFAULT_HTTP_PORT);
50
+ }
51
+ /**
52
+ * Start the engine: initialize connectors, start scheduler, begin processing.
53
+ */
54
+ async start() {
55
+ if (this.running)
56
+ return;
57
+ await this.emitLog('system.start', { result: 'starting' });
58
+ // Initialize sources
59
+ for (const sourceCfg of this.config.sources) {
60
+ const connector = this.sources.get(sourceCfg.id);
61
+ if (connector) {
62
+ try {
63
+ await connector.init({
64
+ id: sourceCfg.id,
65
+ connector: sourceCfg.connector,
66
+ config: sourceCfg.config,
67
+ poll: sourceCfg.poll,
68
+ });
69
+ }
70
+ catch (err) {
71
+ const error = new ConnectorError(sourceCfg.id, 'Failed to initialize source', {
72
+ cause: err,
73
+ });
74
+ this.emit('error', error);
75
+ }
76
+ }
77
+ }
78
+ // Initialize actors
79
+ for (const actorCfg of this.config.actors) {
80
+ const connector = this.actors.get(actorCfg.id);
81
+ if (connector) {
82
+ try {
83
+ await connector.init({
84
+ id: actorCfg.id,
85
+ connector: actorCfg.connector,
86
+ config: actorCfg.config,
87
+ });
88
+ }
89
+ catch (err) {
90
+ const error = new ConnectorError(actorCfg.id, 'Failed to initialize actor', {
91
+ cause: err,
92
+ });
93
+ this.emit('error', error);
94
+ }
95
+ }
96
+ }
97
+ // Initialize package transforms
98
+ for (const tDef of this.config.transforms) {
99
+ if (tDef.type === 'package') {
100
+ const transform = this.packageTransforms.get(tDef.name);
101
+ if (transform) {
102
+ await transform.init(tDef.config ?? {});
103
+ }
104
+ }
105
+ }
106
+ // Initialize and register loggers
107
+ for (const loggerDef of this.config.loggers) {
108
+ const logger = this.resolvedLoggers.get(loggerDef.name);
109
+ if (logger) {
110
+ try {
111
+ await logger.init(loggerDef.config ?? {});
112
+ this.loggerManager.addLogger(logger);
113
+ }
114
+ catch (err) {
115
+ this.emit('error', new Error(`Failed to initialize logger "${loggerDef.name}": ${err}`));
116
+ }
117
+ }
118
+ }
119
+ // Detect webhook sources and register poll sources with scheduler
120
+ const defaultInterval = this.config.defaults?.poll_interval ?? '5m';
121
+ const webhookHandlers = new Map();
122
+ for (const sourceCfg of this.config.sources) {
123
+ const connector = this.sources.get(sourceCfg.id);
124
+ if (!connector)
125
+ continue;
126
+ if (typeof connector.webhook === 'function') {
127
+ // Webhook-based source: mount handler, skip polling
128
+ webhookHandlers.set(sourceCfg.id, connector.webhook());
129
+ this.webhookSources.add(sourceCfg.id);
130
+ }
131
+ else {
132
+ // Poll-based source: register with scheduler
133
+ const interval = sourceCfg.poll?.interval ?? defaultInterval;
134
+ this.scheduler.addSource(sourceCfg.id, interval);
135
+ }
136
+ }
137
+ // Start webhook server if any webhook sources registered
138
+ if (webhookHandlers.size > 0) {
139
+ this.webhookServer = new WebhookServer(webhookHandlers, (event) => this.inject(event));
140
+ await this.webhookServer.start(this.httpPort);
141
+ }
142
+ // Start scheduler
143
+ this.scheduler.start((sourceId) => this.pollSource(sourceId));
144
+ this.running = true;
145
+ this.startedAt = Date.now();
146
+ await this.emitLog('system.start', { result: 'started' });
147
+ }
148
+ /**
149
+ * Stop the engine gracefully.
150
+ */
151
+ async stop() {
152
+ if (!this.running)
153
+ return;
154
+ await this.emitLog('system.stop', { result: 'stopping' });
155
+ // Stop webhook server
156
+ if (this.webhookServer) {
157
+ await this.webhookServer.stop();
158
+ this.webhookServer = null;
159
+ }
160
+ // Stop scheduler
161
+ this.scheduler.stop();
162
+ // Shutdown sources
163
+ for (const [id, connector] of this.sources) {
164
+ try {
165
+ await connector.shutdown();
166
+ }
167
+ catch (err) {
168
+ this.emit('error', new ConnectorError(id, 'Error during source shutdown', { cause: err }));
169
+ }
170
+ }
171
+ // Shutdown actors
172
+ for (const [id, connector] of this.actors) {
173
+ try {
174
+ await connector.shutdown();
175
+ }
176
+ catch (err) {
177
+ this.emit('error', new ConnectorError(id, 'Error during actor shutdown', { cause: err }));
178
+ }
179
+ }
180
+ // Shutdown transforms
181
+ for (const [, transform] of this.packageTransforms) {
182
+ try {
183
+ await transform.shutdown();
184
+ }
185
+ catch {
186
+ // Swallow
187
+ }
188
+ }
189
+ // Flush and shutdown loggers
190
+ await this.loggerManager.flush();
191
+ await this.loggerManager.shutdown();
192
+ this.running = false;
193
+ await this.emitLog('system.stop', { result: 'stopped' });
194
+ }
195
+ /**
196
+ * Inject an event programmatically (for testing or API use).
197
+ */
198
+ async inject(event) {
199
+ const resolved = event.trace_id ? event : { ...event, trace_id: generateTraceId() };
200
+ await this.processEvent(resolved);
201
+ }
202
+ /**
203
+ * Get runtime status.
204
+ */
205
+ status() {
206
+ return {
207
+ running: this.running,
208
+ sources: [...this.sources.keys()],
209
+ actors: [...this.actors.keys()],
210
+ routes: this.config.routes.length,
211
+ uptime_ms: this.running ? Date.now() - this.startedAt : 0,
212
+ ...(this.webhookServer ? { httpPort: this.httpPort } : {}),
213
+ };
214
+ }
215
+ /** Get the logger manager (for adding loggers externally) */
216
+ get loggers() {
217
+ return this.loggerManager;
218
+ }
219
+ // ─── Internal: Poll a source ──────────────────────────────────────────────
220
+ async pollSource(sourceId) {
221
+ const connector = this.sources.get(sourceId);
222
+ if (!connector)
223
+ return;
224
+ try {
225
+ const checkpoint = await this.checkpointStore.get(sourceId);
226
+ const result = await connector.poll(checkpoint);
227
+ // Save checkpoint
228
+ if (result.checkpoint) {
229
+ await this.checkpointStore.set(sourceId, result.checkpoint);
230
+ }
231
+ // Process each event
232
+ for (const event of result.events) {
233
+ const enriched = event.trace_id ? event : { ...event, trace_id: generateTraceId() };
234
+ await this.processEvent(enriched);
235
+ }
236
+ }
237
+ catch (err) {
238
+ const error = new ConnectorError(sourceId, 'Poll failed', { cause: err });
239
+ this.emit('error', error);
240
+ await this.emitLog('system.error', {
241
+ source: sourceId,
242
+ error: error.message,
243
+ });
244
+ }
245
+ }
246
+ // ─── Internal: Process a single event ─────────────────────────────────────
247
+ async processEvent(event) {
248
+ this.emit('event', event);
249
+ await this.emitLog('source.emit', {
250
+ event_id: event.id,
251
+ trace_id: event.trace_id,
252
+ source: event.source,
253
+ event_type: event.type,
254
+ });
255
+ // Write to bus (WAL)
256
+ await this.bus.publish(event);
257
+ // Match routes
258
+ const matched = matchRoutes(event, this.config.routes);
259
+ if (matched.length === 0) {
260
+ await this.emitLog('route.no_match', {
261
+ event_id: event.id,
262
+ trace_id: event.trace_id,
263
+ source: event.source,
264
+ });
265
+ await this.bus.ack(event.id);
266
+ return;
267
+ }
268
+ // Process each matched route
269
+ for (const match of matched) {
270
+ const { route } = match;
271
+ await this.emitLog('route.match', {
272
+ event_id: event.id,
273
+ trace_id: event.trace_id,
274
+ route: route.name,
275
+ source: event.source,
276
+ target: route.then.actor,
277
+ });
278
+ // Run transform pipeline
279
+ let transformedEvent = event;
280
+ if (route.transforms && route.transforms.length > 0) {
281
+ const pipelineOptions = {
282
+ definitions: this.config.transforms,
283
+ packageTransforms: this.packageTransforms,
284
+ onLog: (partial) => {
285
+ void this.emitLog(partial.phase ?? 'transform.start', {
286
+ ...partial,
287
+ event_id: partial.event_id ?? event.id,
288
+ trace_id: partial.trace_id ?? event.trace_id,
289
+ route: route.name,
290
+ });
291
+ },
292
+ };
293
+ const context = {
294
+ source: event.source,
295
+ target: route.then.actor,
296
+ eventType: event.type,
297
+ routeName: route.name,
298
+ };
299
+ const result = await executeTransformPipeline(event, context, route.transforms, pipelineOptions);
300
+ if (result.dropped || !result.event) {
301
+ continue; // Skip delivery for this route
302
+ }
303
+ transformedEvent = result.event;
304
+ }
305
+ // Deliver to actor
306
+ await this.deliverToActor(transformedEvent, route.name, route.then.actor, route);
307
+ }
308
+ // Ack the event after all routes processed
309
+ await this.bus.ack(event.id);
310
+ }
311
+ // ─── Internal: Deliver to actor ───────────────────────────────────────────
312
+ async deliverToActor(event, routeName, actorId, route) {
313
+ const actor = this.actors.get(actorId);
314
+ if (!actor) {
315
+ const error = new DeliveryError(actorId, routeName, `Actor "${actorId}" not found`);
316
+ this.emit('error', error);
317
+ return;
318
+ }
319
+ await this.emitLog('deliver.attempt', {
320
+ event_id: event.id,
321
+ trace_id: event.trace_id,
322
+ route: routeName,
323
+ target: actorId,
324
+ });
325
+ const startTime = Date.now();
326
+ try {
327
+ // Build delivery config
328
+ const deliveryConfig = {
329
+ ...(route.then.config ?? {}),
330
+ };
331
+ // Resolve launch prompt if configured
332
+ if (route.with?.prompt_file) {
333
+ try {
334
+ const promptContent = await readFile(route.with.prompt_file, 'utf-8');
335
+ deliveryConfig.launch_prompt = promptContent;
336
+ deliveryConfig.launch_prompt_file = route.with.prompt_file;
337
+ }
338
+ catch {
339
+ // Non-fatal: log but continue delivery
340
+ }
341
+ }
342
+ const result = await actor.deliver(event, deliveryConfig);
343
+ const durationMs = Date.now() - startTime;
344
+ if (result.status === 'delivered') {
345
+ await this.emitLog('deliver.success', {
346
+ event_id: event.id,
347
+ trace_id: event.trace_id,
348
+ route: routeName,
349
+ target: actorId,
350
+ duration_ms: durationMs,
351
+ });
352
+ this.emit('delivery', { event, route: routeName, actor: actorId, status: 'delivered' });
353
+ }
354
+ else {
355
+ await this.emitLog('deliver.failure', {
356
+ event_id: event.id,
357
+ trace_id: event.trace_id,
358
+ route: routeName,
359
+ target: actorId,
360
+ duration_ms: durationMs,
361
+ error: result.error?.message ?? result.status,
362
+ });
363
+ this.emit('delivery', { event, route: routeName, actor: actorId, status: result.status });
364
+ }
365
+ }
366
+ catch (err) {
367
+ const durationMs = Date.now() - startTime;
368
+ const error = new DeliveryError(actorId, routeName, 'Delivery failed', { cause: err });
369
+ this.emit('error', error);
370
+ await this.emitLog('deliver.failure', {
371
+ event_id: event.id,
372
+ trace_id: event.trace_id,
373
+ route: routeName,
374
+ target: actorId,
375
+ duration_ms: durationMs,
376
+ error: error.message,
377
+ });
378
+ }
379
+ }
380
+ // ─── Internal: Emit structured log ────────────────────────────────────────
381
+ async emitLog(phase, fields) {
382
+ const entry = {
383
+ timestamp: new Date().toISOString(),
384
+ event_id: fields.event_id ?? '',
385
+ trace_id: fields.trace_id ?? '',
386
+ phase,
387
+ source: fields.source,
388
+ target: fields.target,
389
+ route: fields.route,
390
+ transform: fields.transform,
391
+ event_type: fields.event_type,
392
+ result: fields.result,
393
+ duration_ms: fields.duration_ms,
394
+ error: fields.error,
395
+ metadata: fields.metadata,
396
+ workspace: this.config.project.name,
397
+ };
398
+ await this.loggerManager.log(entry);
399
+ }
400
+ }
401
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}