@copilotkitnext/angular 0.0.2 → 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 (168) hide show
  1. package/README.md +3 -3
  2. package/dist/README.md +3 -3
  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/package.json +21 -18
  72. package/vitest.config.mts +32 -21
  73. package/.turbo/turbo-build.log +0 -38
  74. package/.turbo/turbo-check-types.log +0 -0
  75. package/.turbo/turbo-test.log +0 -71
  76. package/ng-package.json +0 -19
  77. package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
  78. package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
  79. package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
  80. package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
  81. package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
  82. package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
  83. package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
  84. package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
  85. package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
  86. package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
  87. package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
  88. package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
  89. package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
  90. package/src/components/chat/copilot-chat-input.component.ts +0 -512
  91. package/src/components/chat/copilot-chat-input.types.ts +0 -148
  92. package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
  93. package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
  94. package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
  95. package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
  96. package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
  97. package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
  98. package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
  99. package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
  100. package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
  101. package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
  102. package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
  103. package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
  104. package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
  105. package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
  106. package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
  107. package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
  108. package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
  109. package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
  110. package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
  111. package/src/components/chat/copilot-chat-view.component.ts +0 -420
  112. package/src/components/chat/copilot-chat-view.types.ts +0 -52
  113. package/src/components/chat/copilot-chat.component.ts +0 -232
  114. package/src/components/copilotkit-tool-render.component.ts +0 -169
  115. package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
  116. package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
  117. package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
  118. package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
  119. package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
  120. package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
  121. package/src/core/copilotkit.providers.ts +0 -59
  122. package/src/core/copilotkit.service.ts +0 -542
  123. package/src/core/copilotkit.types.ts +0 -132
  124. package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
  125. package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
  126. package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
  127. package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
  128. package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
  129. package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
  130. package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
  131. package/src/directives/copilotkit-agent-context.directive.ts +0 -138
  132. package/src/directives/copilotkit-agent.directive.ts +0 -225
  133. package/src/directives/copilotkit-chat-config.directive.ts +0 -241
  134. package/src/directives/copilotkit-config.directive.ts +0 -81
  135. package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
  136. package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
  137. package/src/directives/stick-to-bottom.directive.ts +0 -204
  138. package/src/index.ts +0 -105
  139. package/src/lib/directives/tooltip.directive.ts +0 -292
  140. package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
  141. package/src/lib/slots/copilot-slot.component.ts +0 -135
  142. package/src/lib/slots/index.ts +0 -3
  143. package/src/lib/slots/slot.types.ts +0 -64
  144. package/src/lib/slots/slot.utils.ts +0 -289
  145. package/src/lib/utils.ts +0 -10
  146. package/src/public-api.ts +0 -1
  147. package/src/services/resize-observer.service.ts +0 -181
  148. package/src/services/scroll-position.service.ts +0 -169
  149. package/src/styles/globals.css +0 -266
  150. package/src/styles/index.css +0 -3
  151. package/src/test-setup.ts +0 -15
  152. package/src/testing/index.ts +0 -3
  153. package/src/testing/testing.utils.ts +0 -248
  154. package/src/types/frontend-tool.ts +0 -44
  155. package/src/types/human-in-the-loop.ts +0 -52
  156. package/src/utils/__tests__/agent.utils.spec.ts +0 -234
  157. package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
  158. package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
  159. package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
  160. package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
  161. package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
  162. package/src/utils/agent-context.utils.ts +0 -133
  163. package/src/utils/agent.utils.ts +0 -239
  164. package/src/utils/chat-config.utils.ts +0 -221
  165. package/src/utils/copilotkit.utils.ts +0 -20
  166. package/src/utils/frontend-tool.utils.ts +0 -266
  167. package/src/utils/human-in-the-loop.utils.ts +0 -359
  168. package/tsconfig.spec.json +0 -12
@@ -0,0 +1,94 @@
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 configure CopilotKit runtime settings declaratively in templates.
7
+ *
8
+ * @example
9
+ * ```html
10
+ * <div [copilotkitConfig]="{
11
+ * runtimeUrl: 'https://api.example.com',
12
+ * headers: { 'Authorization': 'Bearer token' }
13
+ * }">
14
+ * <!-- Your app content -->
15
+ * </div>
16
+ * ```
17
+ *
18
+ * Or with individual inputs:
19
+ * ```html
20
+ * <div copilotkitConfig
21
+ * [runtimeUrl]="apiUrl"
22
+ * [headers]="authHeaders"
23
+ * [agents]="myAgents">
24
+ * <!-- Your app content -->
25
+ * </div>
26
+ * ```
27
+ */
28
+ export class CopilotKitConfigDirective {
29
+ copilotkit;
30
+ constructor(copilotkit) {
31
+ this.copilotkit = copilotkit;
32
+ }
33
+ copilotkitConfig;
34
+ runtimeUrl;
35
+ headers;
36
+ properties;
37
+ agents;
38
+ ngOnChanges(changes) {
39
+ // Handle combined config object
40
+ if (changes['copilotkitConfig']) {
41
+ const config = this.copilotkitConfig;
42
+ if (config) {
43
+ if (config.runtimeUrl !== undefined) {
44
+ this.copilotkit.setRuntimeUrl(config.runtimeUrl);
45
+ }
46
+ if (config.headers) {
47
+ this.copilotkit.setHeaders(config.headers);
48
+ }
49
+ if (config.properties) {
50
+ this.copilotkit.setProperties(config.properties);
51
+ }
52
+ if (config.agents) {
53
+ this.copilotkit.setAgents(config.agents);
54
+ }
55
+ }
56
+ }
57
+ // Handle individual inputs
58
+ if (changes['runtimeUrl'] && !this.copilotkitConfig) {
59
+ this.copilotkit.setRuntimeUrl(this.runtimeUrl);
60
+ }
61
+ if (changes['headers'] && !this.copilotkitConfig) {
62
+ this.copilotkit.setHeaders(this.headers || {});
63
+ }
64
+ if (changes['properties'] && !this.copilotkitConfig) {
65
+ this.copilotkit.setProperties(this.properties || {});
66
+ }
67
+ if (changes['agents'] && !this.copilotkitConfig) {
68
+ this.copilotkit.setAgents(this.agents || {});
69
+ }
70
+ }
71
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitConfigDirective, deps: [{ token: CopilotKitService }], target: i0.ɵɵFactoryTarget.Directive });
72
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitConfigDirective, isStandalone: true, selector: "[copilotkitConfig]", inputs: { copilotkitConfig: "copilotkitConfig", runtimeUrl: "runtimeUrl", headers: "headers", properties: "properties", agents: "agents" }, usesOnChanges: true, ngImport: i0 });
73
+ }
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitConfigDirective, decorators: [{
75
+ type: Directive,
76
+ args: [{
77
+ selector: "[copilotkitConfig]",
78
+ standalone: true,
79
+ }]
80
+ }], ctorParameters: () => [{ type: i1.CopilotKitService, decorators: [{
81
+ type: Inject,
82
+ args: [CopilotKitService]
83
+ }] }], propDecorators: { copilotkitConfig: [{
84
+ type: Input
85
+ }], runtimeUrl: [{
86
+ type: Input
87
+ }], headers: [{
88
+ type: Input
89
+ }], properties: [{
90
+ type: Input
91
+ }], agents: [{
92
+ type: Input
93
+ }] } });
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1jb25maWcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RpcmVjdGl2ZXMvY29waWxvdGtpdC1jb25maWcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE0QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQUcvRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUtILE1BQU0sT0FBTyx5QkFBeUI7SUFDb0I7SUFBeEQsWUFBd0QsVUFBNkI7UUFBN0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7SUFBRyxDQUFDO0lBRWhGLGdCQUFnQixDQUt2QjtJQUVPLFVBQVUsQ0FBVTtJQUNwQixPQUFPLENBQTBCO0lBQ2pDLFVBQVUsQ0FBMkI7SUFDckMsTUFBTSxDQUFpQztJQUVoRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsZ0NBQWdDO1FBQ2hDLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDckMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO2dCQUNELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ25ELENBQUM7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQWhEVSx5QkFBeUIsa0JBQ2hCLGlCQUFpQjs0RkFEMUIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQUpyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBRWMsTUFBTTsyQkFBQyxpQkFBaUI7eUNBRTVCLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFPRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEFnZW50IH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcblxuLyoqXG4gKiBEaXJlY3RpdmUgdG8gY29uZmlndXJlIENvcGlsb3RLaXQgcnVudGltZSBzZXR0aW5ncyBkZWNsYXJhdGl2ZWx5IGluIHRlbXBsYXRlcy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxkaXYgW2NvcGlsb3RraXRDb25maWddPVwie1xuICogICBydW50aW1lVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20nLFxuICogICBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciB0b2tlbicgfVxuICogfVwiPlxuICogICA8IS0tIFlvdXIgYXBwIGNvbnRlbnQgLS0+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICogXG4gKiBPciB3aXRoIGluZGl2aWR1YWwgaW5wdXRzOlxuICogYGBgaHRtbFxuICogPGRpdiBjb3BpbG90a2l0Q29uZmlnXG4gKiAgICAgIFtydW50aW1lVXJsXT1cImFwaVVybFwiXG4gKiAgICAgIFtoZWFkZXJzXT1cImF1dGhIZWFkZXJzXCJcbiAqICAgICAgW2FnZW50c109XCJteUFnZW50c1wiPlxuICogICA8IS0tIFlvdXIgYXBwIGNvbnRlbnQgLS0+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RraXRDb25maWddXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RLaXRDb25maWdEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KENvcGlsb3RLaXRTZXJ2aWNlKSBwcml2YXRlIHJlYWRvbmx5IGNvcGlsb3RraXQ6IENvcGlsb3RLaXRTZXJ2aWNlKSB7fVxuXG4gIEBJbnB1dCgpIGNvcGlsb3RraXRDb25maWc/OiB7XG4gICAgcnVudGltZVVybD86IHN0cmluZztcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD47XG4gIH07XG5cbiAgQElucHV0KCkgcnVudGltZVVybD86IHN0cmluZztcbiAgQElucHV0KCkgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIEBJbnB1dCgpIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQElucHV0KCkgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD47XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBjb21iaW5lZCBjb25maWcgb2JqZWN0XG4gICAgaWYgKGNoYW5nZXNbJ2NvcGlsb3RraXRDb25maWcnXSkge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb3BpbG90a2l0Q29uZmlnO1xuICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLnJ1bnRpbWVVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuY29waWxvdGtpdC5zZXRSdW50aW1lVXJsKGNvbmZpZy5ydW50aW1lVXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmhlYWRlcnMpIHtcbiAgICAgICAgICB0aGlzLmNvcGlsb3RraXQuc2V0SGVhZGVycyhjb25maWcuaGVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgdGhpcy5jb3BpbG90a2l0LnNldFByb3BlcnRpZXMoY29uZmlnLnByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuYWdlbnRzKSB7XG4gICAgICAgICAgdGhpcy5jb3BpbG90a2l0LnNldEFnZW50cyhjb25maWcuYWdlbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgIGlmIChjaGFuZ2VzWydydW50aW1lVXJsJ10gJiYgIXRoaXMuY29waWxvdGtpdENvbmZpZykge1xuICAgICAgdGhpcy5jb3BpbG90a2l0LnNldFJ1bnRpbWVVcmwodGhpcy5ydW50aW1lVXJsKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hlYWRlcnMnXSAmJiAhdGhpcy5jb3BpbG90a2l0Q29uZmlnKSB7XG4gICAgICB0aGlzLmNvcGlsb3RraXQuc2V0SGVhZGVycyh0aGlzLmhlYWRlcnMgfHwge30pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sncHJvcGVydGllcyddICYmICF0aGlzLmNvcGlsb3RraXRDb25maWcpIHtcbiAgICAgIHRoaXMuY29waWxvdGtpdC5zZXRQcm9wZXJ0aWVzKHRoaXMucHJvcGVydGllcyB8fCB7fSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydhZ2VudHMnXSAmJiAhdGhpcy5jb3BpbG90a2l0Q29uZmlnKSB7XG4gICAgICB0aGlzLmNvcGlsb3RraXQuc2V0QWdlbnRzKHRoaXMuYWdlbnRzIHx8IHt9KTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -0,0 +1,130 @@
1
+ import { Directive, Input, isDevMode, Inject, } from "@angular/core";
2
+ import { CopilotKitService } from "../core/copilotkit.service";
3
+ import { z } from "zod";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../core/copilotkit.service";
6
+ export class CopilotKitFrontendToolDirective {
7
+ copilotkit;
8
+ isRegistered = false;
9
+ constructor(copilotkit) {
10
+ this.copilotkit = copilotkit;
11
+ }
12
+ name;
13
+ description;
14
+ parameters;
15
+ handler;
16
+ render;
17
+ followUp;
18
+ // Alternative: Accept a full tool object
19
+ tool;
20
+ ngOnInit() {
21
+ this.registerTool();
22
+ }
23
+ ngOnChanges(_changes) {
24
+ if (this.isRegistered) {
25
+ // Re-register the tool if any properties change
26
+ this.unregisterTool();
27
+ this.registerTool();
28
+ }
29
+ }
30
+ ngOnDestroy() {
31
+ this.unregisterTool();
32
+ }
33
+ registerTool() {
34
+ const tool = this.getTool();
35
+ if (!tool.name) {
36
+ if (isDevMode()) {
37
+ console.warn('CopilotKitFrontendToolDirective: "name" is required. ' +
38
+ 'Please provide a name via [name]="toolName" or ' +
39
+ "[copilotkitFrontendTool]=\"{ name: 'toolName', ... }\"");
40
+ }
41
+ return; // Don't register if no name
42
+ }
43
+ // Register the tool with CopilotKit
44
+ this.copilotkit.copilotkit.addTool(tool);
45
+ // Register the render if provided
46
+ if (tool.render) {
47
+ const currentRenders = this.copilotkit.currentRenderToolCalls();
48
+ const renderEntry = {
49
+ name: tool.name,
50
+ args: tool.parameters || z.object({}),
51
+ render: tool.render,
52
+ };
53
+ // Check for duplicate
54
+ const existingIndex = currentRenders.findIndex((r) => r.name === tool.name);
55
+ if (existingIndex !== -1) {
56
+ if (isDevMode()) {
57
+ console.warn(`[CopilotKit] Tool "${tool.name}" already has a render. ` +
58
+ `The previous render will be replaced. ` +
59
+ `This may indicate a duplicate tool registration.`);
60
+ }
61
+ const updated = [...currentRenders];
62
+ updated[existingIndex] = renderEntry;
63
+ this.copilotkit.setCurrentRenderToolCalls(updated);
64
+ }
65
+ else {
66
+ this.copilotkit.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
67
+ }
68
+ }
69
+ this.isRegistered = true;
70
+ }
71
+ unregisterTool() {
72
+ if (!this.isRegistered)
73
+ return;
74
+ const tool = this.getTool();
75
+ if (tool.name) {
76
+ // Remove the tool
77
+ this.copilotkit.copilotkit.removeTool(tool.name);
78
+ // Remove the render if it exists
79
+ const currentRenders = this.copilotkit.currentRenderToolCalls();
80
+ const filtered = currentRenders.filter((r) => r.name !== tool.name);
81
+ if (filtered.length !== currentRenders.length) {
82
+ this.copilotkit.setCurrentRenderToolCalls(filtered);
83
+ }
84
+ }
85
+ this.isRegistered = false;
86
+ }
87
+ getTool() {
88
+ // If full tool object is provided, use it
89
+ if (this.tool) {
90
+ return this.tool;
91
+ }
92
+ // Otherwise, construct from individual inputs
93
+ return {
94
+ name: this.name,
95
+ description: this.description,
96
+ parameters: this.parameters,
97
+ handler: this.handler,
98
+ render: this.render,
99
+ followUp: this.followUp,
100
+ };
101
+ }
102
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitFrontendToolDirective, deps: [{ token: CopilotKitService }], target: i0.ɵɵFactoryTarget.Directive });
103
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitFrontendToolDirective, isStandalone: true, selector: "[copilotkitFrontendTool]", inputs: { name: "name", description: "description", parameters: "parameters", handler: "handler", render: "render", followUp: "followUp", tool: ["copilotkitFrontendTool", "tool"] }, usesOnChanges: true, ngImport: i0 });
104
+ }
105
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitFrontendToolDirective, decorators: [{
106
+ type: Directive,
107
+ args: [{
108
+ selector: "[copilotkitFrontendTool]",
109
+ standalone: true,
110
+ }]
111
+ }], ctorParameters: () => [{ type: i1.CopilotKitService, decorators: [{
112
+ type: Inject,
113
+ args: [CopilotKitService]
114
+ }] }], propDecorators: { name: [{
115
+ type: Input
116
+ }], description: [{
117
+ type: Input
118
+ }], parameters: [{
119
+ type: Input
120
+ }], handler: [{
121
+ type: Input
122
+ }], render: [{
123
+ type: Input
124
+ }], followUp: [{
125
+ type: Input
126
+ }], tool: [{
127
+ type: Input,
128
+ args: ["copilotkitFrontendTool"]
129
+ }] } });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1mcm9udGVuZC10b29sLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kaXJlY3RpdmVzL2NvcGlsb3RraXQtZnJvbnRlbmQtdG9vbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBT0wsU0FBUyxFQUNULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDOzs7QUFNeEIsTUFBTSxPQUFPLCtCQUErQjtJQVFJO0lBSHRDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFN0IsWUFDOEMsVUFBNkI7UUFBN0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7SUFDeEUsQ0FBQztJQUVLLElBQUksQ0FBVTtJQUNkLFdBQVcsQ0FBVTtJQUNyQixVQUFVLENBQWtCO0lBQzVCLE9BQU8sQ0FBNkI7SUFDcEMsTUFBTSxDQUFnQztJQUN0QyxRQUFRLENBQVc7SUFFNUIseUNBQXlDO0lBQ1IsSUFBSSxDQUEwQjtJQUUvRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBdUI7UUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsSUFB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RUQsOENBQThDO1FBQzlDLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUM7SUFDSixDQUFDO3dHQXZIVSwrQkFBK0Isa0JBUWhDLGlCQUFpQjs0RkFSaEIsK0JBQStCOzs0RkFBL0IsK0JBQStCO2tCQUozQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBU0ksTUFBTTsyQkFBQyxpQkFBaUI7eUNBR2xCLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUcyQixJQUFJO3NCQUFwQyxLQUFLO3VCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBpc0Rldk1vZGUsXG4gIEluamVjdCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFuZ3VsYXJGcm9udGVuZFRvb2wsXG4gIEFuZ3VsYXJUb29sQ2FsbFJlbmRlcixcbiAgVG9vbENhbGxSZW5kZXIsXG59IGZyb20gXCIuLi9jb3JlL2NvcGlsb3RraXQudHlwZXNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbY29waWxvdGtpdEZyb250ZW5kVG9vbF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdEZyb250ZW5kVG9vbERpcmVjdGl2ZTxcbiAgICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gID5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XG57XG4gIHByaXZhdGUgaXNSZWdpc3RlcmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChDb3BpbG90S2l0U2VydmljZSkgcHJpdmF0ZSByZWFkb25seSBjb3BpbG90a2l0OiBDb3BpbG90S2l0U2VydmljZVxuICApIHt9XG5cbiAgQElucHV0KCkgbmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhcmFtZXRlcnM/OiB6LlpvZFNjaGVtYTxUPjtcbiAgQElucHV0KCkgaGFuZGxlcj86IChhcmdzOiBUKSA9PiBQcm9taXNlPGFueT47XG4gIEBJbnB1dCgpIHJlbmRlcj86IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGZvbGxvd1VwPzogYm9vbGVhbjtcblxuICAvLyBBbHRlcm5hdGl2ZTogQWNjZXB0IGEgZnVsbCB0b29sIG9iamVjdFxuICBASW5wdXQoXCJjb3BpbG90a2l0RnJvbnRlbmRUb29sXCIpIHRvb2w/OiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJUb29sKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhfY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUmVnaXN0ZXJlZCkge1xuICAgICAgLy8gUmUtcmVnaXN0ZXIgdGhlIHRvb2wgaWYgYW55IHByb3BlcnRpZXMgY2hhbmdlXG4gICAgICB0aGlzLnVucmVnaXN0ZXJUb29sKCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVG9vbCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5yZWdpc3RlclRvb2woKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJUb29sKCk6IHZvaWQge1xuICAgIGNvbnN0IHRvb2wgPSB0aGlzLmdldFRvb2woKTtcblxuICAgIGlmICghdG9vbC5uYW1lKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdDb3BpbG90S2l0RnJvbnRlbmRUb29sRGlyZWN0aXZlOiBcIm5hbWVcIiBpcyByZXF1aXJlZC4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHByb3ZpZGUgYSBuYW1lIHZpYSBbbmFtZV09XCJ0b29sTmFtZVwiIG9yICcgK1xuICAgICAgICAgICAgXCJbY29waWxvdGtpdEZyb250ZW5kVG9vbF09XFxcInsgbmFtZTogJ3Rvb2xOYW1lJywgLi4uIH1cXFwiXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjsgLy8gRG9uJ3QgcmVnaXN0ZXIgaWYgbm8gbmFtZVxuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIHRoZSB0b29sIHdpdGggQ29waWxvdEtpdFxuICAgIHRoaXMuY29waWxvdGtpdC5jb3BpbG90a2l0LmFkZFRvb2wodG9vbCk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgcmVuZGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRvb2wucmVuZGVyKSB7XG4gICAgICBjb25zdCBjdXJyZW50UmVuZGVycyA9IHRoaXMuY29waWxvdGtpdC5jdXJyZW50UmVuZGVyVG9vbENhbGxzKCk7XG4gICAgICBjb25zdCByZW5kZXJFbnRyeTogQW5ndWxhclRvb2xDYWxsUmVuZGVyID0ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyB8fCB6Lm9iamVjdCh7fSksXG4gICAgICAgIHJlbmRlcjogdG9vbC5yZW5kZXIsXG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlXG4gICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY3VycmVudFJlbmRlcnMuZmluZEluZGV4KChyOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPikgPT4gci5uYW1lID09PSB0b29sLm5hbWUpO1xuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbQ29waWxvdEtpdF0gVG9vbCBcIiR7dG9vbC5uYW1lfVwiIGFscmVhZHkgaGFzIGEgcmVuZGVyLiBgICtcbiAgICAgICAgICAgICAgYFRoZSBwcmV2aW91cyByZW5kZXIgd2lsbCBiZSByZXBsYWNlZC4gYCArXG4gICAgICAgICAgICAgIGBUaGlzIG1heSBpbmRpY2F0ZSBhIGR1cGxpY2F0ZSB0b29sIHJlZ2lzdHJhdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVkID0gWy4uLmN1cnJlbnRSZW5kZXJzXTtcbiAgICAgICAgdXBkYXRlZFtleGlzdGluZ0luZGV4XSA9IHJlbmRlckVudHJ5O1xuICAgICAgICB0aGlzLmNvcGlsb3RraXQuc2V0Q3VycmVudFJlbmRlclRvb2xDYWxscyh1cGRhdGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29waWxvdGtpdC5zZXRDdXJyZW50UmVuZGVyVG9vbENhbGxzKFsuLi5jdXJyZW50UmVuZGVycywgcmVuZGVyRW50cnldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzUmVnaXN0ZXJlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHVucmVnaXN0ZXJUb29sKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JlZ2lzdGVyZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHRvb2wgPSB0aGlzLmdldFRvb2woKTtcblxuICAgIGlmICh0b29sLm5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgdG9vbFxuICAgICAgdGhpcy5jb3BpbG90a2l0LmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sLm5hbWUpO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIHJlbmRlciBpZiBpdCBleGlzdHNcbiAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJzID0gdGhpcy5jb3BpbG90a2l0LmN1cnJlbnRSZW5kZXJUb29sQ2FsbHMoKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gY3VycmVudFJlbmRlcnMuZmlsdGVyKChyOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPikgPT4gci5uYW1lICE9PSB0b29sLm5hbWUpO1xuICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCAhPT0gY3VycmVudFJlbmRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuY29waWxvdGtpdC5zZXRDdXJyZW50UmVuZGVyVG9vbENhbGxzKGZpbHRlcmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb29sKCk6IEFuZ3VsYXJGcm9udGVuZFRvb2w8VD4ge1xuICAgIC8vIElmIGZ1bGwgdG9vbCBvYmplY3QgaXMgcHJvdmlkZWQsIHVzZSBpdFxuICAgIGlmICh0aGlzLnRvb2wpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvb2w7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBjb25zdHJ1Y3QgZnJvbSBpbmRpdmlkdWFsIGlucHV0c1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyxcbiAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlcixcbiAgICAgIHJlbmRlcjogdGhpcy5yZW5kZXIsXG4gICAgICBmb2xsb3dVcDogdGhpcy5mb2xsb3dVcCxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,266 @@
1
+ import { Directive, Input, Output, EventEmitter, signal, isDevMode, Inject, } from "@angular/core";
2
+ import { CopilotKitService } from "../core/copilotkit.service";
3
+ import { ToolCallStatus } from "../core/copilotkit.types";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../core/copilotkit.service";
6
+ /**
7
+ * Directive for declaratively creating human-in-the-loop tools.
8
+ * Provides reactive outputs for status changes and response events.
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <!-- Basic usage -->
13
+ * <div copilotkitHumanInTheLoop
14
+ * [name]="'requireApproval'"
15
+ * [description]="'Requires user approval'"
16
+ * [args]="argsSchema"
17
+ * [render]="approvalComponent"
18
+ * (statusChange)="onStatusChange($event)"
19
+ * (responseProvided)="onResponse($event)">
20
+ * </div>
21
+ *
22
+ * <!-- With template -->
23
+ * <div copilotkitHumanInTheLoop
24
+ * [name]="'requireApproval'"
25
+ * [description]="'Requires user approval'"
26
+ * [args]="argsSchema"
27
+ * [render]="approvalTemplate"
28
+ * [(status)]="approvalStatus">
29
+ * </div>
30
+ *
31
+ * <ng-template #approvalTemplate let-props>
32
+ * <div *ngIf="props.status === 'executing'">
33
+ * <p>{{ props.args.action }}</p>
34
+ * <button (click)="props.respond('approved')">Approve</button>
35
+ * <button (click)="props.respond('rejected')">Reject</button>
36
+ * </div>
37
+ * </ng-template>
38
+ * ```
39
+ */
40
+ export class CopilotKitHumanInTheLoopDirective {
41
+ copilotkit;
42
+ toolId;
43
+ statusSignal = signal(ToolCallStatus.InProgress);
44
+ resolvePromise = null;
45
+ _status = ToolCallStatus.InProgress;
46
+ constructor(copilotkit) {
47
+ this.copilotkit = copilotkit;
48
+ }
49
+ /**
50
+ * The name of the human-in-the-loop tool.
51
+ */
52
+ name;
53
+ /**
54
+ * Description of what the tool does.
55
+ */
56
+ description;
57
+ /**
58
+ * Zod schema for the tool parameters.
59
+ */
60
+ parameters;
61
+ /**
62
+ * Component class or template to render for user interaction.
63
+ */
64
+ render;
65
+ /**
66
+ * Whether the tool should be registered (default: true).
67
+ */
68
+ enabled = true;
69
+ /**
70
+ * Alternative input using the directive selector.
71
+ * Allows: [copilotkitHumanInTheLoop]="config"
72
+ */
73
+ set config(value) {
74
+ if (value) {
75
+ if (value.name)
76
+ this.name = value.name;
77
+ if (value.description)
78
+ this.description = value.description;
79
+ if ("parameters" in value && value.parameters)
80
+ this.parameters = value.parameters;
81
+ if ("render" in value && value.render)
82
+ this.render = value.render;
83
+ }
84
+ }
85
+ /**
86
+ * Emits when the status changes.
87
+ */
88
+ statusChange = new EventEmitter();
89
+ /**
90
+ * Two-way binding for status.
91
+ */
92
+ get status() {
93
+ return this._status;
94
+ }
95
+ set status(value) {
96
+ // Input setter for two-way binding (though typically read-only)
97
+ this._status = value;
98
+ }
99
+ /**
100
+ * Emits when a response is provided by the user.
101
+ */
102
+ responseProvided = new EventEmitter();
103
+ /**
104
+ * Emits when the tool execution starts.
105
+ */
106
+ executionStarted = new EventEmitter();
107
+ /**
108
+ * Emits when the tool execution completes.
109
+ */
110
+ executionCompleted = new EventEmitter();
111
+ ngOnInit() {
112
+ if (this.enabled) {
113
+ this.registerTool();
114
+ }
115
+ }
116
+ ngOnChanges(changes) {
117
+ const relevantChanges = changes["name"] ||
118
+ changes["description"] ||
119
+ changes["args"] ||
120
+ changes["render"] ||
121
+ changes["enabled"];
122
+ if (relevantChanges && !relevantChanges.firstChange) {
123
+ // Re-register the tool with new configuration
124
+ this.unregisterTool();
125
+ if (this.enabled) {
126
+ this.registerTool();
127
+ }
128
+ }
129
+ }
130
+ ngOnDestroy() {
131
+ this.unregisterTool();
132
+ }
133
+ /**
134
+ * Programmatically trigger a response.
135
+ * Useful when the directive is used as a controller.
136
+ */
137
+ respond(result) {
138
+ this.handleResponse(result);
139
+ }
140
+ registerTool() {
141
+ if (!this.name || !this.description || !this.parameters || !this.render) {
142
+ if (isDevMode()) {
143
+ throw new Error("CopilotKitHumanInTheLoopDirective: Missing required inputs. " +
144
+ "Required: name, description, parameters, and render.");
145
+ }
146
+ return;
147
+ }
148
+ // Create handler that returns a Promise
149
+ const handler = async (args) => {
150
+ return new Promise((resolve) => {
151
+ this.updateStatus(ToolCallStatus.Executing);
152
+ this.resolvePromise = resolve;
153
+ this.executionStarted.emit(args);
154
+ });
155
+ };
156
+ // Create the frontend tool with enhanced render
157
+ const frontendTool = {
158
+ name: this.name,
159
+ description: this.description,
160
+ parameters: this.parameters,
161
+ handler,
162
+ render: this.render, // Will be enhanced by the render component
163
+ };
164
+ // Add the tool (returns void, so we use the tool name as ID)
165
+ this.copilotkit.copilotkit.addTool(frontendTool);
166
+ this.toolId = this.name;
167
+ // Register the render with respond capability
168
+ this.copilotkit.registerToolRender(this.name, {
169
+ name: this.name,
170
+ args: this.parameters,
171
+ render: this.createEnhancedRender(),
172
+ });
173
+ }
174
+ unregisterTool() {
175
+ if (this.toolId) {
176
+ this.copilotkit.copilotkit.removeTool(this.toolId);
177
+ this.copilotkit.unregisterToolRender(this.name);
178
+ this.toolId = undefined;
179
+ }
180
+ }
181
+ createEnhancedRender() {
182
+ // If it's a template, we need to wrap it with our respond function
183
+ // This is handled by returning a special marker that the render component
184
+ // will recognize and enhance with the respond function
185
+ // Store reference to this directive instance for the render component
186
+ this.render.__humanInTheLoopDirective = this;
187
+ this.render.__humanInTheLoopStatus = this.statusSignal;
188
+ return this.render;
189
+ }
190
+ handleResponse(result) {
191
+ if (this.resolvePromise) {
192
+ this.resolvePromise(result);
193
+ this.updateStatus(ToolCallStatus.Complete);
194
+ this.resolvePromise = null;
195
+ this.responseProvided.emit(result);
196
+ this.executionCompleted.emit(result);
197
+ }
198
+ }
199
+ updateStatus(status) {
200
+ this._status = status;
201
+ this.statusSignal.set(status);
202
+ this.statusChange.emit(status);
203
+ }
204
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitHumanInTheLoopDirective, deps: [{ token: CopilotKitService }], target: i0.ɵɵFactoryTarget.Directive });
205
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitHumanInTheLoopDirective, isStandalone: true, selector: "[copilotkitHumanInTheLoop]", inputs: { name: "name", description: "description", parameters: "parameters", render: "render", enabled: "enabled", config: ["copilotkitHumanInTheLoop", "config"], status: "status" }, outputs: { statusChange: "statusChange", responseProvided: "responseProvided", executionStarted: "executionStarted", executionCompleted: "executionCompleted" }, usesOnChanges: true, ngImport: i0 });
206
+ }
207
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitHumanInTheLoopDirective, decorators: [{
208
+ type: Directive,
209
+ args: [{
210
+ selector: "[copilotkitHumanInTheLoop]",
211
+ standalone: true,
212
+ }]
213
+ }], ctorParameters: () => [{ type: i1.CopilotKitService, decorators: [{
214
+ type: Inject,
215
+ args: [CopilotKitService]
216
+ }] }], propDecorators: { name: [{
217
+ type: Input
218
+ }], description: [{
219
+ type: Input
220
+ }], parameters: [{
221
+ type: Input
222
+ }], render: [{
223
+ type: Input
224
+ }], enabled: [{
225
+ type: Input
226
+ }], config: [{
227
+ type: Input,
228
+ args: ["copilotkitHumanInTheLoop"]
229
+ }], statusChange: [{
230
+ type: Output
231
+ }], status: [{
232
+ type: Input
233
+ }], responseProvided: [{
234
+ type: Output
235
+ }], executionStarted: [{
236
+ type: Output
237
+ }], executionCompleted: [{
238
+ type: Output
239
+ }] } });
240
+ /**
241
+ * Helper directive to provide respond function in templates.
242
+ * This would be used internally by the tool render component.
243
+ *
244
+ * @internal
245
+ */
246
+ export class CopilotKitHumanInTheLoopRespondDirective {
247
+ copilotkitHumanInTheLoopRespond;
248
+ /**
249
+ * Convenience method for templates to call respond.
250
+ */
251
+ respond(result) {
252
+ this.copilotkitHumanInTheLoopRespond?.(result);
253
+ }
254
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitHumanInTheLoopRespondDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
255
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotKitHumanInTheLoopRespondDirective, isStandalone: true, selector: "[copilotkitHumanInTheLoopRespond]", inputs: { copilotkitHumanInTheLoopRespond: "copilotkitHumanInTheLoopRespond" }, ngImport: i0 });
256
+ }
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitHumanInTheLoopRespondDirective, decorators: [{
258
+ type: Directive,
259
+ args: [{
260
+ selector: "[copilotkitHumanInTheLoopRespond]",
261
+ standalone: true,
262
+ }]
263
+ }], propDecorators: { copilotkitHumanInTheLoopRespond: [{
264
+ type: Input
265
+ }] } });
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC1odW1hbi1pbi10aGUtbG9vcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGlyZWN0aXZlcy9jb3BpbG90a2l0LWh1bWFuLWluLXRoZS1sb29wLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQU9aLE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTS9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBRzFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFLSCxNQUFNLE9BQU8saUNBQWlDO0lBV0U7SUFOdEMsTUFBTSxDQUFVO0lBQ2hCLFlBQVksR0FBRyxNQUFNLENBQWlCLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxjQUFjLEdBQXVDLElBQUksQ0FBQztJQUMxRCxPQUFPLEdBQW1CLGNBQWMsQ0FBQyxVQUFVLENBQUM7SUFFNUQsWUFDOEMsVUFBNkI7UUFBN0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7SUFDeEUsQ0FBQztJQUVKOztPQUVHO0lBQ00sSUFBSSxDQUFVO0lBRXZCOztPQUVHO0lBQ00sV0FBVyxDQUFVO0lBRTlCOztPQUVHO0lBQ00sVUFBVSxDQUFrQjtJQUVyQzs7T0FFRztJQUNNLE1BQU0sQ0FBbUQ7SUFFbEU7O09BRUc7SUFDTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRXhCOzs7T0FHRztJQUNILElBQ0ksTUFBTSxDQUFDLEtBQW9EO1FBQzdELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLEtBQUssQ0FBQyxJQUFJO2dCQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxD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QUtHLGtCQUFrQjtzQkFBM0IsTUFBTTs7QUFtSFQ7Ozs7O0dBS0c7QUFLSCxNQUFNLE9BQU8sd0NBQXdDO0lBQzFDLCtCQUErQixDQUFzQztJQUU5RTs7T0FFRztJQUNILE9BQU8sQ0FBQyxNQUFlO1FBQ3JCLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7d0dBUlUsd0NBQXdDOzRGQUF4Qyx3Q0FBd0M7OzRGQUF4Qyx3Q0FBd0M7a0JBSnBELFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1DQUFtQztvQkFDN0MsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUVVLCtCQUErQjtzQkFBdkMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgc2lnbmFsLFxuICBpc0Rldk1vZGUsXG4gIEluamVjdCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFuZ3VsYXJIdW1hbkluVGhlTG9vcCxcbiAgSHVtYW5JblRoZUxvb3BQcm9wcyxcbiAgQW5ndWxhckZyb250ZW5kVG9vbCxcbn0gZnJvbSBcIi4uL2NvcmUvY29waWxvdGtpdC50eXBlc1wiO1xuaW1wb3J0IHsgVG9vbENhbGxTdGF0dXMgfSBmcm9tIFwiLi4vY29yZS9jb3BpbG90a2l0LnR5cGVzXCI7XG5pbXBvcnQgKiBhcyB6IGZyb20gXCJ6b2RcIjtcblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGRlY2xhcmF0aXZlbHkgY3JlYXRpbmcgaHVtYW4taW4tdGhlLWxvb3AgdG9vbHMuXG4gKiBQcm92aWRlcyByZWFjdGl2ZSBvdXRwdXRzIGZvciBzdGF0dXMgY2hhbmdlcyBhbmQgcmVzcG9uc2UgZXZlbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIEJhc2ljIHVzYWdlIC0tPlxuICogPGRpdiBjb3BpbG90a2l0SHVtYW5JblRoZUxvb3BcbiAqICAgICAgW25hbWVdPVwiJ3JlcXVpcmVBcHByb3ZhbCdcIlxuICogICAgICBbZGVzY3JpcHRpb25dPVwiJ1JlcXVpcmVzIHVzZXIgYXBwcm92YWwnXCJcbiAqICAgICAgW2FyZ3NdPVwiYXJnc1NjaGVtYVwiXG4gKiAgICAgIFtyZW5kZXJdPVwiYXBwcm92YWxDb21wb25lbnRcIlxuICogICAgICAoc3RhdHVzQ2hhbmdlKT1cIm9uU3RhdHVzQ2hhbmdlKCRldmVudClcIlxuICogICAgICAocmVzcG9uc2VQcm92aWRlZCk9XCJvblJlc3BvbnNlKCRldmVudClcIj5cbiAqIDwvZGl2PlxuICpcbiAqIDwhLS0gV2l0aCB0ZW1wbGF0ZSAtLT5cbiAqIDxkaXYgY29waWxvdGtpdEh1bWFuSW5UaGVMb29wXG4gKiAgICAgIFtuYW1lXT1cIidyZXF1aXJlQXBwcm92YWwnXCJcbiAqICAgICAgW2Rlc2NyaXB0aW9uXT1cIidSZXF1aXJlcyB1c2VyIGFwcHJvdmFsJ1wiXG4gKiAgICAgIFthcmdzXT1cImFyZ3NTY2hlbWFcIlxuICogICAgICBbcmVuZGVyXT1cImFwcHJvdmFsVGVtcGxhdGVcIlxuICogICAgICBbKHN0YXR1cyldPVwiYXBwcm92YWxTdGF0dXNcIj5cbiAqIDwvZGl2PlxuICpcbiAqIDxuZy10ZW1wbGF0ZSAjYXBwcm92YWxUZW1wbGF0ZSBsZXQtcHJvcHM+XG4gKiAgIDxkaXYgKm5nSWY9XCJwcm9wcy5zdGF0dXMgPT09ICdleGVjdXRpbmcnXCI+XG4gKiAgICAgPHA+e3sgcHJvcHMuYXJncy5hY3Rpb24gfX08L3A+XG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwicHJvcHMucmVzcG9uZCgnYXBwcm92ZWQnKVwiPkFwcHJvdmU8L2J1dHRvbj5cbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJwcm9wcy5yZXNwb25kKCdyZWplY3RlZCcpXCI+UmVqZWN0PC9idXR0b24+XG4gKiAgIDwvZGl2PlxuICogPC9uZy10ZW1wbGF0ZT5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2NvcGlsb3RraXRIdW1hbkluVGhlTG9vcF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdEh1bWFuSW5UaGVMb29wRGlyZWN0aXZlPFxuICAgIFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgPlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSB0b29sSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgcHJpdmF0ZSByZXNvbHZlUHJvbWlzZTogKChyZXN1bHQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3N0YXR1czogVG9vbENhbGxTdGF0dXMgPSBUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQ29waWxvdEtpdFNlcnZpY2UpIHByaXZhdGUgcmVhZG9ubHkgY29waWxvdGtpdDogQ29waWxvdEtpdFNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaHVtYW4taW4tdGhlLWxvb3AgdG9vbC5cbiAgICovXG4gIEBJbnB1dCgpIG5hbWUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIHRvb2wgZG9lcy5cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBab2Qgc2NoZW1hIGZvciB0aGUgdG9vbCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVycyE6IHouWm9kU2NoZW1hPFQ+O1xuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgY2xhc3Mgb3IgdGVtcGxhdGUgdG8gcmVuZGVyIGZvciB1c2VyIGludGVyYWN0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgcmVuZGVyITogVHlwZTxhbnk+IHwgVGVtcGxhdGVSZWY8SHVtYW5JblRoZUxvb3BQcm9wczxUPj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHRvb2wgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgKGRlZmF1bHQ6IHRydWUpLlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlZCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEFsdGVybmF0aXZlIGlucHV0IHVzaW5nIHRoZSBkaXJlY3RpdmUgc2VsZWN0b3IuXG4gICAqIEFsbG93czogW2NvcGlsb3RraXRIdW1hbkluVGhlTG9vcF09XCJjb25maWdcIlxuICAgKi9cbiAgQElucHV0KFwiY29waWxvdGtpdEh1bWFuSW5UaGVMb29wXCIpXG4gIHNldCBjb25maWcodmFsdWU6IFBhcnRpYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlLm5hbWUpIHRoaXMubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuZGVzY3JpcHRpb24pIHRoaXMuZGVzY3JpcHRpb24gPSB2YWx1ZS5kZXNjcmlwdGlvbjtcbiAgICAgIGlmIChcInBhcmFtZXRlcnNcIiBpbiB2YWx1ZSAmJiB2YWx1ZS5wYXJhbWV0ZXJzKVxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB2YWx1ZS5wYXJhbWV0ZXJzIGFzIHouWm9kU2NoZW1hPFQ+O1xuICAgICAgaWYgKFwicmVuZGVyXCIgaW4gdmFsdWUgJiYgdmFsdWUucmVuZGVyKSB0aGlzLnJlbmRlciA9IHZhbHVlLnJlbmRlcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgc3RhdHVzIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgc3RhdHVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUb29sQ2FsbFN0YXR1cz4oKTtcblxuICAvKipcbiAgICogVHdvLXdheSBiaW5kaW5nIGZvciBzdGF0dXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc3RhdHVzKCk6IFRvb2xDYWxsU3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICB9XG4gIHNldCBzdGF0dXModmFsdWU6IFRvb2xDYWxsU3RhdHVzKSB7XG4gICAgLy8gSW5wdXQgc2V0dGVyIGZvciB0d28td2F5IGJpbmRpbmcgKHRob3VnaCB0eXBpY2FsbHkgcmVhZC1vbmx5KVxuICAgIHRoaXMuX3N0YXR1cyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSByZXNwb25zZSBpcyBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIEBPdXRwdXQoKSByZXNwb25zZVByb3ZpZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB0b29sIGV4ZWN1dGlvbiBzdGFydHMuXG4gICAqL1xuICBAT3V0cHV0KCkgZXhlY3V0aW9uU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB0b29sIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgZXhlY3V0aW9uQ29tcGxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJUb29sKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHJlbGV2YW50Q2hhbmdlcyA9XG4gICAgICBjaGFuZ2VzW1wibmFtZVwiXSB8fFxuICAgICAgY2hhbmdlc1tcImRlc2NyaXB0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiYXJnc1wiXSB8fFxuICAgICAgY2hhbmdlc1tcInJlbmRlclwiXSB8fFxuICAgICAgY2hhbmdlc1tcImVuYWJsZWRcIl07XG5cbiAgICBpZiAocmVsZXZhbnRDaGFuZ2VzICYmICFyZWxldmFudENoYW5nZXMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIC8vIFJlLXJlZ2lzdGVyIHRoZSB0b29sIHdpdGggbmV3IGNvbmZpZ3VyYXRpb25cbiAgICAgIHRoaXMudW5yZWdpc3RlclRvb2woKTtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclRvb2woKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJUb29sKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSB0cmlnZ2VyIGEgcmVzcG9uc2UuXG4gICAqIFVzZWZ1bCB3aGVuIHRoZSBkaXJlY3RpdmUgaXMgdXNlZCBhcyBhIGNvbnRyb2xsZXIuXG4gICAqL1xuICByZXNwb25kKHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJUb29sKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uYW1lIHx8ICF0aGlzLmRlc2NyaXB0aW9uIHx8ICF0aGlzLnBhcmFtZXRlcnMgfHwgIXRoaXMucmVuZGVyKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ29waWxvdEtpdEh1bWFuSW5UaGVMb29wRGlyZWN0aXZlOiBNaXNzaW5nIHJlcXVpcmVkIGlucHV0cy4gXCIgK1xuICAgICAgICAgICAgXCJSZXF1aXJlZDogbmFtZSwgZGVzY3JpcHRpb24sIHBhcmFtZXRlcnMsIGFuZCByZW5kZXIuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaGFuZGxlciB0aGF0IHJldHVybnMgYSBQcm9taXNlXG4gICAgY29uc3QgaGFuZGxlciA9IGFzeW5jIChhcmdzOiBUKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuZXhlY3V0aW9uU3RhcnRlZC5lbWl0KGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSB0aGUgZnJvbnRlbmQgdG9vbCB3aXRoIGVuaGFuY2VkIHJlbmRlclxuICAgIGNvbnN0IGZyb250ZW5kVG9vbDogQW5ndWxhckZyb250ZW5kVG9vbDxUPiA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzLFxuICAgICAgaGFuZGxlcixcbiAgICAgIHJlbmRlcjogdGhpcy5yZW5kZXIsIC8vIFdpbGwgYmUgZW5oYW5jZWQgYnkgdGhlIHJlbmRlciBjb21wb25lbnRcbiAgICB9O1xuXG4gICAgLy8gQWRkIHRoZSB0b29sIChyZXR1cm5zIHZvaWQsIHNvIHdlIHVzZSB0aGUgdG9vbCBuYW1lIGFzIElEKVxuICAgIHRoaXMuY29waWxvdGtpdC5jb3BpbG90a2l0LmFkZFRvb2woZnJvbnRlbmRUb29sKTtcbiAgICB0aGlzLnRvb2xJZCA9IHRoaXMubmFtZTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSByZW5kZXIgd2l0aCByZXNwb25kIGNhcGFiaWxpdHlcbiAgICB0aGlzLmNvcGlsb3RraXQucmVnaXN0ZXJUb29sUmVuZGVyKHRoaXMubmFtZSwge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgYXJnczogdGhpcy5wYXJhbWV0ZXJzLFxuICAgICAgcmVuZGVyOiB0aGlzLmNyZWF0ZUVuaGFuY2VkUmVuZGVyKCksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVucmVnaXN0ZXJUb29sKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvb2xJZCkge1xuICAgICAgdGhpcy5jb3BpbG90a2l0LmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0aGlzLnRvb2xJZCk7XG4gICAgICB0aGlzLmNvcGlsb3RraXQudW5yZWdpc3RlclRvb2xSZW5kZXIodGhpcy5uYW1lKTtcbiAgICAgIHRoaXMudG9vbElkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRW5oYW5jZWRSZW5kZXIoKTogVHlwZTxhbnk+IHwgVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgLy8gSWYgaXQncyBhIHRlbXBsYXRlLCB3ZSBuZWVkIHRvIHdyYXAgaXQgd2l0aCBvdXIgcmVzcG9uZCBmdW5jdGlvblxuICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSByZXR1cm5pbmcgYSBzcGVjaWFsIG1hcmtlciB0aGF0IHRoZSByZW5kZXIgY29tcG9uZW50XG4gICAgLy8gd2lsbCByZWNvZ25pemUgYW5kIGVuaGFuY2Ugd2l0aCB0aGUgcmVzcG9uZCBmdW5jdGlvblxuXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIHRoaXMgZGlyZWN0aXZlIGluc3RhbmNlIGZvciB0aGUgcmVuZGVyIGNvbXBvbmVudFxuICAgICh0aGlzLnJlbmRlciBhcyBhbnkpLl9faHVtYW5JblRoZUxvb3BEaXJlY3RpdmUgPSB0aGlzO1xuICAgICh0aGlzLnJlbmRlciBhcyBhbnkpLl9faHVtYW5JblRoZUxvb3BTdGF0dXMgPSB0aGlzLnN0YXR1c1NpZ25hbDtcblxuICAgIHJldHVybiB0aGlzLnJlbmRlcjtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVzcG9uc2UocmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2ZVByb21pc2UpIHtcbiAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UocmVzdWx0KTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKFRvb2xDYWxsU3RhdHVzLkNvbXBsZXRlKTtcbiAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5yZXNwb25zZVByb3ZpZGVkLmVtaXQocmVzdWx0KTtcbiAgICAgIHRoaXMuZXhlY3V0aW9uQ29tcGxldGVkLmVtaXQocmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1cyhzdGF0dXM6IFRvb2xDYWxsU3RhdHVzKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzU2lnbmFsLnNldChzdGF0dXMpO1xuICAgIHRoaXMuc3RhdHVzQ2hhbmdlLmVtaXQoc3RhdHVzKTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBkaXJlY3RpdmUgdG8gcHJvdmlkZSByZXNwb25kIGZ1bmN0aW9uIGluIHRlbXBsYXRlcy5cbiAqIFRoaXMgd291bGQgYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSB0b29sIHJlbmRlciBjb21wb25lbnQuXG4gKlxuICogQGludGVybmFsXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbY29waWxvdGtpdEh1bWFuSW5UaGVMb29wUmVzcG9uZF1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdEtpdEh1bWFuSW5UaGVMb29wUmVzcG9uZERpcmVjdGl2ZSB7XG4gIEBJbnB1dCgpIGNvcGlsb3RraXRIdW1hbkluVGhlTG9vcFJlc3BvbmQ/OiAocmVzdWx0OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHRlbXBsYXRlcyB0byBjYWxsIHJlc3BvbmQuXG4gICAqL1xuICByZXNwb25kKHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuY29waWxvdGtpdEh1bWFuSW5UaGVMb29wUmVzcG9uZD8uKHJlc3VsdCk7XG4gIH1cbn1cbiJdfQ==