@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
package/slots.md DELETED
@@ -1,331 +0,0 @@
1
- # Angular CopilotKit Component Slots Documentation
2
-
3
- This document provides a comprehensive inventory of all customization slots available in the Angular CopilotKit components. Each slot can be customized using templates, components, or CSS classes.
4
-
5
- ## Table of Contents
6
- - [Overview](#overview)
7
- - [Slot Types](#slot-types)
8
- - [Component Inventory](#component-inventory)
9
- - [CopilotChatView](#copilotchatview)
10
- - [CopilotChatMessageView](#copilotchatmessageview)
11
- - [CopilotChatAssistantMessage](#copilotchatassistantmessage)
12
- - [CopilotChatUserMessage](#copilotchatusermessage)
13
- - [CopilotChatInput](#copilotchatinput)
14
- - [Context Interfaces](#context-interfaces)
15
- - [Usage Patterns](#usage-patterns)
16
-
17
- ## Overview
18
-
19
- Angular CopilotKit components provide extensive customization through a slot system. Each slot accepts:
20
- - **Templates** (`TemplateRef<any>`) - Using `ng-template` with context variables
21
- - **Components** (`Type<any>`) - Custom Angular components
22
- - **CSS Classes** (`string`) - For styling customization
23
-
24
- ## Slot Types
25
-
26
- ### 1. Template Slots
27
- - Defined using `@ContentChild('slotName', { read: TemplateRef })`
28
- - Used with `<ng-template #slotName>`
29
- - Receive context variables via `let-varName="contextProperty"`
30
-
31
- ### 2. Component Slots
32
- - Defined using `@Input() slotNameComponent?: Type<any>`
33
- - Accept Angular component classes
34
- - Must be standalone or properly imported
35
-
36
- ### 3. CSS Class Slots
37
- - Defined using `@Input() slotNameClass?: string`
38
- - Apply custom CSS classes to default components
39
- - Support Tailwind classes and custom CSS
40
-
41
- ## Component Inventory
42
-
43
- ### CopilotChatView
44
-
45
- The top-level chat interface component with comprehensive customization options.
46
-
47
- #### Available Slots
48
-
49
- | Slot Name | Input Property | Template Property | CSS Property | Description |
50
- |-----------|---------------|-------------------|--------------|-------------|
51
- | Message View | `messageViewComponent` | `messageViewTemplate` | `messageViewClass` | Container for all messages |
52
- | Scroll View | `scrollViewComponent` | `scrollViewTemplate` | `scrollViewClass` | Scrollable message container |
53
- | Scroll Button | `scrollToBottomButtonComponent` | `scrollToBottomButtonTemplate` | `scrollToBottomButtonClass` | Button to scroll to bottom |
54
- | Input | `inputComponent` | `inputTemplate` | - | Chat input field |
55
- | Input Container | `inputContainerComponent` | `inputContainerTemplate` | `inputContainerClass` | Container around input |
56
- | Feather | `featherComponent` | `featherTemplate` | `featherClass` | Gradient feather effect |
57
- | Disclaimer | `disclaimerComponent` | `disclaimerTemplate` | `disclaimerClass` | Disclaimer message |
58
-
59
- #### Content Child Templates
60
-
61
- | Template Name | Selector | Context | Description |
62
- |--------------|----------|---------|-------------|
63
- | Custom Layout | `customLayout` | `{ messageView, input, scrollView, ... }` | Complete custom layout |
64
- | Send Button | `sendButton` | `{ onClick, disabled }` | Custom send button in input |
65
- | Toolbar | `toolbar` | `{ children }` | Input toolbar customization |
66
- | Text Area | `textArea` | `{ value, onChange, onKeyDown }` | Custom text input area |
67
- | Audio Recorder | `audioRecorder` | `{ isRecording, onStart, onStop }` | Audio recording UI |
68
- | Assistant Markdown | `assistantMessageMarkdownRenderer` | `{ content }` | Markdown rendering for assistant |
69
- | Thumbs Up Button | `thumbsUpButton` | `{ onClick, message }` | Thumbs up feedback button |
70
- | Thumbs Down Button | `thumbsDownButton` | `{ onClick, message }` | Thumbs down feedback button |
71
- | Read Aloud Button | `readAloudButton` | `{ onClick, message }` | Text-to-speech button |
72
- | Regenerate Button | `regenerateButton` | `{ onClick, message }` | Regenerate response button |
73
-
74
- #### Event Outputs
75
-
76
- | Event | Type | Description |
77
- |-------|------|-------------|
78
- | `assistantMessageThumbsUp` | `EventEmitter<{ message: Message }>` | Thumbs up clicked |
79
- | `assistantMessageThumbsDown` | `EventEmitter<{ message: Message }>` | Thumbs down clicked |
80
- | `assistantMessageReadAloud` | `EventEmitter<{ message: Message }>` | Read aloud clicked |
81
- | `assistantMessageRegenerate` | `EventEmitter<{ message: Message }>` | Regenerate clicked |
82
- | `userMessageCopy` | `EventEmitter<{ message: Message }>` | Copy message clicked |
83
- | `userMessageEdit` | `EventEmitter<{ message: Message }>` | Edit message clicked |
84
-
85
- ### CopilotChatMessageView
86
-
87
- Container for displaying a list of chat messages.
88
-
89
- #### Available Slots
90
-
91
- | Slot Name | Input Property | Template Property | CSS Property | Description |
92
- |-----------|---------------|-------------------|--------------|-------------|
93
- | Assistant Message | `assistantMessageComponent` | `assistantMessageTemplate` | `assistantMessageClass` | Assistant message display |
94
- | User Message | `userMessageComponent` | `userMessageTemplate` | `userMessageClass` | User message display |
95
- | Cursor | `cursorComponent` | `cursorTemplate` | `cursorClass` | Typing indicator cursor |
96
-
97
- #### Content Child Templates
98
-
99
- | Template Name | Selector | Context | Description |
100
- |--------------|----------|---------|-------------|
101
- | Custom Layout | `customLayout` | `{ showCursor, messages, messageElements }` | Custom message layout |
102
-
103
- ### CopilotChatAssistantMessage
104
-
105
- Component for displaying assistant/AI messages.
106
-
107
- #### Available Slots
108
-
109
- | Slot Name | Input Property | Template Property | CSS Property | Description |
110
- |-----------|---------------|-------------------|--------------|-------------|
111
- | Markdown Renderer | `markdownRendererSlot` | `markdownRenderer` (ContentChild) | `markdownRendererClass` | Markdown content renderer |
112
- | Toolbar | `toolbarSlot` | `toolbar` (ContentChild) | `toolbarClass` | Message toolbar |
113
- | Copy Button | `copyButtonSlot` | `copyButton` (ContentChild) | `copyButtonClass` | Copy message button |
114
- | Thumbs Up Button | `thumbsUpButtonSlot` | `thumbsUpButton` (ContentChild) | `thumbsUpButtonClass` | Positive feedback |
115
- | Thumbs Down Button | `thumbsDownButtonSlot` | `thumbsDownButton` (ContentChild) | `thumbsDownButtonClass` | Negative feedback |
116
- | Read Aloud Button | `readAloudButtonSlot` | `readAloudButton` (ContentChild) | `readAloudButtonClass` | Text-to-speech |
117
- | Regenerate Button | `regenerateButtonSlot` | `regenerateButton` (ContentChild) | `regenerateButtonClass` | Regenerate response |
118
-
119
- #### Additional Inputs
120
-
121
- | Input | Type | Description |
122
- |-------|------|-------------|
123
- | `message` | `AssistantMessage` | The message data |
124
- | `additionalToolbarItems` | `TemplateRef<any>` | Extra toolbar items |
125
- | `toolbarVisible` | `boolean` | Show/hide toolbar |
126
- | `inputClass` | `string` | Additional CSS classes |
127
-
128
- ### CopilotChatUserMessage
129
-
130
- Component for displaying user messages.
131
-
132
- #### Available Slots
133
-
134
- | Slot Name | Input Property | Template Property | CSS Property | Description |
135
- |-----------|---------------|-------------------|--------------|-------------|
136
- | Markdown Renderer | `markdownRendererSlot` | `markdownRenderer` (ContentChild) | `markdownRendererClass` | Message content renderer |
137
- | Toolbar | `toolbarSlot` | `toolbar` (ContentChild) | `toolbarClass` | Message toolbar |
138
- | Copy Button | `copyButtonSlot` | `copyButton` (ContentChild) | `copyButtonClass` | Copy message button |
139
- | Edit Button | `editButtonSlot` | `editButton` (ContentChild) | `editButtonClass` | Edit message button |
140
-
141
- #### Additional Inputs
142
-
143
- | Input | Type | Description |
144
- |-------|------|-------------|
145
- | `message` | `UserMessage` | The message data |
146
- | `additionalToolbarItems` | `TemplateRef<any>` | Extra toolbar items |
147
- | `toolbarVisible` | `boolean` | Show/hide toolbar |
148
- | `inputClass` | `string` | Additional CSS classes |
149
-
150
- ### CopilotChatInput
151
-
152
- The chat input component with rich customization options.
153
-
154
- #### Available Slots
155
-
156
- | Slot Name | Input Property | Template Property | CSS Property | Description |
157
- |-----------|---------------|-------------------|--------------|-------------|
158
- | Text Area | `textAreaSlot` | `textArea` (ContentChild) | `textAreaClass` | Input text area |
159
- | Send Button | `sendButtonSlot` | `sendButton` (ContentChild) | `sendButtonClass` | Send message button |
160
- | Audio Recorder | `audioRecorderSlot` | `audioRecorder` (ContentChild) | `audioRecorderClass` | Voice recording UI |
161
- | Toolbar | `toolbarSlot` | `toolbar` (ContentChild) | `toolbarClass` | Input toolbar |
162
-
163
- #### Additional Inputs
164
-
165
- | Input | Type | Description |
166
- |-------|------|-------------|
167
- | `placeholder` | `string` | Input placeholder text |
168
- | `disabled` | `boolean` | Disable input |
169
- | `inputClass` | `string` | Additional CSS classes |
170
-
171
- ## Context Interfaces
172
-
173
- ### AssistantMessageMarkdownRendererContext
174
- ```typescript
175
- interface AssistantMessageMarkdownRendererContext {
176
- content: string;
177
- }
178
- ```
179
-
180
- ### AssistantMessageToolbarContext
181
- ```typescript
182
- interface AssistantMessageToolbarContext {
183
- children: any;
184
- }
185
- ```
186
-
187
- ### AssistantMessageCopyButtonContext
188
- ```typescript
189
- interface AssistantMessageCopyButtonContext {
190
- onClick: () => void;
191
- }
192
- ```
193
-
194
- ### ThumbsUpButtonContext
195
- ```typescript
196
- interface ThumbsUpButtonContext {
197
- onClick: () => void;
198
- }
199
- ```
200
-
201
- ### ThumbsDownButtonContext
202
- ```typescript
203
- interface ThumbsDownButtonContext {
204
- onClick: () => void;
205
- }
206
- ```
207
-
208
- ### ReadAloudButtonContext
209
- ```typescript
210
- interface ReadAloudButtonContext {
211
- onClick: () => void;
212
- }
213
- ```
214
-
215
- ### RegenerateButtonContext
216
- ```typescript
217
- interface RegenerateButtonContext {
218
- onClick: () => void;
219
- }
220
- ```
221
-
222
- ### InputContext
223
- ```typescript
224
- interface InputContext {
225
- onSend: (message: string) => void;
226
- placeholder?: string;
227
- disabled?: boolean;
228
- }
229
- ```
230
-
231
- ### ScrollButtonContext
232
- ```typescript
233
- interface ScrollButtonContext {
234
- onClick: () => void;
235
- visible: boolean;
236
- }
237
- ```
238
-
239
- ## Usage Patterns
240
-
241
- ### Template Customization
242
- ```html
243
- <copilot-chat-view>
244
- <ng-template #disclaimer>
245
- <div class="custom-disclaimer">
246
- Custom disclaimer content
247
- </div>
248
- </ng-template>
249
-
250
- <ng-template #sendButton let-onClick="onClick" let-disabled="disabled">
251
- <button (click)="onClick()" [disabled]="disabled">
252
- Send Message
253
- </button>
254
- </ng-template>
255
- </copilot-chat-view>
256
- ```
257
-
258
- ### Component Customization
259
- ```typescript
260
- @Component({
261
- template: `
262
- <copilot-chat-view
263
- [disclaimerComponent]="customDisclaimerComponent"
264
- [inputComponent]="customInputComponent">
265
- </copilot-chat-view>
266
- `
267
- })
268
- export class MyComponent {
269
- customDisclaimerComponent = CustomDisclaimerComponent;
270
- customInputComponent = CustomInputComponent;
271
- }
272
- ```
273
-
274
- ### CSS Customization
275
- ```html
276
- <copilot-chat-view
277
- [disclaimerClass]="'bg-blue-500 text-white p-4 rounded-lg'"
278
- [inputClass]="'border-2 border-gray-300 focus:border-blue-500'"
279
- [messageViewClass]="'max-w-4xl mx-auto'">
280
- </copilot-chat-view>
281
- ```
282
-
283
- ### Event Handling
284
- ```typescript
285
- @Component({
286
- template: `
287
- <copilot-chat-view
288
- (assistantMessageThumbsUp)="handleThumbsUp($event)"
289
- (assistantMessageThumbsDown)="handleThumbsDown($event)"
290
- (userMessageEdit)="handleEdit($event)">
291
- </copilot-chat-view>
292
- `
293
- })
294
- export class MyComponent {
295
- handleThumbsUp(event: { message: Message }) {
296
- console.log('Thumbs up for message:', event.message);
297
- }
298
-
299
- handleThumbsDown(event: { message: Message }) {
300
- console.log('Thumbs down for message:', event.message);
301
- }
302
-
303
- handleEdit(event: { message: Message }) {
304
- console.log('Edit message:', event.message);
305
- }
306
- }
307
- ```
308
-
309
- ## Best Practices
310
-
311
- 1. **Use Templates for Dynamic Content**: When you need to pass context variables or handle events, use templates.
312
-
313
- 2. **Use Components for Complex Logic**: When customization requires significant logic or state management, create a custom component.
314
-
315
- 3. **Use CSS Classes for Simple Styling**: For basic visual customization, CSS classes are the simplest approach.
316
-
317
- 4. **Combine Approaches**: You can mix templates, components, and CSS classes for different slots in the same component.
318
-
319
- 5. **Type Safety**: Define proper TypeScript interfaces for your context objects when creating custom templates.
320
-
321
- 6. **Performance**: Use `ChangeDetectionStrategy.OnPush` in custom components for better performance.
322
-
323
- 7. **Accessibility**: Ensure custom components maintain proper ARIA attributes and keyboard navigation.
324
-
325
- ## Future Enhancements
326
-
327
- - Additional slot positions for more granular customization
328
- - Built-in theme presets
329
- - Animation and transition customization slots
330
- - Custom loading states and error handling slots
331
- - Plugin system for extending functionality
@@ -1,282 +0,0 @@
1
- import { ComponentFixture, TestBed } from '@angular/core/testing';
2
- import { Component } from '@angular/core';
3
- import { CommonModule } from '@angular/common';
4
- import { CopilotChatAssistantMessageComponent } from '../copilot-chat-assistant-message.component';
5
- import { CopilotChatAssistantMessageRendererComponent } from '../copilot-chat-assistant-message-renderer.component';
6
- import {
7
- CopilotChatAssistantMessageCopyButtonComponent,
8
- CopilotChatAssistantMessageThumbsUpButtonComponent,
9
- CopilotChatAssistantMessageThumbsDownButtonComponent,
10
- CopilotChatAssistantMessageReadAloudButtonComponent,
11
- CopilotChatAssistantMessageRegenerateButtonComponent
12
- } from '../copilot-chat-assistant-message-buttons.component';
13
- import { CopilotChatAssistantMessageToolbarComponent } from '../copilot-chat-assistant-message-toolbar.component';
14
- import { CopilotChatViewHandlersService } from '../copilot-chat-view-handlers.service';
15
- import { provideCopilotKit } from '../../../core/copilotkit.providers';
16
- import { provideCopilotChatConfiguration } from '../../../core/chat-configuration/chat-configuration.providers';
17
- import { AssistantMessage } from '@ag-ui/client';
18
-
19
- describe('CopilotChatAssistantMessageComponent', () => {
20
- let component: CopilotChatAssistantMessageComponent;
21
- let fixture: ComponentFixture<CopilotChatAssistantMessageComponent>;
22
-
23
- const mockMessage: AssistantMessage = {
24
- id: 'test-msg-1',
25
- role: 'assistant',
26
- content: 'Hello! This is a test message with **bold text** and *italic text*.',
27
- createdAt: new Date()
28
- };
29
-
30
- beforeEach(async () => {
31
- await TestBed.configureTestingModule({
32
- imports: [
33
- CommonModule,
34
- CopilotChatAssistantMessageComponent,
35
- CopilotChatAssistantMessageRendererComponent,
36
- CopilotChatAssistantMessageCopyButtonComponent,
37
- CopilotChatAssistantMessageThumbsUpButtonComponent,
38
- CopilotChatAssistantMessageThumbsDownButtonComponent,
39
- CopilotChatAssistantMessageReadAloudButtonComponent,
40
- CopilotChatAssistantMessageRegenerateButtonComponent,
41
- CopilotChatAssistantMessageToolbarComponent
42
- ],
43
- providers: [
44
- provideCopilotKit({}),
45
- provideCopilotChatConfiguration({
46
- labels: {
47
- assistantMessageToolbarCopyMessageLabel: 'Copy',
48
- assistantMessageToolbarThumbsUpLabel: 'Good',
49
- assistantMessageToolbarThumbsDownLabel: 'Bad',
50
- assistantMessageToolbarReadAloudLabel: 'Read',
51
- assistantMessageToolbarRegenerateLabel: 'Regenerate'
52
- }
53
- }),
54
- CopilotChatViewHandlersService
55
- ]
56
- }).compileComponents();
57
-
58
- fixture = TestBed.createComponent(CopilotChatAssistantMessageComponent);
59
- component = fixture.componentInstance;
60
- component.message = mockMessage;
61
- fixture.detectChanges();
62
- });
63
-
64
- it('should create', () => {
65
- expect(component).toBeTruthy();
66
- });
67
-
68
- it('should display the message content', () => {
69
- const element = fixture.nativeElement;
70
- expect(element.textContent).toContain('Hello! This is a test message');
71
- });
72
-
73
- it('should set data-message-id attribute', () => {
74
- const element = fixture.nativeElement.querySelector('[data-message-id]');
75
- expect(element).toBeTruthy();
76
- expect(element.getAttribute('data-message-id')).toBe('test-msg-1');
77
- });
78
-
79
- it('should show toolbar when toolbarVisible is true', () => {
80
- component.toolbarVisible = true;
81
- fixture.detectChanges();
82
- const toolbar = fixture.nativeElement.querySelector('[copilotChatAssistantMessageToolbar]');
83
- expect(toolbar).toBeTruthy();
84
- });
85
-
86
- it('should hide toolbar when toolbarVisible is false', () => {
87
- // Create a fresh instance with toolbarVisible set to false from the start
88
- TestBed.resetTestingModule();
89
- TestBed.configureTestingModule({
90
- imports: [
91
- CommonModule,
92
- CopilotChatAssistantMessageComponent,
93
- CopilotChatAssistantMessageRendererComponent,
94
- CopilotChatAssistantMessageToolbarComponent
95
- ],
96
- providers: [
97
- provideCopilotKit({}),
98
- provideCopilotChatConfiguration({})
99
- ]
100
- });
101
-
102
- const newFixture = TestBed.createComponent(CopilotChatAssistantMessageComponent);
103
- const newComponent = newFixture.componentInstance;
104
- newComponent.message = mockMessage;
105
- newComponent.toolbarVisible = false;
106
- newFixture.detectChanges();
107
-
108
- const toolbar = newFixture.nativeElement.querySelector('[copilotChatAssistantMessageToolbar]');
109
- expect(toolbar).toBeFalsy();
110
- });
111
-
112
- it('should emit thumbsUp event when button is clicked', () => {
113
- let emittedEvent: any;
114
- component.thumbsUp.subscribe((event) => {
115
- emittedEvent = event;
116
- });
117
-
118
- component.handleThumbsUp();
119
- expect(emittedEvent).toEqual({ message: mockMessage });
120
- });
121
-
122
- it('should emit thumbsDown event when button is clicked', () => {
123
- let emittedEvent: any;
124
- component.thumbsDown.subscribe((event) => {
125
- emittedEvent = event;
126
- });
127
-
128
- component.handleThumbsDown();
129
- expect(emittedEvent).toEqual({ message: mockMessage });
130
- });
131
-
132
- it('should emit readAloud event when button is clicked', () => {
133
- let emittedEvent: any;
134
- component.readAloud.subscribe((event) => {
135
- emittedEvent = event;
136
- });
137
-
138
- component.handleReadAloud();
139
- expect(emittedEvent).toEqual({ message: mockMessage });
140
- });
141
-
142
- it('should emit regenerate event when button is clicked', () => {
143
- let emittedEvent: any;
144
- component.regenerate.subscribe((event) => {
145
- emittedEvent = event;
146
- });
147
-
148
- component.handleRegenerate();
149
- expect(emittedEvent).toEqual({ message: mockMessage });
150
- });
151
-
152
- it('should handle empty message content', () => {
153
- component.message = {
154
- ...mockMessage,
155
- content: ''
156
- };
157
- fixture.detectChanges();
158
- expect(component).toBeTruthy();
159
- });
160
-
161
- it('should support custom CSS class', () => {
162
- const customClass = 'custom-test-class';
163
- component.inputClass = customClass;
164
- fixture.detectChanges();
165
-
166
- const element = fixture.nativeElement.querySelector('div');
167
- expect(element.className).toContain(customClass);
168
- });
169
- });
170
-
171
- describe('CopilotChatAssistantMessageComponent with code blocks', () => {
172
- let component: CopilotChatAssistantMessageComponent;
173
- let fixture: ComponentFixture<CopilotChatAssistantMessageComponent>;
174
-
175
- const codeMessage: AssistantMessage = {
176
- id: 'test-code-1',
177
- role: 'assistant',
178
- content: `Here's a code example:
179
- \`\`\`typescript
180
- function hello(name: string): string {
181
- return \`Hello, \${name}!\`;
182
- }
183
- \`\`\``,
184
- createdAt: new Date()
185
- };
186
-
187
- beforeEach(async () => {
188
- await TestBed.configureTestingModule({
189
- imports: [
190
- CommonModule,
191
- CopilotChatAssistantMessageComponent,
192
- CopilotChatAssistantMessageRendererComponent
193
- ],
194
- providers: [
195
- provideCopilotKit({}),
196
- provideCopilotChatConfiguration({})
197
- ]
198
- }).compileComponents();
199
-
200
- fixture = TestBed.createComponent(CopilotChatAssistantMessageComponent);
201
- component = fixture.componentInstance;
202
- component.message = codeMessage;
203
- fixture.detectChanges();
204
- });
205
-
206
- it('should render code blocks', () => {
207
- const element = fixture.nativeElement;
208
- const codeBlock = element.querySelector('.code-block-container');
209
- expect(codeBlock).toBeTruthy();
210
- });
211
-
212
- it('should display language label for code blocks', () => {
213
- const element = fixture.nativeElement;
214
- const languageLabel = element.querySelector('.code-block-language');
215
- expect(languageLabel).toBeTruthy();
216
- expect(languageLabel.textContent).toBe('typescript');
217
- });
218
-
219
- it('should have copy button for code blocks', () => {
220
- const element = fixture.nativeElement;
221
- const copyButton = element.querySelector('.code-block-copy-button');
222
- expect(copyButton).toBeTruthy();
223
- });
224
- });
225
-
226
- describe('CopilotChatAssistantMessageComponent with custom slots', () => {
227
- @Component({
228
- selector: 'test-host',
229
- template: `
230
- <copilot-chat-assistant-message [message]="message">
231
- <ng-template #markdownRenderer let-content="content">
232
- <div class="custom-renderer">{{ content }}</div>
233
- </ng-template>
234
-
235
- <ng-template #copyButton let-onClick="onClick">
236
- <button class="custom-copy-btn" (click)="onClick()">Custom Copy</button>
237
- </ng-template>
238
- </copilot-chat-assistant-message>
239
- `,
240
- standalone: true,
241
- imports: [CommonModule, CopilotChatAssistantMessageComponent]
242
- })
243
- class TestHostComponent {
244
- message: AssistantMessage = {
245
- id: 'test-custom-1',
246
- role: 'assistant',
247
- content: 'Custom slot test message',
248
- createdAt: new Date()
249
- };
250
- }
251
-
252
- let component: TestHostComponent;
253
- let fixture: ComponentFixture<TestHostComponent>;
254
-
255
- beforeEach(async () => {
256
- await TestBed.configureTestingModule({
257
- imports: [TestHostComponent],
258
- providers: [
259
- provideCopilotKit({}),
260
- provideCopilotChatConfiguration({})
261
- ]
262
- }).compileComponents();
263
-
264
- fixture = TestBed.createComponent(TestHostComponent);
265
- component = fixture.componentInstance;
266
- fixture.detectChanges();
267
- });
268
-
269
- it('should use custom markdown renderer slot', () => {
270
- const element = fixture.nativeElement;
271
- const customRenderer = element.querySelector('.custom-renderer');
272
- expect(customRenderer).toBeTruthy();
273
- expect(customRenderer.textContent).toBe('Custom slot test message');
274
- });
275
-
276
- it('should use custom copy button slot', () => {
277
- const element = fixture.nativeElement;
278
- const customCopyBtn = element.querySelector('.custom-copy-btn');
279
- expect(customCopyBtn).toBeTruthy();
280
- expect(customCopyBtn.textContent).toBe('Custom Copy');
281
- });
282
- });