@copilotkitnext/angular 0.0.9-alpha.3 → 0.0.11
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 +5 -5
- 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
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewContainerRef, inject, ViewChild, TemplateRef, ChangeDetectionStrategy, signal, } from "@angular/core";
|
|
2
|
-
import { CommonModule } from "@angular/common";
|
|
3
|
-
import { ToolCallStatus } from "@copilotkitnext/core";
|
|
4
|
-
import { CopilotKitService } from "../../core/copilotkit.service";
|
|
5
|
-
import { partialJSONParse } from "@copilotkitnext/shared";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
/**
|
|
9
|
-
* Component for rendering all tool calls for an assistant message.
|
|
10
|
-
* This component iterates through the message's tool calls and renders each one
|
|
11
|
-
* using the registered render functions in CopilotKitService.
|
|
12
|
-
*/
|
|
13
|
-
export class CopilotChatToolCallsViewComponent {
|
|
14
|
-
message;
|
|
15
|
-
messages = [];
|
|
16
|
-
isLoading = false;
|
|
17
|
-
container;
|
|
18
|
-
copilotkit = inject(CopilotKitService, {
|
|
19
|
-
optional: true,
|
|
20
|
-
});
|
|
21
|
-
componentRefs = new Map();
|
|
22
|
-
templateCache = new Map();
|
|
23
|
-
// Signals for reactive state
|
|
24
|
-
messageSignal = signal(null);
|
|
25
|
-
messagesSignal = signal([]);
|
|
26
|
-
isLoadingSignal = signal(false);
|
|
27
|
-
ngAfterViewInit() {
|
|
28
|
-
this.renderAllToolCalls();
|
|
29
|
-
}
|
|
30
|
-
ngOnChanges(changes) {
|
|
31
|
-
if (changes["message"]) {
|
|
32
|
-
this.messageSignal.set(this.message);
|
|
33
|
-
}
|
|
34
|
-
if (changes["messages"]) {
|
|
35
|
-
this.messagesSignal.set(this.messages);
|
|
36
|
-
}
|
|
37
|
-
if (changes["isLoading"]) {
|
|
38
|
-
this.isLoadingSignal.set(this.isLoading);
|
|
39
|
-
}
|
|
40
|
-
this.renderAllToolCalls();
|
|
41
|
-
}
|
|
42
|
-
ngOnDestroy() {
|
|
43
|
-
// Clean up all component refs
|
|
44
|
-
this.componentRefs.forEach((ref) => ref.destroy());
|
|
45
|
-
this.componentRefs.clear();
|
|
46
|
-
this.templateCache.clear();
|
|
47
|
-
}
|
|
48
|
-
getTemplateForToolCall(toolCall) {
|
|
49
|
-
return this.templateCache.get(toolCall.id) || null;
|
|
50
|
-
}
|
|
51
|
-
renderAllToolCalls() {
|
|
52
|
-
const message = this.messageSignal();
|
|
53
|
-
if (!message || !message.toolCalls || message.toolCalls.length === 0) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
// Clear existing renders
|
|
57
|
-
this.componentRefs.forEach((ref) => ref.destroy());
|
|
58
|
-
this.componentRefs.clear();
|
|
59
|
-
this.templateCache.clear();
|
|
60
|
-
if (!this.copilotkit || !this.container) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const messages = this.messagesSignal();
|
|
64
|
-
const isLoading = this.isLoadingSignal();
|
|
65
|
-
// Render each tool call
|
|
66
|
-
message.toolCalls.forEach((toolCall) => {
|
|
67
|
-
const toolMessage = messages.find((m) => m.role === "tool" && m.toolCallId === toolCall.id);
|
|
68
|
-
this.renderSingleToolCall(toolCall, toolMessage, isLoading);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
renderSingleToolCall(toolCall, toolMessage, isLoading) {
|
|
72
|
-
if (!this.copilotkit) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// Get current render tool calls
|
|
76
|
-
const currentRenderToolCalls = this.copilotkit.currentRenderToolCalls();
|
|
77
|
-
// Find the render config for this tool call by name
|
|
78
|
-
// Also check for wildcard (*) renders if no exact match
|
|
79
|
-
const renderConfig = currentRenderToolCalls.find((rc) => rc.name === toolCall.function.name) || currentRenderToolCalls.find((rc) => rc.name === "*");
|
|
80
|
-
if (!renderConfig) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
// Parse the arguments if they're a string
|
|
84
|
-
const args = partialJSONParse(toolCall.function.arguments);
|
|
85
|
-
// Determine status
|
|
86
|
-
let status;
|
|
87
|
-
if (toolMessage) {
|
|
88
|
-
status = ToolCallStatus.Complete;
|
|
89
|
-
}
|
|
90
|
-
else if (isLoading) {
|
|
91
|
-
status = ToolCallStatus.InProgress;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
status = ToolCallStatus.Complete;
|
|
95
|
-
}
|
|
96
|
-
// Create props based on status - use discriminated union properly
|
|
97
|
-
let props;
|
|
98
|
-
if (status === ToolCallStatus.InProgress) {
|
|
99
|
-
props = {
|
|
100
|
-
name: toolCall.function.name,
|
|
101
|
-
description: "",
|
|
102
|
-
args: args, // Partial args for InProgress
|
|
103
|
-
status: ToolCallStatus.InProgress,
|
|
104
|
-
result: undefined,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
// Complete status
|
|
109
|
-
props = {
|
|
110
|
-
name: toolCall.function.name,
|
|
111
|
-
description: "",
|
|
112
|
-
args: args, // Full args for Complete
|
|
113
|
-
status: ToolCallStatus.Complete,
|
|
114
|
-
result: toolMessage?.content || "",
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
// Check if render is a Component class or TemplateRef
|
|
118
|
-
if (this.isComponentClass(renderConfig.render)) {
|
|
119
|
-
// Create component dynamically
|
|
120
|
-
this.renderComponent(toolCall.id, renderConfig.render, props);
|
|
121
|
-
}
|
|
122
|
-
else if (this.isTemplateRef(renderConfig.render)) {
|
|
123
|
-
// Use template
|
|
124
|
-
this.renderTemplate(toolCall.id, renderConfig.render, props);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
renderComponent(toolCallId, componentClass, props) {
|
|
128
|
-
if (!this.container) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// Create the component
|
|
132
|
-
const componentRef = this.container.createComponent(componentClass);
|
|
133
|
-
this.componentRefs.set(toolCallId, componentRef);
|
|
134
|
-
// Determine declared inputs to avoid Angular NG0303 console errors
|
|
135
|
-
const cmpDef = componentClass.ɵcmp;
|
|
136
|
-
const declaredInputs = new Set(Object.keys(cmpDef?.inputs ?? {}));
|
|
137
|
-
// Prefer a single 'props' input if declared
|
|
138
|
-
if (declaredInputs.has('props')) {
|
|
139
|
-
componentRef.setInput('props', props);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
// Otherwise, set only inputs that the component actually declares
|
|
143
|
-
for (const [key, value] of Object.entries(props)) {
|
|
144
|
-
if (declaredInputs.has(key)) {
|
|
145
|
-
componentRef.setInput(key, value);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// Trigger change detection
|
|
150
|
-
componentRef.changeDetectorRef.detectChanges();
|
|
151
|
-
}
|
|
152
|
-
renderTemplate(toolCallId, template, props) {
|
|
153
|
-
this.templateCache.set(toolCallId, {
|
|
154
|
-
template,
|
|
155
|
-
context: {
|
|
156
|
-
$implicit: props,
|
|
157
|
-
name: props.name,
|
|
158
|
-
description: props.description,
|
|
159
|
-
args: props.args,
|
|
160
|
-
status: props.status,
|
|
161
|
-
result: props.result,
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
isComponentClass(value) {
|
|
166
|
-
return typeof value === "function" && value.prototype;
|
|
167
|
-
}
|
|
168
|
-
isTemplateRef(value) {
|
|
169
|
-
return value instanceof TemplateRef;
|
|
170
|
-
}
|
|
171
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolCallsViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
172
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CopilotChatToolCallsViewComponent, isStandalone: true, selector: "copilot-chat-tool-calls-view", inputs: { message: "message", messages: "messages", isLoading: "isLoading" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["dynamicContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: `
|
|
173
|
-
@for (toolCall of message?.toolCalls ?? []; track toolCall.id) {
|
|
174
|
-
<ng-container>
|
|
175
|
-
<ng-container #dynamicContainer></ng-container>
|
|
176
|
-
<ng-container *ngIf="getTemplateForToolCall(toolCall) as templateData">
|
|
177
|
-
<ng-container
|
|
178
|
-
*ngTemplateOutlet="
|
|
179
|
-
templateData.template;
|
|
180
|
-
context: templateData.context
|
|
181
|
-
"
|
|
182
|
-
></ng-container>
|
|
183
|
-
</ng-container>
|
|
184
|
-
</ng-container>
|
|
185
|
-
}
|
|
186
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
187
|
-
}
|
|
188
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolCallsViewComponent, decorators: [{
|
|
189
|
-
type: Component,
|
|
190
|
-
args: [{
|
|
191
|
-
selector: "copilot-chat-tool-calls-view",
|
|
192
|
-
standalone: true,
|
|
193
|
-
imports: [CommonModule],
|
|
194
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
195
|
-
template: `
|
|
196
|
-
@for (toolCall of message?.toolCalls ?? []; track toolCall.id) {
|
|
197
|
-
<ng-container>
|
|
198
|
-
<ng-container #dynamicContainer></ng-container>
|
|
199
|
-
<ng-container *ngIf="getTemplateForToolCall(toolCall) as templateData">
|
|
200
|
-
<ng-container
|
|
201
|
-
*ngTemplateOutlet="
|
|
202
|
-
templateData.template;
|
|
203
|
-
context: templateData.context
|
|
204
|
-
"
|
|
205
|
-
></ng-container>
|
|
206
|
-
</ng-container>
|
|
207
|
-
</ng-container>
|
|
208
|
-
}
|
|
209
|
-
`,
|
|
210
|
-
}]
|
|
211
|
-
}], propDecorators: { message: [{
|
|
212
|
-
type: Input,
|
|
213
|
-
args: [{ required: true }]
|
|
214
|
-
}], messages: [{
|
|
215
|
-
type: Input
|
|
216
|
-
}], isLoading: [{
|
|
217
|
-
type: Input
|
|
218
|
-
}], container: [{
|
|
219
|
-
type: ViewChild,
|
|
220
|
-
args: ["dynamicContainer", { read: ViewContainerRef }]
|
|
221
|
-
}] } });
|
|
222
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXRvb2wtY2FsbHMtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC10b29sLWNhbGxzLXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLGdCQUFnQixFQUVoQixNQUFNLEVBQ04sU0FBUyxFQUlULFdBQVcsRUFFWCx1QkFBdUIsRUFDdkIsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU8vQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7OztBQU0xRDs7OztHQUlHO0FBc0JILE1BQU0sT0FBTyxpQ0FBaUM7SUFHakIsT0FBTyxDQUFvQjtJQUM3QyxRQUFRLEdBQWMsRUFBRSxDQUFDO0lBQ3pCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFHbkIsU0FBUyxDQUFvQjtJQUU3QixVQUFVLEdBQTZCLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtRQUN2RSxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUMsQ0FBQztJQUNLLGFBQWEsR0FBbUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxRCxhQUFhLEdBR2pCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFZCw2QkFBNkI7SUFDckIsYUFBYSxHQUFHLE1BQU0sQ0FBMEIsSUFBSSxDQUFDLENBQUM7SUFDdEQsY0FBYyxHQUFHLE1BQU0sQ0FBWSxFQUFFLENBQUMsQ0FBQztJQUN2QyxlQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhDLGVB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TyxhQUFhLENBQUMsS0FBVTtRQUM5QixPQUFPLEtBQUssWUFBWSxXQUFXLENBQUM7SUFDdEMsQ0FBQzt3R0FsTlUsaUNBQWlDOzRGQUFqQyxpQ0FBaUMsZ1FBT0wsZ0JBQWdCLGtEQXZCN0M7Ozs7Ozs7Ozs7Ozs7O0dBY1QsMkRBaEJTLFlBQVk7OzRGQWtCWCxpQ0FBaUM7a0JBckI3QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7O0dBY1Q7aUJBQ0Y7OEJBSTRCLE9BQU87c0JBQWpDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0UsU0FBUztzQkFEaEIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIENvbXBvbmVudFJlZixcbiAgaW5qZWN0LFxuICBWaWV3Q2hpbGQsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBPbkRlc3Ryb3ksXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFzc2lzdGFudE1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIFRvb2xDYWxsLFxuICBUb29sTWVzc2FnZSxcbn0gZnJvbSBcIkBhZy11aS9jb3JlXCI7XG5pbXBvcnQgeyBUb29sQ2FsbFN0YXR1cyB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuaW1wb3J0IHsgQ29waWxvdEtpdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9jb3BpbG90a2l0LnNlcnZpY2VcIjtcbmltcG9ydCB7IHBhcnRpYWxKU09OUGFyc2UgfSBmcm9tIFwiQGNvcGlsb3RraXRuZXh0L3NoYXJlZFwiO1xuaW1wb3J0IHR5cGUge1xuICBUb29sQ2FsbFByb3BzLFxuICBUb29sQ2FsbFJlbmRlcixcbn0gZnJvbSBcIi4uLy4uL2NvcmUvY29waWxvdGtpdC50eXBlc1wiO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgcmVuZGVyaW5nIGFsbCB0b29sIGNhbGxzIGZvciBhbiBhc3Npc3RhbnQgbWVzc2FnZS5cbiAqIFRoaXMgY29tcG9uZW50IGl0ZXJhdGVzIHRocm91Z2ggdGhlIG1lc3NhZ2UncyB0b29sIGNhbGxzIGFuZCByZW5kZXJzIGVhY2ggb25lXG4gKiB1c2luZyB0aGUgcmVnaXN0ZXJlZCByZW5kZXIgZnVuY3Rpb25zIGluIENvcGlsb3RLaXRTZXJ2aWNlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiY29waWxvdC1jaGF0LXRvb2wtY2FsbHMtdmlld1wiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgQGZvciAodG9vbENhbGwgb2YgbWVzc2FnZT8udG9vbENhbGxzID8/IFtdOyB0cmFjayB0b29sQ2FsbC5pZCkge1xuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAjZHluYW1pY0NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFRlbXBsYXRlRm9yVG9vbENhbGwodG9vbENhbGwpIGFzIHRlbXBsYXRlRGF0YVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIHRlbXBsYXRlRGF0YS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgY29udGV4dDogdGVtcGxhdGVEYXRhLmNvbnRleHRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRUb29sQ2FsbHNWaWV3Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbWVzc2FnZSE6IEFzc2lzdGFudE1lc3NhZ2U7XG4gIEBJbnB1dCgpIG1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgQElucHV0KCkgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZChcImR5bmFtaWNDb250YWluZXJcIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHByaXZhdGUgY29udGFpbmVyPzogVmlld0NvbnRhaW5lclJlZjtcblxuICBwcml2YXRlIGNvcGlsb3RraXQ6IENvcGlsb3RLaXRTZXJ2aWNlIHwgbnVsbCA9IGluamVjdChDb3BpbG90S2l0U2VydmljZSwge1xuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9KTtcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWZzOiBNYXA8c3RyaW5nLCBDb21wb25lbnRSZWY8YW55Pj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdGVtcGxhdGVDYWNoZTogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+OyBjb250ZXh0OiBhbnkgfVxuICA+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIFNpZ25hbHMgZm9yIHJlYWN0aXZlIHN0YXRlXG4gIHByaXZhdGUgbWVzc2FnZVNpZ25hbCA9IHNpZ25hbDxBc3Npc3RhbnRNZXNzYWdlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgbWVzc2FnZXNTaWduYWwgPSBzaWduYWw8TWVzc2FnZVtdPihbXSk7XG4gIHByaXZhdGUgaXNMb2FkaW5nU2lnbmFsID0gc2lnbmFsKGZhbHNlKTtcblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJBbGxUb29sQ2FsbHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcIm1lc3NhZ2VcIl0pIHtcbiAgICAgIHRoaXMubWVzc2FnZVNpZ25hbC5zZXQodGhpcy5tZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJtZXNzYWdlc1wiXSkge1xuICAgICAgdGhpcy5tZXNzYWdlc1NpZ25hbC5zZXQodGhpcy5tZXNzYWdlcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wiaXNMb2FkaW5nXCJdKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZ1NpZ25hbC5zZXQodGhpcy5pc0xvYWRpbmcpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyQWxsVG9vbENhbGxzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBhbGwgY29tcG9uZW50IHJlZnNcbiAgICB0aGlzLmNvbXBvbmVudFJlZnMuZm9yRWFjaCgocmVmKSA9PiByZWYuZGVzdHJveSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLnRlbXBsYXRlQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIGdldFRlbXBsYXRlRm9yVG9vbENhbGwoXG4gICAgdG9vbENhbGw6IFRvb2xDYWxsXG4gICk6IHsgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47IGNvbnRleHQ6IGFueSB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDYWNoZS5nZXQodG9vbENhbGwuaWQpIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckFsbFRvb2xDYWxscygpOiB2b2lkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlU2lnbmFsKCk7XG4gICAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLnRvb2xDYWxscyB8fCBtZXNzYWdlLnRvb2xDYWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyByZW5kZXJzXG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmZvckVhY2goKHJlZikgPT4gcmVmLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy50ZW1wbGF0ZUNhY2hlLmNsZWFyKCk7XG5cbiAgICBpZiAoIXRoaXMuY29waWxvdGtpdCB8fCAhdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMubWVzc2FnZXNTaWduYWwoKTtcbiAgICBjb25zdCBpc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ1NpZ25hbCgpO1xuXG4gICAgLy8gUmVuZGVyIGVhY2ggdG9vbCBjYWxsXG4gICAgbWVzc2FnZS50b29sQ2FsbHMuZm9yRWFjaCgodG9vbENhbGwpID0+IHtcbiAgICAgIGNvbnN0IHRvb2xNZXNzYWdlID0gbWVzc2FnZXMuZmluZChcbiAgICAgICAgKG0pID0+XG4gICAgICAgICAgbS5yb2xlID09PSBcInRvb2xcIiAmJiAobSBhcyBUb29sTWVzc2FnZSkudG9vbENhbGxJZCA9PT0gdG9vbENhbGwuaWRcbiAgICAgICkgYXMgVG9vbE1lc3NhZ2UgfCB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMucmVuZGVyU2luZ2xlVG9vbENhbGwodG9vbENhbGwsIHRvb2xNZXNzYWdlLCBpc0xvYWRpbmcpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTaW5nbGVUb29sQ2FsbChcbiAgICB0b29sQ2FsbDogVG9vbENhbGwsXG4gICAgdG9vbE1lc3NhZ2U6IFRvb2xNZXNzYWdlIHwgdW5kZWZpbmVkLFxuICAgIGlzTG9hZGluZzogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29waWxvdGtpdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBjdXJyZW50IHJlbmRlciB0b29sIGNhbGxzXG4gICAgY29uc3QgY3VycmVudFJlbmRlclRvb2xDYWxscyA9IHRoaXMuY29waWxvdGtpdC5jdXJyZW50UmVuZGVyVG9vbENhbGxzKCk7XG5cbiAgICAvLyBGaW5kIHRoZSByZW5kZXIgY29uZmlnIGZvciB0aGlzIHRvb2wgY2FsbCBieSBuYW1lXG4gICAgLy8gQWxzbyBjaGVjayBmb3Igd2lsZGNhcmQgKCopIHJlbmRlcnMgaWYgbm8gZXhhY3QgbWF0Y2hcbiAgICBjb25zdCByZW5kZXJDb25maWcgPVxuICAgICAgY3VycmVudFJlbmRlclRvb2xDYWxscy5maW5kKFxuICAgICAgICAocmM6IFRvb2xDYWxsUmVuZGVyKSA9PiByYy5uYW1lID09PSB0b29sQ2FsbC5mdW5jdGlvbi5uYW1lXG4gICAgICApIHx8IGN1cnJlbnRSZW5kZXJUb29sQ2FsbHMuZmluZCgocmM6IFRvb2xDYWxsUmVuZGVyKSA9PiByYy5uYW1lID09PSBcIipcIik7XG5cbiAgICBpZiAoIXJlbmRlckNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHMgaWYgdGhleSdyZSBhIHN0cmluZ1xuICAgIGNvbnN0IGFyZ3MgPSBwYXJ0aWFsSlNPTlBhcnNlKHRvb2xDYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgc3RhdHVzXG4gICAgbGV0IHN0YXR1czogVG9vbENhbGxTdGF0dXM7XG4gICAgaWYgKHRvb2xNZXNzYWdlKSB7XG4gICAgICBzdGF0dXMgPSBUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZTtcbiAgICB9IGVsc2UgaWYgKGlzTG9hZGluZykge1xuICAgICAgc3RhdHVzID0gVG9vbENhbGxTdGF0dXMuSW5Qcm9ncmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdHVzID0gVG9vbENhbGxTdGF0dXMuQ29tcGxldGU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHByb3BzIGJhc2VkIG9uIHN0YXR1cyAtIHVzZSBkaXNjcmltaW5hdGVkIHVuaW9uIHByb3Blcmx5XG4gICAgbGV0IHByb3BzOiBUb29sQ2FsbFByb3BzO1xuICAgIGlmIChzdGF0dXMgPT09IFRvb2xDYWxsU3RhdHVzLkluUHJvZ3Jlc3MpIHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBuYW1lOiB0b29sQ2FsbC5mdW5jdGlvbi5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICAgICAgYXJnczogYXJncywgLy8gUGFydGlhbCBhcmdzIGZvciBJblByb2dyZXNzXG4gICAgICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuSW5Qcm9ncmVzcyxcbiAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb21wbGV0ZSBzdGF0dXNcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBuYW1lOiB0b29sQ2FsbC5mdW5jdGlvbi5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICAgICAgYXJnczogYXJncywgLy8gRnVsbCBhcmdzIGZvciBDb21wbGV0ZVxuICAgICAgICBzdGF0dXM6IFRvb2xDYWxsU3RhdHVzLkNvbXBsZXRlLFxuICAgICAgICByZXN1bHQ6IHRvb2xNZXNzYWdlPy5jb250ZW50IHx8IFwiXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHJlbmRlciBpcyBhIENvbXBvbmVudCBjbGFzcyBvciBUZW1wbGF0ZVJlZlxuICAgIGlmICh0aGlzLmlzQ29tcG9uZW50Q2xhc3MocmVuZGVyQ29uZmlnLnJlbmRlcikpIHtcbiAgICAgIC8vIENyZWF0ZSBjb21wb25lbnQgZHluYW1pY2FsbHlcbiAgICAgIHRoaXMucmVuZGVyQ29tcG9uZW50KHRvb2xDYWxsLmlkLCByZW5kZXJDb25maWcucmVuZGVyLCBwcm9wcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGVtcGxhdGVSZWYocmVuZGVyQ29uZmlnLnJlbmRlcikpIHtcbiAgICAgIC8vIFVzZSB0ZW1wbGF0ZVxuICAgICAgdGhpcy5yZW5kZXJUZW1wbGF0ZSh0b29sQ2FsbC5pZCwgcmVuZGVyQ29uZmlnLnJlbmRlciwgcHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29tcG9uZW50KFxuICAgIHRvb2xDYWxsSWQ6IHN0cmluZyxcbiAgICBjb21wb25lbnRDbGFzczogVHlwZTxhbnk+LFxuICAgIHByb3BzOiBUb29sQ2FsbFByb3BzXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudFxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgdGhpcy5jb21wb25lbnRSZWZzLnNldCh0b29sQ2FsbElkLCBjb21wb25lbnRSZWYpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGRlY2xhcmVkIGlucHV0cyB0byBhdm9pZCBBbmd1bGFyIE5HMDMwMyBjb25zb2xlIGVycm9yc1xuICAgIGNvbnN0IGNtcERlZjogYW55ID0gKGNvbXBvbmVudENsYXNzIGFzIGFueSkuybVjbXA7XG4gICAgY29uc3QgZGVjbGFyZWRJbnB1dHMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICBPYmplY3Qua2V5cyhjbXBEZWY/LmlucHV0cyA/PyB7fSlcbiAgICApO1xuXG4gICAgLy8gUHJlZmVyIGEgc2luZ2xlICdwcm9wcycgaW5wdXQgaWYgZGVjbGFyZWRcbiAgICBpZiAoZGVjbGFyZWRJbnB1dHMuaGFzKCdwcm9wcycpKSB7XG4gICAgICBjb21wb25lbnRSZWYuc2V0SW5wdXQoJ3Byb3BzJywgcHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UsIHNldCBvbmx5IGlucHV0cyB0aGF0IHRoZSBjb21wb25lbnQgYWN0dWFsbHkgZGVjbGFyZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAoZGVjbGFyZWRJbnB1dHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb21wb25lbnRSZWYuc2V0SW5wdXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJUZW1wbGF0ZShcbiAgICB0b29sQ2FsbElkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHJvcHM6IFRvb2xDYWxsUHJvcHNcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZUNhY2hlLnNldCh0b29sQ2FsbElkLCB7XG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgJGltcGxpY2l0OiBwcm9wcyxcbiAgICAgICAgbmFtZTogcHJvcHMubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgICBhcmdzOiBwcm9wcy5hcmdzLFxuICAgICAgICBzdGF0dXM6IHByb3BzLnN0YXR1cyxcbiAgICAgICAgcmVzdWx0OiBwcm9wcy5yZXN1bHQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvbXBvbmVudENsYXNzKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBUeXBlPGFueT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGU7XG4gIH1cblxuICBwcml2YXRlIGlzVGVtcGxhdGVSZWYodmFsdWU6IGFueSk6IHZhbHVlIGlzIFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG59XG4iXX0=
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Component, Input, signal, computed, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { cn } from '../../lib/utils';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class CopilotChatToolbarComponent {
|
|
6
|
-
set inputClass(val) {
|
|
7
|
-
this.customClass.set(val);
|
|
8
|
-
}
|
|
9
|
-
customClass = signal(undefined);
|
|
10
|
-
computedClass = computed(() => {
|
|
11
|
-
const baseClasses = 'w-full h-[60px] bg-transparent flex items-center justify-between';
|
|
12
|
-
return cn(baseClasses, this.customClass());
|
|
13
|
-
});
|
|
14
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
15
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatToolbarComponent, isStandalone: true, selector: "div[copilotChatToolbar]", inputs: { inputClass: "inputClass" }, host: { properties: { "class": "computedClass()" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
16
|
-
}
|
|
17
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolbarComponent, decorators: [{
|
|
18
|
-
type: Component,
|
|
19
|
-
args: [{ selector: 'div[copilotChatToolbar]', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
20
|
-
'[class]': 'computedClass()'
|
|
21
|
-
}, template: `<ng-content></ng-content>` }]
|
|
22
|
-
}], propDecorators: { inputClass: [{
|
|
23
|
-
type: Input
|
|
24
|
-
}] } });
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBY3JDLE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsSUFBYSxVQUFVLENBQUMsR0FBdUI7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVcsR0FBRyxNQUFNLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXBELGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzVCLE1BQU0sV0FBVyxHQUFHLGtFQUFrRSxDQUFDO1FBQ3ZGLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQzt3R0FWUSwyQkFBMkI7NEZBQTNCLDJCQUEyQiwrS0FINUIsMkJBQTJCLDJEQU4zQixZQUFZOzs0RkFTWCwyQkFBMkI7a0JBWnZDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLFNBQVMsRUFBRSxpQkFBaUI7cUJBQzdCLFlBQ1MsMkJBQTJCOzhCQUl4QixVQUFVO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgc2lnbmFsLFxuICBjb21wdXRlZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vbGliL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGl2W2NvcGlsb3RDaGF0VG9vbGJhcl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzKCknXG4gIH0sXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRUb29sYmFyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgc2V0IGlucHV0Q2xhc3ModmFsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmN1c3RvbUNsYXNzLnNldCh2YWwpO1xuICB9XG4gIFxuICBjdXN0b21DbGFzcyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIFxuICBjb21wdXRlZENsYXNzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ3ctZnVsbCBoLVs2MHB4XSBiZy10cmFuc3BhcmVudCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4nO1xuICAgIHJldHVybiBjbihiYXNlQ2xhc3NlcywgdGhpcy5jdXN0b21DbGFzcygpKTtcbiAgfSk7XG59Il19
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { Component, Input, signal, computed, inject, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { CdkMenuModule } from '@angular/cdk/menu';
|
|
4
|
-
import { OverlayModule } from '@angular/cdk/overlay';
|
|
5
|
-
import { LucideAngularModule, Settings2, ChevronRight } from 'lucide-angular';
|
|
6
|
-
import { CopilotChatConfigurationService } from '../../core/chat-configuration/chat-configuration.service';
|
|
7
|
-
import { cn } from '../../lib/utils';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/cdk/menu";
|
|
10
|
-
import * as i2 from "lucide-angular";
|
|
11
|
-
export class CopilotChatToolsMenuComponent {
|
|
12
|
-
Settings2Icon = Settings2;
|
|
13
|
-
ChevronRightIcon = ChevronRight;
|
|
14
|
-
set inputToolsMenu(val) {
|
|
15
|
-
this.toolsMenu.set(val || []);
|
|
16
|
-
}
|
|
17
|
-
set inputDisabled(val) {
|
|
18
|
-
this.disabled.set(val || false);
|
|
19
|
-
}
|
|
20
|
-
set inputClass(val) {
|
|
21
|
-
this.customClass.set(val);
|
|
22
|
-
}
|
|
23
|
-
chatConfig = inject(CopilotChatConfigurationService);
|
|
24
|
-
toolsMenu = signal([]);
|
|
25
|
-
disabled = signal(false);
|
|
26
|
-
customClass = signal(undefined);
|
|
27
|
-
hasItems = computed(() => this.toolsMenu().length > 0);
|
|
28
|
-
label = computed(() => this.chatConfig.labels().chatInputToolbarToolsButtonLabel);
|
|
29
|
-
buttonClass = computed(() => {
|
|
30
|
-
const baseClasses = cn(
|
|
31
|
-
// Base button styles
|
|
32
|
-
'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-full text-sm font-medium', 'transition-all disabled:pointer-events-none disabled:opacity-50', 'shrink-0 outline-none', 'focus-visible:ring-[3px]',
|
|
33
|
-
// chatInputToolbarSecondary variant
|
|
34
|
-
'cursor-pointer', 'bg-transparent text-[#444444]', 'dark:text-white dark:border-[#404040]', 'transition-colors', 'focus:outline-none', 'hover:bg-[#f8f8f8] hover:text-[#333333]', 'dark:hover:bg-[#404040] dark:hover:text-[#FFFFFF]', 'disabled:cursor-not-allowed disabled:opacity-50', 'disabled:hover:bg-transparent disabled:hover:text-[#444444]', 'dark:disabled:hover:bg-transparent dark:disabled:hover:text-[#CCCCCC]',
|
|
35
|
-
// Size
|
|
36
|
-
'h-9 px-3 gap-2 font-normal');
|
|
37
|
-
return cn(baseClasses, this.customClass());
|
|
38
|
-
});
|
|
39
|
-
isMenuItem(item) {
|
|
40
|
-
return item && typeof item === 'object' && 'label' in item;
|
|
41
|
-
}
|
|
42
|
-
handleItemClick(item) {
|
|
43
|
-
if (item.action) {
|
|
44
|
-
item.action();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolsMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
48
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CopilotChatToolsMenuComponent, isStandalone: true, selector: "copilot-chat-tools-menu", inputs: { inputToolsMenu: "inputToolsMenu", inputDisabled: "inputDisabled", inputClass: "inputClass" }, ngImport: i0, template: `
|
|
49
|
-
@if (hasItems()) {
|
|
50
|
-
<button
|
|
51
|
-
type="button"
|
|
52
|
-
[disabled]="disabled()"
|
|
53
|
-
[class]="buttonClass()"
|
|
54
|
-
[cdkMenuTriggerFor]="menu"
|
|
55
|
-
>
|
|
56
|
-
<lucide-angular [img]="Settings2Icon" [size]="18"></lucide-angular>
|
|
57
|
-
<span class="text-sm font-normal">{{ label() }}</span>
|
|
58
|
-
</button>
|
|
59
|
-
|
|
60
|
-
<ng-template #menu>
|
|
61
|
-
<div class="min-w-[200px] bg-white dark:bg-[#1F1F1F] border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-1"
|
|
62
|
-
cdkMenu>
|
|
63
|
-
@for (item of toolsMenu(); track $index) {
|
|
64
|
-
@if (item === '-') {
|
|
65
|
-
<div class="h-px bg-gray-200 dark:bg-gray-700 my-1"></div>
|
|
66
|
-
} @else if (isMenuItem(item)) {
|
|
67
|
-
@if (item.items && item.items.length > 0) {
|
|
68
|
-
<!-- Submenu trigger -->
|
|
69
|
-
<button
|
|
70
|
-
type="button"
|
|
71
|
-
class="w-full px-3 py-2 text-left bg-transparent border-none rounded hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer text-sm flex items-center justify-between"
|
|
72
|
-
[cdkMenuTriggerFor]="submenu"
|
|
73
|
-
cdkMenuItem
|
|
74
|
-
>
|
|
75
|
-
{{ item.label }}
|
|
76
|
-
<lucide-angular [img]="ChevronRightIcon" [size]="12" class="ml-auto"></lucide-angular>
|
|
77
|
-
</button>
|
|
78
|
-
|
|
79
|
-
<!-- Submenu template -->
|
|
80
|
-
<ng-template #submenu>
|
|
81
|
-
<div class="min-w-[200px] bg-white dark:bg-[#1F1F1F] border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-1"
|
|
82
|
-
cdkMenu>
|
|
83
|
-
@for (subItem of item.items; track $index) {
|
|
84
|
-
@if (subItem === '-') {
|
|
85
|
-
<div class="h-px bg-gray-200 dark:bg-gray-700 my-1"></div>
|
|
86
|
-
} @else if (isMenuItem(subItem)) {
|
|
87
|
-
<button
|
|
88
|
-
type="button"
|
|
89
|
-
class="w-full px-3 py-2 text-left bg-transparent border-none rounded hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer text-sm"
|
|
90
|
-
(click)="handleItemClick(subItem)"
|
|
91
|
-
cdkMenuItem
|
|
92
|
-
>
|
|
93
|
-
{{ subItem.label }}
|
|
94
|
-
</button>
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
</div>
|
|
98
|
-
</ng-template>
|
|
99
|
-
} @else {
|
|
100
|
-
<!-- Regular menu item -->
|
|
101
|
-
<button
|
|
102
|
-
type="button"
|
|
103
|
-
class="w-full px-3 py-2 text-left bg-transparent border-none rounded hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer text-sm"
|
|
104
|
-
(click)="handleItemClick(item)"
|
|
105
|
-
cdkMenuItem
|
|
106
|
-
>
|
|
107
|
-
{{ item.label }}
|
|
108
|
-
</button>
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
</div>
|
|
113
|
-
</ng-template>
|
|
114
|
-
}
|
|
115
|
-
`, isInline: true, styles: [".cdk-overlay-pane{position:absolute;pointer-events:auto;z-index:1000}.cdk-overlay-container{position:fixed;z-index:1000}[cdkMenu]{animation:menuFadeIn .15s ease-out}@keyframes menuFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: CdkMenuModule }, { kind: "directive", type: i1.CdkMenu, selector: "[cdkMenu]", outputs: ["closed"], exportAs: ["cdkMenu"] }, { kind: "directive", type: i1.CdkMenuItem, selector: "[cdkMenuItem]", inputs: ["cdkMenuItemDisabled", "cdkMenuitemTypeaheadLabel"], outputs: ["cdkMenuItemTriggered"], exportAs: ["cdkMenuItem"] }, { kind: "directive", type: i1.CdkMenuTrigger, selector: "[cdkMenuTriggerFor]", inputs: ["cdkMenuTriggerFor", "cdkMenuPosition", "cdkMenuTriggerData"], outputs: ["cdkMenuOpened", "cdkMenuClosed"], exportAs: ["cdkMenuTriggerFor"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i2.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
116
|
-
}
|
|
117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolsMenuComponent, decorators: [{
|
|
118
|
-
type: Component,
|
|
119
|
-
args: [{ selector: 'copilot-chat-tools-menu', standalone: true, imports: [
|
|
120
|
-
CommonModule,
|
|
121
|
-
CdkMenuModule,
|
|
122
|
-
OverlayModule,
|
|
123
|
-
LucideAngularModule
|
|
124
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
125
|
-
@if (hasItems()) {
|
|
126
|
-
<button
|
|
127
|
-
type="button"
|
|
128
|
-
[disabled]="disabled()"
|
|
129
|
-
[class]="buttonClass()"
|
|
130
|
-
[cdkMenuTriggerFor]="menu"
|
|
131
|
-
>
|
|
132
|
-
<lucide-angular [img]="Settings2Icon" [size]="18"></lucide-angular>
|
|
133
|
-
<span class="text-sm font-normal">{{ label() }}</span>
|
|
134
|
-
</button>
|
|
135
|
-
|
|
136
|
-
<ng-template #menu>
|
|
137
|
-
<div class="min-w-[200px] bg-white dark:bg-[#1F1F1F] border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-1"
|
|
138
|
-
cdkMenu>
|
|
139
|
-
@for (item of toolsMenu(); track $index) {
|
|
140
|
-
@if (item === '-') {
|
|
141
|
-
<div class="h-px bg-gray-200 dark:bg-gray-700 my-1"></div>
|
|
142
|
-
} @else if (isMenuItem(item)) {
|
|
143
|
-
@if (item.items && item.items.length > 0) {
|
|
144
|
-
<!-- Submenu trigger -->
|
|
145
|
-
<button
|
|
146
|
-
type="button"
|
|
147
|
-
class="w-full px-3 py-2 text-left bg-transparent border-none rounded hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer text-sm flex items-center justify-between"
|
|
148
|
-
[cdkMenuTriggerFor]="submenu"
|
|
149
|
-
cdkMenuItem
|
|
150
|
-
>
|
|
151
|
-
{{ item.label }}
|
|
152
|
-
<lucide-angular [img]="ChevronRightIcon" [size]="12" class="ml-auto"></lucide-angular>
|
|
153
|
-
</button>
|
|
154
|
-
|
|
155
|
-
<!-- Submenu template -->
|
|
156
|
-
<ng-template #submenu>
|
|
157
|
-
<div class="min-w-[200px] bg-white dark:bg-[#1F1F1F] border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-1"
|
|
158
|
-
cdkMenu>
|
|
159
|
-
@for (subItem of item.items; track $index) {
|
|
160
|
-
@if (subItem === '-') {
|
|
161
|
-
<div class="h-px bg-gray-200 dark:bg-gray-700 my-1"></div>
|
|
162
|
-
} @else if (isMenuItem(subItem)) {
|
|
163
|
-
<button
|
|
164
|
-
type="button"
|
|
165
|
-
class="w-full px-3 py-2 text-left bg-transparent border-none rounded hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer text-sm"
|
|
166
|
-
(click)="handleItemClick(subItem)"
|
|
167
|
-
cdkMenuItem
|
|
168
|
-
>
|
|
169
|
-
{{ subItem.label }}
|
|
170
|
-
</button>
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
</div>
|
|
174
|
-
</ng-template>
|
|
175
|
-
} @else {
|
|
176
|
-
<!-- Regular menu item -->
|
|
177
|
-
<button
|
|
178
|
-
type="button"
|
|
179
|
-
class="w-full px-3 py-2 text-left bg-transparent border-none rounded hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer text-sm"
|
|
180
|
-
(click)="handleItemClick(item)"
|
|
181
|
-
cdkMenuItem
|
|
182
|
-
>
|
|
183
|
-
{{ item.label }}
|
|
184
|
-
</button>
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
</div>
|
|
189
|
-
</ng-template>
|
|
190
|
-
}
|
|
191
|
-
`, styles: [".cdk-overlay-pane{position:absolute;pointer-events:auto;z-index:1000}.cdk-overlay-container{position:fixed;z-index:1000}[cdkMenu]{animation:menuFadeIn .15s ease-out}@keyframes menuFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}\n"] }]
|
|
192
|
-
}], propDecorators: { inputToolsMenu: [{
|
|
193
|
-
type: Input
|
|
194
|
-
}], inputDisabled: [{
|
|
195
|
-
type: Input
|
|
196
|
-
}], inputClass: [{
|
|
197
|
-
type: Input
|
|
198
|
-
}] } });
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXRvb2xzLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdG9vbHMtbWVudS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBRTNHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQWdIckMsTUFBTSxPQUFPLDZCQUE2QjtJQUMvQixhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzFCLGdCQUFnQixHQUFHLFlBQVksQ0FBQztJQUV6QyxJQUFhLGNBQWMsQ0FBQyxHQUF3QztRQUNsRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQWEsYUFBYSxDQUFDLEdBQXdCO1FBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBYSxVQUFVLENBQUMsR0FBdUI7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVPLFVBQVUsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUU3RCxTQUFTLEdBQUcsTUFBTSxDQUEwQixFQUFFLENBQUMsQ0FBQztJQUNoRCxRQUFRLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLFdBQVcsR0FBRyxNQUFNLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXBELFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV2RCxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUVsRixXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMxQixNQUFNLFdBQVcsR0FBRyxFQUFFO1FBQ3BCLHFCQUFxQjtRQUNyQixrR0FBa0csRUFDbEcsaUVBQWlFLEVBQ2pFLHVCQUF1QixFQUN2QiwwQkFBMEI7UUFDMUIsb0NBQW9DO1FBQ3BDLGdCQUFnQixFQUNoQiwrQkFBK0IsRUFDL0IsdUNBQXVDLEVBQ3ZDLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIseUNBQXlDLEVBQ3pDLG1EQUFtRCxFQUNuRCxpREFBaUQsRUFDakQsNkRBQTZELEVBQzdELHVFQUF1RTtRQUN2RSxPQUFPO1FBQ1AsNEJBQTRCLENBQzdCLENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsSUFBUztRQUNsQixPQUFPLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQztJQUM3RCxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQW1CO1FBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzt3R0F4RFUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsMkxBbkc5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1FVCxtVkExRUMsWUFBWSw4QkFDWixhQUFhLHFqQkFDYixhQUFhLDhCQUNiLG1CQUFtQjs7NEZBdUdWLDZCQUE2QjtrQkE5R3pDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixtQkFBbUI7cUJBQ3BCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUVUOzhCQW9DWSxjQUFjO3NCQUExQixLQUFLO2dCQUdPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBR08sVUFBVTtzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENka01lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvbWVudSc7XG5pbXBvcnQgeyBPdmVybGF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSwgU2V0dGluZ3MyLCBDaGV2cm9uUmlnaHQgfSBmcm9tICdsdWNpZGUtYW5ndWxhcic7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9jaGF0LWNvbmZpZ3VyYXRpb24vY2hhdC1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHR5cGUgeyBUb29sc01lbnVJdGVtIH0gZnJvbSAnLi9jb3BpbG90LWNoYXQtaW5wdXQudHlwZXMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb3BpbG90LWNoYXQtdG9vbHMtbWVudScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQ2RrTWVudU1vZHVsZSxcbiAgICBPdmVybGF5TW9kdWxlLFxuICAgIEx1Y2lkZUFuZ3VsYXJNb2R1bGVcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChoYXNJdGVtcygpKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzc109XCJidXR0b25DbGFzcygpXCJcbiAgICAgICAgW2Nka01lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIlxuICAgICAgPlxuICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJTZXR0aW5nczJJY29uXCIgW3NpemVdPVwiMThcIj48L2x1Y2lkZS1hbmd1bGFyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1ub3JtYWxcIj57eyBsYWJlbCgpIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICBcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbWVudT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LVsyMDBweF0gYmctd2hpdGUgZGFyazpiZy1bIzFGMUYxRl0gYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTcwMCByb3VuZGVkLWxnIHNoYWRvdy1sZyBwLTFcIlxuICAgICAgICAgICAgIGNka01lbnU+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiB0b29sc01lbnUoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICBAaWYgKGl0ZW0gPT09ICctJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1weCBiZy1ncmF5LTIwMCBkYXJrOmJnLWdyYXktNzAwIG15LTFcIj48L2Rpdj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGlzTWVudUl0ZW0oaXRlbSkpIHtcbiAgICAgICAgICAgICAgQGlmIChpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIDwhLS0gU3VibWVudSB0cmlnZ2VyIC0tPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIHRleHQtbGVmdCBiZy10cmFuc3BhcmVudCBib3JkZXItbm9uZSByb3VuZGVkIGhvdmVyOmJnLWdyYXktMTAwIGRhcms6aG92ZXI6YmctZ3JheS04MDAgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgW2Nka01lbnVUcmlnZ2VyRm9yXT1cInN1Ym1lbnVcIlxuICAgICAgICAgICAgICAgICAgY2RrTWVudUl0ZW1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJDaGV2cm9uUmlnaHRJY29uXCIgW3NpemVdPVwiMTJcIiBjbGFzcz1cIm1sLWF1dG9cIj48L2x1Y2lkZS1hbmd1bGFyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gU3VibWVudSB0ZW1wbGF0ZSAtLT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3N1Ym1lbnU+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctWzIwMHB4XSBiZy13aGl0ZSBkYXJrOmJnLVsjMUYxRjFGXSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwIHJvdW5kZWQtbGcgc2hhZG93LWxnIHAtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNka01lbnU+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHN1Ykl0ZW0gb2YgaXRlbS5pdGVtczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChzdWJJdGVtID09PSAnLScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLXB4IGJnLWdyYXktMjAwIGRhcms6YmctZ3JheS03MDAgbXktMVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGlzTWVudUl0ZW0oc3ViSXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHB4LTMgcHktMiB0ZXh0LWxlZnQgYmctdHJhbnNwYXJlbnQgYm9yZGVyLW5vbmUgcm91bmRlZCBob3ZlcjpiZy1ncmF5LTEwMCBkYXJrOmhvdmVyOmJnLWdyYXktODAwIGN1cnNvci1wb2ludGVyIHRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSXRlbUNsaWNrKHN1Ykl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrTWVudUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3ViSXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIFJlZ3VsYXIgbWVudSBpdGVtIC0tPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIHRleHQtbGVmdCBiZy10cmFuc3BhcmVudCBib3JkZXItbm9uZSByb3VuZGVkIGhvdmVyOmJnLWdyYXktMTAwIGRhcms6aG92ZXI6YmctZ3JheS04MDAgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSXRlbUNsaWNrKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIGNka01lbnVJdGVtXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgfVxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLyogQ0RLIE92ZXJsYXkgc3R5bGVzIGZvciBwb3NpdGlvbmluZyAqL1xuICAgIC5jZGstb3ZlcmxheS1wYW5lIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgei1pbmRleDogMTAwMDtcbiAgICB9XG4gICAgXG4gICAgLyogRW5zdXJlIG1lbnUgYXBwZWFycyBhYm92ZSBvdGhlciBjb250ZW50ICovXG4gICAgLmNkay1vdmVybGF5LWNvbnRhaW5lciB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICB6LWluZGV4OiAxMDAwO1xuICAgIH1cbiAgICBcbiAgICAvKiBNZW51IGFuaW1hdGlvbiAqL1xuICAgIFtjZGtNZW51XSB7XG4gICAgICBhbmltYXRpb246IG1lbnVGYWRlSW4gMC4xNXMgZWFzZS1vdXQ7XG4gICAgfVxuICAgIFxuICAgIEBrZXlmcmFtZXMgbWVudUZhZGVJbiB7XG4gICAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDRweCk7XG4gICAgICB9XG4gICAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAgIH1cbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0VG9vbHNNZW51Q29tcG9uZW50IHtcbiAgcmVhZG9ubHkgU2V0dGluZ3MySWNvbiA9IFNldHRpbmdzMjtcbiAgcmVhZG9ubHkgQ2hldnJvblJpZ2h0SWNvbiA9IENoZXZyb25SaWdodDtcbiAgXG4gIEBJbnB1dCgpIHNldCBpbnB1dFRvb2xzTWVudSh2YWw6IChUb29sc01lbnVJdGVtIHwgJy0nKVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50b29sc01lbnUuc2V0KHZhbCB8fCBbXSk7XG4gIH1cbiAgQElucHV0KCkgc2V0IGlucHV0RGlzYWJsZWQodmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5kaXNhYmxlZC5zZXQodmFsIHx8IGZhbHNlKTtcbiAgfVxuICBASW5wdXQoKSBzZXQgaW5wdXRDbGFzcyh2YWw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY3VzdG9tQ2xhc3Muc2V0KHZhbCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgY2hhdENvbmZpZyA9IGluamVjdChDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlKTtcbiAgXG4gIHRvb2xzTWVudSA9IHNpZ25hbDwoVG9vbHNNZW51SXRlbSB8ICctJylbXT4oW10pO1xuICBkaXNhYmxlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIGN1c3RvbUNsYXNzID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgXG4gIGhhc0l0ZW1zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50b29sc01lbnUoKS5sZW5ndGggPiAwKTtcbiAgXG4gIGxhYmVsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jaGF0Q29uZmlnLmxhYmVscygpLmNoYXRJbnB1dFRvb2xiYXJUb29sc0J1dHRvbkxhYmVsKTtcbiAgXG4gIGJ1dHRvbkNsYXNzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gY24oXG4gICAgICAvLyBCYXNlIGJ1dHRvbiBzdHlsZXNcbiAgICAgICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC1mdWxsIHRleHQtc20gZm9udC1tZWRpdW0nLFxuICAgICAgJ3RyYW5zaXRpb24tYWxsIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gICAgICAnc2hyaW5rLTAgb3V0bGluZS1ub25lJyxcbiAgICAgICdmb2N1cy12aXNpYmxlOnJpbmctWzNweF0nLFxuICAgICAgLy8gY2hhdElucHV0VG9vbGJhclNlY29uZGFyeSB2YXJpYW50XG4gICAgICAnY3Vyc29yLXBvaW50ZXInLFxuICAgICAgJ2JnLXRyYW5zcGFyZW50IHRleHQtWyM0NDQ0NDRdJyxcbiAgICAgICdkYXJrOnRleHQtd2hpdGUgZGFyazpib3JkZXItWyM0MDQwNDBdJyxcbiAgICAgICd0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAnZm9jdXM6b3V0bGluZS1ub25lJyxcbiAgICAgICdob3ZlcjpiZy1bI2Y4ZjhmOF0gaG92ZXI6dGV4dC1bIzMzMzMzM10nLFxuICAgICAgJ2Rhcms6aG92ZXI6YmctWyM0MDQwNDBdIGRhcms6aG92ZXI6dGV4dC1bI0ZGRkZGRl0nLFxuICAgICAgJ2Rpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwJyxcbiAgICAgICdkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCBkaXNhYmxlZDpob3Zlcjp0ZXh0LVsjNDQ0NDQ0XScsXG4gICAgICAnZGFyazpkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCBkYXJrOmRpc2FibGVkOmhvdmVyOnRleHQtWyNDQ0NDQ0NdJyxcbiAgICAgIC8vIFNpemVcbiAgICAgICdoLTkgcHgtMyBnYXAtMiBmb250LW5vcm1hbCdcbiAgICApO1xuICAgIHJldHVybiBjbihiYXNlQ2xhc3NlcywgdGhpcy5jdXN0b21DbGFzcygpKTtcbiAgfSk7XG4gIFxuICBpc01lbnVJdGVtKGl0ZW06IGFueSk6IGl0ZW0gaXMgVG9vbHNNZW51SXRlbSB7XG4gICAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICdsYWJlbCcgaW4gaXRlbTtcbiAgfVxuICBcbiAgaGFuZGxlSXRlbUNsaWNrKGl0ZW06IFRvb2xzTWVudUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5hY3Rpb24pIHtcbiAgICAgIGl0ZW0uYWN0aW9uKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|