@defai.digital/resilience-domain 13.0.3

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.
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Resource Enforcer Implementation
3
+ *
4
+ * Enforces limits on tokens, time, cost, and concurrency.
5
+ */
6
+ import { type ResourceLimitsConfig, type ResourceUsage, type ResourceCheckResult, type ResourceRequestInfo } from './_contracts.js';
7
+ /**
8
+ * Resource enforcer error
9
+ */
10
+ export declare class ResourceEnforcerError extends Error {
11
+ readonly code: string;
12
+ readonly limit: string;
13
+ readonly current: number;
14
+ readonly max: number;
15
+ constructor(code: string, message: string, limit: string, current: number, max: number);
16
+ static fromCheckResult(result: ResourceCheckResult & {
17
+ allowed: false;
18
+ }): ResourceEnforcerError;
19
+ }
20
+ /**
21
+ * Resource enforcer interface
22
+ */
23
+ export interface ResourceEnforcer {
24
+ /** Check if request is within limits */
25
+ checkLimits(sessionId: string, request?: ResourceRequestInfo): ResourceCheckResult;
26
+ /** Record resource usage after request */
27
+ recordUsage(sessionId: string, inputTokens: number, outputTokens: number, durationMs: number): void;
28
+ /** Start tracking concurrent request */
29
+ startRequest(sessionId: string): void;
30
+ /** End tracking concurrent request */
31
+ endRequest(sessionId: string): void;
32
+ /** Get current usage for session */
33
+ getUsage(sessionId: string): ResourceUsage;
34
+ /** Reset usage for session */
35
+ resetUsage(sessionId: string): void;
36
+ /** Get all active sessions */
37
+ getActiveSessions(): string[];
38
+ }
39
+ /**
40
+ * Creates a resource enforcer
41
+ */
42
+ export declare function createResourceEnforcer(config?: Partial<ResourceLimitsConfig>): ResourceEnforcer;
43
+ /**
44
+ * Creates a strict resource enforcer that throws on limit exceeded
45
+ */
46
+ export declare function createStrictResourceEnforcer(config?: Partial<ResourceLimitsConfig>): ResourceEnforcer;
47
+ //# sourceMappingURL=resource-enforcer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-enforcer.d.ts","sourceRoot":"","sources":["../src/resource-enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAKzB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,IAAI,EAAE,MAAM;aAEZ,KAAK,EAAE,MAAM;aACb,OAAO,EAAE,MAAM;aACf,GAAG,EAAE,MAAM;gBAJX,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM;IAM7B,MAAM,CAAC,eAAe,CACpB,MAAM,EAAE,mBAAmB,GAAG;QAAE,OAAO,EAAE,KAAK,CAAA;KAAE,GAC/C,qBAAqB;CAiBzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,CAAC;IAEnF,0CAA0C;IAC1C,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,IAAI,CAAC;IAER,wCAAwC;IACxC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtC,sCAAsC;IACtC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC;IAE3C,8BAA8B;IAC9B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC,8BAA8B;IAC9B,iBAAiB,IAAI,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,gBAAgB,CA2IlB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,gBAAgB,CAkBlB"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Resource Enforcer Implementation
3
+ *
4
+ * Enforces limits on tokens, time, cost, and concurrency.
5
+ */
6
+ import { ResourceLimitsErrorCodes, createDefaultResourceLimitsConfig, createResourceUsage, estimateCost, } from './_contracts.js';
7
+ /**
8
+ * Resource enforcer error
9
+ */
10
+ export class ResourceEnforcerError extends Error {
11
+ code;
12
+ limit;
13
+ current;
14
+ max;
15
+ constructor(code, message, limit, current, max) {
16
+ super(message);
17
+ this.code = code;
18
+ this.limit = limit;
19
+ this.current = current;
20
+ this.max = max;
21
+ this.name = 'ResourceEnforcerError';
22
+ }
23
+ static fromCheckResult(result) {
24
+ const codeMap = {
25
+ 'tokens-per-request': ResourceLimitsErrorCodes.TOKENS_PER_REQUEST_EXCEEDED,
26
+ 'tokens-per-session': ResourceLimitsErrorCodes.TOKENS_PER_SESSION_EXCEEDED,
27
+ 'duration': ResourceLimitsErrorCodes.DURATION_EXCEEDED,
28
+ 'cost': ResourceLimitsErrorCodes.COST_EXCEEDED,
29
+ 'concurrency': ResourceLimitsErrorCodes.CONCURRENCY_EXCEEDED,
30
+ };
31
+ return new ResourceEnforcerError(codeMap[result.limitType] ?? 'RESOURCE_LIMIT_EXCEEDED', result.reason, result.limitType, result.current, result.max);
32
+ }
33
+ }
34
+ /**
35
+ * Creates a resource enforcer
36
+ */
37
+ export function createResourceEnforcer(config) {
38
+ const cfg = { ...createDefaultResourceLimitsConfig(), ...config };
39
+ const usageBySession = new Map();
40
+ function getOrCreateUsage(sessionId) {
41
+ let usage = usageBySession.get(sessionId);
42
+ if (!usage) {
43
+ usage = createResourceUsage(sessionId);
44
+ usageBySession.set(sessionId, usage);
45
+ }
46
+ return usage;
47
+ }
48
+ return {
49
+ checkLimits(sessionId, request) {
50
+ const usage = getOrCreateUsage(sessionId);
51
+ // Check concurrency limit
52
+ if (request?.isConcurrent) {
53
+ if (usage.concurrentRequests >= cfg.maxConcurrentRequests) {
54
+ return {
55
+ allowed: false,
56
+ reason: `Concurrent request limit exceeded`,
57
+ limitType: 'concurrency',
58
+ current: usage.concurrentRequests,
59
+ max: cfg.maxConcurrentRequests,
60
+ };
61
+ }
62
+ }
63
+ // Check tokens per request
64
+ const estimatedRequestTokens = (request?.estimatedInputTokens ?? 0) +
65
+ (request?.estimatedOutputTokens ?? 0);
66
+ if (estimatedRequestTokens > cfg.maxTokensPerRequest) {
67
+ return {
68
+ allowed: false,
69
+ reason: `Estimated tokens (${estimatedRequestTokens}) exceeds per-request limit`,
70
+ limitType: 'tokens-per-request',
71
+ current: estimatedRequestTokens,
72
+ max: cfg.maxTokensPerRequest,
73
+ };
74
+ }
75
+ // Check tokens per session
76
+ const totalSessionTokens = usage.inputTokens + usage.outputTokens + estimatedRequestTokens;
77
+ if (totalSessionTokens > cfg.maxTokensPerSession) {
78
+ return {
79
+ allowed: false,
80
+ reason: `Session token limit would be exceeded`,
81
+ limitType: 'tokens-per-session',
82
+ current: usage.inputTokens + usage.outputTokens,
83
+ max: cfg.maxTokensPerSession,
84
+ };
85
+ }
86
+ // Check cost limit
87
+ const estimatedNewCost = estimateCost(request?.estimatedInputTokens ?? 0, request?.estimatedOutputTokens ?? 0, cfg);
88
+ const projectedCost = usage.estimatedCost + estimatedNewCost;
89
+ if (projectedCost > cfg.maxCostPerSession) {
90
+ return {
91
+ allowed: false,
92
+ reason: `Session cost limit would be exceeded`,
93
+ limitType: 'cost',
94
+ current: usage.estimatedCost,
95
+ max: cfg.maxCostPerSession,
96
+ };
97
+ }
98
+ // Check duration limit
99
+ const elapsed = Date.now() - new Date(usage.startedAt).getTime();
100
+ if (elapsed > cfg.maxDurationMs) {
101
+ return {
102
+ allowed: false,
103
+ reason: `Session duration limit exceeded`,
104
+ limitType: 'duration',
105
+ current: elapsed,
106
+ max: cfg.maxDurationMs,
107
+ };
108
+ }
109
+ return { allowed: true };
110
+ },
111
+ recordUsage(sessionId, inputTokens, outputTokens, durationMs) {
112
+ const usage = getOrCreateUsage(sessionId);
113
+ usage.inputTokens += inputTokens;
114
+ usage.outputTokens += outputTokens;
115
+ usage.totalDurationMs += durationMs;
116
+ usage.requestCount++;
117
+ usage.estimatedCost = estimateCost(usage.inputTokens, usage.outputTokens, cfg);
118
+ usage.lastRequestAt = new Date().toISOString();
119
+ },
120
+ startRequest(sessionId) {
121
+ const usage = getOrCreateUsage(sessionId);
122
+ usage.concurrentRequests++;
123
+ },
124
+ endRequest(sessionId) {
125
+ const usage = usageBySession.get(sessionId);
126
+ if (usage && usage.concurrentRequests > 0) {
127
+ usage.concurrentRequests--;
128
+ }
129
+ },
130
+ getUsage(sessionId) {
131
+ return getOrCreateUsage(sessionId);
132
+ },
133
+ resetUsage(sessionId) {
134
+ usageBySession.delete(sessionId);
135
+ },
136
+ getActiveSessions() {
137
+ return Array.from(usageBySession.keys());
138
+ },
139
+ };
140
+ }
141
+ /**
142
+ * Creates a strict resource enforcer that throws on limit exceeded
143
+ */
144
+ export function createStrictResourceEnforcer(config) {
145
+ const enforcer = createResourceEnforcer(config);
146
+ const originalCheck = enforcer.checkLimits.bind(enforcer);
147
+ enforcer.checkLimits = (sessionId, request) => {
148
+ const result = originalCheck(sessionId, request);
149
+ if (!result.allowed) {
150
+ throw ResourceEnforcerError.fromCheckResult(result);
151
+ }
152
+ return result;
153
+ };
154
+ return enforcer;
155
+ }
156
+ //# sourceMappingURL=resource-enforcer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-enforcer.js","sourceRoot":"","sources":["../src/resource-enforcer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@defai.digital/resilience-domain",
3
+ "version": "13.0.3",
4
+ "type": "module",
5
+ "description": "Resilience patterns: circuit breaker, rate limiter, loop guard, resource limits, metrics",
6
+ "license": "Apache-2.0",
7
+ "author": "DEFAI Private Limited",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/defai-digital/automatosx.git",
11
+ "directory": "packages/core/resilience-domain"
12
+ },
13
+ "homepage": "https://github.com/defai-digital/automatosx#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/defai-digital/automatosx/issues"
16
+ },
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "engines": {
29
+ "node": ">=20.0.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "dependencies": {
35
+ "@defai.digital/contracts": "13.0.3"
36
+ },
37
+ "scripts": {
38
+ "build": "tsc --build",
39
+ "clean": "rm -rf dist *.tsbuildinfo"
40
+ }
41
+ }