@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
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LoopDetector — event chain tracking and circuit breaker.
|
|
3
|
+
*
|
|
4
|
+
* Tracks event chains: if Event A → SOP → Output B → Event C → SOP → Output D,
|
|
5
|
+
* flags chain length and triggers circuit breaker when loops are detected.
|
|
6
|
+
*
|
|
7
|
+
* Defense against the Viral Agent Loop (arXiv:2602.19555).
|
|
8
|
+
*/
|
|
9
|
+
import type { AuditFlag } from './audit.js';
|
|
10
|
+
/** A node in the event chain. */
|
|
11
|
+
export interface ChainNode {
|
|
12
|
+
/** Event ID */
|
|
13
|
+
event_id: string;
|
|
14
|
+
/** Source that emitted this event */
|
|
15
|
+
source: string;
|
|
16
|
+
/** Event type */
|
|
17
|
+
type: string;
|
|
18
|
+
/** Route that matched (if any) */
|
|
19
|
+
route: string | null;
|
|
20
|
+
/** Actor that handled (if any) */
|
|
21
|
+
actor: string | null;
|
|
22
|
+
/** Depth in the chain (1 = root event) */
|
|
23
|
+
depth: number;
|
|
24
|
+
/** ISO 8601 timestamp */
|
|
25
|
+
timestamp: string;
|
|
26
|
+
}
|
|
27
|
+
/** Result of a loop detection check. */
|
|
28
|
+
export interface LoopCheckResult {
|
|
29
|
+
/** Whether a loop was detected */
|
|
30
|
+
loop_detected: boolean;
|
|
31
|
+
/** Whether the circuit breaker tripped */
|
|
32
|
+
circuit_broken: boolean;
|
|
33
|
+
/** Current chain depth */
|
|
34
|
+
chain_depth: number;
|
|
35
|
+
/** The full chain for this trace */
|
|
36
|
+
chain: ChainNode[];
|
|
37
|
+
/** Flags raised */
|
|
38
|
+
flags: AuditFlag[];
|
|
39
|
+
}
|
|
40
|
+
export interface LoopDetectorOptions {
|
|
41
|
+
/** Maximum chain depth before alerting (default: 3) */
|
|
42
|
+
maxChainDepth?: number;
|
|
43
|
+
/** Maximum chain depth before circuit breaking (default: 5) */
|
|
44
|
+
circuitBreakerDepth?: number;
|
|
45
|
+
/** Time window in ms for chain tracking (default: 300000 = 5 minutes) */
|
|
46
|
+
windowMs?: number;
|
|
47
|
+
/** Maximum number of traces to track simultaneously (default: 10000) */
|
|
48
|
+
maxTraces?: number;
|
|
49
|
+
}
|
|
50
|
+
export declare class LoopDetector {
|
|
51
|
+
private readonly chains;
|
|
52
|
+
private readonly maxChainDepth;
|
|
53
|
+
private readonly circuitBreakerDepth;
|
|
54
|
+
private readonly windowMs;
|
|
55
|
+
private readonly maxTraces;
|
|
56
|
+
/** Traces that have been circuit-broken (trace_id → timestamp). */
|
|
57
|
+
private readonly brokenCircuits;
|
|
58
|
+
constructor(options?: LoopDetectorOptions);
|
|
59
|
+
/**
|
|
60
|
+
* Record an event in its chain and check for loops.
|
|
61
|
+
*
|
|
62
|
+
* Call this before processing each event. If the result has
|
|
63
|
+
* circuit_broken=true, the event should NOT be processed.
|
|
64
|
+
*/
|
|
65
|
+
check(traceId: string, eventId: string, source: string, type: string, route: string | null, actor: string | null): LoopCheckResult;
|
|
66
|
+
/** Get the current chain depth for a trace. */
|
|
67
|
+
getChainDepth(traceId: string): number;
|
|
68
|
+
/** Get the full chain for a trace. */
|
|
69
|
+
getChain(traceId: string): ChainNode[];
|
|
70
|
+
/** Check if a trace has been circuit-broken. */
|
|
71
|
+
isCircuitBroken(traceId: string): boolean;
|
|
72
|
+
/** Reset a circuit breaker for a trace (manual override). */
|
|
73
|
+
resetCircuit(traceId: string): void;
|
|
74
|
+
/** Number of active traces being tracked. */
|
|
75
|
+
activeTraces(): number;
|
|
76
|
+
/** Number of broken circuits. */
|
|
77
|
+
brokenCircuitCount(): number;
|
|
78
|
+
/** Clean up expired traces and evict oldest if over limit. */
|
|
79
|
+
private cleanup;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=loop-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-detector.d.ts","sourceRoot":"","sources":["../src/loop-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACzB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kCAAkC;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC/B,kCAAkC;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,0CAA0C;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,mBAAmB;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;gBAEhD,OAAO,CAAC,EAAE,mBAAmB;IAOzC;;;;;OAKG;IACH,KAAK,CACJ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,MAAM,GAAG,IAAI,GAClB,eAAe;IAgFlB,+CAA+C;IAC/C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAItC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE;IAItC,gDAAgD;IAChD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzC,6DAA6D;IAC7D,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,6CAA6C;IAC7C,YAAY,IAAI,MAAM;IAItB,iCAAiC;IACjC,kBAAkB,IAAI,MAAM;IAI5B,8DAA8D;IAC9D,OAAO,CAAC,OAAO;CAqCf"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LoopDetector — event chain tracking and circuit breaker.
|
|
3
|
+
*
|
|
4
|
+
* Tracks event chains: if Event A → SOP → Output B → Event C → SOP → Output D,
|
|
5
|
+
* flags chain length and triggers circuit breaker when loops are detected.
|
|
6
|
+
*
|
|
7
|
+
* Defense against the Viral Agent Loop (arXiv:2602.19555).
|
|
8
|
+
*/
|
|
9
|
+
// ─── LoopDetector Class ──────────────────────────────────────────────────────
|
|
10
|
+
export class LoopDetector {
|
|
11
|
+
chains = new Map();
|
|
12
|
+
maxChainDepth;
|
|
13
|
+
circuitBreakerDepth;
|
|
14
|
+
windowMs;
|
|
15
|
+
maxTraces;
|
|
16
|
+
/** Traces that have been circuit-broken (trace_id → timestamp). */
|
|
17
|
+
brokenCircuits = new Map();
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.maxChainDepth = options?.maxChainDepth ?? 3;
|
|
20
|
+
this.circuitBreakerDepth = options?.circuitBreakerDepth ?? 5;
|
|
21
|
+
this.windowMs = options?.windowMs ?? 300_000;
|
|
22
|
+
this.maxTraces = options?.maxTraces ?? 10_000;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Record an event in its chain and check for loops.
|
|
26
|
+
*
|
|
27
|
+
* Call this before processing each event. If the result has
|
|
28
|
+
* circuit_broken=true, the event should NOT be processed.
|
|
29
|
+
*/
|
|
30
|
+
check(traceId, eventId, source, type, route, actor) {
|
|
31
|
+
this.cleanup();
|
|
32
|
+
// Check if this trace is already circuit-broken
|
|
33
|
+
if (this.brokenCircuits.has(traceId)) {
|
|
34
|
+
return {
|
|
35
|
+
loop_detected: true,
|
|
36
|
+
circuit_broken: true,
|
|
37
|
+
chain_depth: this.getChainDepth(traceId) + 1,
|
|
38
|
+
chain: this.chains.get(traceId) ?? [],
|
|
39
|
+
flags: [
|
|
40
|
+
{
|
|
41
|
+
type: 'chain_depth',
|
|
42
|
+
severity: 'critical',
|
|
43
|
+
message: `Circuit broken for trace ${traceId} — event chain exceeded maximum depth`,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Get or create chain
|
|
49
|
+
let chain = this.chains.get(traceId);
|
|
50
|
+
if (!chain) {
|
|
51
|
+
chain = [];
|
|
52
|
+
this.chains.set(traceId, chain);
|
|
53
|
+
}
|
|
54
|
+
const depth = chain.length + 1;
|
|
55
|
+
// Add node
|
|
56
|
+
const node = {
|
|
57
|
+
event_id: eventId,
|
|
58
|
+
source,
|
|
59
|
+
type,
|
|
60
|
+
route,
|
|
61
|
+
actor,
|
|
62
|
+
depth,
|
|
63
|
+
timestamp: new Date().toISOString(),
|
|
64
|
+
};
|
|
65
|
+
chain.push(node);
|
|
66
|
+
// Check for pattern loops (same source+type appearing multiple times)
|
|
67
|
+
const patternKey = `${source}:${type}`;
|
|
68
|
+
const patternCount = chain.filter((n) => `${n.source}:${n.type}` === patternKey).length;
|
|
69
|
+
const patternLoop = patternCount >= 2;
|
|
70
|
+
// Build flags
|
|
71
|
+
const flags = [];
|
|
72
|
+
if (depth > this.maxChainDepth) {
|
|
73
|
+
flags.push({
|
|
74
|
+
type: 'chain_depth',
|
|
75
|
+
severity: depth >= this.circuitBreakerDepth ? 'critical' : 'warning',
|
|
76
|
+
message: `Event chain depth ${depth} exceeds threshold ${this.maxChainDepth} (trace: ${traceId})`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (patternLoop) {
|
|
80
|
+
flags.push({
|
|
81
|
+
type: 'chain_depth',
|
|
82
|
+
severity: 'warning',
|
|
83
|
+
message: `Repeated event pattern "${patternKey}" detected ${patternCount} times in chain (trace: ${traceId})`,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Circuit breaker
|
|
87
|
+
const shouldBreak = depth >= this.circuitBreakerDepth;
|
|
88
|
+
if (shouldBreak) {
|
|
89
|
+
this.brokenCircuits.set(traceId, Date.now());
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
loop_detected: patternLoop || depth > this.maxChainDepth,
|
|
93
|
+
circuit_broken: shouldBreak,
|
|
94
|
+
chain_depth: depth,
|
|
95
|
+
chain: [...chain],
|
|
96
|
+
flags,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Get the current chain depth for a trace. */
|
|
100
|
+
getChainDepth(traceId) {
|
|
101
|
+
return this.chains.get(traceId)?.length ?? 0;
|
|
102
|
+
}
|
|
103
|
+
/** Get the full chain for a trace. */
|
|
104
|
+
getChain(traceId) {
|
|
105
|
+
return [...(this.chains.get(traceId) ?? [])];
|
|
106
|
+
}
|
|
107
|
+
/** Check if a trace has been circuit-broken. */
|
|
108
|
+
isCircuitBroken(traceId) {
|
|
109
|
+
return this.brokenCircuits.has(traceId);
|
|
110
|
+
}
|
|
111
|
+
/** Reset a circuit breaker for a trace (manual override). */
|
|
112
|
+
resetCircuit(traceId) {
|
|
113
|
+
this.brokenCircuits.delete(traceId);
|
|
114
|
+
}
|
|
115
|
+
/** Number of active traces being tracked. */
|
|
116
|
+
activeTraces() {
|
|
117
|
+
return this.chains.size;
|
|
118
|
+
}
|
|
119
|
+
/** Number of broken circuits. */
|
|
120
|
+
brokenCircuitCount() {
|
|
121
|
+
return this.brokenCircuits.size;
|
|
122
|
+
}
|
|
123
|
+
/** Clean up expired traces and evict oldest if over limit. */
|
|
124
|
+
cleanup() {
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
const cutoff = now - this.windowMs;
|
|
127
|
+
// Remove expired chains
|
|
128
|
+
for (const [traceId, chain] of this.chains) {
|
|
129
|
+
if (chain.length === 0) {
|
|
130
|
+
this.chains.delete(traceId);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const lastTimestamp = new Date(chain[chain.length - 1].timestamp).getTime();
|
|
134
|
+
if (lastTimestamp < cutoff) {
|
|
135
|
+
this.chains.delete(traceId);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Remove expired broken circuits
|
|
139
|
+
for (const [traceId, timestamp] of this.brokenCircuits) {
|
|
140
|
+
if (timestamp < cutoff) {
|
|
141
|
+
this.brokenCircuits.delete(traceId);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Evict oldest traces if over limit
|
|
145
|
+
if (this.chains.size > this.maxTraces) {
|
|
146
|
+
const entries = [...this.chains.entries()].sort((a, b) => {
|
|
147
|
+
const aTime = a[1].length > 0 ? new Date(a[1][a[1].length - 1].timestamp).getTime() : 0;
|
|
148
|
+
const bTime = b[1].length > 0 ? new Date(b[1][b[1].length - 1].timestamp).getTime() : 0;
|
|
149
|
+
return aTime - bTime;
|
|
150
|
+
});
|
|
151
|
+
const toRemove = entries.slice(0, entries.length - this.maxTraces);
|
|
152
|
+
for (const [traceId] of toRemove) {
|
|
153
|
+
this.chains.delete(traceId);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=loop-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-detector.js","sourceRoot":"","sources":["../src/loop-detector.ts"],"names":[],"mappings":"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"}
|
package/dist/metrics.d.ts
CHANGED
|
@@ -27,5 +27,9 @@ export declare class MetricsServer {
|
|
|
27
27
|
isStarted(): boolean;
|
|
28
28
|
/** Returns the port the metrics server is listening on, or null. */
|
|
29
29
|
port(): number | null;
|
|
30
|
+
/** Get Prometheus metrics as text (for embedding in REST API). */
|
|
31
|
+
metricsText(): Promise<string>;
|
|
32
|
+
/** Get the content type header for metrics response. */
|
|
33
|
+
contentType(): string;
|
|
30
34
|
}
|
|
31
35
|
//# sourceMappingURL=metrics.d.ts.map
|
package/dist/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAyB,KAAK,EAAE,SAAS,EAAY,MAAM,aAAa,CAAC;AAEzF,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,MAAM,WAAW,oBAAoB;IACpC,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAA+C;IAIrE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,sBAAsB,EAAE,SAAS,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC;;IA2C3B,KAAK,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B,uDAAuD;IACvD,SAAS,IAAI,OAAO;IAIpB,oEAAoE;IACpE,IAAI,IAAI,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAyB,KAAK,EAAE,SAAS,EAAY,MAAM,aAAa,CAAC;AAEzF,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,MAAM,WAAW,oBAAoB;IACpC,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAA+C;IAIrE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,sBAAsB,EAAE,SAAS,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC;;IA2C3B,KAAK,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B,uDAAuD;IACvD,SAAS,IAAI,OAAO;IAIpB,oEAAoE;IACpE,IAAI,IAAI,MAAM,GAAG,IAAI;IAOrB,kEAAkE;IAC5D,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAIpC,wDAAwD;IACxD,WAAW,IAAI,MAAM;CAGrB"}
|
package/dist/metrics.js
CHANGED
|
@@ -123,5 +123,13 @@ export class MetricsServer {
|
|
|
123
123
|
return addr.port;
|
|
124
124
|
return null;
|
|
125
125
|
}
|
|
126
|
+
/** Get Prometheus metrics as text (for embedding in REST API). */
|
|
127
|
+
async metricsText() {
|
|
128
|
+
return this.registry.metrics();
|
|
129
|
+
}
|
|
130
|
+
/** Get the content type header for metrics response. */
|
|
131
|
+
contentType() {
|
|
132
|
+
return this.registry.contentType;
|
|
133
|
+
}
|
|
126
134
|
}
|
|
127
135
|
//# sourceMappingURL=metrics.js.map
|
package/dist/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAOzC,MAAM,OAAO,aAAa;IACR,QAAQ,CAAW;IAC5B,MAAM,GAAkB,IAAI,CAAC;IAC7B,WAAW,GAAG,CAAC,CAAC;IAChB,cAAc,GAA0C,IAAI,CAAC;IAErE,4EAA4E;IAEnE,YAAY,CAAU;IACtB,sBAAsB,CAAY;IAClC,eAAe,CAAU;IACzB,aAAa,CAAQ;IACrB,gBAAgB,CAAQ;IAEjC;QACC,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE/B,iEAAiE;QACjE,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,CAAC;YAC/B,IAAI,EAAE,6BAA6B;YACnC,IAAI,EAAE,yCAAyC;YAC/C,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,CAAU;YAC3C,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,sBAAsB,GAAG,IAAI,SAAS,CAAC;YAC3C,IAAI,EAAE,kCAAkC;YACxC,IAAI,EAAE,2DAA2D;YACjE,UAAU,EAAE,CAAC,OAAO,CAAU;YAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAClE,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,CAAC;YAClC,IAAI,EAAE,gCAAgC;YACtC,IAAI,EAAE,4EAA4E;YAClF,UAAU,EAAE,CAAC,WAAW,CAAU;YAClC,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,CAAC;YAC9B,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE,mCAAmC;YACzC,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,GAAG,IAAI,KAAK,CAAC;YACjC,IAAI,EAAE,2BAA2B;YACjC,IAAI,EAAE,oDAAoD;YAC1D,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC1B,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAA8B;QACzC,MAAM,IAAI,GACT,OAAO,EAAE,IAAI;YACb,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBAChC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBACvD,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAE1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE9B,sCAAsC;QACtC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC7C,IAAI,GAAG,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBACpD,IAAI,CAAC;wBACJ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBAC9C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;wBAClE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAClB,CAAC;oBAAC,MAAM,CAAC;wBACR,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wBACnB,GAAG,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;oBACrC,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACtB,CAAC;YACF,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;gBAC1C,OAAO,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACT,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC/B,GAAG,CAAC,mBAAmB,EAAE,CAAC;YAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;gBACd,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,OAAO,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,SAAS;QACR,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAC7B,CAAC;IAED,oEAAoE;IACpE,IAAI;QACH,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QACvD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,wDAAwD;IACxD,WAAW;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;IAClC,CAAC;CACD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OutputValidator — pre-delivery validation of SOP outputs.
|
|
3
|
+
*
|
|
4
|
+
* Checks for potential payload propagation (viral agent loop defense):
|
|
5
|
+
* - Instruction-like content in outputs (potential injection)
|
|
6
|
+
* - Content similarity to input (echo/amplification)
|
|
7
|
+
* - References to tools, URLs, or actions outside expected SOP scope
|
|
8
|
+
*/
|
|
9
|
+
import type { OrgLoopEvent } from '@orgloop/sdk';
|
|
10
|
+
import type { AuditFlag } from './audit.js';
|
|
11
|
+
export interface OutputValidationResult {
|
|
12
|
+
/** Whether the output passed validation */
|
|
13
|
+
passed: boolean;
|
|
14
|
+
/** Whether the output should be held for human review */
|
|
15
|
+
hold_for_review: boolean;
|
|
16
|
+
/** Flags raised during validation */
|
|
17
|
+
flags: AuditFlag[];
|
|
18
|
+
}
|
|
19
|
+
export interface OutputValidatorOptions {
|
|
20
|
+
/** Enable instruction content detection (default: true) */
|
|
21
|
+
detectInstructions?: boolean;
|
|
22
|
+
/** Enable input echo detection (default: true) */
|
|
23
|
+
detectEcho?: boolean;
|
|
24
|
+
/** Enable scope violation detection (default: true) */
|
|
25
|
+
detectScopeViolations?: boolean;
|
|
26
|
+
/** Similarity threshold for echo detection (0-1, default: 0.7) */
|
|
27
|
+
echoThreshold?: number;
|
|
28
|
+
/** Hold outputs with critical flags for human review (default: false) */
|
|
29
|
+
holdOnCritical?: boolean;
|
|
30
|
+
/** Custom instruction patterns to detect */
|
|
31
|
+
instructionPatterns?: RegExp[];
|
|
32
|
+
/** Allowed URL domains for scope checking */
|
|
33
|
+
allowedDomains?: string[];
|
|
34
|
+
}
|
|
35
|
+
export declare class OutputValidator {
|
|
36
|
+
private readonly options;
|
|
37
|
+
constructor(options?: OutputValidatorOptions);
|
|
38
|
+
/**
|
|
39
|
+
* Validate an output payload before it's committed to an external system.
|
|
40
|
+
*/
|
|
41
|
+
validate(outputContent: string, inputEvent: OrgLoopEvent, sopScope?: {
|
|
42
|
+
allowedActions?: string[];
|
|
43
|
+
allowedDomains?: string[];
|
|
44
|
+
}): OutputValidationResult;
|
|
45
|
+
/** Check for instruction-like content that could be prompt injection. */
|
|
46
|
+
private checkInstructionContent;
|
|
47
|
+
/** Check if the output is suspiciously similar to the input (echo/amplification). */
|
|
48
|
+
private checkInputEcho;
|
|
49
|
+
/** Check for references to tools, URLs, or actions outside SOP's expected scope. */
|
|
50
|
+
private checkScopeViolations;
|
|
51
|
+
/**
|
|
52
|
+
* Compute bigram-based Jaccard similarity between two strings.
|
|
53
|
+
* Returns 0-1 where 1 is identical.
|
|
54
|
+
*/
|
|
55
|
+
private computeSimilarity;
|
|
56
|
+
/** Extract character bigrams from a string. */
|
|
57
|
+
private toBigrams;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=output-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-validator.d.ts","sourceRoot":"","sources":["../src/output-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,sBAAsB;IACtC,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,eAAe,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,KAAK,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAwBD,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAKtB;gBAEU,OAAO,CAAC,EAAE,sBAAsB;IAe5C;;OAEG;IACH,QAAQ,CACP,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,YAAY,EACxB,QAAQ,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACjE,sBAAsB;IAyBzB,yEAAyE;IACzE,OAAO,CAAC,uBAAuB;IAiB/B,qFAAqF;IACrF,OAAO,CAAC,cAAc;IAoBtB,oFAAoF;IACpF,OAAO,CAAC,oBAAoB;IA4D5B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAsBzB,+CAA+C;IAC/C,OAAO,CAAC,SAAS;CAQjB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OutputValidator — pre-delivery validation of SOP outputs.
|
|
3
|
+
*
|
|
4
|
+
* Checks for potential payload propagation (viral agent loop defense):
|
|
5
|
+
* - Instruction-like content in outputs (potential injection)
|
|
6
|
+
* - Content similarity to input (echo/amplification)
|
|
7
|
+
* - References to tools, URLs, or actions outside expected SOP scope
|
|
8
|
+
*/
|
|
9
|
+
// ─── Instruction Detection Patterns ──────────────────────────────────────────
|
|
10
|
+
const DEFAULT_INSTRUCTION_PATTERNS = [
|
|
11
|
+
// System prompt injection markers
|
|
12
|
+
/\bignore\s+(all\s+)?previous\s+instructions\b/i,
|
|
13
|
+
/\byou\s+are\s+now\b/i,
|
|
14
|
+
/\bsystem\s*:\s*/i,
|
|
15
|
+
/\b(new|override|updated?)\s+instructions?\b/i,
|
|
16
|
+
// Agent manipulation
|
|
17
|
+
/\bexecute\s+(this|the\s+following)\s+(command|code|script)\b/i,
|
|
18
|
+
/\brun\s+(this|the\s+following)\s+(command|code|script)\b/i,
|
|
19
|
+
/\bmodify\s+your\s+(instructions?|behavior|prompt)\b/i,
|
|
20
|
+
// Prompt injection delimiters
|
|
21
|
+
/^-{3,}\s*$/m,
|
|
22
|
+
/\[INST\]/i,
|
|
23
|
+
/<<\s*SYS\s*>>/i,
|
|
24
|
+
// Encoded instructions
|
|
25
|
+
/\bbase64\s*[:=]\s*[A-Za-z0-9+/=]{20,}/i,
|
|
26
|
+
];
|
|
27
|
+
// ─── OutputValidator Class ───────────────────────────────────────────────────
|
|
28
|
+
export class OutputValidator {
|
|
29
|
+
options;
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.options = {
|
|
32
|
+
detectInstructions: options?.detectInstructions ?? true,
|
|
33
|
+
detectEcho: options?.detectEcho ?? true,
|
|
34
|
+
detectScopeViolations: options?.detectScopeViolations ?? true,
|
|
35
|
+
echoThreshold: options?.echoThreshold ?? 0.7,
|
|
36
|
+
holdOnCritical: options?.holdOnCritical ?? false,
|
|
37
|
+
instructionPatterns: [
|
|
38
|
+
...DEFAULT_INSTRUCTION_PATTERNS,
|
|
39
|
+
...(options?.instructionPatterns ?? []),
|
|
40
|
+
],
|
|
41
|
+
allowedDomains: options?.allowedDomains ?? [],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate an output payload before it's committed to an external system.
|
|
46
|
+
*/
|
|
47
|
+
validate(outputContent, inputEvent, sopScope) {
|
|
48
|
+
const flags = [];
|
|
49
|
+
if (this.options.detectInstructions) {
|
|
50
|
+
flags.push(...this.checkInstructionContent(outputContent));
|
|
51
|
+
}
|
|
52
|
+
if (this.options.detectEcho) {
|
|
53
|
+
flags.push(...this.checkInputEcho(outputContent, inputEvent));
|
|
54
|
+
}
|
|
55
|
+
if (this.options.detectScopeViolations) {
|
|
56
|
+
flags.push(...this.checkScopeViolations(outputContent, sopScope));
|
|
57
|
+
}
|
|
58
|
+
const hasCritical = flags.some((f) => f.severity === 'critical');
|
|
59
|
+
const holdForReview = hasCritical && this.options.holdOnCritical;
|
|
60
|
+
return {
|
|
61
|
+
passed: !hasCritical,
|
|
62
|
+
hold_for_review: holdForReview,
|
|
63
|
+
flags,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Check for instruction-like content that could be prompt injection. */
|
|
67
|
+
checkInstructionContent(content) {
|
|
68
|
+
const flags = [];
|
|
69
|
+
for (const pattern of this.options.instructionPatterns) {
|
|
70
|
+
const match = pattern.exec(content);
|
|
71
|
+
if (match) {
|
|
72
|
+
flags.push({
|
|
73
|
+
type: 'instruction_content',
|
|
74
|
+
severity: 'critical',
|
|
75
|
+
message: `Potential instruction injection detected: "${match[0]}"`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return flags;
|
|
80
|
+
}
|
|
81
|
+
/** Check if the output is suspiciously similar to the input (echo/amplification). */
|
|
82
|
+
checkInputEcho(content, inputEvent) {
|
|
83
|
+
const flags = [];
|
|
84
|
+
// Serialize input payload for comparison
|
|
85
|
+
const inputText = JSON.stringify(inputEvent.payload);
|
|
86
|
+
if (!inputText || inputText.length < 20)
|
|
87
|
+
return flags;
|
|
88
|
+
const similarity = this.computeSimilarity(content, inputText);
|
|
89
|
+
if (similarity >= this.options.echoThreshold) {
|
|
90
|
+
flags.push({
|
|
91
|
+
type: 'input_echo',
|
|
92
|
+
severity: similarity >= 0.9 ? 'critical' : 'warning',
|
|
93
|
+
message: `Output is ${Math.round(similarity * 100)}% similar to input payload (threshold: ${Math.round(this.options.echoThreshold * 100)}%)`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return flags;
|
|
97
|
+
}
|
|
98
|
+
/** Check for references to tools, URLs, or actions outside SOP's expected scope. */
|
|
99
|
+
checkScopeViolations(content, sopScope) {
|
|
100
|
+
const flags = [];
|
|
101
|
+
// Extract URLs from content
|
|
102
|
+
const urlPattern = /https?:\/\/[^\s"'<>)}\]]+/gi;
|
|
103
|
+
const urls = content.match(urlPattern) ?? [];
|
|
104
|
+
const allowedDomains = [...this.options.allowedDomains, ...(sopScope?.allowedDomains ?? [])];
|
|
105
|
+
if (allowedDomains.length > 0) {
|
|
106
|
+
for (const url of urls) {
|
|
107
|
+
try {
|
|
108
|
+
const hostname = new URL(url).hostname;
|
|
109
|
+
const isAllowed = allowedDomains.some((d) => hostname === d || hostname.endsWith(`.${d}`));
|
|
110
|
+
if (!isAllowed) {
|
|
111
|
+
flags.push({
|
|
112
|
+
type: 'scope_violation',
|
|
113
|
+
severity: 'warning',
|
|
114
|
+
message: `URL references domain "${hostname}" not in allowed scope: ${allowedDomains.join(', ')}`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Malformed URL — flag it
|
|
120
|
+
flags.push({
|
|
121
|
+
type: 'scope_violation',
|
|
122
|
+
severity: 'warning',
|
|
123
|
+
message: `Malformed URL detected in output: "${url.slice(0, 100)}"`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Check for shell command patterns
|
|
129
|
+
const shellPatterns = [
|
|
130
|
+
/\b(curl|wget|ssh|scp|rsync)\s+/i,
|
|
131
|
+
/\brm\s+-rf\b/i,
|
|
132
|
+
/\bsudo\s+/i,
|
|
133
|
+
/\bchmod\s+[0-7]{3,4}\b/i,
|
|
134
|
+
/\|\s*(bash|sh|zsh)\b/i,
|
|
135
|
+
];
|
|
136
|
+
for (const pattern of shellPatterns) {
|
|
137
|
+
const match = pattern.exec(content);
|
|
138
|
+
if (match) {
|
|
139
|
+
flags.push({
|
|
140
|
+
type: 'scope_violation',
|
|
141
|
+
severity: 'warning',
|
|
142
|
+
message: `Shell command pattern detected in output: "${match[0]}"`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return flags;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Compute bigram-based Jaccard similarity between two strings.
|
|
150
|
+
* Returns 0-1 where 1 is identical.
|
|
151
|
+
*/
|
|
152
|
+
computeSimilarity(a, b) {
|
|
153
|
+
if (a.length === 0 && b.length === 0)
|
|
154
|
+
return 1;
|
|
155
|
+
if (a.length === 0 || b.length === 0)
|
|
156
|
+
return 0;
|
|
157
|
+
const bigramsA = this.toBigrams(a.toLowerCase());
|
|
158
|
+
const bigramsB = this.toBigrams(b.toLowerCase());
|
|
159
|
+
let intersection = 0;
|
|
160
|
+
const bCopy = new Map(bigramsA);
|
|
161
|
+
for (const [bigram, countA] of bCopy) {
|
|
162
|
+
const countB = bigramsB.get(bigram) ?? 0;
|
|
163
|
+
intersection += Math.min(countA, countB);
|
|
164
|
+
}
|
|
165
|
+
const totalA = [...bigramsA.values()].reduce((s, v) => s + v, 0);
|
|
166
|
+
const totalB = [...bigramsB.values()].reduce((s, v) => s + v, 0);
|
|
167
|
+
const union = totalA + totalB - intersection;
|
|
168
|
+
return union === 0 ? 0 : intersection / union;
|
|
169
|
+
}
|
|
170
|
+
/** Extract character bigrams from a string. */
|
|
171
|
+
toBigrams(s) {
|
|
172
|
+
const bigrams = new Map();
|
|
173
|
+
for (let i = 0; i < s.length - 1; i++) {
|
|
174
|
+
const bigram = s.slice(i, i + 2);
|
|
175
|
+
bigrams.set(bigram, (bigrams.get(bigram) ?? 0) + 1);
|
|
176
|
+
}
|
|
177
|
+
return bigrams;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=output-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-validator.js","sourceRoot":"","sources":["../src/output-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
import type { Runtime } from './runtime.js';
|
|
13
|
+
/**
|
|
14
|
+
* Register all REST API endpoints on the runtime's webhook server.
|
|
15
|
+
*
|
|
16
|
+
* The /api/doctor endpoint is NOT registered here — it requires CLI-level
|
|
17
|
+
* config resolution. Register it separately via runtime.getWebhookServer().registerApiHandler().
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerRestApi(runtime: Runtime): void;
|
|
20
|
+
//# sourceMappingURL=rest-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-api.d.ts","sourceRoot":"","sources":["../src/rest-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqEtD"}
|