4runr-os 2.9.128 → 2.9.129
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/package.json +5 -2
- package/packages/sentinel/dist/adapters/audit.d.ts +33 -0
- package/packages/sentinel/dist/adapters/audit.d.ts.map +1 -0
- package/packages/sentinel/dist/adapters/audit.js +118 -0
- package/packages/sentinel/dist/adapters/audit.js.map +1 -0
- package/packages/sentinel/dist/adapters/cancel-adapter.d.ts +20 -0
- package/packages/sentinel/dist/adapters/cancel-adapter.d.ts.map +1 -0
- package/packages/sentinel/dist/adapters/cancel-adapter.js +75 -0
- package/packages/sentinel/dist/adapters/cancel-adapter.js.map +1 -0
- package/packages/sentinel/dist/adapters/telemetry.d.ts +25 -0
- package/packages/sentinel/dist/adapters/telemetry.d.ts.map +1 -0
- package/packages/sentinel/dist/adapters/telemetry.js +46 -0
- package/packages/sentinel/dist/adapters/telemetry.js.map +1 -0
- package/packages/sentinel/dist/config.d.ts +6 -0
- package/packages/sentinel/dist/config.d.ts.map +1 -0
- package/packages/sentinel/dist/config.js +52 -0
- package/packages/sentinel/dist/config.js.map +1 -0
- package/packages/sentinel/dist/index.d.ts +12 -0
- package/packages/sentinel/dist/index.d.ts.map +1 -0
- package/packages/sentinel/dist/index.js +33 -0
- package/packages/sentinel/dist/index.js.map +1 -0
- package/packages/sentinel/dist/internal/event-buffer.d.ts +13 -0
- package/packages/sentinel/dist/internal/event-buffer.d.ts.map +1 -0
- package/packages/sentinel/dist/internal/event-buffer.js +93 -0
- package/packages/sentinel/dist/internal/event-buffer.js.map +1 -0
- package/packages/sentinel/dist/policies.d.ts +41 -0
- package/packages/sentinel/dist/policies.d.ts.map +1 -0
- package/packages/sentinel/dist/policies.js +179 -0
- package/packages/sentinel/dist/policies.js.map +1 -0
- package/packages/sentinel/dist/policy-templates.d.ts +13 -0
- package/packages/sentinel/dist/policy-templates.d.ts.map +1 -0
- package/packages/sentinel/dist/policy-templates.js +143 -0
- package/packages/sentinel/dist/policy-templates.js.map +1 -0
- package/packages/sentinel/dist/predictive.d.ts +13 -0
- package/packages/sentinel/dist/predictive.d.ts.map +1 -0
- package/packages/sentinel/dist/predictive.js +105 -0
- package/packages/sentinel/dist/predictive.js.map +1 -0
- package/packages/sentinel/dist/sentinel.d.ts +31 -0
- package/packages/sentinel/dist/sentinel.d.ts.map +1 -0
- package/packages/sentinel/dist/sentinel.js +217 -0
- package/packages/sentinel/dist/sentinel.js.map +1 -0
- package/packages/sentinel/dist/types.d.ts +58 -0
- package/packages/sentinel/dist/types.d.ts.map +1 -0
- package/packages/sentinel/dist/types.js +3 -0
- package/packages/sentinel/dist/types.js.map +1 -0
- package/packages/shared/dist/env.d.ts +84 -0
- package/packages/shared/dist/env.d.ts.map +1 -0
- package/packages/shared/dist/env.js +222 -0
- package/packages/shared/dist/env.js.map +1 -0
- package/packages/shared/dist/index.d.ts +6 -0
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +47 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/shared/dist/logger.d.ts +33 -0
- package/packages/shared/dist/logger.d.ts.map +1 -0
- package/packages/shared/dist/logger.js +128 -0
- package/packages/shared/dist/logger.js.map +1 -0
- package/packages/shared/dist/persistence/db-blocker.d.ts +11 -0
- package/packages/shared/dist/persistence/db-blocker.d.ts.map +1 -0
- package/packages/shared/dist/persistence/db-blocker.js +58 -0
- package/packages/shared/dist/persistence/db-blocker.js.map +1 -0
- package/packages/shared/dist/persistence/fs-blocker.d.ts +26 -0
- package/packages/shared/dist/persistence/fs-blocker.d.ts.map +1 -0
- package/packages/shared/dist/persistence/fs-blocker.js +232 -0
- package/packages/shared/dist/persistence/fs-blocker.js.map +1 -0
- package/packages/shared/dist/persistence/index.d.ts +9 -0
- package/packages/shared/dist/persistence/index.d.ts.map +1 -0
- package/packages/shared/dist/persistence/index.js +68 -0
- package/packages/shared/dist/persistence/index.js.map +1 -0
- package/packages/shared/dist/persistence/memory-store.d.ts +57 -0
- package/packages/shared/dist/persistence/memory-store.d.ts.map +1 -0
- package/packages/shared/dist/persistence/memory-store.js +221 -0
- package/packages/shared/dist/persistence/memory-store.js.map +1 -0
- package/packages/shared/dist/types.d.ts +155 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/types.js +3 -0
- package/packages/shared/dist/types.js.map +1 -0
- package/packages/shared/dist/utils.d.ts +25 -0
- package/packages/shared/dist/utils.d.ts.map +1 -0
- package/packages/shared/dist/utils.js +147 -0
- package/packages/shared/dist/utils.js.map +1 -0
- package/packages/shield/dist/detectors/hallucination-detector.d.ts +26 -0
- package/packages/shield/dist/detectors/hallucination-detector.d.ts.map +1 -0
- package/packages/shield/dist/detectors/hallucination-detector.js +185 -0
- package/packages/shield/dist/detectors/hallucination-detector.js.map +1 -0
- package/packages/shield/dist/detectors/injection-detector.d.ts +31 -0
- package/packages/shield/dist/detectors/injection-detector.d.ts.map +1 -0
- package/packages/shield/dist/detectors/injection-detector.js +256 -0
- package/packages/shield/dist/detectors/injection-detector.js.map +1 -0
- package/packages/shield/dist/detectors/pii-detector.d.ts +35 -0
- package/packages/shield/dist/detectors/pii-detector.d.ts.map +1 -0
- package/packages/shield/dist/detectors/pii-detector.js +126 -0
- package/packages/shield/dist/detectors/pii-detector.js.map +1 -0
- package/packages/shield/dist/index.d.ts +5 -0
- package/packages/shield/dist/index.d.ts.map +1 -0
- package/packages/shield/dist/index.js +12 -0
- package/packages/shield/dist/index.js.map +1 -0
- package/packages/shield/dist/shield.d.ts +64 -0
- package/packages/shield/dist/shield.d.ts.map +1 -0
- package/packages/shield/dist/shield.js +319 -0
- package/packages/shield/dist/shield.js.map +1 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { RunState, SentinelConfig } from './types';
|
|
2
|
+
export interface PolicyViolation {
|
|
3
|
+
policy: string;
|
|
4
|
+
reason: string;
|
|
5
|
+
threshold: number;
|
|
6
|
+
actual: number;
|
|
7
|
+
runId: string;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Policy {
|
|
11
|
+
name: string;
|
|
12
|
+
evaluate(runId: string, runState: RunState, config: SentinelConfig): PolicyViolation | null;
|
|
13
|
+
}
|
|
14
|
+
export declare class TimeoutPolicy implements Policy {
|
|
15
|
+
name: string;
|
|
16
|
+
evaluate(runId: string, runState: RunState, config: SentinelConfig): PolicyViolation | null;
|
|
17
|
+
}
|
|
18
|
+
export declare class IdlePolicy implements Policy {
|
|
19
|
+
name: string;
|
|
20
|
+
evaluate(runId: string, runState: RunState, config: SentinelConfig): PolicyViolation | null;
|
|
21
|
+
}
|
|
22
|
+
export declare class TokenCapPolicy implements Policy {
|
|
23
|
+
name: string;
|
|
24
|
+
evaluate(runId: string, runState: RunState, config: SentinelConfig): PolicyViolation | null;
|
|
25
|
+
}
|
|
26
|
+
export declare class LoopDetectionPolicy implements Policy {
|
|
27
|
+
name: string;
|
|
28
|
+
evaluate(runId: string, runState: RunState, config: SentinelConfig): PolicyViolation | null;
|
|
29
|
+
}
|
|
30
|
+
export declare class CostPolicy implements Policy {
|
|
31
|
+
name: string;
|
|
32
|
+
evaluate(runId: string, runState: RunState, config: SentinelConfig): PolicyViolation | null;
|
|
33
|
+
}
|
|
34
|
+
export declare class PolicyManager {
|
|
35
|
+
private policies;
|
|
36
|
+
evaluatePolicies(runId: string, runState: RunState, config: SentinelConfig): PolicyViolation[];
|
|
37
|
+
getPolicy(name: string): Policy | undefined;
|
|
38
|
+
getPolicyNames(): string[];
|
|
39
|
+
}
|
|
40
|
+
export declare const policyManager: PolicyManager;
|
|
41
|
+
//# sourceMappingURL=policies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CAAC;CAC7F;AAKD,qBAAa,aAAc,YAAW,MAAM;IAC1C,IAAI,SAAa;IAEjB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI;CAmB5F;AAKD,qBAAa,UAAW,YAAW,MAAM;IACvC,IAAI,SAAU;IAEd,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI;CAoC5F;AAKD,qBAAa,cAAe,YAAW,MAAM;IAC3C,IAAI,SAAe;IAEnB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI;CAkB5F;AAKD,qBAAa,mBAAoB,YAAW,MAAM;IAChD,IAAI,SAAoB;IAExB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI;CAuC5F;AAKD,qBAAa,UAAW,YAAW,MAAM;IACvC,IAAI,SAAU;IAEd,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI;CAqB5F;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAMd;IAKF,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,EAAE;IAoB9F,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO3C,cAAc,IAAI,MAAM,EAAE;CAG3B;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.policyManager = exports.PolicyManager = exports.CostPolicy = exports.LoopDetectionPolicy = exports.TokenCapPolicy = exports.IdlePolicy = exports.TimeoutPolicy = void 0;
|
|
4
|
+
class TimeoutPolicy {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'timeout';
|
|
7
|
+
}
|
|
8
|
+
evaluate(runId, runState, config) {
|
|
9
|
+
if (!runState.startedAt || runState.status !== 'running') {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const duration = Date.now() - runState.startedAt;
|
|
13
|
+
if (duration > config.runMaxDurationMs) {
|
|
14
|
+
return {
|
|
15
|
+
policy: this.name,
|
|
16
|
+
reason: `Run exceeded maximum duration of ${config.runMaxDurationMs}ms`,
|
|
17
|
+
threshold: config.runMaxDurationMs,
|
|
18
|
+
actual: duration,
|
|
19
|
+
runId,
|
|
20
|
+
timestamp: Date.now()
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.TimeoutPolicy = TimeoutPolicy;
|
|
27
|
+
class IdlePolicy {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.name = 'idle';
|
|
30
|
+
}
|
|
31
|
+
evaluate(runId, runState, config) {
|
|
32
|
+
if (!runState.startedAt || runState.status !== 'running') {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (!runState.lastTokenAt) {
|
|
36
|
+
const timeSinceStart = Date.now() - runState.startedAt;
|
|
37
|
+
if (timeSinceStart > config.runIdleMs) {
|
|
38
|
+
return {
|
|
39
|
+
policy: this.name,
|
|
40
|
+
reason: `Run has been idle (no tokens) for ${timeSinceStart}ms`,
|
|
41
|
+
threshold: config.runIdleMs,
|
|
42
|
+
actual: timeSinceStart,
|
|
43
|
+
runId,
|
|
44
|
+
timestamp: Date.now()
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const timeSinceLastToken = Date.now() - runState.lastTokenAt;
|
|
50
|
+
if (timeSinceLastToken > config.runIdleMs) {
|
|
51
|
+
return {
|
|
52
|
+
policy: this.name,
|
|
53
|
+
reason: `Run has been idle (no new tokens) for ${timeSinceLastToken}ms`,
|
|
54
|
+
threshold: config.runIdleMs,
|
|
55
|
+
actual: timeSinceLastToken,
|
|
56
|
+
runId,
|
|
57
|
+
timestamp: Date.now()
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.IdlePolicy = IdlePolicy;
|
|
64
|
+
class TokenCapPolicy {
|
|
65
|
+
constructor() {
|
|
66
|
+
this.name = 'token_cap';
|
|
67
|
+
}
|
|
68
|
+
evaluate(runId, runState, config) {
|
|
69
|
+
if (runState.status !== 'running') {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
if (runState.tokenCount > config.runMaxTokens) {
|
|
73
|
+
return {
|
|
74
|
+
policy: this.name,
|
|
75
|
+
reason: `Run exceeded maximum token count of ${config.runMaxTokens}`,
|
|
76
|
+
threshold: config.runMaxTokens,
|
|
77
|
+
actual: runState.tokenCount,
|
|
78
|
+
runId,
|
|
79
|
+
timestamp: Date.now()
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.TokenCapPolicy = TokenCapPolicy;
|
|
86
|
+
class LoopDetectionPolicy {
|
|
87
|
+
constructor() {
|
|
88
|
+
this.name = 'loop_detection';
|
|
89
|
+
}
|
|
90
|
+
evaluate(runId, runState, config) {
|
|
91
|
+
if (runState.status !== 'running' || runState.events.length < 10) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
const cutoff = now - (config.loopWindow * 1000);
|
|
96
|
+
const recentTokenEvents = runState.events
|
|
97
|
+
.filter(event => event.type === 'token' && event.at >= cutoff)
|
|
98
|
+
.slice(-config.loopMax);
|
|
99
|
+
if (recentTokenEvents.length >= config.loopMax) {
|
|
100
|
+
const tokenCounts = recentTokenEvents.map(event => event.type === 'token' ? event.tokens : 0);
|
|
101
|
+
const tokenCountMap = new Map();
|
|
102
|
+
for (const count of tokenCounts) {
|
|
103
|
+
tokenCountMap.set(count, (tokenCountMap.get(count) || 0) + 1);
|
|
104
|
+
}
|
|
105
|
+
const maxRepetition = Math.max(...tokenCountMap.values());
|
|
106
|
+
if (maxRepetition >= Math.ceil(config.loopMax * 0.7)) {
|
|
107
|
+
return {
|
|
108
|
+
policy: this.name,
|
|
109
|
+
reason: `Run detected in loop pattern with ${maxRepetition} repeated token counts`,
|
|
110
|
+
threshold: Math.ceil(config.loopMax * 0.7),
|
|
111
|
+
actual: maxRepetition,
|
|
112
|
+
runId,
|
|
113
|
+
timestamp: Date.now()
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.LoopDetectionPolicy = LoopDetectionPolicy;
|
|
121
|
+
class CostPolicy {
|
|
122
|
+
constructor() {
|
|
123
|
+
this.name = 'cost';
|
|
124
|
+
}
|
|
125
|
+
evaluate(runId, runState, config) {
|
|
126
|
+
if (runState.status !== 'running') {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const maxCost = config.runMaxCost || 1.0;
|
|
130
|
+
const currentCost = runState.cost || 0;
|
|
131
|
+
if (currentCost > maxCost) {
|
|
132
|
+
return {
|
|
133
|
+
policy: this.name,
|
|
134
|
+
reason: `Run exceeded maximum cost of $${maxCost.toFixed(2)}`,
|
|
135
|
+
threshold: maxCost,
|
|
136
|
+
actual: currentCost,
|
|
137
|
+
runId,
|
|
138
|
+
timestamp: Date.now()
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.CostPolicy = CostPolicy;
|
|
145
|
+
class PolicyManager {
|
|
146
|
+
constructor() {
|
|
147
|
+
this.policies = [
|
|
148
|
+
new TimeoutPolicy(),
|
|
149
|
+
new IdlePolicy(),
|
|
150
|
+
new TokenCapPolicy(),
|
|
151
|
+
new LoopDetectionPolicy(),
|
|
152
|
+
new CostPolicy()
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
evaluatePolicies(runId, runState, config) {
|
|
156
|
+
const violations = [];
|
|
157
|
+
for (const policy of this.policies) {
|
|
158
|
+
try {
|
|
159
|
+
const violation = policy.evaluate(runId, runState, config);
|
|
160
|
+
if (violation) {
|
|
161
|
+
violations.push(violation);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error(`Policy ${policy.name} evaluation failed for run ${runId}:`, error);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return violations;
|
|
169
|
+
}
|
|
170
|
+
getPolicy(name) {
|
|
171
|
+
return this.policies.find(p => p.name === name);
|
|
172
|
+
}
|
|
173
|
+
getPolicyNames() {
|
|
174
|
+
return this.policies.map(p => p.name);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.PolicyManager = PolicyManager;
|
|
178
|
+
exports.policyManager = new PolicyManager();
|
|
179
|
+
//# sourceMappingURL=policies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":";;;AAmBA,MAAa,aAAa;IAA1B;QACE,SAAI,GAAG,SAAS,CAAC;IAqBnB,CAAC;IAnBC,QAAQ,CAAC,KAAa,EAAE,QAAkB,EAAE,MAAsB;QAChE,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;QACjD,IAAI,QAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,MAAM,EAAE,oCAAoC,MAAM,CAAC,gBAAgB,IAAI;gBACvE,SAAS,EAAE,MAAM,CAAC,gBAAgB;gBAClC,MAAM,EAAE,QAAQ;gBAChB,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAtBD,sCAsBC;AAKD,MAAa,UAAU;IAAvB;QACE,SAAI,GAAG,MAAM,CAAC;IAsChB,CAAC;IApCC,QAAQ,CAAC,KAAa,EAAE,QAAkB,EAAE,MAAsB;QAChE,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;YACvD,IAAI,cAAc,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtC,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,IAAI;oBACjB,MAAM,EAAE,qCAAqC,cAAc,IAAI;oBAC/D,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,MAAM,EAAE,cAAc;oBACtB,KAAK;oBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC;QAC7D,IAAI,kBAAkB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,MAAM,EAAE,yCAAyC,kBAAkB,IAAI;gBACvE,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE,kBAAkB;gBAC1B,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvCD,gCAuCC;AAKD,MAAa,cAAc;IAA3B;QACE,SAAI,GAAG,WAAW,CAAC;IAoBrB,CAAC;IAlBC,QAAQ,CAAC,KAAa,EAAE,QAAkB,EAAE,MAAsB;QAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YAC9C,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,MAAM,EAAE,uCAAuC,MAAM,CAAC,YAAY,EAAE;gBACpE,SAAS,EAAE,MAAM,CAAC,YAAY;gBAC9B,MAAM,EAAE,QAAQ,CAAC,UAAU;gBAC3B,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AArBD,wCAqBC;AAKD,MAAa,mBAAmB;IAAhC;QACE,SAAI,GAAG,gBAAgB,CAAC;IAyC1B,CAAC;IAvCC,QAAQ,CAAC,KAAa,EAAE,QAAkB,EAAE,MAAsB;QAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAChD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM;aACtC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC;aAC7D,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1B,IAAI,iBAAiB,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAE/C,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAChD,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC1C,CAAC;YAGF,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;YAChD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;gBAChC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,IAAI;oBACjB,MAAM,EAAE,qCAAqC,aAAa,wBAAwB;oBAClF,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;oBAC1C,MAAM,EAAE,aAAa;oBACrB,KAAK;oBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA1CD,kDA0CC;AAKD,MAAa,UAAU;IAAvB;QACE,SAAI,GAAG,MAAM,CAAC;IAuBhB,CAAC;IArBC,QAAQ,CAAC,KAAa,EAAE,QAAkB,EAAE,MAAsB;QAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;QACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;QAEvC,IAAI,WAAW,GAAG,OAAO,EAAE,CAAC;YAC1B,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,MAAM,EAAE,iCAAiC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC7D,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,WAAW;gBACnB,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAxBD,gCAwBC;AAKD,MAAa,aAAa;IAA1B;QACU,aAAQ,GAAa;YAC3B,IAAI,aAAa,EAAE;YACnB,IAAI,UAAU,EAAE;YAChB,IAAI,cAAc,EAAE;YACpB,IAAI,mBAAmB,EAAE;YACzB,IAAI,UAAU,EAAE;SACjB,CAAC;IAmCJ,CAAC;IA9BC,gBAAgB,CAAC,KAAa,EAAE,QAAkB,EAAE,MAAsB;QACxE,MAAM,UAAU,GAAsB,EAAE,CAAC;QAEzC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC3D,IAAI,SAAS,EAAE,CAAC;oBACd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,8BAA8B,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAKD,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAClD,CAAC;IAKD,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;CACF;AA1CD,sCA0CC;AAGY,QAAA,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SentinelConfig } from './types';
|
|
2
|
+
export interface PolicyTemplate {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
config: SentinelConfig;
|
|
6
|
+
useCase: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const policyTemplates: Record<string, PolicyTemplate>;
|
|
9
|
+
export declare function getPolicyTemplate(name: string): PolicyTemplate | undefined;
|
|
10
|
+
export declare function listPolicyTemplates(): PolicyTemplate[];
|
|
11
|
+
export declare function applyPolicyTemplate(templateName: string): SentinelConfig | null;
|
|
12
|
+
export declare function recommendTemplate(useCase: string): PolicyTemplate | null;
|
|
13
|
+
//# sourceMappingURL=policy-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-templates.d.ts","sourceRoot":"","sources":["../src/policy-templates.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAkH1D,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CA2B1E;AAKD,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAEtD;AAMD,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAM/E;AAKD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAsBxE"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.policyTemplates = void 0;
|
|
4
|
+
exports.getPolicyTemplate = getPolicyTemplate;
|
|
5
|
+
exports.listPolicyTemplates = listPolicyTemplates;
|
|
6
|
+
exports.applyPolicyTemplate = applyPolicyTemplate;
|
|
7
|
+
exports.recommendTemplate = recommendTemplate;
|
|
8
|
+
exports.policyTemplates = {
|
|
9
|
+
strict: {
|
|
10
|
+
name: 'Strict',
|
|
11
|
+
description: 'Low limits, fast kills - Best for production',
|
|
12
|
+
useCase: 'Production environments, cost-sensitive operations',
|
|
13
|
+
config: {
|
|
14
|
+
enabled: true,
|
|
15
|
+
runMaxDurationMs: 60000,
|
|
16
|
+
runMaxTokens: 8000,
|
|
17
|
+
runIdleMs: 15000,
|
|
18
|
+
loopWindow: 10,
|
|
19
|
+
loopMax: 3,
|
|
20
|
+
runMaxCost: 0.50
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
development: {
|
|
24
|
+
name: 'Development',
|
|
25
|
+
description: 'High limits, warnings only - Best for dev/testing',
|
|
26
|
+
useCase: 'Development, testing, experimentation',
|
|
27
|
+
config: {
|
|
28
|
+
enabled: true,
|
|
29
|
+
runMaxDurationMs: 300000,
|
|
30
|
+
runMaxTokens: 50000,
|
|
31
|
+
runIdleMs: 60000,
|
|
32
|
+
loopWindow: 30,
|
|
33
|
+
loopMax: 10,
|
|
34
|
+
runMaxCost: 5.00
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
costConscious: {
|
|
38
|
+
name: 'Cost-Conscious',
|
|
39
|
+
description: 'Aggressive cost limits - Best for budget-constrained ops',
|
|
40
|
+
useCase: 'Budget-constrained operations',
|
|
41
|
+
config: {
|
|
42
|
+
enabled: true,
|
|
43
|
+
runMaxDurationMs: 120000,
|
|
44
|
+
runMaxTokens: 12000,
|
|
45
|
+
runIdleMs: 20000,
|
|
46
|
+
loopWindow: 15,
|
|
47
|
+
loopMax: 5,
|
|
48
|
+
runMaxCost: 0.25
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
performance: {
|
|
52
|
+
name: 'Performance',
|
|
53
|
+
description: 'Focus on timeout/idle - Best for performance-critical apps',
|
|
54
|
+
useCase: 'Performance-critical applications',
|
|
55
|
+
config: {
|
|
56
|
+
enabled: true,
|
|
57
|
+
runMaxDurationMs: 30000,
|
|
58
|
+
runMaxTokens: 20000,
|
|
59
|
+
runIdleMs: 10000,
|
|
60
|
+
loopWindow: 20,
|
|
61
|
+
loopMax: 7,
|
|
62
|
+
runMaxCost: 1.00
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
balanced: {
|
|
66
|
+
name: 'Balanced',
|
|
67
|
+
description: 'Moderate limits - Best for general purpose',
|
|
68
|
+
useCase: 'General purpose, balanced approach',
|
|
69
|
+
config: {
|
|
70
|
+
enabled: true,
|
|
71
|
+
runMaxDurationMs: 120000,
|
|
72
|
+
runMaxTokens: 16000,
|
|
73
|
+
runIdleMs: 30000,
|
|
74
|
+
loopWindow: 15,
|
|
75
|
+
loopMax: 5,
|
|
76
|
+
runMaxCost: 1.00
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
permissive: {
|
|
80
|
+
name: 'Permissive',
|
|
81
|
+
description: 'Very high limits - Best for research/experimentation',
|
|
82
|
+
useCase: 'Research, experimentation, one-off tasks',
|
|
83
|
+
config: {
|
|
84
|
+
enabled: true,
|
|
85
|
+
runMaxDurationMs: 600000,
|
|
86
|
+
runMaxTokens: 100000,
|
|
87
|
+
runIdleMs: 120000,
|
|
88
|
+
loopWindow: 60,
|
|
89
|
+
loopMax: 20,
|
|
90
|
+
runMaxCost: 10.00
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
function getPolicyTemplate(name) {
|
|
95
|
+
const normalized = name.toLowerCase();
|
|
96
|
+
if (exports.policyTemplates[normalized]) {
|
|
97
|
+
return exports.policyTemplates[normalized];
|
|
98
|
+
}
|
|
99
|
+
const camelCase = normalized.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
100
|
+
if (exports.policyTemplates[camelCase]) {
|
|
101
|
+
return exports.policyTemplates[camelCase];
|
|
102
|
+
}
|
|
103
|
+
if (name && name.length > 0) {
|
|
104
|
+
const firstChar = name[0];
|
|
105
|
+
if (firstChar) {
|
|
106
|
+
const firstLower = firstChar.toLowerCase() + name.slice(1);
|
|
107
|
+
if (exports.policyTemplates[firstLower]) {
|
|
108
|
+
return exports.policyTemplates[firstLower];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
function listPolicyTemplates() {
|
|
115
|
+
return Object.values(exports.policyTemplates);
|
|
116
|
+
}
|
|
117
|
+
function applyPolicyTemplate(templateName) {
|
|
118
|
+
const template = getPolicyTemplate(templateName);
|
|
119
|
+
if (!template) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return template.config;
|
|
123
|
+
}
|
|
124
|
+
function recommendTemplate(useCase) {
|
|
125
|
+
const lowerUseCase = useCase.toLowerCase();
|
|
126
|
+
if (lowerUseCase.includes('production') || lowerUseCase.includes('prod')) {
|
|
127
|
+
return exports.policyTemplates['strict'] || null;
|
|
128
|
+
}
|
|
129
|
+
if (lowerUseCase.includes('development') || lowerUseCase.includes('dev') || lowerUseCase.includes('test')) {
|
|
130
|
+
return exports.policyTemplates['development'] || null;
|
|
131
|
+
}
|
|
132
|
+
if (lowerUseCase.includes('cost') || lowerUseCase.includes('budget')) {
|
|
133
|
+
return exports.policyTemplates['costConscious'] || null;
|
|
134
|
+
}
|
|
135
|
+
if (lowerUseCase.includes('performance') || lowerUseCase.includes('speed')) {
|
|
136
|
+
return exports.policyTemplates['performance'] || null;
|
|
137
|
+
}
|
|
138
|
+
if (lowerUseCase.includes('research') || lowerUseCase.includes('experiment')) {
|
|
139
|
+
return exports.policyTemplates['permissive'] || null;
|
|
140
|
+
}
|
|
141
|
+
return exports.policyTemplates['balanced'] || null;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=policy-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-templates.js","sourceRoot":"","sources":["../src/policy-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RunState, SentinelConfig } from './types';
|
|
2
|
+
export interface ViolationPrediction {
|
|
3
|
+
willViolate: boolean;
|
|
4
|
+
policy: string;
|
|
5
|
+
estimatedTime: number;
|
|
6
|
+
confidence: number;
|
|
7
|
+
currentValue: number;
|
|
8
|
+
threshold: number;
|
|
9
|
+
rate: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function predictViolations(runState: RunState, config: SentinelConfig): ViolationPrediction[];
|
|
12
|
+
export declare function getMostLikelyViolation(runState: RunState, config: SentinelConfig): ViolationPrediction | null;
|
|
13
|
+
//# sourceMappingURL=predictive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predictive.d.ts","sourceRoot":"","sources":["../src/predictive.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,mBAAmB,EAAE,CAsGnG;AAKD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,mBAAmB,GAAG,IAAI,CAe7G"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.predictViolations = predictViolations;
|
|
4
|
+
exports.getMostLikelyViolation = getMostLikelyViolation;
|
|
5
|
+
function predictViolations(runState, config) {
|
|
6
|
+
const predictions = [];
|
|
7
|
+
const now = Date.now();
|
|
8
|
+
if (!runState.startedAt || runState.status !== 'running') {
|
|
9
|
+
return predictions;
|
|
10
|
+
}
|
|
11
|
+
const elapsed = (now - runState.startedAt) / 1000;
|
|
12
|
+
if (elapsed > 0) {
|
|
13
|
+
const durationMs = now - runState.startedAt;
|
|
14
|
+
const timeRemaining = config.runMaxDurationMs - durationMs;
|
|
15
|
+
if (timeRemaining < config.runMaxDurationMs * 0.1) {
|
|
16
|
+
predictions.push({
|
|
17
|
+
willViolate: timeRemaining <= 0,
|
|
18
|
+
policy: 'timeout',
|
|
19
|
+
estimatedTime: Math.max(0, timeRemaining / 1000),
|
|
20
|
+
confidence: timeRemaining < 0 ? 1.0 : 0.8,
|
|
21
|
+
currentValue: durationMs,
|
|
22
|
+
threshold: config.runMaxDurationMs,
|
|
23
|
+
rate: durationMs / elapsed
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (runState.tokenCount > 0 && elapsed > 0) {
|
|
28
|
+
const tokenRate = runState.tokenCount / elapsed;
|
|
29
|
+
const tokensRemaining = config.runMaxTokens - runState.tokenCount;
|
|
30
|
+
const timeToLimit = tokensRemaining / tokenRate;
|
|
31
|
+
if (tokensRemaining < config.runMaxTokens * 0.2) {
|
|
32
|
+
predictions.push({
|
|
33
|
+
willViolate: tokensRemaining <= 0,
|
|
34
|
+
policy: 'token_cap',
|
|
35
|
+
estimatedTime: Math.max(0, timeToLimit),
|
|
36
|
+
confidence: tokensRemaining < 0 ? 1.0 : Math.min(0.9, 1 - (tokensRemaining / config.runMaxTokens)),
|
|
37
|
+
currentValue: runState.tokenCount,
|
|
38
|
+
threshold: config.runMaxTokens,
|
|
39
|
+
rate: tokenRate
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (runState.lastTokenAt) {
|
|
44
|
+
const idleTime = (now - runState.lastTokenAt) / 1000;
|
|
45
|
+
const idleRemaining = (config.runIdleMs / 1000) - idleTime;
|
|
46
|
+
if (idleRemaining < (config.runIdleMs / 1000) * 0.3) {
|
|
47
|
+
predictions.push({
|
|
48
|
+
willViolate: idleRemaining <= 0,
|
|
49
|
+
policy: 'idle',
|
|
50
|
+
estimatedTime: Math.max(0, idleRemaining),
|
|
51
|
+
confidence: idleRemaining < 0 ? 1.0 : 0.7,
|
|
52
|
+
currentValue: idleTime * 1000,
|
|
53
|
+
threshold: config.runIdleMs,
|
|
54
|
+
rate: 1000
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (runState.startedAt) {
|
|
59
|
+
const timeSinceStart = (now - runState.startedAt) / 1000;
|
|
60
|
+
const idleRemaining = (config.runIdleMs / 1000) - timeSinceStart;
|
|
61
|
+
if (idleRemaining < (config.runIdleMs / 1000) * 0.3) {
|
|
62
|
+
predictions.push({
|
|
63
|
+
willViolate: idleRemaining <= 0,
|
|
64
|
+
policy: 'idle',
|
|
65
|
+
estimatedTime: Math.max(0, idleRemaining),
|
|
66
|
+
confidence: idleRemaining < 0 ? 1.0 : 0.6,
|
|
67
|
+
currentValue: timeSinceStart * 1000,
|
|
68
|
+
threshold: config.runIdleMs,
|
|
69
|
+
rate: 1000
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (runState.cost && runState.cost > 0 && elapsed > 0) {
|
|
74
|
+
const costRate = runState.cost / elapsed;
|
|
75
|
+
const maxCost = config.runMaxCost || 1.0;
|
|
76
|
+
const costRemaining = maxCost - runState.cost;
|
|
77
|
+
const timeToLimit = costRemaining / costRate;
|
|
78
|
+
if (costRemaining < maxCost * 0.2) {
|
|
79
|
+
predictions.push({
|
|
80
|
+
willViolate: costRemaining <= 0,
|
|
81
|
+
policy: 'cost',
|
|
82
|
+
estimatedTime: Math.max(0, timeToLimit),
|
|
83
|
+
confidence: costRemaining < 0 ? 1.0 : Math.min(0.9, 1 - (costRemaining / maxCost)),
|
|
84
|
+
currentValue: runState.cost,
|
|
85
|
+
threshold: maxCost,
|
|
86
|
+
rate: costRate
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return predictions.sort((a, b) => a.estimatedTime - b.estimatedTime);
|
|
91
|
+
}
|
|
92
|
+
function getMostLikelyViolation(runState, config) {
|
|
93
|
+
const predictions = predictViolations(runState, config);
|
|
94
|
+
if (predictions.length === 0) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
predictions.sort((a, b) => {
|
|
98
|
+
if (b.confidence !== a.confidence) {
|
|
99
|
+
return b.confidence - a.confidence;
|
|
100
|
+
}
|
|
101
|
+
return a.estimatedTime - b.estimatedTime;
|
|
102
|
+
});
|
|
103
|
+
return predictions[0] || null;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=predictive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predictive.js","sourceRoot":"","sources":["../src/predictive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { EventStream, RunEvent, RunState, SentinelConfig } from './types';
|
|
2
|
+
import { PolicyViolation } from './policies';
|
|
3
|
+
export declare class Sentinel {
|
|
4
|
+
private static instance;
|
|
5
|
+
private eventBuffer;
|
|
6
|
+
private subscriptions;
|
|
7
|
+
private evaluationIntervals;
|
|
8
|
+
private config;
|
|
9
|
+
private constructor();
|
|
10
|
+
static getInstance(): Sentinel;
|
|
11
|
+
static resetInstance(): void;
|
|
12
|
+
watchRun(runId: string, events$: EventStream): void;
|
|
13
|
+
private handleEvent;
|
|
14
|
+
private setupEvaluationInterval;
|
|
15
|
+
private cleanupRun;
|
|
16
|
+
kill(runId: string, reason: string): Promise<void>;
|
|
17
|
+
getActiveRuns(): RunState[];
|
|
18
|
+
getRunStatus(runId: string): RunState | undefined;
|
|
19
|
+
getRecentEvents(runId: string, count?: number): RunEvent[];
|
|
20
|
+
getTokenEventsInWindow(runId: string, windowMs: number): RunEvent[];
|
|
21
|
+
getPolicyViolations(runId: string): PolicyViolation[];
|
|
22
|
+
private evaluatePolicies;
|
|
23
|
+
unwatchRun(runId: string): void;
|
|
24
|
+
getWatchedRunIds(): string[];
|
|
25
|
+
isEnabled(): boolean;
|
|
26
|
+
getConfig(): SentinelConfig;
|
|
27
|
+
updateConfig(newConfig: SentinelConfig): void;
|
|
28
|
+
shutdown(): void;
|
|
29
|
+
}
|
|
30
|
+
export declare const sentinel: Sentinel;
|
|
31
|
+
//# sourceMappingURL=sentinel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../src/sentinel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAM1E,OAAO,EAAiB,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAW;IAClC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,mBAAmB,CAAqC;IAChE,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO;WAWO,WAAW,IAAI,QAAQ;WAUvB,aAAa,IAAI,IAAI;IAY5B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAoB1D,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,UAAU;IAqBL,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDxD,aAAa,IAAI,QAAQ,EAAE;IAO3B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAOjD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,QAAQ,EAAE;IAO9D,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;IAOnE,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;YAW9C,gBAAgB;IA+CvB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ/B,gBAAgB,IAAI,MAAM,EAAE;IAO5B,SAAS,IAAI,OAAO;IAOpB,SAAS,IAAI,cAAc;IAQ3B,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI;IAkC7C,QAAQ,IAAI,IAAI;CAkBxB;AAGD,eAAO,MAAM,QAAQ,UAAyB,CAAC"}
|