@copilotkitnext/angular 0.0.1 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +248 -0
- package/dist/README.md +248 -0
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +430 -0
- package/dist/esm2022/core/copilotkit.types.mjs +12 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/styles.css +0 -27
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -39
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/README-agent-context.md +0 -310
- package/ng-package.json +0 -19
- package/slots.md +0 -331
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { inject } from '@angular/core';
|
|
2
|
+
import { CopilotChatConfigurationService } from '../core/chat-configuration/chat-configuration.service';
|
|
3
|
+
/**
|
|
4
|
+
* Watches chat configuration and provides reactive access to all configuration values.
|
|
5
|
+
* Must be called within an injection context.
|
|
6
|
+
*
|
|
7
|
+
* @returns Object with reactive signals and handler functions
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* export class ChatInputComponent {
|
|
12
|
+
* config = watchChatConfig();
|
|
13
|
+
*
|
|
14
|
+
* constructor() {
|
|
15
|
+
* effect(() => {
|
|
16
|
+
* const placeholder = this.config.labels().chatInputPlaceholder;
|
|
17
|
+
* console.log('Placeholder:', placeholder);
|
|
18
|
+
* });
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* handleSubmit(value: string) {
|
|
22
|
+
* this.config.submitInput(value);
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function watchChatConfig() {
|
|
28
|
+
const service = inject(CopilotChatConfigurationService);
|
|
29
|
+
return {
|
|
30
|
+
labels: service.labels,
|
|
31
|
+
inputValue: service.inputValue,
|
|
32
|
+
submitInput: (value) => service.submitInput(value),
|
|
33
|
+
changeInput: (value) => service.changeInput(value)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Registers chat configuration within an injection context.
|
|
38
|
+
* Automatically updates the configuration when called.
|
|
39
|
+
*
|
|
40
|
+
* @param config - The configuration to register
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* export class ChatComponent {
|
|
45
|
+
* constructor() {
|
|
46
|
+
* registerChatConfig({
|
|
47
|
+
* labels: {
|
|
48
|
+
* chatInputPlaceholder: "How can I help?"
|
|
49
|
+
* },
|
|
50
|
+
* onSubmitInput: (value) => this.handleSubmit(value)
|
|
51
|
+
* });
|
|
52
|
+
* }
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function registerChatConfig(config) {
|
|
57
|
+
const service = inject(CopilotChatConfigurationService);
|
|
58
|
+
service.updateConfiguration(config);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Gets the current chat labels signal.
|
|
62
|
+
*
|
|
63
|
+
* @param service - The CopilotChatConfigurationService instance
|
|
64
|
+
* @returns Signal containing the current labels
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* export class ChatComponent {
|
|
69
|
+
* constructor(private chatConfig: CopilotChatConfigurationService) {
|
|
70
|
+
* const labels = getChatLabels(this.chatConfig);
|
|
71
|
+
* effect(() => {
|
|
72
|
+
* console.log('Current labels:', labels());
|
|
73
|
+
* });
|
|
74
|
+
* }
|
|
75
|
+
* }
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function getChatLabels(service) {
|
|
79
|
+
return service.labels;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Updates chat labels.
|
|
83
|
+
*
|
|
84
|
+
* @param service - The CopilotChatConfigurationService instance
|
|
85
|
+
* @param labels - Partial labels to merge with defaults
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* export class ChatComponent {
|
|
90
|
+
* updatePlaceholder(text: string) {
|
|
91
|
+
* setChatLabels(this.chatConfig, {
|
|
92
|
+
* chatInputPlaceholder: text
|
|
93
|
+
* });
|
|
94
|
+
* }
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function setChatLabels(service, labels) {
|
|
99
|
+
service.setLabels(labels);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets the current input value signal.
|
|
103
|
+
*
|
|
104
|
+
* @param service - The CopilotChatConfigurationService instance
|
|
105
|
+
* @returns Signal containing the current input value
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* export class ChatInputComponent {
|
|
110
|
+
* inputValue = getChatInputValue(this.chatConfig);
|
|
111
|
+
*
|
|
112
|
+
* constructor(private chatConfig: CopilotChatConfigurationService) {
|
|
113
|
+
* effect(() => {
|
|
114
|
+
* const value = this.inputValue();
|
|
115
|
+
* if (value) {
|
|
116
|
+
* this.updateTextarea(value);
|
|
117
|
+
* }
|
|
118
|
+
* });
|
|
119
|
+
* }
|
|
120
|
+
* }
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export function getChatInputValue(service) {
|
|
124
|
+
return service.inputValue;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Sets the current input value.
|
|
128
|
+
*
|
|
129
|
+
* @param service - The CopilotChatConfigurationService instance
|
|
130
|
+
* @param value - The new input value
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* export class ChatInputComponent {
|
|
135
|
+
* onInputChange(event: Event) {
|
|
136
|
+
* const value = (event.target as HTMLInputElement).value;
|
|
137
|
+
* setChatInputValue(this.chatConfig, value);
|
|
138
|
+
* }
|
|
139
|
+
* }
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export function setChatInputValue(service, value) {
|
|
143
|
+
service.setInputValue(value);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Creates a chat configuration controller with dynamic update capabilities.
|
|
147
|
+
* This is useful when you need to programmatically manage configuration.
|
|
148
|
+
*
|
|
149
|
+
* @param service - The CopilotChatConfigurationService instance
|
|
150
|
+
* @param initialConfig - Optional initial configuration
|
|
151
|
+
* @returns Controller object with update and reset methods
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```typescript
|
|
155
|
+
* export class ChatManagerComponent {
|
|
156
|
+
* chatController = createChatConfigController(this.chatConfig, {
|
|
157
|
+
* labels: { chatInputPlaceholder: "Ask me..." }
|
|
158
|
+
* });
|
|
159
|
+
*
|
|
160
|
+
* constructor(private chatConfig: CopilotChatConfigurationService) {}
|
|
161
|
+
*
|
|
162
|
+
* updateForSupportMode() {
|
|
163
|
+
* this.chatController.update({
|
|
164
|
+
* labels: { chatInputPlaceholder: "Describe your issue..." }
|
|
165
|
+
* });
|
|
166
|
+
* }
|
|
167
|
+
*
|
|
168
|
+
* resetToDefaults() {
|
|
169
|
+
* this.chatController.reset();
|
|
170
|
+
* }
|
|
171
|
+
* }
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export function createChatConfigController(service, initialConfig) {
|
|
175
|
+
// Apply initial configuration if provided
|
|
176
|
+
if (initialConfig) {
|
|
177
|
+
service.updateConfiguration(initialConfig);
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
update: (config) => service.updateConfiguration(config),
|
|
181
|
+
reset: () => service.reset(),
|
|
182
|
+
getLabels: () => service.labels(),
|
|
183
|
+
getInputValue: () => service.inputValue()
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1jb25maWcudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvY2hhdC1jb25maWcudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQU14Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQU03QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUV4RCxPQUFPO1FBQ0wsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQzFELFdBQVcsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7S0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFnQztJQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLE9BQXdDO0lBRXhDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixPQUF3QyxFQUN4QyxNQUFrQztJQUVsQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixPQUF3QztJQUV4QyxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBd0MsRUFDeEMsS0FBeUI7SUFFekIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLE9BQXdDLEVBQ3hDLGFBQXdDO0lBT3hDLDBDQUEwQztJQUMxQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sRUFBRSxDQUFDLE1BQWdDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7UUFDakYsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7UUFDNUIsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDakMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7S0FDMUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFxuICBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb24sXG4gIENvcGlsb3RDaGF0TGFiZWxzXG59IGZyb20gJy4uL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi50eXBlcyc7XG5cbi8qKlxuICogV2F0Y2hlcyBjaGF0IGNvbmZpZ3VyYXRpb24gYW5kIHByb3ZpZGVzIHJlYWN0aXZlIGFjY2VzcyB0byBhbGwgY29uZmlndXJhdGlvbiB2YWx1ZXMuXG4gKiBNdXN0IGJlIGNhbGxlZCB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQuXG4gKiBcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHJlYWN0aXZlIHNpZ25hbHMgYW5kIGhhbmRsZXIgZnVuY3Rpb25zXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgQ2hhdElucHV0Q29tcG9uZW50IHtcbiAqICAgY29uZmlnID0gd2F0Y2hDaGF0Q29uZmlnKCk7XG4gKiAgIFxuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBlZmZlY3QoKCkgPT4ge1xuICogICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmNvbmZpZy5sYWJlbHMoKS5jaGF0SW5wdXRQbGFjZWhvbGRlcjtcbiAqICAgICAgIGNvbnNvbGUubG9nKCdQbGFjZWhvbGRlcjonLCBwbGFjZWhvbGRlcik7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqICAgXG4gKiAgIGhhbmRsZVN1Ym1pdCh2YWx1ZTogc3RyaW5nKSB7XG4gKiAgICAgdGhpcy5jb25maWcuc3VibWl0SW5wdXQodmFsdWUpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoQ2hhdENvbmZpZygpOiB7XG4gIGxhYmVsczogU2lnbmFsPENvcGlsb3RDaGF0TGFiZWxzPjtcbiAgaW5wdXRWYWx1ZTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHN1Ym1pdElucHV0OiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgY2hhbmdlSW5wdXQ6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHNlcnZpY2UgPSBpbmplY3QoQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSk7XG4gIFxuICByZXR1cm4ge1xuICAgIGxhYmVsczogc2VydmljZS5sYWJlbHMsXG4gICAgaW5wdXRWYWx1ZTogc2VydmljZS5pbnB1dFZhbHVlLFxuICAgIHN1Ym1pdElucHV0OiAodmFsdWU6IHN0cmluZykgPT4gc2VydmljZS5zdWJtaXRJbnB1dCh2YWx1ZSksXG4gICAgY2hhbmdlSW5wdXQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBzZXJ2aWNlLmNoYW5nZUlucHV0KHZhbHVlKVxuICB9O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBjaGF0IGNvbmZpZ3VyYXRpb24gd2l0aGluIGFuIGluamVjdGlvbiBjb250ZXh0LlxuICogQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIHdoZW4gY2FsbGVkLlxuICogXG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gdG8gcmVnaXN0ZXJcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBDaGF0Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgcmVnaXN0ZXJDaGF0Q29uZmlnKHtcbiAqICAgICAgIGxhYmVsczoge1xuICogICAgICAgICBjaGF0SW5wdXRQbGFjZWhvbGRlcjogXCJIb3cgY2FuIEkgaGVscD9cIlxuICogICAgICAgfSxcbiAqICAgICAgIG9uU3VibWl0SW5wdXQ6ICh2YWx1ZSkgPT4gdGhpcy5oYW5kbGVTdWJtaXQodmFsdWUpXG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDaGF0Q29uZmlnKGNvbmZpZzogQ29waWxvdENoYXRDb25maWd1cmF0aW9uKTogdm9pZCB7XG4gIGNvbnN0IHNlcnZpY2UgPSBpbmplY3QoQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSk7XG4gIHNlcnZpY2UudXBkYXRlQ29uZmlndXJhdGlvbihjb25maWcpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgY2hhdCBsYWJlbHMgc2lnbmFsLlxuICogXG4gKiBAcGFyYW0gc2VydmljZSAtIFRoZSBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlIGluc3RhbmNlXG4gKiBAcmV0dXJucyBTaWduYWwgY29udGFpbmluZyB0aGUgY3VycmVudCBsYWJlbHNcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBDaGF0Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGF0Q29uZmlnOiBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlKSB7XG4gKiAgICAgY29uc3QgbGFiZWxzID0gZ2V0Q2hhdExhYmVscyh0aGlzLmNoYXRDb25maWcpO1xuICogICAgIGVmZmVjdCgoKSA9PiB7XG4gKiAgICAgICBjb25zb2xlLmxvZygnQ3VycmVudCBsYWJlbHM6JywgbGFiZWxzKCkpO1xuICogICAgIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoYXRMYWJlbHMoXG4gIHNlcnZpY2U6IENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2Vcbik6IFNpZ25hbDxDb3BpbG90Q2hhdExhYmVscz4ge1xuICByZXR1cm4gc2VydmljZS5sYWJlbHM7XG59XG5cbi8qKlxuICogVXBkYXRlcyBjaGF0IGxhYmVscy5cbiAqIFxuICogQHBhcmFtIHNlcnZpY2UgLSBUaGUgQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSBpbnN0YW5jZVxuICogQHBhcmFtIGxhYmVscyAtIFBhcnRpYWwgbGFiZWxzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHNcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBDaGF0Q29tcG9uZW50IHtcbiAqICAgdXBkYXRlUGxhY2Vob2xkZXIodGV4dDogc3RyaW5nKSB7XG4gKiAgICAgc2V0Q2hhdExhYmVscyh0aGlzLmNoYXRDb25maWcsIHtcbiAqICAgICAgIGNoYXRJbnB1dFBsYWNlaG9sZGVyOiB0ZXh0XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2hhdExhYmVscyhcbiAgc2VydmljZTogQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSxcbiAgbGFiZWxzOiBQYXJ0aWFsPENvcGlsb3RDaGF0TGFiZWxzPlxuKTogdm9pZCB7XG4gIHNlcnZpY2Uuc2V0TGFiZWxzKGxhYmVscyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZSBzaWduYWwuXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UgaW5zdGFuY2VcbiAqIEByZXR1cm5zIFNpZ25hbCBjb250YWluaW5nIHRoZSBjdXJyZW50IGlucHV0IHZhbHVlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgQ2hhdElucHV0Q29tcG9uZW50IHtcbiAqICAgaW5wdXRWYWx1ZSA9IGdldENoYXRJbnB1dFZhbHVlKHRoaXMuY2hhdENvbmZpZyk7XG4gKiAgIFxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYXRDb25maWc6IENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpIHtcbiAqICAgICBlZmZlY3QoKCkgPT4ge1xuICogICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0VmFsdWUoKTtcbiAqICAgICAgIGlmICh2YWx1ZSkge1xuICogICAgICAgICB0aGlzLnVwZGF0ZVRleHRhcmVhKHZhbHVlKTtcbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGF0SW5wdXRWYWx1ZShcbiAgc2VydmljZTogQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZVxuKTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gc2VydmljZS5pbnB1dFZhbHVlO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGN1cnJlbnQgaW5wdXQgdmFsdWUuXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBuZXcgaW5wdXQgdmFsdWVcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBDaGF0SW5wdXRDb21wb25lbnQge1xuICogICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICogICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAqICAgICBzZXRDaGF0SW5wdXRWYWx1ZSh0aGlzLmNoYXRDb25maWcsIHZhbHVlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDaGF0SW5wdXRWYWx1ZShcbiAgc2VydmljZTogQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSxcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogdm9pZCB7XG4gIHNlcnZpY2Uuc2V0SW5wdXRWYWx1ZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNoYXQgY29uZmlndXJhdGlvbiBjb250cm9sbGVyIHdpdGggZHluYW1pYyB1cGRhdGUgY2FwYWJpbGl0aWVzLlxuICogVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBwcm9ncmFtbWF0aWNhbGx5IG1hbmFnZSBjb25maWd1cmF0aW9uLlxuICogXG4gKiBAcGFyYW0gc2VydmljZSAtIFRoZSBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gaW5pdGlhbENvbmZpZyAtIE9wdGlvbmFsIGluaXRpYWwgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ29udHJvbGxlciBvYmplY3Qgd2l0aCB1cGRhdGUgYW5kIHJlc2V0IG1ldGhvZHNcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBDaGF0TWFuYWdlckNvbXBvbmVudCB7XG4gKiAgIGNoYXRDb250cm9sbGVyID0gY3JlYXRlQ2hhdENvbmZpZ0NvbnRyb2xsZXIodGhpcy5jaGF0Q29uZmlnLCB7XG4gKiAgICAgbGFiZWxzOiB7IGNoYXRJbnB1dFBsYWNlaG9sZGVyOiBcIkFzayBtZS4uLlwiIH1cbiAqICAgfSk7XG4gKiAgIFxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYXRDb25maWc6IENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpIHt9XG4gKiAgIFxuICogICB1cGRhdGVGb3JTdXBwb3J0TW9kZSgpIHtcbiAqICAgICB0aGlzLmNoYXRDb250cm9sbGVyLnVwZGF0ZSh7XG4gKiAgICAgICBsYWJlbHM6IHsgY2hhdElucHV0UGxhY2Vob2xkZXI6IFwiRGVzY3JpYmUgeW91ciBpc3N1ZS4uLlwiIH1cbiAqICAgICB9KTtcbiAqICAgfVxuICogICBcbiAqICAgcmVzZXRUb0RlZmF1bHRzKCkge1xuICogICAgIHRoaXMuY2hhdENvbnRyb2xsZXIucmVzZXQoKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGF0Q29uZmlnQ29udHJvbGxlcihcbiAgc2VydmljZTogQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSxcbiAgaW5pdGlhbENvbmZpZz86IENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblxuKToge1xuICB1cGRhdGU6IChjb25maWc6IENvcGlsb3RDaGF0Q29uZmlndXJhdGlvbikgPT4gdm9pZDtcbiAgcmVzZXQ6ICgpID0+IHZvaWQ7XG4gIGdldExhYmVsczogKCkgPT4gQ29waWxvdENoYXRMYWJlbHM7XG4gIGdldElucHV0VmFsdWU6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0ge1xuICAvLyBBcHBseSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaWYgcHJvdmlkZWRcbiAgaWYgKGluaXRpYWxDb25maWcpIHtcbiAgICBzZXJ2aWNlLnVwZGF0ZUNvbmZpZ3VyYXRpb24oaW5pdGlhbENvbmZpZyk7XG4gIH1cbiAgXG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiAoY29uZmlnOiBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb24pID0+IHNlcnZpY2UudXBkYXRlQ29uZmlndXJhdGlvbihjb25maWcpLFxuICAgIHJlc2V0OiAoKSA9PiBzZXJ2aWNlLnJlc2V0KCksXG4gICAgZ2V0TGFiZWxzOiAoKSA9PiBzZXJ2aWNlLmxhYmVscygpLFxuICAgIGdldElucHV0VmFsdWU6ICgpID0+IHNlcnZpY2UuaW5wdXRWYWx1ZSgpXG4gIH07XG59Il19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { inject } from "@angular/core";
|
|
2
|
+
import { CopilotKitService } from "../core/copilotkit.service";
|
|
3
|
+
/**
|
|
4
|
+
* Utility function to inject the CopilotKit service in a component or directive.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* export class MyComponent {
|
|
9
|
+
* private copilotkit = injectCopilotKit();
|
|
10
|
+
*
|
|
11
|
+
* sendMessage() {
|
|
12
|
+
* this.copilotkit.copilotkit.sendMessage(...);
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function injectCopilotKit() {
|
|
18
|
+
return inject(CopilotKitService);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jb3BpbG90a2l0LnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0Q7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBpbmplY3QgdGhlIENvcGlsb3RLaXQgc2VydmljZSBpbiBhIGNvbXBvbmVudCBvciBkaXJlY3RpdmUuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBwcml2YXRlIGNvcGlsb3RraXQgPSBpbmplY3RDb3BpbG90S2l0KCk7XG4gKiAgIFxuICogICBzZW5kTWVzc2FnZSgpIHtcbiAqICAgICB0aGlzLmNvcGlsb3RraXQuY29waWxvdGtpdC5zZW5kTWVzc2FnZSguLi4pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdENvcGlsb3RLaXQoKSB7XG4gIHJldHVybiBpbmplY3QoQ29waWxvdEtpdFNlcnZpY2UpO1xufSJdfQ==
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { DestroyRef, inject } from '@angular/core';
|
|
2
|
+
import { CopilotKitService } from '../core/copilotkit.service';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
/**
|
|
5
|
+
* Explicitly adds a frontend tool to CopilotKit.
|
|
6
|
+
* Requires CopilotKitService to be passed as a parameter.
|
|
7
|
+
*
|
|
8
|
+
* @param service - The CopilotKitService instance
|
|
9
|
+
* @param tool - The tool to add
|
|
10
|
+
* @returns A cleanup function that removes the tool
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* export class MyComponent implements OnInit, OnDestroy {
|
|
15
|
+
* private cleanupFns: Array<() => void> = [];
|
|
16
|
+
*
|
|
17
|
+
* constructor(private copilotkit: CopilotKitService) {}
|
|
18
|
+
*
|
|
19
|
+
* ngOnInit() {
|
|
20
|
+
* const cleanup = addFrontendTool(this.copilotkit, {
|
|
21
|
+
* name: 'calculator',
|
|
22
|
+
* description: 'Performs calculations',
|
|
23
|
+
* parameters: z.object({
|
|
24
|
+
* expression: z.string()
|
|
25
|
+
* }),
|
|
26
|
+
* handler: async (args) => {
|
|
27
|
+
* return eval(args.expression);
|
|
28
|
+
* }
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* this.cleanupFns.push(cleanup);
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* ngOnDestroy() {
|
|
35
|
+
* this.cleanupFns.forEach(fn => fn());
|
|
36
|
+
* }
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function addFrontendTool(service, tool) {
|
|
41
|
+
// Add the tool to CopilotKit
|
|
42
|
+
service.copilotkit.addTool(tool);
|
|
43
|
+
// Register the render if provided
|
|
44
|
+
if (tool.render) {
|
|
45
|
+
const currentRenders = service.currentRenderToolCalls();
|
|
46
|
+
const existingIndex = currentRenders.findIndex((r) => r.name === tool.name);
|
|
47
|
+
if (existingIndex !== -1) {
|
|
48
|
+
console.error(`Tool with name '${tool.name}' already has a render. Skipping.`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const renderEntry = {
|
|
52
|
+
name: tool.name,
|
|
53
|
+
args: tool.parameters || z.object({}),
|
|
54
|
+
render: tool.render
|
|
55
|
+
};
|
|
56
|
+
service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Return cleanup function
|
|
60
|
+
return () => {
|
|
61
|
+
removeFrontendTool(service, tool.name);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Registers a frontend tool with CopilotKit and automatically removes it when the component/service is destroyed.
|
|
66
|
+
* Must be called within an injection context.
|
|
67
|
+
*
|
|
68
|
+
* @param tool - The tool to register
|
|
69
|
+
* @returns The tool name
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* export class MyComponent implements OnInit {
|
|
74
|
+
* ngOnInit() {
|
|
75
|
+
* // Automatically cleaned up on component destroy
|
|
76
|
+
* registerFrontendTool({
|
|
77
|
+
* name: 'search',
|
|
78
|
+
* description: 'Search for items',
|
|
79
|
+
* parameters: z.object({
|
|
80
|
+
* query: z.string()
|
|
81
|
+
* }),
|
|
82
|
+
* handler: async (args) => {
|
|
83
|
+
* return this.searchService.search(args.query);
|
|
84
|
+
* },
|
|
85
|
+
* render: SearchResultsComponent
|
|
86
|
+
* });
|
|
87
|
+
* }
|
|
88
|
+
* }
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export function registerFrontendTool(tool) {
|
|
92
|
+
const service = inject(CopilotKitService);
|
|
93
|
+
const destroyRef = inject(DestroyRef);
|
|
94
|
+
// Add the tool
|
|
95
|
+
service.copilotkit.addTool(tool);
|
|
96
|
+
// Register the render if provided
|
|
97
|
+
if (tool.render) {
|
|
98
|
+
const currentRenders = service.currentRenderToolCalls();
|
|
99
|
+
const existingIndex = currentRenders.findIndex((r) => r.name === tool.name);
|
|
100
|
+
if (existingIndex !== -1) {
|
|
101
|
+
console.error(`Tool with name '${tool.name}' already has a render. Skipping.`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const renderEntry = {
|
|
105
|
+
name: tool.name,
|
|
106
|
+
args: tool.parameters || z.object({}),
|
|
107
|
+
render: tool.render
|
|
108
|
+
};
|
|
109
|
+
service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Register cleanup with Angular's DestroyRef
|
|
113
|
+
destroyRef.onDestroy(() => {
|
|
114
|
+
removeFrontendTool(service, tool.name);
|
|
115
|
+
});
|
|
116
|
+
return tool.name;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Explicitly removes a frontend tool from CopilotKit.
|
|
120
|
+
*
|
|
121
|
+
* @param service - The CopilotKitService instance
|
|
122
|
+
* @param toolName - The name of the tool to remove
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* removeFrontendTool(this.copilotkit, 'calculator');
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export function removeFrontendTool(service, toolName) {
|
|
130
|
+
// Remove the tool
|
|
131
|
+
service.copilotkit.removeTool(toolName);
|
|
132
|
+
// Remove the render if it exists
|
|
133
|
+
const currentRenders = service.currentRenderToolCalls();
|
|
134
|
+
const filtered = currentRenders.filter((r) => r.name !== toolName);
|
|
135
|
+
if (filtered.length !== currentRenders.length) {
|
|
136
|
+
service.setCurrentRenderToolCalls(filtered);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Creates a frontend tool with dynamic parameters that can change over time.
|
|
141
|
+
* Uses Angular signals for reactivity.
|
|
142
|
+
*
|
|
143
|
+
* @param name - Tool name
|
|
144
|
+
* @param description - Tool description
|
|
145
|
+
* @param parameters - Zod schema for parameters
|
|
146
|
+
* @param handler - Signal or function that provides the handler
|
|
147
|
+
* @param render - Optional render component or template
|
|
148
|
+
* @returns Object with update and destroy methods
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* export class MyComponent {
|
|
153
|
+
* private toolConfig = signal({
|
|
154
|
+
* handler: async (args: any) => this.processDefault(args)
|
|
155
|
+
* });
|
|
156
|
+
*
|
|
157
|
+
* ngOnInit() {
|
|
158
|
+
* const tool = createDynamicFrontendTool(
|
|
159
|
+
* 'processor',
|
|
160
|
+
* 'Processes data',
|
|
161
|
+
* z.object({ data: z.string() }),
|
|
162
|
+
* () => this.toolConfig().handler
|
|
163
|
+
* );
|
|
164
|
+
*
|
|
165
|
+
* // Later, update the handler
|
|
166
|
+
* this.toolConfig.set({
|
|
167
|
+
* handler: async (args: any) => this.processAdvanced(args)
|
|
168
|
+
* });
|
|
169
|
+
* tool.update();
|
|
170
|
+
* }
|
|
171
|
+
* }
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export function createDynamicFrontendTool(name, description, parameters, handler, render) {
|
|
175
|
+
const service = inject(CopilotKitService);
|
|
176
|
+
const destroyRef = inject(DestroyRef);
|
|
177
|
+
let isRegistered = false;
|
|
178
|
+
const update = () => {
|
|
179
|
+
// Remove old tool if registered
|
|
180
|
+
if (isRegistered) {
|
|
181
|
+
service.copilotkit.removeTool(name);
|
|
182
|
+
}
|
|
183
|
+
// Create new tool configuration
|
|
184
|
+
const desc = typeof description === 'function' ? description() : description;
|
|
185
|
+
const currentHandler = handler();
|
|
186
|
+
const currentRender = render ? render() : undefined;
|
|
187
|
+
const tool = {
|
|
188
|
+
name,
|
|
189
|
+
description: desc,
|
|
190
|
+
parameters,
|
|
191
|
+
handler: currentHandler,
|
|
192
|
+
render: currentRender
|
|
193
|
+
};
|
|
194
|
+
// Add the tool
|
|
195
|
+
service.copilotkit.addTool(tool);
|
|
196
|
+
// Update render if provided
|
|
197
|
+
if (currentRender) {
|
|
198
|
+
const currentRenders = service.currentRenderToolCalls();
|
|
199
|
+
const renderEntry = {
|
|
200
|
+
name: name,
|
|
201
|
+
args: parameters,
|
|
202
|
+
render: currentRender
|
|
203
|
+
};
|
|
204
|
+
const existingIndex = currentRenders.findIndex((r) => r.name === name);
|
|
205
|
+
if (existingIndex !== -1) {
|
|
206
|
+
const updated = [...currentRenders];
|
|
207
|
+
updated[existingIndex] = renderEntry;
|
|
208
|
+
service.setCurrentRenderToolCalls(updated);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
isRegistered = true;
|
|
215
|
+
};
|
|
216
|
+
const destroy = () => {
|
|
217
|
+
if (isRegistered) {
|
|
218
|
+
removeFrontendTool(service, name);
|
|
219
|
+
isRegistered = false;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
// Initial setup
|
|
223
|
+
update();
|
|
224
|
+
// Register cleanup
|
|
225
|
+
destroyRef.onDestroy(destroy);
|
|
226
|
+
return { update, destroy };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtdG9vbC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9mcm9udGVuZC10b29sLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsT0FBMEIsRUFDMUIsSUFBNEI7SUFFNUIsNkJBQTZCO0lBQzdCLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWpDLGtDQUFrQztJQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckcsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxXQUFXLEdBQTZCO2dCQUM1QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQStCO2dCQUNwRSxNQUFNLEVB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QUFDLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUNyQyxPQUFPLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEdBQUcsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFFRCxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtRQUNuQixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixnQkFBZ0I7SUFDaEIsTUFBTSxFQUFFLENBQUM7SUFFVCxtQkFBbUI7SUFDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9jb3BpbG90a2l0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ndWxhckZyb250ZW5kVG9vbCwgQW5ndWxhclRvb2xDYWxsUmVuZGVyLCBUb29sQ2FsbFJlbmRlciB9IGZyb20gJy4uL2NvcmUvY29waWxvdGtpdC50eXBlcyc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLyoqXG4gKiBFeHBsaWNpdGx5IGFkZHMgYSBmcm9udGVuZCB0b29sIHRvIENvcGlsb3RLaXQuXG4gKiBSZXF1aXJlcyBDb3BpbG90S2l0U2VydmljZSB0byBiZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gdG9vbCAtIFRoZSB0b29sIHRvIGFkZFxuICogQHJldHVybnMgQSBjbGVhbnVwIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgdG9vbFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICogICBwcml2YXRlIGNsZWFudXBGbnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG4gKiAgIFxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvcGlsb3RraXQ6IENvcGlsb3RLaXRTZXJ2aWNlKSB7fVxuICogICBcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgY29uc3QgY2xlYW51cCA9IGFkZEZyb250ZW5kVG9vbCh0aGlzLmNvcGlsb3RraXQsIHtcbiAqICAgICAgIG5hbWU6ICdjYWxjdWxhdG9yJyxcbiAqICAgICAgIGRlc2NyaXB0aW9uOiAnUGVyZm9ybXMgY2FsY3VsYXRpb25zJyxcbiAqICAgICAgIHBhcmFtZXRlcnM6IHoub2JqZWN0KHtcbiAqICAgICAgICAgZXhwcmVzc2lvbjogei5zdHJpbmcoKVxuICogICAgICAgfSksXG4gKiAgICAgICBoYW5kbGVyOiBhc3luYyAoYXJncykgPT4ge1xuICogICAgICAgICByZXR1cm4gZXZhbChhcmdzLmV4cHJlc3Npb24pO1xuICogICAgICAgfVxuICogICAgIH0pO1xuICogICAgIFxuICogICAgIHRoaXMuY2xlYW51cEZucy5wdXNoKGNsZWFudXApO1xuICogICB9XG4gKiAgIFxuICogICBuZ09uRGVzdHJveSgpIHtcbiAqICAgICB0aGlzLmNsZWFudXBGbnMuZm9yRWFjaChmbiA9PiBmbigpKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRGcm9udGVuZFRvb2w8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgc2VydmljZTogQ29waWxvdEtpdFNlcnZpY2UsXG4gIHRvb2w6IEFuZ3VsYXJGcm9udGVuZFRvb2w8VD5cbik6ICgpID0+IHZvaWQge1xuICAvLyBBZGQgdGhlIHRvb2wgdG8gQ29waWxvdEtpdFxuICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbCh0b29sKTtcbiAgXG4gIC8vIFJlZ2lzdGVyIHRoZSByZW5kZXIgaWYgcHJvdmlkZWRcbiAgaWYgKHRvb2wucmVuZGVyKSB7XG4gICAgY29uc3QgY3VycmVudFJlbmRlcnMgPSBzZXJ2aWNlLmN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoKTtcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY3VycmVudFJlbmRlcnMuZmluZEluZGV4KChyOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPikgPT4gci5uYW1lID09PSB0b29sLm5hbWUpO1xuICAgIFxuICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgY29uc29sZS5lcnJvcihgVG9vbCB3aXRoIG5hbWUgJyR7dG9vbC5uYW1lfScgYWxyZWFkeSBoYXMgYSByZW5kZXIuIFNraXBwaW5nLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZW5kZXJFbnRyeTogQW5ndWxhclRvb2xDYWxsUmVuZGVyPFQ+ID0ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyB8fCAoei5vYmplY3Qoe30pIGFzIHVua25vd24gYXMgei5ab2RTY2hlbWE8VD4pLFxuICAgICAgICByZW5kZXI6IHRvb2wucmVuZGVyXG4gICAgICB9O1xuICAgICAgXG4gICAgICBzZXJ2aWNlLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoWy4uLmN1cnJlbnRSZW5kZXJzLCByZW5kZXJFbnRyeV0pO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICByZW1vdmVGcm9udGVuZFRvb2woc2VydmljZSwgdG9vbC5uYW1lKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBmcm9udGVuZCB0b29sIHdpdGggQ29waWxvdEtpdCBhbmQgYXV0b21hdGljYWxseSByZW1vdmVzIGl0IHdoZW4gdGhlIGNvbXBvbmVudC9zZXJ2aWNlIGlzIGRlc3Ryb3llZC5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGhpbiBhbiBpbmplY3Rpb24gY29udGV4dC5cbiAqIFxuICogQHBhcmFtIHRvb2wgLSBUaGUgdG9vbCB0byByZWdpc3RlclxuICogQHJldHVybnMgVGhlIHRvb2wgbmFtZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgLy8gQXV0b21hdGljYWxseSBjbGVhbmVkIHVwIG9uIGNvbXBvbmVudCBkZXN0cm95XG4gKiAgICAgcmVnaXN0ZXJGcm9udGVuZFRvb2woe1xuICogICAgICAgbmFtZTogJ3NlYXJjaCcsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogJ1NlYXJjaCBmb3IgaXRlbXMnLFxuICogICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICogICAgICAgICBxdWVyeTogei5zdHJpbmcoKVxuICogICAgICAgfSksXG4gKiAgICAgICBoYW5kbGVyOiBhc3luYyAoYXJncykgPT4ge1xuICogICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaChhcmdzLnF1ZXJ5KTtcbiAqICAgICAgIH0sXG4gKiAgICAgICByZW5kZXI6IFNlYXJjaFJlc3VsdHNDb21wb25lbnRcbiAqICAgICB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZyb250ZW5kVG9vbDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICB0b29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+XG4pOiBzdHJpbmcge1xuICBjb25zdCBzZXJ2aWNlID0gaW5qZWN0KENvcGlsb3RLaXRTZXJ2aWNlKTtcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgXG4gIC8vIEFkZCB0aGUgdG9vbFxuICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbCh0b29sKTtcbiAgXG4gIC8vIFJlZ2lzdGVyIHRoZSByZW5kZXIgaWYgcHJvdmlkZWRcbiAgaWYgKHRvb2wucmVuZGVyKSB7XG4gICAgY29uc3QgY3VycmVudFJlbmRlcnMgPSBzZXJ2aWNlLmN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoKTtcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY3VycmVudFJlbmRlcnMuZmluZEluZGV4KChyOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPikgPT4gci5uYW1lID09PSB0b29sLm5hbWUpO1xuICAgIFxuICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgY29uc29sZS5lcnJvcihgVG9vbCB3aXRoIG5hbWUgJyR7dG9vbC5uYW1lfScgYWxyZWFkeSBoYXMgYSByZW5kZXIuIFNraXBwaW5nLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZW5kZXJFbnRyeTogQW5ndWxhclRvb2xDYWxsUmVuZGVyPFQ+ID0ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyB8fCAoei5vYmplY3Qoe30pIGFzIHVua25vd24gYXMgei5ab2RTY2hlbWE8VD4pLFxuICAgICAgICByZW5kZXI6IHRvb2wucmVuZGVyXG4gICAgICB9O1xuICAgICAgXG4gICAgICBzZXJ2aWNlLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoWy4uLmN1cnJlbnRSZW5kZXJzLCByZW5kZXJFbnRyeV0pO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUmVnaXN0ZXIgY2xlYW51cCB3aXRoIEFuZ3VsYXIncyBEZXN0cm95UmVmXG4gIGRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICByZW1vdmVGcm9udGVuZFRvb2woc2VydmljZSwgdG9vbC5uYW1lKTtcbiAgfSk7XG4gIFxuICByZXR1cm4gdG9vbC5uYW1lO1xufVxuXG4vKipcbiAqIEV4cGxpY2l0bHkgcmVtb3ZlcyBhIGZyb250ZW5kIHRvb2wgZnJvbSBDb3BpbG90S2l0LlxuICogXG4gKiBAcGFyYW0gc2VydmljZSAtIFRoZSBDb3BpbG90S2l0U2VydmljZSBpbnN0YW5jZVxuICogQHBhcmFtIHRvb2xOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRvb2wgdG8gcmVtb3ZlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiByZW1vdmVGcm9udGVuZFRvb2wodGhpcy5jb3BpbG90a2l0LCAnY2FsY3VsYXRvcicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9udGVuZFRvb2woXG4gIHNlcnZpY2U6IENvcGlsb3RLaXRTZXJ2aWNlLFxuICB0b29sTmFtZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIHRoZSB0b29sXG4gIHNlcnZpY2UuY29waWxvdGtpdC5yZW1vdmVUb29sKHRvb2xOYW1lKTtcbiAgXG4gIC8vIFJlbW92ZSB0aGUgcmVuZGVyIGlmIGl0IGV4aXN0c1xuICBjb25zdCBjdXJyZW50UmVuZGVycyA9IHNlcnZpY2UuY3VycmVudFJlbmRlclRvb2xDYWxscygpO1xuICBjb25zdCBmaWx0ZXJlZCA9IGN1cnJlbnRSZW5kZXJzLmZpbHRlcigocjogVG9vbENhbGxSZW5kZXI8dW5rbm93bj4pID0+IHIubmFtZSAhPT0gdG9vbE5hbWUpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoICE9PSBjdXJyZW50UmVuZGVycy5sZW5ndGgpIHtcbiAgICBzZXJ2aWNlLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoZmlsdGVyZWQpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZyb250ZW5kIHRvb2wgd2l0aCBkeW5hbWljIHBhcmFtZXRlcnMgdGhhdCBjYW4gY2hhbmdlIG92ZXIgdGltZS5cbiAqIFVzZXMgQW5ndWxhciBzaWduYWxzIGZvciByZWFjdGl2aXR5LlxuICogXG4gKiBAcGFyYW0gbmFtZSAtIFRvb2wgbmFtZVxuICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gVG9vbCBkZXNjcmlwdGlvblxuICogQHBhcmFtIHBhcmFtZXRlcnMgLSBab2Qgc2NoZW1hIGZvciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gaGFuZGxlciAtIFNpZ25hbCBvciBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gcmVuZGVyIC0gT3B0aW9uYWwgcmVuZGVyIGNvbXBvbmVudCBvciB0ZW1wbGF0ZVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdXBkYXRlIGFuZCBkZXN0cm95IG1ldGhvZHNcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgdG9vbENvbmZpZyA9IHNpZ25hbCh7XG4gKiAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4gdGhpcy5wcm9jZXNzRGVmYXVsdChhcmdzKVxuICogICB9KTtcbiAqICAgXG4gKiAgIG5nT25Jbml0KCkge1xuICogICAgIGNvbnN0IHRvb2wgPSBjcmVhdGVEeW5hbWljRnJvbnRlbmRUb29sKFxuICogICAgICAgJ3Byb2Nlc3NvcicsXG4gKiAgICAgICAnUHJvY2Vzc2VzIGRhdGEnLFxuICogICAgICAgei5vYmplY3QoeyBkYXRhOiB6LnN0cmluZygpIH0pLFxuICogICAgICAgKCkgPT4gdGhpcy50b29sQ29uZmlnKCkuaGFuZGxlclxuICogICAgICk7XG4gKiAgICAgXG4gKiAgICAgLy8gTGF0ZXIsIHVwZGF0ZSB0aGUgaGFuZGxlclxuICogICAgIHRoaXMudG9vbENvbmZpZy5zZXQoe1xuICogICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4gdGhpcy5wcm9jZXNzQWR2YW5jZWQoYXJncylcbiAqICAgICB9KTtcbiAqICAgICB0b29sLnVwZGF0ZSgpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR5bmFtaWNGcm9udGVuZFRvb2w8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgbmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgKCgpID0+IHN0cmluZyksXG4gIHBhcmFtZXRlcnM6IHouWm9kU2NoZW1hPFQ+LFxuICBoYW5kbGVyOiAoKSA9PiAoKGFyZ3M6IFQpID0+IFByb21pc2U8YW55PiksXG4gIHJlbmRlcj86ICgpID0+IGFueVxuKTogeyB1cGRhdGU6ICgpID0+IHZvaWQ7IGRlc3Ryb3k6ICgpID0+IHZvaWQgfSB7XG4gIGNvbnN0IHNlcnZpY2UgPSBpbmplY3QoQ29waWxvdEtpdFNlcnZpY2UpO1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBcbiAgbGV0IGlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuICBcbiAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgIC8vIFJlbW92ZSBvbGQgdG9vbCBpZiByZWdpc3RlcmVkXG4gICAgaWYgKGlzUmVnaXN0ZXJlZCkge1xuICAgICAgc2VydmljZS5jb3BpbG90a2l0LnJlbW92ZVRvb2wobmFtZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBuZXcgdG9vbCBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgZGVzYyA9IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGRlc2NyaXB0aW9uKCkgOiBkZXNjcmlwdGlvbjtcbiAgICBjb25zdCBjdXJyZW50SGFuZGxlciA9IGhhbmRsZXIoKTtcbiAgICBjb25zdCBjdXJyZW50UmVuZGVyID0gcmVuZGVyID8gcmVuZGVyKCkgOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgY29uc3QgdG9vbDogQW5ndWxhckZyb250ZW5kVG9vbDxUPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZGVzYyxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICBoYW5kbGVyOiBjdXJyZW50SGFuZGxlcixcbiAgICAgIHJlbmRlcjogY3VycmVudFJlbmRlclxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIHRoZSB0b29sXG4gICAgc2VydmljZS5jb3BpbG90a2l0LmFkZFRvb2wodG9vbCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHJlbmRlciBpZiBwcm92aWRlZFxuICAgIGlmIChjdXJyZW50UmVuZGVyKSB7XG4gICAgICBjb25zdCBjdXJyZW50UmVuZGVycyA9IHNlcnZpY2UuY3VycmVudFJlbmRlclRvb2xDYWxscygpO1xuICAgICAgY29uc3QgcmVuZGVyRW50cnk6IEFuZ3VsYXJUb29sQ2FsbFJlbmRlcjxUPiA9IHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgYXJnczogcGFyYW1ldGVycyxcbiAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY3VycmVudFJlbmRlcnMuZmluZEluZGV4KChyOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPikgPT4gci5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gWy4uLmN1cnJlbnRSZW5kZXJzXTtcbiAgICAgICAgdXBkYXRlZFtleGlzdGluZ0luZGV4XSA9IHJlbmRlckVudHJ5O1xuICAgICAgICBzZXJ2aWNlLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHModXBkYXRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2aWNlLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoWy4uLmN1cnJlbnRSZW5kZXJzLCByZW5kZXJFbnRyeV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICB9O1xuICBcbiAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICBpZiAoaXNSZWdpc3RlcmVkKSB7XG4gICAgICByZW1vdmVGcm9udGVuZFRvb2woc2VydmljZSwgbmFtZSk7XG4gICAgICBpc1JlZ2lzdGVyZWQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBJbml0aWFsIHNldHVwXG4gIHVwZGF0ZSgpO1xuICBcbiAgLy8gUmVnaXN0ZXIgY2xlYW51cFxuICBkZXN0cm95UmVmLm9uRGVzdHJveShkZXN0cm95KTtcbiAgXG4gIHJldHVybiB7IHVwZGF0ZSwgZGVzdHJveSB9O1xufSJdfQ==
|