@orgloop/core 0.5.0 → 0.7.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/dist/audit.d.ts +100 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +81 -0
- package/dist/audit.js.map +1 -0
- package/dist/event-history.d.ts +60 -0
- package/dist/event-history.d.ts.map +1 -0
- package/dist/event-history.js +65 -0
- package/dist/event-history.js.map +1 -0
- package/dist/http.d.ts +5 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +40 -0
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/loop-detector.d.ts +81 -0
- package/dist/loop-detector.d.ts.map +1 -0
- package/dist/loop-detector.js +158 -0
- package/dist/loop-detector.js.map +1 -0
- package/dist/metrics.d.ts +4 -0
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +8 -0
- package/dist/metrics.js.map +1 -1
- package/dist/output-validator.d.ts +59 -0
- package/dist/output-validator.d.ts.map +1 -0
- package/dist/output-validator.js +180 -0
- package/dist/output-validator.js.map +1 -0
- package/dist/rest-api.d.ts +20 -0
- package/dist/rest-api.d.ts.map +1 -0
- package/dist/rest-api.js +82 -0
- package/dist/rest-api.js.map +1 -0
- package/dist/router.d.ts +6 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +24 -1
- package/dist/router.js.map +1 -1
- package/dist/runtime.d.ts +80 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +309 -27
- package/dist/runtime.js.map +1 -1
- package/package.json +3 -3
package/dist/rest-api.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* REST API — registers /api/* endpoints on the WebhookServer.
|
|
3
|
+
*
|
|
4
|
+
* Provides structured JSON endpoints mirroring CLI functionality:
|
|
5
|
+
* GET /api/status — runtime health, uptime, source status, event counts
|
|
6
|
+
* GET /api/routes — configured routes with fire counts
|
|
7
|
+
* GET /api/events — recent event log with filtering
|
|
8
|
+
* GET /api/sources — per-source connector detail
|
|
9
|
+
* GET /api/metrics — Prometheus-format metrics
|
|
10
|
+
* GET /api/doctor — structured doctor output (registered externally)
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Register all REST API endpoints on the runtime's webhook server.
|
|
14
|
+
*
|
|
15
|
+
* The /api/doctor endpoint is NOT registered here — it requires CLI-level
|
|
16
|
+
* config resolution. Register it separately via runtime.getWebhookServer().registerApiHandler().
|
|
17
|
+
*/
|
|
18
|
+
export function registerRestApi(runtime) {
|
|
19
|
+
const server = runtime.getWebhookServer();
|
|
20
|
+
// GET /api/status
|
|
21
|
+
server.registerApiHandler('status', async () => {
|
|
22
|
+
const runtimeStatus = runtime.status();
|
|
23
|
+
const sources = runtime.getSourceDetails();
|
|
24
|
+
// Determine overall health from source statuses
|
|
25
|
+
const hasUnhealthy = sources.some((s) => s.status === 'unhealthy');
|
|
26
|
+
const hasDegraded = sources.some((s) => s.status === 'degraded');
|
|
27
|
+
let health = 'ok';
|
|
28
|
+
if (hasUnhealthy)
|
|
29
|
+
health = 'error';
|
|
30
|
+
else if (hasDegraded)
|
|
31
|
+
health = 'degraded';
|
|
32
|
+
return {
|
|
33
|
+
health,
|
|
34
|
+
running: runtimeStatus.running,
|
|
35
|
+
pid: runtimeStatus.pid,
|
|
36
|
+
uptime_ms: runtimeStatus.uptime_ms,
|
|
37
|
+
http_port: runtimeStatus.httpPort,
|
|
38
|
+
modules: runtimeStatus.modules.map((m) => ({
|
|
39
|
+
name: m.name,
|
|
40
|
+
state: m.state,
|
|
41
|
+
sources: m.sources,
|
|
42
|
+
routes: m.routes,
|
|
43
|
+
actors: m.actors,
|
|
44
|
+
uptime_ms: m.uptime_ms,
|
|
45
|
+
})),
|
|
46
|
+
sources: sources.map((s) => ({
|
|
47
|
+
id: s.id,
|
|
48
|
+
connector: s.connector,
|
|
49
|
+
status: s.status,
|
|
50
|
+
event_count: s.event_count,
|
|
51
|
+
last_event: s.last_event,
|
|
52
|
+
})),
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
// GET /api/routes
|
|
56
|
+
server.registerApiHandler('routes', async () => {
|
|
57
|
+
return runtime.getRouteDetails();
|
|
58
|
+
});
|
|
59
|
+
// GET /api/events?from=&to=&source=&route=&limit=
|
|
60
|
+
server.registerApiHandler('events', async (query) => {
|
|
61
|
+
const from = query.get('from') ?? undefined;
|
|
62
|
+
const to = query.get('to') ?? undefined;
|
|
63
|
+
const source = query.get('source') ?? undefined;
|
|
64
|
+
const route = query.get('route') ?? undefined;
|
|
65
|
+
const limitStr = query.get('limit');
|
|
66
|
+
const limit = limitStr ? Number.parseInt(limitStr, 10) : undefined;
|
|
67
|
+
return runtime.queryEvents({ from, to, source, route, limit });
|
|
68
|
+
});
|
|
69
|
+
// GET /api/sources
|
|
70
|
+
server.registerApiHandler('sources', async () => {
|
|
71
|
+
return runtime.getSourceDetails();
|
|
72
|
+
});
|
|
73
|
+
// GET /api/metrics
|
|
74
|
+
server.registerApiHandler('metrics', async () => {
|
|
75
|
+
const text = await runtime.getMetricsText();
|
|
76
|
+
if (text === null) {
|
|
77
|
+
return { error: 'Metrics not enabled. Set ORGLOOP_METRICS_PORT or metricsPort option.' };
|
|
78
|
+
}
|
|
79
|
+
return text;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=rest-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-api.js","sourceRoot":"","sources":["../src/rest-api.ts"],"names":[],"mappings":"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"}
|
package/dist/router.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Supports multi-route matching: one event can match many routes.
|
|
6
6
|
*/
|
|
7
7
|
import type { OrgLoopEvent, RouteDefinition } from '@orgloop/sdk';
|
|
8
|
+
export declare function getNestedValue(obj: unknown, path: string): unknown;
|
|
8
9
|
export interface MatchedRoute {
|
|
9
10
|
route: RouteDefinition;
|
|
10
11
|
event: OrgLoopEvent;
|
|
@@ -14,4 +15,9 @@ export interface MatchedRoute {
|
|
|
14
15
|
* Returns all matched routes (multi-match supported).
|
|
15
16
|
*/
|
|
16
17
|
export declare function matchRoutes(event: OrgLoopEvent, routes: RouteDefinition[]): MatchedRoute[];
|
|
18
|
+
/**
|
|
19
|
+
* Interpolate {{dot.path}} templates in a config object using event data.
|
|
20
|
+
* Static values (no {{ }}) pass through unchanged. Missing fields resolve to ''.
|
|
21
|
+
*/
|
|
22
|
+
export declare function interpolateConfig(config: Record<string, unknown>, event: OrgLoopEvent): Record<string, unknown>;
|
|
17
23
|
//# sourceMappingURL=router.d.ts.map
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIlE,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAUlE;AA+BD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE,CAQ1F;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,YAAY,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB"}
|
package/dist/router.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Supports multi-route matching: one event can match many routes.
|
|
6
6
|
*/
|
|
7
7
|
// ─── Dot-path field access ────────────────────────────────────────────────────
|
|
8
|
-
function getNestedValue(obj, path) {
|
|
8
|
+
export function getNestedValue(obj, path) {
|
|
9
9
|
const parts = path.split('.');
|
|
10
10
|
let current = obj;
|
|
11
11
|
for (const part of parts) {
|
|
@@ -52,4 +52,27 @@ export function matchRoutes(event, routes) {
|
|
|
52
52
|
}
|
|
53
53
|
return matched;
|
|
54
54
|
}
|
|
55
|
+
// ─── Config interpolation ────────────────────────────────────────────────────
|
|
56
|
+
const TEMPLATE_RE = /\{\{(.+?)\}\}/g;
|
|
57
|
+
/**
|
|
58
|
+
* Interpolate {{dot.path}} templates in a config object using event data.
|
|
59
|
+
* Static values (no {{ }}) pass through unchanged. Missing fields resolve to ''.
|
|
60
|
+
*/
|
|
61
|
+
export function interpolateConfig(config, event) {
|
|
62
|
+
const result = {};
|
|
63
|
+
for (const [key, value] of Object.entries(config)) {
|
|
64
|
+
if (typeof value === 'string' && TEMPLATE_RE.test(value)) {
|
|
65
|
+
// Reset lastIndex since we use .test() then .replace() on the same regex
|
|
66
|
+
TEMPLATE_RE.lastIndex = 0;
|
|
67
|
+
result[key] = value.replace(TEMPLATE_RE, (_, path) => {
|
|
68
|
+
const resolved = getNestedValue(event, path.trim());
|
|
69
|
+
return resolved != null ? String(resolved) : '';
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
result[key] = value;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
55
78
|
//# sourceMappingURL=router.js.map
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,iFAAiF;AAEjF,
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -7,10 +7,18 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { EventEmitter } from 'node:events';
|
|
9
9
|
import type { ModuleStatus, OrgLoopEvent, RuntimeStatus } from '@orgloop/sdk';
|
|
10
|
+
import type { AuditRecord, AuditTrailOptions } from './audit.js';
|
|
11
|
+
import { AuditTrail } from './audit.js';
|
|
10
12
|
import type { EventBus } from './bus.js';
|
|
13
|
+
import type { EventHistoryOptions, EventHistoryQuery, EventRecord } from './event-history.js';
|
|
11
14
|
import type { RuntimeControl } from './http.js';
|
|
15
|
+
import { WebhookServer } from './http.js';
|
|
12
16
|
import { LoggerManager } from './logger.js';
|
|
17
|
+
import type { LoopCheckResult, LoopDetectorOptions } from './loop-detector.js';
|
|
18
|
+
import { LoopDetector } from './loop-detector.js';
|
|
13
19
|
import type { ModuleConfig } from './module-instance.js';
|
|
20
|
+
import type { OutputValidatorOptions } from './output-validator.js';
|
|
21
|
+
import { OutputValidator } from './output-validator.js';
|
|
14
22
|
import type { CheckpointStore } from './store.js';
|
|
15
23
|
export interface SourceCircuitBreakerOptions {
|
|
16
24
|
/** Consecutive failures before opening circuit (default: 5) */
|
|
@@ -18,6 +26,13 @@ export interface SourceCircuitBreakerOptions {
|
|
|
18
26
|
/** Backoff period in ms before retry when circuit is open (default: 60000) */
|
|
19
27
|
retryAfterMs?: number;
|
|
20
28
|
}
|
|
29
|
+
/** Per-route statistics tracked by the runtime. */
|
|
30
|
+
export interface RouteStats {
|
|
31
|
+
/** Number of times this route has fired */
|
|
32
|
+
fireCount: number;
|
|
33
|
+
/** ISO 8601 timestamp of the last fire, or null if never fired */
|
|
34
|
+
lastFiredAt: string | null;
|
|
35
|
+
}
|
|
21
36
|
export interface RuntimeOptions {
|
|
22
37
|
/** Custom event bus (default: InMemoryBus) */
|
|
23
38
|
bus?: EventBus;
|
|
@@ -37,6 +52,14 @@ export interface RuntimeOptions {
|
|
|
37
52
|
heartbeatIntervalMs?: number;
|
|
38
53
|
/** Prometheus metrics port. Metrics only start if ORGLOOP_METRICS_PORT env is set or this is provided. */
|
|
39
54
|
metricsPort?: number;
|
|
55
|
+
/** Event history ring buffer options */
|
|
56
|
+
eventHistory?: EventHistoryOptions;
|
|
57
|
+
/** Audit trail options */
|
|
58
|
+
auditTrail?: AuditTrailOptions;
|
|
59
|
+
/** Output validator options */
|
|
60
|
+
outputValidator?: OutputValidatorOptions;
|
|
61
|
+
/** Loop detector options */
|
|
62
|
+
loopDetector?: LoopDetectorOptions;
|
|
40
63
|
}
|
|
41
64
|
export interface LoadModuleOptions {
|
|
42
65
|
/** Pre-instantiated source connectors (keyed by source ID) */
|
|
@@ -76,6 +99,11 @@ declare class Runtime extends EventEmitter implements RuntimeControl {
|
|
|
76
99
|
private readonly heartbeatFile;
|
|
77
100
|
private readonly metricsServer;
|
|
78
101
|
private readonly metricsPort;
|
|
102
|
+
private readonly eventHistory;
|
|
103
|
+
private readonly routeStats;
|
|
104
|
+
private readonly auditTrail;
|
|
105
|
+
private readonly outputValidator;
|
|
106
|
+
private readonly loopDetector;
|
|
79
107
|
constructor(options?: RuntimeOptions);
|
|
80
108
|
start(): Promise<void>;
|
|
81
109
|
/** Start the HTTP server for webhooks and control API. */
|
|
@@ -102,6 +130,58 @@ declare class Runtime extends EventEmitter implements RuntimeControl {
|
|
|
102
130
|
status(): RuntimeStatus;
|
|
103
131
|
listModules(): ModuleStatus[];
|
|
104
132
|
getModuleStatus(name: string): ModuleStatus | undefined;
|
|
133
|
+
/** Query the event history ring buffer. */
|
|
134
|
+
queryEvents(query?: EventHistoryQuery): EventRecord[];
|
|
135
|
+
/** Get route statistics (fire count, last fired). */
|
|
136
|
+
getRouteStats(): ReadonlyMap<string, RouteStats>;
|
|
137
|
+
/** Get all route definitions across all modules with their stats. */
|
|
138
|
+
getRouteDetails(): Array<{
|
|
139
|
+
name: string;
|
|
140
|
+
module: string;
|
|
141
|
+
when: {
|
|
142
|
+
source: string;
|
|
143
|
+
events: string[];
|
|
144
|
+
filter?: Record<string, unknown>;
|
|
145
|
+
};
|
|
146
|
+
actor: string;
|
|
147
|
+
sop_file?: string;
|
|
148
|
+
fire_count: number;
|
|
149
|
+
last_fired: string | null;
|
|
150
|
+
}>;
|
|
151
|
+
/** Get per-source detail for the REST API. */
|
|
152
|
+
getSourceDetails(): Array<{
|
|
153
|
+
id: string;
|
|
154
|
+
module: string;
|
|
155
|
+
connector: string;
|
|
156
|
+
type: 'webhook' | 'polling';
|
|
157
|
+
status: string;
|
|
158
|
+
last_event: string | null;
|
|
159
|
+
event_count: number;
|
|
160
|
+
poll_interval?: string;
|
|
161
|
+
}>;
|
|
162
|
+
/** Query the audit trail. */
|
|
163
|
+
queryAuditTrail(filter?: {
|
|
164
|
+
trace_id?: string;
|
|
165
|
+
route?: string;
|
|
166
|
+
actor?: string;
|
|
167
|
+
held_only?: boolean;
|
|
168
|
+
flagged_only?: boolean;
|
|
169
|
+
limit?: number;
|
|
170
|
+
}): AuditRecord[];
|
|
171
|
+
/** Get the full audit chain for a trace ID. */
|
|
172
|
+
getAuditChain(traceId: string): AuditRecord[];
|
|
173
|
+
/** Get loop detector state for a trace ID. */
|
|
174
|
+
getLoopState(traceId: string): LoopCheckResult | null;
|
|
175
|
+
/** Get the audit trail instance (for direct access in tests). */
|
|
176
|
+
getAuditTrail(): AuditTrail;
|
|
177
|
+
/** Get the loop detector instance (for direct access in tests). */
|
|
178
|
+
getLoopDetector(): LoopDetector;
|
|
179
|
+
/** Get the output validator instance (for direct access in tests). */
|
|
180
|
+
getOutputValidator(): OutputValidator;
|
|
181
|
+
/** Get the metrics registry for Prometheus text output. */
|
|
182
|
+
getMetricsText(): Promise<string | null>;
|
|
183
|
+
/** Get the webhook server for API handler registration. */
|
|
184
|
+
getWebhookServer(): WebhookServer;
|
|
105
185
|
private emitLog;
|
|
106
186
|
}
|
|
107
187
|
export { Runtime };
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAGX,YAAY,EACZ,YAAY,EAEZ,aAAa,EACb,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|