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
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "4runr-os",
3
- "version": "2.9.128",
3
+ "version": "2.9.129",
4
4
  "type": "module",
5
- "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.128: Gateway autostart timeout 20s 65s + progress feedback. Prior: mk3-tui chrono fix, Portal activity log hints, Gateway shutdown order. ⚠️ Pre-MVP / Development Phase",
5
+ "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.129: CRITICAL FIX - Bundle @4runr/* packages so Gateway can start (was crashing on missing imports). Prior: 65s autostart timeout, Portal activity log, Gateway shutdown order. ⚠️ Pre-MVP / Development Phase",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
8
8
  "4runr": "dist/index.js",
@@ -84,6 +84,9 @@
84
84
  "mk3-tui/bin/**/*",
85
85
  "mk3-tui/binaries/**/*",
86
86
  "apps/gateway/**/*",
87
+ "packages/shared/dist/**/*",
88
+ "packages/sentinel/dist/**/*",
89
+ "packages/shield/dist/**/*",
87
90
  "packages/middleware/idempotency/idempotency.js",
88
91
  "packages/adapters/redis/IdempotencyStore.js",
89
92
  "scripts/setup.js",
@@ -0,0 +1,33 @@
1
+ export interface AuditRecord {
2
+ id: string;
3
+ timestamp: number;
4
+ action: string;
5
+ runId: string;
6
+ reason?: string;
7
+ config: Record<string, any>;
8
+ metadata?: Record<string, any>;
9
+ }
10
+ export interface AuditAdapter {
11
+ logAudit(record: AuditRecord): Promise<void>;
12
+ logKill(runId: string, reason: string, config: Record<string, any>, metadata?: Record<string, any>): Promise<void>;
13
+ logPolicyViolation(runId: string, policy: string, threshold: any, config: Record<string, any>, metadata?: Record<string, any>): Promise<void>;
14
+ }
15
+ export declare class FileAuditAdapter implements AuditAdapter {
16
+ private logFile;
17
+ private fs;
18
+ constructor(logFile?: string);
19
+ logAudit(record: AuditRecord): Promise<void>;
20
+ logKill(runId: string, reason: string, config: Record<string, any>, metadata?: Record<string, any>): Promise<void>;
21
+ logPolicyViolation(runId: string, policy: string, threshold: any, config: Record<string, any>, metadata?: Record<string, any>): Promise<void>;
22
+ private formatLogEntry;
23
+ private generateId;
24
+ }
25
+ export declare class ConsoleAuditAdapter implements AuditAdapter {
26
+ logAudit(record: AuditRecord): Promise<void>;
27
+ logKill(runId: string, reason: string, config: Record<string, any>, metadata?: Record<string, any>): Promise<void>;
28
+ logPolicyViolation(runId: string, policy: string, threshold: any, config: Record<string, any>, metadata?: Record<string, any>): Promise<void>;
29
+ private generateId;
30
+ }
31
+ export declare function createAuditAdapter(): AuditAdapter;
32
+ export declare const auditAdapter: AuditAdapter;
33
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/adapters/audit.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/I;AAKD,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,EAAE,CAAM;gBAEJ,OAAO,GAAE,MAA6B;IAY5C,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAclH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBnJ,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;CAGnB;AAKD,qBAAa,mBAAoB,YAAW,YAAY;IAChD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAalH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnJ,OAAO,CAAC,UAAU;CAGnB;AAKD,wBAAgB,kBAAkB,IAAI,YAAY,CAUjD;AAGD,eAAO,MAAM,YAAY,cAAuB,CAAC"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.auditAdapter = exports.ConsoleAuditAdapter = exports.FileAuditAdapter = void 0;
4
+ exports.createAuditAdapter = createAuditAdapter;
5
+ class FileAuditAdapter {
6
+ constructor(logFile = 'sentinel_audit.log') {
7
+ this.logFile = logFile;
8
+ try {
9
+ this.fs = require('fs').promises;
10
+ }
11
+ catch (error) {
12
+ console.warn('File system not available, falling back to console audit');
13
+ this.fs = null;
14
+ }
15
+ }
16
+ async logAudit(record) {
17
+ const logEntry = this.formatLogEntry(record);
18
+ if (this.fs) {
19
+ try {
20
+ await this.fs.appendFile(this.logFile, logEntry + '\n');
21
+ }
22
+ catch (error) {
23
+ console.error('Failed to write to audit log:', error);
24
+ console.log('Audit entry:', logEntry);
25
+ }
26
+ }
27
+ else {
28
+ console.log('Audit entry:', logEntry);
29
+ }
30
+ }
31
+ async logKill(runId, reason, config, metadata) {
32
+ const record = {
33
+ id: this.generateId(),
34
+ timestamp: Date.now(),
35
+ action: 'kill',
36
+ runId,
37
+ reason,
38
+ config,
39
+ ...(metadata !== undefined && { metadata })
40
+ };
41
+ await this.logAudit(record);
42
+ }
43
+ async logPolicyViolation(runId, policy, threshold, config, metadata) {
44
+ const record = {
45
+ id: this.generateId(),
46
+ timestamp: Date.now(),
47
+ action: 'policy_violation',
48
+ runId,
49
+ reason: `Policy ${policy} exceeded threshold ${threshold}`,
50
+ config,
51
+ metadata: {
52
+ policy,
53
+ threshold,
54
+ ...metadata
55
+ }
56
+ };
57
+ await this.logAudit(record);
58
+ }
59
+ formatLogEntry(record) {
60
+ return JSON.stringify({
61
+ ...record,
62
+ timestamp: new Date(record.timestamp).toISOString()
63
+ });
64
+ }
65
+ generateId() {
66
+ return `audit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
67
+ }
68
+ }
69
+ exports.FileAuditAdapter = FileAuditAdapter;
70
+ class ConsoleAuditAdapter {
71
+ async logAudit(record) {
72
+ console.log('🔒 Sentinel Audit:', {
73
+ ...record,
74
+ timestamp: new Date(record.timestamp).toISOString()
75
+ });
76
+ }
77
+ async logKill(runId, reason, config, metadata) {
78
+ const record = {
79
+ id: this.generateId(),
80
+ timestamp: Date.now(),
81
+ action: 'kill',
82
+ runId,
83
+ reason,
84
+ config,
85
+ ...(metadata !== undefined && { metadata })
86
+ };
87
+ await this.logAudit(record);
88
+ }
89
+ async logPolicyViolation(runId, policy, threshold, config, metadata) {
90
+ await this.logAudit({
91
+ id: this.generateId(),
92
+ timestamp: Date.now(),
93
+ action: 'policy_violation',
94
+ runId,
95
+ reason: `Policy ${policy} exceeded threshold ${threshold}`,
96
+ config,
97
+ metadata: {
98
+ policy,
99
+ threshold,
100
+ ...metadata
101
+ }
102
+ });
103
+ }
104
+ generateId() {
105
+ return `audit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
106
+ }
107
+ }
108
+ exports.ConsoleAuditAdapter = ConsoleAuditAdapter;
109
+ function createAuditAdapter() {
110
+ const sink = process.env['SENTINEL_AUDIT_SINK'];
111
+ const file = process.env['SENTINEL_AUDIT_FILE'] || 'packages/sentinel/sentinel_audit.log';
112
+ if (sink === 'file') {
113
+ return new FileAuditAdapter(file);
114
+ }
115
+ return new ConsoleAuditAdapter();
116
+ }
117
+ exports.auditAdapter = createAuditAdapter();
118
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/adapters/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface CancelResult {
2
+ success: boolean;
3
+ reason?: string;
4
+ timestamp: number;
5
+ }
6
+ export interface CancelAdapter {
7
+ cancelRun(runId: string, reason: string): Promise<CancelResult>;
8
+ }
9
+ export declare class DefaultCancelAdapter implements CancelAdapter {
10
+ private cancelledRuns;
11
+ private gatewayUrl;
12
+ constructor();
13
+ cancelRun(runId: string, reason: string): Promise<CancelResult>;
14
+ isCancelled(runId: string): boolean;
15
+ getCancelledRuns(): string[];
16
+ clearCancelledRuns(): void;
17
+ }
18
+ export declare function createCancelAdapter(): CancelAdapter;
19
+ export declare const cancelAdapter: CancelAdapter;
20
+ //# sourceMappingURL=cancel-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/cancel-adapter.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACjE;AAKD,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,UAAU,CAAS;;IASrB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqErE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOnC,gBAAgB,IAAI,MAAM,EAAE;IAO5B,kBAAkB,IAAI,IAAI;CAG3B;AAKD,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAGD,eAAO,MAAM,aAAa,eAAwB,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cancelAdapter = exports.DefaultCancelAdapter = void 0;
4
+ exports.createCancelAdapter = createCancelAdapter;
5
+ class DefaultCancelAdapter {
6
+ constructor() {
7
+ this.cancelledRuns = new Set();
8
+ this.gatewayUrl = process.env['GATEWAY_URL'] ||
9
+ process.env['GATEWAY_BASE_URL'] ||
10
+ 'http://localhost:3001';
11
+ }
12
+ async cancelRun(runId, reason) {
13
+ console.log(`🛑 CancelAdapter: Cancelling run ${runId} - Reason: ${reason}`);
14
+ if (this.cancelledRuns.has(runId)) {
15
+ return {
16
+ success: false,
17
+ reason: 'Run already cancelled',
18
+ timestamp: Date.now()
19
+ };
20
+ }
21
+ this.cancelledRuns.add(runId);
22
+ try {
23
+ const cancelUrl = `${this.gatewayUrl}/api/runs/${runId}/cancel`;
24
+ const response = await fetch(cancelUrl, {
25
+ method: 'POST',
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ },
29
+ body: JSON.stringify({ reason }),
30
+ });
31
+ if (!response.ok) {
32
+ const errorText = await response.text();
33
+ console.error(`❌ CancelAdapter: Failed to cancel run ${runId}: ${response.status} - ${errorText}`);
34
+ this.cancelledRuns.delete(runId);
35
+ return {
36
+ success: false,
37
+ reason: `Gateway returned ${response.status}: ${errorText}`,
38
+ timestamp: Date.now()
39
+ };
40
+ }
41
+ const result = await response.json().catch(() => ({}));
42
+ console.log(`✅ CancelAdapter: Run ${runId} cancelled successfully`);
43
+ return {
44
+ success: true,
45
+ reason: result?.message || 'Cancellation requested',
46
+ timestamp: Date.now()
47
+ };
48
+ }
49
+ catch (error) {
50
+ this.cancelledRuns.delete(runId);
51
+ const errorMessage = error instanceof Error ? error.message : String(error);
52
+ console.error(`❌ CancelAdapter: Error cancelling run ${runId}:`, errorMessage);
53
+ return {
54
+ success: false,
55
+ reason: `Cancel request failed: ${errorMessage}`,
56
+ timestamp: Date.now()
57
+ };
58
+ }
59
+ }
60
+ isCancelled(runId) {
61
+ return this.cancelledRuns.has(runId);
62
+ }
63
+ getCancelledRuns() {
64
+ return Array.from(this.cancelledRuns);
65
+ }
66
+ clearCancelledRuns() {
67
+ this.cancelledRuns.clear();
68
+ }
69
+ }
70
+ exports.DefaultCancelAdapter = DefaultCancelAdapter;
71
+ function createCancelAdapter() {
72
+ return new DefaultCancelAdapter();
73
+ }
74
+ exports.cancelAdapter = createCancelAdapter();
75
+ //# sourceMappingURL=cancel-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-adapter.js","sourceRoot":"","sources":["../../src/adapters/cancel-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface TelemetryEvent {
2
+ type: string;
3
+ runId: string;
4
+ reason?: string;
5
+ timestamp: number;
6
+ metadata?: Record<string, any>;
7
+ }
8
+ export interface TelemetryAdapter {
9
+ logEvent(event: TelemetryEvent): void;
10
+ logKill(runId: string, reason: string, metadata?: Record<string, any>): void;
11
+ logPolicyViolation(runId: string, policy: string, threshold: any, metadata?: Record<string, any>): void;
12
+ }
13
+ export declare class NoOpTelemetryAdapter implements TelemetryAdapter {
14
+ logEvent(event: TelemetryEvent): void;
15
+ logKill(runId: string, reason: string, metadata?: Record<string, any>): void;
16
+ logPolicyViolation(runId: string, policy: string, threshold: any, metadata?: Record<string, any>): void;
17
+ }
18
+ export declare class ConsoleTelemetryAdapter implements TelemetryAdapter {
19
+ logEvent(event: TelemetryEvent): void;
20
+ logKill(runId: string, reason: string, metadata?: Record<string, any>): void;
21
+ logPolicyViolation(runId: string, policy: string, threshold: any, metadata?: Record<string, any>): void;
22
+ }
23
+ export declare function createTelemetryAdapter(): TelemetryAdapter;
24
+ export declare const telemetryAdapter: TelemetryAdapter;
25
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/adapters/telemetry.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC7E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CACzG;AAKD,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIrC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAI5E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;CAGxG;AAKD,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAQrC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAQ5E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;CAQxG;AAKD,wBAAgB,sBAAsB,IAAI,gBAAgB,CAQzD;AAGD,eAAO,MAAM,gBAAgB,kBAA2B,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.telemetryAdapter = exports.ConsoleTelemetryAdapter = exports.NoOpTelemetryAdapter = void 0;
4
+ exports.createTelemetryAdapter = createTelemetryAdapter;
5
+ class NoOpTelemetryAdapter {
6
+ logEvent(event) {
7
+ }
8
+ logKill(runId, reason, metadata) {
9
+ }
10
+ logPolicyViolation(runId, policy, threshold, metadata) {
11
+ }
12
+ }
13
+ exports.NoOpTelemetryAdapter = NoOpTelemetryAdapter;
14
+ class ConsoleTelemetryAdapter {
15
+ logEvent(event) {
16
+ console.log(`📊 Sentinel Telemetry: ${event.type}`, {
17
+ runId: event.runId,
18
+ timestamp: new Date(event.timestamp).toISOString(),
19
+ ...event.metadata
20
+ });
21
+ }
22
+ logKill(runId, reason, metadata) {
23
+ console.log(`🛑 Sentinel Kill: ${runId}`, {
24
+ reason,
25
+ timestamp: new Date().toISOString(),
26
+ ...metadata
27
+ });
28
+ }
29
+ logPolicyViolation(runId, policy, threshold, metadata) {
30
+ console.log(`⚠️ Sentinel Policy Violation: ${runId}`, {
31
+ policy,
32
+ threshold,
33
+ timestamp: new Date().toISOString(),
34
+ ...metadata
35
+ });
36
+ }
37
+ }
38
+ exports.ConsoleTelemetryAdapter = ConsoleTelemetryAdapter;
39
+ function createTelemetryAdapter() {
40
+ if (process.env['NODE_ENV'] === 'development' || process.env['NODE_ENV'] === 'test') {
41
+ return new ConsoleTelemetryAdapter();
42
+ }
43
+ return new NoOpTelemetryAdapter();
44
+ }
45
+ exports.telemetryAdapter = createTelemetryAdapter();
46
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/adapters/telemetry.ts"],"names":[],"mappings":";;;AAqEA,wDAQC;AAvDD,MAAa,oBAAoB;IAC/B,QAAQ,CAAC,KAAqB;IAE9B,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,MAAc,EAAE,QAA8B;IAErE,CAAC;IAED,kBAAkB,CAAC,KAAa,EAAE,MAAc,EAAE,SAAc,EAAE,QAA8B;IAEhG,CAAC;CACF;AAZD,oDAYC;AAKD,MAAa,uBAAuB;IAClC,QAAQ,CAAC,KAAqB;QAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,IAAI,EAAE,EAAE;YAClD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;YAClD,GAAG,KAAK,CAAC,QAAQ;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,MAAc,EAAE,QAA8B;QACnE,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,EAAE,EAAE;YACxC,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,KAAa,EAAE,MAAc,EAAE,SAAc,EAAE,QAA8B;QAC9F,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,EAAE,EAAE;YACpD,MAAM;YACN,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;CACF;AAzBD,0DAyBC;AAKD,SAAgB,sBAAsB;IAGpC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;QACpF,OAAO,IAAI,uBAAuB,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,oBAAoB,EAAE,CAAC;AACpC,CAAC;AAGY,QAAA,gBAAgB,GAAG,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { SentinelConfig } from './types';
2
+ export declare const sentinelConfig: Readonly<SentinelConfig>;
3
+ export declare function getConfigString(): string;
4
+ export declare function isSentinelEnabled(): boolean;
5
+ export declare function getConfigValue<K extends keyof SentinelConfig>(key: K): SentinelConfig[K];
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA0CzC,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAyB,CAAC;AAK9E,wBAAgB,eAAe,IAAI,MAAM,CAQxC;AAKD,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAKD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,GAAG,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAExF"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sentinelConfig = void 0;
4
+ exports.getConfigString = getConfigString;
5
+ exports.isSentinelEnabled = isSentinelEnabled;
6
+ exports.getConfigValue = getConfigValue;
7
+ const config = {
8
+ enabled: process.env['SENTINEL_ENABLED'] === 'true',
9
+ runMaxDurationMs: parseInt(process.env['RUN_MAX_DURATION_MS'] || '120000', 10),
10
+ runMaxTokens: parseInt(process.env['RUN_MAX_TOKENS'] || '16000', 10),
11
+ runIdleMs: parseInt(process.env['SENTINEL_IDLE_MS'] || process.env['RUN_IDLE_MS'] || '30000', 10),
12
+ loopWindow: parseInt(process.env['SENTINEL_LOOP_WINDOW'] || '15', 10),
13
+ loopMax: parseInt(process.env['SENTINEL_LOOP_MAX'] || '5', 10),
14
+ runMaxCost: parseFloat(process.env['RUN_MAX_COST'] || process.env['SENTINEL_MAX_COST'] || '1.00'),
15
+ auditSink: (process.env['SENTINEL_AUDIT_SINK'] === 'file' ? 'file' : 'console'),
16
+ auditFile: process.env['SENTINEL_AUDIT_FILE'] || 'packages/sentinel/sentinel_audit.log'
17
+ };
18
+ if (config.runMaxDurationMs <= 0) {
19
+ throw new Error('RUN_MAX_DURATION_MS must be positive');
20
+ }
21
+ if (config.runMaxTokens <= 0) {
22
+ throw new Error('RUN_MAX_TOKENS must be positive');
23
+ }
24
+ if (config.runIdleMs <= 0) {
25
+ throw new Error('RUN_IDLE_MS must be positive');
26
+ }
27
+ if (config.loopWindow <= 0) {
28
+ throw new Error('SENTINEL_LOOP_WINDOW must be positive');
29
+ }
30
+ if (config.loopMax <= 0) {
31
+ throw new Error('SENTINEL_LOOP_MAX must be positive');
32
+ }
33
+ if (config.loopMax > config.loopWindow) {
34
+ throw new Error('SENTINEL_LOOP_MAX cannot exceed SENTINEL_LOOP_WINDOW');
35
+ }
36
+ exports.sentinelConfig = Object.freeze(config);
37
+ function getConfigString() {
38
+ return `Sentinel Config:
39
+ Enabled: ${exports.sentinelConfig.enabled}
40
+ Max Duration: ${exports.sentinelConfig.runMaxDurationMs}ms
41
+ Max Tokens: ${exports.sentinelConfig.runMaxTokens}
42
+ Idle Timeout: ${exports.sentinelConfig.runIdleMs}ms
43
+ Loop Window: ${exports.sentinelConfig.loopWindow}
44
+ Loop Max: ${exports.sentinelConfig.loopMax}`;
45
+ }
46
+ function isSentinelEnabled() {
47
+ return exports.sentinelConfig.enabled;
48
+ }
49
+ function getConfigValue(key) {
50
+ return exports.sentinelConfig[key];
51
+ }
52
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AA+CA,0CAQC;AAKD,8CAEC;AAKD,wCAEC;AA/DD,MAAM,MAAM,GAAiG;IAC3G,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,MAAM;IACnD,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;IAC9E,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC;IAEpE,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC;IACjG,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IACrE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;IAE9D,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC;IAEjG,SAAS,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,sCAAsC;CACxF,CAAC;AAGF,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,EAAE,CAAC;IACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC1D,CAAC;AACD,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;IAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACrD,CAAC;AACD,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;IAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAClD,CAAC;AACD,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;IAC3B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC;AACD,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;IACxB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACxD,CAAC;AACD,IAAI,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACvC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC1E,CAAC;AAGY,QAAA,cAAc,GAA6B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAK9E,SAAgB,eAAe;IAC7B,OAAO;aACI,sBAAc,CAAC,OAAO;kBACjB,sBAAc,CAAC,gBAAgB;gBACjC,sBAAc,CAAC,YAAY;kBACzB,sBAAc,CAAC,SAAS;iBACzB,sBAAc,CAAC,UAAU;cAC5B,sBAAc,CAAC,OAAO,EAAE,CAAC;AACvC,CAAC;AAKD,SAAgB,iBAAiB;IAC/B,OAAO,sBAAc,CAAC,OAAO,CAAC;AAChC,CAAC;AAKD,SAAgB,cAAc,CAAiC,GAAM;IACnE,OAAO,sBAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { Sentinel } from './sentinel';
2
+ export type { RunEvent, EventStream, RunState, SentinelConfig } from './types';
3
+ export { EventBuffer } from './internal/event-buffer';
4
+ export { sentinelConfig } from './config';
5
+ export { cancelAdapter, CancelAdapter } from './adapters/cancel-adapter';
6
+ export { telemetryAdapter, TelemetryAdapter } from './adapters/telemetry';
7
+ export { auditAdapter, AuditAdapter } from './adapters/audit';
8
+ export { policyManager, PolicyManager, Policy, PolicyViolation } from './policies';
9
+ export { TimeoutPolicy, IdlePolicy, TokenCapPolicy, LoopDetectionPolicy } from './policies';
10
+ export { policyTemplates, getPolicyTemplate, listPolicyTemplates, applyPolicyTemplate, recommendTemplate, type PolicyTemplate } from './policy-templates';
11
+ export { predictViolations, getMostLikelyViolation, type ViolationPrediction } from './predictive';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMostLikelyViolation = exports.predictViolations = exports.recommendTemplate = exports.applyPolicyTemplate = exports.listPolicyTemplates = exports.getPolicyTemplate = exports.policyTemplates = exports.LoopDetectionPolicy = exports.TokenCapPolicy = exports.IdlePolicy = exports.TimeoutPolicy = exports.PolicyManager = exports.policyManager = exports.auditAdapter = exports.telemetryAdapter = exports.cancelAdapter = exports.sentinelConfig = exports.EventBuffer = exports.Sentinel = void 0;
4
+ var sentinel_1 = require("./sentinel");
5
+ Object.defineProperty(exports, "Sentinel", { enumerable: true, get: function () { return sentinel_1.Sentinel; } });
6
+ var event_buffer_1 = require("./internal/event-buffer");
7
+ Object.defineProperty(exports, "EventBuffer", { enumerable: true, get: function () { return event_buffer_1.EventBuffer; } });
8
+ var config_1 = require("./config");
9
+ Object.defineProperty(exports, "sentinelConfig", { enumerable: true, get: function () { return config_1.sentinelConfig; } });
10
+ var cancel_adapter_1 = require("./adapters/cancel-adapter");
11
+ Object.defineProperty(exports, "cancelAdapter", { enumerable: true, get: function () { return cancel_adapter_1.cancelAdapter; } });
12
+ var telemetry_1 = require("./adapters/telemetry");
13
+ Object.defineProperty(exports, "telemetryAdapter", { enumerable: true, get: function () { return telemetry_1.telemetryAdapter; } });
14
+ var audit_1 = require("./adapters/audit");
15
+ Object.defineProperty(exports, "auditAdapter", { enumerable: true, get: function () { return audit_1.auditAdapter; } });
16
+ var policies_1 = require("./policies");
17
+ Object.defineProperty(exports, "policyManager", { enumerable: true, get: function () { return policies_1.policyManager; } });
18
+ Object.defineProperty(exports, "PolicyManager", { enumerable: true, get: function () { return policies_1.PolicyManager; } });
19
+ var policies_2 = require("./policies");
20
+ Object.defineProperty(exports, "TimeoutPolicy", { enumerable: true, get: function () { return policies_2.TimeoutPolicy; } });
21
+ Object.defineProperty(exports, "IdlePolicy", { enumerable: true, get: function () { return policies_2.IdlePolicy; } });
22
+ Object.defineProperty(exports, "TokenCapPolicy", { enumerable: true, get: function () { return policies_2.TokenCapPolicy; } });
23
+ Object.defineProperty(exports, "LoopDetectionPolicy", { enumerable: true, get: function () { return policies_2.LoopDetectionPolicy; } });
24
+ var policy_templates_1 = require("./policy-templates");
25
+ Object.defineProperty(exports, "policyTemplates", { enumerable: true, get: function () { return policy_templates_1.policyTemplates; } });
26
+ Object.defineProperty(exports, "getPolicyTemplate", { enumerable: true, get: function () { return policy_templates_1.getPolicyTemplate; } });
27
+ Object.defineProperty(exports, "listPolicyTemplates", { enumerable: true, get: function () { return policy_templates_1.listPolicyTemplates; } });
28
+ Object.defineProperty(exports, "applyPolicyTemplate", { enumerable: true, get: function () { return policy_templates_1.applyPolicyTemplate; } });
29
+ Object.defineProperty(exports, "recommendTemplate", { enumerable: true, get: function () { return policy_templates_1.recommendTemplate; } });
30
+ var predictive_1 = require("./predictive");
31
+ Object.defineProperty(exports, "predictViolations", { enumerable: true, get: function () { return predictive_1.predictViolations; } });
32
+ Object.defineProperty(exports, "getMostLikelyViolation", { enumerable: true, get: function () { return predictive_1.getMostLikelyViolation; } });
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAEjB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AACvB,4DAAyE;AAAhE,+GAAA,aAAa,OAAA;AACtB,kDAA0E;AAAjE,6GAAA,gBAAgB,OAAA;AACzB,0CAA8D;AAArD,qGAAA,YAAY,OAAA;AACrB,uCAAmF;AAA1E,yGAAA,aAAa,OAAA;AAAE,yGAAA,aAAa,OAAA;AACrC,uCAA4F;AAAnF,yGAAA,aAAa,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AACvE,uDAO4B;AAN1B,mHAAA,eAAe,OAAA;AACf,qHAAA,iBAAiB,OAAA;AACjB,uHAAA,mBAAmB,OAAA;AACnB,uHAAA,mBAAmB,OAAA;AACnB,qHAAA,iBAAiB,OAAA;AAGnB,2CAIsB;AAHpB,+GAAA,iBAAiB,OAAA;AACjB,oHAAA,sBAAsB,OAAA"}
@@ -0,0 +1,13 @@
1
+ import { RunEvent, RunState } from '../types';
2
+ export declare class EventBuffer {
3
+ private static readonly MAX_EVENTS_PER_RUN;
4
+ private runStates;
5
+ processEvent(event: RunEvent): void;
6
+ getRunState(runId: string): RunState | undefined;
7
+ getActiveRuns(): RunState[];
8
+ markKilled(runId: string, reason: string): void;
9
+ cleanup(): void;
10
+ getRecentEvents(runId: string, count?: number): RunEvent[];
11
+ getTokenEventsInWindow(runId: string, windowMs: number): RunEvent[];
12
+ }
13
+ //# sourceMappingURL=event-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-buffer.d.ts","sourceRoot":"","sources":["../../src/internal/event-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE9C,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAO;IACjD,OAAO,CAAC,SAAS,CAA+B;IAKzC,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAuDnC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAOhD,aAAa,IAAI,QAAQ,EAAE;IAQ3B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAW/C,OAAO,IAAI,IAAI;IAiBf,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,QAAQ,EAAE;IAU9D,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;CAW3E"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventBuffer = void 0;
4
+ class EventBuffer {
5
+ constructor() {
6
+ this.runStates = new Map();
7
+ }
8
+ processEvent(event) {
9
+ const runId = event.runId;
10
+ let runState = this.runStates.get(runId);
11
+ if (!runState) {
12
+ runState = {
13
+ runId,
14
+ createdAt: Date.now(),
15
+ tokenCount: 0,
16
+ status: 'created',
17
+ events: []
18
+ };
19
+ this.runStates.set(runId, runState);
20
+ }
21
+ runState.events.push(event);
22
+ if (runState.events.length > EventBuffer.MAX_EVENTS_PER_RUN) {
23
+ runState.events.shift();
24
+ }
25
+ switch (event.type) {
26
+ case 'created':
27
+ runState.createdAt = event.at;
28
+ break;
29
+ case 'started':
30
+ runState.startedAt = event.at;
31
+ runState.status = 'running';
32
+ break;
33
+ case 'token':
34
+ runState.lastTokenAt = event.at;
35
+ runState.tokenCount += event.tokens;
36
+ if (event.cost !== undefined) {
37
+ runState.cost = (runState.cost || 0) + event.cost;
38
+ }
39
+ break;
40
+ case 'finish':
41
+ runState.status = 'finished';
42
+ break;
43
+ case 'error':
44
+ runState.status = 'finished';
45
+ break;
46
+ }
47
+ }
48
+ getRunState(runId) {
49
+ return this.runStates.get(runId);
50
+ }
51
+ getActiveRuns() {
52
+ return Array.from(this.runStates.values())
53
+ .filter(run => run.status === 'created' || run.status === 'running');
54
+ }
55
+ markKilled(runId, reason) {
56
+ const runState = this.runStates.get(runId);
57
+ if (runState) {
58
+ runState.status = 'killed';
59
+ runState.killReason = reason;
60
+ }
61
+ }
62
+ cleanup() {
63
+ const now = Date.now();
64
+ const maxAge = 60 * 60 * 1000;
65
+ for (const [runId, runState] of this.runStates.entries()) {
66
+ if (runState.status === 'finished' || runState.status === 'killed') {
67
+ const age = now - Math.max(runState.createdAt, runState.startedAt || 0);
68
+ if (age > maxAge) {
69
+ this.runStates.delete(runId);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ getRecentEvents(runId, count = 10) {
75
+ const runState = this.runStates.get(runId);
76
+ if (!runState)
77
+ return [];
78
+ return runState.events.slice(-count);
79
+ }
80
+ getTokenEventsInWindow(runId, windowMs) {
81
+ const runState = this.runStates.get(runId);
82
+ if (!runState)
83
+ return [];
84
+ const now = Date.now();
85
+ const cutoff = now - windowMs;
86
+ return runState.events
87
+ .filter(event => event.type === 'token' && event.at >= cutoff)
88
+ .slice(-10);
89
+ }
90
+ }
91
+ exports.EventBuffer = EventBuffer;
92
+ EventBuffer.MAX_EVENTS_PER_RUN = 100;
93
+ //# sourceMappingURL=event-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-buffer.js","sourceRoot":"","sources":["../../src/internal/event-buffer.ts"],"names":[],"mappings":"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"}