@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.
Files changed (171) hide show
  1. package/README.md +248 -0
  2. package/dist/README.md +248 -0
  3. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
  4. package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
  5. package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
  6. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
  7. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
  8. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
  9. package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
  10. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  11. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
  12. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
  13. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
  14. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
  15. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
  16. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
  17. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
  18. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
  19. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
  20. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
  21. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
  22. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
  23. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
  24. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
  25. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
  26. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
  27. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
  28. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
  29. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
  30. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
  31. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
  32. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
  33. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
  34. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
  35. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
  36. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
  37. package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
  38. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
  39. package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
  40. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
  41. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
  42. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
  43. package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
  44. package/dist/esm2022/core/copilotkit.service.mjs +430 -0
  45. package/dist/esm2022/core/copilotkit.types.mjs +12 -0
  46. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
  47. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
  48. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
  49. package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
  50. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
  51. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
  52. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
  53. package/dist/esm2022/index.mjs +70 -0
  54. package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
  55. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
  56. package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
  57. package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
  58. package/dist/esm2022/lib/utils.mjs +10 -0
  59. package/dist/esm2022/services/resize-observer.service.mjs +152 -0
  60. package/dist/esm2022/services/scroll-position.service.mjs +124 -0
  61. package/dist/esm2022/types/frontend-tool.mjs +2 -0
  62. package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
  63. package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
  64. package/dist/esm2022/utils/agent.utils.mjs +204 -0
  65. package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
  66. package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
  67. package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
  68. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
  69. package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
  70. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  71. package/dist/styles.css +0 -27
  72. package/package.json +23 -20
  73. package/vitest.config.mts +32 -21
  74. package/.turbo/turbo-build.log +0 -39
  75. package/.turbo/turbo-check-types.log +0 -0
  76. package/.turbo/turbo-test.log +0 -71
  77. package/README-agent-context.md +0 -310
  78. package/ng-package.json +0 -19
  79. package/slots.md +0 -331
  80. package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
  81. package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
  82. package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
  83. package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
  84. package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
  85. package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
  86. package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
  87. package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
  88. package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
  89. package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
  90. package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
  91. package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
  92. package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
  93. package/src/components/chat/copilot-chat-input.component.ts +0 -512
  94. package/src/components/chat/copilot-chat-input.types.ts +0 -148
  95. package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
  96. package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
  97. package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
  98. package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
  99. package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
  100. package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
  101. package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
  102. package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
  103. package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
  104. package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
  105. package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
  106. package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
  107. package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
  108. package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
  109. package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
  110. package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
  111. package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
  112. package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
  113. package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
  114. package/src/components/chat/copilot-chat-view.component.ts +0 -420
  115. package/src/components/chat/copilot-chat-view.types.ts +0 -52
  116. package/src/components/chat/copilot-chat.component.ts +0 -232
  117. package/src/components/copilotkit-tool-render.component.ts +0 -169
  118. package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
  119. package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
  120. package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
  121. package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
  122. package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
  123. package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
  124. package/src/core/copilotkit.providers.ts +0 -59
  125. package/src/core/copilotkit.service.ts +0 -542
  126. package/src/core/copilotkit.types.ts +0 -132
  127. package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
  128. package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
  129. package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
  130. package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
  131. package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
  132. package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
  133. package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
  134. package/src/directives/copilotkit-agent-context.directive.ts +0 -138
  135. package/src/directives/copilotkit-agent.directive.ts +0 -225
  136. package/src/directives/copilotkit-chat-config.directive.ts +0 -241
  137. package/src/directives/copilotkit-config.directive.ts +0 -81
  138. package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
  139. package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
  140. package/src/directives/stick-to-bottom.directive.ts +0 -204
  141. package/src/index.ts +0 -105
  142. package/src/lib/directives/tooltip.directive.ts +0 -292
  143. package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
  144. package/src/lib/slots/copilot-slot.component.ts +0 -135
  145. package/src/lib/slots/index.ts +0 -3
  146. package/src/lib/slots/slot.types.ts +0 -64
  147. package/src/lib/slots/slot.utils.ts +0 -289
  148. package/src/lib/utils.ts +0 -10
  149. package/src/public-api.ts +0 -1
  150. package/src/services/resize-observer.service.ts +0 -181
  151. package/src/services/scroll-position.service.ts +0 -169
  152. package/src/styles/globals.css +0 -266
  153. package/src/styles/index.css +0 -3
  154. package/src/test-setup.ts +0 -15
  155. package/src/testing/index.ts +0 -3
  156. package/src/testing/testing.utils.ts +0 -248
  157. package/src/types/frontend-tool.ts +0 -44
  158. package/src/types/human-in-the-loop.ts +0 -52
  159. package/src/utils/__tests__/agent.utils.spec.ts +0 -234
  160. package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
  161. package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
  162. package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
  163. package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
  164. package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
  165. package/src/utils/agent-context.utils.ts +0 -133
  166. package/src/utils/agent.utils.ts +0 -239
  167. package/src/utils/chat-config.utils.ts +0 -221
  168. package/src/utils/copilotkit.utils.ts +0 -20
  169. package/src/utils/frontend-tool.utils.ts +0 -266
  170. package/src/utils/human-in-the-loop.utils.ts +0 -359
  171. 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==