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.
Files changed (101) hide show
  1. package/package.json +5 -2
  2. package/packages/sentinel/dist/adapters/audit.d.ts +33 -0
  3. package/packages/sentinel/dist/adapters/audit.d.ts.map +1 -0
  4. package/packages/sentinel/dist/adapters/audit.js +118 -0
  5. package/packages/sentinel/dist/adapters/audit.js.map +1 -0
  6. package/packages/sentinel/dist/adapters/cancel-adapter.d.ts +20 -0
  7. package/packages/sentinel/dist/adapters/cancel-adapter.d.ts.map +1 -0
  8. package/packages/sentinel/dist/adapters/cancel-adapter.js +75 -0
  9. package/packages/sentinel/dist/adapters/cancel-adapter.js.map +1 -0
  10. package/packages/sentinel/dist/adapters/telemetry.d.ts +25 -0
  11. package/packages/sentinel/dist/adapters/telemetry.d.ts.map +1 -0
  12. package/packages/sentinel/dist/adapters/telemetry.js +46 -0
  13. package/packages/sentinel/dist/adapters/telemetry.js.map +1 -0
  14. package/packages/sentinel/dist/config.d.ts +6 -0
  15. package/packages/sentinel/dist/config.d.ts.map +1 -0
  16. package/packages/sentinel/dist/config.js +52 -0
  17. package/packages/sentinel/dist/config.js.map +1 -0
  18. package/packages/sentinel/dist/index.d.ts +12 -0
  19. package/packages/sentinel/dist/index.d.ts.map +1 -0
  20. package/packages/sentinel/dist/index.js +33 -0
  21. package/packages/sentinel/dist/index.js.map +1 -0
  22. package/packages/sentinel/dist/internal/event-buffer.d.ts +13 -0
  23. package/packages/sentinel/dist/internal/event-buffer.d.ts.map +1 -0
  24. package/packages/sentinel/dist/internal/event-buffer.js +93 -0
  25. package/packages/sentinel/dist/internal/event-buffer.js.map +1 -0
  26. package/packages/sentinel/dist/policies.d.ts +41 -0
  27. package/packages/sentinel/dist/policies.d.ts.map +1 -0
  28. package/packages/sentinel/dist/policies.js +179 -0
  29. package/packages/sentinel/dist/policies.js.map +1 -0
  30. package/packages/sentinel/dist/policy-templates.d.ts +13 -0
  31. package/packages/sentinel/dist/policy-templates.d.ts.map +1 -0
  32. package/packages/sentinel/dist/policy-templates.js +143 -0
  33. package/packages/sentinel/dist/policy-templates.js.map +1 -0
  34. package/packages/sentinel/dist/predictive.d.ts +13 -0
  35. package/packages/sentinel/dist/predictive.d.ts.map +1 -0
  36. package/packages/sentinel/dist/predictive.js +105 -0
  37. package/packages/sentinel/dist/predictive.js.map +1 -0
  38. package/packages/sentinel/dist/sentinel.d.ts +31 -0
  39. package/packages/sentinel/dist/sentinel.d.ts.map +1 -0
  40. package/packages/sentinel/dist/sentinel.js +217 -0
  41. package/packages/sentinel/dist/sentinel.js.map +1 -0
  42. package/packages/sentinel/dist/types.d.ts +58 -0
  43. package/packages/sentinel/dist/types.d.ts.map +1 -0
  44. package/packages/sentinel/dist/types.js +3 -0
  45. package/packages/sentinel/dist/types.js.map +1 -0
  46. package/packages/shared/dist/env.d.ts +84 -0
  47. package/packages/shared/dist/env.d.ts.map +1 -0
  48. package/packages/shared/dist/env.js +222 -0
  49. package/packages/shared/dist/env.js.map +1 -0
  50. package/packages/shared/dist/index.d.ts +6 -0
  51. package/packages/shared/dist/index.d.ts.map +1 -0
  52. package/packages/shared/dist/index.js +47 -0
  53. package/packages/shared/dist/index.js.map +1 -0
  54. package/packages/shared/dist/logger.d.ts +33 -0
  55. package/packages/shared/dist/logger.d.ts.map +1 -0
  56. package/packages/shared/dist/logger.js +128 -0
  57. package/packages/shared/dist/logger.js.map +1 -0
  58. package/packages/shared/dist/persistence/db-blocker.d.ts +11 -0
  59. package/packages/shared/dist/persistence/db-blocker.d.ts.map +1 -0
  60. package/packages/shared/dist/persistence/db-blocker.js +58 -0
  61. package/packages/shared/dist/persistence/db-blocker.js.map +1 -0
  62. package/packages/shared/dist/persistence/fs-blocker.d.ts +26 -0
  63. package/packages/shared/dist/persistence/fs-blocker.d.ts.map +1 -0
  64. package/packages/shared/dist/persistence/fs-blocker.js +232 -0
  65. package/packages/shared/dist/persistence/fs-blocker.js.map +1 -0
  66. package/packages/shared/dist/persistence/index.d.ts +9 -0
  67. package/packages/shared/dist/persistence/index.d.ts.map +1 -0
  68. package/packages/shared/dist/persistence/index.js +68 -0
  69. package/packages/shared/dist/persistence/index.js.map +1 -0
  70. package/packages/shared/dist/persistence/memory-store.d.ts +57 -0
  71. package/packages/shared/dist/persistence/memory-store.d.ts.map +1 -0
  72. package/packages/shared/dist/persistence/memory-store.js +221 -0
  73. package/packages/shared/dist/persistence/memory-store.js.map +1 -0
  74. package/packages/shared/dist/types.d.ts +155 -0
  75. package/packages/shared/dist/types.d.ts.map +1 -0
  76. package/packages/shared/dist/types.js +3 -0
  77. package/packages/shared/dist/types.js.map +1 -0
  78. package/packages/shared/dist/utils.d.ts +25 -0
  79. package/packages/shared/dist/utils.d.ts.map +1 -0
  80. package/packages/shared/dist/utils.js +147 -0
  81. package/packages/shared/dist/utils.js.map +1 -0
  82. package/packages/shield/dist/detectors/hallucination-detector.d.ts +26 -0
  83. package/packages/shield/dist/detectors/hallucination-detector.d.ts.map +1 -0
  84. package/packages/shield/dist/detectors/hallucination-detector.js +185 -0
  85. package/packages/shield/dist/detectors/hallucination-detector.js.map +1 -0
  86. package/packages/shield/dist/detectors/injection-detector.d.ts +31 -0
  87. package/packages/shield/dist/detectors/injection-detector.d.ts.map +1 -0
  88. package/packages/shield/dist/detectors/injection-detector.js +256 -0
  89. package/packages/shield/dist/detectors/injection-detector.js.map +1 -0
  90. package/packages/shield/dist/detectors/pii-detector.d.ts +35 -0
  91. package/packages/shield/dist/detectors/pii-detector.d.ts.map +1 -0
  92. package/packages/shield/dist/detectors/pii-detector.js +126 -0
  93. package/packages/shield/dist/detectors/pii-detector.js.map +1 -0
  94. package/packages/shield/dist/index.d.ts +5 -0
  95. package/packages/shield/dist/index.d.ts.map +1 -0
  96. package/packages/shield/dist/index.js +12 -0
  97. package/packages/shield/dist/index.js.map +1 -0
  98. package/packages/shield/dist/shield.d.ts +64 -0
  99. package/packages/shield/dist/shield.d.ts.map +1 -0
  100. package/packages/shield/dist/shield.js +319 -0
  101. 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":"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"}
@@ -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"}