@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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzc2lzdGFudE1lc3NhZ2UgfSBmcm9tICdAYWctdWkvY2xpZW50JztcblxuLy8gQ29udGV4dCBpbnRlcmZhY2VzIGZvciBzbG90c1xuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRNZXNzYWdlTWFya2Rvd25SZW5kZXJlckNvbnRleHQge1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TWVzc2FnZVRvb2xiYXJDb250ZXh0IHtcbiAgY2hpbGRyZW4/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TWVzc2FnZUNvcHlCdXR0b25Db250ZXh0IHtcbiAgY29udGVudD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHVtYnNVcEJ1dHRvbkNvbnRleHQge1xuICAvLyBFbXB0eSBjb250ZXh0IC0gY2xpY2sgaGFuZGxlZCB2aWEgb3V0cHV0cyBtYXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHVtYnNEb3duQnV0dG9uQ29udGV4dCB7XG4gIC8vIEVtcHR5IGNvbnRleHQgLSBjbGljayBoYW5kbGVkIHZpYSBvdXRwdXRzIG1hcFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRBbG91ZEJ1dHRvbkNvbnRleHQge1xuICAvLyBFbXB0eSBjb250ZXh0IC0gY2xpY2sgaGFuZGxlZCB2aWEgb3V0cHV0cyBtYXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdlbmVyYXRlQnV0dG9uQ29udGV4dCB7XG4gIC8vIEVtcHR5IGNvbnRleHQgLSBjbGljayBoYW5kbGVkIHZpYSBvdXRwdXRzIG1hcFxufVxuXG4vLyBFdmVudCBoYW5kbGVyIHByb3BzXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uVGh1bWJzVXBQcm9wcyB7XG4gIG1lc3NhZ2U6IEFzc2lzdGFudE1lc3NhZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlT25UaHVtYnNEb3duUHJvcHMge1xuICBtZXNzYWdlOiBBc3Npc3RhbnRNZXNzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uUmVhZEFsb3VkUHJvcHMge1xuICBtZXNzYWdlOiBBc3Npc3RhbnRNZXNzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uUmVnZW5lcmF0ZVByb3BzIHtcbiAgbWVzc2FnZTogQXNzaXN0YW50TWVzc2FnZTtcbn1cblxuLy8gUmUtZXhwb3J0IGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBBc3Npc3RhbnRNZXNzYWdlIH07Il19
@@ -0,0 +1,202 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, signal, computed, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
2
+ import { AudioRecorderError } from './copilot-chat-input.types';
3
+ import * as i0 from "@angular/core";
4
+ export class CopilotChatAudioRecorderComponent {
5
+ canvasRef;
6
+ set inputClass(val) {
7
+ this.customClass.set(val);
8
+ }
9
+ set inputShowControls(val) {
10
+ this.showControls.set(val ?? false);
11
+ }
12
+ stateChange = new EventEmitter();
13
+ error = new EventEmitter();
14
+ // Signals for state management
15
+ state = signal('idle');
16
+ customClass = signal(undefined);
17
+ showControls = signal(false);
18
+ // Computed values
19
+ computedClass = computed(() => {
20
+ const baseClasses = 'h-11 w-full px-5';
21
+ return `${baseClasses} ${this.customClass() || ''}`;
22
+ });
23
+ statusText = computed(() => {
24
+ switch (this.state()) {
25
+ case 'recording':
26
+ return 'Recording...';
27
+ case 'processing':
28
+ return 'Processing...';
29
+ default:
30
+ return 'Ready';
31
+ }
32
+ });
33
+ // Animation and canvas properties
34
+ animationFrameId;
35
+ ngAfterViewInit() {
36
+ this.startAnimation();
37
+ }
38
+ ngOnDestroy() {
39
+ this.dispose();
40
+ }
41
+ /**
42
+ * Start recording audio
43
+ */
44
+ async start() {
45
+ try {
46
+ if (this.state() === 'recording') {
47
+ return;
48
+ }
49
+ this.setState('recording');
50
+ this.startAnimation();
51
+ // In a real implementation, this would start actual audio recording
52
+ // For now, we just simulate the recording state
53
+ }
54
+ catch (err) {
55
+ const error = new AudioRecorderError(err instanceof Error ? err.message : 'Failed to start recording');
56
+ this.error.emit(error);
57
+ this.setState('idle');
58
+ throw error;
59
+ }
60
+ }
61
+ /**
62
+ * Stop recording audio and return blob
63
+ */
64
+ async stop() {
65
+ try {
66
+ this.setState('idle');
67
+ // Return empty blob - stub implementation
68
+ const emptyBlob = new Blob([], { type: 'audio/webm' });
69
+ return emptyBlob;
70
+ }
71
+ catch (err) {
72
+ const error = new AudioRecorderError(err instanceof Error ? err.message : 'Failed to stop recording');
73
+ this.error.emit(error);
74
+ this.setState('idle');
75
+ throw error;
76
+ }
77
+ }
78
+ /**
79
+ * Get current recorder state
80
+ */
81
+ getState() {
82
+ return this.state();
83
+ }
84
+ /**
85
+ * Dispose of resources
86
+ */
87
+ dispose() {
88
+ this.stopAnimation();
89
+ }
90
+ setState(state) {
91
+ this.state.set(state);
92
+ this.stateChange.emit(state);
93
+ }
94
+ startAnimation() {
95
+ const canvas = this.canvasRef.nativeElement;
96
+ if (!canvas)
97
+ return;
98
+ const ctx = canvas.getContext('2d');
99
+ if (!ctx)
100
+ return;
101
+ const draw = () => {
102
+ const rect = canvas.getBoundingClientRect();
103
+ const dpr = window.devicePixelRatio || 1;
104
+ // Update canvas dimensions if container resized
105
+ if (canvas.width !== rect.width * dpr ||
106
+ canvas.height !== rect.height * dpr) {
107
+ canvas.width = rect.width * dpr;
108
+ canvas.height = rect.height * dpr;
109
+ ctx.scale(dpr, dpr);
110
+ ctx.imageSmoothingEnabled = false;
111
+ }
112
+ // Configuration
113
+ const barWidth = 2;
114
+ const minHeight = 2;
115
+ const maxHeight = 20;
116
+ const gap = 2;
117
+ const numSamples = Math.ceil(rect.width / (barWidth + gap));
118
+ // Get loudness data
119
+ const loudnessData = this.getLoudness(numSamples);
120
+ // Clear canvas
121
+ ctx.clearRect(0, 0, rect.width, rect.height);
122
+ // Get current foreground color
123
+ const computedStyle = getComputedStyle(canvas);
124
+ const currentForeground = computedStyle.color;
125
+ // Draw bars
126
+ ctx.fillStyle = currentForeground;
127
+ const centerY = rect.height / 2;
128
+ for (let i = 0; i < loudnessData.length; i++) {
129
+ const sample = loudnessData[i] ?? 0;
130
+ const barHeight = Math.round(sample * (maxHeight - minHeight) + minHeight);
131
+ const x = Math.round(i * (barWidth + gap));
132
+ const y = Math.round(centerY - barHeight / 2);
133
+ ctx.fillRect(x, y, barWidth, barHeight);
134
+ }
135
+ this.animationFrameId = requestAnimationFrame(draw);
136
+ };
137
+ draw();
138
+ }
139
+ stopAnimation() {
140
+ if (this.animationFrameId) {
141
+ cancelAnimationFrame(this.animationFrameId);
142
+ this.animationFrameId = undefined;
143
+ }
144
+ }
145
+ getLoudness(n) {
146
+ const elapsed = Date.now() / 1000; // Use current timestamp directly
147
+ const samples = [];
148
+ for (let i = 0; i < n; i++) {
149
+ // Create a position that moves from left to right over time
150
+ const position = (i / n) * 10 + elapsed * 0.5; // Scroll speed (slower)
151
+ // Generate waveform using multiple sine waves for realism
152
+ const wave1 = Math.sin(position * 2) * 0.3;
153
+ const wave2 = Math.sin(position * 5 + elapsed) * 0.2;
154
+ const wave3 = Math.sin(position * 0.5 + elapsed * 0.3) * 0.4;
155
+ // Add some randomness for natural variation
156
+ const noise = (Math.random() - 0.5) * 0.1;
157
+ // Combine waves and add envelope for realistic amplitude variation
158
+ const envelope = Math.sin(elapsed * 0.7) * 0.5 + 0.5; // Slow amplitude modulation
159
+ let amplitude = (wave1 + wave2 + wave3 + noise) * envelope;
160
+ // Clamp to 0-1 range
161
+ amplitude = Math.max(0, Math.min(1, amplitude * 0.5 + 0.3));
162
+ samples.push(amplitude);
163
+ }
164
+ return samples;
165
+ }
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAudioRecorderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
167
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAudioRecorderComponent, isStandalone: true, selector: "copilot-chat-audio-recorder", inputs: { inputClass: "inputClass", inputShowControls: "inputShowControls" }, outputs: { stateChange: "stateChange", error: "error" }, host: { properties: { "class.copilot-chat-audio-recorder": "true" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvasRef"], descendants: true, static: true }], ngImport: i0, template: `
168
+ <div [class]="computedClass()">
169
+ <canvas
170
+ #canvasRef
171
+ class="w-full h-full"
172
+ [style.imageRendering]="'pixelated'"
173
+ ></canvas>
174
+ </div>
175
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
176
+ }
177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAudioRecorderComponent, decorators: [{
178
+ type: Component,
179
+ args: [{ selector: 'copilot-chat-audio-recorder', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
180
+ <div [class]="computedClass()">
181
+ <canvas
182
+ #canvasRef
183
+ class="w-full h-full"
184
+ [style.imageRendering]="'pixelated'"
185
+ ></canvas>
186
+ </div>
187
+ `, host: {
188
+ '[class.copilot-chat-audio-recorder]': 'true'
189
+ } }]
190
+ }], propDecorators: { canvasRef: [{
191
+ type: ViewChild,
192
+ args: ['canvasRef', { static: true }]
193
+ }], inputClass: [{
194
+ type: Input
195
+ }], inputShowControls: [{
196
+ type: Input
197
+ }], stateChange: [{
198
+ type: Output
199
+ }], error: [{
200
+ type: Output
201
+ }] } });
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFJVCxNQUFNLEVBQ04sUUFBUSxFQUNSLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQXFCcEYsTUFBTSxPQUFPLGlDQUFpQztJQUNGLFNBQVMsQ0FBaUM7SUFFcEYsSUFBYSxVQUFVLENBQUMsR0FBdUI7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQWEsaUJBQWlCLENBQUMsR0FBd0I7UUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFDckQsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO0lBRXpELCtCQUErQjtJQUMvQixLQUFLLEdBQUcsTUFBTSxDQUFxQixNQUFNLENBQUMsQ0FBQztJQUMzQyxXQUFXLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXRDLGtCQUFrQjtJQUNsQixhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUM1QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztRQUN2QyxPQUFPLEdBQUcs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QUFHLFFBQVEsQ0FBQztZQUUzRCxxQkFBcUI7WUFDckIsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU1RCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO3dHQTVNVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQywyWkFkbEM7Ozs7Ozs7O0dBUVQ7OzRGQU1VLGlDQUFpQztrQkFuQjdDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxZQUMzQjs7Ozs7Ozs7R0FRVCxRQUVLO3dCQUNKLHFDQUFxQyxFQUFFLE1BQU07cUJBQzlDOzhCQUd5QyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTNCLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8saUJBQWlCO3NCQUE3QixLQUFLO2dCQUlJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25EZXN0cm95LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdWRpb1JlY29yZGVyU3RhdGUsIEF1ZGlvUmVjb3JkZXJFcnJvciB9IGZyb20gJy4vY29waWxvdC1jaGF0LWlucHV0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+XG4gICAgICA8Y2FudmFzXG4gICAgICAgICNjYW52YXNSZWZcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgW3N0eWxlLmltYWdlUmVuZGVyaW5nXT1cIidwaXhlbGF0ZWQnXCJcbiAgICAgID48L2NhbnZhcz5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhc1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuICBcbiAgQElucHV0KCkgc2V0IGlucHV0Q2xhc3ModmFsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmN1c3RvbUNsYXNzLnNldCh2YWwpO1xuICB9XG4gIFxuICBASW5wdXQoKSBzZXQgaW5wdXRTaG93Q29udHJvbHModmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zaG93Q29udHJvbHMuc2V0KHZhbCA/PyBmYWxzZSk7XG4gIH1cbiAgXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXVkaW9SZWNvcmRlclN0YXRlPigpO1xuICBAT3V0cHV0KCkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPEF1ZGlvUmVjb3JkZXJFcnJvcj4oKTtcbiAgXG4gIC8vIFNpZ25hbHMgZm9yIHN0YXRlIG1hbmFnZW1lbnRcbiAgc3RhdGUgPSBzaWduYWw8QXVkaW9SZWNvcmRlclN0YXRlPignaWRsZScpO1xuICBjdXN0b21DbGFzcyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHNob3dDb250cm9scyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIFxuICAvLyBDb21wdXRlZCB2YWx1ZXNcbiAgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdoLTExIHctZnVsbCBweC01JztcbiAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9ICR7dGhpcy5jdXN0b21DbGFzcygpIHx8ICcnfWA7XG4gIH0pO1xuICBcbiAgc3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUoKSkge1xuICAgICAgY2FzZSAncmVjb3JkaW5nJzpcbiAgICAgICAgcmV0dXJuICdSZWNvcmRpbmcuLi4nO1xuICAgICAgY2FzZSAncHJvY2Vzc2luZyc6XG4gICAgICAgIHJldHVybiAnUHJvY2Vzc2luZy4uLic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1JlYWR5JztcbiAgICB9XG4gIH0pO1xuICBcbiAgLy8gQW5pbWF0aW9uIGFuZCBjYW52YXMgcHJvcGVydGllc1xuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ/OiBudW1iZXI7XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBhdWRpb1xuICAgKi9cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlKCkgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5zZXRTdGF0ZSgncmVjb3JkaW5nJyk7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgICBcbiAgICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBzdGFydCBhY3R1YWwgYXVkaW8gcmVjb3JkaW5nXG4gICAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IHNpbXVsYXRlIHRoZSByZWNvcmRpbmcgc3RhdGVcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdGFydCByZWNvcmRpbmcnXG4gICAgICApO1xuICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoJ2lkbGUnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0b3AgcmVjb3JkaW5nIGF1ZGlvIGFuZCByZXR1cm4gYmxvYlxuICAgKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPEJsb2I+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGJsb2IgLSBzdHViIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBlbXB0eUJsb2IgPSBuZXcgQmxvYihbXSwgeyB0eXBlOiAnYXVkaW8vd2VibScgfSk7XG4gICAgICByZXR1cm4gZW1wdHlCbG9iO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdG9wIHJlY29yZGluZydcbiAgICAgICk7XG4gICAgICB0aGlzLmVycm9yLmVtaXQoZXJyb3IpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcmVjb3JkZXIgc3RhdGVcbiAgICovXG4gIGdldFN0YXRlKCk6IEF1ZGlvUmVjb3JkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcmVzb3VyY2VzXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShzdGF0ZTogQXVkaW9SZWNvcmRlclN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZXQoc3RhdGUpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RhcnRBbmltYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYXcgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgLy8gVXBkYXRlIGNhbnZhcyBkaW1lbnNpb25zIGlmIGNvbnRhaW5lciByZXNpemVkXG4gICAgICBpZiAoXG4gICAgICAgIGNhbnZhcy53aWR0aCAhPT0gcmVjdC53aWR0aCAqIGRwciB8fFxuICAgICAgICBjYW52YXMuaGVpZ2h0ICE9PSByZWN0LmhlaWdodCAqIGRwclxuICAgICAgKSB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHJlY3Qud2lkdGggKiBkcHI7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSByZWN0LmhlaWdodCAqIGRwcjtcbiAgICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTtcbiAgICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBiYXJXaWR0aCA9IDI7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSAyO1xuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gMjA7XG4gICAgICBjb25zdCBnYXAgPSAyO1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IE1hdGguY2VpbChyZWN0LndpZHRoIC8gKGJhcldpZHRoICsgZ2FwKSk7XG5cbiAgICAgIC8vIEdldCBsb3VkbmVzcyBkYXRhXG4gICAgICBjb25zdCBsb3VkbmVzc0RhdGEgPSB0aGlzLmdldExvdWRuZXNzKG51bVNhbXBsZXMpO1xuXG4gICAgICAvLyBDbGVhciBjYW52YXNcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjYW52YXMpO1xuICAgICAgY29uc3QgY3VycmVudEZvcmVncm91bmQgPSBjb21wdXRlZFN0eWxlLmNvbG9yO1xuXG4gICAgICAvLyBEcmF3IGJhcnNcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBjdXJyZW50Rm9yZWdyb3VuZDtcbiAgICAgIGNvbnN0IGNlbnRlclkgPSByZWN0LmhlaWdodCAvIDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG91ZG5lc3NEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IGxvdWRuZXNzRGF0YVtpXSA/PyAwO1xuICAgICAgICBjb25zdCBiYXJIZWlnaHQgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIHNhbXBsZSAqIChtYXhIZWlnaHQgLSBtaW5IZWlnaHQpICsgbWluSGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLnJvdW5kKGkgKiAoYmFyV2lkdGggKyBnYXApKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgucm91bmQoY2VudGVyWSAtIGJhckhlaWdodCAvIDIpO1xuXG4gICAgICAgIGN0eC5maWxsUmVjdCh4LCB5LCBiYXJXaWR0aCwgYmFySGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXcpO1xuICAgIH07XG5cbiAgICBkcmF3KCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RvcEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG91ZG5lc3MobjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC8gMTAwMDsgLy8gVXNlIGN1cnJlbnQgdGltZXN0YW1wIGRpcmVjdGx5XG4gICAgY29uc3Qgc2FtcGxlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiB0aGF0IG1vdmVzIGZyb20gbGVmdCB0byByaWdodCBvdmVyIHRpbWVcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKGkgLyBuKSAqIDEwICsgZWxhcHNlZCAqIDAuNTsgLy8gU2Nyb2xsIHNwZWVkIChzbG93ZXIpXG5cbiAgICAgIC8vIEdlbmVyYXRlIHdhdmVmb3JtIHVzaW5nIG11bHRpcGxlIHNpbmUgd2F2ZXMgZm9yIHJlYWxpc21cbiAgICAgIGNvbnN0IHdhdmUxID0gTWF0aC5zaW4ocG9zaXRpb24gKiAyKSAqIDAuMztcbiAgICAgIGNvbnN0IHdhdmUyID0gTWF0aC5zaW4ocG9zaXRpb24gKiA1ICsgZWxhcHNlZCkgKiAwLjI7XG4gICAgICBjb25zdCB3YXZlMyA9IE1hdGguc2luKHBvc2l0aW9uICogMC41ICsgZWxhcHNlZCAqIDAuMykgKiAwLjQ7XG5cbiAgICAgIC8vIEFkZCBzb21lIHJhbmRvbW5lc3MgZm9yIG5hdHVyYWwgdmFyaWF0aW9uXG4gICAgICBjb25zdCBub2lzZSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDAuMTtcblxuICAgICAgLy8gQ29tYmluZSB3YXZlcyBhbmQgYWRkIGVudmVsb3BlIGZvciByZWFsaXN0aWMgYW1wbGl0dWRlIHZhcmlhdGlvblxuICAgICAgY29uc3QgZW52ZWxvcGUgPSBNYXRoLnNpbihlbGFwc2VkICogMC43KSAqIDAuNSArIDAuNTsgLy8gU2xvdyBhbXBsaXR1ZGUgbW9kdWxhdGlvblxuICAgICAgbGV0IGFtcGxpdHVkZSA9ICh3YXZlMSArIHdhdmUyICsgd2F2ZTMgKyBub2lzZSkgKiBlbnZlbG9wZTtcblxuICAgICAgLy8gQ2xhbXAgdG8gMC0xIHJhbmdlXG4gICAgICBhbXBsaXR1ZGUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhbXBsaXR1ZGUgKiAwLjUgKyAwLjMpKTtcblxuICAgICAgc2FtcGxlcy5wdXNoKGFtcGxpdHVkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbXBsZXM7XG4gIH1cbn0iXX0=
@@ -0,0 +1,321 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, inject, signal, computed, ViewEncapsulation } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { LucideAngularModule, ArrowUp, Mic, X, Check, Plus } from 'lucide-angular';
4
+ import { CopilotChatConfigurationService } from '../../core/chat-configuration/chat-configuration.service';
5
+ import { CopilotTooltipDirective } from '../../lib/directives/tooltip.directive';
6
+ import { cn } from '../../lib/utils';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "lucide-angular";
9
+ // Base button classes matching React's button variants
10
+ const buttonBase = cn('inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium', 'transition-all disabled:pointer-events-none disabled:opacity-50', 'shrink-0 outline-none', 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]');
11
+ const chatInputToolbarPrimary = cn('cursor-pointer',
12
+ // Background and text
13
+ 'bg-black text-white',
14
+ // Dark mode
15
+ 'dark:bg-white dark:text-black dark:focus-visible:outline-white',
16
+ // Shape and sizing
17
+ 'rounded-full h-9 w-9',
18
+ // Interactions
19
+ 'transition-colors',
20
+ // Focus states
21
+ 'focus:outline-none',
22
+ // Hover states
23
+ 'hover:opacity-70 disabled:hover:opacity-100',
24
+ // Disabled states
25
+ 'disabled:cursor-not-allowed disabled:bg-[#00000014] disabled:text-[rgb(13,13,13)]', 'dark:disabled:bg-[#454545] dark:disabled:text-white');
26
+ const chatInputToolbarSecondary = cn('cursor-pointer',
27
+ // Background and text
28
+ 'bg-transparent text-[#444444]',
29
+ // Dark mode
30
+ 'dark:text-white dark:border-[#404040]',
31
+ // Shape and sizing
32
+ 'rounded-full h-9 w-9',
33
+ // Interactions
34
+ 'transition-colors',
35
+ // Focus states
36
+ 'focus:outline-none',
37
+ // Hover states
38
+ 'hover:bg-[#f8f8f8] hover:text-[#333333]', 'dark:hover:bg-[#404040] dark:hover:text-[#FFFFFF]',
39
+ // Disabled states
40
+ 'disabled:cursor-not-allowed disabled:opacity-50', 'disabled:hover:bg-transparent disabled:hover:text-[#444444]', 'dark:disabled:hover:bg-transparent dark:disabled:hover:text-[#CCCCCC]');
41
+ export class CopilotChatSendButtonComponent {
42
+ disabled = false;
43
+ clicked = new EventEmitter();
44
+ ArrowUpIcon = ArrowUp;
45
+ buttonClass = cn(buttonBase, chatInputToolbarPrimary);
46
+ onClick() {
47
+ if (!this.disabled) {
48
+ this.clicked.emit();
49
+ }
50
+ }
51
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatSendButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
52
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatSendButtonComponent, isStandalone: true, selector: "copilot-chat-send-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
53
+ <div class="mr-[10px]">
54
+ <button
55
+ type="button"
56
+ [disabled]="disabled"
57
+ [class]="buttonClass"
58
+ (click)="onClick()"
59
+ >
60
+ <lucide-angular [img]="ArrowUpIcon" [size]="18"></lucide-angular>
61
+ </button>
62
+ </div>
63
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatSendButtonComponent, decorators: [{
66
+ type: Component,
67
+ args: [{ selector: 'copilot-chat-send-button', standalone: true, imports: [CommonModule, LucideAngularModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
68
+ <div class="mr-[10px]">
69
+ <button
70
+ type="button"
71
+ [disabled]="disabled"
72
+ [class]="buttonClass"
73
+ (click)="onClick()"
74
+ >
75
+ <lucide-angular [img]="ArrowUpIcon" [size]="18"></lucide-angular>
76
+ </button>
77
+ </div>
78
+ ` }]
79
+ }], propDecorators: { disabled: [{
80
+ type: Input
81
+ }], clicked: [{
82
+ type: Output
83
+ }] } });
84
+ export class CopilotChatStartTranscribeButtonComponent {
85
+ disabled = false;
86
+ clicked = new EventEmitter();
87
+ chatConfig = inject(CopilotChatConfigurationService);
88
+ MicIcon = Mic;
89
+ buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'mr-2');
90
+ get label() {
91
+ return this.chatConfig.labels().chatInputToolbarStartTranscribeButtonLabel;
92
+ }
93
+ onClick() {
94
+ if (!this.disabled) {
95
+ this.clicked.emit();
96
+ }
97
+ }
98
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatStartTranscribeButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
99
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatStartTranscribeButtonComponent, isStandalone: true, selector: "copilot-chat-start-transcribe-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
100
+ <button
101
+ type="button"
102
+ [disabled]="disabled"
103
+ [class]="buttonClass"
104
+ [copilotTooltip]="label"
105
+ tooltipPosition="below"
106
+ (click)="onClick()"
107
+ >
108
+ <lucide-angular [img]="MicIcon" [size]="18"></lucide-angular>
109
+ </button>
110
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatStartTranscribeButtonComponent, decorators: [{
113
+ type: Component,
114
+ args: [{ selector: 'copilot-chat-start-transcribe-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
115
+ <button
116
+ type="button"
117
+ [disabled]="disabled"
118
+ [class]="buttonClass"
119
+ [copilotTooltip]="label"
120
+ tooltipPosition="below"
121
+ (click)="onClick()"
122
+ >
123
+ <lucide-angular [img]="MicIcon" [size]="18"></lucide-angular>
124
+ </button>
125
+ ` }]
126
+ }], propDecorators: { disabled: [{
127
+ type: Input
128
+ }], clicked: [{
129
+ type: Output
130
+ }] } });
131
+ export class CopilotChatCancelTranscribeButtonComponent {
132
+ disabled = false;
133
+ clicked = new EventEmitter();
134
+ chatConfig = inject(CopilotChatConfigurationService);
135
+ XIcon = X;
136
+ buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'mr-2');
137
+ get label() {
138
+ return this.chatConfig.labels().chatInputToolbarCancelTranscribeButtonLabel;
139
+ }
140
+ onClick() {
141
+ if (!this.disabled) {
142
+ this.clicked.emit();
143
+ }
144
+ }
145
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatCancelTranscribeButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
146
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatCancelTranscribeButtonComponent, isStandalone: true, selector: "copilot-chat-cancel-transcribe-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
147
+ <button
148
+ type="button"
149
+ [disabled]="disabled"
150
+ [class]="buttonClass"
151
+ [copilotTooltip]="label"
152
+ tooltipPosition="below"
153
+ (click)="onClick()"
154
+ >
155
+ <lucide-angular [img]="XIcon" [size]="18"></lucide-angular>
156
+ </button>
157
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
158
+ }
159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatCancelTranscribeButtonComponent, decorators: [{
160
+ type: Component,
161
+ args: [{ selector: 'copilot-chat-cancel-transcribe-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
162
+ <button
163
+ type="button"
164
+ [disabled]="disabled"
165
+ [class]="buttonClass"
166
+ [copilotTooltip]="label"
167
+ tooltipPosition="below"
168
+ (click)="onClick()"
169
+ >
170
+ <lucide-angular [img]="XIcon" [size]="18"></lucide-angular>
171
+ </button>
172
+ ` }]
173
+ }], propDecorators: { disabled: [{
174
+ type: Input
175
+ }], clicked: [{
176
+ type: Output
177
+ }] } });
178
+ export class CopilotChatFinishTranscribeButtonComponent {
179
+ disabled = false;
180
+ clicked = new EventEmitter();
181
+ chatConfig = inject(CopilotChatConfigurationService);
182
+ CheckIcon = Check;
183
+ buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'mr-[10px]');
184
+ get label() {
185
+ return this.chatConfig.labels().chatInputToolbarFinishTranscribeButtonLabel;
186
+ }
187
+ onClick() {
188
+ if (!this.disabled) {
189
+ this.clicked.emit();
190
+ }
191
+ }
192
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatFinishTranscribeButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
193
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatFinishTranscribeButtonComponent, isStandalone: true, selector: "copilot-chat-finish-transcribe-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
194
+ <button
195
+ type="button"
196
+ [disabled]="disabled"
197
+ [class]="buttonClass"
198
+ [copilotTooltip]="label"
199
+ tooltipPosition="below"
200
+ (click)="onClick()"
201
+ >
202
+ <lucide-angular [img]="CheckIcon" [size]="18"></lucide-angular>
203
+ </button>
204
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
205
+ }
206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatFinishTranscribeButtonComponent, decorators: [{
207
+ type: Component,
208
+ args: [{ selector: 'copilot-chat-finish-transcribe-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
209
+ <button
210
+ type="button"
211
+ [disabled]="disabled"
212
+ [class]="buttonClass"
213
+ [copilotTooltip]="label"
214
+ tooltipPosition="below"
215
+ (click)="onClick()"
216
+ >
217
+ <lucide-angular [img]="CheckIcon" [size]="18"></lucide-angular>
218
+ </button>
219
+ ` }]
220
+ }], propDecorators: { disabled: [{
221
+ type: Input
222
+ }], clicked: [{
223
+ type: Output
224
+ }] } });
225
+ export class CopilotChatAddFileButtonComponent {
226
+ disabled = false;
227
+ clicked = new EventEmitter();
228
+ chatConfig = inject(CopilotChatConfigurationService);
229
+ PlusIcon = Plus;
230
+ buttonClass = cn(buttonBase, chatInputToolbarSecondary, 'ml-2');
231
+ get label() {
232
+ return this.chatConfig.labels().chatInputToolbarAddButtonLabel;
233
+ }
234
+ onClick() {
235
+ if (!this.disabled) {
236
+ this.clicked.emit();
237
+ }
238
+ }
239
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAddFileButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
240
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAddFileButtonComponent, isStandalone: true, selector: "copilot-chat-add-file-button", inputs: { disabled: "disabled" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
241
+ <button
242
+ type="button"
243
+ [disabled]="disabled"
244
+ [class]="buttonClass"
245
+ [copilotTooltip]="label"
246
+ tooltipPosition="below"
247
+ (click)="onClick()"
248
+ >
249
+ <lucide-angular [img]="PlusIcon" [size]="20"></lucide-angular>
250
+ </button>
251
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
252
+ }
253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAddFileButtonComponent, decorators: [{
254
+ type: Component,
255
+ args: [{ selector: 'copilot-chat-add-file-button', standalone: true, imports: [CommonModule, LucideAngularModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
256
+ <button
257
+ type="button"
258
+ [disabled]="disabled"
259
+ [class]="buttonClass"
260
+ [copilotTooltip]="label"
261
+ tooltipPosition="below"
262
+ (click)="onClick()"
263
+ >
264
+ <lucide-angular [img]="PlusIcon" [size]="20"></lucide-angular>
265
+ </button>
266
+ ` }]
267
+ }], propDecorators: { disabled: [{
268
+ type: Input
269
+ }], clicked: [{
270
+ type: Output
271
+ }] } });
272
+ // Base toolbar button component that other buttons can use
273
+ export class CopilotChatToolbarButtonComponent {
274
+ disabled = signal(false);
275
+ variant = signal('secondary');
276
+ customClass = signal('');
277
+ title = signal('');
278
+ clicked = new EventEmitter();
279
+ computedClass = computed(() => {
280
+ const variantClass = this.variant() === 'primary'
281
+ ? chatInputToolbarPrimary
282
+ : chatInputToolbarSecondary;
283
+ return cn(buttonBase, variantClass, this.customClass());
284
+ });
285
+ onClick() {
286
+ if (!this.disabled()) {
287
+ this.clicked.emit();
288
+ }
289
+ }
290
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolbarButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
291
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatToolbarButtonComponent, isStandalone: true, selector: "copilot-chat-toolbar-button", outputs: { clicked: "clicked" }, ngImport: i0, template: `
292
+ <button
293
+ type="button"
294
+ [disabled]="disabled()"
295
+ [class]="computedClass()"
296
+ [copilotTooltip]="title()"
297
+ tooltipPosition="below"
298
+ (click)="onClick()"
299
+ >
300
+ <ng-content></ng-content>
301
+ </button>
302
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: CopilotTooltipDirective, selector: "[copilotTooltip]", inputs: ["copilotTooltip", "tooltipPosition", "tooltipDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
303
+ }
304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatToolbarButtonComponent, decorators: [{
305
+ type: Component,
306
+ args: [{ selector: 'copilot-chat-toolbar-button', standalone: true, imports: [CommonModule, CopilotTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
307
+ <button
308
+ type="button"
309
+ [disabled]="disabled()"
310
+ [class]="computedClass()"
311
+ [copilotTooltip]="title()"
312
+ tooltipPosition="below"
313
+ (click)="onClick()"
314
+ >
315
+ <ng-content></ng-content>
316
+ </button>
317
+ ` }]
318
+ }], propDecorators: { clicked: [{
319
+ type: Output
320
+ }] } });
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWJ1dHRvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYnV0dG9ucy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLE9BQU8sRUFDUCxHQUFHLEVBQ0gsQ0FBQyxFQUNELEtBQUssRUFDTCxJQUFJLEVBQ0wsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUVyQyx1REFBdUQ7QUFDdkQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUNuQixnR0FBZ0csRUFDaEcsaUVBQWlFLEVBQ2pFLHVCQUF1QixFQUN2QiwrRUFBK0UsQ0FDaEYsQ0FBQztBQUVGLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUNoQyxnQkFBZ0I7QUFDaEIsc0JBQXNCO0FBQ3RCLHFCQUFxQjtBQUNyQixZQUFZO0FBQ1osZ0VBQWdFO0FBQ2hFLG1CQUFtQjtBQUNuQixzQkFBc0I7QUFDdEIsZUFBZTtBQUNmLG1CQUFtQjtBQUNuQixlQUFlO0FBQ2Ysb0JBQW9CO0FBQ3BCLGVBQWU7QUFDZiw2Q0FBNkM7QUFDN0Msa0JBQWtCO0FBQ2xCLG1GQUFtRixFQUNuRixxREFBcUQs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QWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIGluamVjdCxcbiAgc2lnbmFsLFxuICBjb21wdXRlZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgXG4gIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsXG4gIEFycm93VXAsXG4gIE1pYyxcbiAgWCxcbiAgQ2hlY2ssXG4gIFBsdXNcbn0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgQ29waWxvdENoYXRDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvcGlsb3RUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vbGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG4vLyBCYXNlIGJ1dHRvbiBjbGFzc2VzIG1hdGNoaW5nIFJlYWN0J3MgYnV0dG9uIHZhcmlhbnRzXG5jb25zdCBidXR0b25CYXNlID0gY24oXG4gICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC1tZCB0ZXh0LXNtIGZvbnQtbWVkaXVtJyxcbiAgJ3RyYW5zaXRpb24tYWxsIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gICdzaHJpbmstMCBvdXRsaW5lLW5vbmUnLFxuICAnZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0nXG4pO1xuXG5jb25zdCBjaGF0SW5wdXRUb29sYmFyUHJpbWFyeSA9IGNuKFxuICAnY3Vyc29yLXBvaW50ZXInLFxuICAvLyBCYWNrZ3JvdW5kIGFuZCB0ZXh0XG4gICdiZy1ibGFjayB0ZXh0LXdoaXRlJyxcbiAgLy8gRGFyayBtb2RlXG4gICdkYXJrOmJnLXdoaXRlIGRhcms6dGV4dC1ibGFjayBkYXJrOmZvY3VzLXZpc2libGU6b3V0bGluZS13aGl0ZScsXG4gIC8vIFNoYXBlIGFuZCBzaXppbmdcbiAgJ3JvdW5kZWQtZnVsbCBoLTkgdy05JyxcbiAgLy8gSW50ZXJhY3Rpb25zXG4gICd0cmFuc2l0aW9uLWNvbG9ycycsXG4gIC8vIEZvY3VzIHN0YXRlc1xuICAnZm9jdXM6b3V0bGluZS1ub25lJyxcbiAgLy8gSG92ZXIgc3RhdGVzXG4gICdob3ZlcjpvcGFjaXR5LTcwIGRpc2FibGVkOmhvdmVyOm9wYWNpdHktMTAwJyxcbiAgLy8gRGlzYWJsZWQgc3RhdGVzXG4gICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6YmctWyMwMDAwMDAxNF0gZGlzYWJsZWQ6dGV4dC1bcmdiKDEzLDEzLDEzKV0nLFxuICAnZGFyazpkaXNhYmxlZDpiZy1bIzQ1NDU0NV0gZGFyazpkaXNhYmxlZDp0ZXh0LXdoaXRlJ1xuKTtcblxuY29uc3QgY2hhdElucHV0VG9vbGJhclNlY29uZGFyeSA9IGNuKFxuICAnY3Vyc29yLXBvaW50ZXInLFxuICAvLyBCYWNrZ3JvdW5kIGFuZCB0ZXh0XG4gICdiZy10cmFuc3BhcmVudCB0ZXh0LVsjNDQ0NDQ0XScsXG4gIC8vIERhcmsgbW9kZVxuICAnZGFyazp0ZXh0LXdoaXRlIGRhcms6Ym9yZGVyLVsjNDA0MDQwXScsXG4gIC8vIFNoYXBlIGFuZCBzaXppbmdcbiAgJ3JvdW5kZWQtZnVsbCBoLTkgdy05JyxcbiAgLy8gSW50ZXJhY3Rpb25zXG4gICd0cmFuc2l0aW9uLWNvbG9ycycsXG4gIC8vIEZvY3VzIHN0YXRlc1xuICAnZm9jdXM6b3V0bGluZS1ub25lJyxcbiAgLy8gSG92ZXIgc3RhdGVzXG4gICdob3ZlcjpiZy1bI2Y4ZjhmOF0gaG92ZXI6dGV4dC1bIzMzMzMzM10nLFxuICAnZGFyazpob3ZlcjpiZy1bIzQwNDA0MF0gZGFyazpob3Zlcjp0ZXh0LVsjRkZGRkZGXScsXG4gIC8vIERpc2FibGVkIHN0YXRlc1xuICAnZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAnZGlzYWJsZWQ6aG92ZXI6YmctdHJhbnNwYXJlbnQgZGlzYWJsZWQ6aG92ZXI6dGV4dC1bIzQ0NDQ0NF0nLFxuICAnZGFyazpkaXNhYmxlZDpob3ZlcjpiZy10cmFuc3BhcmVudCBkYXJrOmRpc2FibGVkOmhvdmVyOnRleHQtWyNDQ0NDQ0NdJ1xuKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LXNlbmQtYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTHVjaWRlQW5ndWxhck1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtci1bMTBweF1cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzc109XCJidXR0b25DbGFzc1wiXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgICAgPlxuICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJBcnJvd1VwSWNvblwiIFtzaXplXT1cIjE4XCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgYF1cbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRTZW5kQnV0dG9uQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQE91dHB1dCgpIGNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIFxuICByZWFkb25seSBBcnJvd1VwSWNvbiA9IEFycm93VXA7XG4gIGJ1dHRvbkNsYXNzID0gY24oYnV0dG9uQmFzZSwgY2hhdElucHV0VG9vbGJhclByaW1hcnkpO1xuICBcbiAgb25DbGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KCk7XG4gICAgfVxuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtY2hhdC1zdGFydC10cmFuc2NyaWJlLWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCJcbiAgICAgIFtjb3BpbG90VG9vbHRpcF09XCJsYWJlbFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJNaWNJY29uXCIgW3NpemVdPVwiMThcIj48L2x1Y2lkZS1hbmd1bGFyPlxuICAgIDwvYnV0dG9uPlxuICBgLFxuICBzdHlsZXM6IFtgYF1cbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHByaXZhdGUgY2hhdENvbmZpZyA9IGluamVjdChDb3BpbG90Q2hhdENvbmZpZ3VyYXRpb25TZXJ2aWNlKTtcbiAgXG4gIHJlYWRvbmx5IE1pY0ljb24gPSBNaWM7XG4gIGJ1dHRvbkNsYXNzID0gY24oYnV0dG9uQmFzZSwgY2hhdElucHV0VG9vbGJhclNlY29uZGFyeSwgJ21yLTInKTtcbiAgXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNoYXRDb25maWcubGFiZWxzKCkuY2hhdElucHV0VG9vbGJhclN0YXJ0VHJhbnNjcmliZUJ1dHRvbkxhYmVsO1xuICB9XG4gIFxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWNhbmNlbC10cmFuc2NyaWJlLWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCJcbiAgICAgIFtjb3BpbG90VG9vbHRpcF09XCJsYWJlbFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJYSWNvblwiIFtzaXplXT1cIjE4XCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBcbiAgcmVhZG9ubHkgWEljb24gPSBYO1xuICBidXR0b25DbGFzcyA9IGNuKGJ1dHRvbkJhc2UsIGNoYXRJbnB1dFRvb2xiYXJTZWNvbmRhcnksICdtci0yJyk7XG4gIFxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGF0Q29uZmlnLmxhYmVscygpLmNoYXRJbnB1dFRvb2xiYXJDYW5jZWxUcmFuc2NyaWJlQnV0dG9uTGFiZWw7XG4gIH1cbiAgXG4gIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmNsaWNrZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb3BpbG90LWNoYXQtZmluaXNoLXRyYW5zY3JpYmUtYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTHVjaWRlQW5ndWxhck1vZHVsZSwgQ29waWxvdFRvb2x0aXBEaXJlY3RpdmVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2xhc3NdPVwiYnV0dG9uQ2xhc3NcIlxuICAgICAgW2NvcGlsb3RUb29sdGlwXT1cImxhYmVsXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgID5cbiAgICAgIDxsdWNpZGUtYW5ndWxhciBbaW1nXT1cIkNoZWNrSWNvblwiIFtzaXplXT1cIjE4XCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0RmluaXNoVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBcbiAgcmVhZG9ubHkgQ2hlY2tJY29uID0gQ2hlY2s7XG4gIGJ1dHRvbkNsYXNzID0gY24oYnV0dG9uQmFzZSwgY2hhdElucHV0VG9vbGJhclNlY29uZGFyeSwgJ21yLVsxMHB4XScpO1xuICBcbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhdENvbmZpZy5sYWJlbHMoKS5jaGF0SW5wdXRUb29sYmFyRmluaXNoVHJhbnNjcmliZUJ1dHRvbkxhYmVsO1xuICB9XG4gIFxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWFkZC1maWxlLWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCJcbiAgICAgIFtjb3BpbG90VG9vbHRpcF09XCJsYWJlbFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bHVjaWRlLWFuZ3VsYXIgW2ltZ109XCJQbHVzSWNvblwiIFtzaXplXT1cIjIwXCI+PC9sdWNpZGUtYW5ndWxhcj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QWRkRmlsZUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBcbiAgcmVhZG9ubHkgUGx1c0ljb24gPSBQbHVzO1xuICBidXR0b25DbGFzcyA9IGNuKGJ1dHRvbkJhc2UsIGNoYXRJbnB1dFRvb2xiYXJTZWNvbmRhcnksICdtbC0yJyk7XG4gIFxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGF0Q29uZmlnLmxhYmVscygpLmNoYXRJbnB1dFRvb2xiYXJBZGRCdXR0b25MYWJlbDtcbiAgfVxuICBcbiAgb25DbGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KCk7XG4gICAgfVxuICB9XG59XG5cbi8vIEJhc2UgdG9vbGJhciBidXR0b24gY29tcG9uZW50IHRoYXQgb3RoZXIgYnV0dG9ucyBjYW4gdXNlXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb3BpbG90LWNoYXQtdG9vbGJhci1idXR0b24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDb3BpbG90VG9vbHRpcERpcmVjdGl2ZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3MoKVwiXG4gICAgICBbY29waWxvdFRvb2x0aXBdPVwidGl0bGUoKVwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAoY2xpY2spPVwib25DbGljaygpXCJcbiAgICA+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9idXR0b24+XG4gIGAsXG4gIHN0eWxlczogW2BgXVxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdFRvb2xiYXJCdXR0b25Db21wb25lbnQge1xuICBkaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHZhcmlhbnQgPSBzaWduYWw8J3ByaW1hcnknIHwgJ3NlY29uZGFyeSc+KCdzZWNvbmRhcnknKTtcbiAgY3VzdG9tQ2xhc3MgPSBzaWduYWwoJycpO1xuICB0aXRsZSA9IHNpZ25hbCgnJyk7XG4gIFxuICBAT3V0cHV0KCkgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIGNvbXB1dGVkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFyaWFudENsYXNzID0gdGhpcy52YXJpYW50KCkgPT09ICdwcmltYXJ5JyBcbiAgICAgID8gY2hhdElucHV0VG9vbGJhclByaW1hcnkgXG4gICAgICA6IGNoYXRJbnB1dFRvb2xiYXJTZWNvbmRhcnk7XG4gICAgcmV0dXJuIGNuKGJ1dHRvbkJhc2UsIHZhcmlhbnRDbGFzcywgdGhpcy5jdXN0b21DbGFzcygpKTtcbiAgfSk7XG4gIFxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmNsaWNrZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,38 @@
1
+ import { CopilotChatTextareaComponent } from "./copilot-chat-textarea.component";
2
+ import { CopilotChatAudioRecorderComponent } from "./copilot-chat-audio-recorder.component";
3
+ import { CopilotChatSendButtonComponent, CopilotChatStartTranscribeButtonComponent, CopilotChatCancelTranscribeButtonComponent, CopilotChatFinishTranscribeButtonComponent, CopilotChatAddFileButtonComponent, } from "./copilot-chat-buttons.component";
4
+ import { CopilotChatToolbarComponent } from "./copilot-chat-toolbar.component";
5
+ import { CopilotChatToolsMenuComponent } from "./copilot-chat-tools-menu.component";
6
+ /**
7
+ * Default components used by CopilotChatInput.
8
+ * These can be imported and reused when creating custom slot implementations.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { CopilotChatInputDefaults } from '@copilotkitnext/angular';
13
+ *
14
+ * @Component({
15
+ * template: `
16
+ * <copilot-chat-input [sendButtonSlot]="CustomSendButton">
17
+ * </copilot-chat-input>
18
+ * `
19
+ * })
20
+ * export class MyComponent {
21
+ * CustomSendButton = class extends CopilotChatInputDefaults.SendButton {
22
+ * // Custom implementation
23
+ * };
24
+ * }
25
+ * ```
26
+ */
27
+ export class CopilotChatInputDefaults {
28
+ static TextArea = CopilotChatTextareaComponent;
29
+ static AudioRecorder = CopilotChatAudioRecorderComponent;
30
+ static SendButton = CopilotChatSendButtonComponent;
31
+ static StartTranscribeButton = CopilotChatStartTranscribeButtonComponent;
32
+ static CancelTranscribeButton = CopilotChatCancelTranscribeButtonComponent;
33
+ static FinishTranscribeButton = CopilotChatFinishTranscribeButtonComponent;
34
+ static AddFileButton = CopilotChatAddFileButtonComponent;
35
+ static Toolbar = CopilotChatToolbarComponent;
36
+ static ToolsMenu = CopilotChatToolsMenuComponent;
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWlucHV0LWRlZmF1bHRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtaW5wdXQtZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDNUYsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qix5Q0FBeUMsRUFDekMsMENBQTBDLEVBQzFDLDBDQUEwQyxFQUMxQyxpQ0FBaUMsR0FDbEMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVwRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DLE1BQU0sQ0FBVSxRQUFRLEdBQUcsNEJBQTRCLENBQUM7SUFDeEQsTUFBTSxDQUFVLGFBQWEsR0FBRyxpQ0FBaUMsQ0FBQztJQUNsRSxNQUFNLENBQVUsVUFBVSxHQUFHLDhCQUE4QixDQUFDO0lBQzVELE1BQU0sQ0FBVSxxQkFBcUIsR0FDbkMseUNBQXlDLENBQUM7SUFDNUMsTUFBTSxDQUFVLHNCQUFzQixHQUNwQywwQ0FBMEMsQ0FBQztJQUM3QyxNQUFNLENBQVUsc0JBQXNCLEdBQ3BDLDBDQUEwQyxDQUFDO0lBQzdDLE1BQU0sQ0FBVSxhQUFhLEdBQUcsaUNBQWlDLENBQUM7SUFDbEUsTUFBTSxDQUFVLE9BQU8sR0FBRywyQkFBMkIsQ0FBQztJQUN0RCxNQUFNLENBQVUsU0FBUyxHQUFHLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29waWxvdENoYXRUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC10ZXh0YXJlYS5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC1hdWRpby1yZWNvcmRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7XG4gIENvcGlsb3RDaGF0U2VuZEJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRGaW5pc2hUcmFuc2NyaWJlQnV0dG9uQ29tcG9uZW50LFxuICBDb3BpbG90Q2hhdEFkZEZpbGVCdXR0b25Db21wb25lbnQsXG59IGZyb20gXCIuL2NvcGlsb3QtY2hhdC1idXR0b25zLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRUb29sYmFyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29waWxvdC1jaGF0LXRvb2xiYXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFRvb2xzTWVudUNvbXBvbmVudCB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC10b29scy1tZW51LmNvbXBvbmVudFwiO1xuXG4vKipcbiAqIERlZmF1bHQgY29tcG9uZW50cyB1c2VkIGJ5IENvcGlsb3RDaGF0SW5wdXQuXG4gKiBUaGVzZSBjYW4gYmUgaW1wb3J0ZWQgYW5kIHJldXNlZCB3aGVuIGNyZWF0aW5nIGN1c3RvbSBzbG90IGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ29waWxvdENoYXRJbnB1dERlZmF1bHRzIH0gZnJvbSAnQGNvcGlsb3RraXRuZXh0L2FuZ3VsYXInO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxjb3BpbG90LWNoYXQtaW5wdXQgW3NlbmRCdXR0b25TbG90XT1cIkN1c3RvbVNlbmRCdXR0b25cIj5cbiAqICAgICA8L2NvcGlsb3QtY2hhdC1pbnB1dD5cbiAqICAgYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIEN1c3RvbVNlbmRCdXR0b24gPSBjbGFzcyBleHRlbmRzIENvcGlsb3RDaGF0SW5wdXREZWZhdWx0cy5TZW5kQnV0dG9uIHtcbiAqICAgICAvLyBDdXN0b20gaW1wbGVtZW50YXRpb25cbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRJbnB1dERlZmF1bHRzIHtcbiAgc3RhdGljIHJlYWRvbmx5IFRleHRBcmVhID0gQ29waWxvdENoYXRUZXh0YXJlYUNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IEF1ZGlvUmVjb3JkZXIgPSBDb3BpbG90Q2hhdEF1ZGlvUmVjb3JkZXJDb21wb25lbnQ7XG4gIHN0YXRpYyByZWFkb25seSBTZW5kQnV0dG9uID0gQ29waWxvdENoYXRTZW5kQnV0dG9uQ29tcG9uZW50O1xuICBzdGF0aWMgcmVhZG9ubHkgU3RhcnRUcmFuc2NyaWJlQnV0dG9uID1cbiAgICBDb3BpbG90Q2hhdFN0YXJ0VHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IENhbmNlbFRyYW5zY3JpYmVCdXR0b24gPVxuICAgIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IEZpbmlzaFRyYW5zY3JpYmVCdXR0b24gPVxuICAgIENvcGlsb3RDaGF0RmluaXNoVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudDtcbiAgc3RhdGljIHJlYWRvbmx5IEFkZEZpbGVCdXR0b24gPSBDb3BpbG90Q2hhdEFkZEZpbGVCdXR0b25Db21wb25lbnQ7XG4gIHN0YXRpYyByZWFkb25seSBUb29sYmFyID0gQ29waWxvdENoYXRUb29sYmFyQ29tcG9uZW50O1xuICBzdGF0aWMgcmVhZG9ubHkgVG9vbHNNZW51ID0gQ29waWxvdENoYXRUb29sc01lbnVDb21wb25lbnQ7XG59XG4iXX0=