@copilotkitnext/angular 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +3 -3
  2. package/dist/README.md +3 -3
  3. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
  4. package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
  5. package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
  6. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
  7. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
  8. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
  9. package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
  10. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  11. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
  12. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
  13. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
  14. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
  15. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
  16. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
  17. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
  18. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
  19. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
  20. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
  21. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
  22. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
  23. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
  24. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
  25. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
  26. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
  27. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
  28. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
  29. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
  30. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
  31. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
  32. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
  33. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
  34. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
  35. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
  36. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
  37. package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
  38. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
  39. package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
  40. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
  41. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
  42. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
  43. package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
  44. package/dist/esm2022/core/copilotkit.service.mjs +430 -0
  45. package/dist/esm2022/core/copilotkit.types.mjs +12 -0
  46. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
  47. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
  48. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
  49. package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
  50. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
  51. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
  52. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
  53. package/dist/esm2022/index.mjs +70 -0
  54. package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
  55. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
  56. package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
  57. package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
  58. package/dist/esm2022/lib/utils.mjs +10 -0
  59. package/dist/esm2022/services/resize-observer.service.mjs +152 -0
  60. package/dist/esm2022/services/scroll-position.service.mjs +124 -0
  61. package/dist/esm2022/types/frontend-tool.mjs +2 -0
  62. package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
  63. package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
  64. package/dist/esm2022/utils/agent.utils.mjs +204 -0
  65. package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
  66. package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
  67. package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
  68. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
  69. package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
  70. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  71. package/package.json +21 -18
  72. package/vitest.config.mts +32 -21
  73. package/.turbo/turbo-build.log +0 -38
  74. package/.turbo/turbo-check-types.log +0 -0
  75. package/.turbo/turbo-test.log +0 -71
  76. package/ng-package.json +0 -19
  77. package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
  78. package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
  79. package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
  80. package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
  81. package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
  82. package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
  83. package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
  84. package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
  85. package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
  86. package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
  87. package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
  88. package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
  89. package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
  90. package/src/components/chat/copilot-chat-input.component.ts +0 -512
  91. package/src/components/chat/copilot-chat-input.types.ts +0 -148
  92. package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
  93. package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
  94. package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
  95. package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
  96. package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
  97. package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
  98. package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
  99. package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
  100. package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
  101. package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
  102. package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
  103. package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
  104. package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
  105. package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
  106. package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
  107. package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
  108. package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
  109. package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
  110. package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
  111. package/src/components/chat/copilot-chat-view.component.ts +0 -420
  112. package/src/components/chat/copilot-chat-view.types.ts +0 -52
  113. package/src/components/chat/copilot-chat.component.ts +0 -232
  114. package/src/components/copilotkit-tool-render.component.ts +0 -169
  115. package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
  116. package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
  117. package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
  118. package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
  119. package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
  120. package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
  121. package/src/core/copilotkit.providers.ts +0 -59
  122. package/src/core/copilotkit.service.ts +0 -542
  123. package/src/core/copilotkit.types.ts +0 -132
  124. package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
  125. package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
  126. package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
  127. package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
  128. package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
  129. package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
  130. package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
  131. package/src/directives/copilotkit-agent-context.directive.ts +0 -138
  132. package/src/directives/copilotkit-agent.directive.ts +0 -225
  133. package/src/directives/copilotkit-chat-config.directive.ts +0 -241
  134. package/src/directives/copilotkit-config.directive.ts +0 -81
  135. package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
  136. package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
  137. package/src/directives/stick-to-bottom.directive.ts +0 -204
  138. package/src/index.ts +0 -105
  139. package/src/lib/directives/tooltip.directive.ts +0 -292
  140. package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
  141. package/src/lib/slots/copilot-slot.component.ts +0 -135
  142. package/src/lib/slots/index.ts +0 -3
  143. package/src/lib/slots/slot.types.ts +0 -64
  144. package/src/lib/slots/slot.utils.ts +0 -289
  145. package/src/lib/utils.ts +0 -10
  146. package/src/public-api.ts +0 -1
  147. package/src/services/resize-observer.service.ts +0 -181
  148. package/src/services/scroll-position.service.ts +0 -169
  149. package/src/styles/globals.css +0 -266
  150. package/src/styles/index.css +0 -3
  151. package/src/test-setup.ts +0 -15
  152. package/src/testing/index.ts +0 -3
  153. package/src/testing/testing.utils.ts +0 -248
  154. package/src/types/frontend-tool.ts +0 -44
  155. package/src/types/human-in-the-loop.ts +0 -52
  156. package/src/utils/__tests__/agent.utils.spec.ts +0 -234
  157. package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
  158. package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
  159. package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
  160. package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
  161. package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
  162. package/src/utils/agent-context.utils.ts +0 -133
  163. package/src/utils/agent.utils.ts +0 -239
  164. package/src/utils/chat-config.utils.ts +0 -221
  165. package/src/utils/copilotkit.utils.ts +0 -20
  166. package/src/utils/frontend-tool.utils.ts +0 -266
  167. package/src/utils/human-in-the-loop.utils.ts +0 -359
  168. package/tsconfig.spec.json +0 -12
@@ -1,170 +0,0 @@
1
- import {
2
- Component,
3
- Input,
4
- Output,
5
- EventEmitter,
6
- signal,
7
- computed,
8
- ChangeDetectionStrategy,
9
- ChangeDetectorRef,
10
- ViewEncapsulation,
11
- inject
12
- } from '@angular/core';
13
- import { CommonModule } from '@angular/common';
14
- import { LucideAngularModule, Copy, Check, Edit } from 'lucide-angular';
15
- import { CopilotTooltipDirective } from '../../lib/directives/tooltip.directive';
16
- import { CopilotChatConfigurationService } from '../../core/chat-configuration/chat-configuration.service';
17
- import { cn } from '../../lib/utils';
18
-
19
- // Base toolbar button component
20
- @Component({
21
- selector: 'button[copilotChatUserMessageToolbarButton]',
22
- standalone: true,
23
- imports: [CommonModule],
24
- changeDetection: ChangeDetectionStrategy.OnPush,
25
- encapsulation: ViewEncapsulation.None,
26
- template: `
27
- <ng-content></ng-content>
28
- `,
29
- host: {
30
- '[class]': 'computedClass()',
31
- '[attr.disabled]': 'disabled ? true : null',
32
- 'type': 'button',
33
- '[attr.aria-label]': 'title'
34
- },
35
- hostDirectives: [
36
- {
37
- directive: CopilotTooltipDirective,
38
- inputs: ['copilotTooltip: title', 'tooltipPosition', 'tooltipDelay']
39
- }
40
- ]
41
- })
42
- export class CopilotChatUserMessageToolbarButtonComponent {
43
- @Input() title = '';
44
- @Input() disabled = false;
45
- @Input() set inputClass(value: string | undefined) {
46
- this.customClass.set(value);
47
- }
48
-
49
- private customClass = signal<string | undefined>(undefined);
50
-
51
- computedClass = computed(() => {
52
- return cn(
53
- // Flex centering
54
- 'inline-flex items-center justify-center',
55
- // Cursor
56
- 'cursor-pointer',
57
- // Background and text
58
- 'p-0 text-[rgb(93,93,93)] hover:bg-[#E8E8E8]',
59
- // Dark mode
60
- 'dark:text-[rgb(243,243,243)] dark:hover:bg-[#303030]',
61
- // Shape and sizing
62
- 'h-8 w-8 rounded-md',
63
- // Interactions
64
- 'transition-colors',
65
- // Hover states
66
- 'hover:text-[rgb(93,93,93)]',
67
- 'dark:hover:text-[rgb(243,243,243)]',
68
- // Focus states
69
- 'focus:outline-none focus:ring-2 focus:ring-offset-2',
70
- // Disabled state
71
- 'disabled:opacity-50 disabled:cursor-not-allowed',
72
- this.customClass()
73
- );
74
- });
75
- }
76
-
77
- // Copy button component
78
- @Component({
79
- selector: 'copilot-chat-user-message-copy-button',
80
- standalone: true,
81
- imports: [CommonModule, LucideAngularModule, CopilotChatUserMessageToolbarButtonComponent],
82
- changeDetection: ChangeDetectionStrategy.OnPush,
83
- encapsulation: ViewEncapsulation.None,
84
- template: `
85
- <button
86
- copilotChatUserMessageToolbarButton
87
- [title]="title || labels.userMessageToolbarCopyMessageLabel"
88
- [disabled]="disabled"
89
- [inputClass]="inputClass"
90
- (click)="handleCopy()">
91
- @if (copied()) {
92
- <lucide-angular [img]="CheckIcon" [size]="18"></lucide-angular>
93
- } @else {
94
- <lucide-angular [img]="CopyIcon" [size]="18"></lucide-angular>
95
- }
96
- </button>
97
- `
98
- })
99
- export class CopilotChatUserMessageCopyButtonComponent {
100
- @Input() title?: string;
101
- @Input() disabled = false;
102
- @Input() inputClass?: string;
103
- @Input() content?: string;
104
- @Output() clicked = new EventEmitter<void>();
105
-
106
- readonly CopyIcon = Copy;
107
- readonly CheckIcon = Check;
108
-
109
- copied = signal(false);
110
- private chatConfig = inject(CopilotChatConfigurationService);
111
-
112
- get labels() {
113
- return this.chatConfig.labels();
114
- }
115
-
116
- handleCopy(): void {
117
- if (!this.content) return;
118
-
119
- // Set copied immediately for instant feedback
120
- this.copied.set(true);
121
- setTimeout(() => this.copied.set(false), 2000);
122
-
123
- // Copy to clipboard (fire and forget)
124
- navigator.clipboard.writeText(this.content).then(
125
- () => this.clicked.emit(),
126
- (err) => {
127
- console.error('Failed to copy message:', err);
128
- this.copied.set(false);
129
- }
130
- );
131
- }
132
- }
133
-
134
- // Edit button component
135
- @Component({
136
- selector: 'copilot-chat-user-message-edit-button',
137
- standalone: true,
138
- imports: [CommonModule, LucideAngularModule, CopilotChatUserMessageToolbarButtonComponent],
139
- changeDetection: ChangeDetectionStrategy.OnPush,
140
- encapsulation: ViewEncapsulation.None,
141
- template: `
142
- <button
143
- copilotChatUserMessageToolbarButton
144
- [title]="title || labels.userMessageToolbarEditMessageLabel"
145
- [disabled]="disabled"
146
- [inputClass]="inputClass"
147
- (click)="handleEdit()">
148
- <lucide-angular [img]="EditIcon" [size]="18"></lucide-angular>
149
- </button>
150
- `
151
- })
152
- export class CopilotChatUserMessageEditButtonComponent {
153
- @Input() title?: string;
154
- @Input() disabled = false;
155
- @Input() inputClass?: string;
156
- @Output() clicked = new EventEmitter<void>();
157
-
158
- readonly EditIcon = Edit;
159
- private chatConfig = inject(CopilotChatConfigurationService);
160
-
161
- get labels() {
162
- return this.chatConfig.labels();
163
- }
164
-
165
- handleEdit(): void {
166
- if (!this.disabled) {
167
- this.clicked.emit();
168
- }
169
- }
170
- }
@@ -1,37 +0,0 @@
1
- import {
2
- Component,
3
- Input,
4
- ChangeDetectionStrategy,
5
- ViewEncapsulation,
6
- computed,
7
- signal
8
- } from '@angular/core';
9
- import { CommonModule } from '@angular/common';
10
- import { cn } from '../../lib/utils';
11
-
12
- @Component({
13
- selector: 'copilot-chat-user-message-renderer',
14
- standalone: true,
15
- imports: [CommonModule],
16
- changeDetection: ChangeDetectionStrategy.OnPush,
17
- encapsulation: ViewEncapsulation.None,
18
- host: {
19
- '[class]': 'computedClass()'
20
- },
21
- template: `{{ content }}`
22
- })
23
- export class CopilotChatUserMessageRendererComponent {
24
- @Input() content = '';
25
- @Input() set inputClass(value: string | undefined) {
26
- this.customClass.set(value);
27
- }
28
-
29
- private customClass = signal<string | undefined>(undefined);
30
-
31
- computedClass = computed(() => {
32
- return cn(
33
- "prose dark:prose-invert bg-muted relative max-w-[80%] rounded-[18px] px-4 py-1.5 data-[multiline]:py-3 inline-block whitespace-pre-wrap",
34
- this.customClass()
35
- );
36
- });
37
- }
@@ -1,37 +0,0 @@
1
- import {
2
- Component,
3
- Input,
4
- ChangeDetectionStrategy,
5
- ViewEncapsulation,
6
- signal
7
- } from '@angular/core';
8
- import { CommonModule } from '@angular/common';
9
- import { cn } from '../../lib/utils';
10
-
11
- @Component({
12
- selector: 'div[copilotChatUserMessageToolbar]',
13
- standalone: true,
14
- imports: [CommonModule],
15
- changeDetection: ChangeDetectionStrategy.OnPush,
16
- encapsulation: ViewEncapsulation.None,
17
- template: `
18
- <ng-content></ng-content>
19
- `,
20
- host: {
21
- '[class]': 'computedClass()'
22
- }
23
- })
24
- export class CopilotChatUserMessageToolbarComponent {
25
- @Input() inputClass?: string;
26
-
27
- computedClass = signal<string>('');
28
-
29
- ngOnInit() {
30
- this.computedClass.set(
31
- cn(
32
- "w-full bg-transparent flex items-center justify-end mt-[4px] invisible group-hover:visible",
33
- this.inputClass
34
- )
35
- );
36
- }
37
- }
@@ -1,247 +0,0 @@
1
- import {
2
- Component,
3
- Input,
4
- Output,
5
- EventEmitter,
6
- TemplateRef,
7
- ContentChild,
8
- signal,
9
- computed,
10
- Type,
11
- ChangeDetectionStrategy,
12
- ViewEncapsulation
13
- } from '@angular/core';
14
- import { CommonModule } from '@angular/common';
15
- import { CopilotSlotComponent } from '../../lib/slots/copilot-slot.component';
16
- import {
17
- type UserMessage,
18
- type CopilotChatUserMessageOnEditMessageProps,
19
- type CopilotChatUserMessageOnSwitchToBranchProps,
20
- type MessageRendererContext,
21
- type CopyButtonContext,
22
- type EditButtonContext,
23
- type BranchNavigationContext,
24
- type ToolbarContext
25
- } from './copilot-chat-user-message.types';
26
- import { CopilotChatUserMessageRendererComponent } from './copilot-chat-user-message-renderer.component';
27
- import {
28
- CopilotChatUserMessageCopyButtonComponent,
29
- CopilotChatUserMessageEditButtonComponent
30
- } from './copilot-chat-user-message-buttons.component';
31
- import { CopilotChatUserMessageToolbarComponent } from './copilot-chat-user-message-toolbar.component';
32
- import { CopilotChatUserMessageBranchNavigationComponent } from './copilot-chat-user-message-branch-navigation.component';
33
- import { cn } from '../../lib/utils';
34
-
35
- @Component({
36
- selector: 'copilot-chat-user-message',
37
- standalone: true,
38
- imports: [
39
- CommonModule,
40
- CopilotSlotComponent,
41
- CopilotChatUserMessageRendererComponent,
42
- CopilotChatUserMessageCopyButtonComponent,
43
- CopilotChatUserMessageEditButtonComponent,
44
- CopilotChatUserMessageToolbarComponent,
45
- CopilotChatUserMessageBranchNavigationComponent
46
- ],
47
- changeDetection: ChangeDetectionStrategy.OnPush,
48
- encapsulation: ViewEncapsulation.None,
49
- template: `
50
- <div
51
- [class]="computedClass()"
52
- [attr.data-message-id]="message.id">
53
-
54
- <!-- Message Renderer -->
55
- @if (messageRendererTemplate || messageRendererComponent) {
56
- <copilot-slot
57
- [slot]="messageRendererTemplate || messageRendererComponent"
58
- [context]="messageRendererContext()"
59
- [defaultComponent]="CopilotChatUserMessageRendererComponent"
60
- >
61
- </copilot-slot>
62
- } @else {
63
- <copilot-chat-user-message-renderer
64
- [content]="message.content || ''"
65
- [inputClass]="messageRendererClass">
66
- </copilot-chat-user-message-renderer>
67
- }
68
-
69
- <!-- Toolbar -->
70
- @if (toolbarTemplate || toolbarComponent) {
71
- <copilot-slot
72
- [slot]="toolbarTemplate || toolbarComponent"
73
- [context]="toolbarContext()"
74
- [defaultComponent]="CopilotChatUserMessageToolbarComponent"
75
- >
76
- </copilot-slot>
77
- } @else {
78
- <div copilotChatUserMessageToolbar [inputClass]="toolbarClass">
79
- <div class="flex items-center gap-1 justify-end">
80
- <!-- Additional toolbar items -->
81
- @if (additionalToolbarItems) {
82
- <ng-container *ngTemplateOutlet="additionalToolbarItems"></ng-container>
83
- }
84
-
85
- <!-- Copy button -->
86
- @if (copyButtonTemplate || copyButtonComponent) {
87
- <copilot-slot
88
- [slot]="copyButtonTemplate || copyButtonComponent"
89
- [context]="{ content: message?.content || '' }"
90
- [outputs]="copyButtonOutputs"
91
- [defaultComponent]="CopilotChatUserMessageCopyButtonComponent"
92
- >
93
- </copilot-slot>
94
- } @else {
95
- <copilot-chat-user-message-copy-button
96
- [content]="message.content"
97
- [inputClass]="copyButtonClass"
98
- (clicked)="handleCopy()">
99
- </copilot-chat-user-message-copy-button>
100
- }
101
-
102
- <!-- Edit button -->
103
- @if (editMessage.observed) {
104
- @if (editButtonTemplate || editButtonComponent) {
105
- <copilot-slot
106
- [slot]="editButtonTemplate || editButtonComponent"
107
- [context]="{}"
108
- [outputs]="editButtonOutputs"
109
- [defaultComponent]="CopilotChatUserMessageEditButtonComponent"
110
- >
111
- </copilot-slot>
112
- } @else {
113
- <copilot-chat-user-message-edit-button
114
- [inputClass]="editButtonClass"
115
- (clicked)="handleEdit()">
116
- </copilot-chat-user-message-edit-button>
117
- }
118
- }
119
-
120
- <!-- Branch navigation -->
121
- @if (showBranchNavigation()) {
122
- @if (branchNavigationTemplate || branchNavigationComponent) {
123
- <copilot-slot
124
- [slot]="branchNavigationTemplate || branchNavigationComponent"
125
- [context]="branchNavigationContext()"
126
- [defaultComponent]="CopilotChatUserMessageBranchNavigationComponent"
127
- >
128
- </copilot-slot>
129
- } @else {
130
- <copilot-chat-user-message-branch-navigation
131
- [currentBranch]="branchIndexSignal()"
132
- [numberOfBranches]="numberOfBranchesSignal()"
133
- [message]="message"
134
- [inputClass]="branchNavigationClass"
135
- (switchToBranch)="handleSwitchToBranch($event)">
136
- </copilot-chat-user-message-branch-navigation>
137
- }
138
- }
139
- </div>
140
- </div>
141
- }
142
- </div>
143
- `,
144
- styles: [`
145
- :host {
146
- display: block;
147
- width: 100%;
148
- }
149
- `]
150
- })
151
- export class CopilotChatUserMessageComponent {
152
- // Capture templates from content projection
153
- @ContentChild('messageRenderer', { read: TemplateRef }) messageRendererTemplate?: TemplateRef<MessageRendererContext>;
154
- @ContentChild('toolbar', { read: TemplateRef }) toolbarTemplate?: TemplateRef<ToolbarContext>;
155
- @ContentChild('copyButton', { read: TemplateRef }) copyButtonTemplate?: TemplateRef<CopyButtonContext>;
156
- @ContentChild('editButton', { read: TemplateRef }) editButtonTemplate?: TemplateRef<EditButtonContext>;
157
- @ContentChild('branchNavigation', { read: TemplateRef }) branchNavigationTemplate?: TemplateRef<BranchNavigationContext>;
158
-
159
- // Props for tweaking default components
160
- @Input() messageRendererClass?: string;
161
- @Input() toolbarClass?: string;
162
- @Input() copyButtonClass?: string;
163
- @Input() editButtonClass?: string;
164
- @Input() branchNavigationClass?: string;
165
-
166
- // Component inputs for overrides
167
- @Input() messageRendererComponent?: Type<any>;
168
- @Input() toolbarComponent?: Type<any>;
169
- @Input() copyButtonComponent?: Type<any>;
170
- @Input() editButtonComponent?: Type<any>;
171
- @Input() branchNavigationComponent?: Type<any>;
172
-
173
- // Regular inputs
174
- @Input() message!: UserMessage;
175
- @Input() set branchIndex(val: number | undefined) {
176
- this.branchIndexSignal.set(val ?? 0);
177
- }
178
- @Input() set numberOfBranches(val: number | undefined) {
179
- this.numberOfBranchesSignal.set(val ?? 1);
180
- }
181
- @Input() additionalToolbarItems?: TemplateRef<any>;
182
- @Input() set inputClass(val: string | undefined) {
183
- this.customClass.set(val);
184
- }
185
-
186
- // Output events
187
- @Output() editMessage = new EventEmitter<CopilotChatUserMessageOnEditMessageProps>();
188
- @Output() switchToBranch = new EventEmitter<CopilotChatUserMessageOnSwitchToBranchProps>();
189
-
190
- // Signals
191
- branchIndexSignal = signal(0);
192
- numberOfBranchesSignal = signal(1);
193
- customClass = signal<string | undefined>(undefined);
194
-
195
- // Default components
196
- CopilotChatUserMessageRendererComponent = CopilotChatUserMessageRendererComponent;
197
- CopilotChatUserMessageToolbarComponent = CopilotChatUserMessageToolbarComponent;
198
- CopilotChatUserMessageCopyButtonComponent = CopilotChatUserMessageCopyButtonComponent;
199
- CopilotChatUserMessageEditButtonComponent = CopilotChatUserMessageEditButtonComponent;
200
- CopilotChatUserMessageBranchNavigationComponent = CopilotChatUserMessageBranchNavigationComponent;
201
-
202
- // Computed values
203
- showBranchNavigation = computed(() => {
204
- const branches = this.numberOfBranchesSignal();
205
- return branches > 1 && this.switchToBranch.observed;
206
- });
207
-
208
- computedClass = computed(() => {
209
- return cn(
210
- "flex flex-col items-end group pt-10",
211
- this.customClass()
212
- );
213
- });
214
-
215
- // Context for slots (reactive via signals)
216
- messageRendererContext = computed<MessageRendererContext>(() => ({
217
- content: this.message?.content || ''
218
- }));
219
-
220
- // Output maps for slots
221
- copyButtonOutputs = { clicked: () => this.handleCopy() };
222
- editButtonOutputs = { clicked: () => this.handleEdit() };
223
-
224
- branchNavigationContext = computed<BranchNavigationContext>(() => ({
225
- currentBranch: this.branchIndexSignal(),
226
- numberOfBranches: this.numberOfBranchesSignal(),
227
- onSwitchToBranch: (props) => this.handleSwitchToBranch(props),
228
- message: this.message
229
- }));
230
-
231
- toolbarContext = computed<ToolbarContext>(() => ({
232
- children: null // Will be populated by the toolbar content
233
- }));
234
-
235
- handleCopy(): void {
236
- // Copy is handled by the button component itself
237
- // This is just for any additional logic if needed
238
- }
239
-
240
- handleEdit(): void {
241
- this.editMessage.emit({ message: this.message });
242
- }
243
-
244
- handleSwitchToBranch(props: CopilotChatUserMessageOnSwitchToBranchProps): void {
245
- this.switchToBranch.emit(props);
246
- }
247
- }
@@ -1,42 +0,0 @@
1
- export interface UserMessage {
2
- id: string;
3
- content?: string;
4
- role: 'user';
5
- timestamp?: Date;
6
- [key: string]: any; // Allow additional properties
7
- }
8
-
9
- export interface CopilotChatUserMessageOnEditMessageProps {
10
- message: UserMessage;
11
- }
12
-
13
- export interface CopilotChatUserMessageOnSwitchToBranchProps {
14
- message: UserMessage;
15
- branchIndex: number;
16
- numberOfBranches: number;
17
- }
18
-
19
- // Context interfaces for slots
20
- export interface MessageRendererContext {
21
- content: string;
22
- }
23
-
24
- export interface CopyButtonContext {
25
- content?: string;
26
- copied?: boolean;
27
- }
28
-
29
- export interface EditButtonContext {
30
- // Empty context - click handled via outputs map
31
- }
32
-
33
- export interface BranchNavigationContext {
34
- currentBranch: number;
35
- numberOfBranches: number;
36
- onSwitchToBranch?: (props: CopilotChatUserMessageOnSwitchToBranchProps) => void;
37
- message: UserMessage;
38
- }
39
-
40
- export interface ToolbarContext {
41
- children?: any;
42
- }
@@ -1,51 +0,0 @@
1
- import {
2
- Component,
3
- Input,
4
- ChangeDetectionStrategy,
5
- ViewEncapsulation,
6
- inject,
7
- } from "@angular/core";
8
- import { CommonModule } from "@angular/common";
9
- import { CopilotChatConfigurationService } from "../../core/chat-configuration/chat-configuration.service";
10
- import { cn } from "../../lib/utils";
11
-
12
- /**
13
- * Disclaimer component for CopilotChatView
14
- * Shows configurable disclaimer text below the input
15
- * Integrates with CopilotChatConfigurationService for labels
16
- */
17
- @Component({
18
- selector: "copilot-chat-view-disclaimer",
19
- standalone: true,
20
- imports: [CommonModule],
21
- changeDetection: ChangeDetectionStrategy.OnPush,
22
- encapsulation: ViewEncapsulation.None,
23
- template: `
24
- <div [class]="computedClass">
25
- {{ disclaimerText }}
26
- </div>
27
- `,
28
- })
29
- export class CopilotChatViewDisclaimerComponent {
30
- @Input() inputClass?: string;
31
- @Input() text?: string;
32
-
33
- private configService = inject(CopilotChatConfigurationService);
34
-
35
- // Get disclaimer text from input or configuration
36
- get disclaimerText(): string {
37
- if (this.text) {
38
- return this.text;
39
- }
40
-
41
- return this.configService.labels().chatDisclaimerText;
42
- }
43
-
44
- // Computed class matching React exactly
45
- get computedClass(): string {
46
- return cn(
47
- "text-center text-xs text-muted-foreground py-3 px-4 max-w-3xl mx-auto",
48
- this.inputClass
49
- );
50
- }
51
- }
@@ -1,47 +0,0 @@
1
- import {
2
- Component,
3
- Input,
4
- ChangeDetectionStrategy,
5
- ViewEncapsulation
6
- } from '@angular/core';
7
- import { CommonModule } from '@angular/common';
8
- import { cn } from '../../lib/utils';
9
-
10
- /**
11
- * Feather component for CopilotChatView
12
- * Creates a gradient overlay effect between messages and input
13
- * Matches React implementation exactly with same Tailwind classes
14
- */
15
- @Component({
16
- selector: 'copilot-chat-view-feather',
17
- standalone: true,
18
- imports: [CommonModule],
19
- changeDetection: ChangeDetectionStrategy.OnPush,
20
- encapsulation: ViewEncapsulation.None,
21
- template: `
22
- <div
23
- [class]="computedClass"
24
- [style]="style">
25
- </div>
26
- `
27
- })
28
- export class CopilotChatViewFeatherComponent {
29
- @Input() inputClass?: string;
30
- @Input() style?: { [key: string]: any };
31
-
32
- // Computed class matching React exactly
33
- get computedClass(): string {
34
- return cn(
35
- // Positioning
36
- 'absolute bottom-0 left-0 right-4 h-24 pointer-events-none z-10',
37
- // Gradient
38
- 'bg-gradient-to-t',
39
- // Light mode colors
40
- 'from-white via-white to-transparent',
41
- // Dark mode colors
42
- 'dark:from-[rgb(33,33,33)] dark:via-[rgb(33,33,33)]',
43
- // Custom classes
44
- this.inputClass
45
- );
46
- }
47
- }
@@ -1,14 +0,0 @@
1
- import { Injectable, signal } from '@angular/core';
2
-
3
- @Injectable({ providedIn: 'root' })
4
- export class CopilotChatViewHandlersService {
5
- // Assistant message handler availability
6
- hasAssistantThumbsUpHandler = signal(false);
7
- hasAssistantThumbsDownHandler = signal(false);
8
- hasAssistantReadAloudHandler = signal(false);
9
- hasAssistantRegenerateHandler = signal(false);
10
-
11
- // User message handler availability
12
- hasUserCopyHandler = signal(false);
13
- hasUserEditHandler = signal(false);
14
- }