@machina.ai/cell-cli-core 1.18.4-rc1 → 1.19.4-rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +2 -2
- package/dist/src/agents/codebase-investigator.js +1 -1
- package/dist/src/availability/modelAvailabilityService.d.ts +34 -0
- package/dist/src/availability/modelAvailabilityService.js +84 -0
- package/dist/src/availability/modelAvailabilityService.js.map +1 -0
- package/dist/src/availability/modelAvailabilityService.test.d.ts +6 -0
- package/dist/src/availability/modelAvailabilityService.test.js +140 -0
- package/dist/src/availability/modelAvailabilityService.test.js.map +1 -0
- package/dist/src/availability/modelPolicy.d.ts +42 -0
- package/dist/src/availability/modelPolicy.js +7 -0
- package/dist/src/availability/modelPolicy.js.map +1 -0
- package/dist/src/availability/policyCatalog.d.ts +20 -0
- package/dist/src/availability/policyCatalog.js +83 -0
- package/dist/src/availability/policyCatalog.js.map +1 -0
- package/dist/src/availability/policyCatalog.test.d.ts +6 -0
- package/dist/src/availability/policyCatalog.test.js +70 -0
- package/dist/src/availability/policyCatalog.test.js.map +1 -0
- package/dist/src/config/config.d.ts +10 -5
- package/dist/src/config/config.js +31 -18
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +4 -73
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +25 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.d.ts +6 -0
- package/dist/src/confirmation-bus/message-bus.js +63 -2
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +25 -2
- package/dist/src/confirmation-bus/types.js +3 -0
- package/dist/src/confirmation-bus/types.js.map +1 -1
- package/dist/src/core/AuthenticatedContentGenerator.d.ts +20 -0
- package/dist/src/core/AuthenticatedContentGenerator.js +115 -0
- package/dist/src/core/AuthenticatedContentGenerator.js.map +1 -0
- package/dist/src/core/baseLlmClient.d.ts +27 -1
- package/dist/src/core/baseLlmClient.js +66 -45
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +94 -6
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.js +77 -4
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +57 -3
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/clientHookTriggers.d.ts +36 -0
- package/dist/src/core/clientHookTriggers.js +76 -0
- package/dist/src/core/clientHookTriggers.js.map +1 -0
- package/dist/src/core/contentGenerator.js +8 -2
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +108 -0
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +2 -1
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +1 -1
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +10 -2
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +21 -6
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +23 -0
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +5 -0
- package/dist/src/core/turn.js +10 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/fallback/handler.js +1 -1
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/hooks/hookEventHandler.d.ts +109 -0
- package/dist/src/hooks/hookEventHandler.js +486 -0
- package/dist/src/hooks/hookEventHandler.js.map +1 -0
- package/dist/src/hooks/hookEventHandler.test.d.ts +6 -0
- package/dist/src/hooks/hookEventHandler.test.js +384 -0
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -0
- package/dist/src/hooks/hookSystem.d.ts +48 -0
- package/dist/src/hooks/hookSystem.js +83 -0
- package/dist/src/hooks/hookSystem.js.map +1 -0
- package/dist/src/hooks/hookSystem.test.d.ts +6 -0
- package/dist/src/hooks/hookSystem.test.js +213 -0
- package/dist/src/hooks/hookSystem.test.js.map +1 -0
- package/dist/src/hooks/index.d.ts +15 -0
- package/dist/src/hooks/index.js +15 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/policy-engine.d.ts +17 -1
- package/dist/src/policy/policy-engine.js +90 -1
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +222 -0
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +51 -1
- package/dist/src/policy/types.js +21 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/services/chatCompressionService.d.ts +1 -0
- package/dist/src/services/chatCompressionService.js +22 -6
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatCompressionService.test.js +27 -32
- package/dist/src/services/chatCompressionService.test.js.map +1 -1
- package/dist/src/services/gitService.js +3 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +10 -0
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +1 -0
- package/dist/src/services/modelConfigService.js +6 -2
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +111 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +2 -0
- package/dist/src/services/shellExecutionService.js +31 -3
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +78 -1
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases.golden.json +20 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +64 -30
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +6 -16
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +2 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +12 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +0 -3
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +22 -0
- package/dist/src/telemetry/metrics.js +32 -0
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +64 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sanitize.d.ts +25 -0
- package/dist/src/telemetry/sanitize.js +48 -0
- package/dist/src/telemetry/sanitize.js.map +1 -0
- package/dist/src/telemetry/sanitize.test.d.ts +6 -0
- package/dist/src/telemetry/sanitize.test.js +279 -0
- package/dist/src/telemetry/sanitize.test.js.map +1 -0
- package/dist/src/telemetry/semantic.js +1 -1
- package/dist/src/telemetry/semantic.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +19 -0
- package/dist/src/telemetry/types.js +65 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mock-message-bus.d.ts +60 -0
- package/dist/src/test-utils/mock-message-bus.js +131 -0
- package/dist/src/test-utils/mock-message-bus.js.map +1 -0
- package/dist/src/test-utils/mock-tool.js +1 -1
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/mcp-client.js +31 -0
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +1 -1
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/utils/customHeaderUtils.d.ts +9 -0
- package/dist/src/utils/customHeaderUtils.js +34 -0
- package/dist/src/utils/customHeaderUtils.js.map +1 -0
- package/dist/src/utils/customHeaderUtils.test.d.ts +6 -0
- package/dist/src/utils/customHeaderUtils.test.js +77 -0
- package/dist/src/utils/customHeaderUtils.test.js.map +1 -0
- package/dist/src/utils/package.d.ts +14 -0
- package/dist/src/utils/package.js +15 -2
- package/dist/src/utils/package.js.map +1 -1
- package/dist/src/utils/schemaValidator.d.ts +1 -1
- package/dist/src/utils/schemaValidator.js +1 -1
- package/dist/src/utils/shell-utils.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -180,6 +180,31 @@ export const DEFAULT_MODEL_CONFIGS = {
|
|
|
180
180
|
extends: 'gemini-2.5-flash-base',
|
|
181
181
|
modelConfig: {},
|
|
182
182
|
},
|
|
183
|
+
'chat-compression-3-pro': {
|
|
184
|
+
modelConfig: {
|
|
185
|
+
model: 'gemini-3-pro-preview',
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
'chat-compression-2.5-pro': {
|
|
189
|
+
modelConfig: {
|
|
190
|
+
model: 'gemini-2.5-pro',
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
'chat-compression-2.5-flash': {
|
|
194
|
+
modelConfig: {
|
|
195
|
+
model: 'gemini-2.5-flash',
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
'chat-compression-2.5-flash-lite': {
|
|
199
|
+
modelConfig: {
|
|
200
|
+
model: 'gemini-2.5-flash-lite',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
'chat-compression-default': {
|
|
204
|
+
modelConfig: {
|
|
205
|
+
model: 'gemini-2.5-pro',
|
|
206
|
+
},
|
|
207
|
+
},
|
|
183
208
|
},
|
|
184
209
|
};
|
|
185
210
|
//# sourceMappingURL=defaultModelConfigs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultModelConfigs.js","sourceRoot":"","sources":["../../../src/config/defaultModelConfigs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"defaultModelConfigs.js","sourceRoot":"","sources":["../../../src/config/defaultModelConfigs.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,4 +15,10 @@ export declare class MessageBus extends EventEmitter {
|
|
|
15
15
|
publish(message: Message): Promise<void>;
|
|
16
16
|
subscribe<T extends Message>(type: T['type'], listener: (message: T) => void): void;
|
|
17
17
|
unsubscribe<T extends Message>(type: T['type'], listener: (message: T) => void): void;
|
|
18
|
+
/**
|
|
19
|
+
* Request-response pattern: Publish a message and wait for a correlated response
|
|
20
|
+
* This enables synchronous-style communication over the async MessageBus
|
|
21
|
+
* The correlation ID is generated internally and added to the request
|
|
22
|
+
*/
|
|
23
|
+
request<TRequest extends Message, TResponse extends Message>(request: Omit<TRequest, 'correlationId'>, responseType: TResponse['type'], timeoutMs?: number): Promise<TResponse>;
|
|
18
24
|
}
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
6
7
|
import { EventEmitter } from 'node:events';
|
|
7
|
-
import { PolicyDecision } from '../policy/types.js';
|
|
8
|
-
import { MessageBusType } from './types.js';
|
|
8
|
+
import { PolicyDecision, getHookSource } from '../policy/types.js';
|
|
9
|
+
import { MessageBusType, } from './types.js';
|
|
9
10
|
import { safeJsonStringify } from '../utils/safeJsonStringify.js';
|
|
10
11
|
export class MessageBus extends EventEmitter {
|
|
11
12
|
policyEngine;
|
|
@@ -68,6 +69,36 @@ export class MessageBus extends EventEmitter {
|
|
|
68
69
|
throw new Error(`Unknown policy decision: ${decision}`);
|
|
69
70
|
}
|
|
70
71
|
}
|
|
72
|
+
else if (message.type === MessageBusType.HOOK_EXECUTION_REQUEST) {
|
|
73
|
+
// Handle hook execution requests through policy evaluation
|
|
74
|
+
const hookRequest = message;
|
|
75
|
+
const decision = await this.policyEngine.checkHook(hookRequest);
|
|
76
|
+
// Map decision to allow/deny for observability (ASK_USER treated as deny for hooks)
|
|
77
|
+
const effectiveDecision = decision === PolicyDecision.ALLOW ? 'allow' : 'deny';
|
|
78
|
+
// Emit policy decision for observability
|
|
79
|
+
this.emitMessage({
|
|
80
|
+
type: MessageBusType.HOOK_POLICY_DECISION,
|
|
81
|
+
eventName: hookRequest.eventName,
|
|
82
|
+
hookSource: getHookSource(hookRequest.input),
|
|
83
|
+
decision: effectiveDecision,
|
|
84
|
+
reason: decision !== PolicyDecision.ALLOW
|
|
85
|
+
? 'Hook execution denied by policy'
|
|
86
|
+
: undefined,
|
|
87
|
+
});
|
|
88
|
+
// If allowed, emit the request for hook system to handle
|
|
89
|
+
if (decision === PolicyDecision.ALLOW) {
|
|
90
|
+
this.emitMessage(message);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// If denied or ASK_USER, emit error response (hooks don't support interactive confirmation)
|
|
94
|
+
this.emitMessage({
|
|
95
|
+
type: MessageBusType.HOOK_EXECUTION_RESPONSE,
|
|
96
|
+
correlationId: hookRequest.correlationId,
|
|
97
|
+
success: false,
|
|
98
|
+
error: new Error('Hook execution denied by policy'),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
71
102
|
else {
|
|
72
103
|
// For all other message types, just emit them
|
|
73
104
|
this.emitMessage(message);
|
|
@@ -83,5 +114,35 @@ export class MessageBus extends EventEmitter {
|
|
|
83
114
|
unsubscribe(type, listener) {
|
|
84
115
|
this.off(type, listener);
|
|
85
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Request-response pattern: Publish a message and wait for a correlated response
|
|
119
|
+
* This enables synchronous-style communication over the async MessageBus
|
|
120
|
+
* The correlation ID is generated internally and added to the request
|
|
121
|
+
*/
|
|
122
|
+
async request(request, responseType, timeoutMs = 60000) {
|
|
123
|
+
const correlationId = randomUUID();
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
const timeoutId = setTimeout(() => {
|
|
126
|
+
cleanup();
|
|
127
|
+
reject(new Error(`Request timed out waiting for ${responseType}`));
|
|
128
|
+
}, timeoutMs);
|
|
129
|
+
const cleanup = () => {
|
|
130
|
+
clearTimeout(timeoutId);
|
|
131
|
+
this.unsubscribe(responseType, responseHandler);
|
|
132
|
+
};
|
|
133
|
+
const responseHandler = (response) => {
|
|
134
|
+
// Check if this response matches our request
|
|
135
|
+
if ('correlationId' in response &&
|
|
136
|
+
response.correlationId === correlationId) {
|
|
137
|
+
cleanup();
|
|
138
|
+
resolve(response);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
// Subscribe to responses
|
|
142
|
+
this.subscribe(responseType, responseHandler);
|
|
143
|
+
// Publish the request with correlation ID
|
|
144
|
+
this.publish({ ...request, correlationId });
|
|
145
|
+
});
|
|
146
|
+
}
|
|
86
147
|
}
|
|
87
148
|
//# sourceMappingURL=message-bus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-bus.js","sourceRoot":"","sources":["../../../src/confirmation-bus/message-bus.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"message-bus.js","sourceRoot":"","sources":["../../../src/confirmation-bus/message-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,10 @@ export declare enum MessageBusType {
|
|
|
10
10
|
TOOL_POLICY_REJECTION = "tool-policy-rejection",
|
|
11
11
|
TOOL_EXECUTION_SUCCESS = "tool-execution-success",
|
|
12
12
|
TOOL_EXECUTION_FAILURE = "tool-execution-failure",
|
|
13
|
-
UPDATE_POLICY = "update-policy"
|
|
13
|
+
UPDATE_POLICY = "update-policy",
|
|
14
|
+
HOOK_EXECUTION_REQUEST = "hook-execution-request",
|
|
15
|
+
HOOK_EXECUTION_RESPONSE = "hook-execution-response",
|
|
16
|
+
HOOK_POLICY_DECISION = "hook-policy-decision"
|
|
14
17
|
}
|
|
15
18
|
export interface ToolConfirmationRequest {
|
|
16
19
|
type: MessageBusType.TOOL_CONFIRMATION_REQUEST;
|
|
@@ -46,4 +49,24 @@ export interface ToolExecutionFailure<E = Error> {
|
|
|
46
49
|
toolCall: FunctionCall;
|
|
47
50
|
error: E;
|
|
48
51
|
}
|
|
49
|
-
export
|
|
52
|
+
export interface HookExecutionRequest {
|
|
53
|
+
type: MessageBusType.HOOK_EXECUTION_REQUEST;
|
|
54
|
+
eventName: string;
|
|
55
|
+
input: Record<string, unknown>;
|
|
56
|
+
correlationId: string;
|
|
57
|
+
}
|
|
58
|
+
export interface HookExecutionResponse {
|
|
59
|
+
type: MessageBusType.HOOK_EXECUTION_RESPONSE;
|
|
60
|
+
correlationId: string;
|
|
61
|
+
success: boolean;
|
|
62
|
+
output?: Record<string, unknown>;
|
|
63
|
+
error?: Error;
|
|
64
|
+
}
|
|
65
|
+
export interface HookPolicyDecision {
|
|
66
|
+
type: MessageBusType.HOOK_POLICY_DECISION;
|
|
67
|
+
eventName: string;
|
|
68
|
+
hookSource: 'project' | 'user' | 'system' | 'extension';
|
|
69
|
+
decision: 'allow' | 'deny';
|
|
70
|
+
reason?: string;
|
|
71
|
+
}
|
|
72
|
+
export type Message = ToolConfirmationRequest | ToolConfirmationResponse | ToolPolicyRejection | ToolExecutionSuccess | ToolExecutionFailure | UpdatePolicy | HookExecutionRequest | HookExecutionResponse | HookPolicyDecision;
|
|
@@ -12,5 +12,8 @@ export var MessageBusType;
|
|
|
12
12
|
MessageBusType["TOOL_EXECUTION_SUCCESS"] = "tool-execution-success";
|
|
13
13
|
MessageBusType["TOOL_EXECUTION_FAILURE"] = "tool-execution-failure";
|
|
14
14
|
MessageBusType["UPDATE_POLICY"] = "update-policy";
|
|
15
|
+
MessageBusType["HOOK_EXECUTION_REQUEST"] = "hook-execution-request";
|
|
16
|
+
MessageBusType["HOOK_EXECUTION_RESPONSE"] = "hook-execution-response";
|
|
17
|
+
MessageBusType["HOOK_POLICY_DECISION"] = "hook-policy-decision";
|
|
15
18
|
})(MessageBusType || (MessageBusType = {}));
|
|
16
19
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/confirmation-bus/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAqB,MAAM,eAAe,CAAC;AAElD,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/confirmation-bus/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAqB,MAAM,eAAe,CAAC;AAElD,MAAM,CAAN,IAAY,cAUX;AAVD,WAAY,cAAc;IACxB,yEAAuD,CAAA;IACvD,2EAAyD,CAAA;IACzD,iEAA+C,CAAA;IAC/C,mEAAiD,CAAA;IACjD,mEAAiD,CAAA;IACjD,iDAA+B,CAAA;IAC/B,mEAAiD,CAAA;IACjD,qEAAmD,CAAA;IACnD,+DAA6C,CAAA;AAC/C,CAAC,EAVW,cAAc,KAAd,cAAc,QAUzB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { type CountTokensResponse, type EmbedContentResponse, type GenerateContentResponse, type GenerateContentParameters, type CountTokensParameters, type EmbedContentParameters } from '@google/genai';
|
|
7
|
+
import type { ContentGenerator } from './contentGenerator.js';
|
|
8
|
+
import type { Config } from '../config/config.js';
|
|
9
|
+
import type { UserTierId } from '../code_assist/types.js';
|
|
10
|
+
export declare class AuthenticatedContentGenerator implements ContentGenerator {
|
|
11
|
+
private generator;
|
|
12
|
+
private config;
|
|
13
|
+
constructor(generator: ContentGenerator, config: Config);
|
|
14
|
+
generateContent(request: GenerateContentParameters, userPromptId: string): Promise<GenerateContentResponse>;
|
|
15
|
+
generateContentStream(request: GenerateContentParameters, userPromptId: string): Promise<AsyncGenerator<GenerateContentResponse>>;
|
|
16
|
+
countTokens(request: CountTokensParameters): Promise<CountTokensResponse>;
|
|
17
|
+
embedContent(request: EmbedContentParameters): Promise<EmbedContentResponse>;
|
|
18
|
+
private refreshToken;
|
|
19
|
+
get userTier(): UserTierId | undefined;
|
|
20
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { GoogleGenAI, } from '@google/genai';
|
|
7
|
+
import { AuthProviderKeycloak } from '@machina.ai/auth-keycloak';
|
|
8
|
+
import { LoggingContentGenerator } from './loggingContentGenerator.js';
|
|
9
|
+
function isAuthError(e) {
|
|
10
|
+
// Case 1: The error itself is an object with a `code` property (like GaxiosError)
|
|
11
|
+
if (e && typeof e === 'object' && 'code' in e) {
|
|
12
|
+
const error = e;
|
|
13
|
+
if (error.code === 401 || error.code === '401') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Case 2: The error is an `Error` instance with a JSON message.
|
|
18
|
+
if (e instanceof Error) {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(e.message);
|
|
21
|
+
const error = parsed.error || parsed;
|
|
22
|
+
if (error.code === 401 || error.status === 'UNAUTHENTICATED') {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Not a JSON message, fall back to simple string check
|
|
28
|
+
return e.message.includes('401');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
export class AuthenticatedContentGenerator {
|
|
34
|
+
generator;
|
|
35
|
+
config;
|
|
36
|
+
constructor(generator, config) {
|
|
37
|
+
this.generator = generator;
|
|
38
|
+
this.config = config;
|
|
39
|
+
}
|
|
40
|
+
async generateContent(request, userPromptId) {
|
|
41
|
+
try {
|
|
42
|
+
return await this.generator.generateContent(request, userPromptId);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
if (isAuthError(e)) {
|
|
46
|
+
await this.refreshToken();
|
|
47
|
+
return await this.generator.generateContent(request, userPromptId);
|
|
48
|
+
}
|
|
49
|
+
throw e;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async generateContentStream(request, userPromptId) {
|
|
53
|
+
try {
|
|
54
|
+
return await this.generator.generateContentStream(request, userPromptId);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
if (isAuthError(e)) {
|
|
58
|
+
await this.refreshToken();
|
|
59
|
+
return await this.generator.generateContentStream(request, userPromptId);
|
|
60
|
+
}
|
|
61
|
+
throw e;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async countTokens(request) {
|
|
65
|
+
try {
|
|
66
|
+
return await this.generator.countTokens(request);
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
if (isAuthError(e)) {
|
|
70
|
+
await this.refreshToken();
|
|
71
|
+
return await this.generator.countTokens(request);
|
|
72
|
+
}
|
|
73
|
+
throw e;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async embedContent(request) {
|
|
77
|
+
try {
|
|
78
|
+
return await this.generator.embedContent(request);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
if (isAuthError(e)) {
|
|
82
|
+
await this.refreshToken();
|
|
83
|
+
return await this.generator.embedContent(request);
|
|
84
|
+
}
|
|
85
|
+
throw e;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async refreshToken() {
|
|
89
|
+
const provider = new AuthProviderKeycloak();
|
|
90
|
+
// First, try to refresh silently.
|
|
91
|
+
let token = await provider.forceRefreshToken();
|
|
92
|
+
// If silent refresh fails, try the full authentication flow which may be interactive.
|
|
93
|
+
if (!token) {
|
|
94
|
+
token = await provider.getToken();
|
|
95
|
+
}
|
|
96
|
+
// If we still don't have a token, then we must fail.
|
|
97
|
+
if (!token) {
|
|
98
|
+
throw new Error('Authentication failed. Unable to get a new token.');
|
|
99
|
+
}
|
|
100
|
+
// Re-create the underlying generator with the new token to avoid recursive wrapping.
|
|
101
|
+
const httpOptions = {};
|
|
102
|
+
if (token) {
|
|
103
|
+
httpOptions.headers = { Authorization: `Bearer ${token}` };
|
|
104
|
+
}
|
|
105
|
+
const googleGenAI = new GoogleGenAI({
|
|
106
|
+
apiKey: 'dummy',
|
|
107
|
+
httpOptions,
|
|
108
|
+
});
|
|
109
|
+
this.generator = new LoggingContentGenerator(googleGenAI.models, this.config);
|
|
110
|
+
}
|
|
111
|
+
get userTier() {
|
|
112
|
+
return this.generator.userTier;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=AuthenticatedContentGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthenticatedContentGenerator.js","sourceRoot":"","sources":["../../../src/core/AuthenticatedContentGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import type { Content, Part } from '@google/genai';
|
|
6
|
+
import type { Content, Part, GenerateContentResponse } from '@google/genai';
|
|
7
7
|
import type { Config } from '../config/config.js';
|
|
8
8
|
import type { ContentGenerator } from './contentGenerator.js';
|
|
9
9
|
import type { ModelConfigKey } from '../services/modelConfigService.js';
|
|
@@ -33,6 +33,30 @@ export interface GenerateJsonOptions {
|
|
|
33
33
|
*/
|
|
34
34
|
maxAttempts?: number;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for the generateContent utility function.
|
|
38
|
+
*/
|
|
39
|
+
export interface GenerateContentOptions {
|
|
40
|
+
/** The desired model config. */
|
|
41
|
+
modelConfigKey: ModelConfigKey;
|
|
42
|
+
/** The input prompt or history. */
|
|
43
|
+
contents: Content[];
|
|
44
|
+
/**
|
|
45
|
+
* Task-specific system instructions.
|
|
46
|
+
* If omitted, no system instruction is sent.
|
|
47
|
+
*/
|
|
48
|
+
systemInstruction?: string | Part | Part[] | Content;
|
|
49
|
+
/** Signal for cancellation. */
|
|
50
|
+
abortSignal: AbortSignal;
|
|
51
|
+
/**
|
|
52
|
+
* A unique ID for the prompt, used for logging/telemetry correlation.
|
|
53
|
+
*/
|
|
54
|
+
promptId: string;
|
|
55
|
+
/**
|
|
56
|
+
* The maximum number of attempts for the request.
|
|
57
|
+
*/
|
|
58
|
+
maxAttempts?: number;
|
|
59
|
+
}
|
|
36
60
|
/**
|
|
37
61
|
* A client dedicated to stateless, utility-focused LLM calls.
|
|
38
62
|
*/
|
|
@@ -43,4 +67,6 @@ export declare class BaseLlmClient {
|
|
|
43
67
|
generateJson(options: GenerateJsonOptions): Promise<Record<string, unknown>>;
|
|
44
68
|
generateEmbedding(texts: string[]): Promise<number[][]>;
|
|
45
69
|
private cleanJsonResponse;
|
|
70
|
+
generateContent(options: GenerateContentOptions): Promise<GenerateContentResponse>;
|
|
71
|
+
private _generateWithRetry;
|
|
46
72
|
}
|
|
@@ -21,55 +21,35 @@ export class BaseLlmClient {
|
|
|
21
21
|
this.config = config;
|
|
22
22
|
}
|
|
23
23
|
async generateJson(options) {
|
|
24
|
-
const { modelConfigKey, contents,
|
|
24
|
+
const { schema, modelConfigKey, contents, systemInstruction, abortSignal, promptId, maxAttempts, } = options;
|
|
25
25
|
const { model, generateContentConfig } = this.config.modelConfigService.getResolvedConfig(modelConfigKey);
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
responseJsonSchema: schema,
|
|
31
|
-
responseMimeType: 'application/json',
|
|
32
|
-
};
|
|
33
|
-
try {
|
|
34
|
-
const apiCall = () => this.contentGenerator.generateContent({
|
|
35
|
-
model,
|
|
36
|
-
config: requestConfig,
|
|
37
|
-
contents,
|
|
38
|
-
}, promptId);
|
|
39
|
-
const shouldRetryOnContent = (response) => {
|
|
40
|
-
const text = getResponseText(response)?.trim();
|
|
41
|
-
if (!text) {
|
|
42
|
-
return true; // Retry on empty response
|
|
43
|
-
}
|
|
44
|
-
try {
|
|
45
|
-
JSON.parse(this.cleanJsonResponse(text, model));
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
catch (_e) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
const result = await retryWithBackoff(apiCall, {
|
|
53
|
-
shouldRetryOnContent,
|
|
54
|
-
maxAttempts: maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
|
|
55
|
-
});
|
|
56
|
-
// If we are here, the content is valid (not empty and parsable).
|
|
57
|
-
return JSON.parse(this.cleanJsonResponse(getResponseText(result).trim(), model));
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
if (abortSignal.aborted) {
|
|
61
|
-
throw error;
|
|
26
|
+
const shouldRetryOnContent = (response) => {
|
|
27
|
+
const text = getResponseText(response)?.trim();
|
|
28
|
+
if (!text) {
|
|
29
|
+
return true; // Retry on empty response
|
|
62
30
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
31
|
+
try {
|
|
32
|
+
// We don't use the result, just check if it's valid JSON
|
|
33
|
+
JSON.parse(this.cleanJsonResponse(text, model));
|
|
34
|
+
return false; // It's valid, don't retry
|
|
67
35
|
}
|
|
68
|
-
|
|
69
|
-
|
|
36
|
+
catch (_e) {
|
|
37
|
+
return true; // It's not valid, retry
|
|
70
38
|
}
|
|
71
|
-
|
|
72
|
-
|
|
39
|
+
};
|
|
40
|
+
const result = await this._generateWithRetry({
|
|
41
|
+
model,
|
|
42
|
+
contents,
|
|
43
|
+
config: {
|
|
44
|
+
...generateContentConfig,
|
|
45
|
+
...(systemInstruction && { systemInstruction }),
|
|
46
|
+
responseJsonSchema: schema,
|
|
47
|
+
responseMimeType: 'application/json',
|
|
48
|
+
abortSignal,
|
|
49
|
+
},
|
|
50
|
+
}, promptId, maxAttempts, shouldRetryOnContent, 'generateJson');
|
|
51
|
+
// If we are here, the content is valid (not empty and parsable).
|
|
52
|
+
return JSON.parse(this.cleanJsonResponse(getResponseText(result).trim(), model));
|
|
73
53
|
}
|
|
74
54
|
async generateEmbedding(texts) {
|
|
75
55
|
if (!texts || texts.length === 0) {
|
|
@@ -104,5 +84,46 @@ export class BaseLlmClient {
|
|
|
104
84
|
}
|
|
105
85
|
return text;
|
|
106
86
|
}
|
|
87
|
+
async generateContent(options) {
|
|
88
|
+
const { modelConfigKey, contents, systemInstruction, abortSignal, promptId, maxAttempts, } = options;
|
|
89
|
+
const { model, generateContentConfig } = this.config.modelConfigService.getResolvedConfig(modelConfigKey);
|
|
90
|
+
const shouldRetryOnContent = (response) => {
|
|
91
|
+
const text = getResponseText(response)?.trim();
|
|
92
|
+
return !text; // Retry on empty response
|
|
93
|
+
};
|
|
94
|
+
return this._generateWithRetry({
|
|
95
|
+
model,
|
|
96
|
+
contents,
|
|
97
|
+
config: {
|
|
98
|
+
...generateContentConfig,
|
|
99
|
+
...(systemInstruction && { systemInstruction }),
|
|
100
|
+
abortSignal,
|
|
101
|
+
},
|
|
102
|
+
}, promptId, maxAttempts, shouldRetryOnContent, 'generateContent');
|
|
103
|
+
}
|
|
104
|
+
async _generateWithRetry(requestParams, promptId, maxAttempts, shouldRetryOnContent, errorContext) {
|
|
105
|
+
const abortSignal = requestParams.config?.abortSignal;
|
|
106
|
+
try {
|
|
107
|
+
const apiCall = () => this.contentGenerator.generateContent(requestParams, promptId);
|
|
108
|
+
return await retryWithBackoff(apiCall, {
|
|
109
|
+
shouldRetryOnContent,
|
|
110
|
+
maxAttempts: maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (abortSignal?.aborted) {
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
// Check if the error is from exhausting retries, and report accordingly.
|
|
118
|
+
if (error instanceof Error &&
|
|
119
|
+
error.message.includes('Retry attempts exhausted')) {
|
|
120
|
+
await reportError(error, `API returned invalid content after all retries.`, requestParams.contents, `${errorContext}-invalid-content`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
await reportError(error, `Error generating content via API.`, requestParams.contents, `${errorContext}-api`);
|
|
124
|
+
}
|
|
125
|
+
throw new Error(`Failed to generate content: ${getErrorMessage(error)}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
107
128
|
}
|
|
108
129
|
//# sourceMappingURL=baseLlmClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseLlmClient.js","sourceRoot":"","sources":["../../../src/core/baseLlmClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,oBAAoB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"baseLlmClient.js","sourceRoot":"","sources":["../../../src/core/baseLlmClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAsD/B;;GAEG;AACH,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,gBAAkC,EAClC,MAAc;QADd,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAC,YAAY,CAChB,OAA4B;QAE5B,MAAM,EACJ,MAAM,EACN,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,WAAW,GACZ,GAAG,OAAO,CAAC;QAEZ,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GACpC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAEnE,MAAM,oBAAoB,GAAG,CAAC,QAAiC,EAAE,EAAE;YACjE,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC,CAAC,0BAA0B;YACzC,CAAC;YACD,IAAI,CAAC;gBACH,yDAAyD;gBACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBAChD,OAAO,KAAK,CAAC,CAAC,0BAA0B;YAC1C,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,CAAC,wBAAwB;YACvC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC1C;YACE,KAAK;YACL,QAAQ;YACR,MAAM,EAAE;gBACN,GAAG,qBAAqB;gBACxB,GAAG,CAAC,iBAAiB,IAAI,EAAE,iBAAiB,EAAE,CAAC;gBAC/C,kBAAkB,EAAE,MAAM;gBAC1B,gBAAgB,EAAE,kBAAkB;gBACpC,WAAW;aACZ;SACF,EACD,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,cAAc,CACf,CAAC;QAEF,iEAAiE;QACjE,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAE,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAe;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,gBAAgB,GAA2B;YAC/C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;YACtC,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,oBAAoB,GACxB,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC7D,IACE,CAAC,oBAAoB,CAAC,UAAU;YAChC,oBAAoB,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAC5C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,oBAAoB,CAAC,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CACb,4DAA4D,KAAK,CAAC,MAAM,SAAS,oBAAoB,CAAC,UAAU,CAAC,MAAM,GAAG,CAC3H,CAAC;QACJ,CAAC;QAED,OAAO,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;YAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,2DAA2D,KAAK,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CACtF,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,IAAY,EAAE,KAAa;QACnD,MAAM,MAAM,GAAG,SAAS,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,wBAAwB,CACtB,IAAI,CAAC,MAAM,EACX,IAAI,0BAA0B,CAAC,KAAK,CAAC,CACtC,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,OAA+B;QAE/B,MAAM,EACJ,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,WAAW,GACZ,GAAG,OAAO,CAAC;QAEZ,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GACpC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAEnE,MAAM,oBAAoB,GAAG,CAAC,QAAiC,EAAE,EAAE;YACjE,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,0BAA0B;QAC1C,CAAC,CAAC;QAEF,OAAO,IAAI,CAAC,kBAAkB,CAC5B;YACE,KAAK;YACL,QAAQ;YACR,MAAM,EAAE;gBACN,GAAG,qBAAqB;gBACxB,GAAG,CAAC,iBAAiB,IAAI,EAAE,iBAAiB,EAAE,CAAC;gBAC/C,WAAW;aACZ;SACF,EACD,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,iBAAiB,CAClB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,aAAwC,EACxC,QAAgB,EAChB,WAA+B,EAC/B,oBAAoE,EACpE,YAAgD;QAEhD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YAEjE,OAAO,MAAM,gBAAgB,CAAC,OAAO,EAAE;gBACrC,oBAAoB;gBACpB,WAAW,EAAE,WAAW,IAAI,oBAAoB;aACjD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC;YACd,CAAC;YAED,yEAAyE;YACzE,IACE,KAAK,YAAY,KAAK;gBACtB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAClD,CAAC;gBACD,MAAM,WAAW,CACf,KAAK,EACL,iDAAiD,EACjD,aAAa,CAAC,QAAqB,EACnC,GAAG,YAAY,kBAAkB,CAClC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,CACf,KAAK,EACL,mCAAmC,EACnC,aAAa,CAAC,QAAqB,EACnC,GAAG,YAAY,MAAM,CACtB,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;CACF"}
|