@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.
- package/LICENSE.md +21 -0
- package/dist/bus.d.ts +35 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/bus.js +76 -0
- package/dist/bus.js.map +1 -0
- package/dist/engine.d.ts +88 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +401 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +55 -0
- package/dist/errors.js.map +1 -0
- package/dist/http.d.ts +18 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +75 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +49 -0
- package/dist/logger.js.map +1 -0
- package/dist/router.d.ts +17 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +55 -0
- package/dist/router.js.map +1 -0
- package/dist/scheduler.d.ts +27 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +62 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/schema.d.ts +24 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +186 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +51 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +133 -0
- package/dist/store.js.map +1 -0
- package/dist/transform.d.ts +32 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +158 -0
- package/dist/transform.js.map +1 -0
- 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
|
package/dist/bus.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -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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"}
|