@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.
- package/README.md +248 -0
- package/dist/README.md +248 -0
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +430 -0
- package/dist/esm2022/core/copilotkit.types.mjs +12 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/styles.css +0 -27
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -39
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/README-agent-context.md +0 -310
- package/ng-package.json +0 -19
- package/slots.md +0 -331
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
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
|
-
});
|