@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,224 +0,0 @@
|
|
|
1
|
-
import { DestroyRef, inject } from '@angular/core';
|
|
2
|
-
import { CopilotKitService } from '../core/copilotkit.service';
|
|
3
|
-
/**
|
|
4
|
-
* Explicitly adds a frontend tool to CopilotKit.
|
|
5
|
-
* Requires CopilotKitService to be passed as a parameter.
|
|
6
|
-
*
|
|
7
|
-
* @param service - The CopilotKitService instance
|
|
8
|
-
* @param tool - The tool to add
|
|
9
|
-
* @returns A cleanup function that removes the tool
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* export class MyComponent implements OnInit, OnDestroy {
|
|
14
|
-
* private cleanupFns: Array<() => void> = [];
|
|
15
|
-
*
|
|
16
|
-
* constructor(private copilotkit: CopilotKitService) {}
|
|
17
|
-
*
|
|
18
|
-
* ngOnInit() {
|
|
19
|
-
* const cleanup = addFrontendTool(this.copilotkit, {
|
|
20
|
-
* name: 'calculator',
|
|
21
|
-
* description: 'Performs calculations',
|
|
22
|
-
* parameters: z.object({
|
|
23
|
-
* expression: z.string()
|
|
24
|
-
* }),
|
|
25
|
-
* handler: async (args) => {
|
|
26
|
-
* return eval(args.expression);
|
|
27
|
-
* }
|
|
28
|
-
* });
|
|
29
|
-
*
|
|
30
|
-
* this.cleanupFns.push(cleanup);
|
|
31
|
-
* }
|
|
32
|
-
*
|
|
33
|
-
* ngOnDestroy() {
|
|
34
|
-
* this.cleanupFns.forEach(fn => fn());
|
|
35
|
-
* }
|
|
36
|
-
* }
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
|
-
export function addFrontendTool(service, tool) {
|
|
40
|
-
// Add the tool to CopilotKit
|
|
41
|
-
service.copilotkit.addTool(tool);
|
|
42
|
-
// Register the render if provided
|
|
43
|
-
if (tool.render) {
|
|
44
|
-
const currentRenders = service.currentRenderToolCalls();
|
|
45
|
-
const existingIndex = currentRenders.findIndex((r) => r.name === tool.name);
|
|
46
|
-
if (existingIndex !== -1) {
|
|
47
|
-
console.error(`Tool with name '${tool.name}' already has a render. Skipping.`);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
const renderEntry = {
|
|
51
|
-
name: tool.name,
|
|
52
|
-
render: tool.render
|
|
53
|
-
};
|
|
54
|
-
service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
// Return cleanup function
|
|
58
|
-
return () => {
|
|
59
|
-
removeFrontendTool(service, tool.name);
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Registers a frontend tool with CopilotKit and automatically removes it when the component/service is destroyed.
|
|
64
|
-
* Must be called within an injection context.
|
|
65
|
-
*
|
|
66
|
-
* @param tool - The tool to register
|
|
67
|
-
* @returns The tool name
|
|
68
|
-
*
|
|
69
|
-
* @example
|
|
70
|
-
* ```typescript
|
|
71
|
-
* export class MyComponent implements OnInit {
|
|
72
|
-
* ngOnInit() {
|
|
73
|
-
* // Automatically cleaned up on component destroy
|
|
74
|
-
* registerFrontendTool({
|
|
75
|
-
* name: 'search',
|
|
76
|
-
* description: 'Search for items',
|
|
77
|
-
* parameters: z.object({
|
|
78
|
-
* query: z.string()
|
|
79
|
-
* }),
|
|
80
|
-
* handler: async (args) => {
|
|
81
|
-
* return this.searchService.search(args.query);
|
|
82
|
-
* },
|
|
83
|
-
* render: SearchResultsComponent
|
|
84
|
-
* });
|
|
85
|
-
* }
|
|
86
|
-
* }
|
|
87
|
-
* ```
|
|
88
|
-
*/
|
|
89
|
-
export function registerFrontendTool(tool) {
|
|
90
|
-
const service = inject(CopilotKitService);
|
|
91
|
-
const destroyRef = inject(DestroyRef);
|
|
92
|
-
// Add the tool
|
|
93
|
-
service.copilotkit.addTool(tool);
|
|
94
|
-
// Register the render if provided
|
|
95
|
-
if (tool.render) {
|
|
96
|
-
const currentRenders = service.currentRenderToolCalls();
|
|
97
|
-
const existingIndex = currentRenders.findIndex((r) => r.name === tool.name);
|
|
98
|
-
if (existingIndex !== -1) {
|
|
99
|
-
console.error(`Tool with name '${tool.name}' already has a render. Skipping.`);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const renderEntry = {
|
|
103
|
-
name: tool.name,
|
|
104
|
-
render: tool.render
|
|
105
|
-
};
|
|
106
|
-
service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Register cleanup with Angular's DestroyRef
|
|
110
|
-
destroyRef.onDestroy(() => {
|
|
111
|
-
removeFrontendTool(service, tool.name);
|
|
112
|
-
});
|
|
113
|
-
return tool.name;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Explicitly removes a frontend tool from CopilotKit.
|
|
117
|
-
*
|
|
118
|
-
* @param service - The CopilotKitService instance
|
|
119
|
-
* @param toolName - The name of the tool to remove
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```typescript
|
|
123
|
-
* removeFrontendTool(this.copilotkit, 'calculator');
|
|
124
|
-
* ```
|
|
125
|
-
*/
|
|
126
|
-
export function removeFrontendTool(service, toolName) {
|
|
127
|
-
// Remove the tool
|
|
128
|
-
service.copilotkit.removeTool(toolName);
|
|
129
|
-
// Remove the render if it exists
|
|
130
|
-
const currentRenders = service.currentRenderToolCalls();
|
|
131
|
-
const filtered = currentRenders.filter((r) => r.name !== toolName);
|
|
132
|
-
if (filtered.length !== currentRenders.length) {
|
|
133
|
-
service.setCurrentRenderToolCalls(filtered);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Creates a frontend tool with dynamic parameters that can change over time.
|
|
138
|
-
* Uses Angular signals for reactivity.
|
|
139
|
-
*
|
|
140
|
-
* @param name - Tool name
|
|
141
|
-
* @param description - Tool description
|
|
142
|
-
* @param parameters - Zod schema for parameters
|
|
143
|
-
* @param handler - Signal or function that provides the handler
|
|
144
|
-
* @param render - Optional render component or template
|
|
145
|
-
* @returns Object with update and destroy methods
|
|
146
|
-
*
|
|
147
|
-
* @example
|
|
148
|
-
* ```typescript
|
|
149
|
-
* export class MyComponent {
|
|
150
|
-
* private toolConfig = signal({
|
|
151
|
-
* handler: async (args: any) => this.processDefault(args)
|
|
152
|
-
* });
|
|
153
|
-
*
|
|
154
|
-
* ngOnInit() {
|
|
155
|
-
* const tool = createDynamicFrontendTool(
|
|
156
|
-
* 'processor',
|
|
157
|
-
* 'Processes data',
|
|
158
|
-
* z.object({ data: z.string() }),
|
|
159
|
-
* () => this.toolConfig().handler
|
|
160
|
-
* );
|
|
161
|
-
*
|
|
162
|
-
* // Later, update the handler
|
|
163
|
-
* this.toolConfig.set({
|
|
164
|
-
* handler: async (args: any) => this.processAdvanced(args)
|
|
165
|
-
* });
|
|
166
|
-
* tool.update();
|
|
167
|
-
* }
|
|
168
|
-
* }
|
|
169
|
-
* ```
|
|
170
|
-
*/
|
|
171
|
-
export function createDynamicFrontendTool(name, description, parameters, handler, render) {
|
|
172
|
-
const service = inject(CopilotKitService);
|
|
173
|
-
const destroyRef = inject(DestroyRef);
|
|
174
|
-
let isRegistered = false;
|
|
175
|
-
const update = () => {
|
|
176
|
-
// Remove old tool if registered
|
|
177
|
-
if (isRegistered) {
|
|
178
|
-
service.copilotkit.removeTool(name);
|
|
179
|
-
}
|
|
180
|
-
// Create new tool configuration
|
|
181
|
-
const desc = typeof description === 'function' ? description() : description;
|
|
182
|
-
const currentHandler = handler();
|
|
183
|
-
const currentRender = render ? render() : undefined;
|
|
184
|
-
const tool = {
|
|
185
|
-
name,
|
|
186
|
-
description: desc,
|
|
187
|
-
parameters,
|
|
188
|
-
handler: currentHandler,
|
|
189
|
-
render: currentRender
|
|
190
|
-
};
|
|
191
|
-
// Add the tool
|
|
192
|
-
service.copilotkit.addTool(tool);
|
|
193
|
-
// Update render if provided
|
|
194
|
-
if (currentRender) {
|
|
195
|
-
const currentRenders = service.currentRenderToolCalls();
|
|
196
|
-
const renderEntry = {
|
|
197
|
-
name: name,
|
|
198
|
-
render: currentRender
|
|
199
|
-
};
|
|
200
|
-
const existingIndex = currentRenders.findIndex((r) => r.name === name);
|
|
201
|
-
if (existingIndex !== -1) {
|
|
202
|
-
const updated = [...currentRenders];
|
|
203
|
-
updated[existingIndex] = renderEntry;
|
|
204
|
-
service.setCurrentRenderToolCalls(updated);
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
isRegistered = true;
|
|
211
|
-
};
|
|
212
|
-
const destroy = () => {
|
|
213
|
-
if (isRegistered) {
|
|
214
|
-
removeFrontendTool(service, name);
|
|
215
|
-
isRegistered = false;
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
// Initial setup
|
|
219
|
-
update();
|
|
220
|
-
// Register cleanup
|
|
221
|
-
destroyRef.onDestroy(destroy);
|
|
222
|
-
return { update, destroy };
|
|
223
|
-
}
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtdG9vbC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9mcm9udGVuZC10b29sLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSS9EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQTBCLEVBQzFCLElBQTRCO0lBRTVCLDZCQUE2QjtJQUM3QixPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqQyxrQ0FBa0M7SUFDbEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDeEQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVGLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksbUNBQW1DLENBQUMsQ0FBQztRQUNqRixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sV0FBVyxHQUEwQjtnQkFDekMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTthQUNwQixDQUFDO1lBRUYsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsR0FBRyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lB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QUMsR0FBRyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztRQUVELFlBQVksR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1FBQ25CLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLGdCQUFnQjtJQUNoQixNQUFNLEVBQUUsQ0FBQztJQUVULG1CQUFtQjtJQUNuQixVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29waWxvdEtpdFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL2NvcGlsb3RraXQuc2VydmljZSc7XG5pbXBvcnQgeyBBbmd1bGFyRnJvbnRlbmRUb29sLCBBbmd1bGFyVG9vbENhbGxSZW5kZXIsIFRvb2xDYWxsUmVuZGVyIH0gZnJvbSAnLi4vY29yZS9jb3BpbG90a2l0LnR5cGVzJztcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gJ3pvZCc7XG5cbi8qKlxuICogRXhwbGljaXRseSBhZGRzIGEgZnJvbnRlbmQgdG9vbCB0byBDb3BpbG90S2l0LlxuICogUmVxdWlyZXMgQ29waWxvdEtpdFNlcnZpY2UgdG8gYmUgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLlxuICogXG4gKiBAcGFyYW0gc2VydmljZSAtIFRoZSBDb3BpbG90S2l0U2VydmljZSBpbnN0YW5jZVxuICogQHBhcmFtIHRvb2wgLSBUaGUgdG9vbCB0byBhZGRcbiAqIEByZXR1cm5zIEEgY2xlYW51cCBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIHRvb2xcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAqICAgcHJpdmF0ZSBjbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICogICBcbiAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb3BpbG90a2l0OiBDb3BpbG90S2l0U2VydmljZSkge31cbiAqICAgXG4gKiAgIG5nT25Jbml0KCkge1xuICogICAgIGNvbnN0IGNsZWFudXAgPSBhZGRGcm9udGVuZFRvb2wodGhpcy5jb3BpbG90a2l0LCB7XG4gKiAgICAgICBuYW1lOiAnY2FsY3VsYXRvcicsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogJ1BlcmZvcm1zIGNhbGN1bGF0aW9ucycsXG4gKiAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gKiAgICAgICAgIGV4cHJlc3Npb246IHouc3RyaW5nKClcbiAqICAgICAgIH0pLFxuICogICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3MpID0+IHtcbiAqICAgICAgICAgcmV0dXJuIGV2YWwoYXJncy5leHByZXNzaW9uKTtcbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqICAgICBcbiAqICAgICB0aGlzLmNsZWFudXBGbnMucHVzaChjbGVhbnVwKTtcbiAqICAgfVxuICogICBcbiAqICAgbmdPbkRlc3Ryb3koKSB7XG4gKiAgICAgdGhpcy5jbGVhbnVwRm5zLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRnJvbnRlbmRUb29sPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIHNlcnZpY2U6IENvcGlsb3RLaXRTZXJ2aWNlLFxuICB0b29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+XG4pOiAoKSA9PiB2b2lkIHtcbiAgLy8gQWRkIHRoZSB0b29sIHRvIENvcGlsb3RLaXRcbiAgc2VydmljZS5jb3BpbG90a2l0LmFkZFRvb2wodG9vbCk7XG4gIFxuICAvLyBSZWdpc3RlciB0aGUgcmVuZGVyIGlmIHByb3ZpZGVkXG4gIGlmICh0b29sLnJlbmRlcikge1xuICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJzID0gc2VydmljZS5jdXJyZW50UmVuZGVyVG9vbENhbGxzKCk7XG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGN1cnJlbnRSZW5kZXJzLmZpbmRJbmRleCgocjogVG9vbENhbGxSZW5kZXIpID0+IHIubmFtZSA9PT0gdG9vbC5uYW1lKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRvb2wgd2l0aCBuYW1lICcke3Rvb2wubmFtZX0nIGFscmVhZHkgaGFzIGEgcmVuZGVyLiBTa2lwcGluZy5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVuZGVyRW50cnk6IEFuZ3VsYXJUb29sQ2FsbFJlbmRlciA9IHtcbiAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICByZW5kZXI6IHRvb2wucmVuZGVyXG4gICAgICB9O1xuICAgICAgXG4gICAgICBzZXJ2aWNlLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoWy4uLmN1cnJlbnRSZW5kZXJzLCByZW5kZXJFbnRyeV0pO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICByZW1vdmVGcm9udGVuZFRvb2woc2VydmljZSwgdG9vbC5uYW1lKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBmcm9udGVuZCB0b29sIHdpdGggQ29waWxvdEtpdCBhbmQgYXV0b21hdGljYWxseSByZW1vdmVzIGl0IHdoZW4gdGhlIGNvbXBvbmVudC9zZXJ2aWNlIGlzIGRlc3Ryb3llZC5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGhpbiBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAqIFxuICogQHBhcmFtIHRvb2wgLSBUaGUgdG9vbCB0byByZWdpc3RlclxuICogQHJldHVybnMgVGhlIHRvb2wgbmFtZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgLy8gQXV0b21hdGljYWxseSBjbGVhbmVkIHVwIG9uIGNvbXBvbmVudCBkZXN0cm95XG4gKiAgICAgcmVnaXN0ZXJGcm9udGVuZFRvb2woe1xuICogICAgICAgbmFtZTogJ3NlYXJjaCcsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogJ1NlYXJjaCBmb3IgaXRlbXMnLFxuICogICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICogICAgICAgICBxdWVyeTogei5zdHJpbmcoKVxuICogICAgICAgfSksXG4gKiAgICAgICBoYW5kbGVyOiBhc3luYyAoYXJncykgPT4ge1xuICogICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaChhcmdzLnF1ZXJ5KTtcbiAqICAgICAgIH0sXG4gKiAgICAgICByZW5kZXI6IFNlYXJjaFJlc3VsdHNDb21wb25lbnRcbiAqICAgICB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZyb250ZW5kVG9vbDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICB0b29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+XG4pOiBzdHJpbmcge1xuICBjb25zdCBzZXJ2aWNlID0gaW5qZWN0KENvcGlsb3RLaXRTZXJ2aWNlKTtcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgXG4gIC8vIEFkZCB0aGUgdG9vbFxuICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbCh0b29sKTtcbiAgXG4gIC8vIFJlZ2lzdGVyIHRoZSByZW5kZXIgaWYgcHJvdmlkZWRcbiAgaWYgKHRvb2wucmVuZGVyKSB7XG4gICAgY29uc3QgY3VycmVudFJlbmRlcnMgPSBzZXJ2aWNlLmN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoKTtcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY3VycmVudFJlbmRlcnMuZmluZEluZGV4KChyOiBUb29sQ2FsbFJlbmRlcikgPT4gci5uYW1lID09PSB0b29sLm5hbWUpO1xuICAgIFxuICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgY29uc29sZS5lcnJvcihgVG9vbCB3aXRoIG5hbWUgJyR7dG9vbC5uYW1lfScgYWxyZWFkeSBoYXMgYSByZW5kZXIuIFNraXBwaW5nLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZW5kZXJFbnRyeTogQW5ndWxhclRvb2xDYWxsUmVuZGVyID0ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIHJlbmRlcjogdG9vbC5yZW5kZXJcbiAgICAgIH07XG4gICAgICBcbiAgICAgIHNlcnZpY2Uuc2V0Q3VycmVudFJlbmRlclRvb2xDYWxscyhbLi4uY3VycmVudFJlbmRlcnMsIHJlbmRlckVudHJ5XSk7XG4gICAgfVxuICB9XG4gIFxuICAvLyBSZWdpc3RlciBjbGVhbnVwIHdpdGggQW5ndWxhcidzIERlc3Ryb3lSZWZcbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgIHJlbW92ZUZyb250ZW5kVG9vbChzZXJ2aWNlLCB0b29sLm5hbWUpO1xuICB9KTtcbiAgXG4gIHJldHVybiB0b29sLm5hbWU7XG59XG5cbi8qKlxuICogRXhwbGljaXRseSByZW1vdmVzIGEgZnJvbnRlbmQgdG9vbCBmcm9tIENvcGlsb3RLaXQuXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gdG9vbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdG9vbCB0byByZW1vdmVcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHJlbW92ZUZyb250ZW5kVG9vbCh0aGlzLmNvcGlsb3RraXQsICdjYWxjdWxhdG9yJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb250ZW5kVG9vbChcbiAgc2VydmljZTogQ29waWxvdEtpdFNlcnZpY2UsXG4gIHRvb2xOYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICAvLyBSZW1vdmUgdGhlIHRvb2xcbiAgc2VydmljZS5jb3BpbG90a2l0LnJlbW92ZVRvb2wodG9vbE5hbWUpO1xuICBcbiAgLy8gUmVtb3ZlIHRoZSByZW5kZXIgaWYgaXQgZXhpc3RzXG4gIGNvbnN0IGN1cnJlbnRSZW5kZXJzID0gc2VydmljZS5jdXJyZW50UmVuZGVyVG9vbENhbGxzKCk7XG4gIGNvbnN0IGZpbHRlcmVkID0gY3VycmVudFJlbmRlcnMuZmlsdGVyKChyOiBUb29sQ2FsbFJlbmRlcikgPT4gci5uYW1lICE9PSB0b29sTmFtZSk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggIT09IGN1cnJlbnRSZW5kZXJzLmxlbmd0aCkge1xuICAgIHNlcnZpY2Uuc2V0Q3VycmVudFJlbmRlclRvb2xDYWxscyhmaWx0ZXJlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnJvbnRlbmQgdG9vbCB3aXRoIGR5bmFtaWMgcGFyYW1ldGVycyB0aGF0IGNhbiBjaGFuZ2Ugb3ZlciB0aW1lLlxuICogVXNlcyBBbmd1bGFyIHNpZ25hbHMgZm9yIHJlYWN0aXZpdHkuXG4gKiBcbiAqIEBwYXJhbSBuYW1lIC0gVG9vbCBuYW1lXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBUb29sIGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0gcGFyYW1ldGVycyAtIFpvZCBzY2hlbWEgZm9yIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBoYW5kbGVyIC0gU2lnbmFsIG9yIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSByZW5kZXIgLSBPcHRpb25hbCByZW5kZXIgY29tcG9uZW50IG9yIHRlbXBsYXRlXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCB1cGRhdGUgYW5kIGRlc3Ryb3kgbWV0aG9kc1xuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSB0b29sQ29uZmlnID0gc2lnbmFsKHtcbiAqICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB0aGlzLnByb2Nlc3NEZWZhdWx0KGFyZ3MpXG4gKiAgIH0pO1xuICogICBcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgY29uc3QgdG9vbCA9IGNyZWF0ZUR5bmFtaWNGcm9udGVuZFRvb2woXG4gKiAgICAgICAncHJvY2Vzc29yJyxcbiAqICAgICAgICdQcm9jZXNzZXMgZGF0YScsXG4gKiAgICAgICB6Lm9iamVjdCh7IGRhdGE6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAoKSA9PiB0aGlzLnRvb2xDb25maWcoKS5oYW5kbGVyXG4gKiAgICAgKTtcbiAqICAgICBcbiAqICAgICAvLyBMYXRlciwgdXBkYXRlIHRoZSBoYW5kbGVyXG4gKiAgICAgdGhpcy50b29sQ29uZmlnLnNldCh7XG4gKiAgICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB0aGlzLnByb2Nlc3NBZHZhbmNlZChhcmdzKVxuICogICAgIH0pO1xuICogICAgIHRvb2wudXBkYXRlKCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHluYW1pY0Zyb250ZW5kVG9vbDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSxcbiAgcGFyYW1ldGVyczogei5ab2RTY2hlbWE8VD4sXG4gIGhhbmRsZXI6ICgpID0+ICgoYXJnczogVCkgPT4gUHJvbWlzZTxhbnk+KSxcbiAgcmVuZGVyPzogKCkgPT4gYW55XG4pOiB7IHVwZGF0ZTogKCkgPT4gdm9pZDsgZGVzdHJveTogKCkgPT4gdm9pZCB9IHtcbiAgY29uc3Qgc2VydmljZSA9IGluamVjdChDb3BpbG90S2l0U2VydmljZSk7XG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIFxuICBsZXQgaXNSZWdpc3RlcmVkID0gZmFsc2U7XG4gIFxuICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIG9sZCB0b29sIGlmIHJlZ2lzdGVyZWRcbiAgICBpZiAoaXNSZWdpc3RlcmVkKSB7XG4gICAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbChuYW1lKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyB0b29sIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBkZXNjID0gdHlwZW9mIGRlc2NyaXB0aW9uID09PSAnZnVuY3Rpb24nID8gZGVzY3JpcHRpb24oKSA6IGRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRIYW5kbGVyID0gaGFuZGxlcigpO1xuICAgIGNvbnN0IGN1cnJlbnRSZW5kZXIgPSByZW5kZXIgPyByZW5kZXIoKSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICBjb25zdCB0b29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICAgIGhhbmRsZXI6IGN1cnJlbnRIYW5kbGVyLFxuICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgfTtcbiAgICBcbiAgICAvLyBBZGQgdGhlIHRvb2xcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbCh0b29sKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgcmVuZGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJzID0gc2VydmljZS5jdXJyZW50UmVuZGVyVG9vbENhbGxzKCk7XG4gICAgICBjb25zdCByZW5kZXJFbnRyeTogQW5ndWxhclRvb2xDYWxsUmVuZGVyID0ge1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZW5kZXI6IGN1cnJlbnRSZW5kZXJcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBjdXJyZW50UmVuZGVycy5maW5kSW5kZXgoKHI6IFRvb2xDYWxsUmVuZGVyKSA9PiByLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBbLi4uY3VycmVudFJlbmRlcnNdO1xuICAgICAgICB1cGRhdGVkW2V4aXN0aW5nSW5kZXhdID0gcmVuZGVyRW50cnk7XG4gICAgICAgIHNlcnZpY2Uuc2V0Q3VycmVudFJlbmRlclRvb2xDYWxscyh1cGRhdGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZpY2Uuc2V0Q3VycmVudFJlbmRlclRvb2xDYWxscyhbLi4uY3VycmVudFJlbmRlcnMsIHJlbmRlckVudHJ5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlzUmVnaXN0ZXJlZCA9IHRydWU7XG4gIH07XG4gIFxuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIGlmIChpc1JlZ2lzdGVyZWQpIHtcbiAgICAgIHJlbW92ZUZyb250ZW5kVG9vbChzZXJ2aWNlLCBuYW1lKTtcbiAgICAgIGlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8vIEluaXRpYWwgc2V0dXBcbiAgdXBkYXRlKCk7XG4gIFxuICAvLyBSZWdpc3RlciBjbGVhbnVwXG4gIGRlc3Ryb3lSZWYub25EZXN0cm95KGRlc3Ryb3kpO1xuICBcbiAgcmV0dXJuIHsgdXBkYXRlLCBkZXN0cm95IH07XG59Il19
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import { DestroyRef, inject, signal } from '@angular/core';
|
|
2
|
-
import { CopilotKitService } from '../core/copilotkit.service';
|
|
3
|
-
import { ToolCallStatus } from '../core/copilotkit.types';
|
|
4
|
-
/**
|
|
5
|
-
* Registers a human-in-the-loop tool that requires user interaction.
|
|
6
|
-
* Must be called within an injection context.
|
|
7
|
-
* Automatically cleans up when the component/service is destroyed.
|
|
8
|
-
*
|
|
9
|
-
* @param tool - The human-in-the-loop tool configuration
|
|
10
|
-
* @returns The tool ID
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* export class ApprovalComponent {
|
|
15
|
-
* toolId = registerHumanInTheLoop({
|
|
16
|
-
* name: 'requireApproval',
|
|
17
|
-
* description: 'Requires user approval',
|
|
18
|
-
* args: z.object({ action: z.string() }),
|
|
19
|
-
* render: ApprovalDialogComponent
|
|
20
|
-
* });
|
|
21
|
-
* }
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
export function registerHumanInTheLoop(tool) {
|
|
25
|
-
const service = inject(CopilotKitService);
|
|
26
|
-
const destroyRef = inject(DestroyRef);
|
|
27
|
-
// Create state management
|
|
28
|
-
const statusSignal = signal(ToolCallStatus.InProgress);
|
|
29
|
-
let resolvePromise = null;
|
|
30
|
-
// Create respond function
|
|
31
|
-
const respond = async (result) => {
|
|
32
|
-
if (resolvePromise) {
|
|
33
|
-
resolvePromise(result);
|
|
34
|
-
statusSignal.set(ToolCallStatus.Complete);
|
|
35
|
-
resolvePromise = null;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
// Create handler that returns a Promise
|
|
39
|
-
const handler = async (_args) => {
|
|
40
|
-
return new Promise((resolve) => {
|
|
41
|
-
statusSignal.set(ToolCallStatus.Executing);
|
|
42
|
-
resolvePromise = resolve;
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
// Create enhanced render function
|
|
46
|
-
const enhancedRender = createEnhancedRender(tool.render, statusSignal, respond);
|
|
47
|
-
// Create the frontend tool
|
|
48
|
-
const frontendTool = {
|
|
49
|
-
...tool,
|
|
50
|
-
handler,
|
|
51
|
-
render: enhancedRender
|
|
52
|
-
};
|
|
53
|
-
// Add the tool (returns void, so we use the tool name as ID)
|
|
54
|
-
service.copilotkit.addTool(frontendTool);
|
|
55
|
-
const toolId = frontendTool.name;
|
|
56
|
-
// Register tool render if provided
|
|
57
|
-
if (frontendTool.render) {
|
|
58
|
-
service.registerToolRender(frontendTool.name, {
|
|
59
|
-
name: frontendTool.name,
|
|
60
|
-
render: frontendTool.render
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
// Cleanup on destroy
|
|
64
|
-
destroyRef.onDestroy(() => {
|
|
65
|
-
service.copilotkit.removeTool(toolId);
|
|
66
|
-
if (frontendTool.render) {
|
|
67
|
-
service.unregisterToolRender(frontendTool.name);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
return toolId;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Adds a human-in-the-loop tool with explicit service parameter.
|
|
74
|
-
* Returns a cleanup function.
|
|
75
|
-
*
|
|
76
|
-
* @param service - The CopilotKitService instance
|
|
77
|
-
* @param tool - The human-in-the-loop tool configuration
|
|
78
|
-
* @returns Cleanup function to remove the tool
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* export class MyComponent implements OnInit, OnDestroy {
|
|
83
|
-
* private cleanup?: () => void;
|
|
84
|
-
*
|
|
85
|
-
* constructor(private copilotkit: CopilotKitService) {}
|
|
86
|
-
*
|
|
87
|
-
* ngOnInit() {
|
|
88
|
-
* this.cleanup = addHumanInTheLoop(this.copilotkit, {
|
|
89
|
-
* name: 'requireApproval',
|
|
90
|
-
* description: 'Requires user approval',
|
|
91
|
-
* args: z.object({ action: z.string() }),
|
|
92
|
-
* render: ApprovalDialogComponent
|
|
93
|
-
* });
|
|
94
|
-
* }
|
|
95
|
-
*
|
|
96
|
-
* ngOnDestroy() {
|
|
97
|
-
* this.cleanup?.();
|
|
98
|
-
* }
|
|
99
|
-
* }
|
|
100
|
-
* ```
|
|
101
|
-
*/
|
|
102
|
-
export function addHumanInTheLoop(service, tool) {
|
|
103
|
-
// Create state management
|
|
104
|
-
const statusSignal = signal(ToolCallStatus.InProgress);
|
|
105
|
-
let resolvePromise = null;
|
|
106
|
-
// Create respond function
|
|
107
|
-
const respond = async (result) => {
|
|
108
|
-
if (resolvePromise) {
|
|
109
|
-
resolvePromise(result);
|
|
110
|
-
statusSignal.set(ToolCallStatus.Complete);
|
|
111
|
-
resolvePromise = null;
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
// Create handler that returns a Promise
|
|
115
|
-
const handler = async (_args) => {
|
|
116
|
-
return new Promise((resolve) => {
|
|
117
|
-
statusSignal.set(ToolCallStatus.Executing);
|
|
118
|
-
resolvePromise = resolve;
|
|
119
|
-
});
|
|
120
|
-
};
|
|
121
|
-
// Create enhanced render function
|
|
122
|
-
const enhancedRender = createEnhancedRender(tool.render, statusSignal, respond);
|
|
123
|
-
// Create the frontend tool
|
|
124
|
-
const frontendTool = {
|
|
125
|
-
...tool,
|
|
126
|
-
handler,
|
|
127
|
-
render: enhancedRender
|
|
128
|
-
};
|
|
129
|
-
// Add the tool (returns void, so we use the tool name as ID)
|
|
130
|
-
service.copilotkit.addTool(frontendTool);
|
|
131
|
-
const toolId = frontendTool.name;
|
|
132
|
-
// Register tool render if provided
|
|
133
|
-
if (frontendTool.render) {
|
|
134
|
-
service.registerToolRender(frontendTool.name, {
|
|
135
|
-
name: frontendTool.name,
|
|
136
|
-
render: frontendTool.render
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
// Return cleanup function
|
|
140
|
-
return () => {
|
|
141
|
-
service.copilotkit.removeTool(toolId);
|
|
142
|
-
if (frontendTool.render) {
|
|
143
|
-
service.unregisterToolRender(frontendTool.name);
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Creates a human-in-the-loop tool with dynamic update capabilities.
|
|
149
|
-
*
|
|
150
|
-
* @param service - The CopilotKitService instance
|
|
151
|
-
* @param tool - The human-in-the-loop tool configuration
|
|
152
|
-
* @returns Object with status signal, update and destroy methods
|
|
153
|
-
*
|
|
154
|
-
* @example
|
|
155
|
-
* ```typescript
|
|
156
|
-
* export class MyComponent {
|
|
157
|
-
* humanInTheLoop = createHumanInTheLoop(this.copilotkit, {
|
|
158
|
-
* name: 'requireApproval',
|
|
159
|
-
* description: 'Requires user approval',
|
|
160
|
-
* args: z.object({ action: z.string() }),
|
|
161
|
-
* render: ApprovalDialogComponent
|
|
162
|
-
* });
|
|
163
|
-
*
|
|
164
|
-
* updateDescription(newDesc: string) {
|
|
165
|
-
* this.humanInTheLoop.update({ description: newDesc });
|
|
166
|
-
* }
|
|
167
|
-
*
|
|
168
|
-
* ngOnDestroy() {
|
|
169
|
-
* this.humanInTheLoop.destroy();
|
|
170
|
-
* }
|
|
171
|
-
* }
|
|
172
|
-
* ```
|
|
173
|
-
*/
|
|
174
|
-
export function createHumanInTheLoop(service, tool) {
|
|
175
|
-
// Create state management
|
|
176
|
-
const statusSignal = signal(ToolCallStatus.InProgress);
|
|
177
|
-
let currentTool = { ...tool };
|
|
178
|
-
let toolId = '';
|
|
179
|
-
let resolvePromise = null;
|
|
180
|
-
// Create respond function
|
|
181
|
-
const respond = async (result) => {
|
|
182
|
-
if (resolvePromise) {
|
|
183
|
-
resolvePromise(result);
|
|
184
|
-
statusSignal.set(ToolCallStatus.Complete);
|
|
185
|
-
resolvePromise = null;
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
// Create handler that returns a Promise
|
|
189
|
-
const handler = async (_args) => {
|
|
190
|
-
return new Promise((resolve) => {
|
|
191
|
-
statusSignal.set(ToolCallStatus.Executing);
|
|
192
|
-
resolvePromise = resolve;
|
|
193
|
-
});
|
|
194
|
-
};
|
|
195
|
-
// Function to add the tool
|
|
196
|
-
const addTool = () => {
|
|
197
|
-
// Create enhanced render function
|
|
198
|
-
const enhancedRender = createEnhancedRender(currentTool.render, statusSignal, respond);
|
|
199
|
-
// Create the frontend tool
|
|
200
|
-
const frontendTool = {
|
|
201
|
-
...currentTool,
|
|
202
|
-
handler,
|
|
203
|
-
render: enhancedRender
|
|
204
|
-
};
|
|
205
|
-
// Add tool (returns void, so we use the tool name as ID)
|
|
206
|
-
service.copilotkit.addTool(frontendTool);
|
|
207
|
-
toolId = frontendTool.name;
|
|
208
|
-
// Register tool render if provided
|
|
209
|
-
if (frontendTool.render) {
|
|
210
|
-
service.registerToolRender(frontendTool.name, {
|
|
211
|
-
name: frontendTool.name,
|
|
212
|
-
render: frontendTool.render
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
// Initialize the tool
|
|
217
|
-
addTool();
|
|
218
|
-
return {
|
|
219
|
-
status: statusSignal.asReadonly(),
|
|
220
|
-
toolId,
|
|
221
|
-
update: (updates) => {
|
|
222
|
-
// Remove old tool
|
|
223
|
-
service.copilotkit.removeTool(toolId);
|
|
224
|
-
if (currentTool.render) {
|
|
225
|
-
service.unregisterToolRender(currentTool.name);
|
|
226
|
-
}
|
|
227
|
-
// Update tool configuration
|
|
228
|
-
currentTool = { ...currentTool, ...updates };
|
|
229
|
-
// Re-add with new configuration
|
|
230
|
-
addTool();
|
|
231
|
-
},
|
|
232
|
-
destroy: () => {
|
|
233
|
-
service.copilotkit.removeTool(toolId);
|
|
234
|
-
if (currentTool.render) {
|
|
235
|
-
service.unregisterToolRender(currentTool.name);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Creates an enhanced render function that injects the respond function
|
|
242
|
-
* when the status is 'executing'.
|
|
243
|
-
*/
|
|
244
|
-
function createEnhancedRender(originalRender, _statusSignal, _respond) {
|
|
245
|
-
// For component classes, we need to create a wrapper
|
|
246
|
-
if (isComponentClass(originalRender)) {
|
|
247
|
-
// Return a wrapper component factory
|
|
248
|
-
// This is complex in Angular and would require dynamic component creation
|
|
249
|
-
// For now, we'll return the original and rely on prop injection
|
|
250
|
-
return originalRender;
|
|
251
|
-
}
|
|
252
|
-
// For templates, we can't easily wrap them
|
|
253
|
-
// The template context will be enhanced in the render component
|
|
254
|
-
return originalRender;
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Helper function to check if a value is a component class
|
|
258
|
-
*/
|
|
259
|
-
function isComponentClass(value) {
|
|
260
|
-
return typeof value === 'function' && value.prototype;
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Enhanced component wrapper for human-in-the-loop.
|
|
264
|
-
* This would be used internally by the tool render component to inject
|
|
265
|
-
* the respond function based on status.
|
|
266
|
-
*
|
|
267
|
-
* @internal
|
|
268
|
-
*/
|
|
269
|
-
export function enhancePropsForHumanInTheLoop(props, status, respond) {
|
|
270
|
-
if (status === ToolCallStatus.Executing && respond) {
|
|
271
|
-
return {
|
|
272
|
-
...props,
|
|
273
|
-
status: ToolCallStatus.Executing,
|
|
274
|
-
respond
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
if (status === ToolCallStatus.Complete) {
|
|
278
|
-
return {
|
|
279
|
-
...props,
|
|
280
|
-
status: ToolCallStatus.Complete,
|
|
281
|
-
result: typeof props.result === 'string' ? props.result : '',
|
|
282
|
-
respond: undefined
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
// InProgress
|
|
286
|
-
return {
|
|
287
|
-
...props,
|
|
288
|
-
status: ToolCallStatus.InProgress,
|
|
289
|
-
result: undefined,
|
|
290
|
-
respond: undefined
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taW4tdGhlLWxvb3AudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvaHVtYW4taW4tdGhlLWxvb3AudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxjQUFjLEVBSWYsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsSUFBOEI7SUFFOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXRDLDBCQUEwQjtJQUMxQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQWlCLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2RSxJQUFJLGNBQWMsR0FBdUMsSUFBSSxDQUFDO0lBRTlELDBCQUEwQjtJQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsTUFBZSxFQUFpQixFQUFFO1FBQ3ZELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLHdDQUF3QztJQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBUSxFQUFvQixFQUFFO1FBQ25ELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixZQUFZLENBQUMsR0FB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QU87U0FDa0IsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxNQUFNLEtBQUssY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixNQUFNLEVBQUUsY0FBYyxDQUFDLFFBQVE7WUFDL0IsTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUQsT0FBTyxFQUFFLFNBQVM7U0FDTyxDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhO0lBQ2IsT0FBTztRQUNMLEdBQUcsS0FBSztRQUNSLE1BQU0sRUFBRSxjQUFjLENBQUMsVUFBVTtRQUNqQyxNQUFNLEVBQUUsU0FBUztRQUNqQixPQUFPLEVBQUUsU0FBUztLQUNPLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuICBEZXN0cm95UmVmLCBcbiAgaW5qZWN0LCBcbiAgc2lnbmFsLCBcbiAgU2lnbmFsLFxuICBUeXBlLFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9jb3BpbG90a2l0LnNlcnZpY2UnO1xuaW1wb3J0IHsgXG4gIEFuZ3VsYXJIdW1hbkluVGhlTG9vcCwgXG4gIFRvb2xDYWxsU3RhdHVzLFxuICBIdW1hbkluVGhlTG9vcFN0YXRlLFxuICBIdW1hbkluVGhlTG9vcFByb3BzLFxuICBBbmd1bGFyRnJvbnRlbmRUb29sXG59IGZyb20gJy4uL2NvcmUvY29waWxvdGtpdC50eXBlcyc7XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgaHVtYW4taW4tdGhlLWxvb3AgdG9vbCB0aGF0IHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24uXG4gKiBNdXN0IGJlIGNhbGxlZCB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQuXG4gKiBBdXRvbWF0aWNhbGx5IGNsZWFucyB1cCB3aGVuIHRoZSBjb21wb25lbnQvc2VydmljZSBpcyBkZXN0cm95ZWQuXG4gKiBcbiAqIEBwYXJhbSB0b29sIC0gVGhlIGh1bWFuLWluLXRoZS1sb29wIHRvb2wgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgVGhlIHRvb2wgSURcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBBcHByb3ZhbENvbXBvbmVudCB7XG4gKiAgIHRvb2xJZCA9IHJlZ2lzdGVySHVtYW5JblRoZUxvb3Aoe1xuICogICAgIG5hbWU6ICdyZXF1aXJlQXBwcm92YWwnLFxuICogICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZXMgdXNlciBhcHByb3ZhbCcsXG4gKiAgICAgYXJnczogei5vYmplY3QoeyBhY3Rpb246IHouc3RyaW5nKCkgfSksXG4gKiAgICAgcmVuZGVyOiBBcHByb3ZhbERpYWxvZ0NvbXBvbmVudFxuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJIdW1hbkluVGhlTG9vcDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICB0b29sOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8VD5cbik6IHN0cmluZyB7XG4gIGNvbnN0IHNlcnZpY2UgPSBpbmplY3QoQ29waWxvdEtpdFNlcnZpY2UpO1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBcbiAgLy8gQ3JlYXRlIHN0YXRlIG1hbmFnZW1lbnRcbiAgY29uc3Qgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgbGV0IHJlc29sdmVQcm9taXNlOiAoKHJlc3VsdDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIENyZWF0ZSByZXNwb25kIGZ1bmN0aW9uXG4gIGNvbnN0IHJlc3BvbmQgPSBhc3luYyAocmVzdWx0OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHJlc29sdmVQcm9taXNlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZShyZXN1bHQpO1xuICAgICAgc3RhdHVzU2lnbmFsLnNldChUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZSk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gQ3JlYXRlIGhhbmRsZXIgdGhhdCByZXR1cm5zIGEgUHJvbWlzZVxuICBjb25zdCBoYW5kbGVyID0gYXN5bmMgKF9hcmdzOiBUKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkV4ZWN1dGluZyk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgZW5oYW5jZWQgcmVuZGVyIGZ1bmN0aW9uXG4gIGNvbnN0IGVuaGFuY2VkUmVuZGVyID0gY3JlYXRlRW5oYW5jZWRSZW5kZXIodG9vbC5yZW5kZXIsIHN0YXR1c1NpZ25hbCwgcmVzcG9uZCk7XG4gIFxuICAvLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRvb2xcbiAgY29uc3QgZnJvbnRlbmRUb29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+ID0ge1xuICAgIC4uLnRvb2wsXG4gICAgaGFuZGxlcixcbiAgICByZW5kZXI6IGVuaGFuY2VkUmVuZGVyXG4gIH07XG4gIFxuICAvLyBBZGQgdGhlIHRvb2wgKHJldHVybnMgdm9pZCwgc28gd2UgdXNlIHRoZSB0b29sIG5hbWUgYXMgSUQpXG4gIHNlcnZpY2UuY29waWxvdGtpdC5hZGRUb29sKGZyb250ZW5kVG9vbCk7XG4gIGNvbnN0IHRvb2xJZCA9IGZyb250ZW5kVG9vbC5uYW1lO1xuICBcbiAgLy8gUmVnaXN0ZXIgdG9vbCByZW5kZXIgaWYgcHJvdmlkZWRcbiAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIpIHtcbiAgICBzZXJ2aWNlLnJlZ2lzdGVyVG9vbFJlbmRlcihmcm9udGVuZFRvb2wubmFtZSwge1xuICAgICAgbmFtZTogZnJvbnRlbmRUb29sLm5hbWUsXG4gICAgICByZW5kZXI6IGZyb250ZW5kVG9vbC5yZW5kZXJcbiAgICB9KTtcbiAgfVxuICBcbiAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gIGRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sSWQpO1xuICAgIGlmIChmcm9udGVuZFRvb2wucmVuZGVyKSB7XG4gICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lKTtcbiAgICB9XG4gIH0pO1xuICBcbiAgcmV0dXJuIHRvb2xJZDtcbn1cblxuLyoqXG4gKiBBZGRzIGEgaHVtYW4taW4tdGhlLWxvb3AgdG9vbCB3aXRoIGV4cGxpY2l0IHNlcnZpY2UgcGFyYW1ldGVyLlxuICogUmV0dXJucyBhIGNsZWFudXAgZnVuY3Rpb24uXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gdG9vbCAtIFRoZSBodW1hbi1pbi10aGUtbG9vcCB0b29sIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSB0b29sXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gKiAgIHByaXZhdGUgY2xlYW51cD86ICgpID0+IHZvaWQ7XG4gKiAgIFxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvcGlsb3RraXQ6IENvcGlsb3RLaXRTZXJ2aWNlKSB7fVxuICogICBcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgdGhpcy5jbGVhbnVwID0gYWRkSHVtYW5JblRoZUxvb3AodGhpcy5jb3BpbG90a2l0LCB7XG4gKiAgICAgICBuYW1lOiAncmVxdWlyZUFwcHJvdmFsJyxcbiAqICAgICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZXMgdXNlciBhcHByb3ZhbCcsXG4gKiAgICAgICBhcmdzOiB6Lm9iamVjdCh7IGFjdGlvbjogei5zdHJpbmcoKSB9KSxcbiAqICAgICAgIHJlbmRlcjogQXBwcm92YWxEaWFsb2dDb21wb25lbnRcbiAqICAgICB9KTtcbiAqICAgfVxuICogICBcbiAqICAgbmdPbkRlc3Ryb3koKSB7XG4gKiAgICAgdGhpcy5jbGVhbnVwPy4oKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRIdW1hbkluVGhlTG9vcDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBzZXJ2aWNlOiBDb3BpbG90S2l0U2VydmljZSxcbiAgdG9vbDogQW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+XG4pOiAoKSA9PiB2b2lkIHtcbiAgLy8gQ3JlYXRlIHN0YXRlIG1hbmFnZW1lbnRcbiAgY29uc3Qgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgbGV0IHJlc29sdmVQcm9taXNlOiAoKHJlc3VsdDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIENyZWF0ZSByZXNwb25kIGZ1bmN0aW9uXG4gIGNvbnN0IHJlc3BvbmQgPSBhc3luYyAocmVzdWx0OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHJlc29sdmVQcm9taXNlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZShyZXN1bHQpO1xuICAgICAgc3RhdHVzU2lnbmFsLnNldChUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZSk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gQ3JlYXRlIGhhbmRsZXIgdGhhdCByZXR1cm5zIGEgUHJvbWlzZVxuICBjb25zdCBoYW5kbGVyID0gYXN5bmMgKF9hcmdzOiBUKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkV4ZWN1dGluZyk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgZW5oYW5jZWQgcmVuZGVyIGZ1bmN0aW9uXG4gIGNvbnN0IGVuaGFuY2VkUmVuZGVyID0gY3JlYXRlRW5oYW5jZWRSZW5kZXIodG9vbC5yZW5kZXIsIHN0YXR1c1NpZ25hbCwgcmVzcG9uZCk7XG4gIFxuICAvLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRvb2xcbiAgY29uc3QgZnJvbnRlbmRUb29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+ID0ge1xuICAgIC4uLnRvb2wsXG4gICAgaGFuZGxlcixcbiAgICByZW5kZXI6IGVuaGFuY2VkUmVuZGVyXG4gIH07XG4gIFxuICAvLyBBZGQgdGhlIHRvb2wgKHJldHVybnMgdm9pZCwgc28gd2UgdXNlIHRoZSB0b29sIG5hbWUgYXMgSUQpXG4gIHNlcnZpY2UuY29waWxvdGtpdC5hZGRUb29sKGZyb250ZW5kVG9vbCk7XG4gIGNvbnN0IHRvb2xJZCA9IGZyb250ZW5kVG9vbC5uYW1lO1xuICBcbiAgLy8gUmVnaXN0ZXIgdG9vbCByZW5kZXIgaWYgcHJvdmlkZWRcbiAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIpIHtcbiAgICBzZXJ2aWNlLnJlZ2lzdGVyVG9vbFJlbmRlcihmcm9udGVuZFRvb2wubmFtZSwge1xuICAgICAgbmFtZTogZnJvbnRlbmRUb29sLm5hbWUsXG4gICAgICByZW5kZXI6IGZyb250ZW5kVG9vbC5yZW5kZXJcbiAgICB9KTtcbiAgfVxuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sSWQpO1xuICAgIGlmIChmcm9udGVuZFRvb2wucmVuZGVyKSB7XG4gICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGh1bWFuLWluLXRoZS1sb29wIHRvb2wgd2l0aCBkeW5hbWljIHVwZGF0ZSBjYXBhYmlsaXRpZXMuXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gdG9vbCAtIFRoZSBodW1hbi1pbi10aGUtbG9vcCB0b29sIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHN0YXR1cyBzaWduYWwsIHVwZGF0ZSBhbmQgZGVzdHJveSBtZXRob2RzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBodW1hbkluVGhlTG9vcCA9IGNyZWF0ZUh1bWFuSW5UaGVMb29wKHRoaXMuY29waWxvdGtpdCwge1xuICogICAgIG5hbWU6ICdyZXF1aXJlQXBwcm92YWwnLFxuICogICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZXMgdXNlciBhcHByb3ZhbCcsXG4gKiAgICAgYXJnczogei5vYmplY3QoeyBhY3Rpb246IHouc3RyaW5nKCkgfSksXG4gKiAgICAgcmVuZGVyOiBBcHByb3ZhbERpYWxvZ0NvbXBvbmVudFxuICogICB9KTtcbiAqICAgXG4gKiAgIHVwZGF0ZURlc2NyaXB0aW9uKG5ld0Rlc2M6IHN0cmluZykge1xuICogICAgIHRoaXMuaHVtYW5JblRoZUxvb3AudXBkYXRlKHsgZGVzY3JpcHRpb246IG5ld0Rlc2MgfSk7XG4gKiAgIH1cbiAqICAgXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIHRoaXMuaHVtYW5JblRoZUxvb3AuZGVzdHJveSgpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh1bWFuSW5UaGVMb29wPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIHNlcnZpY2U6IENvcGlsb3RLaXRTZXJ2aWNlLFxuICB0b29sOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8VD5cbik6IEh1bWFuSW5UaGVMb29wU3RhdGUgJiB7IHVwZGF0ZTogKHVwZGF0ZXM6IFBhcnRpYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+PikgPT4gdm9pZCB9IHtcbiAgLy8gQ3JlYXRlIHN0YXRlIG1hbmFnZW1lbnRcbiAgY29uc3Qgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgbGV0IGN1cnJlbnRUb29sID0geyAuLi50b29sIH07XG4gIGxldCB0b29sSWQ6IHN0cmluZyA9ICcnO1xuICBsZXQgcmVzb2x2ZVByb21pc2U6ICgocmVzdWx0OiB1bmtub3duKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ3JlYXRlIHJlc3BvbmQgZnVuY3Rpb25cbiAgY29uc3QgcmVzcG9uZCA9IGFzeW5jIChyZXN1bHQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdCk7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkNvbXBsZXRlKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgaGFuZGxlciB0aGF0IHJldHVybnMgYSBQcm9taXNlXG4gIGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoX2FyZ3M6IFQpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0YXR1c1NpZ25hbC5zZXQoVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8vIEZ1bmN0aW9uIHRvIGFkZCB0aGUgdG9vbFxuICBjb25zdCBhZGRUb29sID0gKCkgPT4ge1xuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCBlbmhhbmNlZFJlbmRlciA9IGNyZWF0ZUVuaGFuY2VkUmVuZGVyKGN1cnJlbnRUb29sLnJlbmRlciwgc3RhdHVzU2lnbmFsLCByZXNwb25kKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRvb2xcbiAgICBjb25zdCBmcm9udGVuZFRvb2w6IEFuZ3VsYXJGcm9udGVuZFRvb2w8VD4gPSB7XG4gICAgICAuLi5jdXJyZW50VG9vbCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICByZW5kZXI6IGVuaGFuY2VkUmVuZGVyXG4gICAgfTtcbiAgICBcbiAgICAvLyBBZGQgdG9vbCAocmV0dXJucyB2b2lkLCBzbyB3ZSB1c2UgdGhlIHRvb2wgbmFtZSBhcyBJRClcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbChmcm9udGVuZFRvb2wpO1xuICAgIHRvb2xJZCA9IGZyb250ZW5kVG9vbC5uYW1lO1xuICAgIFxuICAgIC8vIFJlZ2lzdGVyIHRvb2wgcmVuZGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIpIHtcbiAgICAgIHNlcnZpY2UucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lLCB7XG4gICAgICAgIG5hbWU6IGZyb250ZW5kVG9vbC5uYW1lLFxuICAgICAgICByZW5kZXI6IGZyb250ZW5kVG9vbC5yZW5kZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgdGhlIHRvb2xcbiAgYWRkVG9vbCgpO1xuICBcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IHN0YXR1c1NpZ25hbC5hc1JlYWRvbmx5KCksXG4gICAgdG9vbElkLFxuICAgIHVwZGF0ZTogKHVwZGF0ZXM6IFBhcnRpYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+PikgPT4ge1xuICAgICAgLy8gUmVtb3ZlIG9sZCB0b29sXG4gICAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sSWQpO1xuICAgICAgaWYgKGN1cnJlbnRUb29sLnJlbmRlcikge1xuICAgICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJUb29sUmVuZGVyKGN1cnJlbnRUb29sLm5hbWUpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdG9vbCBjb25maWd1cmF0aW9uXG4gICAgICBjdXJyZW50VG9vbCA9IHsgLi4uY3VycmVudFRvb2wsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIFxuICAgICAgLy8gUmUtYWRkIHdpdGggbmV3IGNvbmZpZ3VyYXRpb25cbiAgICAgIGFkZFRvb2woKTtcbiAgICB9LFxuICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgIHNlcnZpY2UuY29waWxvdGtpdC5yZW1vdmVUb29sKHRvb2xJZCk7XG4gICAgICBpZiAoY3VycmVudFRvb2wucmVuZGVyKSB7XG4gICAgICAgIHNlcnZpY2UudW5yZWdpc3RlclRvb2xSZW5kZXIoY3VycmVudFRvb2wubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW5oYW5jZWQgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgaW5qZWN0cyB0aGUgcmVzcG9uZCBmdW5jdGlvblxuICogd2hlbiB0aGUgc3RhdHVzIGlzICdleGVjdXRpbmcnLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbmhhbmNlZFJlbmRlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9yaWdpbmFsUmVuZGVyOiBUeXBlPGFueT4gfCBUZW1wbGF0ZVJlZjxIdW1hbkluVGhlTG9vcFByb3BzPFQ+PixcbiAgX3N0YXR1c1NpZ25hbDogU2lnbmFsPFRvb2xDYWxsU3RhdHVzPixcbiAgX3Jlc3BvbmQ6IChyZXN1bHQ6IHVua25vd24pID0+IFByb21pc2U8dm9pZD5cbik6IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPGFueT4ge1xuICAvLyBGb3IgY29tcG9uZW50IGNsYXNzZXMsIHdlIG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlclxuICBpZiAoaXNDb21wb25lbnRDbGFzcyhvcmlnaW5hbFJlbmRlcikpIHtcbiAgICAvLyBSZXR1cm4gYSB3cmFwcGVyIGNvbXBvbmVudCBmYWN0b3J5XG4gICAgLy8gVGhpcyBpcyBjb21wbGV4IGluIEFuZ3VsYXIgYW5kIHdvdWxkIHJlcXVpcmUgZHluYW1pYyBjb21wb25lbnQgY3JlYXRpb25cbiAgICAvLyBGb3Igbm93LCB3ZSdsbCByZXR1cm4gdGhlIG9yaWdpbmFsIGFuZCByZWx5IG9uIHByb3AgaW5qZWN0aW9uXG4gICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyO1xuICB9XG4gIFxuICAvLyBGb3IgdGVtcGxhdGVzLCB3ZSBjYW4ndCBlYXNpbHkgd3JhcCB0aGVtXG4gIC8vIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHdpbGwgYmUgZW5oYW5jZWQgaW4gdGhlIHJlbmRlciBjb21wb25lbnRcbiAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgY29tcG9uZW50IGNsYXNzXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcG9uZW50Q2xhc3ModmFsdWU6IGFueSk6IHZhbHVlIGlzIFR5cGU8YW55PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIEVuaGFuY2VkIGNvbXBvbmVudCB3cmFwcGVyIGZvciBodW1hbi1pbi10aGUtbG9vcC5cbiAqIFRoaXMgd291bGQgYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSB0b29sIHJlbmRlciBjb21wb25lbnQgdG8gaW5qZWN0XG4gKiB0aGUgcmVzcG9uZCBmdW5jdGlvbiBiYXNlZCBvbiBzdGF0dXMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5oYW5jZVByb3BzRm9ySHVtYW5JblRoZUxvb3A8VD4oXG4gIHByb3BzOiBIdW1hbkluVGhlTG9vcFByb3BzPFQ+LFxuICBzdGF0dXM6IFRvb2xDYWxsU3RhdHVzLFxuICByZXNwb25kPzogKHJlc3VsdDogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPlxuKTogSHVtYW5JblRoZUxvb3BQcm9wczxUPiB7XG4gIGlmIChzdGF0dXMgPT09IFRvb2xDYWxsU3RhdHVzLkV4ZWN1dGluZyAmJiByZXNwb25kKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5FeGVjdXRpbmcsXG4gICAgICByZXNwb25kXG4gICAgfSBhcyBIdW1hbkluVGhlTG9vcFByb3BzPFQ+O1xuICB9XG4gIFxuICBpZiAoc3RhdHVzID09PSBUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuQ29tcGxldGUsXG4gICAgICByZXN1bHQ6IHR5cGVvZiBwcm9wcy5yZXN1bHQgPT09ICdzdHJpbmcnID8gcHJvcHMucmVzdWx0IDogJycsXG4gICAgICByZXNwb25kOiB1bmRlZmluZWRcbiAgICB9IGFzIEh1bWFuSW5UaGVMb29wUHJvcHM8VD47XG4gIH1cbiAgXG4gIC8vIEluUHJvZ3Jlc3NcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9wcyxcbiAgICBzdGF0dXM6IFRvb2xDYWxsU3RhdHVzLkluUHJvZ3Jlc3MsXG4gICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgcmVzcG9uZDogdW5kZWZpbmVkXG4gIH0gYXMgSHVtYW5JblRoZUxvb3BQcm9wczxUPjtcbn0iXX0=
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { OnDestroy } from '@angular/core';
|
|
2
|
-
import { ChangeDetectorRef } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class TooltipContentComponent {
|
|
5
|
-
private cdr;
|
|
6
|
-
text: string;
|
|
7
|
-
private _position;
|
|
8
|
-
get position(): 'above' | 'below' | 'left' | 'right';
|
|
9
|
-
set position(value: 'above' | 'below' | 'left' | 'right');
|
|
10
|
-
constructor(cdr: ChangeDetectorRef);
|
|
11
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TooltipContentComponent, never>;
|
|
12
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TooltipContentComponent, "copilot-tooltip-content", never, {}, {}, never, never, true, never>;
|
|
13
|
-
}
|
|
14
|
-
export declare class CopilotTooltipDirective implements OnDestroy {
|
|
15
|
-
tooltipText: string;
|
|
16
|
-
tooltipPosition: 'above' | 'below' | 'left' | 'right';
|
|
17
|
-
tooltipDelay: number;
|
|
18
|
-
private overlay;
|
|
19
|
-
private overlayPositionBuilder;
|
|
20
|
-
private elementRef;
|
|
21
|
-
private viewContainerRef;
|
|
22
|
-
private overlayRef?;
|
|
23
|
-
private tooltipTimeout?;
|
|
24
|
-
private originalTitle?;
|
|
25
|
-
onMouseEnter(): void;
|
|
26
|
-
onMouseLeave(): void;
|
|
27
|
-
private show;
|
|
28
|
-
private hide;
|
|
29
|
-
private getPositions;
|
|
30
|
-
ngOnDestroy(): void;
|
|
31
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CopilotTooltipDirective, never>;
|
|
32
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<CopilotTooltipDirective, "[copilotTooltip]", never, { "tooltipText": { "alias": "copilotTooltip"; "required": false; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; }; "tooltipDelay": { "alias": "tooltipDelay"; "required": false; }; }, {}, never, never, true, never>;
|
|
33
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { TemplateRef, ViewContainerRef, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { Type } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* @internal - This component is for internal use only.
|
|
6
|
-
* Simple slot component for rendering custom content or defaults.
|
|
7
|
-
* Supports templates and components only.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```html
|
|
11
|
-
* <!-- With template -->
|
|
12
|
-
* <copilot-slot [slot]="sendButtonTemplate" [context]="buttonContext">
|
|
13
|
-
* <button class="default-btn">Default</button>
|
|
14
|
-
* </copilot-slot>
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
export declare class CopilotSlotComponent implements OnInit, OnChanges {
|
|
18
|
-
private viewContainer;
|
|
19
|
-
private cdr;
|
|
20
|
-
slot?: TemplateRef<any> | Type<any>;
|
|
21
|
-
context?: any;
|
|
22
|
-
defaultComponent?: Type<any>;
|
|
23
|
-
outputs?: Record<string, (event: any) => void>;
|
|
24
|
-
private slotContainer;
|
|
25
|
-
private componentRef?;
|
|
26
|
-
constructor(viewContainer: ViewContainerRef, cdr: ChangeDetectorRef);
|
|
27
|
-
ngOnInit(): void;
|
|
28
|
-
ngOnChanges(changes: SimpleChanges): void;
|
|
29
|
-
isTemplate(value: any): value is TemplateRef<any>;
|
|
30
|
-
private renderSlot;
|
|
31
|
-
private updateComponentProps;
|
|
32
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CopilotSlotComponent, never>;
|
|
33
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<CopilotSlotComponent, "copilot-slot", never, { "slot": { "alias": "slot"; "required": false; }; "context": { "alias": "context"; "required": false; }; "defaultComponent": { "alias": "defaultComponent"; "required": false; }; "outputs": { "alias": "outputs"; "required": false; }; }, {}, never, ["*"], true, never>;
|
|
34
|
-
}
|