@copilotkitnext/angular 0.0.2 → 0.0.5
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 +3 -3
- package/dist/README.md +3 -3
- 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/core/copilotkit.providers.d.ts +1 -1
- package/dist/core/copilotkit.service.d.ts +5 -5
- package/dist/core/copilotkit.types.d.ts +8 -10
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +1 -1
- 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 +426 -0
- package/dist/esm2022/core/copilotkit.types.mjs +13 -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 +128 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +265 -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 +224 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +293 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +174 -187
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/utils/frontend-tool.utils.d.ts +1 -1
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -38
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/ng-package.json +0 -19
- 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,130 @@
|
|
|
1
|
+
import { Directive, Input, Inject, } from "@angular/core";
|
|
2
|
+
import { CopilotKitService } from "../core/copilotkit.service";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../core/copilotkit.service";
|
|
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 CopilotKitAgentContextDirective {
|
|
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.copilotkit.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.copilotkit.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: CopilotKitAgentContextDirective, deps: [{ token: CopilotKitService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
111
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitAgentContextDirective, 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: CopilotKitAgentContextDirective, decorators: [{
|
|
114
|
+
type: Directive,
|
|
115
|
+
args: [{
|
|
116
|
+
selector: "[copilotkitAgentContext]",
|
|
117
|
+
standalone: true,
|
|
118
|
+
}]
|
|
119
|
+
}], ctorParameters: () => [{ type: i1.CopilotKitService, decorators: [{
|
|
120
|
+
type: Inject,
|
|
121
|
+
args: [CopilotKitService]
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1hZ2VudC1jb250ZXh0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kaXJlY3RpdmVzL2NvcGlsb3RraXQtYWdlbnQtY29udGV4dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBS0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFHL0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFLSCxNQUFNLE9BQU8sK0JBQStCO0lBTUk7SUFIdEMsU0FBUyxDQUFVO0lBRTNCLFlBQzhDLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO0lBQ3hFLENBQUM7SUFFSjs7O09BR0c7SUFDOEIsT0FBTyxDQUFXO0lBRW5EOzs7T0FHRztJQUNNLFdBQVcsQ0FBVTtJQUU5Qjs7O09BR0c7SUFDTSxLQUFLLENBQU87SUFFckIsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLDBDQUEwQztRQUMxQyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsSUFBSSxPQUFPLENBQUM7UUFDOUMsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLElBQUksT0FBTyxDQUFDO1FBQ3RELE1BQU0sY0FBYyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUM7UUFFMUMsSUFBSSxnQkFBZ0IsSUFBSSxvQkFBb0IsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUMvRCwwREFBMEQ7WUFDMUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVU7UUFDaEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXZDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGFBQWE7UUFDbkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVU7UUFDaEIsd0NBQXdDO1FBQ3hDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDO1FBRUQsMENBQTBDO1FBQzFDLDJEQUEyRDtRQUMzRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0QsT0FBTztnQkFDTCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzthQUNsQixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzt3R0FqR1UsK0JBQStCLGtCQU1oQyxpQkFBaUI7NEZBTmhCLCtCQUErQjs7NEZBQS9CLCtCQUErQjtrQkFKM0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxVQUFVLEVBQUUsSUFBSTtpQkFDakI7OzBCQU9JLE1BQU07MkJBQUMsaUJBQWlCO3lDQU9NLE9BQU87c0JBQXZDLEtBQUs7dUJBQUMsd0JBQXdCO2dCQU10QixXQUFXO3NCQUFuQixLQUFLO2dCQU1HLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEluamVjdCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB0byBtYW5hZ2UgYWdlbnQgY29udGV4dCBpbiBDb3BpbG90S2l0LlxuICogQXV0b21hdGljYWxseSBhZGRzIGNvbnRleHQgb24gaW5pdCwgdXBkYXRlcyBvbiBjaGFuZ2VzLCBhbmQgcmVtb3ZlcyBvbiBkZXN0cm95LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIFdpdGggc2VwYXJhdGUgaW5wdXRzIC0tPlxuICogPGRpdiBjb3BpbG90a2l0QWdlbnRDb250ZXh0XG4gKiAgICAgIFtkZXNjcmlwdGlvbl09XCInVXNlciBwcmVmZXJlbmNlcydcIlxuICogICAgICBbdmFsdWVdPVwidXNlclNldHRpbmdzXCI+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8IS0tIFdpdGggY29udGV4dCBvYmplY3QgLS0+XG4gKiA8ZGl2IFtjb3BpbG90a2l0QWdlbnRDb250ZXh0XT1cImNvbnRleHRPYmplY3RcIj5cbiAqIDwvZGl2PlxuICpcbiAqIDwhLS0gV2l0aCBkeW5hbWljIHZhbHVlcyAtLT5cbiAqIDxkaXYgY29waWxvdGtpdEFnZW50Q29udGV4dFxuICogICAgICBkZXNjcmlwdGlvbj1cIkZvcm0gc3RhdGVcIlxuICogICAgICBbdmFsdWVdPVwiZm9ybURhdGEkIHwgYXN5bmNcIj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbY29waWxvdGtpdEFnZW50Q29udGV4dF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdEFnZW50Q29udGV4dERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSBjb250ZXh0SWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChDb3BpbG90S2l0U2VydmljZSkgcHJpdmF0ZSByZWFkb25seSBjb3BpbG90a2l0OiBDb3BpbG90S2l0U2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIENvbnRleHQgb2JqZWN0IGNvbnRhaW5pbmcgYm90aCBkZXNjcmlwdGlvbiBhbmQgdmFsdWUuXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBpbmRpdmlkdWFsIGlucHV0cy5cbiAgICovXG4gIEBJbnB1dChcImNvcGlsb3RraXRBZ2VudENvbnRleHRcIikgY29udGV4dD86IENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBjb250ZXh0LlxuICAgKiBVc2VkIHdoZW4gY29udGV4dCBvYmplY3QgaXMgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSBjb250ZXh0LlxuICAgKiBVc2VkIHdoZW4gY29udGV4dCBvYmplY3QgaXMgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWU/OiBhbnk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRDb250ZXh0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgYW55IHJlbGV2YW50IGlucHV0IGhhcyBjaGFuZ2VkXG4gICAgY29uc3QgaGFzQ29udGV4dENoYW5nZSA9IFwiY29udGV4dFwiIGluIGNoYW5nZXM7XG4gICAgY29uc3QgaGFzRGVzY3JpcHRpb25DaGFuZ2UgPSBcImRlc2NyaXB0aW9uXCIgaW4gY2hhbmdlcztcbiAgICBjb25zdCBoYXNWYWx1ZUNoYW5nZSA9IFwidmFsdWVcIiBpbiBjaGFuZ2VzO1xuXG4gICAgaWYgKGhhc0NvbnRleHRDaGFuZ2UgfHwgaGFzRGVzY3JpcHRpb25DaGFuZ2UgfHwgaGFzVmFsdWVDaGFuZ2UpIHtcbiAgICAgIC8vIFNraXAgdGhlIGZpcnN0IGNoYW5nZSBhcyBuZ09uSW5pdCBoYW5kbGVzIGluaXRpYWwgc2V0dXBcbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbnRleHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUNvbnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBjb250ZXh0IHRvIENvcGlsb3RLaXRcbiAgICovXG4gIHByaXZhdGUgYWRkQ29udGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0VG9BZGQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIGlmIChjb250ZXh0VG9BZGQpIHtcbiAgICAgIHRoaXMuY29udGV4dElkID0gdGhpcy5jb3BpbG90a2l0LmNvcGlsb3RraXQuYWRkQ29udGV4dChjb250ZXh0VG9BZGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb250ZXh0IGJ5IHJlbW92aW5nIHRoZSBvbGQgb25lIGFuZCBhZGRpbmcgYSBuZXcgb25lXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVDb250ZXh0KCk7XG4gICAgdGhpcy5hZGRDb250ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBjb250ZXh0IGZyb20gQ29waWxvdEtpdFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVDb250ZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbnRleHRJZCkge1xuICAgICAgdGhpcy5jb3BpbG90a2l0LmNvcGlsb3RraXQucmVtb3ZlQ29udGV4dCh0aGlzLmNvbnRleHRJZCk7XG4gICAgICB0aGlzLmNvbnRleHRJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29udGV4dCBvYmplY3QgZnJvbSBpbnB1dHNcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB7XG4gICAgLy8gSWYgY29udGV4dCBvYmplY3QgaXMgcHJvdmlkZWQsIHVzZSBpdFxuICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBidWlsZCBmcm9tIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgLy8gTm90ZTogbnVsbCBpcyBhIHZhbGlkIHZhbHVlLCBidXQgdW5kZWZpbmVkIG1lYW5zIG5vdCBzZXRcbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Directive, Input, Output, EventEmitter, signal, Inject, } from "@angular/core";
|
|
2
|
+
import { toObservable } from "@angular/core/rxjs-interop";
|
|
3
|
+
import { CopilotKitService } from "../core/copilotkit.service";
|
|
4
|
+
import { DEFAULT_AGENT_ID } from "@copilotkitnext/shared";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../core/copilotkit.service";
|
|
7
|
+
/**
|
|
8
|
+
* Directive to watch and interact with CopilotKit agents.
|
|
9
|
+
* Provides reactive outputs for agent state changes.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```html
|
|
13
|
+
* <!-- Basic usage with default agent -->
|
|
14
|
+
* <div copilotkitAgent
|
|
15
|
+
* (agentChange)="onAgentChange($event)"
|
|
16
|
+
* (runningChange)="isProcessing = $event">
|
|
17
|
+
* Content here
|
|
18
|
+
* </div>
|
|
19
|
+
*
|
|
20
|
+
* <!-- With specific agent ID -->
|
|
21
|
+
* <div copilotkitAgent
|
|
22
|
+
* [agentId]="'my-agent-id'"
|
|
23
|
+
* (agentChange)="currentAgent = $event"
|
|
24
|
+
* (runningChange)="onRunningStateChange($event)"
|
|
25
|
+
* (messagesChange)="onMessagesUpdate($event)"
|
|
26
|
+
* (stateChange)="onStateUpdate($event)">
|
|
27
|
+
* Content here
|
|
28
|
+
* </div>
|
|
29
|
+
*
|
|
30
|
+
* <!-- Two-way binding for running state -->
|
|
31
|
+
* <div copilotkitAgent
|
|
32
|
+
* [(running)]="isAgentRunning">
|
|
33
|
+
* <span *ngIf="isAgentRunning">Processing...</span>
|
|
34
|
+
* </div>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export class CopilotKitAgentDirective {
|
|
38
|
+
copilotkit;
|
|
39
|
+
agent;
|
|
40
|
+
agentSubscription;
|
|
41
|
+
coreUnsubscribe; // subscribe returns function directly
|
|
42
|
+
_isRunning = false;
|
|
43
|
+
runningSignal = signal(false);
|
|
44
|
+
agentSignal = signal(undefined);
|
|
45
|
+
constructor(copilotkit) {
|
|
46
|
+
this.copilotkit = copilotkit;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The ID of the agent to watch.
|
|
50
|
+
* If not provided, uses the default agent ID.
|
|
51
|
+
*/
|
|
52
|
+
agentId;
|
|
53
|
+
/**
|
|
54
|
+
* Alternative input using the directive selector.
|
|
55
|
+
* Allows: [copilotkitAgent]="'agent-id'"
|
|
56
|
+
*/
|
|
57
|
+
set directiveAgentId(value) {
|
|
58
|
+
this.agentId = value || undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Emits when the agent instance changes.
|
|
62
|
+
*/
|
|
63
|
+
agentChange = new EventEmitter();
|
|
64
|
+
/**
|
|
65
|
+
* Emits when the running state changes.
|
|
66
|
+
*/
|
|
67
|
+
runningChange = new EventEmitter();
|
|
68
|
+
/**
|
|
69
|
+
* Observable of the running state.
|
|
70
|
+
*/
|
|
71
|
+
get running$() {
|
|
72
|
+
return toObservable(this.runningSignal);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Observable of the agent instance.
|
|
76
|
+
*/
|
|
77
|
+
get agent$() {
|
|
78
|
+
return toObservable(this.agentSignal);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Two-way binding for running state.
|
|
82
|
+
*/
|
|
83
|
+
get running() {
|
|
84
|
+
return this._isRunning;
|
|
85
|
+
}
|
|
86
|
+
set running(value) {
|
|
87
|
+
// Input setter for two-way binding (though typically read-only from agent)
|
|
88
|
+
this._isRunning = value;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Emits when agent messages change.
|
|
92
|
+
*/
|
|
93
|
+
messagesChange = new EventEmitter();
|
|
94
|
+
/**
|
|
95
|
+
* Emits when agent state changes.
|
|
96
|
+
*/
|
|
97
|
+
stateChange = new EventEmitter();
|
|
98
|
+
/**
|
|
99
|
+
* Emits when a run is initialized.
|
|
100
|
+
*/
|
|
101
|
+
runInitialized = new EventEmitter();
|
|
102
|
+
/**
|
|
103
|
+
* Emits when a run is finalized.
|
|
104
|
+
*/
|
|
105
|
+
runFinalized = new EventEmitter();
|
|
106
|
+
/**
|
|
107
|
+
* Emits when a run fails.
|
|
108
|
+
*/
|
|
109
|
+
runFailed = new EventEmitter();
|
|
110
|
+
ngOnInit() {
|
|
111
|
+
this.setupAgent();
|
|
112
|
+
this.subscribeToCore();
|
|
113
|
+
}
|
|
114
|
+
ngOnChanges(changes) {
|
|
115
|
+
if (changes["agentId"] && !changes["agentId"].firstChange) {
|
|
116
|
+
// Agent ID changed, re-setup
|
|
117
|
+
this.cleanupAgentSubscription();
|
|
118
|
+
this.setupAgent();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
ngOnDestroy() {
|
|
122
|
+
this.cleanupAgentSubscription();
|
|
123
|
+
this.cleanupCoreSubscription();
|
|
124
|
+
}
|
|
125
|
+
setupAgent() {
|
|
126
|
+
const effectiveAgentId = this.agentId ?? DEFAULT_AGENT_ID;
|
|
127
|
+
this.agent = this.copilotkit.getAgent(effectiveAgentId);
|
|
128
|
+
// Update signals
|
|
129
|
+
this.agentSignal.set(this.agent);
|
|
130
|
+
// Emit initial agent
|
|
131
|
+
this.agentChange.emit(this.agent);
|
|
132
|
+
// Subscribe to agent events
|
|
133
|
+
this.subscribeToAgent();
|
|
134
|
+
}
|
|
135
|
+
subscribeToAgent() {
|
|
136
|
+
this.cleanupAgentSubscription();
|
|
137
|
+
if (this.agent) {
|
|
138
|
+
this.agentSubscription = this.agent.subscribe({
|
|
139
|
+
onMessagesChanged: (params) => {
|
|
140
|
+
this.messagesChange.emit(params);
|
|
141
|
+
},
|
|
142
|
+
onStateChanged: (params) => {
|
|
143
|
+
this.stateChange.emit(params);
|
|
144
|
+
},
|
|
145
|
+
onRunInitialized: (params) => {
|
|
146
|
+
this._isRunning = true;
|
|
147
|
+
this.runningSignal.set(true);
|
|
148
|
+
this.runningChange.emit(true);
|
|
149
|
+
this.runInitialized.emit(params);
|
|
150
|
+
},
|
|
151
|
+
onRunFinalized: (params) => {
|
|
152
|
+
this._isRunning = false;
|
|
153
|
+
this.runningSignal.set(false);
|
|
154
|
+
this.runningChange.emit(false);
|
|
155
|
+
this.runFinalized.emit(params);
|
|
156
|
+
},
|
|
157
|
+
onRunFailed: (params) => {
|
|
158
|
+
this._isRunning = false;
|
|
159
|
+
this.runningSignal.set(false);
|
|
160
|
+
this.runningChange.emit(false);
|
|
161
|
+
this.runFailed.emit(params);
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
subscribeToCore() {
|
|
167
|
+
// Subscribe to CopilotKit changes to detect agent updates
|
|
168
|
+
this.coreUnsubscribe = this.copilotkit.copilotkit.subscribe({
|
|
169
|
+
onRuntimeLoaded: () => {
|
|
170
|
+
// Re-check agent when runtime loads
|
|
171
|
+
this.setupAgent();
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
cleanupAgentSubscription() {
|
|
176
|
+
this.agentSubscription?.unsubscribe();
|
|
177
|
+
this.agentSubscription = undefined;
|
|
178
|
+
}
|
|
179
|
+
cleanupCoreSubscription() {
|
|
180
|
+
this.coreUnsubscribe?.();
|
|
181
|
+
this.coreUnsubscribe = undefined;
|
|
182
|
+
}
|
|
183
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitAgentDirective, deps: [{ token: CopilotKitService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
184
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitAgentDirective, isStandalone: true, selector: "[copilotkitAgent]", inputs: { agentId: "agentId", directiveAgentId: ["copilotkitAgent", "directiveAgentId"], running: "running" }, outputs: { agentChange: "agentChange", runningChange: "runningChange", messagesChange: "messagesChange", stateChange: "stateChange", runInitialized: "runInitialized", runFinalized: "runFinalized", runFailed: "runFailed" }, usesOnChanges: true, ngImport: i0 });
|
|
185
|
+
}
|
|
186
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitAgentDirective, decorators: [{
|
|
187
|
+
type: Directive,
|
|
188
|
+
args: [{
|
|
189
|
+
selector: "[copilotkitAgent]",
|
|
190
|
+
standalone: true,
|
|
191
|
+
}]
|
|
192
|
+
}], ctorParameters: () => [{ type: i1.CopilotKitService, decorators: [{
|
|
193
|
+
type: Inject,
|
|
194
|
+
args: [CopilotKitService]
|
|
195
|
+
}] }], propDecorators: { agentId: [{
|
|
196
|
+
type: Input
|
|
197
|
+
}], directiveAgentId: [{
|
|
198
|
+
type: Input,
|
|
199
|
+
args: ["copilotkitAgent"]
|
|
200
|
+
}], agentChange: [{
|
|
201
|
+
type: Output
|
|
202
|
+
}], runningChange: [{
|
|
203
|
+
type: Output
|
|
204
|
+
}], running: [{
|
|
205
|
+
type: Input
|
|
206
|
+
}], messagesChange: [{
|
|
207
|
+
type: Output
|
|
208
|
+
}], stateChange: [{
|
|
209
|
+
type: Output
|
|
210
|
+
}], runInitialized: [{
|
|
211
|
+
type: Output
|
|
212
|
+
}], runFinalized: [{
|
|
213
|
+
type: Output
|
|
214
|
+
}], runFailed: [{
|
|
215
|
+
type: Output
|
|
216
|
+
}] } });
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1hZ2VudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGlyZWN0aXZlcy9jb3BpbG90a2l0LWFnZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUtaLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFFMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBS0gsTUFBTSxPQUFPLHdCQUF3QjtJQVNXO0lBUnRDLEtBQUssQ0FBaUI7SUFDdEIsaUJBQWlCLENBQStCO0lBQ2hELGVBQWUsQ0FBYyxDQUFDLHNDQUFzQztJQUNwRSxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLGFBQWEsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDdkMsV0FBVyxHQUFHLE1BQU0sQ0FBNEIsU0FBUyxDQUFDLENBQUM7SUFFbkUsWUFDOEMsVUFBNkI7UUFBN0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7SUFDeEUsQ0FBQztJQUVKOzs7T0FHRztJQUNNLE9BQU8sQ0FBVTtJQUUxQjs7O09BR0c7SUFDSCxJQUNJLGdCQUFnQixDQUFDLEtBQXlCO1FBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxJQUFJLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7SUFFdEU7O09BRUc7SUFDTyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJ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RSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQzt3R0EzS1Usd0JBQXdCLGtCQVN6QixpQkFBaUI7NEZBVGhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFKcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OzBCQVVJLE1BQU07MkJBQUMsaUJBQWlCO3lDQU9sQixPQUFPO3NCQUFmLEtBQUs7Z0JBT0YsZ0JBQWdCO3NCQURuQixLQUFLO3VCQUFDLGlCQUFpQjtnQkFRZCxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLGFBQWE7c0JBQXRCLE1BQU07Z0JBb0JILE9BQU87c0JBRFYsS0FBSztnQkFZSSxjQUFjO3NCQUF2QixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csY0FBYztzQkFBdkIsTUFBTTtnQkFLRyxZQUFZO3NCQUFyQixNQUFNO2dCQUtHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgc2lnbmFsLFxuICBJbmplY3QsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgQ29waWxvdEtpdFNlcnZpY2UgfSBmcm9tIFwiLi4vY29yZS9jb3BpbG90a2l0LnNlcnZpY2VcIjtcbmltcG9ydCB7IEFic3RyYWN0QWdlbnQgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuaW1wb3J0IHsgREVGQVVMVF9BR0VOVF9JRCB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvc2hhcmVkXCI7XG5cbi8qKlxuICogRGlyZWN0aXZlIHRvIHdhdGNoIGFuZCBpbnRlcmFjdCB3aXRoIENvcGlsb3RLaXQgYWdlbnRzLlxuICogUHJvdmlkZXMgcmVhY3RpdmUgb3V0cHV0cyBmb3IgYWdlbnQgc3RhdGUgY2hhbmdlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPCEtLSBCYXNpYyB1c2FnZSB3aXRoIGRlZmF1bHQgYWdlbnQgLS0+XG4gKiA8ZGl2IGNvcGlsb3RraXRBZ2VudFxuICogICAgICAoYWdlbnRDaGFuZ2UpPVwib25BZ2VudENoYW5nZSgkZXZlbnQpXCJcbiAqICAgICAgKHJ1bm5pbmdDaGFuZ2UpPVwiaXNQcm9jZXNzaW5nID0gJGV2ZW50XCI+XG4gKiAgIENvbnRlbnQgaGVyZVxuICogPC9kaXY+XG4gKlxuICogPCEtLSBXaXRoIHNwZWNpZmljIGFnZW50IElEIC0tPlxuICogPGRpdiBjb3BpbG90a2l0QWdlbnRcbiAqICAgICAgW2FnZW50SWRdPVwiJ215LWFnZW50LWlkJ1wiXG4gKiAgICAgIChhZ2VudENoYW5nZSk9XCJjdXJyZW50QWdlbnQgPSAkZXZlbnRcIlxuICogICAgICAocnVubmluZ0NoYW5nZSk9XCJvblJ1bm5pbmdTdGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAqICAgICAgKG1lc3NhZ2VzQ2hhbmdlKT1cIm9uTWVzc2FnZXNVcGRhdGUoJGV2ZW50KVwiXG4gKiAgICAgIChzdGF0ZUNoYW5nZSk9XCJvblN0YXRlVXBkYXRlKCRldmVudClcIj5cbiAqICAgQ29udGVudCBoZXJlXG4gKiA8L2Rpdj5cbiAqXG4gKiA8IS0tIFR3by13YXkgYmluZGluZyBmb3IgcnVubmluZyBzdGF0ZSAtLT5cbiAqIDxkaXYgY29waWxvdGtpdEFnZW50XG4gKiAgICAgIFsocnVubmluZyldPVwiaXNBZ2VudFJ1bm5pbmdcIj5cbiAqICAgPHNwYW4gKm5nSWY9XCJpc0FnZW50UnVubmluZ1wiPlByb2Nlc3NpbmcuLi48L3NwYW4+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RraXRBZ2VudF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdEFnZW50RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgYWdlbnQ/OiBBYnN0cmFjdEFnZW50O1xuICBwcml2YXRlIGFnZW50U3Vic2NyaXB0aW9uPzogeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9O1xuICBwcml2YXRlIGNvcmVVbnN1YnNjcmliZT86ICgpID0+IHZvaWQ7IC8vIHN1YnNjcmliZSByZXR1cm5zIGZ1bmN0aW9uIGRpcmVjdGx5XG4gIHByaXZhdGUgX2lzUnVubmluZyA9IGZhbHNlO1xuICBwcml2YXRlIHJ1bm5pbmdTaWduYWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGFnZW50U2lnbmFsID0gc2lnbmFsPEFic3RyYWN0QWdlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChDb3BpbG90S2l0U2VydmljZSkgcHJpdmF0ZSByZWFkb25seSBjb3BpbG90a2l0OiBDb3BpbG90S2l0U2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgYWdlbnQgdG8gd2F0Y2guXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdXNlcyB0aGUgZGVmYXVsdCBhZ2VudCBJRC5cbiAgICovXG4gIEBJbnB1dCgpIGFnZW50SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsdGVybmF0aXZlIGlucHV0IHVzaW5nIHRoZSBkaXJlY3RpdmUgc2VsZWN0b3IuXG4gICAqIEFsbG93czogW2NvcGlsb3RraXRBZ2VudF09XCInYWdlbnQtaWQnXCJcbiAgICovXG4gIEBJbnB1dChcImNvcGlsb3RraXRBZ2VudFwiKVxuICBzZXQgZGlyZWN0aXZlQWdlbnRJZCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hZ2VudElkID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIGFnZW50IGluc3RhbmNlIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgYWdlbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFic3RyYWN0QWdlbnQgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHJ1bm5pbmcgc3RhdGUgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBydW5uaW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHRoZSBydW5uaW5nIHN0YXRlLlxuICAgKi9cbiAgZ2V0IHJ1bm5pbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0b09ic2VydmFibGUodGhpcy5ydW5uaW5nU2lnbmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHRoZSBhZ2VudCBpbnN0YW5jZS5cbiAgICovXG4gIGdldCBhZ2VudCQoKTogT2JzZXJ2YWJsZTxBYnN0cmFjdEFnZW50IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRvT2JzZXJ2YWJsZSh0aGlzLmFnZW50U2lnbmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUd28td2F5IGJpbmRpbmcgZm9yIHJ1bm5pbmcgc3RhdGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcnVubmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNSdW5uaW5nO1xuICB9XG4gIHNldCBydW5uaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgLy8gSW5wdXQgc2V0dGVyIGZvciB0d28td2F5IGJpbmRpbmcgKHRob3VnaCB0eXBpY2FsbHkgcmVhZC1vbmx5IGZyb20gYWdlbnQpXG4gICAgdGhpcy5faXNSdW5uaW5nID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhZ2VudCBtZXNzYWdlcyBjaGFuZ2UuXG4gICAqL1xuICBAT3V0cHV0KCkgbWVzc2FnZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhZ2VudCBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSBydW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcnVuSW5pdGlhbGl6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIHJ1biBpcyBmaW5hbGl6ZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcnVuRmluYWxpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSBydW4gZmFpbHMuXG4gICAqL1xuICBAT3V0cHV0KCkgcnVuRmFpbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cEFnZW50KCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0NvcmUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcImFnZW50SWRcIl0gJiYgIWNoYW5nZXNbXCJhZ2VudElkXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAvLyBBZ2VudCBJRCBjaGFuZ2VkLCByZS1zZXR1cFxuICAgICAgdGhpcy5jbGVhbnVwQWdlbnRTdWJzY3JpcHRpb24oKTtcbiAgICAgIHRoaXMuc2V0dXBBZ2VudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cEFnZW50U3Vic2NyaXB0aW9uKCk7XG4gICAgdGhpcy5jbGVhbnVwQ29yZVN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEFnZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGVmZmVjdGl2ZUFnZW50SWQgPSB0aGlzLmFnZW50SWQgPz8gREVGQVVMVF9BR0VOVF9JRDtcbiAgICB0aGlzLmFnZW50ID0gdGhpcy5jb3BpbG90a2l0LmdldEFnZW50KGVmZmVjdGl2ZUFnZW50SWQpO1xuXG4gICAgLy8gVXBkYXRlIHNpZ25hbHNcbiAgICB0aGlzLmFnZW50U2lnbmFsLnNldCh0aGlzLmFnZW50KTtcblxuICAgIC8vIEVtaXQgaW5pdGlhbCBhZ2VudFxuICAgIHRoaXMuYWdlbnRDaGFuZ2UuZW1pdCh0aGlzLmFnZW50KTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhZ2VudCBldmVudHNcbiAgICB0aGlzLnN1YnNjcmliZVRvQWdlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9BZ2VudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBBZ2VudFN1YnNjcmlwdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuYWdlbnQpIHtcbiAgICAgIHRoaXMuYWdlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmFnZW50LnN1YnNjcmliZSh7XG4gICAgICAgIG9uTWVzc2FnZXNDaGFuZ2VkOiAocGFyYW1zKSA9PiB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlc0NoYW5nZS5lbWl0KHBhcmFtcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU3RhdGVDaGFuZ2VkOiAocGFyYW1zKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KHBhcmFtcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUnVuSW5pdGlhbGl6ZWQ6IChwYXJhbXMpID0+IHtcbiAgICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucnVubmluZ1NpZ25hbC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5ydW5Jbml0aWFsaXplZC5lbWl0KHBhcmFtcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUnVuRmluYWxpemVkOiAocGFyYW1zKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nU2lnbmFsLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMucnVuRmluYWxpemVkLmVtaXQocGFyYW1zKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SdW5GYWlsZWQ6IChwYXJhbXMpID0+IHtcbiAgICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJ1bm5pbmdTaWduYWwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnJ1bm5pbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5ydW5GYWlsZWQuZW1pdChwYXJhbXMpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0NvcmUoKTogdm9pZCB7XG4gICAgLy8gU3Vic2NyaWJlIHRvIENvcGlsb3RLaXQgY2hhbmdlcyB0byBkZXRlY3QgYWdlbnQgdXBkYXRlc1xuICAgIHRoaXMuY29yZVVuc3Vic2NyaWJlID0gdGhpcy5jb3BpbG90a2l0LmNvcGlsb3RraXQuc3Vic2NyaWJlKHtcbiAgICAgIG9uUnVudGltZUxvYWRlZDogKCkgPT4ge1xuICAgICAgICAvLyBSZS1jaGVjayBhZ2VudCB3aGVuIHJ1bnRpbWUgbG9hZHNcbiAgICAgICAgdGhpcy5zZXR1cEFnZW50KCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwQWdlbnRTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5hZ2VudFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmFnZW50U3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwQ29yZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmNvcmVVbnN1YnNjcmliZT8uKCk7XG4gICAgdGhpcy5jb3JlVW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Directive, Input, Output, EventEmitter, Optional, isDevMode, Inject, } from "@angular/core";
|
|
2
|
+
import { CopilotChatConfigurationService } from "../core/chat-configuration/chat-configuration.service";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../core/chat-configuration/chat-configuration.service";
|
|
5
|
+
/**
|
|
6
|
+
* Directive for configuring CopilotKit chat settings declaratively in templates.
|
|
7
|
+
* Works with the CopilotChatConfigurationService to provide reactive chat configuration.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```html
|
|
11
|
+
* <!-- Basic usage with individual inputs -->
|
|
12
|
+
* <div copilotkitChatConfig
|
|
13
|
+
* [labels]="customLabels"
|
|
14
|
+
* [inputValue]="currentInput"
|
|
15
|
+
* (submitInput)="onSubmit($event)"
|
|
16
|
+
* (changeInput)="onChange($event)">
|
|
17
|
+
* <!-- Chat UI components -->
|
|
18
|
+
* </div>
|
|
19
|
+
*
|
|
20
|
+
* <!-- Using configuration object -->
|
|
21
|
+
* <div [copilotkitChatConfig]="chatConfig">
|
|
22
|
+
* <!-- Chat UI components -->
|
|
23
|
+
* </div>
|
|
24
|
+
*
|
|
25
|
+
* <!-- Two-way binding for input value -->
|
|
26
|
+
* <div copilotkitChatConfig
|
|
27
|
+
* [(value)]="chatInput"
|
|
28
|
+
* (submitInput)="handleSubmit($event)">
|
|
29
|
+
* <!-- Chat UI components -->
|
|
30
|
+
* </div>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class CopilotKitChatConfigDirective {
|
|
34
|
+
chatConfig;
|
|
35
|
+
_value;
|
|
36
|
+
submitHandler;
|
|
37
|
+
changeHandler;
|
|
38
|
+
constructor(chatConfig) {
|
|
39
|
+
this.chatConfig = chatConfig;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Partial labels to override defaults
|
|
43
|
+
*/
|
|
44
|
+
labels;
|
|
45
|
+
/**
|
|
46
|
+
* The current input value
|
|
47
|
+
*/
|
|
48
|
+
inputValue;
|
|
49
|
+
/**
|
|
50
|
+
* Event emitted when input is submitted
|
|
51
|
+
*/
|
|
52
|
+
submitInput = new EventEmitter();
|
|
53
|
+
/**
|
|
54
|
+
* Event emitted when input value changes
|
|
55
|
+
*/
|
|
56
|
+
changeInput = new EventEmitter();
|
|
57
|
+
/**
|
|
58
|
+
* Alternative: accept full configuration object
|
|
59
|
+
*/
|
|
60
|
+
set config(value) {
|
|
61
|
+
if (value) {
|
|
62
|
+
if (value.labels)
|
|
63
|
+
this.labels = value.labels;
|
|
64
|
+
if (value.inputValue !== undefined)
|
|
65
|
+
this.inputValue = value.inputValue;
|
|
66
|
+
// Store handlers for later setup
|
|
67
|
+
if (value.onSubmitInput)
|
|
68
|
+
this.submitHandler = value.onSubmitInput;
|
|
69
|
+
if (value.onChangeInput)
|
|
70
|
+
this.changeHandler = value.onChangeInput;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Two-way binding for input value
|
|
75
|
+
*/
|
|
76
|
+
get value() {
|
|
77
|
+
return this._value;
|
|
78
|
+
}
|
|
79
|
+
set value(v) {
|
|
80
|
+
this._value = v;
|
|
81
|
+
this.valueChange.emit(v);
|
|
82
|
+
if (v !== undefined) {
|
|
83
|
+
this.updateInputValue(v);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Two-way binding output for value
|
|
88
|
+
*/
|
|
89
|
+
valueChange = new EventEmitter();
|
|
90
|
+
ngOnInit() {
|
|
91
|
+
if (!this.chatConfig) {
|
|
92
|
+
if (isDevMode()) {
|
|
93
|
+
console.warn("CopilotKitChatConfigDirective: No CopilotChatConfigurationService found. " +
|
|
94
|
+
"Make sure to provide it using provideCopilotChatConfiguration().");
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.updateConfiguration();
|
|
99
|
+
this.setupHandlers();
|
|
100
|
+
}
|
|
101
|
+
ngOnChanges(changes) {
|
|
102
|
+
if (!this.chatConfig) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const relevantChanges = changes["labels"] || changes["inputValue"] || changes["value"];
|
|
106
|
+
if (relevantChanges && !relevantChanges.firstChange) {
|
|
107
|
+
this.updateConfiguration();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
ngOnDestroy() {
|
|
111
|
+
// Cleanup if needed
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Submit the current input value
|
|
115
|
+
*/
|
|
116
|
+
submit(value) {
|
|
117
|
+
// Emit to template binding
|
|
118
|
+
this.submitInput.emit(value);
|
|
119
|
+
// Call service handler
|
|
120
|
+
if (this.chatConfig) {
|
|
121
|
+
this.chatConfig.submitInput(value);
|
|
122
|
+
}
|
|
123
|
+
// Call provided handler
|
|
124
|
+
if (this.submitHandler) {
|
|
125
|
+
this.submitHandler(value);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Handle input value change
|
|
130
|
+
*/
|
|
131
|
+
change(value) {
|
|
132
|
+
// Update internal value
|
|
133
|
+
this._value = value;
|
|
134
|
+
// Emit to template bindings
|
|
135
|
+
this.changeInput.emit(value);
|
|
136
|
+
this.valueChange.emit(value);
|
|
137
|
+
// Call service handler
|
|
138
|
+
if (this.chatConfig) {
|
|
139
|
+
this.chatConfig.changeInput(value);
|
|
140
|
+
}
|
|
141
|
+
// Call provided handler
|
|
142
|
+
if (this.changeHandler) {
|
|
143
|
+
this.changeHandler(value);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
updateConfiguration() {
|
|
147
|
+
if (!this.chatConfig) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Update labels if provided
|
|
151
|
+
if (this.labels) {
|
|
152
|
+
this.chatConfig.setLabels(this.labels);
|
|
153
|
+
}
|
|
154
|
+
// Update input value if provided
|
|
155
|
+
const valueToSet = this._value !== undefined ? this._value : this.inputValue;
|
|
156
|
+
if (valueToSet !== undefined) {
|
|
157
|
+
this.chatConfig.setInputValue(valueToSet);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
updateInputValue(value) {
|
|
161
|
+
if (this.chatConfig) {
|
|
162
|
+
this.chatConfig.setInputValue(value);
|
|
163
|
+
this.chatConfig.changeInput(value);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
setupHandlers() {
|
|
167
|
+
if (!this.chatConfig) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// Create composite handlers that call both service and directive handlers
|
|
171
|
+
const submitComposite = (value) => {
|
|
172
|
+
this.submitInput.emit(value);
|
|
173
|
+
if (this.submitHandler) {
|
|
174
|
+
this.submitHandler(value);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const changeComposite = (value) => {
|
|
178
|
+
this.changeInput.emit(value);
|
|
179
|
+
this.valueChange.emit(value);
|
|
180
|
+
if (this.changeHandler) {
|
|
181
|
+
this.changeHandler(value);
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
// Set handlers on the service
|
|
185
|
+
this.chatConfig.setSubmitHandler(submitComposite);
|
|
186
|
+
this.chatConfig.setChangeHandler(changeComposite);
|
|
187
|
+
}
|
|
188
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitChatConfigDirective, deps: [{ token: CopilotChatConfigurationService, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
189
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitChatConfigDirective, isStandalone: true, selector: "[copilotkitChatConfig]", inputs: { labels: "labels", inputValue: "inputValue", config: ["copilotkitChatConfig", "config"], value: "value" }, outputs: { submitInput: "submitInput", changeInput: "changeInput", valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0 });
|
|
190
|
+
}
|
|
191
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitChatConfigDirective, decorators: [{
|
|
192
|
+
type: Directive,
|
|
193
|
+
args: [{
|
|
194
|
+
selector: "[copilotkitChatConfig]",
|
|
195
|
+
standalone: true,
|
|
196
|
+
}]
|
|
197
|
+
}], ctorParameters: () => [{ type: i1.CopilotChatConfigurationService, decorators: [{
|
|
198
|
+
type: Optional
|
|
199
|
+
}, {
|
|
200
|
+
type: Inject,
|
|
201
|
+
args: [CopilotChatConfigurationService]
|
|
202
|
+
}] }], propDecorators: { labels: [{
|
|
203
|
+
type: Input
|
|
204
|
+
}], inputValue: [{
|
|
205
|
+
type: Input
|
|
206
|
+
}], submitInput: [{
|
|
207
|
+
type: Output
|
|
208
|
+
}], changeInput: [{
|
|
209
|
+
type: Output
|
|
210
|
+
}], config: [{
|
|
211
|
+
type: Input,
|
|
212
|
+
args: ["copilotkitChatConfig"]
|
|
213
|
+
}], value: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], valueChange: [{
|
|
216
|
+
type: Output
|
|
217
|
+
}] } });
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1jaGF0LWNvbmZpZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGlyZWN0aXZlcy9jb3BpbG90a2l0LWNoYXQtY29uZmlnLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUtaLFFBQVEsRUFDUixTQUFTLEVBQ1QsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7QUFNeEc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUtILE1BQU0sT0FBTyw2QkFBNkI7SUFVckI7SUFQWCxNQUFNLENBQVU7SUFDaEIsYUFBYSxDQUEyQjtJQUN4QyxhQUFhLENBQTJCO0lBRWhELFlBR21CLFVBQWtEO1FBQWxELGVBQVUsR0FBVixVQUFVLENBQXdDO0lBQ2xFLENBQUM7SUFFSjs7T0FFRztJQUNNLE1BQU0sQ0FBOEI7SUFFN0M7O09BRUc7SUFDTSxVQUFVLENBQVU7SUFFN0I7O09BRUc7SUFDTyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUVuRDs7T0FFRztJQUNPLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRW5EOztPQUVHO0lBQ0gsSUFDSSxNQUFNLENBQUMsS0FBMkM7UUFDcEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksS0FBSyxDQUFDLE1BQU07Z0JBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzdDLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTO2dCQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUN2RSxpQ0FBaUM7WUFDakMsSUFBSSxLQUFLLENBQUMsYUFBYTtnQkFBRSxJ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Q0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDcEQsQ0FBQzt3R0E1TFUsNkJBQTZCLGtCQVM5QiwrQkFBK0I7NEZBVDlCLDZCQUE2Qjs7NEZBQTdCLDZCQUE2QjtrQkFKekMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxVQUFVLEVBQUUsSUFBSTtpQkFDakI7OzBCQVNJLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsK0JBQStCO3lDQU9oQyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLSSxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBTUgsTUFBTTtzQkFEVCxLQUFLO3VCQUFDLHNCQUFzQjtnQkFlekIsS0FBSztzQkFEUixLQUFLO2dCQWVJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT3B0aW9uYWwsXG4gIGlzRGV2TW9kZSxcbiAgSW5qZWN0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gXCIuLi9jb3JlL2NoYXQtY29uZmlndXJhdGlvbi9jaGF0LWNvbmZpZ3VyYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ29waWxvdENoYXRDb25maWd1cmF0aW9uLFxuICBDb3BpbG90Q2hhdExhYmVscyxcbn0gZnJvbSBcIi4uL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi50eXBlc1wiO1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgY29uZmlndXJpbmcgQ29waWxvdEtpdCBjaGF0IHNldHRpbmdzIGRlY2xhcmF0aXZlbHkgaW4gdGVtcGxhdGVzLlxuICogV29ya3Mgd2l0aCB0aGUgQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSB0byBwcm92aWRlIHJlYWN0aXZlIGNoYXQgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPCEtLSBCYXNpYyB1c2FnZSB3aXRoIGluZGl2aWR1YWwgaW5wdXRzIC0tPlxuICogPGRpdiBjb3BpbG90a2l0Q2hhdENvbmZpZ1xuICogICAgICBbbGFiZWxzXT1cImN1c3RvbUxhYmVsc1wiXG4gKiAgICAgIFtpbnB1dFZhbHVlXT1cImN1cnJlbnRJbnB1dFwiXG4gKiAgICAgIChzdWJtaXRJbnB1dCk9XCJvblN1Ym1pdCgkZXZlbnQpXCJcbiAqICAgICAgKGNoYW5nZUlucHV0KT1cIm9uQ2hhbmdlKCRldmVudClcIj5cbiAqICAgPCEtLSBDaGF0IFVJIGNvbXBvbmVudHMgLS0+XG4gKiA8L2Rpdj5cbiAqXG4gKiA8IS0tIFVzaW5nIGNvbmZpZ3VyYXRpb24gb2JqZWN0IC0tPlxuICogPGRpdiBbY29waWxvdGtpdENoYXRDb25maWddPVwiY2hhdENvbmZpZ1wiPlxuICogICA8IS0tIENoYXQgVUkgY29tcG9uZW50cyAtLT5cbiAqIDwvZGl2PlxuICpcbiAqIDwhLS0gVHdvLXdheSBiaW5kaW5nIGZvciBpbnB1dCB2YWx1ZSAtLT5cbiAqIDxkaXYgY29waWxvdGtpdENoYXRDb25maWdcbiAqICAgICAgWyh2YWx1ZSldPVwiY2hhdElucHV0XCJcbiAqICAgICAgKHN1Ym1pdElucHV0KT1cImhhbmRsZVN1Ym1pdCgkZXZlbnQpXCI+XG4gKiAgIDwhLS0gQ2hhdCBVSSBjb21wb25lbnRzIC0tPlxuICogPC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIltjb3BpbG90a2l0Q2hhdENvbmZpZ11cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdENoYXRDb25maWdEaXJlY3RpdmVcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XG57XG4gIHByaXZhdGUgX3ZhbHVlPzogc3RyaW5nO1xuICBwcml2YXRlIHN1Ym1pdEhhbmRsZXI/OiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgcHJpdmF0ZSBjaGFuZ2VIYW5kbGVyPzogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGF0Q29uZmlnOiBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlIHwgbnVsbFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFBhcnRpYWwgbGFiZWxzIHRvIG92ZXJyaWRlIGRlZmF1bHRzXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbHM/OiBQYXJ0aWFsPENvcGlsb3RDaGF0TGFiZWxzPjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgaW5wdXQgdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIGlucHV0VmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBpbnB1dCBpcyBzdWJtaXR0ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBzdWJtaXRJbnB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gaW5wdXQgdmFsdWUgY2hhbmdlc1xuICAgKi9cbiAgQE91dHB1dCgpIGNoYW5nZUlucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEFsdGVybmF0aXZlOiBhY2NlcHQgZnVsbCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgQElucHV0KFwiY29waWxvdGtpdENoYXRDb25maWdcIilcbiAgc2V0IGNvbmZpZyh2YWx1ZTogQ29waWxvdENoYXRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUubGFiZWxzKSB0aGlzLmxhYmVscyA9IHZhbHVlLmxhYmVscztcbiAgICAgIGlmICh2YWx1ZS5pbnB1dFZhbHVlICE9PSB1bmRlZmluZWQpIHRoaXMuaW5wdXRWYWx1ZSA9IHZhbHVlLmlucHV0VmFsdWU7XG4gICAgICAvLyBTdG9yZSBoYW5kbGVycyBmb3IgbGF0ZXIgc2V0dXBcbiAgICAgIGlmICh2YWx1ZS5vblN1Ym1pdElucHV0KSB0aGlzLnN1Ym1pdEhhbmRsZXIgPSB2YWx1ZS5vblN1Ym1pdElucHV0O1xuICAgICAgaWYgKHZhbHVlLm9uQ2hhbmdlSW5wdXQpIHRoaXMuY2hhbmdlSGFuZGxlciA9IHZhbHVlLm9uQ2hhbmdlSW5wdXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFR3by13YXkgYmluZGluZyBmb3IgaW5wdXQgdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2O1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2KTtcbiAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUlucHV0VmFsdWUodik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFR3by13YXkgYmluZGluZyBvdXRwdXQgZm9yIHZhbHVlXG4gICAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhdENvbmZpZykge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIkNvcGlsb3RLaXRDaGF0Q29uZmlnRGlyZWN0aXZlOiBObyBDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlIGZvdW5kLiBcIiArXG4gICAgICAgICAgICBcIk1ha2Ugc3VyZSB0byBwcm92aWRlIGl0IHVzaW5nIHByb3ZpZGVDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb24oKS5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuc2V0dXBIYW5kbGVycygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGF0Q29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZXZhbnRDaGFuZ2VzID1cbiAgICAgIGNoYW5nZXNbXCJsYWJlbHNcIl0gfHwgY2hhbmdlc1tcImlucHV0VmFsdWVcIl0gfHwgY2hhbmdlc1tcInZhbHVlXCJdO1xuXG4gICAgaWYgKHJlbGV2YW50Q2hhbmdlcyAmJiAhcmVsZXZhbnRDaGFuZ2VzLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbnVwIGlmIG5lZWRlZFxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZVxuICAgKi9cbiAgc3VibWl0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBFbWl0IHRvIHRlbXBsYXRlIGJpbmRpbmdcbiAgICB0aGlzLnN1Ym1pdElucHV0LmVtaXQodmFsdWUpO1xuXG4gICAgLy8gQ2FsbCBzZXJ2aWNlIGhhbmRsZXJcbiAgICBpZiAodGhpcy5jaGF0Q29uZmlnKSB7XG4gICAgICB0aGlzLmNoYXRDb25maWcuc3VibWl0SW5wdXQodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENhbGwgcHJvdmlkZWQgaGFuZGxlclxuICAgIGlmICh0aGlzLnN1Ym1pdEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuc3VibWl0SGFuZGxlcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBpbnB1dCB2YWx1ZSBjaGFuZ2VcbiAgICovXG4gIGNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIGludGVybmFsIHZhbHVlXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcblxuICAgIC8vIEVtaXQgdG8gdGVtcGxhdGUgYmluZGluZ3NcbiAgICB0aGlzLmNoYW5nZUlucHV0LmVtaXQodmFsdWUpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG5cbiAgICAvLyBDYWxsIHNlcnZpY2UgaGFuZGxlclxuICAgIGlmICh0aGlzLmNoYXRDb25maWcpIHtcbiAgICAgIHRoaXMuY2hhdENvbmZpZy5jaGFuZ2VJbnB1dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBwcm92aWRlZCBoYW5kbGVyXG4gICAgaWYgKHRoaXMuY2hhbmdlSGFuZGxlcikge1xuICAgICAgdGhpcy5jaGFuZ2VIYW5kbGVyKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXRDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGFiZWxzIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMubGFiZWxzKSB7XG4gICAgICB0aGlzLmNoYXRDb25maWcuc2V0TGFiZWxzKHRoaXMubGFiZWxzKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgaW5wdXQgdmFsdWUgaWYgcHJvdmlkZWRcbiAgICBjb25zdCB2YWx1ZVRvU2V0ID1cbiAgICAgIHRoaXMuX3ZhbHVlICE9PSB1bmRlZmluZWQgPyB0aGlzLl92YWx1ZSA6IHRoaXMuaW5wdXRWYWx1ZTtcbiAgICBpZiAodmFsdWVUb1NldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoYXRDb25maWcuc2V0SW5wdXRWYWx1ZSh2YWx1ZVRvU2V0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUlucHV0VmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXRDb25maWcpIHtcbiAgICAgIHRoaXMuY2hhdENvbmZpZy5zZXRJbnB1dFZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuY2hhdENvbmZpZy5jaGFuZ2VJbnB1dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGF0Q29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvc2l0ZSBoYW5kbGVycyB0aGF0IGNhbGwgYm90aCBzZXJ2aWNlIGFuZCBkaXJlY3RpdmUgaGFuZGxlcnNcbiAgICBjb25zdCBzdWJtaXRDb21wb3NpdGUgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zdWJtaXRJbnB1dC5lbWl0KHZhbHVlKTtcbiAgICAgIGlmICh0aGlzLnN1Ym1pdEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5zdWJtaXRIYW5kbGVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2hhbmdlQ29tcG9zaXRlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuY2hhbmdlSW5wdXQuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuY2hhbmdlSGFuZGxlcikge1xuICAgICAgICB0aGlzLmNoYW5nZUhhbmRsZXIodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgaGFuZGxlcnMgb24gdGhlIHNlcnZpY2VcbiAgICB0aGlzLmNoYXRDb25maWcuc2V0U3VibWl0SGFuZGxlcihzdWJtaXRDb21wb3NpdGUpO1xuICAgIHRoaXMuY2hhdENvbmZpZy5zZXRDaGFuZ2VIYW5kbGVyKGNoYW5nZUNvbXBvc2l0ZSk7XG4gIH1cbn1cbiJdfQ==
|