@doderasoftware/restify-ai 0.2.0-beta.2 → 0.2.0-beta.3
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 +253 -14
- package/dist/components/AiChatDrawer.vue.d.ts +25 -3
- package/dist/components/AiChatDrawer.vue.d.ts.map +1 -1
- package/dist/components/ChatInput.vue.d.ts +10 -0
- package/dist/components/ChatInput.vue.d.ts.map +1 -1
- package/dist/components/ChatMessage.vue.d.ts.map +1 -1
- package/dist/components/drawer/ConversationHistory.vue.d.ts +3 -0
- package/dist/components/drawer/ConversationHistory.vue.d.ts.map +1 -0
- package/dist/components/drawer/DrawerHeader.vue.d.ts +4 -0
- package/dist/components/drawer/DrawerHeader.vue.d.ts.map +1 -1
- package/dist/components/drawer/DrawerMessageList.vue.d.ts.map +1 -1
- package/dist/components/icons/IconHistory.vue.d.ts +3 -0
- package/dist/components/icons/IconHistory.vue.d.ts.map +1 -0
- package/dist/components/icons/IconMicrophone.vue.d.ts +3 -0
- package/dist/components/icons/IconMicrophone.vue.d.ts.map +1 -0
- package/dist/components/icons/IconMicrophoneOff.vue.d.ts +3 -0
- package/dist/components/icons/IconMicrophoneOff.vue.d.ts.map +1 -0
- package/dist/components/icons/index.d.ts +3 -0
- package/dist/components/icons/index.d.ts.map +1 -1
- package/dist/components/input/AudioWave.vue.d.ts +29 -0
- package/dist/components/input/AudioWave.vue.d.ts.map +1 -0
- package/dist/components/input/InputActions.vue.d.ts +24 -3
- package/dist/components/input/InputActions.vue.d.ts.map +1 -1
- package/dist/composables/useChatInput.d.ts +2 -0
- package/dist/composables/useChatInput.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/restify-ai.js +2962 -2388
- package/dist/restify-ai.umd.cjs +52 -52
- package/dist/store/storage.d.ts +10 -1
- package/dist/store/storage.d.ts.map +1 -1
- package/dist/store/store.d.ts +42 -0
- package/dist/store/store.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/chat.d.ts +12 -0
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/config.d.ts +28 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/texts.d.ts +8 -0
- package/dist/types/texts.d.ts.map +1 -1
- package/dist/types/ui.d.ts +11 -3
- package/dist/types/ui.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,6 +15,7 @@ A production-ready AI chatbot component for Vue 3 with real-time SSE streaming,
|
|
|
15
15
|
|
|
16
16
|
- 🌊 **Real-time SSE Streaming** - Smooth character-by-character response streaming
|
|
17
17
|
- 📎 **File Attachments** - Upload and process documents, images, and more
|
|
18
|
+
- 🎤 **Audio Input** - Voice recording with visual feedback and wave animation
|
|
18
19
|
- 👥 **@Mentions System** - Reference entities from your application (employees, jobs, projects, etc.)
|
|
19
20
|
- 💡 **Context-Aware Suggestions** - Smart prompts based on current page/route
|
|
20
21
|
- 💬 **Chat History** - Persistent conversation memory with configurable limits
|
|
@@ -276,6 +277,10 @@ export function setupRestifyAi(app: App) {
|
|
|
276
277
|
keyboardShortcut: 'mod+g', // 'mod' = Cmd on Mac, Ctrl on Windows
|
|
277
278
|
enableSupportMode: true,
|
|
278
279
|
useQuota: true, // Enable quota management
|
|
280
|
+
useHeadersRateLimiter: true, // Use rate limit headers instead of quota endpoint
|
|
281
|
+
useConversationId: true, // Enable conversation ID tracking
|
|
282
|
+
useConversationHistory: true, // Enable conversation history sidebar
|
|
283
|
+
maxConversationHistory: 10, // Max conversations to store (default: 10)
|
|
279
284
|
canToggle: () => true,
|
|
280
285
|
|
|
281
286
|
// ═══════════════════════════════════════════════════════════════
|
|
@@ -332,6 +337,9 @@ export function setupRestifyAi(app: App) {
|
|
|
332
337
|
| `showCloseButton` | `boolean` | `true` | Show close button |
|
|
333
338
|
| `showNewChatButton` | `boolean` | `true` | Show new chat button |
|
|
334
339
|
| `confirmClose` | `boolean` | `true` | Confirm before clearing history |
|
|
340
|
+
| `enableAudioInput` | `boolean` | `false` | Enable voice recording button |
|
|
341
|
+
| `isRecording` | `boolean` | `false` | Audio recording state (controlled) |
|
|
342
|
+
| `inputValue` | `string` | `''` | Input text value (v-model:inputValue) |
|
|
335
343
|
| `autoFetchQuota` | `boolean` | `true` | Auto-fetch quota when opened |
|
|
336
344
|
| `historyLimit` | `HistoryLimitConfig` | - | History limit configuration |
|
|
337
345
|
| `loadingText` | `LoadingTextConfig` | - | Loading text configuration |
|
|
@@ -374,14 +382,84 @@ function handleContactSupport() {
|
|
|
374
382
|
</script>
|
|
375
383
|
```
|
|
376
384
|
|
|
385
|
+
### Audio Input Example
|
|
386
|
+
|
|
387
|
+
Enable voice recording with the `enableAudioInput` prop and handle the recording state:
|
|
388
|
+
|
|
389
|
+
```vue
|
|
390
|
+
<template>
|
|
391
|
+
<AiChatDrawer
|
|
392
|
+
v-model="aiStore.showChat"
|
|
393
|
+
v-model:input-value="audioInput"
|
|
394
|
+
:enable-audio-input="true"
|
|
395
|
+
:is-recording="isRecording"
|
|
396
|
+
@toggle-audio-recording="toggleRecording"
|
|
397
|
+
/>
|
|
398
|
+
</template>
|
|
399
|
+
|
|
400
|
+
<script setup lang="ts">
|
|
401
|
+
import { ref } from 'vue'
|
|
402
|
+
import { AiChatDrawer, useRestifyAiStore } from '@doderasoftware/restify-ai'
|
|
403
|
+
|
|
404
|
+
const aiStore = useRestifyAiStore()
|
|
405
|
+
const isRecording = ref(false)
|
|
406
|
+
const audioInput = ref('')
|
|
407
|
+
let mediaRecorder: MediaRecorder | null = null
|
|
408
|
+
|
|
409
|
+
async function toggleRecording() {
|
|
410
|
+
if (isRecording.value) {
|
|
411
|
+
// Stop recording
|
|
412
|
+
mediaRecorder?.stop()
|
|
413
|
+
isRecording.value = false
|
|
414
|
+
} else {
|
|
415
|
+
// Start recording
|
|
416
|
+
try {
|
|
417
|
+
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
|
|
418
|
+
mediaRecorder = new MediaRecorder(stream)
|
|
419
|
+
|
|
420
|
+
const chunks: Blob[] = []
|
|
421
|
+
mediaRecorder.ondataavailable = (e) => chunks.push(e.data)
|
|
422
|
+
mediaRecorder.onstop = async () => {
|
|
423
|
+
const audioBlob = new Blob(chunks, { type: 'audio/webm' })
|
|
424
|
+
// Process the audio (e.g., send to transcription API)
|
|
425
|
+
const transcription = await transcribeAudio(audioBlob)
|
|
426
|
+
audioInput.value = transcription
|
|
427
|
+
stream.getTracks().forEach(track => track.stop())
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
mediaRecorder.start()
|
|
431
|
+
isRecording.value = true
|
|
432
|
+
} catch (error) {
|
|
433
|
+
console.error('Failed to start recording:', error)
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
async function transcribeAudio(blob: Blob): Promise<string> {
|
|
439
|
+
// Implement your transcription logic here
|
|
440
|
+
// e.g., send to OpenAI Whisper, Google Speech-to-Text, etc.
|
|
441
|
+
return 'Transcribed text...'
|
|
442
|
+
}
|
|
443
|
+
</script>
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
**Features:**
|
|
447
|
+
- 🎤 Microphone button appears when `enableAudioInput` is enabled
|
|
448
|
+
- 📊 Animated wave indicator shows when recording is active
|
|
449
|
+
- 🔴 Visual feedback with red styling during recording
|
|
450
|
+
- 🎨 Customizable via `audioButton`, `audioButtonRecording`, and `audioRecordingIndicator` UI classes
|
|
451
|
+
- 🌐 Text labels customizable via `startRecording`, `stopRecording`, and `recording` texts
|
|
452
|
+
|
|
377
453
|
## 📡 Events
|
|
378
454
|
|
|
379
455
|
| Event | Payload | Description |
|
|
380
456
|
|-------|---------|-------------|
|
|
381
457
|
| `update:modelValue` | `boolean` | Drawer state changed |
|
|
458
|
+
| `update:inputValue` | `string` | Input text value changed |
|
|
382
459
|
| `close` | - | Drawer was closed |
|
|
383
460
|
| `contact-support` | - | Support mode activated |
|
|
384
461
|
| `new-chat` | - | New chat started |
|
|
462
|
+
| `toggle-audio-recording` | - | Audio recording toggled |
|
|
385
463
|
|
|
386
464
|
## 🎰 Slots
|
|
387
465
|
|
|
@@ -452,6 +530,10 @@ store.error // { message, failedQuestion, failedAttachments, times
|
|
|
452
530
|
store.supportRequestMode // boolean - Support mode active
|
|
453
531
|
store.pageContext // PageContext | null - Current page context
|
|
454
532
|
store.setupState // SetupState - Setup wizard state
|
|
533
|
+
store.conversationId // string | null - Current conversation ID from backend
|
|
534
|
+
store.conversationName // string | null - Current conversation name
|
|
535
|
+
store.conversationHistory // ConversationHistoryItem[] - List of saved conversations
|
|
536
|
+
store.showHistorySidebar // boolean - History sidebar visibility
|
|
455
537
|
|
|
456
538
|
// ═══════════════════════════════════════════════════════════════
|
|
457
539
|
// GETTERS
|
|
@@ -479,6 +561,13 @@ store.uploadFile(file) // Upload file
|
|
|
479
561
|
store.setPageContext(context) // Set page context
|
|
480
562
|
store.scrollToBottom(delay?) // Scroll chat to bottom
|
|
481
563
|
|
|
564
|
+
// Conversation History Actions
|
|
565
|
+
store.toggleHistorySidebar() // Toggle history sidebar
|
|
566
|
+
store.loadConversation(id) // Load a saved conversation
|
|
567
|
+
store.renameConversation(id, title) // Rename a conversation
|
|
568
|
+
store.deleteConversation(id) // Delete a saved conversation
|
|
569
|
+
store.saveCurrentConversation() // Save current conversation
|
|
570
|
+
|
|
482
571
|
// Setup Mode Actions
|
|
483
572
|
store.startSetupMode() // Start setup wizard
|
|
484
573
|
store.setSetupStep(step) // Set current setup step
|
|
@@ -814,26 +903,41 @@ interface AISuggestion {
|
|
|
814
903
|
|
|
815
904
|
## 🎨 UI Customization
|
|
816
905
|
|
|
817
|
-
Override CSS classes for any component
|
|
906
|
+
Override CSS classes for any component. The `ui` prop on `AiChatDrawer` allows you to customize all components in one place - it extends all child component UI interfaces, so you can customize the drawer, input, messages, empty state, and mentions all from a single object.
|
|
818
907
|
|
|
819
908
|
```vue
|
|
820
909
|
<AiChatDrawer
|
|
821
910
|
v-model="isOpen"
|
|
822
911
|
:ui="{
|
|
912
|
+
// Drawer customization
|
|
823
913
|
backdrop: 'bg-black/50 backdrop-blur-sm',
|
|
824
914
|
drawer: 'shadow-2xl',
|
|
825
915
|
panel: 'bg-gray-50 dark:bg-gray-900',
|
|
826
916
|
header: 'border-b-2 border-primary-500',
|
|
827
917
|
body: 'custom-scrollbar',
|
|
828
918
|
footer: 'border-t border-gray-200',
|
|
919
|
+
|
|
920
|
+
// ChatInput customization (automatically passed down)
|
|
921
|
+
textarea: 'rounded-xl',
|
|
922
|
+
sendButton: 'bg-blue-500 hover:bg-blue-600',
|
|
923
|
+
|
|
924
|
+
// ChatMessage customization (automatically passed down)
|
|
925
|
+
userBubble: 'bg-blue-500 text-white',
|
|
926
|
+
assistantBubble: 'bg-gray-100 dark:bg-gray-800',
|
|
927
|
+
|
|
928
|
+
// AiEmptyState customization (automatically passed down)
|
|
929
|
+
suggestionCard: 'border-2 border-primary-500',
|
|
829
930
|
}"
|
|
830
931
|
/>
|
|
831
932
|
```
|
|
832
933
|
|
|
833
934
|
### AiChatDrawerUI
|
|
834
935
|
|
|
936
|
+
The main UI interface that combines all component UI interfaces. Pass this to the `ui` prop to customize all components:
|
|
937
|
+
|
|
835
938
|
```typescript
|
|
836
|
-
interface AiChatDrawerUI {
|
|
939
|
+
interface AiChatDrawerUI extends ChatInputUI, ChatMessageUI, AiEmptyStateUI, MentionListUI {
|
|
940
|
+
// Drawer-specific
|
|
837
941
|
backdrop?: string // Backdrop overlay
|
|
838
942
|
drawer?: string // Main drawer container
|
|
839
943
|
panel?: string // Inner panel
|
|
@@ -843,17 +947,24 @@ interface AiChatDrawerUI {
|
|
|
843
947
|
headerActionButton?: string // Header buttons
|
|
844
948
|
body?: string // Messages container
|
|
845
949
|
footer?: string // Footer container
|
|
950
|
+
|
|
951
|
+
// Dialogs
|
|
952
|
+
closeConfirmModal?: string // Confirm modal
|
|
953
|
+
closeConfirmButton?: string // Confirm button
|
|
954
|
+
cancelButton?: string // Cancel button
|
|
955
|
+
historyLimitModal?: string // History limit modal
|
|
956
|
+
historyLimitButton?: string // History limit button
|
|
957
|
+
|
|
958
|
+
// Header elements
|
|
846
959
|
quotaDisplay?: string // Quota display
|
|
847
960
|
messageCountBadge?: string // Message count badge
|
|
848
961
|
newChatButton?: string // New chat button
|
|
962
|
+
|
|
963
|
+
// Error display
|
|
849
964
|
errorContainer?: string // Error container
|
|
850
965
|
errorMessage?: string // Error message
|
|
851
966
|
retryButton?: string // Retry button
|
|
852
|
-
|
|
853
|
-
closeConfirmButton?: string // Confirm button
|
|
854
|
-
cancelButton?: string // Cancel button
|
|
855
|
-
historyLimitModal?: string // History limit modal
|
|
856
|
-
historyLimitButton?: string // History limit button
|
|
967
|
+
contactSupportButton?: string // Contact support button
|
|
857
968
|
}
|
|
858
969
|
```
|
|
859
970
|
|
|
@@ -881,6 +992,10 @@ interface ChatInputUI {
|
|
|
881
992
|
suggestionItem?: string // Suggestion item
|
|
882
993
|
suggestionItemSelected?: string // Selected suggestion
|
|
883
994
|
contextLink?: string // Context link
|
|
995
|
+
// Audio input
|
|
996
|
+
audioButton?: string // Audio button
|
|
997
|
+
audioButtonRecording?: string // Audio button when recording
|
|
998
|
+
audioRecordingIndicator?: string // Recording indicator
|
|
884
999
|
}
|
|
885
1000
|
```
|
|
886
1001
|
|
|
@@ -984,6 +1099,7 @@ import type {
|
|
|
984
1099
|
ChatRole,
|
|
985
1100
|
SubmitPayload,
|
|
986
1101
|
Mention,
|
|
1102
|
+
ConversationHistoryItem,
|
|
987
1103
|
|
|
988
1104
|
// Context
|
|
989
1105
|
PageContext,
|
|
@@ -1067,25 +1183,101 @@ Route::post('/ask', [AiController::class, 'ask']);
|
|
|
1067
1183
|
**Request:**
|
|
1068
1184
|
```json
|
|
1069
1185
|
{
|
|
1070
|
-
"
|
|
1186
|
+
"message": "Who is available today?",
|
|
1071
1187
|
"history": [
|
|
1072
|
-
{ "role": "user", "
|
|
1073
|
-
{ "role": "assistant", "
|
|
1188
|
+
{ "role": "user", "content": "Hello" },
|
|
1189
|
+
{ "role": "assistant", "content": "Hi! How can I help?" }
|
|
1074
1190
|
],
|
|
1075
1191
|
"stream": true,
|
|
1076
|
-
"files": [{ "id": "file-123", "name": "report.pdf" }],
|
|
1192
|
+
"files": [{ "id": "file-123", "name": "report.pdf", "backendFileId": 456 }],
|
|
1193
|
+
"attachment_ids": [456],
|
|
1077
1194
|
"mentions": [{ "id": "emp-1", "type": "employee", "name": "John Doe" }],
|
|
1078
|
-
"contact_support": false
|
|
1195
|
+
"contact_support": false,
|
|
1196
|
+
"conversation_id": "conv-abc123"
|
|
1079
1197
|
}
|
|
1080
1198
|
```
|
|
1081
1199
|
|
|
1200
|
+
> **Note:** The `conversation_id` field is only sent when `useConversationId: true` is configured. The `attachment_ids` array contains backend file IDs returned from the upload endpoint.
|
|
1201
|
+
|
|
1082
1202
|
**Response (SSE):**
|
|
1083
1203
|
```
|
|
1204
|
+
event: start
|
|
1205
|
+
data: {"conversation_id":"conv-abc123"}
|
|
1206
|
+
|
|
1084
1207
|
data: {"choices":[{"delta":{"content":"Based on"}}]}
|
|
1085
1208
|
data: {"choices":[{"delta":{"content":" the schedule..."}}]}
|
|
1086
1209
|
data: [DONE]
|
|
1087
1210
|
```
|
|
1088
1211
|
|
|
1212
|
+
### Conversation ID Tracking
|
|
1213
|
+
|
|
1214
|
+
When `useConversationId: true` is enabled in the plugin configuration, the package will:
|
|
1215
|
+
|
|
1216
|
+
1. **Receive** the conversation ID from the backend via the `start` SSE event
|
|
1217
|
+
2. **Store** it in the Pinia store (`store.conversationId`)
|
|
1218
|
+
3. **Send** it back with subsequent requests in the same conversation
|
|
1219
|
+
4. **Clear** it when starting a new chat
|
|
1220
|
+
|
|
1221
|
+
This is useful for:
|
|
1222
|
+
- Tracking conversations across multiple requests
|
|
1223
|
+
- Maintaining context on the backend
|
|
1224
|
+
- Analytics and logging
|
|
1225
|
+
- Multi-turn conversation management
|
|
1226
|
+
|
|
1227
|
+
### Conversation History
|
|
1228
|
+
|
|
1229
|
+
When `useConversationHistory: true` is enabled, users can access a sidebar showing their previous conversations:
|
|
1230
|
+
|
|
1231
|
+
**Features:**
|
|
1232
|
+
- 📜 **View past conversations** - Browse through saved chats
|
|
1233
|
+
- ✏️ **Rename conversations** - Give meaningful titles to chats
|
|
1234
|
+
- 🗑️ **Delete conversations** - Remove unwanted history
|
|
1235
|
+
- 🔄 **Switch conversations** - Seamlessly load previous chats
|
|
1236
|
+
- 💾 **Automatic saving** - Conversations save automatically
|
|
1237
|
+
|
|
1238
|
+
**Configuration:**
|
|
1239
|
+
```typescript
|
|
1240
|
+
app.use(RestifyAiPlugin, {
|
|
1241
|
+
useConversationId: true, // Required for history
|
|
1242
|
+
useConversationHistory: true, // Enable history sidebar
|
|
1243
|
+
maxConversationHistory: 10, // Max conversations to keep (default: 10)
|
|
1244
|
+
})
|
|
1245
|
+
```
|
|
1246
|
+
|
|
1247
|
+
**How it works:**
|
|
1248
|
+
1. When `useConversationHistory` is enabled, a history button appears in the drawer header
|
|
1249
|
+
2. Clicking the button opens a sidebar showing past conversations
|
|
1250
|
+
3. Conversations are automatically saved to `localStorage` when completed
|
|
1251
|
+
4. Each conversation shows: title (from first message or backend), date, message count
|
|
1252
|
+
5. Users can rename, delete, or switch between conversations
|
|
1253
|
+
|
|
1254
|
+
**Backend Integration:**
|
|
1255
|
+
|
|
1256
|
+
The backend can provide a conversation name via the `start` SSE event:
|
|
1257
|
+
|
|
1258
|
+
```
|
|
1259
|
+
event: start
|
|
1260
|
+
data: {"conversation_id":"conv-abc123","conversation_name":"Budget Analysis Q1"}
|
|
1261
|
+
```
|
|
1262
|
+
|
|
1263
|
+
If no name is provided, the title defaults to a truncated version of the first user message.
|
|
1264
|
+
|
|
1265
|
+
**Storage:**
|
|
1266
|
+
- Conversation list: `restify_ai_conversation_history`
|
|
1267
|
+
- Conversation messages: `restify_ai_conv_{conversationId}`
|
|
1268
|
+
- Current conversation ID: `restify_ai_current_conversation`
|
|
1269
|
+
|
|
1270
|
+
**ConversationHistoryItem Interface:**
|
|
1271
|
+
```typescript
|
|
1272
|
+
interface ConversationHistoryItem {
|
|
1273
|
+
id: string // Conversation ID from backend
|
|
1274
|
+
title: string // Display title
|
|
1275
|
+
createdAt: number // Timestamp when created
|
|
1276
|
+
updatedAt: number // Timestamp of last update
|
|
1277
|
+
messageCount: number // Number of messages
|
|
1278
|
+
}
|
|
1279
|
+
```
|
|
1280
|
+
|
|
1089
1281
|
### Quota Endpoint
|
|
1090
1282
|
|
|
1091
1283
|
```php
|
|
@@ -1104,6 +1296,27 @@ Route::get('/ai/quota', [AiController::class, 'quota']);
|
|
|
1104
1296
|
}
|
|
1105
1297
|
```
|
|
1106
1298
|
|
|
1299
|
+
### Rate Limiting via Headers
|
|
1300
|
+
|
|
1301
|
+
As an alternative to the quota endpoint, you can enable headers-based rate limiting. When `useHeadersRateLimiter` is enabled, the package will extract rate limit information directly from response headers instead of making separate quota endpoint calls.
|
|
1302
|
+
|
|
1303
|
+
**Configuration:**
|
|
1304
|
+
```typescript
|
|
1305
|
+
app.use(RestifyAi, {
|
|
1306
|
+
useQuota: true,
|
|
1307
|
+
useHeadersRateLimiter: true, // Enable headers-based rate limiting
|
|
1308
|
+
})
|
|
1309
|
+
```
|
|
1310
|
+
|
|
1311
|
+
**Required Response Headers:**
|
|
1312
|
+
|
|
1313
|
+
Your chat endpoint should return these headers with each response:
|
|
1314
|
+
|
|
1315
|
+
```
|
|
1316
|
+
x-ratelimit-limit: 100 // Total allowed requests
|
|
1317
|
+
x-ratelimit-remaining: 75 // Remaining requests
|
|
1318
|
+
```
|
|
1319
|
+
|
|
1107
1320
|
### Upload Endpoint
|
|
1108
1321
|
|
|
1109
1322
|
```php
|
|
@@ -1115,15 +1328,41 @@ Route::post('/ai/upload', [AiController::class, 'upload']);
|
|
|
1115
1328
|
```json
|
|
1116
1329
|
{
|
|
1117
1330
|
"data": {
|
|
1118
|
-
"id":
|
|
1331
|
+
"id": 456,
|
|
1119
1332
|
"name": "document.pdf",
|
|
1120
1333
|
"url": "/storage/uploads/document.pdf",
|
|
1121
1334
|
"type": "application/pdf",
|
|
1122
|
-
"size": 102400
|
|
1335
|
+
"size": 102400,
|
|
1336
|
+
"extracted_text": "Optional extracted text content..."
|
|
1123
1337
|
}
|
|
1124
1338
|
}
|
|
1125
1339
|
```
|
|
1126
1340
|
|
|
1341
|
+
### Backend File ID Support
|
|
1342
|
+
|
|
1343
|
+
When files are uploaded, the backend can return an ID that will be automatically tracked and sent with subsequent requests. This enables the backend to reference pre-processed files.
|
|
1344
|
+
|
|
1345
|
+
**Supported ID field names in upload response:**
|
|
1346
|
+
- `id` (recommended)
|
|
1347
|
+
- `file_id`
|
|
1348
|
+
- `attachment_id`
|
|
1349
|
+
- `openai_file_id`
|
|
1350
|
+
|
|
1351
|
+
The package automatically:
|
|
1352
|
+
1. **Stores** the backend file ID when received from upload response
|
|
1353
|
+
2. **Includes** all backend file IDs in the `attachment_ids` array in ask requests
|
|
1354
|
+
3. **Preserves** the ID through the entire conversation
|
|
1355
|
+
|
|
1356
|
+
**Example flow:**
|
|
1357
|
+
```
|
|
1358
|
+
1. User uploads file.pdf
|
|
1359
|
+
2. Backend returns: { "id": 456, "name": "file.pdf", ... }
|
|
1360
|
+
3. Package stores backendFileId: 456
|
|
1361
|
+
4. User sends message with attachment
|
|
1362
|
+
5. Request includes: { "attachment_ids": [456], "files": [...] }
|
|
1363
|
+
6. Backend can use attachment_ids to reference stored/processed files
|
|
1364
|
+
```
|
|
1365
|
+
|
|
1127
1366
|
## ⌨️ Keyboard Shortcuts
|
|
1128
1367
|
|
|
1129
1368
|
| Shortcut | Action |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AiChatDrawerUI, AiChatDrawerTexts, HistoryLimitConfig, LoadingTextConfig } from '../types';
|
|
1
|
+
import { ChatAttachment, AiChatDrawerUI, AiChatDrawerTexts, HistoryLimitConfig, LoadingTextConfig } from '../types';
|
|
2
2
|
|
|
3
3
|
interface Props {
|
|
4
4
|
modelValue: boolean;
|
|
@@ -18,6 +18,9 @@ interface Props {
|
|
|
18
18
|
showCloseButton?: boolean;
|
|
19
19
|
showNewChatButton?: boolean;
|
|
20
20
|
confirmClose?: boolean;
|
|
21
|
+
enableAudioInput?: boolean;
|
|
22
|
+
isRecording?: boolean;
|
|
23
|
+
inputValue?: string;
|
|
21
24
|
historyLimit?: HistoryLimitConfig;
|
|
22
25
|
loadingText?: LoadingTextConfig;
|
|
23
26
|
autoFetchQuota?: boolean;
|
|
@@ -77,12 +80,20 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
77
80
|
showCloseButton: boolean;
|
|
78
81
|
showNewChatButton: boolean;
|
|
79
82
|
confirmClose: boolean;
|
|
83
|
+
enableAudioInput: boolean;
|
|
84
|
+
isRecording: boolean;
|
|
85
|
+
inputValue: string;
|
|
80
86
|
autoFetchQuota: boolean;
|
|
81
87
|
}>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
82
88
|
"update:modelValue": (value: boolean) => void;
|
|
89
|
+
"update:inputValue": (value: string) => void;
|
|
83
90
|
close: () => void;
|
|
84
|
-
"contact-support": (
|
|
91
|
+
"contact-support": (payload?: {
|
|
92
|
+
message?: string;
|
|
93
|
+
attachments?: ChatAttachment[];
|
|
94
|
+
} | undefined) => void;
|
|
85
95
|
"new-chat": () => void;
|
|
96
|
+
"toggle-audio-recording": () => void;
|
|
86
97
|
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<Props>, {
|
|
87
98
|
width: string;
|
|
88
99
|
fullscreenWidth: string;
|
|
@@ -98,15 +109,25 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
98
109
|
showCloseButton: boolean;
|
|
99
110
|
showNewChatButton: boolean;
|
|
100
111
|
confirmClose: boolean;
|
|
112
|
+
enableAudioInput: boolean;
|
|
113
|
+
isRecording: boolean;
|
|
114
|
+
inputValue: string;
|
|
101
115
|
autoFetchQuota: boolean;
|
|
102
116
|
}>>> & Readonly<{
|
|
103
117
|
onClose?: (() => any) | undefined;
|
|
118
|
+
"onToggle-audio-recording"?: (() => any) | undefined;
|
|
104
119
|
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
|
105
120
|
"onNew-chat"?: (() => any) | undefined;
|
|
106
|
-
"onContact-support"?: ((
|
|
121
|
+
"onContact-support"?: ((payload?: {
|
|
122
|
+
message?: string;
|
|
123
|
+
attachments?: ChatAttachment[];
|
|
124
|
+
} | undefined) => any) | undefined;
|
|
125
|
+
"onUpdate:inputValue"?: ((value: string) => any) | undefined;
|
|
107
126
|
}>, {
|
|
108
127
|
confirmClose: boolean;
|
|
109
128
|
width: string;
|
|
129
|
+
enableAudioInput: boolean;
|
|
130
|
+
isRecording: boolean;
|
|
110
131
|
showNewChatButton: boolean;
|
|
111
132
|
showQuota: boolean;
|
|
112
133
|
showCloseButton: boolean;
|
|
@@ -119,6 +140,7 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
119
140
|
showBackdrop: boolean;
|
|
120
141
|
closeOnBackdropClick: boolean;
|
|
121
142
|
closeOnEscape: boolean;
|
|
143
|
+
inputValue: string;
|
|
122
144
|
autoFetchQuota: boolean;
|
|
123
145
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
124
146
|
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChatDrawer.vue.d.ts","sourceRoot":"","sources":["../../src/components/AiChatDrawer.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AiChatDrawer.vue.d.ts","sourceRoot":"","sources":["../../src/components/AiChatDrawer.vue"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ interface Props {
|
|
|
16
16
|
hasHistory?: boolean;
|
|
17
17
|
supportRequestMode?: boolean;
|
|
18
18
|
showSupportModeToggle?: boolean;
|
|
19
|
+
enableAudioInput?: boolean;
|
|
20
|
+
isRecording?: boolean;
|
|
19
21
|
contextLinkText?: string;
|
|
20
22
|
ui?: ChatInputUI;
|
|
21
23
|
texts?: ChatInputTexts;
|
|
@@ -45,6 +47,8 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
45
47
|
hasHistory: boolean;
|
|
46
48
|
supportRequestMode: boolean;
|
|
47
49
|
showSupportModeToggle: boolean;
|
|
50
|
+
enableAudioInput: boolean;
|
|
51
|
+
isRecording: boolean;
|
|
48
52
|
contextLinkText: string;
|
|
49
53
|
}>>, {
|
|
50
54
|
focus: () => void | undefined;
|
|
@@ -54,6 +58,7 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
54
58
|
cancel: () => void;
|
|
55
59
|
"suggestion-select": (suggestion: Suggestion) => void;
|
|
56
60
|
"toggle-support-mode": () => void;
|
|
61
|
+
"toggle-audio-recording": () => void;
|
|
57
62
|
"context-link-click": () => void;
|
|
58
63
|
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<Props>, {
|
|
59
64
|
disabled: boolean;
|
|
@@ -65,11 +70,14 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
65
70
|
hasHistory: boolean;
|
|
66
71
|
supportRequestMode: boolean;
|
|
67
72
|
showSupportModeToggle: boolean;
|
|
73
|
+
enableAudioInput: boolean;
|
|
74
|
+
isRecording: boolean;
|
|
68
75
|
contextLinkText: string;
|
|
69
76
|
}>>> & Readonly<{
|
|
70
77
|
onCancel?: (() => any) | undefined;
|
|
71
78
|
onSubmit?: ((payload: SubmitPayload) => any) | undefined;
|
|
72
79
|
"onToggle-support-mode"?: (() => any) | undefined;
|
|
80
|
+
"onToggle-audio-recording"?: (() => any) | undefined;
|
|
73
81
|
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
74
82
|
"onSuggestion-select"?: ((suggestion: Suggestion) => any) | undefined;
|
|
75
83
|
"onContext-link-click"?: (() => any) | undefined;
|
|
@@ -81,6 +89,8 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
81
89
|
supportRequestMode: boolean;
|
|
82
90
|
suggestions: Suggestion[];
|
|
83
91
|
showSupportModeToggle: boolean;
|
|
92
|
+
enableAudioInput: boolean;
|
|
93
|
+
isRecording: boolean;
|
|
84
94
|
minLength: number;
|
|
85
95
|
hasHistory: boolean;
|
|
86
96
|
contextLinkText: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatInput.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChatInput.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatInput.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChatInput.vue"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChatMessage.vue"],"names":[],"mappings":"AA+LA;AAUA,OAAO,KAAK,EAAE,WAAW,EAAkB,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAI5F,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oCAAoC;IACpC,EAAE,CAAC,EAAE,aAAa,CAAA;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;;;;;;;;;;;;iBALe,MAAM;iBADN,OAAO;;
|
|
1
|
+
{"version":3,"file":"ChatMessage.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChatMessage.vue"],"names":[],"mappings":"AA+LA;AAUA,OAAO,KAAK,EAAE,WAAW,EAAkB,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAI5F,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oCAAoC;IACpC,EAAE,CAAC,EAAE,aAAa,CAAA;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;;;;;;;;;;;;iBALe,MAAM;iBADN,OAAO;;AA0rBvB,wBAOG;AACH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAE1B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACxE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KACb,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AACN,KAAK,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=ConversationHistory.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationHistory.vue.d.ts","sourceRoot":"","sources":["../../../src/components/drawer/ConversationHistory.vue"],"names":[],"mappings":";AAskBA,wBAKG"}
|
|
@@ -12,6 +12,8 @@ interface Props {
|
|
|
12
12
|
showFullscreenToggle: boolean;
|
|
13
13
|
isFullscreen: boolean;
|
|
14
14
|
showMessageCount: boolean;
|
|
15
|
+
showHistoryButton?: boolean;
|
|
16
|
+
hasConversationHistory?: boolean;
|
|
15
17
|
messageCount: number;
|
|
16
18
|
messageLimit: number;
|
|
17
19
|
t: (key: keyof AiChatDrawerTexts, params?: Record<string, any>) => string;
|
|
@@ -25,11 +27,13 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
|
|
|
25
27
|
close: () => void;
|
|
26
28
|
minimize: () => void;
|
|
27
29
|
"toggle-fullscreen": () => void;
|
|
30
|
+
"toggle-history": () => void;
|
|
28
31
|
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<Props>>> & Readonly<{
|
|
29
32
|
onClose?: (() => any) | undefined;
|
|
30
33
|
onMinimize?: (() => any) | undefined;
|
|
31
34
|
"onNew-chat"?: (() => any) | undefined;
|
|
32
35
|
"onToggle-fullscreen"?: (() => any) | undefined;
|
|
36
|
+
"onToggle-history"?: (() => any) | undefined;
|
|
33
37
|
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
34
38
|
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
|
|
35
39
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrawerHeader.vue.d.ts","sourceRoot":"","sources":["../../../src/components/drawer/DrawerHeader.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DrawerHeader.vue.d.ts","sourceRoot":"","sources":["../../../src/components/drawer/DrawerHeader.vue"],"names":[],"mappings":"AAoJA;AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAI/E,UAAU,KAAK;IACb,EAAE,CAAC,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,SAAS,CAAA;IAChB,eAAe,EAAE,OAAO,CAAA;IACxB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,oBAAoB,EAAE,OAAO,CAAA;IAC7B,YAAY,EAAE,OAAO,CAAA;IACrB,gBAAgB,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAA;CAC1E;AA2CD,iBAAS,cAAc;6BAsce,GAAG;mBACb,GAAG;EAG9B;AAoBD,QAAA,MAAM,eAAe;;;;;;;;;;;;iFAOnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAAvG,wBAAwG;AACxG,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAAE,QAAO;QAClD,MAAM,EAAE,CAAC,CAAC;KACT,CAAA;CAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrawerMessageList.vue.d.ts","sourceRoot":"","sources":["../../../src/components/drawer/DrawerMessageList.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DrawerMessageList.vue.d.ts","sourceRoot":"","sources":["../../../src/components/drawer/DrawerMessageList.vue"],"names":[],"mappings":"AAkHA;AAKA,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAI1H,UAAU,KAAK;IACb,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,EAAE,CAAC,EAAE,cAAc,CAAA;IACnB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAA;CAC1E;AAaD,iBAAS,cAAc;;;;;;QAkTO,GAAG;EAGhC;AAgBD,QAAA,MAAM,eAAe;;;;;;;;iFAOnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAAvG,wBAAwG;AACxG,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAAE,QAAO;QAClD,MAAM,EAAE,CAAC,CAAC;KACT,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=IconHistory.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconHistory.vue.d.ts","sourceRoot":"","sources":["../../../src/components/icons/IconHistory.vue"],"names":[],"mappings":";AAqEA,wBAKG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=IconMicrophone.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconMicrophone.vue.d.ts","sourceRoot":"","sources":["../../../src/components/icons/IconMicrophone.vue"],"names":[],"mappings":"AAcA;;AA0EA,wBAKG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=IconMicrophoneOff.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconMicrophoneOff.vue.d.ts","sourceRoot":"","sources":["../../../src/components/icons/IconMicrophoneOff.vue"],"names":[],"mappings":"AAiBA;;AAkGA,wBAKG"}
|
|
@@ -16,4 +16,7 @@ export { default as IconExitFullscreen } from './IconExitFullscreen.vue';
|
|
|
16
16
|
export { default as IconClock } from './IconClock.vue';
|
|
17
17
|
export { default as IconRefresh } from './IconRefresh.vue';
|
|
18
18
|
export { default as IconSupport } from './IconSupport.vue';
|
|
19
|
+
export { default as IconHistory } from './IconHistory.vue';
|
|
20
|
+
export { default as IconMicrophone } from './IconMicrophone.vue';
|
|
21
|
+
export { default as IconMicrophoneOff } from './IconMicrophoneOff.vue';
|
|
19
22
|
//# sourceMappingURL=index.d.ts.map
|