acl-core-ts 1.75.1

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 (79) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +129 -0
  3. package/dist/client.d.ts +51 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +536 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +27 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +84 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/exceptions.d.ts +32 -0
  12. package/dist/exceptions.d.ts.map +1 -0
  13. package/dist/exceptions.js +99 -0
  14. package/dist/exceptions.js.map +1 -0
  15. package/dist/http.d.ts +21 -0
  16. package/dist/http.d.ts.map +1 -0
  17. package/dist/http.js +75 -0
  18. package/dist/http.js.map +1 -0
  19. package/dist/index.d.ts +4 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +22 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/middlewares/base.d.ts +5 -0
  24. package/dist/middlewares/base.d.ts.map +1 -0
  25. package/dist/middlewares/base.js +3 -0
  26. package/dist/middlewares/base.js.map +1 -0
  27. package/dist/middlewares/loop_detection.d.ts +9 -0
  28. package/dist/middlewares/loop_detection.d.ts.map +1 -0
  29. package/dist/middlewares/loop_detection.js +53 -0
  30. package/dist/middlewares/loop_detection.js.map +1 -0
  31. package/dist/middlewares/normalization.d.ts +5 -0
  32. package/dist/middlewares/normalization.d.ts.map +1 -0
  33. package/dist/middlewares/normalization.js +37 -0
  34. package/dist/middlewares/normalization.js.map +1 -0
  35. package/dist/middlewares/recovery.d.ts +17 -0
  36. package/dist/middlewares/recovery.d.ts.map +1 -0
  37. package/dist/middlewares/recovery.js +198 -0
  38. package/dist/middlewares/recovery.js.map +1 -0
  39. package/dist/middlewares/retry.d.ts +5 -0
  40. package/dist/middlewares/retry.d.ts.map +1 -0
  41. package/dist/middlewares/retry.js +39 -0
  42. package/dist/middlewares/retry.js.map +1 -0
  43. package/dist/providers/anthropic.d.ts +7 -0
  44. package/dist/providers/anthropic.d.ts.map +1 -0
  45. package/dist/providers/anthropic.js +77 -0
  46. package/dist/providers/anthropic.js.map +1 -0
  47. package/dist/providers/base.d.ts +22 -0
  48. package/dist/providers/base.d.ts.map +1 -0
  49. package/dist/providers/base.js +3 -0
  50. package/dist/providers/base.js.map +1 -0
  51. package/dist/providers/google.d.ts +7 -0
  52. package/dist/providers/google.d.ts.map +1 -0
  53. package/dist/providers/google.js +89 -0
  54. package/dist/providers/google.js.map +1 -0
  55. package/dist/providers/index.d.ts +8 -0
  56. package/dist/providers/index.d.ts.map +1 -0
  57. package/dist/providers/index.js +29 -0
  58. package/dist/providers/index.js.map +1 -0
  59. package/dist/providers/openai.d.ts +7 -0
  60. package/dist/providers/openai.d.ts.map +1 -0
  61. package/dist/providers/openai.js +82 -0
  62. package/dist/providers/openai.js.map +1 -0
  63. package/dist/security.d.ts +2 -0
  64. package/dist/security.d.ts.map +1 -0
  65. package/dist/security.js +18 -0
  66. package/dist/security.js.map +1 -0
  67. package/dist/session/manager.d.ts +21 -0
  68. package/dist/session/manager.d.ts.map +1 -0
  69. package/dist/session/manager.js +94 -0
  70. package/dist/session/manager.js.map +1 -0
  71. package/dist/similarity/engine.d.ts +15 -0
  72. package/dist/similarity/engine.d.ts.map +1 -0
  73. package/dist/similarity/engine.js +109 -0
  74. package/dist/similarity/engine.js.map +1 -0
  75. package/dist/types.d.ts +128 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +3 -0
  78. package/dist/types.js.map +1 -0
  79. package/package.json +54 -0
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecoveryMiddleware = void 0;
4
+ class RecoveryMiddleware {
5
+ constructor(sessionManager, policyVerdictFn) {
6
+ this.sessionManager = sessionManager;
7
+ this.policyVerdictFn = policyVerdictFn || (async () => ({
8
+ status: 'local',
9
+ action: 'allow',
10
+ reason: 'policy_not_configured',
11
+ }));
12
+ }
13
+ async process(params, next) {
14
+ if (params._recovery_mode) {
15
+ return next(params);
16
+ }
17
+ const sessionId = params.session_id || 'default';
18
+ const originalPrompt = params.prompt || '';
19
+ const originalTemperature = params.temperature ?? 0.2;
20
+ const response = await next(params);
21
+ if (!response.loop_detected) {
22
+ return response;
23
+ }
24
+ this.sessionManager.incrementMetric(sessionId, 'loops_detected');
25
+ const serverVerdict = await this.getServerVerdict(params, response, sessionId);
26
+ const action = String(serverVerdict['action'] || 'allow').toLowerCase();
27
+ const preferredStrategy = action === 'recover' ? serverVerdict['strategy'] : undefined;
28
+ if (action === 'block') {
29
+ return {
30
+ ...response,
31
+ loop_detected: true,
32
+ loop_broken: false,
33
+ error_code: 'ACL_ERR_LOOP_BLOCKED',
34
+ error_message: 'Loop blocked by server policy. Retry after cooldown.',
35
+ server_verdict: serverVerdict,
36
+ };
37
+ }
38
+ const recoveryResult = await this.attemptRecovery(params, response, next, sessionId, originalPrompt, originalTemperature, preferredStrategy);
39
+ if (recoveryResult) {
40
+ this.sessionManager.incrementMetric(sessionId, 'loops_broken');
41
+ const originalTokens = response.total_tokens || 0;
42
+ const tokensSaved = Math.max(0, originalTokens * (RecoveryMiddleware.MAX_RECOVERY_ATTEMPTS - recoveryResult.attempts));
43
+ return {
44
+ ...recoveryResult.response,
45
+ loop_detected: true,
46
+ loop_broken: true,
47
+ recovery_strategy: recoveryResult.strategy,
48
+ recovery_attempts: recoveryResult.attempts,
49
+ tokens_saved: tokensSaved,
50
+ server_verdict: serverVerdict,
51
+ };
52
+ }
53
+ return {
54
+ ...response,
55
+ loop_detected: true,
56
+ loop_broken: false,
57
+ recovery_strategy: null,
58
+ recovery_attempts: RecoveryMiddleware.MAX_RECOVERY_ATTEMPTS,
59
+ tokens_saved: 0,
60
+ error_code: 'ACL_ERR_LOOP_RECOVERY_FAILED',
61
+ error_message: 'All loop recovery attempts exhausted. Loop persists.',
62
+ server_verdict: serverVerdict,
63
+ };
64
+ }
65
+ async attemptRecovery(params, response, next, sessionId, originalPrompt, originalTemperature, preferredStrategy) {
66
+ const recoverySteps = [
67
+ { strategy: 'context_injection', func: this.stepContextInjection.bind(this) },
68
+ { strategy: 'temperature_spike', func: this.stepTemperatureSpike.bind(this) },
69
+ { strategy: 'context_reset', func: this.stepContextReset.bind(this) },
70
+ ];
71
+ if (preferredStrategy) {
72
+ recoverySteps.sort((a, b) => {
73
+ if (a.strategy === preferredStrategy)
74
+ return -1;
75
+ if (b.strategy === preferredStrategy)
76
+ return 1;
77
+ return 0;
78
+ });
79
+ }
80
+ let currentResponse = response;
81
+ for (let stepIdx = 0; stepIdx < recoverySteps.length; stepIdx++) {
82
+ const step = recoverySteps[stepIdx];
83
+ const strategyName = step.strategy;
84
+ const stepFunc = step.func;
85
+ const attempt = stepIdx + 1;
86
+ const recoveryParams = stepFunc({
87
+ ...params,
88
+ sessionId,
89
+ originalPrompt,
90
+ originalTemperature,
91
+ }, currentResponse);
92
+ recoveryParams._recovery_mode = true;
93
+ recoveryParams._recovery_attempt = attempt;
94
+ try {
95
+ const newResponse = await next(recoveryParams);
96
+ if (!newResponse.loop_detected) {
97
+ return {
98
+ response: newResponse,
99
+ strategy: strategyName,
100
+ attempts: attempt,
101
+ };
102
+ }
103
+ currentResponse = newResponse;
104
+ }
105
+ catch (error) {
106
+ continue;
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ async getServerVerdict(params, response, sessionId) {
112
+ const text = String(response?.text || '').slice(0, 800);
113
+ const evidenceHash = this.simpleHash(text);
114
+ const payload = {
115
+ session_id: sessionId,
116
+ model: params?.model,
117
+ provider: params?.provider,
118
+ attempt: Number(params?._recovery_attempt || 1),
119
+ signals: Number(response?.loop_signals || 0),
120
+ loop_detected: !!response?.loop_detected,
121
+ evidence_hash: evidenceHash,
122
+ metadata: {
123
+ loop_layer_results: response?.loop_layer_results || {},
124
+ },
125
+ };
126
+ try {
127
+ const verdict = await this.policyVerdictFn(payload);
128
+ if (verdict && ['allow', 'recover', 'block'].includes(String(verdict['action'] || '').toLowerCase())) {
129
+ return verdict;
130
+ }
131
+ }
132
+ catch {
133
+ }
134
+ return { status: 'fallback', action: 'allow', reason: 'policy_request_failed' };
135
+ }
136
+ simpleHash(input) {
137
+ if (!input)
138
+ return '';
139
+ let hash = 0;
140
+ for (let i = 0; i < input.length; i++) {
141
+ hash = ((hash << 5) - hash) + input.charCodeAt(i);
142
+ hash |= 0;
143
+ }
144
+ return `h${Math.abs(hash)}`;
145
+ }
146
+ stepContextInjection(context, _previousResponse) {
147
+ const injectionMessage = 'You are repeating yourself. Your previous response was identical ' +
148
+ 'to prior responses. You MUST provide a completely different approach, ' +
149
+ 'perspective, or answer. Do not repeat any previous content.';
150
+ const modifiedPrompt = `${injectionMessage}\n\n---\n\nOriginal request:\n${context.originalPrompt}`;
151
+ return {
152
+ ...context,
153
+ prompt: modifiedPrompt,
154
+ temperature: context.originalTemperature,
155
+ };
156
+ }
157
+ stepTemperatureSpike(context, _previousResponse) {
158
+ const injectionMessage = 'You are repeating yourself. Your previous response was identical ' +
159
+ 'to prior responses. You MUST provide a completely different approach, ' +
160
+ 'perspective, or answer. Do not repeat any previous content.';
161
+ const modifiedPrompt = `${injectionMessage}\n\n---\n\nOriginal request:\n${context.originalPrompt}`;
162
+ return {
163
+ ...context,
164
+ prompt: modifiedPrompt,
165
+ temperature: 0.9,
166
+ };
167
+ }
168
+ stepContextReset(context, _previousResponse) {
169
+ const history = this.sessionManager.getHistory(context.sessionId);
170
+ const last10 = history.length > 10 ? history.slice(-10) : history;
171
+ const summary = this.compressHistory(last10);
172
+ this.sessionManager.resetHistory(context.sessionId, summary);
173
+ const resetPrompt = `Previous conversation summary:\n${summary}\n\n` +
174
+ `---\n\n` +
175
+ `Please continue with a fresh response to:\n${context.originalPrompt}`;
176
+ return {
177
+ ...context,
178
+ prompt: resetPrompt,
179
+ temperature: 0.5,
180
+ };
181
+ }
182
+ compressHistory(messages) {
183
+ if (messages.length === 0) {
184
+ return 'No prior context available.';
185
+ }
186
+ if (messages.length === 1) {
187
+ const truncated = messages[0].substring(0, 100);
188
+ return `User initiated a conversation. Initial response: ${truncated}...`;
189
+ }
190
+ const firstTruncated = messages[0].substring(0, 80);
191
+ const lastTruncated = messages[messages.length - 1].substring(0, 80);
192
+ return (`Conversation started with: ${firstTruncated}... ` +
193
+ `Most recent response: ${lastTruncated}...`);
194
+ }
195
+ }
196
+ exports.RecoveryMiddleware = RecoveryMiddleware;
197
+ RecoveryMiddleware.MAX_RECOVERY_ATTEMPTS = 3;
198
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/middlewares/recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ACLMiddleware, NextCall } from './base';
2
+ export declare class RetryMiddleware implements ACLMiddleware {
3
+ process(params: any, next: NextCall): Promise<any>;
4
+ }
5
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/middlewares/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGjD,qBAAa,eAAgB,YAAW,aAAa;IAC7C,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;CAoCzD"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RetryMiddleware = void 0;
4
+ const exceptions_1 = require("../exceptions");
5
+ class RetryMiddleware {
6
+ async process(params, next) {
7
+ const parsedMaxRetries = Number(params.max_retries ?? 1);
8
+ const maxRetries = Number.isFinite(parsedMaxRetries) && parsedMaxRetries > 0
9
+ ? Math.floor(parsedMaxRetries)
10
+ : 1;
11
+ let lastError;
12
+ const baseDelayMs = 500;
13
+ const maxDelayMs = 8000;
14
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
15
+ params._attempt = attempt + 1;
16
+ try {
17
+ const result = await next(params);
18
+ if (result && typeof result === 'object') {
19
+ const textValue = typeof result.text === 'string' ? result.text : '';
20
+ if (textValue.trim().length === 0) {
21
+ throw new exceptions_1.ACLSilentFailureError('LLM returned an empty response. Triggering retry.');
22
+ }
23
+ }
24
+ return result;
25
+ }
26
+ catch (error) {
27
+ lastError = error;
28
+ if (attempt < maxRetries - 1) {
29
+ const cap = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, attempt));
30
+ const waitTime = Math.random() * cap;
31
+ await new Promise(resolve => setTimeout(resolve, waitTime));
32
+ }
33
+ }
34
+ }
35
+ throw lastError || new Error('All retries exhausted');
36
+ }
37
+ }
38
+ exports.RetryMiddleware = RetryMiddleware;
39
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/middlewares/retry.ts"],"names":[],"mappings":";;;AACA,8CAAsD;AAEtD,MAAa,eAAe;IAC1B,KAAK,CAAC,OAAO,CAAC,MAAW,EAAE,IAAc;QACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,GAAG,CAAC;YAC1E,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAC9B,CAAC,CAAC,CAAC,CAAC;QACN,IAAI,SAAc,CAAC;QACnB,MAAM,WAAW,GAAG,GAAG,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC;QAExB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;gBAIlC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACzC,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrE,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAClC,MAAM,IAAI,kCAAqB,CAAC,mDAAmD,CAAC,CAAC;oBACvF,CAAC;gBACH,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,OAAO,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;oBACrC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACxD,CAAC;CACF;AArCD,0CAqCC"}
@@ -0,0 +1,7 @@
1
+ import { BaseProvider, ProviderCallResult, Capabilities } from './base';
2
+ export declare class AnthropicProvider implements BaseProvider {
3
+ capabilities(): Capabilities;
4
+ call(prompt: string, model: string, api_key: string, max_tokens?: number, temperature?: number, stream?: boolean, timeout?: number, additionalParams?: any): Promise<ProviderCallResult>;
5
+ stream(_params: any): Promise<any>;
6
+ }
7
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AASxE,qBAAa,iBAAkB,YAAW,YAAY;IACpD,YAAY,IAAI,YAAY;IAWtB,IAAI,CACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,GAAE,MAAY,EACzB,MAAM,GAAE,OAAe,EACvB,OAAO,GAAE,MAAc,EACvB,gBAAgB,GAAE,GAAQ,GACzB,OAAO,CAAC,kBAAkB,CAAC;IAyDxB,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAKzC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AnthropicProvider = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const exceptions_1 = require("../exceptions");
9
+ const security_1 = require("../security");
10
+ class AnthropicProvider {
11
+ capabilities() {
12
+ return {
13
+ streaming: true,
14
+ tools: true,
15
+ json_mode: false,
16
+ vision: true,
17
+ embeddings: false,
18
+ function_calling: true
19
+ };
20
+ }
21
+ async call(prompt, model, api_key, max_tokens, temperature = 0.7, stream = false, timeout = 30000, additionalParams = {}) {
22
+ try {
23
+ const response = await axios_1.default.post('https://api.anthropic.com/v1/messages', {
24
+ model: model,
25
+ messages: [{ role: 'user', content: prompt }],
26
+ max_tokens: max_tokens || 1000,
27
+ temperature: temperature,
28
+ stream: stream,
29
+ ...additionalParams
30
+ }, {
31
+ headers: {
32
+ 'x-api-key': api_key,
33
+ 'anthropic-version': '2023-06-01',
34
+ 'Content-Type': 'application/json'
35
+ },
36
+ timeout: timeout
37
+ });
38
+ const data = response.data;
39
+ const usage = data.usage || {};
40
+ const content = data.content || [];
41
+ const text = content[0]?.text || '';
42
+ const stopReason = data.stop_reason || 'unknown';
43
+ const reasonMap = {
44
+ "end_turn": "stop",
45
+ "max_tokens": "length",
46
+ "stop_sequence": "stop",
47
+ "tool_use": "tool_call"
48
+ };
49
+ return {
50
+ text: text,
51
+ finish_reason: reasonMap[stopReason] || 'unknown',
52
+ tokens_input: usage.input_tokens || 0,
53
+ tokens_output: usage.output_tokens || 0,
54
+ total_tokens: (usage.input_tokens || 0) + (usage.output_tokens || 0),
55
+ raw_response: data
56
+ };
57
+ }
58
+ catch (error) {
59
+ if (!error.response) {
60
+ if (error.code === 'ECONNABORTED')
61
+ throw new exceptions_1.ACLNetworkError('Anthropic request timed out');
62
+ throw new exceptions_1.ACLNetworkError('Anthropic connection error');
63
+ }
64
+ const status = error.response.status;
65
+ if (status === 401)
66
+ throw new exceptions_1.ACLAuthError('Anthropic Auth failed');
67
+ if (status === 429)
68
+ throw new exceptions_1.ACLRateLimitError('Anthropic Rate limit exceeded');
69
+ throw new exceptions_1.ACLServerError(`Anthropic Provider error (${status}): ${(0, security_1.redactSecrets)(error.message)}`, status);
70
+ }
71
+ }
72
+ async stream(_params) {
73
+ throw new Error("Streaming not yet supported. Use complete() for standard requests.");
74
+ }
75
+ }
76
+ exports.AnthropicProvider = AnthropicProvider;
77
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,8CAKuB;AACvB,0CAA4C;AAE5C,MAAa,iBAAiB;IAC5B,YAAY;QACV,OAAO;YACL,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,KAAK;YACjB,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAc,EACd,KAAa,EACb,OAAe,EACf,UAAmB,EACnB,cAAsB,GAAG,EACzB,SAAkB,KAAK,EACvB,UAAkB,KAAK,EACvB,mBAAwB,EAAE;QAE1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,uCAAuC,EACvC;gBACE,KAAK,EAAE,KAAK;gBACZ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7C,UAAU,EAAE,UAAU,IAAI,IAAI;gBAC9B,WAAW,EAAE,WAAW;gBACxB,MAAM,EAAE,MAAM;gBACd,GAAG,gBAAgB;aACpB,EACD;gBACE,OAAO,EAAE;oBACP,WAAW,EAAE,OAAO;oBACpB,mBAAmB,EAAE,YAAY;oBACjC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,OAAO,EAAE,OAAO;aACjB,CACF,CAAC;YAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YAGpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;YACjD,MAAM,SAAS,GAA2B;gBACtC,UAAU,EAAE,MAAM;gBAClB,YAAY,EAAE,QAAQ;gBACtB,eAAe,EAAE,MAAM;gBACvB,UAAU,EAAE,WAAW;aAC1B,CAAC;YAEF,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS;gBACjD,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;gBACrC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;gBACvC,YAAY,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;gBACpE,YAAY,EAAE,IAAI;aACnB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;oBAAE,MAAM,IAAI,4BAAe,CAAC,6BAA6B,CAAC,CAAC;gBAC5F,MAAM,IAAI,4BAAe,CAAC,4BAA4B,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrC,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,yBAAY,CAAC,uBAAuB,CAAC,CAAC;YACpE,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,8BAAiB,CAAC,+BAA+B,CAAC,CAAC;YACjF,MAAM,IAAI,2BAAc,CAAC,6BAA6B,MAAM,MAAM,IAAA,wBAAa,EAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAY;QACvB,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;CACF;AAnFD,8CAmFC"}
@@ -0,0 +1,22 @@
1
+ export interface Capabilities {
2
+ streaming: boolean;
3
+ tools: boolean;
4
+ json_mode: boolean;
5
+ vision: boolean;
6
+ embeddings: boolean;
7
+ function_calling: boolean;
8
+ }
9
+ export interface ProviderCallResult {
10
+ text: string;
11
+ finish_reason: string;
12
+ tokens_input: number;
13
+ tokens_output: number;
14
+ total_tokens: number;
15
+ raw_response: any;
16
+ }
17
+ export interface BaseProvider {
18
+ capabilities(): Capabilities;
19
+ call(prompt: string, model: string, api_key: string, max_tokens?: number, temperature?: number, stream?: boolean, timeout?: number, additionalParams?: any): Promise<ProviderCallResult>;
20
+ stream(params: any): Promise<any>;
21
+ }
22
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,IAAI,YAAY,CAAC;IAC7B,IAAI,CACF,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,GAAG,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE/B,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACnC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { BaseProvider, ProviderCallResult, Capabilities } from './base';
2
+ export declare class GoogleProvider implements BaseProvider {
3
+ capabilities(): Capabilities;
4
+ call(prompt: string, model: string, apiKey: string, maxTokens?: number, temperature?: number, _stream?: boolean, timeoutMs?: number, extra?: any): Promise<ProviderCallResult>;
5
+ stream(_kwargs: any): Promise<any>;
6
+ }
7
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQxE,qBAAa,cAAe,YAAW,YAAY;IAMxC,YAAY,IAAI,YAAY;IAWtB,IAAI,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAa,EACxB,WAAW,GAAE,MAAY,EACzB,OAAO,GAAE,OAAe,EACxB,SAAS,GAAE,MAAc,EACzB,KAAK,GAAE,GAAQ,GAChB,OAAO,CAAC,kBAAkB,CAAC;IAwEjB,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAKlD"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GoogleProvider = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const exceptions_1 = require("../exceptions");
9
+ const security_1 = require("../security");
10
+ class GoogleProvider {
11
+ capabilities() {
12
+ return {
13
+ streaming: true,
14
+ tools: true,
15
+ json_mode: true,
16
+ vision: true,
17
+ embeddings: true,
18
+ function_calling: true
19
+ };
20
+ }
21
+ async call(prompt, model, apiKey, maxTokens = 1024, temperature = 0.7, _stream = false, timeoutMs = 30000, extra = {}) {
22
+ let urlModel = model;
23
+ if (!urlModel.startsWith('models/')) {
24
+ urlModel = `models/${urlModel}`;
25
+ }
26
+ const url = `https://generativelanguage.googleapis.com/v1beta/${urlModel}:generateContent?key=${apiKey}`;
27
+ const payload = {
28
+ contents: [{
29
+ parts: [{ text: prompt }]
30
+ }],
31
+ generationConfig: {
32
+ maxOutputTokens: maxTokens,
33
+ temperature: temperature,
34
+ ...extra
35
+ }
36
+ };
37
+ try {
38
+ const response = await axios_1.default.post(url, payload, {
39
+ headers: { 'Content-Type': 'application/json' },
40
+ timeout: timeoutMs
41
+ });
42
+ const data = response.data;
43
+ if (!data.candidates || data.candidates.length === 0) {
44
+ if (data.promptFeedback?.blockReason) {
45
+ throw new exceptions_1.ACLServerError(`Gemini blocked prompt: ${data.promptFeedback.blockReason}`, 400);
46
+ }
47
+ throw new exceptions_1.ACLServerError('Gemini returned no candidates (empty response)', 500);
48
+ }
49
+ const firstCandidate = data.candidates[0];
50
+ const content = firstCandidate.content || {};
51
+ const parts = content.parts || [];
52
+ const text = parts[0]?.text || '';
53
+ const stopReason = firstCandidate.finishReason || 'OTHER';
54
+ const reasonMap = {
55
+ 'STOP': 'stop',
56
+ 'MAX_TOKENS': 'length',
57
+ 'SAFETY': 'content_filter',
58
+ 'RECITATION': 'content_filter',
59
+ 'OTHER': 'unknown'
60
+ };
61
+ const usage = data.usageMetadata || {};
62
+ return {
63
+ text,
64
+ finish_reason: reasonMap[stopReason] || 'unknown',
65
+ tokens_input: usage.promptTokenCount || 0,
66
+ tokens_output: usage.candidatesTokenCount || 0,
67
+ total_tokens: usage.totalTokenCount || 0,
68
+ raw_response: data
69
+ };
70
+ }
71
+ catch (err) {
72
+ if (!err.response) {
73
+ if (err.code === 'ECONNABORTED')
74
+ throw new exceptions_1.ACLNetworkError('Google request timed out');
75
+ throw new exceptions_1.ACLNetworkError('Google connection error');
76
+ }
77
+ const status = err.response.status;
78
+ if (status === 401 || status === 403) {
79
+ throw new exceptions_1.ACLAuthError(`Google Auth failed (Invalid Key): ${(0, security_1.redactSecrets)(err.message)}`);
80
+ }
81
+ throw new exceptions_1.ACLServerError(`Google Provider error: ${(0, security_1.redactSecrets)(err.message)}`, status || 500);
82
+ }
83
+ }
84
+ async stream(_kwargs) {
85
+ throw new Error("Streaming not yet supported. Use complete() for standard requests.");
86
+ }
87
+ }
88
+ exports.GoogleProvider = GoogleProvider;
89
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,8CAIuB;AACvB,0CAA4C;AAE5C,MAAa,cAAc;IAMhB,YAAY;QACf,OAAO;YACH,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,IAAI;SACzB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,IAAI,CACb,MAAc,EACd,KAAa,EACb,MAAc,EACd,YAAoB,IAAI,EACxB,cAAsB,GAAG,EACzB,UAAmB,KAAK,EACxB,YAAoB,KAAK,EACzB,QAAa,EAAE;QAGf,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,QAAQ,GAAG,UAAU,QAAQ,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,GAAG,GAAG,oDAAoD,QAAQ,wBAAwB,MAAM,EAAE,CAAC;QAEzG,MAAM,OAAO,GAAG;YACZ,QAAQ,EAAE,CAAC;oBACP,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iBAC5B,CAAC;YACF,gBAAgB,EAAE;gBACd,eAAe,EAAE,SAAS;gBAC1B,WAAW,EAAE,WAAW;gBACxB,GAAG,KAAK;aACX;SACJ,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;gBAC5C,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,OAAO,EAAE,SAAS;aACrB,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAE3B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnD,IAAI,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;oBACnC,MAAM,IAAI,2BAAc,CAAC,0BAA0B,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC/F,CAAC;gBACD,MAAM,IAAI,2BAAc,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;YACpF,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,IAAI,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YAGlC,MAAM,UAAU,GAAG,cAAc,CAAC,YAAY,IAAI,OAAO,CAAC;YAC1D,MAAM,SAAS,GAA2B;gBACtC,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,QAAQ;gBACtB,QAAQ,EAAE,gBAAgB;gBAC1B,YAAY,EAAE,gBAAgB;gBAC9B,OAAO,EAAE,SAAS;aACrB,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;YAEvC,OAAO;gBACH,IAAI;gBACJ,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS;gBACjD,YAAY,EAAE,KAAK,CAAC,gBAAgB,IAAI,CAAC;gBACzC,aAAa,EAAE,KAAK,CAAC,oBAAoB,IAAI,CAAC;gBAC9C,YAAY,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC;gBACxC,YAAY,EAAE,IAAI;aACrB,CAAC;QACN,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;oBAAE,MAAM,IAAI,4BAAe,CAAC,0BAA0B,CAAC,CAAC;gBACvF,MAAM,IAAI,4BAAe,CAAC,yBAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,yBAAY,CAAC,qCAAqC,IAAA,wBAAa,EAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9F,CAAC;YACD,MAAM,IAAI,2BAAc,CAAC,0BAA0B,IAAA,wBAAa,EAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC;QACpG,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,OAAY;QAC5B,MAAM,IAAI,KAAK,CACX,oEAAoE,CACvE,CAAC;IACN,CAAC;CACJ;AAvGD,wCAuGC"}
@@ -0,0 +1,8 @@
1
+ import { BaseProvider } from './base';
2
+ export declare class ProviderRegistry {
3
+ private static _providers;
4
+ static register(name: string, providerClass: new () => BaseProvider): void;
5
+ static get(name: string): BaseProvider;
6
+ static listAvailable(): string[];
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAC,UAAU,CAKtB;WAEW,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,YAAY,GAAG,IAAI;WAInE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;WAQ/B,aAAa,IAAI,MAAM,EAAE;CAG1C"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProviderRegistry = void 0;
4
+ const openai_1 = require("./openai");
5
+ const anthropic_1 = require("./anthropic");
6
+ const google_1 = require("./google");
7
+ class ProviderRegistry {
8
+ static register(name, providerClass) {
9
+ this._providers.set(name.toLowerCase(), providerClass);
10
+ }
11
+ static get(name) {
12
+ const ProviderClass = this._providers.get(name.toLowerCase());
13
+ if (!ProviderClass) {
14
+ throw new Error(`Provider '${name}' not found in registry.`);
15
+ }
16
+ return new ProviderClass();
17
+ }
18
+ static listAvailable() {
19
+ return Array.from(this._providers.keys());
20
+ }
21
+ }
22
+ exports.ProviderRegistry = ProviderRegistry;
23
+ ProviderRegistry._providers = new Map([
24
+ ['openai', openai_1.OpenAIProvider],
25
+ ['anthropic', anthropic_1.AnthropicProvider],
26
+ ['google', google_1.GoogleProvider],
27
+ ['universal', openai_1.OpenAIProvider]
28
+ ]);
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;AACA,qCAA0C;AAC1C,2CAAgD;AAChD,qCAA0C;AAE1C,MAAa,gBAAgB;IAQlB,MAAM,CAAC,QAAQ,CAAC,IAAY,EAAE,aAAqC;QACtE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3D,CAAC;IAEM,MAAM,CAAC,GAAG,CAAC,IAAY;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,0BAA0B,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,aAAa,EAAE,CAAC;IAC/B,CAAC;IAEM,MAAM,CAAC,aAAa;QACvB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;;AAtBL,4CAuBC;AAtBkB,2BAAU,GAAwC,IAAI,GAAG,CAAC;IACrE,CAAC,QAAQ,EAAE,uBAAc,CAAC;IAC1B,CAAC,WAAW,EAAE,6BAAiB,CAAC;IAChC,CAAC,QAAQ,EAAE,uBAAc,CAAC;IAC1B,CAAC,WAAW,EAAE,uBAAc,CAAC;CAChC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { BaseProvider, ProviderCallResult, Capabilities } from './base';
2
+ export declare class OpenAIProvider implements BaseProvider {
3
+ capabilities(): Capabilities;
4
+ call(prompt: string, model: string, api_key: string, max_tokens?: number, temperature?: number, stream?: boolean, timeout?: number, additionalParams?: any): Promise<ProviderCallResult>;
5
+ stream(_params: any): Promise<any>;
6
+ }
7
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AASxE,qBAAa,cAAe,YAAW,YAAY;IACjD,YAAY,IAAI,YAAY;IAWtB,IAAI,CACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,GAAE,MAAY,EACzB,MAAM,GAAE,OAAe,EACvB,OAAO,GAAE,MAAc,EACvB,gBAAgB,GAAE,GAAQ,GACzB,OAAO,CAAC,kBAAkB,CAAC;IAiExB,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAKzC"}