@copilotkitnext/angular 0.0.9-alpha.2 → 0.0.10
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/esm2022/index.mjs +2 -70
- package/dist/esm2022/lib/agent.mjs +73 -0
- package/dist/esm2022/lib/chat-config.mjs +35 -0
- package/dist/esm2022/lib/chat-state.mjs +18 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
- package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
- package/dist/esm2022/lib/config.mjs +9 -0
- package/dist/esm2022/lib/copilotkit.mjs +124 -0
- package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
- package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
- package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
- package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
- package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
- package/dist/esm2022/lib/resize-observer.mjs +152 -0
- package/dist/esm2022/lib/scroll-position.mjs +124 -0
- package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
- package/dist/esm2022/lib/slots/index.mjs +4 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
- package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
- package/dist/esm2022/lib/tools.mjs +31 -0
- package/dist/esm2022/lib/utils.mjs +3 -3
- package/dist/esm2022/public-api.mjs +47 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/index.d.ts +1 -55
- package/dist/lib/agent.d.ts +53 -0
- package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
- package/dist/lib/chat-state.d.ts +10 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
- package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
- package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
- package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
- package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
- package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
- package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
- package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
- package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
- package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
- package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
- package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
- package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
- package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
- package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
- package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
- package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
- package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
- package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
- package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
- package/dist/lib/config.d.ts +16 -0
- package/dist/lib/copilotkit.d.ts +29 -0
- package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
- package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
- package/dist/lib/directives/tooltip.d.ts +33 -0
- package/dist/lib/human-in-the-loop.d.ts +13 -0
- package/dist/lib/render-tool-calls.d.ts +75 -0
- package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
- package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
- package/dist/lib/slots/copilot-slot.d.ts +34 -0
- package/dist/lib/slots/index.d.ts +3 -0
- package/dist/lib/slots/slot.types.d.ts +1 -1
- package/dist/lib/slots/slot.utils.d.ts +6 -4
- package/dist/lib/tools.d.ts +63 -0
- package/dist/lib/utils.d.ts +1 -1
- package/dist/public-api.d.ts +46 -0
- package/dist/styles.css +0 -69
- package/package.json +3 -3
- package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
- package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
- package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
- package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
- package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
- package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
- package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
- package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
- package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
- package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
- package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
- package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
- package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
- package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
- package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
- package/dist/components/chat/copilot-chat.component.d.ts +0 -36
- package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
- package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
- package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
- package/dist/core/copilotkit.providers.d.ts +0 -13
- package/dist/core/copilotkit.service.d.ts +0 -119
- package/dist/core/copilotkit.types.d.ts +0 -81
- package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
- package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
- package/dist/directives/copilotkit-config.directive.d.ts +0 -44
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
- package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
- package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
- package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
- package/dist/esm2022/core/copilotkit.service.mjs +0 -411
- package/dist/esm2022/core/copilotkit.types.mjs +0 -13
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
- package/dist/esm2022/services/resize-observer.service.mjs +0 -152
- package/dist/esm2022/services/scroll-position.service.mjs +0 -124
- package/dist/esm2022/types/frontend-tool.mjs +0 -2
- package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
- package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
- package/dist/esm2022/utils/agent.utils.mjs +0 -212
- package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
- package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
- package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
- package/dist/lib/directives/tooltip.directive.d.ts +0 -33
- package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
- package/dist/types/frontend-tool.d.ts +0 -37
- package/dist/types/human-in-the-loop.d.ts +0 -44
- package/dist/utils/agent-context.utils.d.ts +0 -75
- package/dist/utils/agent.utils.d.ts +0 -108
- package/dist/utils/chat-config.utils.d.ts +0 -166
- package/dist/utils/copilotkit.utils.d.ts +0 -16
- package/dist/utils/frontend-tool.utils.d.ts +0 -119
- package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { Directive, ElementRef, inject, input, output, } from "@angular/core";
|
|
2
|
+
import { ScrollPosition } from "../scroll-position";
|
|
3
|
+
import { ResizeObserverService } from "../resize-observer";
|
|
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 StickToBottom {
|
|
24
|
+
enabled = input(true);
|
|
25
|
+
threshold = input(10);
|
|
26
|
+
initialBehavior = input("smooth");
|
|
27
|
+
resizeBehavior = input("smooth");
|
|
28
|
+
debounceMs = input(100);
|
|
29
|
+
isAtBottomChange = output();
|
|
30
|
+
scrollToBottomRequested = output();
|
|
31
|
+
elementRef = inject(ElementRef);
|
|
32
|
+
scrollService = inject(ScrollPosition);
|
|
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
|
|
66
|
+
.monitorScrollPosition(element, this.threshold())
|
|
67
|
+
.pipe(takeUntil(this.destroy$), debounceTime(this.debounceMs()), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom))
|
|
68
|
+
.subscribe((state) => {
|
|
69
|
+
const wasAtBottom = this.wasAtBottom;
|
|
70
|
+
this.wasAtBottom = state.isAtBottom;
|
|
71
|
+
// Detect user scroll
|
|
72
|
+
if (!state.isAtBottom && wasAtBottom && this.hasInitialized) {
|
|
73
|
+
this.userHasScrolled = true;
|
|
74
|
+
}
|
|
75
|
+
else if (state.isAtBottom) {
|
|
76
|
+
this.userHasScrolled = false;
|
|
77
|
+
}
|
|
78
|
+
// Emit change
|
|
79
|
+
this.isAtBottomChange.emit(state.isAtBottom);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
setupResizeMonitoring() {
|
|
83
|
+
if (!this.enabled() || !this.contentElement)
|
|
84
|
+
return;
|
|
85
|
+
// Monitor content resize
|
|
86
|
+
this.resizeService
|
|
87
|
+
.observeElement(this.contentElement, 0, 250)
|
|
88
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.enabled() && !this.userHasScrolled))
|
|
89
|
+
.subscribe((state) => {
|
|
90
|
+
// Auto-scroll on resize if we were at bottom
|
|
91
|
+
if (this.wasAtBottom && !state.isResizing) {
|
|
92
|
+
this.scrollToBottom(this.resizeBehavior());
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// Monitor container resize
|
|
96
|
+
const element = this.elementRef.nativeElement;
|
|
97
|
+
this.resizeService
|
|
98
|
+
.observeElement(element, 0, 250)
|
|
99
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.enabled() && !this.userHasScrolled && this.wasAtBottom))
|
|
100
|
+
.subscribe(() => {
|
|
101
|
+
// Adjust scroll on container resize
|
|
102
|
+
this.scrollToBottom(this.resizeBehavior());
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
setupContentMutationObserver() {
|
|
106
|
+
if (!this.enabled() || !this.contentElement)
|
|
107
|
+
return;
|
|
108
|
+
const mutationObserver = new MutationObserver(() => {
|
|
109
|
+
if (this.enabled() && this.wasAtBottom && !this.userHasScrolled) {
|
|
110
|
+
// Content changed, scroll to bottom if we were there
|
|
111
|
+
requestAnimationFrame(() => {
|
|
112
|
+
this.scrollToBottom(this.resizeBehavior());
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
mutationObserver.observe(this.contentElement, {
|
|
117
|
+
childList: true,
|
|
118
|
+
subtree: true,
|
|
119
|
+
characterData: true,
|
|
120
|
+
});
|
|
121
|
+
// Cleanup on destroy
|
|
122
|
+
this.destroy$.subscribe(() => {
|
|
123
|
+
mutationObserver.disconnect();
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Public method to scroll to bottom
|
|
128
|
+
* Can be called from parent component
|
|
129
|
+
*/
|
|
130
|
+
scrollToBottom(behavior = "smooth") {
|
|
131
|
+
const element = this.elementRef.nativeElement;
|
|
132
|
+
const smooth = behavior === "smooth";
|
|
133
|
+
this.scrollService.scrollToBottom(element, smooth);
|
|
134
|
+
this.userHasScrolled = false;
|
|
135
|
+
this.scrollToBottomRequested.emit();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if currently at bottom
|
|
139
|
+
*/
|
|
140
|
+
isAtBottom() {
|
|
141
|
+
return this.scrollService.isAtBottom(this.elementRef.nativeElement, this.threshold());
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get current scroll state
|
|
145
|
+
*/
|
|
146
|
+
getScrollState() {
|
|
147
|
+
const element = this.elementRef.nativeElement;
|
|
148
|
+
return {
|
|
149
|
+
scrollTop: element.scrollTop,
|
|
150
|
+
scrollHeight: element.scrollHeight,
|
|
151
|
+
clientHeight: element.clientHeight,
|
|
152
|
+
isAtBottom: this.isAtBottom(),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
ngOnDestroy() {
|
|
156
|
+
this.destroy$.next();
|
|
157
|
+
this.destroy$.complete();
|
|
158
|
+
}
|
|
159
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottom, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
160
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: StickToBottom, isStandalone: true, selector: "[copilotStickToBottom]", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, initialBehavior: { classPropertyName: "initialBehavior", publicName: "initialBehavior", isSignal: true, isRequired: false, transformFunction: null }, resizeBehavior: { classPropertyName: "resizeBehavior", publicName: "resizeBehavior", isSignal: true, isRequired: false, transformFunction: null }, debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isAtBottomChange: "isAtBottomChange", scrollToBottomRequested: "scrollToBottomRequested" }, providers: [ScrollPosition, ResizeObserverService], ngImport: i0 });
|
|
161
|
+
}
|
|
162
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottom, decorators: [{
|
|
163
|
+
type: Directive,
|
|
164
|
+
args: [{
|
|
165
|
+
standalone: true,
|
|
166
|
+
selector: "[copilotStickToBottom]",
|
|
167
|
+
providers: [ScrollPosition, ResizeObserverService],
|
|
168
|
+
}]
|
|
169
|
+
}] });
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2stdG8tYm90dG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kaXJlY3RpdmVzL3N0aWNrLXRvLWJvdHRvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFJVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sb0JBQW9CLEdBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7O0FBSXhCOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQU1ILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLE9BQU8sR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDL0IsU0FBUyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5QixlQUFlLEdBQUcsS0FBSyxDQUFpQixRQUFRLENBQUMsQ0FBQztJQUNsRCxjQUFjLEdBQUcsS0FBSyxDQUFpQixRQUFRLENBQUMsQ0FBQztJQUNqRCxVQUFVLEdBQUcsS0FBSyxDQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWhDLGdCQUFnQixHQUFHLE1BQU0sRUFBVyxDQUFDO0lBQ3JDLHVCQUF1QixHQUFHLE1BQU0sRUFBUSxDQUFDO0lBRWpDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2QyxhQUFhLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFOUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsY0FBYyxDQUFlO0lBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWhDLFFBQVE7UUFDTix1Q0FBdUM7SUFDekMsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQTRCLENBQUM7UUFFN0QsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FDekMsZ0NBQWdDLENBQ2xCLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFcEMsc0NBQXNDO1FBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztRQUU1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUU5QywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWE7YUFDZixxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ2hELElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQy9CLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQzlEO2FBQ0EsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFFcEMscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzVELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQy9CLENBQUM7WUFFRCxjQUFjO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFcEQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhO2FBQ2YsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUMzQyxJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDdEQ7YUFDQSxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQiw2Q0FBNkM7WUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLDJCQUEyQjtRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYTthQUNmLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUMvQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsTUFBTSxDQUNKLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDbEUsQ0FDRjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUVwRCxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2hFLHFEQUFxRDtnQkFDckQscUJBQXFCLENBQUMsR0FBRyxFQUFFO29CQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzVDLFNBQVMsRUFBRSxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUk7WUFDYixhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzNCLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxXQUEyQixRQUFRO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLFFBQVEsS0FBSyxRQUFRLENBQUM7UUFFckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQzdCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDakIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsT0FBTztZQUNMLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7WUFDbEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTdLVSxhQUFhOzRGQUFiLGFBQWEsMDJCQUZiLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDOzs0RkFFdkMsYUFBYTtrQkFMekIsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDO2lCQUNuRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFNjcm9sbFBvc2l0aW9uIH0gZnJvbSBcIi4uL3Njcm9sbC1wb3NpdGlvblwiO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3Jlc2l6ZS1vYnNlcnZlclwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICB0YWtlVW50aWwsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIFNjcm9sbEJlaGF2aW9yID0gXCJzbW9vdGhcIiB8IFwiaW5zdGFudFwiIHwgXCJhdXRvXCI7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBpbXBsZW1lbnRpbmcgc3RpY2stdG8tYm90dG9tIHNjcm9sbCBiZWhhdmlvclxuICogU2ltaWxhciB0byB0aGUgUmVhY3QgdXNlLXN0aWNrLXRvLWJvdHRvbSBsaWJyYXJ5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxkaXYgY29waWxvdFN0aWNrVG9Cb3R0b21cbiAqICAgICAgW2VuYWJsZWRdPVwidHJ1ZVwiXG4gKiAgICAgIFt0aHJlc2hvbGRdPVwiMTBcIlxuICogICAgICBbaW5pdGlhbEJlaGF2aW9yXT1cIidzbW9vdGgnXCJcbiAqICAgICAgW3Jlc2l6ZUJlaGF2aW9yXT1cIidzbW9vdGgnXCJcbiAqICAgICAgKGlzQXRCb3R0b21DaGFuZ2UpPVwib25Cb3R0b21DaGFuZ2UoJGV2ZW50KVwiPlxuICogICA8IS0tIENvbnRlbnQgLS0+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RTdGlja1RvQm90dG9tXVwiLFxuICBwcm92aWRlcnM6IFtTY3JvbGxQb3NpdGlvbiwgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3RpY2tUb0JvdHRvbSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgZW5hYmxlZCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICB0aHJlc2hvbGQgPSBpbnB1dDxudW1iZXI+KDEwKTtcbiAgaW5pdGlhbEJlaGF2aW9yID0gaW5wdXQ8U2Nyb2xsQmVoYXZpb3I+KFwic21vb3RoXCIpO1xuICByZXNpemVCZWhhdmlvciA9IGlucHV0PFNjcm9sbEJlaGF2aW9yPihcInNtb290aFwiKTtcbiAgZGVib3VuY2VNcyA9IGlucHV0PG51bWJlcj4oMTAwKTtcblxuICBpc0F0Qm90dG9tQ2hhbmdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHNjcm9sbFRvQm90dG9tUmVxdWVzdGVkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHNjcm9sbFNlcnZpY2UgPSBpbmplY3QoU2Nyb2xsUG9zaXRpb24pO1xuICBwcml2YXRlIHJlc2l6ZVNlcnZpY2UgPSBpbmplY3QoUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlKTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBjb250ZW50RWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHdhc0F0Qm90dG9tID0gdHJ1ZTtcbiAgcHJpdmF0ZSBoYXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHdpbGwgaGFwcGVuIGluIG5nQWZ0ZXJWaWV3SW5pdFxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIC8vIEZpbmQgb3IgY3JlYXRlIGNvbnRlbnQgd3JhcHBlclxuICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcIltkYXRhLXN0aWNrLXRvLWJvdHRvbS1jb250ZW50XVwiXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIXRoaXMuY29udGVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIHRoaXMuc2V0dXBTY3JvbGxNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZU1vbml0b3JpbmcoKTtcbiAgICB0aGlzLnNldHVwQ29udGVudE11dGF0aW9uT2JzZXJ2ZXIoKTtcblxuICAgIC8vIEluaXRpYWwgc2Nyb2xsIHRvIGJvdHRvbSBpZiBlbmFibGVkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhhc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMuaW5pdGlhbEJlaGF2aW9yKCkpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNjcm9sbE1vbml0b3JpbmcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gTW9uaXRvciBzY3JvbGwgcG9zaXRpb25cbiAgICB0aGlzLnNjcm9sbFNlcnZpY2VcbiAgICAgIC5tb25pdG9yU2Nyb2xsUG9zaXRpb24oZWxlbWVudCwgdGhpcy50aHJlc2hvbGQoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlTXMoKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhLmlzQXRCb3R0b20gPT09IGIuaXNBdEJvdHRvbSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHdhc0F0Qm90dG9tID0gdGhpcy53YXNBdEJvdHRvbTtcbiAgICAgICAgdGhpcy53YXNBdEJvdHRvbSA9IHN0YXRlLmlzQXRCb3R0b207XG5cbiAgICAgICAgLy8gRGV0ZWN0IHVzZXIgc2Nyb2xsXG4gICAgICAgIGlmICghc3RhdGUuaXNBdEJvdHRvbSAmJiB3YXNBdEJvdHRvbSAmJiB0aGlzLmhhc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgdGhpcy51c2VySGFzU2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmlzQXRCb3R0b20pIHtcbiAgICAgICAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjaGFuZ2VcbiAgICAgICAgdGhpcy5pc0F0Qm90dG9tQ2hhbmdlLmVtaXQoc3RhdGUuaXNBdEJvdHRvbSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSZXNpemVNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuY29udGVudEVsZW1lbnQpIHJldHVybjtcblxuICAgIC8vIE1vbml0b3IgY29udGVudCByZXNpemVcbiAgICB0aGlzLnJlc2l6ZVNlcnZpY2VcbiAgICAgIC5vYnNlcnZlRWxlbWVudCh0aGlzLmNvbnRlbnRFbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKCkgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgLy8gQXV0by1zY3JvbGwgb24gcmVzaXplIGlmIHdlIHdlcmUgYXQgYm90dG9tXG4gICAgICAgIGlmICh0aGlzLndhc0F0Qm90dG9tICYmICFzdGF0ZS5pc1Jlc2l6aW5nKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLnJlc2l6ZUJlaGF2aW9yKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIE1vbml0b3IgY29udGFpbmVyIHJlc2l6ZVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlc2l6ZVNlcnZpY2VcbiAgICAgIC5vYnNlcnZlRWxlbWVudChlbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKCkgPT4gdGhpcy5lbmFibGVkKCkgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkICYmIHRoaXMud2FzQXRCb3R0b21cbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEFkanVzdCBzY3JvbGwgb24gY29udGFpbmVyIHJlc2l6ZVxuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IoKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDb250ZW50TXV0YXRpb25PYnNlcnZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCgpICYmIHRoaXMud2FzQXRCb3R0b20gJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkKSB7XG4gICAgICAgIC8vIENvbnRlbnQgY2hhbmdlZCwgc2Nyb2xsIHRvIGJvdHRvbSBpZiB3ZSB3ZXJlIHRoZXJlXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLnJlc2l6ZUJlaGF2aW9yKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRlbnRFbGVtZW50LCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIENsZWFudXAgb24gZGVzdHJveVxuICAgIHRoaXMuZGVzdHJveSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gc2Nyb2xsIHRvIGJvdHRvbVxuICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gcGFyZW50IGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IFwic21vb3RoXCIpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc21vb3RoID0gYmVoYXZpb3IgPT09IFwic21vb3RoXCI7XG5cbiAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9Cb3R0b20oZWxlbWVudCwgc21vb3RoKTtcbiAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21SZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnRseSBhdCBib3R0b21cbiAgICovXG4gIHB1YmxpYyBpc0F0Qm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFNlcnZpY2UuaXNBdEJvdHRvbShcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy50aHJlc2hvbGQoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc2Nyb2xsIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Nyb2xsU3RhdGUoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wLFxuICAgICAgc2Nyb2xsSGVpZ2h0OiBlbGVtZW50LnNjcm9sbEhlaWdodCxcbiAgICAgIGNsaWVudEhlaWdodDogZWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgICBpc0F0Qm90dG9tOiB0aGlzLmlzQXRCb3R0b20oKSxcbiAgICB9O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,217 @@
|
|
|
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 TooltipContent {
|
|
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: TooltipContent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
21
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TooltipContent, 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: TooltipContent, decorators: [{
|
|
31
|
+
type: Component,
|
|
32
|
+
args: [{ selector: "copilot-tooltip-content", standalone: true, 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, 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 CopilotTooltip {
|
|
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(TooltipContent, 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
|
+
? [
|
|
175
|
+
...(positions.above || []),
|
|
176
|
+
...(positions.left || []),
|
|
177
|
+
...(positions.right || []),
|
|
178
|
+
]
|
|
179
|
+
: Object.values(positions)
|
|
180
|
+
.filter((p) => p !== primary)
|
|
181
|
+
.flat();
|
|
182
|
+
return [...(primary || []), ...fallbacks];
|
|
183
|
+
}
|
|
184
|
+
ngOnDestroy() {
|
|
185
|
+
if (this.tooltipTimeout) {
|
|
186
|
+
clearTimeout(this.tooltipTimeout);
|
|
187
|
+
}
|
|
188
|
+
// Restore original title if it existed
|
|
189
|
+
if (this.originalTitle !== undefined) {
|
|
190
|
+
this.elementRef.nativeElement.setAttribute("title", this.originalTitle);
|
|
191
|
+
}
|
|
192
|
+
this.hide();
|
|
193
|
+
}
|
|
194
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
195
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotTooltip, isStandalone: true, selector: "[copilotTooltip]", inputs: { tooltipText: ["copilotTooltip", "tooltipText"], tooltipPosition: "tooltipPosition", tooltipDelay: "tooltipDelay" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 });
|
|
196
|
+
}
|
|
197
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltip, decorators: [{
|
|
198
|
+
type: Directive,
|
|
199
|
+
args: [{
|
|
200
|
+
selector: "[copilotTooltip]",
|
|
201
|
+
standalone: true,
|
|
202
|
+
}]
|
|
203
|
+
}], propDecorators: { tooltipText: [{
|
|
204
|
+
type: Input,
|
|
205
|
+
args: ["copilotTooltip"]
|
|
206
|
+
}], tooltipPosition: [{
|
|
207
|
+
type: Input
|
|
208
|
+
}], tooltipDelay: [{
|
|
209
|
+
type: Input
|
|
210
|
+
}], onMouseEnter: [{
|
|
211
|
+
type: HostListener,
|
|
212
|
+
args: ["mouseenter"]
|
|
213
|
+
}], onMouseLeave: [{
|
|
214
|
+
type: HostListener,
|
|
215
|
+
args: ["mouseleave"]
|
|
216
|
+
}] } });
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGlyZWN0aXZlcy90b29sdGlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBRVosTUFBTSxFQUNOLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUVQLHNCQUFzQixHQUV2QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixHQUV4QixNQUFNLGVBQWUsQ0FBQzs7QUEwRnZCLE1BQU0sT0FBTyxjQUFjO0lBYUw7SUFacEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNGLFNBQVMsR0FBeUMsT0FBTyxDQUFDO0lBRWxFLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBMkM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO3dHQWJuQyxjQUFjOzRGQUFkLGNBQWMsbUZBckZmOzs7Ozs7O0dBT1Q7OzRGQThFVSxjQUFjO2tCQXhGMUIsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxZQUNOOzs7Ozs7O0dBT1QsbUJBNEVnQix1QkFBdUIsQ0FBQyxNQUFNOztBQXNCakQsTUFBTSxPQUFPLGNBQWM7SUFDQSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBeUMsT0FBTyxDQUFDO0lBQ2hFLFlBQVksR0FB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QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztpQkFDckIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO2lCQUM1QixJQUFJLEVBQUUsQ0FBQztRQUVoQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzt3R0EvS1UsY0FBYzs0RkFBZCxjQUFjOzs0RkFBZCxjQUFjO2tCQUoxQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFFMEIsV0FBVztzQkFBbkMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ2QsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQVlOLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQXVCMUIsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgaW5qZWN0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheVJlZixcbiAgT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiY29waWxvdC10b29sdGlwLWNvbnRlbnRcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwLXdyYXBwZXJcIiBbYXR0ci5kYXRhLXBvc2l0aW9uXT1cInBvc2l0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwXCI+XG4gICAgICAgIHt7IHRleHQgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvcGlsb3QtdG9vbHRpcC1hcnJvd1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgYW5pbWF0aW9uOiBmYWRlSW4gMC4xNXMgZWFzZS1pbi1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWExYTFhO1xuICAgICAgICBjb2xvcjogd2hpdGU7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gICAgICB9XG5cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEFycm93IGZvciB0b29sdGlwIGJlbG93IGVsZW1lbnQgKGFycm93IHBvaW50cyB1cCB0byB0b29sdGlwKSAqL1xuICAgICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyW2RhdGEtcG9zaXRpb249XCJiZWxvd1wiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgICAgdG9wOiAtNHB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgYm9yZGVyLXdpZHRoOiAwIDRweCA0cHggNHB4O1xuICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMxYTFhMWEgdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEFycm93IGZvciB0b29sdGlwIGFib3ZlIGVsZW1lbnQgKGFycm93IHBvaW50cyBkb3duIHRvIGVsZW1lbnQpICovXG4gICAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXJbZGF0YS1wb3NpdGlvbj1cImFib3ZlXCJdIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgICBib3R0b206IC00cHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICBib3JkZXItd2lkdGg6IDRweCA0cHggMCA0cHg7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzFhMWExYSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgdG8gdGhlIGxlZnQgKi9cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwibGVmdFwiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgICAgcmlnaHQ6IC00cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGJvcmRlci13aWR0aDogNHB4IDAgNHB4IDRweDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjMWExYTFhO1xuICAgICAgfVxuXG4gICAgICAvKiBBcnJvdyBmb3IgdG9vbHRpcCB0byB0aGUgcmlnaHQgKi9cbiAgICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwicmlnaHRcIl0gLmNvcGlsb3QtdG9vbHRpcC1hcnJvdyB7XG4gICAgICAgIGxlZnQ6IC00cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGJvcmRlci13aWR0aDogNHB4IDRweCA0cHggMDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAjMWExYTFhIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGZhZGVJbiB7XG4gICAgICAgIGZyb20ge1xuICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweCk7XG4gICAgICAgIH1cbiAgICAgICAgdG8ge1xuICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBDb250ZW50IHtcbiAgdGV4dCA9IFwiXCI7XG4gIHByaXZhdGUgX3Bvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiA9IFwiYmVsb3dcIjtcblxuICBnZXQgcG9zaXRpb24oKTogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuXG4gIHNldCBwb3NpdGlvbih2YWx1ZTogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIpIHtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RUb29sdGlwXVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90VG9vbHRpcCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dChcImNvcGlsb3RUb29sdGlwXCIpIHRvb2x0aXBUZXh0ID0gXCJcIjtcbiAgQElucHV0KCkgdG9vbHRpcFBvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgdG9vbHRpcERlbGF5ID0gNTAwOyAvLyBtaWxsaXNlY29uZHNcblxuICBwcml2YXRlIG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgb3ZlcmxheVBvc2l0aW9uQnVpbGRlciA9IGluamVjdChPdmVybGF5UG9zaXRpb25CdWlsZGVyKTtcbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgcHJpdmF0ZSBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgcHJpdmF0ZSB0b29sdGlwVGltZW91dD86IG51bWJlcjtcbiAgcHJpdmF0ZSBvcmlnaW5hbFRpdGxlPzogc3RyaW5nO1xuXG4gIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIpXG4gIG9uTW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcFRleHQpIHJldHVybjtcblxuICAgIC8vIFN0b3JlIGFuZCByZW1vdmUgbmF0aXZlIHRpdGxlIHRvIHByZXZlbnQgT1MgdG9vbHRpcFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFRpdGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aW1lb3V0IHRvIHNob3cgdG9vbHRpcCBhZnRlciBkZWxheVxuICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9LCB0aGlzLnRvb2x0aXBEZWxheSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwibW91c2VsZWF2ZVwiKVxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGltZW91dCBpZiBtb3VzZSBsZWF2ZXMgYmVmb3JlIHRvb2x0aXAgc2hvd3NcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgICAgdGhpcy50b29sdGlwVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRpdGxlIGlmIGl0IGV4aXN0ZWRcbiAgICBpZiAodGhpcy5vcmlnaW5hbFRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIHRoaXMub3JpZ2luYWxUaXRsZSk7XG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0b29sdGlwIGlmIGl0J3Mgc2hvd2luZ1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgb3ZlcmxheVxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlQb3NpdGlvbkJ1aWxkZXJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcbiAgICAgIC53aXRoUG9zaXRpb25zKHRoaXMuZ2V0UG9zaXRpb25zKCkpXG4gICAgICAud2l0aFB1c2goZmFsc2UpO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKCksXG4gICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50IHBvcnRhbCBhbmQgYXR0YWNoXG4gICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChUb29sdGlwQ29udGVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnRleHQgPSB0aGlzLnRvb2x0aXBUZXh0O1xuXG4gICAgLy8gRGV0ZWN0IGFjdHVhbCBwb3NpdGlvbiBhZnRlciBvdmVybGF5IGlzIHBvc2l0aW9uZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPVxuICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPVxuICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGxldCBhY3R1YWxQb3NpdGlvbjogXCJhYm92ZVwiIHwgXCJiZWxvd1wiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgPSBcImJlbG93XCI7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGFjdHVhbCBwb3NpdGlvbiBiYXNlZCBvbiByZWxhdGl2ZSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKHRvb2x0aXBSZWN0LmJvdHRvbSA8PSBlbGVtZW50UmVjdC50b3ApIHtcbiAgICAgICAgICBhY3R1YWxQb3NpdGlvbiA9IFwiYWJvdmVcIjtcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC50b3AgPj0gZWxlbWVudFJlY3QuYm90dG9tKSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSBcImJlbG93XCI7XG4gICAgICAgIH0gZWxzZSBpZiAodG9vbHRpcFJlY3QucmlnaHQgPD0gZWxlbWVudFJlY3QubGVmdCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gXCJsZWZ0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAodG9vbHRpcFJlY3QubGVmdCA+PSBlbGVtZW50UmVjdC5yaWdodCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gXCJyaWdodFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnBvc2l0aW9uID0gYWN0dWFsUG9zaXRpb247XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGhpZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBwb3NpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbm5lY3RlZFBvc2l0aW9uW10+ID0ge1xuICAgICAgYWJvdmU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgICBvZmZzZXRZOiAtMTIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYmVsb3c6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICBvdmVybGF5WDogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgICBvZmZzZXRZOiAxMixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiBcInN0YXJ0XCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICBvdmVybGF5WTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvZmZzZXRYOiAtMTIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmlnaHQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6IFwiZW5kXCIsXG4gICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgIG92ZXJsYXlZOiBcImNlbnRlclwiLFxuICAgICAgICAgIG9mZnNldFg6IDEyLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgLy8gUHJlZmVyIGJlbG93IHBvc2l0aW9uLCBidXQgdXNlIGFib3ZlIGFzIGZhbGxiYWNrXG4gICAgY29uc3QgcHJpbWFyeSA9IHBvc2l0aW9uc1t0aGlzLnRvb2x0aXBQb3NpdGlvbl0gfHwgcG9zaXRpb25zLmJlbG93O1xuICAgIC8vIEZvciBiZWxvdyBwb3NpdGlvbiwgYWRkIGFib3ZlIGFzIGZpcnN0IGZhbGxiYWNrXG4gICAgY29uc3QgZmFsbGJhY2tzID1cbiAgICAgIHRoaXMudG9vbHRpcFBvc2l0aW9uID09PSBcImJlbG93XCJcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi4ocG9zaXRpb25zLmFib3ZlIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLihwb3NpdGlvbnMubGVmdCB8fCBbXSksXG4gICAgICAgICAgICAuLi4ocG9zaXRpb25zLnJpZ2h0IHx8IFtdKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogT2JqZWN0LnZhbHVlcyhwb3NpdGlvbnMpXG4gICAgICAgICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBwcmltYXJ5KVxuICAgICAgICAgICAgLmZsYXQoKTtcblxuICAgIHJldHVybiBbLi4uKHByaW1hcnkgfHwgW10pLCAuLi5mYWxsYmFja3NdO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0aXRsZSBpZiBpdCBleGlzdGVkXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCB0aGlzLm9yaWdpbmFsVGl0bGUpO1xuICAgIH1cbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { filter, lastValueFrom, Subject, take } from "rxjs";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class HumanInTheLoop {
|
|
5
|
+
results = new Subject();
|
|
6
|
+
addResult(toolCallId, toolName, result) {
|
|
7
|
+
this.results.next({ toolCallId, toolName, result });
|
|
8
|
+
}
|
|
9
|
+
onResult(toolCallId, toolName) {
|
|
10
|
+
return lastValueFrom(this.results.pipe(filter((result) => result.toolCallId === toolCallId && result.toolName === toolName), take(1)));
|
|
11
|
+
}
|
|
12
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HumanInTheLoop, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
13
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HumanInTheLoop, providedIn: "root" });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HumanInTheLoop, decorators: [{
|
|
16
|
+
type: Injectable,
|
|
17
|
+
args: [{ providedIn: "root" }]
|
|
18
|
+
}] });
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taW4tdGhlLWxvb3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2h1bWFuLWluLXRoZS1sb29wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFHNUQsTUFBTSxPQUFPLGNBQWM7SUFDekIsT0FBTyxHQUFHLElBQUksT0FBTyxFQUlqQixDQUFDO0lBRUwsU0FBUyxDQUFDLFVBQWtCLEVBQUUsUUFBZ0IsRUFBRSxNQUFlO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxRQUFRLENBQUMsVUFBa0IsRUFBRSxRQUFnQjtRQUMzQyxPQUFPLGFBQWEsQ0FDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsTUFBTSxDQUNKLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FDbkUsRUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FDRixDQUFDO0lBQ0osQ0FBQzt3R0FyQlUsY0FBYzs0R0FBZCxjQUFjLGNBREQsTUFBTTs7NEZBQ25CLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2UgfSBmcm9tIFwicnhqc1wiO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgSHVtYW5JblRoZUxvb3Age1xuICByZXN1bHRzID0gbmV3IFN1YmplY3Q8e1xuICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICB0b29sTmFtZTogc3RyaW5nO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgfT4oKTtcblxuICBhZGRSZXN1bHQodG9vbENhbGxJZDogc3RyaW5nLCB0b29sTmFtZTogc3RyaW5nLCByZXN1bHQ6IHVua25vd24pIHtcbiAgICB0aGlzLnJlc3VsdHMubmV4dCh7IHRvb2xDYWxsSWQsIHRvb2xOYW1lLCByZXN1bHQgfSk7XG4gIH1cblxuICBvblJlc3VsdCh0b29sQ2FsbElkOiBzdHJpbmcsIHRvb2xOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gbGFzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMucmVzdWx0cy5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKHJlc3VsdCkgPT5cbiAgICAgICAgICAgIHJlc3VsdC50b29sQ2FsbElkID09PSB0b29sQ2FsbElkICYmIHJlc3VsdC50b29sTmFtZSA9PT0gdG9vbE5hbWVcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { NgComponentOutlet } from "@angular/common";
|
|
2
|
+
import { Component, inject, input } from "@angular/core";
|
|
3
|
+
import { CopilotKit } from "./copilotkit";
|
|
4
|
+
import { partialJSONParse } from "@copilotkitnext/shared";
|
|
5
|
+
import { HumanInTheLoop } from "./human-in-the-loop";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class RenderToolCalls {
|
|
8
|
+
#copilotKit = inject(CopilotKit);
|
|
9
|
+
#hitl = inject(HumanInTheLoop);
|
|
10
|
+
message = input.required();
|
|
11
|
+
messages = input.required();
|
|
12
|
+
isLoading = input(false);
|
|
13
|
+
pickRenderer(name) {
|
|
14
|
+
const messageAgentId = this.message()
|
|
15
|
+
.agentId;
|
|
16
|
+
const renderers = this.#copilotKit.toolCallRenderConfigs();
|
|
17
|
+
const clientTools = this.#copilotKit.clientToolCallRenderConfigs();
|
|
18
|
+
const humanInTheLoopTools = this.#copilotKit.humanInTheLoopToolRenderConfigs();
|
|
19
|
+
const renderer = renderers.find((candidate) => candidate.name === name &&
|
|
20
|
+
(candidate.agentId === undefined ||
|
|
21
|
+
candidate.agentId === messageAgentId));
|
|
22
|
+
if (renderer)
|
|
23
|
+
return { type: "renderer", config: renderer };
|
|
24
|
+
const clientTool = clientTools.find((candidate) => candidate.name === name &&
|
|
25
|
+
(candidate.agentId === undefined ||
|
|
26
|
+
candidate.agentId === messageAgentId));
|
|
27
|
+
if (clientTool)
|
|
28
|
+
return { type: "clientTool", config: clientTool };
|
|
29
|
+
const humanInTheLoopTool = humanInTheLoopTools.find((candidate) => candidate.name === name &&
|
|
30
|
+
(candidate.agentId === undefined ||
|
|
31
|
+
candidate.agentId === messageAgentId));
|
|
32
|
+
if (humanInTheLoopTool)
|
|
33
|
+
return { type: "humanInTheLoopTool", config: humanInTheLoopTool };
|
|
34
|
+
const starRenderer = renderers.find((candidate) => candidate.name === "*");
|
|
35
|
+
if (starRenderer)
|
|
36
|
+
return { type: "renderer", config: starRenderer };
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
buildToolCall(toolCall) {
|
|
40
|
+
const args = partialJSONParse(toolCall.function.arguments);
|
|
41
|
+
const message = this.#getToolMessage(toolCall.id);
|
|
42
|
+
if (message) {
|
|
43
|
+
return {
|
|
44
|
+
args,
|
|
45
|
+
status: "complete",
|
|
46
|
+
result: message.content,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
else if (this.isLoading()) {
|
|
50
|
+
return {
|
|
51
|
+
args,
|
|
52
|
+
status: "in-progress",
|
|
53
|
+
result: undefined,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return {
|
|
58
|
+
args,
|
|
59
|
+
status: "executing",
|
|
60
|
+
result: undefined,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
buildHumanInTheLoopToolCall(toolCall) {
|
|
65
|
+
const args = partialJSONParse(toolCall.function.arguments);
|
|
66
|
+
const message = this.#getToolMessage(toolCall.id);
|
|
67
|
+
if (message) {
|
|
68
|
+
return {
|
|
69
|
+
args,
|
|
70
|
+
status: "complete",
|
|
71
|
+
result: message.content,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
else if (this.isLoading()) {
|
|
75
|
+
return {
|
|
76
|
+
args,
|
|
77
|
+
status: "in-progress",
|
|
78
|
+
result: undefined,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return {
|
|
83
|
+
args,
|
|
84
|
+
status: "executing",
|
|
85
|
+
result: undefined,
|
|
86
|
+
respond: (result) => {
|
|
87
|
+
this.#hitl.addResult(toolCall.id, toolCall.function.name, result);
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
#getToolMessage(toolCallId) {
|
|
93
|
+
return this.messages().find((m) => m.role === "tool" && m.toolCallId === toolCallId);
|
|
94
|
+
}
|
|
95
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RenderToolCalls, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
96
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: RenderToolCalls, isStandalone: true, selector: "copilot-render-tool-calls", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
97
|
+
@for (toolCall of message().toolCalls ?? []; track toolCall.id) {
|
|
98
|
+
@let renderConfig = pickRenderer(toolCall.function.name);
|
|
99
|
+
@if (renderConfig && renderConfig.type !== "humanInTheLoopTool") {
|
|
100
|
+
<ng-container
|
|
101
|
+
*ngComponentOutlet="
|
|
102
|
+
renderConfig.config.component;
|
|
103
|
+
inputs: { toolCall: buildToolCall(toolCall) }
|
|
104
|
+
"
|
|
105
|
+
/>
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }] });
|
|
109
|
+
}
|
|
110
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RenderToolCalls, decorators: [{
|
|
111
|
+
type: Component,
|
|
112
|
+
args: [{
|
|
113
|
+
selector: "copilot-render-tool-calls",
|
|
114
|
+
standalone: true,
|
|
115
|
+
imports: [NgComponentOutlet],
|
|
116
|
+
template: `
|
|
117
|
+
@for (toolCall of message().toolCalls ?? []; track toolCall.id) {
|
|
118
|
+
@let renderConfig = pickRenderer(toolCall.function.name);
|
|
119
|
+
@if (renderConfig && renderConfig.type !== "humanInTheLoopTool") {
|
|
120
|
+
<ng-container
|
|
121
|
+
*ngComponentOutlet="
|
|
122
|
+
renderConfig.config.component;
|
|
123
|
+
inputs: { toolCall: buildToolCall(toolCall) }
|
|
124
|
+
"
|
|
125
|
+
/>
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
`,
|
|
129
|
+
}]
|
|
130
|
+
}] });
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXRvb2wtY2FsbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlci10b29sLWNhbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBUTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFzQ3JELE1BQU0sT0FBTyxlQUFlO0lBQ2pCLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBb0IsQ0FBQztJQUM3QyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBYSxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFakMsWUFBWSxDQUFDLElBQVk7UUFJakMsTUFBTSxjQUFjLEdBQUksSUFBSSxDQUFDLE9BQU8sRUFBZ0M7YUFDakUsT0FBTyxDQUFDO1FBQ1gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuRSxNQUFNLG1CQUFtQixHQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFFckQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FDN0IsQ0FBQyxT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QixNQUFNLEVBQUUsU0FBUzthQUNsQixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO2dCQUNMLElBQUk7Z0JBQ0osTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDcEUsQ0FBQzthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFrQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQ3pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FDeEQsQ0FBQztJQUNKLENBQUM7d0dBL0dVLGVBQWU7NEZBQWYsZUFBZSxrZUFkaEI7Ozs7Ozs7Ozs7OztHQVlULDREQWJTLGlCQUFpQjs7NEZBZWhCLGVBQWU7a0JBbEIzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7R0FZVDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIGlucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEFzc2lzdGFudE1lc3NhZ2UsIE1lc3NhZ2UsIFRvb2xDYWxsIH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcbmltcG9ydCB7IENvcGlsb3RLaXQgfSBmcm9tIFwiLi9jb3BpbG90a2l0XCI7XG5pbXBvcnQge1xuICBGcm9udGVuZFRvb2xDb25maWcsXG4gIEh1bWFuSW5UaGVMb29wVG9vbENhbGwsXG4gIEh1bWFuSW5UaGVMb29wQ29uZmlnLFxuICBBbmd1bGFyVG9vbENhbGwsXG4gIFJlbmRlclRvb2xDYWxsQ29uZmlnLFxufSBmcm9tIFwiLi90b29sc1wiO1xuaW1wb3J0IHsgcGFydGlhbEpTT05QYXJzZSB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvc2hhcmVkXCI7XG5pbXBvcnQgeyBIdW1hbkluVGhlTG9vcCB9IGZyb20gXCIuL2h1bWFuLWluLXRoZS1sb29wXCI7XG5cbnR5cGUgUmVuZGVyZXJUb29sQ2FsbEhhbmRsZXIgPSB7XG4gIHR5cGU6IFwicmVuZGVyZXJcIjtcbiAgY29uZmlnOiBSZW5kZXJUb29sQ2FsbENvbmZpZztcbn07XG50eXBlIENsaWVudFRvb2xDYWxsSGFuZGxlciA9IHtcbiAgdHlwZTogXCJjbGllbnRUb29sXCI7XG4gIGNvbmZpZzogRnJvbnRlbmRUb29sQ29uZmlnO1xufTtcbnR5cGUgSHVtYW5JblRoZUxvb3BUb29sQ2FsbEhhbmRsZXIgPSB7XG4gIHR5cGU6IFwiaHVtYW5JblRoZUxvb3BUb29sXCI7XG4gIGNvbmZpZzogSHVtYW5JblRoZUxvb3BDb25maWc7XG59O1xuXG50eXBlIFRvb2xDYWxsSGFuZGxlciA9XG4gIHwgUmVuZGVyZXJUb29sQ2FsbEhhbmRsZXJcbiAgfCBDbGllbnRUb29sQ2FsbEhhbmRsZXJcbiAgfCBIdW1hbkluVGhlTG9vcFRvb2xDYWxsSGFuZGxlcjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNvcGlsb3QtcmVuZGVyLXRvb2wtY2FsbHNcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nQ29tcG9uZW50T3V0bGV0XSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAZm9yICh0b29sQ2FsbCBvZiBtZXNzYWdlKCkudG9vbENhbGxzID8/IFtdOyB0cmFjayB0b29sQ2FsbC5pZCkge1xuICAgICAgQGxldCByZW5kZXJDb25maWcgPSBwaWNrUmVuZGVyZXIodG9vbENhbGwuZnVuY3Rpb24ubmFtZSk7XG4gICAgICBAaWYgKHJlbmRlckNvbmZpZyAmJiByZW5kZXJDb25maWcudHlwZSAhPT0gXCJodW1hbkluVGhlTG9vcFRvb2xcIikge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiXG4gICAgICAgICAgICByZW5kZXJDb25maWcuY29uZmlnLmNvbXBvbmVudDtcbiAgICAgICAgICAgIGlucHV0czogeyB0b29sQ2FsbDogYnVpbGRUb29sQ2FsbCh0b29sQ2FsbCkgfVxuICAgICAgICAgIFwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBSZW5kZXJUb29sQ2FsbHMge1xuICByZWFkb25seSAjY29waWxvdEtpdCA9IGluamVjdChDb3BpbG90S2l0KTtcbiAgcmVhZG9ubHkgI2hpdGwgPSBpbmplY3QoSHVtYW5JblRoZUxvb3ApO1xuICByZWFkb25seSBtZXNzYWdlID0gaW5wdXQucmVxdWlyZWQ8QXNzaXN0YW50TWVzc2FnZT4oKTtcbiAgcmVhZG9ubHkgbWVzc2FnZXMgPSBpbnB1dC5yZXF1aXJlZDxNZXNzYWdlW10+KCk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgcGlja1JlbmRlcmVyKG5hbWU6IHN0cmluZyk6IFRvb2xDYWxsSGFuZGxlciB8IHVuZGVmaW5lZCB7XG4gICAgdHlwZSBBc3Npc3RhbnRNZXNzYWdlV2l0aEFnZW50ID0gQXNzaXN0YW50TWVzc2FnZSAmIHtcbiAgICAgIGFnZW50SWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlQWdlbnRJZCA9ICh0aGlzLm1lc3NhZ2UoKSBhcyBBc3Npc3RhbnRNZXNzYWdlV2l0aEFnZW50KVxuICAgICAgLmFnZW50SWQ7XG4gICAgY29uc3QgcmVuZGVyZXJzID0gdGhpcy4jY29waWxvdEtpdC50b29sQ2FsbFJlbmRlckNvbmZpZ3MoKTtcbiAgICBjb25zdCBjbGllbnRUb29scyA9IHRoaXMuI2NvcGlsb3RLaXQuY2xpZW50VG9vbENhbGxSZW5kZXJDb25maWdzKCk7XG4gICAgY29uc3QgaHVtYW5JblRoZUxvb3BUb29scyA9XG4gICAgICB0aGlzLiNjb3BpbG90S2l0Lmh1bWFuSW5UaGVMb29wVG9vbFJlbmRlckNvbmZpZ3MoKTtcblxuICAgIGNvbnN0IHJlbmRlcmVyID0gcmVuZGVyZXJzLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSAmJlxuICAgICAgICAoY2FuZGlkYXRlLmFnZW50SWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIGNhbmRpZGF0ZS5hZ2VudElkID09PSBtZXNzYWdlQWdlbnRJZClcbiAgICApO1xuXG4gICAgaWYgKHJlbmRlcmVyKSByZXR1cm4geyB0eXBlOiBcInJlbmRlcmVyXCIsIGNvbmZpZzogcmVuZGVyZXIgfTtcblxuICAgIGNvbnN0IGNsaWVudFRvb2wgPSBjbGllbnRUb29scy5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUgJiZcbiAgICAgICAgKGNhbmRpZGF0ZS5hZ2VudElkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjYW5kaWRhdGUuYWdlbnRJZCA9PT0gbWVzc2FnZUFnZW50SWQpXG4gICAgKTtcbiAgICBpZiAoY2xpZW50VG9vbCkgcmV0dXJuIHsgdHlwZTogXCJjbGllbnRUb29sXCIsIGNvbmZpZzogY2xpZW50VG9vbCB9O1xuXG4gICAgY29uc3QgaHVtYW5JblRoZUxvb3BUb29sID0gaHVtYW5JblRoZUxvb3BUb29scy5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUgJiZcbiAgICAgICAgKGNhbmRpZGF0ZS5hZ2VudElkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjYW5kaWRhdGUuYWdlbnRJZCA9PT0gbWVzc2FnZUFnZW50SWQpXG4gICAgKTtcbiAgICBpZiAoaHVtYW5JblRoZUxvb3BUb29sKVxuICAgICAgcmV0dXJuIHsgdHlwZTogXCJodW1hbkluVGhlTG9vcFRvb2xcIiwgY29uZmlnOiBodW1hbkluVGhlTG9vcFRvb2wgfTtcblxuICAgIGNvbnN0IHN0YXJSZW5kZXJlciA9IHJlbmRlcmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSBcIipcIik7XG4gICAgaWYgKHN0YXJSZW5kZXJlcikgcmV0dXJuIHsgdHlwZTogXCJyZW5kZXJlclwiLCBjb25maWc6IHN0YXJSZW5kZXJlciB9O1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFRvb2xDYWxsPEFyZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgdG9vbENhbGw6IFRvb2xDYWxsXG4gICk6IEFuZ3VsYXJUb29sQ2FsbDxBcmdzPiB7XG4gICAgY29uc3QgYXJncyA9IHBhcnRpYWxKU09OUGFyc2UodG9vbENhbGwuZnVuY3Rpb24uYXJndW1lbnRzKTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy4jZ2V0VG9vbE1lc3NhZ2UodG9vbENhbGwuaWQpO1xuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXR1czogXCJjb21wbGV0ZVwiLFxuICAgICAgICByZXN1bHQ6IG1lc3NhZ2UuY29udGVudCEsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImluLXByb2dyZXNzXCIsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImV4ZWN1dGluZ1wiLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkSHVtYW5JblRoZUxvb3BUb29sQ2FsbDxBcmdzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHRvb2xDYWxsOiBUb29sQ2FsbFxuICApOiBIdW1hbkluVGhlTG9vcFRvb2xDYWxsPEFyZ3M+IHtcbiAgICBjb25zdCBhcmdzID0gcGFydGlhbEpTT05QYXJzZSh0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHMpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLiNnZXRUb29sTWVzc2FnZSh0b29sQ2FsbC5pZCk7XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImNvbXBsZXRlXCIsXG4gICAgICAgIHJlc3VsdDogbWVzc2FnZS5jb250ZW50ISxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTG9hZGluZygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmdzLFxuICAgICAgICBzdGF0dXM6IFwiaW4tcHJvZ3Jlc3NcIixcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmdzLFxuICAgICAgICBzdGF0dXM6IFwiZXhlY3V0aW5nXCIsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICByZXNwb25kOiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy4jaGl0bC5hZGRSZXN1bHQodG9vbENhbGwuaWQsIHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUsIHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gICNnZXRUb29sTWVzc2FnZSh0b29sQ2FsbElkOiBzdHJpbmcpOiBNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlcygpLmZpbmQoXG4gICAgICAobSkgPT4gbS5yb2xlID09PSBcInRvb2xcIiAmJiBtLnRvb2xDYWxsSWQgPT09IHRvb2xDYWxsSWRcbiAgICApO1xuICB9XG59XG4iXX0=
|