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