@copilotkitnext/angular 0.0.1 → 0.0.4
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/README.md +248 -0
- package/dist/README.md +248 -0
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +430 -0
- package/dist/esm2022/core/copilotkit.types.mjs +12 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/styles.css +0 -27
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -39
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/README-agent-context.md +0 -310
- package/ng-package.json +0 -19
- package/slots.md +0 -331
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Directive, Input, Output, EventEmitter, ElementRef, inject } from '@angular/core';
|
|
2
|
+
import { ScrollPositionService } from '../services/scroll-position.service';
|
|
3
|
+
import { ResizeObserverService } from '../services/resize-observer.service';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs/operators';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* Directive for implementing stick-to-bottom scroll behavior
|
|
9
|
+
* Similar to the React use-stick-to-bottom library
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```html
|
|
13
|
+
* <div copilotStickToBottom
|
|
14
|
+
* [enabled]="true"
|
|
15
|
+
* [threshold]="10"
|
|
16
|
+
* [initialBehavior]="'smooth'"
|
|
17
|
+
* [resizeBehavior]="'smooth'"
|
|
18
|
+
* (isAtBottomChange)="onBottomChange($event)">
|
|
19
|
+
* <!-- Content -->
|
|
20
|
+
* </div>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class StickToBottomDirective {
|
|
24
|
+
enabled = true;
|
|
25
|
+
threshold = 10;
|
|
26
|
+
initialBehavior = 'smooth';
|
|
27
|
+
resizeBehavior = 'smooth';
|
|
28
|
+
debounceMs = 100;
|
|
29
|
+
isAtBottomChange = new EventEmitter();
|
|
30
|
+
scrollToBottomRequested = new EventEmitter();
|
|
31
|
+
elementRef = inject(ElementRef);
|
|
32
|
+
scrollService = inject(ScrollPositionService);
|
|
33
|
+
resizeService = inject(ResizeObserverService);
|
|
34
|
+
destroy$ = new Subject();
|
|
35
|
+
contentElement;
|
|
36
|
+
wasAtBottom = true;
|
|
37
|
+
hasInitialized = false;
|
|
38
|
+
userHasScrolled = false;
|
|
39
|
+
ngOnInit() {
|
|
40
|
+
// Setup will happen in ngAfterViewInit
|
|
41
|
+
}
|
|
42
|
+
ngAfterViewInit() {
|
|
43
|
+
const element = this.elementRef.nativeElement;
|
|
44
|
+
// Find or create content wrapper
|
|
45
|
+
this.contentElement = element.querySelector('[data-stick-to-bottom-content]');
|
|
46
|
+
if (!this.contentElement) {
|
|
47
|
+
this.contentElement = element;
|
|
48
|
+
}
|
|
49
|
+
this.setupScrollMonitoring();
|
|
50
|
+
this.setupResizeMonitoring();
|
|
51
|
+
this.setupContentMutationObserver();
|
|
52
|
+
// Initial scroll to bottom if enabled
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
this.hasInitialized = true;
|
|
55
|
+
if (this.enabled) {
|
|
56
|
+
this.scrollToBottom(this.initialBehavior);
|
|
57
|
+
}
|
|
58
|
+
}, 0);
|
|
59
|
+
}
|
|
60
|
+
setupScrollMonitoring() {
|
|
61
|
+
if (!this.enabled)
|
|
62
|
+
return;
|
|
63
|
+
const element = this.elementRef.nativeElement;
|
|
64
|
+
// Monitor scroll position
|
|
65
|
+
this.scrollService.monitorScrollPosition(element, this.threshold)
|
|
66
|
+
.pipe(takeUntil(this.destroy$), debounceTime(this.debounceMs), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom))
|
|
67
|
+
.subscribe(state => {
|
|
68
|
+
const wasAtBottom = this.wasAtBottom;
|
|
69
|
+
this.wasAtBottom = state.isAtBottom;
|
|
70
|
+
// Detect user scroll
|
|
71
|
+
if (!state.isAtBottom && wasAtBottom && this.hasInitialized) {
|
|
72
|
+
this.userHasScrolled = true;
|
|
73
|
+
}
|
|
74
|
+
else if (state.isAtBottom) {
|
|
75
|
+
this.userHasScrolled = false;
|
|
76
|
+
}
|
|
77
|
+
// Emit change
|
|
78
|
+
this.isAtBottomChange.emit(state.isAtBottom);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
setupResizeMonitoring() {
|
|
82
|
+
if (!this.enabled || !this.contentElement)
|
|
83
|
+
return;
|
|
84
|
+
// Monitor content resize
|
|
85
|
+
this.resizeService.observeElement(this.contentElement, 0, 250)
|
|
86
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.enabled && !this.userHasScrolled))
|
|
87
|
+
.subscribe(state => {
|
|
88
|
+
// Auto-scroll on resize if we were at bottom
|
|
89
|
+
if (this.wasAtBottom && !state.isResizing) {
|
|
90
|
+
this.scrollToBottom(this.resizeBehavior);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// Monitor container resize
|
|
94
|
+
const element = this.elementRef.nativeElement;
|
|
95
|
+
this.resizeService.observeElement(element, 0, 250)
|
|
96
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.enabled && !this.userHasScrolled && this.wasAtBottom))
|
|
97
|
+
.subscribe(() => {
|
|
98
|
+
// Adjust scroll on container resize
|
|
99
|
+
this.scrollToBottom(this.resizeBehavior);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
setupContentMutationObserver() {
|
|
103
|
+
if (!this.enabled || !this.contentElement)
|
|
104
|
+
return;
|
|
105
|
+
const mutationObserver = new MutationObserver(() => {
|
|
106
|
+
if (this.enabled && this.wasAtBottom && !this.userHasScrolled) {
|
|
107
|
+
// Content changed, scroll to bottom if we were there
|
|
108
|
+
requestAnimationFrame(() => {
|
|
109
|
+
this.scrollToBottom(this.resizeBehavior);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
mutationObserver.observe(this.contentElement, {
|
|
114
|
+
childList: true,
|
|
115
|
+
subtree: true,
|
|
116
|
+
characterData: true
|
|
117
|
+
});
|
|
118
|
+
// Cleanup on destroy
|
|
119
|
+
this.destroy$.subscribe(() => {
|
|
120
|
+
mutationObserver.disconnect();
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Public method to scroll to bottom
|
|
125
|
+
* Can be called from parent component
|
|
126
|
+
*/
|
|
127
|
+
scrollToBottom(behavior = 'smooth') {
|
|
128
|
+
const element = this.elementRef.nativeElement;
|
|
129
|
+
const smooth = behavior === 'smooth';
|
|
130
|
+
this.scrollService.scrollToBottom(element, smooth);
|
|
131
|
+
this.userHasScrolled = false;
|
|
132
|
+
this.scrollToBottomRequested.emit();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if currently at bottom
|
|
136
|
+
*/
|
|
137
|
+
isAtBottom() {
|
|
138
|
+
return this.scrollService.isAtBottom(this.elementRef.nativeElement, this.threshold);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get current scroll state
|
|
142
|
+
*/
|
|
143
|
+
getScrollState() {
|
|
144
|
+
const element = this.elementRef.nativeElement;
|
|
145
|
+
return {
|
|
146
|
+
scrollTop: element.scrollTop,
|
|
147
|
+
scrollHeight: element.scrollHeight,
|
|
148
|
+
clientHeight: element.clientHeight,
|
|
149
|
+
isAtBottom: this.isAtBottom()
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
ngOnDestroy() {
|
|
153
|
+
this.destroy$.next();
|
|
154
|
+
this.destroy$.complete();
|
|
155
|
+
}
|
|
156
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottomDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
157
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: StickToBottomDirective, isStandalone: true, selector: "[copilotStickToBottom]", inputs: { enabled: "enabled", threshold: "threshold", initialBehavior: "initialBehavior", resizeBehavior: "resizeBehavior", debounceMs: "debounceMs" }, outputs: { isAtBottomChange: "isAtBottomChange", scrollToBottomRequested: "scrollToBottomRequested" }, providers: [ScrollPositionService, ResizeObserverService], ngImport: i0 });
|
|
158
|
+
}
|
|
159
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottomDirective, decorators: [{
|
|
160
|
+
type: Directive,
|
|
161
|
+
args: [{
|
|
162
|
+
selector: '[copilotStickToBottom]',
|
|
163
|
+
standalone: true,
|
|
164
|
+
providers: [ScrollPositionService, ResizeObserverService]
|
|
165
|
+
}]
|
|
166
|
+
}], propDecorators: { enabled: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], threshold: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], initialBehavior: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], resizeBehavior: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], debounceMs: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], isAtBottomChange: [{
|
|
177
|
+
type: Output
|
|
178
|
+
}], scrollToBottomRequested: [{
|
|
179
|
+
type: Output
|
|
180
|
+
}] } });
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2stdG8tYm90dG9tLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kaXJlY3RpdmVzL3N0aWNrLXRvLWJvdHRvbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBSVYsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxPQUFPLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUl2Rjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFDeEIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixlQUFlLEdBQW1CLFFBQVEsQ0FBQztJQUMzQyxjQUFjLEdBQW1CLFFBQVEsQ0FBQztJQUMxQyxVQUFVLEdBQVcsR0FBRyxDQUFDO0lBRXhCLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDL0MsdUJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVyRCxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM5QyxhQUFhLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFOUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsY0FBYyxDQUFlO0lBQzdCLFdBQVcs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RUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FuS1Usc0JBQXNCOzRGQUF0QixzQkFBc0Isb1VBRnRCLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUM7OzRGQUU5QyxzQkFBc0I7a0JBTGxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFNBQVMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO2lCQUMxRDs4QkFFVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY3JvbGxQb3NpdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zY3JvbGwtcG9zaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXNpemUtb2JzZXJ2ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCB0eXBlIFNjcm9sbEJlaGF2aW9yID0gJ3Ntb290aCcgfCAnaW5zdGFudCcgfCAnYXV0byc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBpbXBsZW1lbnRpbmcgc3RpY2stdG8tYm90dG9tIHNjcm9sbCBiZWhhdmlvclxuICogU2ltaWxhciB0byB0aGUgUmVhY3QgdXNlLXN0aWNrLXRvLWJvdHRvbSBsaWJyYXJ5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGNvcGlsb3RTdGlja1RvQm90dG9tXG4gKiAgICAgIFtlbmFibGVkXT1cInRydWVcIlxuICogICAgICBbdGhyZXNob2xkXT1cIjEwXCJcbiAqICAgICAgW2luaXRpYWxCZWhhdmlvcl09XCInc21vb3RoJ1wiXG4gKiAgICAgIFtyZXNpemVCZWhhdmlvcl09XCInc21vb3RoJ1wiXG4gKiAgICAgIChpc0F0Qm90dG9tQ2hhbmdlKT1cIm9uQm90dG9tQ2hhbmdlKCRldmVudClcIj5cbiAqICAgPCEtLSBDb250ZW50IC0tPlxuICogPC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NvcGlsb3RTdGlja1RvQm90dG9tXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1Njcm9sbFBvc2l0aW9uU2VydmljZSwgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBTdGlja1RvQm90dG9tRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBlbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgdGhyZXNob2xkOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgaW5pdGlhbEJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnO1xuICBASW5wdXQoKSByZXNpemVCZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSAnc21vb3RoJztcbiAgQElucHV0KCkgZGVib3VuY2VNczogbnVtYmVyID0gMTAwO1xuICBcbiAgQE91dHB1dCgpIGlzQXRCb3R0b21DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBzY3JvbGxUb0JvdHRvbVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHByaXZhdGUgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlID0gaW5qZWN0KFNjcm9sbFBvc2l0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVzaXplU2VydmljZSA9IGluamVjdChSZXNpemVPYnNlcnZlclNlcnZpY2UpO1xuICBcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgY29udGVudEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSB3YXNBdEJvdHRvbSA9IHRydWU7XG4gIHByaXZhdGUgaGFzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB1c2VySGFzU2Nyb2xsZWQgPSBmYWxzZTtcbiAgXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHdpbGwgaGFwcGVuIGluIG5nQWZ0ZXJWaWV3SW5pdFxuICB9XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIFxuICAgIC8vIEZpbmQgb3IgY3JlYXRlIGNvbnRlbnQgd3JhcHBlclxuICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXN0aWNrLXRvLWJvdHRvbS1jb250ZW50XScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghdGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5jb250ZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2V0dXBTY3JvbGxNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZU1vbml0b3JpbmcoKTtcbiAgICB0aGlzLnNldHVwQ29udGVudE11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsIHNjcm9sbCB0byBib3R0b20gaWYgZW5hYmxlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oYXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5pbml0aWFsQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG4gIFxuICBwcml2YXRlIHNldHVwU2Nyb2xsTW9uaXRvcmluZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBcbiAgICAvLyBNb25pdG9yIHNjcm9sbCBwb3NpdGlvblxuICAgIHRoaXMuc2Nyb2xsU2VydmljZS5tb25pdG9yU2Nyb2xsUG9zaXRpb24oZWxlbWVudCwgdGhpcy50aHJlc2hvbGQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZU1zKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEuaXNBdEJvdHRvbSA9PT0gYi5pc0F0Qm90dG9tKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IHdhc0F0Qm90dG9tID0gdGhpcy53YXNBdEJvdHRvbTtcbiAgICAgICAgdGhpcy53YXNBdEJvdHRvbSA9IHN0YXRlLmlzQXRCb3R0b207XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlY3QgdXNlciBzY3JvbGxcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0F0Qm90dG9tICYmIHdhc0F0Qm90dG9tICYmIHRoaXMuaGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaXNBdEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMudXNlckhhc1Njcm9sbGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgY2hhbmdlXG4gICAgICAgIHRoaXMuaXNBdEJvdHRvbUNoYW5nZS5lbWl0KHN0YXRlLmlzQXRCb3R0b20pO1xuICAgICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2V0dXBSZXNpemVNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgXG4gICAgLy8gTW9uaXRvciBjb250ZW50IHJlc2l6ZVxuICAgIHRoaXMucmVzaXplU2VydmljZS5vYnNlcnZlRWxlbWVudCh0aGlzLmNvbnRlbnRFbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkICYmICF0aGlzLnVzZXJIYXNTY3JvbGxlZClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICAvLyBBdXRvLXNjcm9sbCBvbiByZXNpemUgaWYgd2Ugd2VyZSBhdCBib3R0b21cbiAgICAgICAgaWYgKHRoaXMud2FzQXRCb3R0b20gJiYgIXN0YXRlLmlzUmVzaXppbmcpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBcbiAgICAvLyBNb25pdG9yIGNvbnRhaW5lciByZXNpemVcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZXNpemVTZXJ2aWNlLm9ic2VydmVFbGVtZW50KGVsZW1lbnQsIDAsIDI1MClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkICYmIHRoaXMud2FzQXRCb3R0b20pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQWRqdXN0IHNjcm9sbCBvbiBjb250YWluZXIgcmVzaXplXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5yZXNpemVCZWhhdmlvcik7XG4gICAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzZXR1cENvbnRlbnRNdXRhdGlvbk9ic2VydmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgdGhpcy53YXNBdEJvdHRvbSAmJiAhdGhpcy51c2VySGFzU2Nyb2xsZWQpIHtcbiAgICAgICAgLy8gQ29udGVudCBjaGFuZ2VkLCBzY3JvbGwgdG8gYm90dG9tIGlmIHdlIHdlcmUgdGhlcmVcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5jb250ZW50RWxlbWVudCwge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICB0aGlzLmRlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gc2Nyb2xsIHRvIGJvdHRvbVxuICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gcGFyZW50IGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHNtb290aCA9IGJlaGF2aW9yID09PSAnc21vb3RoJztcbiAgICBcbiAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9Cb3R0b20oZWxlbWVudCwgc21vb3RoKTtcbiAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21SZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudGx5IGF0IGJvdHRvbVxuICAgKi9cbiAgcHVibGljIGlzQXRCb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsU2VydmljZS5pc0F0Qm90dG9tKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnRocmVzaG9sZCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBzY3JvbGwgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTY3JvbGxTdGF0ZSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3AsXG4gICAgICBzY3JvbGxIZWlnaHQ6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgY2xpZW50SGVpZ2h0OiBlbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgIGlzQXRCb3R0b206IHRoaXMuaXNBdEJvdHRvbSgpXG4gICAgfTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59Il19
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export * from "./core/copilotkit.service";
|
|
2
|
+
export * from "./core/copilotkit.types";
|
|
3
|
+
export * from "./core/copilotkit.providers";
|
|
4
|
+
export * from "./core/chat-configuration/chat-configuration.types";
|
|
5
|
+
export * from "./core/chat-configuration/chat-configuration.service";
|
|
6
|
+
export * from "./core/chat-configuration/chat-configuration.providers";
|
|
7
|
+
export * from "./utils/copilotkit.utils";
|
|
8
|
+
export * from "./utils/agent-context.utils";
|
|
9
|
+
export * from "./utils/frontend-tool.utils";
|
|
10
|
+
// Note: tool-render.utils removed in favor of direct ToolCallRender<T> usage
|
|
11
|
+
// Export all except AgentWatchResult which is already exported from copilotkit.types
|
|
12
|
+
export { watchAgent, getAgent, subscribeToAgent, registerAgentWatcher, } from "./utils/agent.utils";
|
|
13
|
+
export * from "./utils/human-in-the-loop.utils";
|
|
14
|
+
export * from "./utils/chat-config.utils";
|
|
15
|
+
// Slot utilities are internal only, not exported
|
|
16
|
+
// export * from "./lib/slots/slot.types";
|
|
17
|
+
// export * from "./lib/slots/slot.utils";
|
|
18
|
+
// export { CopilotSlotComponent } from "./lib/slots/copilot-slot.component";
|
|
19
|
+
export { CopilotTooltipDirective } from "./lib/directives/tooltip.directive";
|
|
20
|
+
export { CopilotKitConfigDirective } from "./directives/copilotkit-config.directive";
|
|
21
|
+
export { CopilotKitAgentContextDirective } from "./directives/copilotkit-agent-context.directive";
|
|
22
|
+
export { CopilotKitFrontendToolDirective } from "./directives/copilotkit-frontend-tool.directive";
|
|
23
|
+
export { CopilotKitAgentDirective } from "./directives/copilotkit-agent.directive";
|
|
24
|
+
export { CopilotKitHumanInTheLoopDirective, CopilotKitHumanInTheLoopRespondDirective, } from "./directives/copilotkit-human-in-the-loop.directive";
|
|
25
|
+
export { CopilotKitChatConfigDirective } from "./directives/copilotkit-chat-config.directive";
|
|
26
|
+
export { CopilotKitToolRenderComponent } from "./components/copilotkit-tool-render.component";
|
|
27
|
+
// Chat Input Components
|
|
28
|
+
export * from "./components/chat/copilot-chat-input.types";
|
|
29
|
+
export { CopilotChatInputComponent } from "./components/chat/copilot-chat-input.component";
|
|
30
|
+
export { CopilotChatInputDefaults } from "./components/chat/copilot-chat-input-defaults";
|
|
31
|
+
export { CopilotChatTextareaComponent } from "./components/chat/copilot-chat-textarea.component";
|
|
32
|
+
export { CopilotChatAudioRecorderComponent } from "./components/chat/copilot-chat-audio-recorder.component";
|
|
33
|
+
export { CopilotChatSendButtonComponent, CopilotChatToolbarButtonComponent, CopilotChatStartTranscribeButtonComponent, CopilotChatCancelTranscribeButtonComponent, CopilotChatFinishTranscribeButtonComponent, CopilotChatAddFileButtonComponent, } from "./components/chat/copilot-chat-buttons.component";
|
|
34
|
+
export { CopilotChatToolbarComponent } from "./components/chat/copilot-chat-toolbar.component";
|
|
35
|
+
export { CopilotChatToolsMenuComponent } from "./components/chat/copilot-chat-tools-menu.component";
|
|
36
|
+
// Chat User Message Components
|
|
37
|
+
export * from "./components/chat/copilot-chat-user-message.types";
|
|
38
|
+
export { CopilotChatUserMessageComponent } from "./components/chat/copilot-chat-user-message.component";
|
|
39
|
+
export { CopilotChatUserMessageRendererComponent } from "./components/chat/copilot-chat-user-message-renderer.component";
|
|
40
|
+
export { CopilotChatUserMessageToolbarButtonComponent, CopilotChatUserMessageCopyButtonComponent, CopilotChatUserMessageEditButtonComponent, } from "./components/chat/copilot-chat-user-message-buttons.component";
|
|
41
|
+
export { CopilotChatUserMessageToolbarComponent } from "./components/chat/copilot-chat-user-message-toolbar.component";
|
|
42
|
+
export { CopilotChatUserMessageBranchNavigationComponent } from "./components/chat/copilot-chat-user-message-branch-navigation.component";
|
|
43
|
+
// Chat Assistant Message Components
|
|
44
|
+
export * from "./components/chat/copilot-chat-assistant-message.types";
|
|
45
|
+
export { CopilotChatAssistantMessageComponent } from "./components/chat/copilot-chat-assistant-message.component";
|
|
46
|
+
export { CopilotChatAssistantMessageRendererComponent } from "./components/chat/copilot-chat-assistant-message-renderer.component";
|
|
47
|
+
export { CopilotChatAssistantMessageToolbarButtonComponent, CopilotChatAssistantMessageCopyButtonComponent, CopilotChatAssistantMessageThumbsUpButtonComponent, CopilotChatAssistantMessageThumbsDownButtonComponent, CopilotChatAssistantMessageReadAloudButtonComponent, CopilotChatAssistantMessageRegenerateButtonComponent, } from "./components/chat/copilot-chat-assistant-message-buttons.component";
|
|
48
|
+
export { CopilotChatAssistantMessageToolbarComponent } from "./components/chat/copilot-chat-assistant-message-toolbar.component";
|
|
49
|
+
// Chat Message View Components
|
|
50
|
+
export * from "./components/chat/copilot-chat-message-view.types";
|
|
51
|
+
export { CopilotChatMessageViewComponent } from "./components/chat/copilot-chat-message-view.component";
|
|
52
|
+
export { CopilotChatMessageViewCursorComponent } from "./components/chat/copilot-chat-message-view-cursor.component";
|
|
53
|
+
export { CopilotChatToolCallsViewComponent } from "./components/chat/copilot-chat-tool-calls-view.component";
|
|
54
|
+
// Chat View Components
|
|
55
|
+
export * from "./components/chat/copilot-chat-view.types";
|
|
56
|
+
export { CopilotChatViewComponent } from "./components/chat/copilot-chat-view.component";
|
|
57
|
+
export { CopilotChatViewScrollViewComponent } from "./components/chat/copilot-chat-view-scroll-view.component";
|
|
58
|
+
export { CopilotChatViewScrollToBottomButtonComponent } from "./components/chat/copilot-chat-view-scroll-to-bottom-button.component";
|
|
59
|
+
export { CopilotChatViewFeatherComponent } from "./components/chat/copilot-chat-view-feather.component";
|
|
60
|
+
export { CopilotChatViewInputContainerComponent } from "./components/chat/copilot-chat-view-input-container.component";
|
|
61
|
+
export { CopilotChatViewDisclaimerComponent } from "./components/chat/copilot-chat-view-disclaimer.component";
|
|
62
|
+
// Main Chat Component
|
|
63
|
+
export { CopilotChatComponent } from "./components/chat/copilot-chat.component";
|
|
64
|
+
// Services and Directives for Chat View
|
|
65
|
+
export { ScrollPositionService } from "./services/scroll-position.service";
|
|
66
|
+
export { ResizeObserverService } from "./services/resize-observer.service";
|
|
67
|
+
export { StickToBottomDirective } from "./directives/stick-to-bottom.directive";
|
|
68
|
+
// Testing utilities are not exported from the main entry point
|
|
69
|
+
// They should be imported directly from '@copilotkitnext/angular/testing' if needed
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFHNUMsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLHNEQUFzRCxDQUFDO0FBQ3JFLGNBQWMsd0RBQXdELENBQUM7QUFDdkUsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsNkVBQTZFO0FBQzdFLHFGQUFxRjtBQUNyRixPQUFPLEVBQ0wsVUFBVSxFQUNWLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGlEQUFpRDtBQUNqRCwwQ0FBMEM7QUFDMUMsMENBQTBDO0FBQzFDLDZFQUE2RTtBQUM3RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLHdDQUF3QyxHQUN6QyxNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRTlGLHdCQUF3QjtBQUN4QixjQUFjLDRDQUE0QyxDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQzVHLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsaUNBQWlDLEVBQ2pDLHlDQUF5QyxFQUN6QywwQ0FBMEMsRUFDMUMsMENBQTBDLEVBQzFDLGlDQUFpQyxHQUNsQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzFELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRXBHLCtCQUErQjtBQUMvQixjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ3pILE9BQU8sRUFDTCw0Q0FBNEMsRUFDNUMseUNBQXlDLEVBQ3pDLHlDQUF5QyxHQUMxQyxNQUFNLCtEQUErRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3ZILE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBRTFJLG9DQUFvQztBQUNwQyxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ2xILE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQ25JLE9BQU8sRUFDTCxpREFBaUQsRUFDakQsOENBQThDLEVBQzlDLGtEQUFrRCxFQUNsRCxvREFBb0QsRUFDcEQsbURBQW1ELEVBQ25ELG9EQUFvRCxHQUNyRCxNQUFNLG9FQUFvRSxDQUFDO0FBQzVFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBRWpJLCtCQUErQjtBQUMvQixjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3JILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBRTdHLHVCQUF1QjtBQUN2QixjQUFjLDJDQUEyQyxDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQy9HLE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBRTlHLHNCQUFzQjtBQUN0QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVoRix3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFaEYsK0RBQStEO0FBQy9ELG9GQUFvRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlL2NvcGlsb3RraXQudHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY29waWxvdGtpdC5wcm92aWRlcnNcIjtcbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIEBhZy11aS9jb3JlIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBNZXNzYWdlLCBUb29sQ2FsbCwgVG9vbE1lc3NhZ2UgfSBmcm9tIFwiQGFnLXVpL2NvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi50eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS9jaGF0LWNvbmZpZ3VyYXRpb24vY2hhdC1jb25maWd1cmF0aW9uLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi5wcm92aWRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2NvcGlsb3RraXQudXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2FnZW50LWNvbnRleHQudXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2Zyb250ZW5kLXRvb2wudXRpbHNcIjtcbi8vIE5vdGU6IHRvb2wtcmVuZGVyLnV0aWxzIHJlbW92ZWQgaW4gZmF2b3Igb2YgZGlyZWN0IFRvb2xDYWxsUmVuZGVyPFQ+IHVzYWdlXG4vLyBFeHBvcnQgYWxsIGV4Y2VwdCBBZ2VudFdhdGNoUmVzdWx0IHdoaWNoIGlzIGFscmVhZHkgZXhwb3J0ZWQgZnJvbSBjb3BpbG90a2l0LnR5cGVzXG5leHBvcnQge1xuICB3YXRjaEFnZW50LFxuICBnZXRBZ2VudCxcbiAgc3Vic2NyaWJlVG9BZ2VudCxcbiAgcmVnaXN0ZXJBZ2VudFdhdGNoZXIsXG59IGZyb20gXCIuL3V0aWxzL2FnZW50LnV0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9odW1hbi1pbi10aGUtbG9vcC51dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvY2hhdC1jb25maWcudXRpbHNcIjtcbi8vIFNsb3QgdXRpbGl0aWVzIGFyZSBpbnRlcm5hbCBvbmx5LCBub3QgZXhwb3J0ZWRcbi8vIGV4cG9ydCAqIGZyb20gXCIuL2xpYi9zbG90cy9zbG90LnR5cGVzXCI7XG4vLyBleHBvcnQgKiBmcm9tIFwiLi9saWIvc2xvdHMvc2xvdC51dGlsc1wiO1xuLy8gZXhwb3J0IHsgQ29waWxvdFNsb3RDb21wb25lbnQgfSBmcm9tIFwiLi9saWIvc2xvdHMvY29waWxvdC1zbG90LmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tIFwiLi9saWIvZGlyZWN0aXZlcy90b29sdGlwLmRpcmVjdGl2ZVwiO1xuZXhwb3J0IHsgQ29waWxvdEtpdENvbmZpZ0RpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvY29waWxvdGtpdC1jb25maWcuZGlyZWN0aXZlXCI7XG5leHBvcnQgeyBDb3BpbG90S2l0QWdlbnRDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9jb3BpbG90a2l0LWFnZW50LWNvbnRleHQuZGlyZWN0aXZlXCI7XG5leHBvcnQgeyBDb3BpbG90S2l0RnJvbnRlbmRUb29sRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9jb3BpbG90a2l0LWZyb250ZW5kLXRvb2wuZGlyZWN0aXZlXCI7XG5leHBvcnQgeyBDb3BpbG90S2l0QWdlbnREaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2NvcGlsb3RraXQtYWdlbnQuZGlyZWN0aXZlXCI7XG5leHBvcnQge1xuICBDb3BpbG90S2l0SHVtYW5JblRoZUxvb3BEaXJlY3RpdmUsXG4gIENvcGlsb3RLaXRIdW1hbkluVGhlTG9vcFJlc3BvbmREaXJlY3RpdmUsXG59IGZyb20gXCIuL2RpcmVjdGl2ZXMvY29waWxvdGtpdC1odW1hbi1pbi10aGUtbG9vcC5kaXJlY3RpdmVcIjtcbmV4cG9ydCB7IENvcGlsb3RLaXRDaGF0Q29uZmlnRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9jb3BpbG90a2l0LWNoYXQtY29uZmlnLmRpcmVjdGl2ZVwiO1xuZXhwb3J0IHsgQ29waWxvdEtpdFRvb2xSZW5kZXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NvcGlsb3RraXQtdG9vbC1yZW5kZXIuY29tcG9uZW50XCI7XG5cbi8vIENoYXQgSW5wdXQgQ29tcG9uZW50c1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC1pbnB1dC50eXBlc1wiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtaW5wdXQuY29tcG9uZW50XCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdElucHV0RGVmYXVsdHMgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWlucHV0LWRlZmF1bHRzXCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdFRleHRhcmVhQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC10ZXh0YXJlYS5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXVkaW8tcmVjb3JkZXIuY29tcG9uZW50XCI7XG5leHBvcnQge1xuICBDb3BpbG90Q2hhdFNlbmRCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0VG9vbGJhckJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRGaW5pc2hUcmFuc2NyaWJlQnV0dG9uQ29tcG9uZW50LFxuICBDb3BpbG90Q2hhdEFkZEZpbGVCdXR0b25Db21wb25lbnQsXG59IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYnV0dG9ucy5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0VG9vbGJhckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdG9vbGJhci5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0VG9vbHNNZW51Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC10b29scy1tZW51LmNvbXBvbmVudFwiO1xuXG4vLyBDaGF0IFVzZXIgTWVzc2FnZSBDb21wb25lbnRzXG5leHBvcnQgKiBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS50eXBlc1wiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdXNlci1tZXNzYWdlLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZVJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC11c2VyLW1lc3NhZ2UtcmVuZGVyZXIuY29tcG9uZW50XCI7XG5leHBvcnQge1xuICBDb3BpbG90Q2hhdFVzZXJNZXNzYWdlVG9vbGJhckJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRVc2VyTWVzc2FnZUNvcHlCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0VXNlck1lc3NhZ2VFZGl0QnV0dG9uQ29tcG9uZW50LFxufSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS1idXR0b25zLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZVRvb2xiYXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS10b29sYmFyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZUJyYW5jaE5hdmlnYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS1icmFuY2gtbmF2aWdhdGlvbi5jb21wb25lbnRcIjtcblxuLy8gQ2hhdCBBc3Npc3RhbnQgTWVzc2FnZSBDb21wb25lbnRzXG5leHBvcnQgKiBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLnR5cGVzXCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdEFzc2lzdGFudE1lc3NhZ2VDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHtcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVG9vbGJhckJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlQ29weUJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXBCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd25CdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZEJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZUJ1dHRvbkNvbXBvbmVudCxcbn0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1idXR0b25zLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVG9vbGJhckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtdG9vbGJhci5jb21wb25lbnRcIjtcblxuLy8gQ2hhdCBNZXNzYWdlIFZpZXcgQ29tcG9uZW50c1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC1tZXNzYWdlLXZpZXcudHlwZXNcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0TWVzc2FnZVZpZXdDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LW1lc3NhZ2Utdmlldy5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0TWVzc2FnZVZpZXdDdXJzb3JDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LW1lc3NhZ2Utdmlldy1jdXJzb3IuY29tcG9uZW50XCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdFRvb2xDYWxsc1ZpZXdDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXRvb2wtY2FsbHMtdmlldy5jb21wb25lbnRcIjtcblxuLy8gQ2hhdCBWaWV3IENvbXBvbmVudHNcbmV4cG9ydCAqIGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy50eXBlc1wiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC12aWV3LmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlld0NvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdmlldy5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0Vmlld1Njcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC10by1ib3R0b20tYnV0dG9uLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3RmVhdGhlckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1mZWF0aGVyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3SW5wdXRDb250YWluZXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXZpZXctaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3RGlzY2xhaW1lckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1kaXNjbGFpbWVyLmNvbXBvbmVudFwiO1xuXG4vLyBNYWluIENoYXQgQ29tcG9uZW50XG5leHBvcnQgeyBDb3BpbG90Q2hhdENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQuY29tcG9uZW50XCI7XG5cbi8vIFNlcnZpY2VzIGFuZCBEaXJlY3RpdmVzIGZvciBDaGF0IFZpZXdcbmV4cG9ydCB7IFNjcm9sbFBvc2l0aW9uU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL3Njcm9sbC1wb3NpdGlvbi5zZXJ2aWNlXCI7XG5leHBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9yZXNpemUtb2JzZXJ2ZXIuc2VydmljZVwiO1xuZXhwb3J0IHsgU3RpY2tUb0JvdHRvbURpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvc3RpY2stdG8tYm90dG9tLmRpcmVjdGl2ZVwiO1xuXG4vLyBUZXN0aW5nIHV0aWxpdGllcyBhcmUgbm90IGV4cG9ydGVkIGZyb20gdGhlIG1haW4gZW50cnkgcG9pbnRcbi8vIFRoZXkgc2hvdWxkIGJlIGltcG9ydGVkIGRpcmVjdGx5IGZyb20gJ0Bjb3BpbG90a2l0bmV4dC9hbmd1bGFyL3Rlc3RpbmcnIGlmIG5lZWRlZFxuIl19
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { Directive, Input, ElementRef, HostListener, inject, ViewContainerRef } from '@angular/core';
|
|
2
|
+
import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
|
|
3
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class TooltipContentComponent {
|
|
7
|
+
cdr;
|
|
8
|
+
text = '';
|
|
9
|
+
_position = 'below';
|
|
10
|
+
get position() {
|
|
11
|
+
return this._position;
|
|
12
|
+
}
|
|
13
|
+
set position(value) {
|
|
14
|
+
this._position = value;
|
|
15
|
+
this.cdr.markForCheck();
|
|
16
|
+
}
|
|
17
|
+
constructor(cdr) {
|
|
18
|
+
this.cdr = cdr;
|
|
19
|
+
}
|
|
20
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContentComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
21
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TooltipContentComponent, isStandalone: true, selector: "copilot-tooltip-content", ngImport: i0, template: `
|
|
22
|
+
<div class="copilot-tooltip-wrapper" [attr.data-position]="position">
|
|
23
|
+
<div class="copilot-tooltip">
|
|
24
|
+
{{ text }}
|
|
25
|
+
</div>
|
|
26
|
+
<div class="copilot-tooltip-arrow"></div>
|
|
27
|
+
</div>
|
|
28
|
+
`, isInline: true, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
29
|
+
}
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContentComponent, decorators: [{
|
|
31
|
+
type: Component,
|
|
32
|
+
args: [{ selector: 'copilot-tooltip-content', template: `
|
|
33
|
+
<div class="copilot-tooltip-wrapper" [attr.data-position]="position">
|
|
34
|
+
<div class="copilot-tooltip">
|
|
35
|
+
{{ text }}
|
|
36
|
+
</div>
|
|
37
|
+
<div class="copilot-tooltip-arrow"></div>
|
|
38
|
+
</div>
|
|
39
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"] }]
|
|
40
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
|
|
41
|
+
export class CopilotTooltipDirective {
|
|
42
|
+
tooltipText = '';
|
|
43
|
+
tooltipPosition = 'below';
|
|
44
|
+
tooltipDelay = 500; // milliseconds
|
|
45
|
+
overlay = inject(Overlay);
|
|
46
|
+
overlayPositionBuilder = inject(OverlayPositionBuilder);
|
|
47
|
+
elementRef = inject(ElementRef);
|
|
48
|
+
viewContainerRef = inject(ViewContainerRef);
|
|
49
|
+
overlayRef;
|
|
50
|
+
tooltipTimeout;
|
|
51
|
+
originalTitle;
|
|
52
|
+
onMouseEnter() {
|
|
53
|
+
if (!this.tooltipText)
|
|
54
|
+
return;
|
|
55
|
+
// Store and remove native title to prevent OS tooltip
|
|
56
|
+
const element = this.elementRef.nativeElement;
|
|
57
|
+
if (element.hasAttribute('title')) {
|
|
58
|
+
this.originalTitle = element.getAttribute('title');
|
|
59
|
+
element.removeAttribute('title');
|
|
60
|
+
}
|
|
61
|
+
// Clear any existing timeout
|
|
62
|
+
if (this.tooltipTimeout) {
|
|
63
|
+
clearTimeout(this.tooltipTimeout);
|
|
64
|
+
}
|
|
65
|
+
// Set timeout to show tooltip after delay
|
|
66
|
+
this.tooltipTimeout = window.setTimeout(() => {
|
|
67
|
+
this.show();
|
|
68
|
+
}, this.tooltipDelay);
|
|
69
|
+
}
|
|
70
|
+
onMouseLeave() {
|
|
71
|
+
// Clear timeout if mouse leaves before tooltip shows
|
|
72
|
+
if (this.tooltipTimeout) {
|
|
73
|
+
clearTimeout(this.tooltipTimeout);
|
|
74
|
+
this.tooltipTimeout = undefined;
|
|
75
|
+
}
|
|
76
|
+
// Restore original title if it existed
|
|
77
|
+
if (this.originalTitle !== undefined) {
|
|
78
|
+
this.elementRef.nativeElement.setAttribute('title', this.originalTitle);
|
|
79
|
+
this.originalTitle = undefined;
|
|
80
|
+
}
|
|
81
|
+
// Hide tooltip if it's showing
|
|
82
|
+
this.hide();
|
|
83
|
+
}
|
|
84
|
+
show() {
|
|
85
|
+
if (this.overlayRef) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Create overlay
|
|
89
|
+
const positionStrategy = this.overlayPositionBuilder
|
|
90
|
+
.flexibleConnectedTo(this.elementRef)
|
|
91
|
+
.withPositions(this.getPositions())
|
|
92
|
+
.withPush(false);
|
|
93
|
+
this.overlayRef = this.overlay.create({
|
|
94
|
+
positionStrategy,
|
|
95
|
+
scrollStrategy: this.overlay.scrollStrategies.close(),
|
|
96
|
+
hasBackdrop: false
|
|
97
|
+
});
|
|
98
|
+
// Create component portal and attach
|
|
99
|
+
const portal = new ComponentPortal(TooltipContentComponent, this.viewContainerRef);
|
|
100
|
+
const componentRef = this.overlayRef.attach(portal);
|
|
101
|
+
componentRef.instance.text = this.tooltipText;
|
|
102
|
+
// Detect actual position after overlay is positioned
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
if (this.overlayRef && this.elementRef.nativeElement) {
|
|
105
|
+
const tooltipRect = this.overlayRef.overlayElement.getBoundingClientRect();
|
|
106
|
+
const elementRect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
107
|
+
let actualPosition = 'below';
|
|
108
|
+
// Determine actual position based on relative positions
|
|
109
|
+
if (tooltipRect.bottom <= elementRect.top) {
|
|
110
|
+
actualPosition = 'above';
|
|
111
|
+
}
|
|
112
|
+
else if (tooltipRect.top >= elementRect.bottom) {
|
|
113
|
+
actualPosition = 'below';
|
|
114
|
+
}
|
|
115
|
+
else if (tooltipRect.right <= elementRect.left) {
|
|
116
|
+
actualPosition = 'left';
|
|
117
|
+
}
|
|
118
|
+
else if (tooltipRect.left >= elementRect.right) {
|
|
119
|
+
actualPosition = 'right';
|
|
120
|
+
}
|
|
121
|
+
componentRef.instance.position = actualPosition;
|
|
122
|
+
}
|
|
123
|
+
}, 0);
|
|
124
|
+
}
|
|
125
|
+
hide() {
|
|
126
|
+
if (this.overlayRef) {
|
|
127
|
+
this.overlayRef.dispose();
|
|
128
|
+
this.overlayRef = undefined;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
getPositions() {
|
|
132
|
+
const positions = {
|
|
133
|
+
above: [
|
|
134
|
+
{
|
|
135
|
+
originX: 'center',
|
|
136
|
+
originY: 'top',
|
|
137
|
+
overlayX: 'center',
|
|
138
|
+
overlayY: 'bottom',
|
|
139
|
+
offsetY: -12
|
|
140
|
+
}
|
|
141
|
+
],
|
|
142
|
+
below: [
|
|
143
|
+
{
|
|
144
|
+
originX: 'center',
|
|
145
|
+
originY: 'bottom',
|
|
146
|
+
overlayX: 'center',
|
|
147
|
+
overlayY: 'top',
|
|
148
|
+
offsetY: 12
|
|
149
|
+
}
|
|
150
|
+
],
|
|
151
|
+
left: [
|
|
152
|
+
{
|
|
153
|
+
originX: 'start',
|
|
154
|
+
originY: 'center',
|
|
155
|
+
overlayX: 'end',
|
|
156
|
+
overlayY: 'center',
|
|
157
|
+
offsetX: -12
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
right: [
|
|
161
|
+
{
|
|
162
|
+
originX: 'end',
|
|
163
|
+
originY: 'center',
|
|
164
|
+
overlayX: 'start',
|
|
165
|
+
overlayY: 'center',
|
|
166
|
+
offsetX: 12
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
};
|
|
170
|
+
// Prefer below position, but use above as fallback
|
|
171
|
+
const primary = positions[this.tooltipPosition] || positions.below;
|
|
172
|
+
// For below position, add above as first fallback
|
|
173
|
+
const fallbacks = this.tooltipPosition === 'below'
|
|
174
|
+
? [...(positions.above || []), ...(positions.left || []), ...(positions.right || [])]
|
|
175
|
+
: Object.values(positions).filter(p => p !== primary).flat();
|
|
176
|
+
return [...(primary || []), ...fallbacks];
|
|
177
|
+
}
|
|
178
|
+
ngOnDestroy() {
|
|
179
|
+
if (this.tooltipTimeout) {
|
|
180
|
+
clearTimeout(this.tooltipTimeout);
|
|
181
|
+
}
|
|
182
|
+
// Restore original title if it existed
|
|
183
|
+
if (this.originalTitle !== undefined) {
|
|
184
|
+
this.elementRef.nativeElement.setAttribute('title', this.originalTitle);
|
|
185
|
+
}
|
|
186
|
+
this.hide();
|
|
187
|
+
}
|
|
188
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
189
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotTooltipDirective, isStandalone: true, selector: "[copilotTooltip]", inputs: { tooltipText: ["copilotTooltip", "tooltipText"], tooltipPosition: "tooltipPosition", tooltipDelay: "tooltipDelay" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 });
|
|
190
|
+
}
|
|
191
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltipDirective, decorators: [{
|
|
192
|
+
type: Directive,
|
|
193
|
+
args: [{
|
|
194
|
+
selector: '[copilotTooltip]',
|
|
195
|
+
standalone: true
|
|
196
|
+
}]
|
|
197
|
+
}], propDecorators: { tooltipText: [{
|
|
198
|
+
type: Input,
|
|
199
|
+
args: ['copilotTooltip']
|
|
200
|
+
}], tooltipPosition: [{
|
|
201
|
+
type: Input
|
|
202
|
+
}], tooltipDelay: [{
|
|
203
|
+
type: Input
|
|
204
|
+
}], onMouseEnter: [{
|
|
205
|
+
type: HostListener,
|
|
206
|
+
args: ['mouseenter']
|
|
207
|
+
}], onMouseLeave: [{
|
|
208
|
+
type: HostListener,
|
|
209
|
+
args: ['mouseleave']
|
|
210
|
+
}] } });
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFFWixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBRVAsc0JBQXNCLEVBRXZCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDOztBQXdGdEYsTUFBTSxPQUFPLHVCQUF1QjtJQWFkO0lBWnBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDRixTQUFTLEdBQXlDLE9BQU8sQ0FBQztJQUVsRSxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQTJDO1FBQ3RELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQzt3R0FibkMsdUJBQXVCOzRGQUF2Qix1QkFBdUIsbUZBcEZ4Qjs7Ozs7OztHQU9UOzs0RkE2RVUsdUJBQXVCO2tCQXRGbkMsU0FBUzsrQkFDRSx5QkFBeUIsWUFDekI7Ozs7Ozs7R0FPVCxtQkEwRWdCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSTs7QUFzQmxCLE1BQU0sT0FBTyx1QkFBdUI7SUFDVCxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLGVB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LEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUvRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzt3R0F0S1UsdUJBQXVCOzRGQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBSm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUUwQixXQUFXO3NCQUFuQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDZCxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBWU4sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVk7Z0JBdUIxQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT25EZXN0cm95LFxuICBpbmplY3QsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPdmVybGF5LFxuICBPdmVybGF5UmVmLFxuICBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxuICBDb25uZWN0ZWRQb3NpdGlvblxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtdG9vbHRpcC1jb250ZW50JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwLXdyYXBwZXJcIiBbYXR0ci5kYXRhLXBvc2l0aW9uXT1cInBvc2l0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwXCI+XG4gICAgICAgIHt7IHRleHQgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvcGlsb3QtdG9vbHRpcC1hcnJvd1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMTVzIGVhc2UtaW4tb3V0O1xuICAgIH1cbiAgICBcbiAgICAuY29waWxvdC10b29sdGlwIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxYTFhMWE7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgbWF4LXdpZHRoOiAyMDBweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgIH1cbiAgICBcbiAgICAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAwO1xuICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICB9XG4gICAgXG4gICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgYmVsb3cgZWxlbWVudCAoYXJyb3cgcG9pbnRzIHVwIHRvIHRvb2x0aXApICovXG4gICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyW2RhdGEtcG9zaXRpb249XCJiZWxvd1wiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHRvcDogLTRweDtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIGJvcmRlci13aWR0aDogMCA0cHggNHB4IDRweDtcbiAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzFhMWExYSB0cmFuc3BhcmVudDtcbiAgICB9XG4gICAgXG4gICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgYWJvdmUgZWxlbWVudCAoYXJyb3cgcG9pbnRzIGRvd24gdG8gZWxlbWVudCkgKi9cbiAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXJbZGF0YS1wb3NpdGlvbj1cImFib3ZlXCJdIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgYm90dG9tOiAtNHB4O1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgYm9yZGVyLXdpZHRoOiA0cHggNHB4IDAgNHB4O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMWExYTFhIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgIH1cbiAgICBcbiAgICAvKiBBcnJvdyBmb3IgdG9vbHRpcCB0byB0aGUgbGVmdCAqL1xuICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwibGVmdFwiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHJpZ2h0OiAtNHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBib3JkZXItd2lkdGg6IDRweCAwIDRweCA0cHg7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMxYTFhMWE7XG4gICAgfVxuICAgIFxuICAgIC8qIEFycm93IGZvciB0b29sdGlwIHRvIHRoZSByaWdodCAqL1xuICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwicmlnaHRcIl0gLmNvcGlsb3QtdG9vbHRpcC1hcnJvdyB7XG4gICAgICBsZWZ0OiAtNHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBib3JkZXItd2lkdGg6IDRweCA0cHggNHB4IDA7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICMxYTFhMWEgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIFxuICAgIEBrZXlmcmFtZXMgZmFkZUluIHtcbiAgICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcbiAgICAgIH1cbiAgICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgfVxuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBDb250ZW50Q29tcG9uZW50IHtcbiAgdGV4dCA9ICcnO1xuICBwcml2YXRlIF9wb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JlbG93JztcbiAgXG4gIGdldCBwb3NpdGlvbigpOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdsZWZ0JyB8ICdyaWdodCcge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuICBcbiAgc2V0IHBvc2l0aW9uKHZhbHVlOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjb3BpbG90VG9vbHRpcF0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCdjb3BpbG90VG9vbHRpcCcpIHRvb2x0aXBUZXh0ID0gJyc7XG4gIEBJbnB1dCgpIHRvb2x0aXBQb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JlbG93JztcbiAgQElucHV0KCkgdG9vbHRpcERlbGF5ID0gNTAwOyAvLyBtaWxsaXNlY29uZHNcbiAgXG4gIHByaXZhdGUgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgcHJpdmF0ZSBvdmVybGF5UG9zaXRpb25CdWlsZGVyID0gaW5qZWN0KE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIpO1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgXG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgdG9vbHRpcFRpbWVvdXQ/OiBudW1iZXI7XG4gIHByaXZhdGUgb3JpZ2luYWxUaXRsZT86IHN0cmluZztcbiAgXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxuICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBUZXh0KSByZXR1cm47XG4gICAgXG4gICAgLy8gU3RvcmUgYW5kIHJlbW92ZSBuYXRpdmUgdGl0bGUgdG8gcHJldmVudCBPUyB0b29sdGlwXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGl0bGUnKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFRpdGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXQgdGltZW91dCB0byBzaG93IHRvb2x0aXAgYWZ0ZXIgZGVsYXlcbiAgICB0aGlzLnRvb2x0aXBUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSwgdGhpcy50b29sdGlwRGVsYXkpO1xuICB9XG4gIFxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRpbWVvdXQgaWYgbW91c2UgbGVhdmVzIGJlZm9yZSB0b29sdGlwIHNob3dzXG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgdGl0bGUgaWYgaXQgZXhpc3RlZFxuICAgIGlmICh0aGlzLm9yaWdpbmFsVGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMub3JpZ2luYWxUaXRsZSk7XG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEhpZGUgdG9vbHRpcCBpZiBpdCdzIHNob3dpbmdcbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzaG93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG92ZXJsYXlcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmVsZW1lbnRSZWYpXG4gICAgICAud2l0aFBvc2l0aW9ucyh0aGlzLmdldFBvc2l0aW9ucygpKVxuICAgICAgLndpdGhQdXNoKGZhbHNlKTtcbiAgICBcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuY2xvc2UoKSxcbiAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZVxuICAgIH0pO1xuICAgIFxuICAgIC8vIENyZWF0ZSBjb21wb25lbnQgcG9ydGFsIGFuZCBhdHRhY2hcbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFRvb2x0aXBDb250ZW50Q29tcG9uZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UudGV4dCA9IHRoaXMudG9vbHRpcFRleHQ7XG4gICAgXG4gICAgLy8gRGV0ZWN0IGFjdHVhbCBwb3NpdGlvbiBhZnRlciBvdmVybGF5IGlzIHBvc2l0aW9uZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYWN0dWFsUG9zaXRpb246ICdhYm92ZScgfCAnYmVsb3cnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdiZWxvdyc7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgYWN0dWFsIHBvc2l0aW9uIGJhc2VkIG9uIHJlbGF0aXZlIHBvc2l0aW9uc1xuICAgICAgICBpZiAodG9vbHRpcFJlY3QuYm90dG9tIDw9IGVsZW1lbnRSZWN0LnRvcCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gJ2Fib3ZlJztcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC50b3AgPj0gZWxlbWVudFJlY3QuYm90dG9tKSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSAnYmVsb3cnO1xuICAgICAgICB9IGVsc2UgaWYgKHRvb2x0aXBSZWN0LnJpZ2h0IDw9IGVsZW1lbnRSZWN0LmxlZnQpIHtcbiAgICAgICAgICBhY3R1YWxQb3NpdGlvbiA9ICdsZWZ0JztcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC5sZWZ0ID49IGVsZW1lbnRSZWN0LnJpZ2h0KSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucG9zaXRpb24gPSBhY3R1YWxQb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBoaWRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGdldFBvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBwb3NpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbm5lY3RlZFBvc2l0aW9uW10+ID0ge1xuICAgICAgYWJvdmU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgb2Zmc2V0WTogLTEyXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBiZWxvdzogW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICBvZmZzZXRZOiAxMlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgbGVmdDogW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInLFxuICAgICAgICAgIG9mZnNldFg6IC0xMlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgcmlnaHQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgICAgICBvZmZzZXRYOiAxMlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgICBcbiAgICAvLyBQcmVmZXIgYmVsb3cgcG9zaXRpb24sIGJ1dCB1c2UgYWJvdmUgYXMgZmFsbGJhY2tcbiAgICBjb25zdCBwcmltYXJ5ID0gcG9zaXRpb25zW3RoaXMudG9vbHRpcFBvc2l0aW9uXSB8fCBwb3NpdGlvbnMuYmVsb3c7XG4gICAgLy8gRm9yIGJlbG93IHBvc2l0aW9uLCBhZGQgYWJvdmUgYXMgZmlyc3QgZmFsbGJhY2tcbiAgICBjb25zdCBmYWxsYmFja3MgPSB0aGlzLnRvb2x0aXBQb3NpdGlvbiA9PT0gJ2JlbG93JyBcbiAgICAgID8gWy4uLihwb3NpdGlvbnMuYWJvdmUgfHwgW10pLCAuLi4ocG9zaXRpb25zLmxlZnQgfHwgW10pLCAuLi4ocG9zaXRpb25zLnJpZ2h0IHx8IFtdKV1cbiAgICAgIDogT2JqZWN0LnZhbHVlcyhwb3NpdGlvbnMpLmZpbHRlcihwID0+IHAgIT09IHByaW1hcnkpLmZsYXQoKTtcbiAgICBcbiAgICByZXR1cm4gWy4uLihwcmltYXJ5IHx8IFtdKSwgLi4uZmFsbGJhY2tzXTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0aXRsZSBpZiBpdCBleGlzdGVkXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5vcmlnaW5hbFRpdGxlKTtcbiAgICB9XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cbn0iXX0=
|