@copilotkitnext/angular 0.0.9-alpha.3 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm2022/index.mjs +2 -70
- package/dist/esm2022/lib/agent.mjs +73 -0
- package/dist/esm2022/lib/chat-config.mjs +35 -0
- package/dist/esm2022/lib/chat-state.mjs +18 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
- package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
- package/dist/esm2022/lib/config.mjs +9 -0
- package/dist/esm2022/lib/copilotkit.mjs +124 -0
- package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
- package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
- package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
- package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
- package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
- package/dist/esm2022/lib/resize-observer.mjs +152 -0
- package/dist/esm2022/lib/scroll-position.mjs +124 -0
- package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
- package/dist/esm2022/lib/slots/index.mjs +4 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
- package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
- package/dist/esm2022/lib/tools.mjs +31 -0
- package/dist/esm2022/lib/utils.mjs +3 -3
- package/dist/esm2022/public-api.mjs +47 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/index.d.ts +1 -55
- package/dist/lib/agent.d.ts +53 -0
- package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
- package/dist/lib/chat-state.d.ts +10 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
- package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
- package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
- package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
- package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
- package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
- package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
- package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
- package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
- package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
- package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
- package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
- package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
- package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
- package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
- package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
- package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
- package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
- package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
- package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
- package/dist/lib/config.d.ts +16 -0
- package/dist/lib/copilotkit.d.ts +29 -0
- package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
- package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
- package/dist/lib/directives/tooltip.d.ts +33 -0
- package/dist/lib/human-in-the-loop.d.ts +13 -0
- package/dist/lib/render-tool-calls.d.ts +75 -0
- package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
- package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
- package/dist/lib/slots/copilot-slot.d.ts +34 -0
- package/dist/lib/slots/index.d.ts +3 -0
- package/dist/lib/slots/slot.types.d.ts +1 -1
- package/dist/lib/slots/slot.utils.d.ts +6 -4
- package/dist/lib/tools.d.ts +63 -0
- package/dist/lib/utils.d.ts +1 -1
- package/dist/public-api.d.ts +46 -0
- package/dist/styles.css +0 -69
- package/package.json +3 -3
- package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
- package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
- package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
- package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
- package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
- package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
- package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
- package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
- package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
- package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
- package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
- package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
- package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
- package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
- package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
- package/dist/components/chat/copilot-chat.component.d.ts +0 -36
- package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
- package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
- package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
- package/dist/core/copilotkit.providers.d.ts +0 -13
- package/dist/core/copilotkit.service.d.ts +0 -119
- package/dist/core/copilotkit.types.d.ts +0 -81
- package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
- package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
- package/dist/directives/copilotkit-config.directive.d.ts +0 -44
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
- package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
- package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
- package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
- package/dist/esm2022/core/copilotkit.service.mjs +0 -411
- package/dist/esm2022/core/copilotkit.types.mjs +0 -13
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
- package/dist/esm2022/services/resize-observer.service.mjs +0 -152
- package/dist/esm2022/services/scroll-position.service.mjs +0 -124
- package/dist/esm2022/types/frontend-tool.mjs +0 -2
- package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
- package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
- package/dist/esm2022/utils/agent.utils.mjs +0 -212
- package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
- package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
- package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
- package/dist/lib/directives/tooltip.directive.d.ts +0 -33
- package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
- package/dist/types/frontend-tool.d.ts +0 -37
- package/dist/types/human-in-the-loop.d.ts +0 -44
- package/dist/utils/agent-context.utils.d.ts +0 -75
- package/dist/utils/agent.utils.d.ts +0 -108
- package/dist/utils/chat-config.utils.d.ts +0 -166
- package/dist/utils/copilotkit.utils.d.ts +0 -16
- package/dist/utils/frontend-tool.utils.d.ts +0 -119
- package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { Component, input, ChangeDetectionStrategy, ViewEncapsulation, signal, effect, ChangeDetectorRef, Injector, computed, inject, } from "@angular/core";
|
|
2
|
+
import { CommonModule } from "@angular/common";
|
|
3
|
+
import { CopilotChatView } from "./copilot-chat-view";
|
|
4
|
+
import { DEFAULT_AGENT_ID, randomUUID } from "@copilotkitnext/shared";
|
|
5
|
+
import { injectAgentStore } from "../../agent";
|
|
6
|
+
import { ChatState } from "../../chat-state";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
/**
|
|
9
|
+
* CopilotChat component - Angular equivalent of React's <CopilotChat>
|
|
10
|
+
* Provides a complete chat interface that wires an agent to the chat view
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```html
|
|
14
|
+
* <copilot-chat [agentId]="'default'" [threadId]="'abc123'"></copilot-chat>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export class CopilotChat {
|
|
18
|
+
inputValue = signal("");
|
|
19
|
+
agentId = input();
|
|
20
|
+
threadId = input();
|
|
21
|
+
inputComponent = input();
|
|
22
|
+
resolvedAgentId = computed(() => this.agentId() ?? DEFAULT_AGENT_ID);
|
|
23
|
+
agentStore = injectAgentStore(this.resolvedAgentId);
|
|
24
|
+
// readonly chatConfig = injectChatConfig();
|
|
25
|
+
cdr = inject(ChangeDetectorRef);
|
|
26
|
+
injector = inject(Injector);
|
|
27
|
+
messages = computed(() => this.agentStore()?.messages());
|
|
28
|
+
isRunning = computed(() => this.agentStore()?.isRunning());
|
|
29
|
+
showCursor = signal(false);
|
|
30
|
+
generatedThreadId = randomUUID();
|
|
31
|
+
hasConnectedOnce = false;
|
|
32
|
+
constructor() {
|
|
33
|
+
// Connect once when agent becomes available
|
|
34
|
+
// Connect once when agent becomes available
|
|
35
|
+
effect(() => {
|
|
36
|
+
const a = this.agentStore()?.agent;
|
|
37
|
+
if (!a)
|
|
38
|
+
return;
|
|
39
|
+
// Apply thread id when agent is available
|
|
40
|
+
a.threadId = this.threadId() || this.generatedThreadId;
|
|
41
|
+
if (!this.hasConnectedOnce) {
|
|
42
|
+
this.hasConnectedOnce = true;
|
|
43
|
+
if ("isCopilotKitAgent" in a) {
|
|
44
|
+
this.connectToAgent(a);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Non-CopilotKit agent: nothing to connect; keep default cursor state
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}, { allowSignalWrites: true });
|
|
51
|
+
// Keep agent threadId in sync with input
|
|
52
|
+
effect(() => {
|
|
53
|
+
const a = this.agentStore()?.agent;
|
|
54
|
+
if (a) {
|
|
55
|
+
a.threadId = this.threadId() || this.generatedThreadId;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async connectToAgent(agent) {
|
|
60
|
+
if (!agent)
|
|
61
|
+
return;
|
|
62
|
+
this.showCursor.set(true);
|
|
63
|
+
this.cdr.markForCheck();
|
|
64
|
+
try {
|
|
65
|
+
await agent.runAgent({ forwardedProps: { __copilotkitConnect: true } }, {
|
|
66
|
+
onTextMessageStartEvent: () => {
|
|
67
|
+
this.showCursor.set(false);
|
|
68
|
+
this.cdr.detectChanges();
|
|
69
|
+
},
|
|
70
|
+
onToolCallStartEvent: () => {
|
|
71
|
+
this.showCursor.set(false);
|
|
72
|
+
this.cdr.detectChanges();
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
this.showCursor.set(false);
|
|
76
|
+
this.cdr.markForCheck();
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error("Failed to connect to agent:", error);
|
|
80
|
+
this.showCursor.set(false);
|
|
81
|
+
this.cdr.markForCheck();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async submitInput(value) {
|
|
85
|
+
const agent = this.agentStore()?.agent;
|
|
86
|
+
if (!agent || !value.trim())
|
|
87
|
+
return;
|
|
88
|
+
// Add user message
|
|
89
|
+
const userMessage = {
|
|
90
|
+
id: randomUUID(),
|
|
91
|
+
role: "user",
|
|
92
|
+
content: value,
|
|
93
|
+
};
|
|
94
|
+
agent.addMessage(userMessage);
|
|
95
|
+
// Clear the input
|
|
96
|
+
this.inputValue.set("");
|
|
97
|
+
// Show cursor while processing
|
|
98
|
+
this.showCursor.set(true);
|
|
99
|
+
this.cdr.markForCheck();
|
|
100
|
+
// Run the agent with named subscriber callbacks
|
|
101
|
+
try {
|
|
102
|
+
await agent.runAgent({}, {
|
|
103
|
+
onTextMessageStartEvent: () => {
|
|
104
|
+
this.showCursor.set(false);
|
|
105
|
+
this.cdr.detectChanges();
|
|
106
|
+
},
|
|
107
|
+
onToolCallStartEvent: () => {
|
|
108
|
+
this.showCursor.set(false);
|
|
109
|
+
this.cdr.detectChanges();
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error("Agent run error:", error);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
this.showCursor.set(false);
|
|
118
|
+
this.cdr.markForCheck();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
changeInput(value) {
|
|
122
|
+
this.inputValue.set(value);
|
|
123
|
+
}
|
|
124
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChat, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
125
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: CopilotChat, isStandalone: true, selector: "copilot-chat", inputs: { agentId: { classPropertyName: "agentId", publicName: "agentId", isSignal: true, isRequired: false, transformFunction: null }, threadId: { classPropertyName: "threadId", publicName: "threadId", isSignal: true, isRequired: false, transformFunction: null }, inputComponent: { classPropertyName: "inputComponent", publicName: "inputComponent", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
126
|
+
{
|
|
127
|
+
provide: ChatState,
|
|
128
|
+
useExisting: CopilotChat,
|
|
129
|
+
},
|
|
130
|
+
], ngImport: i0, template: `
|
|
131
|
+
<copilot-chat-view
|
|
132
|
+
[messages]="messages() ?? []"
|
|
133
|
+
[autoScroll]="true"
|
|
134
|
+
[messageViewClass]="'w-full'"
|
|
135
|
+
[showCursor]="showCursor()"
|
|
136
|
+
[inputComponent]="inputComponent()"
|
|
137
|
+
>
|
|
138
|
+
</copilot-chat-view>
|
|
139
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CopilotChatView, selector: "copilot-chat-view", inputs: ["messages", "autoScroll", "showCursor", "messageViewComponent", "messageViewTemplate", "messageViewClass", "scrollViewComponent", "scrollViewTemplate", "scrollViewClass", "scrollToBottomButtonComponent", "scrollToBottomButtonTemplate", "scrollToBottomButtonClass", "inputComponent", "inputTemplate", "inputContainerComponent", "inputContainerTemplate", "inputContainerClass", "featherComponent", "featherTemplate", "featherClass", "disclaimerComponent", "disclaimerTemplate", "disclaimerClass", "disclaimerText"], outputs: ["assistantMessageThumbsUp", "assistantMessageThumbsDown", "assistantMessageReadAloud", "assistantMessageRegenerate", "userMessageCopy", "userMessageEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
140
|
+
}
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChat, decorators: [{
|
|
142
|
+
type: Component,
|
|
143
|
+
args: [{
|
|
144
|
+
selector: "copilot-chat",
|
|
145
|
+
standalone: true,
|
|
146
|
+
imports: [CommonModule, CopilotChatView],
|
|
147
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
148
|
+
encapsulation: ViewEncapsulation.None,
|
|
149
|
+
template: `
|
|
150
|
+
<copilot-chat-view
|
|
151
|
+
[messages]="messages() ?? []"
|
|
152
|
+
[autoScroll]="true"
|
|
153
|
+
[messageViewClass]="'w-full'"
|
|
154
|
+
[showCursor]="showCursor()"
|
|
155
|
+
[inputComponent]="inputComponent()"
|
|
156
|
+
>
|
|
157
|
+
</copilot-chat-view>
|
|
158
|
+
`,
|
|
159
|
+
providers: [
|
|
160
|
+
{
|
|
161
|
+
provide: ChatState,
|
|
162
|
+
useExisting: CopilotChat,
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
}]
|
|
166
|
+
}], ctorParameters: () => [] });
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsUUFBUSxFQUVSLFFBQVEsRUFDUixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFN0M7Ozs7Ozs7O0dBUUc7QUF3QkgsTUFBTSxPQUFPLFdBQVc7SUFDYixVQUFVLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxLQUFLLEVBQXNCLENBQUM7SUFDdEMsUUFBUSxHQUFHLEtBQUssRUFBc0IsQ0FBQztJQUN2QyxjQUFjLEdBQUcsS0FBSyxFQUF5QixDQUFDO0lBQ3hDLGVBQWUsR0FBRyxRQUFRLENBQ3pDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxnQkFBZ0IsQ0FDekMsQ0FBQztJQUNPLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0QsNENBQTRDO0lBQ25DLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoQyxRQUFRLEdBQUcsTUFB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LEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQzt3R0EzSFUsV0FBVzs0RkFBWCxXQUFXLHlkQVBYO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLFdBQVcsRUFBRSxXQUFXO2FBQ3pCO1NBQ0YsMEJBZlM7Ozs7Ozs7OztHQVNULDJEQVpTLFlBQVksK0JBQUUsZUFBZTs7NEZBb0I1QixXQUFXO2tCQXZCdkIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUM7b0JBQ3hDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsUUFBUSxFQUFFOzs7Ozs7Ozs7R0FTVDtvQkFDRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLFNBQVM7NEJBQ2xCLFdBQVcsYUFBYTt5QkFDekI7cUJBQ0Y7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGlucHV0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIHNpZ25hbCxcbiAgZWZmZWN0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgSW5qZWN0b3IsXG4gIFR5cGUsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXcgfSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtdmlld1wiO1xuXG5pbXBvcnQgeyBERUZBVUxUX0FHRU5UX0lELCByYW5kb21VVUlEIH0gZnJvbSBcIkBjb3BpbG90a2l0bmV4dC9zaGFyZWRcIjtcbmltcG9ydCB7IE1lc3NhZ2UsIEFic3RyYWN0QWdlbnQgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuaW1wb3J0IHsgaW5qZWN0QWdlbnRTdG9yZSB9IGZyb20gXCIuLi8uLi9hZ2VudFwiO1xuaW1wb3J0IHsgQ2hhdFN0YXRlIH0gZnJvbSBcIi4uLy4uL2NoYXQtc3RhdGVcIjtcblxuLyoqXG4gKiBDb3BpbG90Q2hhdCBjb21wb25lbnQgLSBBbmd1bGFyIGVxdWl2YWxlbnQgb2YgUmVhY3QncyA8Q29waWxvdENoYXQ+XG4gKiBQcm92aWRlcyBhIGNvbXBsZXRlIGNoYXQgaW50ZXJmYWNlIHRoYXQgd2lyZXMgYW4gYWdlbnQgdG8gdGhlIGNoYXQgdmlld1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8Y29waWxvdC1jaGF0IFthZ2VudElkXT1cIidkZWZhdWx0J1wiIFt0aHJlYWRJZF09XCInYWJjMTIzJ1wiPjwvY29waWxvdC1jaGF0PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjb3BpbG90LWNoYXRcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ29waWxvdENoYXRWaWV3XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGNvcGlsb3QtY2hhdC12aWV3XG4gICAgICBbbWVzc2FnZXNdPVwibWVzc2FnZXMoKSA/PyBbXVwiXG4gICAgICBbYXV0b1Njcm9sbF09XCJ0cnVlXCJcbiAgICAgIFttZXNzYWdlVmlld0NsYXNzXT1cIid3LWZ1bGwnXCJcbiAgICAgIFtzaG93Q3Vyc29yXT1cInNob3dDdXJzb3IoKVwiXG4gICAgICBbaW5wdXRDb21wb25lbnRdPVwiaW5wdXRDb21wb25lbnQoKVwiXG4gICAgPlxuICAgIDwvY29waWxvdC1jaGF0LXZpZXc+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENoYXRTdGF0ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBDb3BpbG90Q2hhdCxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdCBpbXBsZW1lbnRzIENoYXRTdGF0ZSB7XG4gIHJlYWRvbmx5IGlucHV0VmFsdWUgPSBzaWduYWw8c3RyaW5nPihcIlwiKTtcbiAgcmVhZG9ubHkgYWdlbnRJZCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgdGhyZWFkSWQgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGlucHV0Q29tcG9uZW50ID0gaW5wdXQ8VHlwZTxhbnk+IHwgdW5kZWZpbmVkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkQWdlbnRJZCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuYWdlbnRJZCgpID8/IERFRkFVTFRfQUdFTlRfSURcbiAgKTtcbiAgcmVhZG9ubHkgYWdlbnRTdG9yZSA9IGluamVjdEFnZW50U3RvcmUodGhpcy5yZXNvbHZlZEFnZW50SWQpO1xuICAvLyByZWFkb25seSBjaGF0Q29uZmlnID0gaW5qZWN0Q2hhdENvbmZpZygpO1xuICByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hZ2VudFN0b3JlKCk/Lm1lc3NhZ2VzKCkpO1xuICBwcm90ZWN0ZWQgaXNSdW5uaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hZ2VudFN0b3JlKCk/LmlzUnVubmluZygpKTtcbiAgcHJvdGVjdGVkIHNob3dDdXJzb3IgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgZ2VuZXJhdGVkVGhyZWFkSWQ6IHN0cmluZyA9IHJhbmRvbVVVSUQoKTtcbiAgcHJpdmF0ZSBoYXNDb25uZWN0ZWRPbmNlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gQ29ubmVjdCBvbmNlIHdoZW4gYWdlbnQgYmVjb21lcyBhdmFpbGFibGVcbiAgICAvLyBDb25uZWN0IG9uY2Ugd2hlbiBhZ2VudCBiZWNvbWVzIGF2YWlsYWJsZVxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuYWdlbnRTdG9yZSgpPy5hZ2VudDtcbiAgICAgICAgaWYgKCFhKSByZXR1cm47XG4gICAgICAgIC8vIEFwcGx5IHRocmVhZCBpZCB3aGVuIGFnZW50IGlzIGF2YWlsYWJsZVxuICAgICAgICBhLnRocmVhZElkID0gdGhpcy50aHJlYWRJZCgpIHx8IHRoaXMuZ2VuZXJhdGVkVGhyZWFkSWQ7XG4gICAgICAgIGlmICghdGhpcy5oYXNDb25uZWN0ZWRPbmNlKSB7XG4gICAgICAgICAgdGhpcy5oYXNDb25uZWN0ZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoXCJpc0NvcGlsb3RLaXRBZ2VudFwiIGluIChhIGFzIGFueSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFRvQWdlbnQoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vbi1Db3BpbG90S2l0IGFnZW50OiBub3RoaW5nIHRvIGNvbm5lY3Q7IGtlZXAgZGVmYXVsdCBjdXJzb3Igc3RhdGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgLy8gS2VlcCBhZ2VudCB0aHJlYWRJZCBpbiBzeW5jIHdpdGggaW5wdXRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYWdlbnRTdG9yZSgpPy5hZ2VudDtcbiAgICAgIGlmIChhKSB7XG4gICAgICAgIGEudGhyZWFkSWQgPSB0aGlzLnRocmVhZElkKCkgfHwgdGhpcy5nZW5lcmF0ZWRUaHJlYWRJZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvQWdlbnQoYWdlbnQ6IEFic3RyYWN0QWdlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWFnZW50KSByZXR1cm47XG5cbiAgICB0aGlzLnNob3dDdXJzb3Iuc2V0KHRydWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFnZW50LnJ1bkFnZW50KFxuICAgICAgICB7IGZvcndhcmRlZFByb3BzOiB7IF9fY29waWxvdGtpdENvbm5lY3Q6IHRydWUgfSB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25UZXh0TWVzc2FnZVN0YXJ0RXZlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0N1cnNvci5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub29sQ2FsbFN0YXJ0RXZlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0N1cnNvci5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLnNob3dDdXJzb3Iuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNvbm5lY3QgdG8gYWdlbnQ6XCIsIGVycm9yKTtcbiAgICAgIHRoaXMuc2hvd0N1cnNvci5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3VibWl0SW5wdXQodmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFnZW50ID0gdGhpcy5hZ2VudFN0b3JlKCk/LmFnZW50O1xuICAgIGlmICghYWdlbnQgfHwgIXZhbHVlLnRyaW0oKSkgcmV0dXJuO1xuXG4gICAgLy8gQWRkIHVzZXIgbWVzc2FnZVxuICAgIGNvbnN0IHVzZXJNZXNzYWdlOiBNZXNzYWdlID0ge1xuICAgICAgaWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgY29udGVudDogdmFsdWUsXG4gICAgfTtcbiAgICBhZ2VudC5hZGRNZXNzYWdlKHVzZXJNZXNzYWdlKTtcblxuICAgIC8vIENsZWFyIHRoZSBpbnB1dFxuICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoXCJcIik7XG5cbiAgICAvLyBTaG93IGN1cnNvciB3aGlsZSBwcm9jZXNzaW5nXG4gICAgdGhpcy5zaG93Q3Vyc29yLnNldCh0cnVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIFJ1biB0aGUgYWdlbnQgd2l0aCBuYW1lZCBzdWJzY3JpYmVyIGNhbGxiYWNrc1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZ2VudC5ydW5BZ2VudChcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBvblRleHRNZXNzYWdlU3RhcnRFdmVudDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q3Vyc29yLnNldChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRvb2xDYWxsU3RhcnRFdmVudDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q3Vyc29yLnNldChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkFnZW50IHJ1biBlcnJvcjpcIiwgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNob3dDdXJzb3Iuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUlucHV0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0VmFsdWUuc2V0KHZhbHVlKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { inject, InjectionToken } from "@angular/core";
|
|
2
|
+
export const COPILOT_KIT_CONFIG = new InjectionToken("COPILOT_KIT_CONFIG");
|
|
3
|
+
export function injectCopilotKitConfig() {
|
|
4
|
+
return inject(COPILOT_KIT_CONFIG);
|
|
5
|
+
}
|
|
6
|
+
export function provideCopilotKit(config) {
|
|
7
|
+
return { provide: COPILOT_KIT_CONFIG, useValue: config };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFvQmpFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUNsRCxvQkFBb0IsQ0FDckIsQ0FBQztBQUVGLE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQXdCO0lBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGlvblRva2VuLCBQcm92aWRlciB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEFnZW50IH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcbmltcG9ydCB7XG4gIENsaWVudFRvb2wsXG4gIEZyb250ZW5kVG9vbENvbmZpZyxcbiAgSHVtYW5JblRoZUxvb3BDb25maWcsXG4gIFJlbmRlclRvb2xDYWxsQ29uZmlnLFxufSBmcm9tIFwiLi90b29sc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RLaXRDb25maWcge1xuICBydW50aW1lVXJsPzogc3RyaW5nO1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBhZ2VudHM/OiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdEFnZW50PjtcbiAgdG9vbHM/OiBDbGllbnRUb29sW107XG4gIHJlbmRlclRvb2xDYWxscz86IFJlbmRlclRvb2xDYWxsQ29uZmlnW107XG4gIGZyb250ZW5kVG9vbHM/OiBGcm9udGVuZFRvb2xDb25maWdbXTtcbiAgaHVtYW5JblRoZUxvb3A/OiBIdW1hbkluVGhlTG9vcENvbmZpZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgQ09QSUxPVF9LSVRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPENvcGlsb3RLaXRDb25maWc+KFxuICBcIkNPUElMT1RfS0lUX0NPTkZJR1wiXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q29waWxvdEtpdENvbmZpZygpOiBDb3BpbG90S2l0Q29uZmlnIHtcbiAgcmV0dXJuIGluamVjdChDT1BJTE9UX0tJVF9DT05GSUcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUNvcGlsb3RLaXQoY29uZmlnOiBDb3BpbG90S2l0Q29uZmlnKTogUHJvdmlkZXIge1xuICByZXR1cm4geyBwcm92aWRlOiBDT1BJTE9UX0tJVF9DT05GSUcsIHVzZVZhbHVlOiBjb25maWcgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { CopilotKitCore } from "@copilotkitnext/core";
|
|
2
|
+
import { Injectable, Injector, runInInjectionContext, signal, inject, } from "@angular/core";
|
|
3
|
+
import { injectCopilotKitConfig } from "./config";
|
|
4
|
+
import { HumanInTheLoop } from "./human-in-the-loop";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class CopilotKit {
|
|
7
|
+
#config = injectCopilotKitConfig();
|
|
8
|
+
#hitl = inject(HumanInTheLoop);
|
|
9
|
+
#rootInjector = inject(Injector);
|
|
10
|
+
#agents = signal(this.#config.agents ?? {});
|
|
11
|
+
agents = this.#agents.asReadonly();
|
|
12
|
+
core = new CopilotKitCore({
|
|
13
|
+
runtimeUrl: this.#config.runtimeUrl,
|
|
14
|
+
headers: this.#config.headers,
|
|
15
|
+
properties: this.#config.properties,
|
|
16
|
+
agents: this.#config.agents,
|
|
17
|
+
tools: this.#config.tools,
|
|
18
|
+
});
|
|
19
|
+
#toolCallRenderConfigs = signal([]);
|
|
20
|
+
#clientToolCallRenderConfigs = signal([]);
|
|
21
|
+
#humanInTheLoopToolRenderConfigs = signal([]);
|
|
22
|
+
toolCallRenderConfigs = this.#toolCallRenderConfigs.asReadonly();
|
|
23
|
+
clientToolCallRenderConfigs = this.#clientToolCallRenderConfigs.asReadonly();
|
|
24
|
+
humanInTheLoopToolRenderConfigs = this.#humanInTheLoopToolRenderConfigs.asReadonly();
|
|
25
|
+
constructor() {
|
|
26
|
+
this.#config.renderToolCalls?.forEach((renderConfig) => {
|
|
27
|
+
this.addRenderToolCall(renderConfig);
|
|
28
|
+
});
|
|
29
|
+
this.#config.tools?.forEach((tool) => {
|
|
30
|
+
if (tool.renderer && tool.parameters) {
|
|
31
|
+
this.addRenderToolCall({
|
|
32
|
+
name: tool.name,
|
|
33
|
+
args: tool.parameters,
|
|
34
|
+
component: tool.renderer,
|
|
35
|
+
agentId: tool.agentId,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
this.#config.frontendTools?.forEach((clientTool) => {
|
|
40
|
+
this.addFrontendTool({ ...clientTool, injector: this.#rootInjector });
|
|
41
|
+
});
|
|
42
|
+
this.#config.humanInTheLoop?.forEach((humanInTheLoopTool) => {
|
|
43
|
+
this.addHumanInTheLoop(humanInTheLoopTool);
|
|
44
|
+
});
|
|
45
|
+
this.core.subscribe({
|
|
46
|
+
onAgentsChanged: () => {
|
|
47
|
+
this.#agents.set(this.core.agents);
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
#bindClientTool(clientToolWithInjector) {
|
|
52
|
+
const { injector, handler, ...frontendCandidate } = clientToolWithInjector;
|
|
53
|
+
return {
|
|
54
|
+
...frontendCandidate,
|
|
55
|
+
handler: (args) => runInInjectionContext(injector, () => handler(args)),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
addFrontendTool(clientToolWithInjector) {
|
|
59
|
+
const tool = this.#bindClientTool(clientToolWithInjector);
|
|
60
|
+
this.core.addTool(tool);
|
|
61
|
+
this.#clientToolCallRenderConfigs.update((current) => [
|
|
62
|
+
...current,
|
|
63
|
+
clientToolWithInjector,
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
addRenderToolCall(renderConfig) {
|
|
67
|
+
this.#toolCallRenderConfigs.update((current) => [...current, renderConfig]);
|
|
68
|
+
}
|
|
69
|
+
#bindHumanInTheLoopTool(humanInTheLoopTool) {
|
|
70
|
+
return {
|
|
71
|
+
...humanInTheLoopTool,
|
|
72
|
+
handler: (args, toolCall) => {
|
|
73
|
+
return this.#hitl.onResult(toolCall.id, humanInTheLoopTool.name);
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
addHumanInTheLoop(humanInTheLoopTool) {
|
|
78
|
+
this.#humanInTheLoopToolRenderConfigs.update((current) => [
|
|
79
|
+
...current,
|
|
80
|
+
humanInTheLoopTool,
|
|
81
|
+
]);
|
|
82
|
+
const tool = this.#bindHumanInTheLoopTool(humanInTheLoopTool);
|
|
83
|
+
this.core.addTool(tool);
|
|
84
|
+
}
|
|
85
|
+
#isSameAgentId(target, agentId) {
|
|
86
|
+
if (agentId) {
|
|
87
|
+
return target.agentId === agentId;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
removeTool(toolName, agentId) {
|
|
92
|
+
this.core.removeTool(toolName);
|
|
93
|
+
this.#clientToolCallRenderConfigs.update((current) => current.filter((renderConfig) => renderConfig.name !== toolName &&
|
|
94
|
+
this.#isSameAgentId(renderConfig, agentId)));
|
|
95
|
+
this.#humanInTheLoopToolRenderConfigs.update((current) => current.filter((renderConfig) => renderConfig.name !== toolName &&
|
|
96
|
+
this.#isSameAgentId(renderConfig, agentId)));
|
|
97
|
+
this.#toolCallRenderConfigs.update((current) => current.filter((renderConfig) => renderConfig.name !== toolName &&
|
|
98
|
+
this.#isSameAgentId(renderConfig, agentId)));
|
|
99
|
+
}
|
|
100
|
+
getAgent(agentId) {
|
|
101
|
+
return this.core.getAgent(agentId);
|
|
102
|
+
}
|
|
103
|
+
updateRuntime(options) {
|
|
104
|
+
if (options.runtimeUrl !== undefined) {
|
|
105
|
+
this.core.setRuntimeUrl(options.runtimeUrl);
|
|
106
|
+
}
|
|
107
|
+
if (options.headers !== undefined) {
|
|
108
|
+
this.core.setHeaders(options.headers);
|
|
109
|
+
}
|
|
110
|
+
if (options.properties !== undefined) {
|
|
111
|
+
this.core.setProperties(options.properties);
|
|
112
|
+
}
|
|
113
|
+
if (options.agents !== undefined) {
|
|
114
|
+
this.core.setAgents(options.agents);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKit, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
118
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKit, providedIn: "root" });
|
|
119
|
+
}
|
|
120
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKit, decorators: [{
|
|
121
|
+
type: Injectable,
|
|
122
|
+
args: [{ providedIn: "root" }]
|
|
123
|
+
}], ctorParameters: () => [] });
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY29waWxvdGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWdCLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUdSLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBTXZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBR3JELE1BQU0sT0FBTyxVQUFVO0lBQ1osT0FBTyxHQUFHLHNCQUFzQixFQUFFLENBQUM7SUFDbkMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxNQUFNLENBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FDMUIsQ0FBQztJQUNPLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRW5DLElBQUksR0FBRyxJQUFJLGNBQWMsQ0FBQztRQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1FBQ25DLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87UUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtRQUNuQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1FBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7S0FDMUIsQ0FBQyxDQUFDO0lBRU0sc0JBQXNCLEdBQzdCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNKLDRCQUE0QixH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Q0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQzt3R0EvS1UsVUFBVTs0R0FBVixVQUFVLGNBREcsTUFBTTs7NEZBQ25CLFVBQVU7a0JBRHRCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RBZ2VudCB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5pbXBvcnQgeyBGcm9udGVuZFRvb2wsIENvcGlsb3RLaXRDb3JlIH0gZnJvbSBcIkBjb3BpbG90a2l0bmV4dC9jb3JlXCI7XG5pbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3RvcixcbiAgU2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0LFxuICBzaWduYWwsXG4gIGluamVjdCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIEZyb250ZW5kVG9vbENvbmZpZyxcbiAgSHVtYW5JblRoZUxvb3BDb25maWcsXG4gIFJlbmRlclRvb2xDYWxsQ29uZmlnLFxufSBmcm9tIFwiLi90b29sc1wiO1xuaW1wb3J0IHsgaW5qZWN0Q29waWxvdEtpdENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgSHVtYW5JblRoZUxvb3AgfSBmcm9tIFwiLi9odW1hbi1pbi10aGUtbG9vcFwiO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdCB7XG4gIHJlYWRvbmx5ICNjb25maWcgPSBpbmplY3RDb3BpbG90S2l0Q29uZmlnKCk7XG4gIHJlYWRvbmx5ICNoaXRsID0gaW5qZWN0KEh1bWFuSW5UaGVMb29wKTtcbiAgcmVhZG9ubHkgI3Jvb3RJbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHJlYWRvbmx5ICNhZ2VudHMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD4+KFxuICAgIHRoaXMuI2NvbmZpZy5hZ2VudHMgPz8ge31cbiAgKTtcbiAgcmVhZG9ubHkgYWdlbnRzID0gdGhpcy4jYWdlbnRzLmFzUmVhZG9ubHkoKTtcblxuICByZWFkb25seSBjb3JlID0gbmV3IENvcGlsb3RLaXRDb3JlKHtcbiAgICBydW50aW1lVXJsOiB0aGlzLiNjb25maWcucnVudGltZVVybCxcbiAgICBoZWFkZXJzOiB0aGlzLiNjb25maWcuaGVhZGVycyxcbiAgICBwcm9wZXJ0aWVzOiB0aGlzLiNjb25maWcucHJvcGVydGllcyxcbiAgICBhZ2VudHM6IHRoaXMuI2NvbmZpZy5hZ2VudHMsXG4gICAgdG9vbHM6IHRoaXMuI2NvbmZpZy50b29scyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgI3Rvb2xDYWxsUmVuZGVyQ29uZmlnczogV3JpdGFibGVTaWduYWw8UmVuZGVyVG9vbENhbGxDb25maWdbXT4gPVxuICAgIHNpZ25hbChbXSk7XG4gIHJlYWRvbmx5ICNjbGllbnRUb29sQ2FsbFJlbmRlckNvbmZpZ3M6IFdyaXRhYmxlU2lnbmFsPEZyb250ZW5kVG9vbENvbmZpZ1tdPiA9XG4gICAgc2lnbmFsKFtdKTtcbiAgcmVhZG9ubHkgI2h1bWFuSW5UaGVMb29wVG9vbFJlbmRlckNvbmZpZ3M6IFdyaXRhYmxlU2lnbmFsPFxuICAgIEh1bWFuSW5UaGVMb29wQ29uZmlnW11cbiAgPiA9IHNpZ25hbChbXSk7XG5cbiAgcmVhZG9ubHkgdG9vbENhbGxSZW5kZXJDb25maWdzOiBTaWduYWw8UmVuZGVyVG9vbENhbGxDb25maWdbXT4gPVxuICAgIHRoaXMuI3Rvb2xDYWxsUmVuZGVyQ29uZmlncy5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGNsaWVudFRvb2xDYWxsUmVuZGVyQ29uZmlnczogU2lnbmFsPEZyb250ZW5kVG9vbENvbmZpZ1tdPiA9XG4gICAgdGhpcy4jY2xpZW50VG9vbENhbGxSZW5kZXJDb25maWdzLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgaHVtYW5JblRoZUxvb3BUb29sUmVuZGVyQ29uZmlnczogU2lnbmFsPEh1bWFuSW5UaGVMb29wQ29uZmlnW10+ID1cbiAgICB0aGlzLiNodW1hbkluVGhlTG9vcFRvb2xSZW5kZXJDb25maWdzLmFzUmVhZG9ubHkoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNjb25maWcucmVuZGVyVG9vbENhbGxzPy5mb3JFYWNoKChyZW5kZXJDb25maWcpID0+IHtcbiAgICAgIHRoaXMuYWRkUmVuZGVyVG9vbENhbGwocmVuZGVyQ29uZmlnKTtcbiAgICB9KTtcblxuICAgIHRoaXMuI2NvbmZpZy50b29scz8uZm9yRWFjaCgodG9vbCkgPT4ge1xuICAgICAgaWYgKHRvb2wucmVuZGVyZXIgJiYgdG9vbC5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuYWRkUmVuZGVyVG9vbENhbGwoe1xuICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICBhcmdzOiB0b29sLnBhcmFtZXRlcnMsXG4gICAgICAgICAgY29tcG9uZW50OiB0b29sLnJlbmRlcmVyLFxuICAgICAgICAgIGFnZW50SWQ6IHRvb2wuYWdlbnRJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLiNjb25maWcuZnJvbnRlbmRUb29scz8uZm9yRWFjaCgoY2xpZW50VG9vbCkgPT4ge1xuICAgICAgdGhpcy5hZGRGcm9udGVuZFRvb2woeyAuLi5jbGllbnRUb29sLCBpbmplY3RvcjogdGhpcy4jcm9vdEluamVjdG9yIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy4jY29uZmlnLmh1bWFuSW5UaGVMb29wPy5mb3JFYWNoKChodW1hbkluVGhlTG9vcFRvb2wpID0+IHtcbiAgICAgIHRoaXMuYWRkSHVtYW5JblRoZUxvb3AoaHVtYW5JblRoZUxvb3BUb29sKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29yZS5zdWJzY3JpYmUoe1xuICAgICAgb25BZ2VudHNDaGFuZ2VkOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2FnZW50cy5zZXQodGhpcy5jb3JlLmFnZW50cyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgI2JpbmRDbGllbnRUb29sKFxuICAgIGNsaWVudFRvb2xXaXRoSW5qZWN0b3I6IEZyb250ZW5kVG9vbENvbmZpZyAmIHtcbiAgICAgIGluamVjdG9yOiBJbmplY3RvcjtcbiAgICB9XG4gICk6IEZyb250ZW5kVG9vbCB7XG4gICAgY29uc3QgeyBpbmplY3RvciwgaGFuZGxlciwgLi4uZnJvbnRlbmRDYW5kaWRhdGUgfSA9IGNsaWVudFRvb2xXaXRoSW5qZWN0b3I7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZnJvbnRlbmRDYW5kaWRhdGUsXG4gICAgICBoYW5kbGVyOiAoYXJncykgPT4gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiBoYW5kbGVyKGFyZ3MpKSxcbiAgICB9O1xuICB9XG5cbiAgYWRkRnJvbnRlbmRUb29sKFxuICAgIGNsaWVudFRvb2xXaXRoSW5qZWN0b3I6IEZyb250ZW5kVG9vbENvbmZpZyAmIHtcbiAgICAgIGluamVjdG9yOiBJbmplY3RvcjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRvb2wgPSB0aGlzLiNiaW5kQ2xpZW50VG9vbChjbGllbnRUb29sV2l0aEluamVjdG9yKTtcblxuICAgIHRoaXMuY29yZS5hZGRUb29sKHRvb2wpO1xuXG4gICAgdGhpcy4jY2xpZW50VG9vbENhbGxSZW5kZXJDb25maWdzLnVwZGF0ZSgoY3VycmVudCkgPT4gW1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGNsaWVudFRvb2xXaXRoSW5qZWN0b3IsXG4gICAgXSk7XG4gIH1cblxuICBhZGRSZW5kZXJUb29sQ2FsbChyZW5kZXJDb25maWc6IFJlbmRlclRvb2xDYWxsQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy4jdG9vbENhbGxSZW5kZXJDb25maWdzLnVwZGF0ZSgoY3VycmVudCkgPT4gWy4uLmN1cnJlbnQsIHJlbmRlckNvbmZpZ10pO1xuICB9XG5cbiAgI2JpbmRIdW1hbkluVGhlTG9vcFRvb2woXG4gICAgaHVtYW5JblRoZUxvb3BUb29sOiBIdW1hbkluVGhlTG9vcENvbmZpZ1xuICApOiBGcm9udGVuZFRvb2wge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5odW1hbkluVGhlTG9vcFRvb2wsXG4gICAgICBoYW5kbGVyOiAoYXJncywgdG9vbENhbGwpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hpdGwub25SZXN1bHQodG9vbENhbGwuaWQsIGh1bWFuSW5UaGVMb29wVG9vbC5uYW1lKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGFkZEh1bWFuSW5UaGVMb29wKGh1bWFuSW5UaGVMb29wVG9vbDogSHVtYW5JblRoZUxvb3BDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLiNodW1hbkluVGhlTG9vcFRvb2xSZW5kZXJDb25maWdzLnVwZGF0ZSgoY3VycmVudCkgPT4gW1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGh1bWFuSW5UaGVMb29wVG9vbCxcbiAgICBdKTtcblxuICAgIGNvbnN0IHRvb2wgPSB0aGlzLiNiaW5kSHVtYW5JblRoZUxvb3BUb29sKGh1bWFuSW5UaGVMb29wVG9vbCk7XG5cbiAgICB0aGlzLmNvcmUuYWRkVG9vbCh0b29sKTtcbiAgfVxuXG4gICNpc1NhbWVBZ2VudElkPFQgZXh0ZW5kcyB7IGFnZW50SWQ/OiBzdHJpbmcgfT4oXG4gICAgdGFyZ2V0OiBULFxuICAgIGFnZW50SWQ/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGFnZW50SWQpIHtcbiAgICAgIHJldHVybiB0YXJnZXQuYWdlbnRJZCA9PT0gYWdlbnRJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJlbW92ZVRvb2wodG9vbE5hbWU6IHN0cmluZywgYWdlbnRJZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5yZW1vdmVUb29sKHRvb2xOYW1lKTtcbiAgICB0aGlzLiNjbGllbnRUb29sQ2FsbFJlbmRlckNvbmZpZ3MudXBkYXRlKChjdXJyZW50KSA9PlxuICAgICAgY3VycmVudC5maWx0ZXIoXG4gICAgICAgIChyZW5kZXJDb25maWcpID0+XG4gICAgICAgICAgcmVuZGVyQ29uZmlnLm5hbWUgIT09IHRvb2xOYW1lICYmXG4gICAgICAgICAgdGhpcy4jaXNTYW1lQWdlbnRJZChyZW5kZXJDb25maWcsIGFnZW50SWQpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLiNodW1hbkluVGhlTG9vcFRvb2xSZW5kZXJDb25maWdzLnVwZGF0ZSgoY3VycmVudCkgPT5cbiAgICAgIGN1cnJlbnQuZmlsdGVyKFxuICAgICAgICAocmVuZGVyQ29uZmlnKSA9PlxuICAgICAgICAgIHJlbmRlckNvbmZpZy5uYW1lICE9PSB0b29sTmFtZSAmJlxuICAgICAgICAgIHRoaXMuI2lzU2FtZUFnZW50SWQocmVuZGVyQ29uZmlnLCBhZ2VudElkKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy4jdG9vbENhbGxSZW5kZXJDb25maWdzLnVwZGF0ZSgoY3VycmVudCkgPT5cbiAgICAgIGN1cnJlbnQuZmlsdGVyKFxuICAgICAgICAocmVuZGVyQ29uZmlnKSA9PlxuICAgICAgICAgIHJlbmRlckNvbmZpZy5uYW1lICE9PSB0b29sTmFtZSAmJlxuICAgICAgICAgIHRoaXMuI2lzU2FtZUFnZW50SWQocmVuZGVyQ29uZmlnLCBhZ2VudElkKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBnZXRBZ2VudChhZ2VudElkOiBzdHJpbmcpOiBBYnN0cmFjdEFnZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmdldEFnZW50KGFnZW50SWQpO1xuICB9XG5cbiAgdXBkYXRlUnVudGltZShvcHRpb25zOiB7XG4gICAgcnVudGltZVVybD86IHN0cmluZztcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD47XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAob3B0aW9ucy5ydW50aW1lVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29yZS5zZXRSdW50aW1lVXJsKG9wdGlvbnMucnVudGltZVVybCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb3JlLnNldEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvcmUuc2V0UHJvcGVydGllcyhvcHRpb25zLnByb3BlcnRpZXMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hZ2VudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb3JlLnNldEFnZW50cyhvcHRpb25zLmFnZW50cyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Directive, Input, Inject, } from "@angular/core";
|
|
2
|
+
import { CopilotKit } from "../copilotkit";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../copilotkit";
|
|
5
|
+
/**
|
|
6
|
+
* Directive to manage agent context in CopilotKit.
|
|
7
|
+
* Automatically adds context on init, updates on changes, and removes on destroy.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```html
|
|
11
|
+
* <!-- With separate inputs -->
|
|
12
|
+
* <div copilotkitAgentContext
|
|
13
|
+
* [description]="'User preferences'"
|
|
14
|
+
* [value]="userSettings">
|
|
15
|
+
* </div>
|
|
16
|
+
*
|
|
17
|
+
* <!-- With context object -->
|
|
18
|
+
* <div [copilotkitAgentContext]="contextObject">
|
|
19
|
+
* </div>
|
|
20
|
+
*
|
|
21
|
+
* <!-- With dynamic values -->
|
|
22
|
+
* <div copilotkitAgentContext
|
|
23
|
+
* description="Form state"
|
|
24
|
+
* [value]="formData$ | async">
|
|
25
|
+
* </div>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export class CopilotKitAgentContext {
|
|
29
|
+
copilotkit;
|
|
30
|
+
contextId;
|
|
31
|
+
constructor(copilotkit) {
|
|
32
|
+
this.copilotkit = copilotkit;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Context object containing both description and value.
|
|
36
|
+
* If provided, this takes precedence over individual inputs.
|
|
37
|
+
*/
|
|
38
|
+
context;
|
|
39
|
+
/**
|
|
40
|
+
* Description of the context.
|
|
41
|
+
* Used when context object is not provided.
|
|
42
|
+
*/
|
|
43
|
+
description;
|
|
44
|
+
/**
|
|
45
|
+
* Value of the context.
|
|
46
|
+
* Used when context object is not provided.
|
|
47
|
+
*/
|
|
48
|
+
value;
|
|
49
|
+
ngOnInit() {
|
|
50
|
+
this.addContext();
|
|
51
|
+
}
|
|
52
|
+
ngOnChanges(changes) {
|
|
53
|
+
// Check if any relevant input has changed
|
|
54
|
+
const hasContextChange = "context" in changes;
|
|
55
|
+
const hasDescriptionChange = "description" in changes;
|
|
56
|
+
const hasValueChange = "value" in changes;
|
|
57
|
+
if (hasContextChange || hasDescriptionChange || hasValueChange) {
|
|
58
|
+
// Skip the first change as ngOnInit handles initial setup
|
|
59
|
+
if (this.contextId) {
|
|
60
|
+
this.updateContext();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
ngOnDestroy() {
|
|
65
|
+
this.removeContext();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Adds the context to CopilotKit
|
|
69
|
+
*/
|
|
70
|
+
addContext() {
|
|
71
|
+
const contextToAdd = this.getContext();
|
|
72
|
+
if (contextToAdd) {
|
|
73
|
+
this.contextId = this.copilotkit.core.addContext(contextToAdd);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Updates the context by removing the old one and adding a new one
|
|
78
|
+
*/
|
|
79
|
+
updateContext() {
|
|
80
|
+
this.removeContext();
|
|
81
|
+
this.addContext();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Removes the current context from CopilotKit
|
|
85
|
+
*/
|
|
86
|
+
removeContext() {
|
|
87
|
+
if (this.contextId) {
|
|
88
|
+
this.copilotkit.core.removeContext(this.contextId);
|
|
89
|
+
this.contextId = undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Gets the context object from inputs
|
|
94
|
+
*/
|
|
95
|
+
getContext() {
|
|
96
|
+
// If context object is provided, use it
|
|
97
|
+
if (this.context) {
|
|
98
|
+
return this.context;
|
|
99
|
+
}
|
|
100
|
+
// Otherwise, build from individual inputs
|
|
101
|
+
// Note: null is a valid value, but undefined means not set
|
|
102
|
+
if (this.description !== undefined && this.value !== undefined) {
|
|
103
|
+
return {
|
|
104
|
+
description: this.description,
|
|
105
|
+
value: this.value,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitAgentContext, deps: [{ token: CopilotKit }], target: i0.ɵɵFactoryTarget.Directive });
|
|
111
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitAgentContext, isStandalone: true, selector: "[copilotkitAgentContext]", inputs: { context: ["copilotkitAgentContext", "context"], description: "description", value: "value" }, usesOnChanges: true, ngImport: i0 });
|
|
112
|
+
}
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitAgentContext, decorators: [{
|
|
114
|
+
type: Directive,
|
|
115
|
+
args: [{
|
|
116
|
+
selector: "[copilotkitAgentContext]",
|
|
117
|
+
standalone: true,
|
|
118
|
+
}]
|
|
119
|
+
}], ctorParameters: () => [{ type: i1.CopilotKit, decorators: [{
|
|
120
|
+
type: Inject,
|
|
121
|
+
args: [CopilotKit]
|
|
122
|
+
}] }], propDecorators: { context: [{
|
|
123
|
+
type: Input,
|
|
124
|
+
args: ["copilotkitAgentContext"]
|
|
125
|
+
}], description: [{
|
|
126
|
+
type: Input
|
|
127
|
+
}], value: [{
|
|
128
|
+
type: Input
|
|
129
|
+
}] } });
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1hZ2VudC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kaXJlY3RpdmVzL2NvcGlsb3RraXQtYWdlbnQtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFLTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBRzNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBS0gsTUFBTSxPQUFPLHNCQUFzQjtJQUdnQjtJQUZ6QyxTQUFTLENBQVU7SUFFM0IsWUFBaUQsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUFHLENBQUM7SUFFM0U7OztPQUdHO0lBQzhCLE9BQU8sQ0FBVztJQUVuRDs7O09BR0c7SUFDTSxXQUFXLENBQVU7SUFFOUI7OztPQUdHO0lBQ00sS0FBSyxDQUFPO0lBRXJCLFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQywwQ0FBMEM7UUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLElBQUksT0FBTyxDQUFDO1FBQzlDLE1BQU0sb0JBQW9CLEdBQUcsYUFBYSxJQUFJLE9BQU8sQ0FBQztRQUN0RCxNQUFNLGNBQWMsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDO1FBRTFDLElBQUksZ0JBQWdCLElBQUksb0JBQW9CLElBQUksY0FBYyxFQUFFLENBQUM7WUFDL0QsMERBQTBEO1lBQzFELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVO1FBQ2hCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVO1FBQ2hCLHdDQUF3QztRQUN4QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQztRQUVELDBDQUEwQztRQUMxQywyREFBMkQ7UUFDM0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9ELE9BQU87Z0JBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7YUFDbEIsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7d0dBN0ZVLHNCQUFzQixrQkFHYixVQUFVOzRGQUhuQixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFJYyxNQUFNOzJCQUFDLFVBQVU7eUNBTUcsT0FBTztzQkFBdkMsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBTXRCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgSW5qZWN0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29waWxvdEtpdCB9IGZyb20gXCIuLi9jb3BpbG90a2l0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB0byBtYW5hZ2UgYWdlbnQgY29udGV4dCBpbiBDb3BpbG90S2l0LlxuICogQXV0b21hdGljYWxseSBhZGRzIGNvbnRleHQgb24gaW5pdCwgdXBkYXRlcyBvbiBjaGFuZ2VzLCBhbmQgcmVtb3ZlcyBvbiBkZXN0cm95LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIFdpdGggc2VwYXJhdGUgaW5wdXRzIC0tPlxuICogPGRpdiBjb3BpbG90a2l0QWdlbnRDb250ZXh0XG4gKiAgICAgIFtkZXNjcmlwdGlvbl09XCInVXNlciBwcmVmZXJlbmNlcydcIlxuICogICAgICBbdmFsdWVdPVwidXNlclNldHRpbmdzXCI+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8IS0tIFdpdGggY29udGV4dCBvYmplY3QgLS0+XG4gKiA8ZGl2IFtjb3BpbG90a2l0QWdlbnRDb250ZXh0XT1cImNvbnRleHRPYmplY3RcIj5cbiAqIDwvZGl2PlxuICpcbiAqIDwhLS0gV2l0aCBkeW5hbWljIHZhbHVlcyAtLT5cbiAqIDxkaXYgY29waWxvdGtpdEFnZW50Q29udGV4dFxuICogICAgICBkZXNjcmlwdGlvbj1cIkZvcm0gc3RhdGVcIlxuICogICAgICBbdmFsdWVdPVwiZm9ybURhdGEkIHwgYXN5bmNcIj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbY29waWxvdGtpdEFnZW50Q29udGV4dF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdEFnZW50Q29udGV4dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGNvbnRleHRJZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KENvcGlsb3RLaXQpIHByaXZhdGUgcmVhZG9ubHkgY29waWxvdGtpdDogQ29waWxvdEtpdCkge31cblxuICAvKipcbiAgICogQ29udGV4dCBvYmplY3QgY29udGFpbmluZyBib3RoIGRlc2NyaXB0aW9uIGFuZCB2YWx1ZS5cbiAgICogSWYgcHJvdmlkZWQsIHRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGluZGl2aWR1YWwgaW5wdXRzLlxuICAgKi9cbiAgQElucHV0KFwiY29waWxvdGtpdEFnZW50Q29udGV4dFwiKSBjb250ZXh0PzogQ29udGV4dDtcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIGNvbnRleHQuXG4gICAqIFVzZWQgd2hlbiBjb250ZXh0IG9iamVjdCBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgb2YgdGhlIGNvbnRleHQuXG4gICAqIFVzZWQgd2hlbiBjb250ZXh0IG9iamVjdCBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZT86IGFueTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENvbnRleHQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiBhbnkgcmVsZXZhbnQgaW5wdXQgaGFzIGNoYW5nZWRcbiAgICBjb25zdCBoYXNDb250ZXh0Q2hhbmdlID0gXCJjb250ZXh0XCIgaW4gY2hhbmdlcztcbiAgICBjb25zdCBoYXNEZXNjcmlwdGlvbkNoYW5nZSA9IFwiZGVzY3JpcHRpb25cIiBpbiBjaGFuZ2VzO1xuICAgIGNvbnN0IGhhc1ZhbHVlQ2hhbmdlID0gXCJ2YWx1ZVwiIGluIGNoYW5nZXM7XG5cbiAgICBpZiAoaGFzQ29udGV4dENoYW5nZSB8fCBoYXNEZXNjcmlwdGlvbkNoYW5nZSB8fCBoYXNWYWx1ZUNoYW5nZSkge1xuICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgY2hhbmdlIGFzIG5nT25Jbml0IGhhbmRsZXMgaW5pdGlhbCBzZXR1cFxuICAgICAgaWYgKHRoaXMuY29udGV4dElkKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlQ29udGV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGNvbnRleHQgdG8gQ29waWxvdEtpdFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHRUb0FkZCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgaWYgKGNvbnRleHRUb0FkZCkge1xuICAgICAgdGhpcy5jb250ZXh0SWQgPSB0aGlzLmNvcGlsb3RraXQuY29yZS5hZGRDb250ZXh0KGNvbnRleHRUb0FkZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNvbnRleHQgYnkgcmVtb3ZpbmcgdGhlIG9sZCBvbmUgYW5kIGFkZGluZyBhIG5ldyBvbmVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29udGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUNvbnRleHQoKTtcbiAgICB0aGlzLmFkZENvbnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGNvbnRleHQgZnJvbSBDb3BpbG90S2l0XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUNvbnRleHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dElkKSB7XG4gICAgICB0aGlzLmNvcGlsb3RraXQuY29yZS5yZW1vdmVDb250ZXh0KHRoaXMuY29udGV4dElkKTtcbiAgICAgIHRoaXMuY29udGV4dElkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZXh0IG9iamVjdCBmcm9tIGlucHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHtcbiAgICAvLyBJZiBjb250ZXh0IG9iamVjdCBpcyBwcm92aWRlZCwgdXNlIGl0XG4gICAgaWYgKHRoaXMuY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGJ1aWxkIGZyb20gaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAvLyBOb3RlOiBudWxsIGlzIGEgdmFsaWQgdmFsdWUsIGJ1dCB1bmRlZmluZWQgbWVhbnMgbm90IHNldFxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
|