@aleph-alpha/chat-kit 2.1.1 → 2.3.0

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 (54) hide show
  1. package/dist/{CkInput.vue_vue_type_script_setup_true_lang-DPZedAQS.js → CkInput.vue_vue_type_script_setup_true_lang-DYTizPsB.js} +361 -72
  2. package/dist/chat-kit.css +40 -5
  3. package/dist/components/base/CkDropZoneOverlay/CkDropZoneIllustration.vue.d.ts +4 -0
  4. package/dist/components/base/CkDropZoneOverlay/CkDropZoneIllustration.vue.d.ts.map +1 -0
  5. package/dist/components/base/CkDropZoneOverlay/CkDropZoneOverlay.stories.d.ts +17 -0
  6. package/dist/components/base/CkDropZoneOverlay/CkDropZoneOverlay.stories.d.ts.map +1 -0
  7. package/dist/components/base/CkDropZoneOverlay/CkDropZoneOverlay.vue.d.ts +31 -0
  8. package/dist/components/base/CkDropZoneOverlay/CkDropZoneOverlay.vue.d.ts.map +1 -0
  9. package/dist/components/base/CkDropZoneOverlay/index.d.ts +3 -0
  10. package/dist/components/base/CkDropZoneOverlay/index.d.ts.map +1 -0
  11. package/dist/components/base/CkDropZoneOverlay/types.d.ts +88 -0
  12. package/dist/components/base/CkDropZoneOverlay/types.d.ts.map +1 -0
  13. package/dist/components/base/CkFeedbackDialog/CkFeedbackDialog.vue.d.ts.map +1 -1
  14. package/dist/components/base/CkFileItemsList/CkFileItemsList.stories.d.ts +7 -0
  15. package/dist/components/base/CkFileItemsList/CkFileItemsList.stories.d.ts.map +1 -1
  16. package/dist/components/base/CkFileItemsList/CkFileItemsList.vue.d.ts +1 -0
  17. package/dist/components/base/CkFileItemsList/CkFileItemsList.vue.d.ts.map +1 -1
  18. package/dist/components/base/CkFileItemsList/types.d.ts +9 -0
  19. package/dist/components/base/CkFileItemsList/types.d.ts.map +1 -1
  20. package/dist/components/base/index.d.ts +2 -0
  21. package/dist/components/base/index.d.ts.map +1 -1
  22. package/dist/components/index.d.ts +2 -2
  23. package/dist/components/index.d.ts.map +1 -1
  24. package/dist/components/index.js +19 -18
  25. package/dist/composables/fileUpload/index.d.ts.map +1 -1
  26. package/dist/composables/fileUpload/types.d.ts +1 -1
  27. package/dist/composables/fileUpload/types.d.ts.map +1 -1
  28. package/dist/composables/fileUpload/useFileUpload.d.ts.map +1 -1
  29. package/dist/composables/index.js +1 -1
  30. package/dist/{index-BPXg1Yf6.js → index-THzZwfMU.js} +45 -23
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +21 -20
  34. package/package.json +1 -1
  35. package/src/components/base/CkDropZoneOverlay/CkDropZoneIllustration.vue +125 -0
  36. package/src/components/base/CkDropZoneOverlay/CkDropZoneOverlay.spec.ts +104 -0
  37. package/src/components/base/CkDropZoneOverlay/CkDropZoneOverlay.stories.ts +130 -0
  38. package/src/components/base/CkDropZoneOverlay/CkDropZoneOverlay.vue +272 -0
  39. package/src/components/base/CkDropZoneOverlay/index.ts +2 -0
  40. package/src/components/base/CkDropZoneOverlay/types.ts +93 -0
  41. package/src/components/base/CkFeedbackDialog/CkFeedbackDialog.vue +22 -1
  42. package/src/components/base/CkFileItemsList/CkFileItemsList.spec.ts +67 -0
  43. package/src/components/base/CkFileItemsList/CkFileItemsList.stories.ts +48 -0
  44. package/src/components/base/CkFileItemsList/CkFileItemsList.vue +78 -4
  45. package/src/components/base/CkFileItemsList/types.ts +9 -0
  46. package/src/components/base/index.ts +7 -0
  47. package/src/components/index.ts +5 -0
  48. package/src/composables/fileUpload/index.spec.ts +18 -7
  49. package/src/composables/fileUpload/index.ts +39 -19
  50. package/src/composables/fileUpload/types.ts +1 -1
  51. package/src/composables/fileUpload/useFileUpload.spec.ts +26 -0
  52. package/src/composables/fileUpload/useFileUpload.ts +12 -3
  53. package/src/composables/fileUpload/useFileUploadWrapper.ts +1 -1
  54. package/src/index.ts +5 -0
@@ -3,6 +3,7 @@ export {
3
3
  CkAgentMessage,
4
4
  CkConversationLayout,
5
5
  CkCopyMessageActionButton,
6
+ CkDropZoneOverlay,
6
7
  CkFeedbackButton,
7
8
  CkFeedbackDialog,
8
9
  CkFileItemsList,
@@ -21,6 +22,10 @@ export {
21
22
  } from './base';
22
23
  export type {
23
24
  CkConversationLayoutProps,
25
+ CkDropZoneOverlayProps,
26
+ CkDropZoneOverlayEmits,
27
+ CkDropZoneRejection,
28
+ CkDropZoneRejectionReason,
24
29
  CkFeedbackButtonProps,
25
30
  CkFeedbackDialogEmits,
26
31
  CkFeedbackDialogProps,
@@ -63,11 +63,11 @@ describe('fileUpload index', () => {
63
63
  expect(workflowConfig.workflow_name).toBe('DocumentAI');
64
64
  });
65
65
 
66
- it('configures workflowConfig definition', () => {
66
+ it('does not send the legacy workflow definition field', () => {
67
+ // The search-stores API dropped the redundant `definition` field
68
+ // (it duplicated `workflow_name`); sending it now breaks store creation.
67
69
  const { workflowConfig } = defaultDocumentUploadConfig;
68
- expect(workflowConfig.definition).toEqual({
69
- workflow_name: 'DocumentAI',
70
- });
70
+ expect(workflowConfig.definition).toBeUndefined();
71
71
  });
72
72
 
73
73
  it('configures initialization parameters', () => {
@@ -83,7 +83,16 @@ describe('fileUpload index', () => {
83
83
  .parameters as Record<string, unknown>;
84
84
  const extraction = params.document_extraction as Record<string, unknown>;
85
85
 
86
- expect(extraction.pdf_reader).toEqual({ kind: 'pypdf', batch_size: 10 });
86
+ expect(extraction.pdf_reader).toEqual({
87
+ kind: 'vision',
88
+ batch_size: 10,
89
+ ignore_headers_footers: true,
90
+ max_tokens: 16384,
91
+ model: 'gemini-2.5-flash',
92
+ retries: 3,
93
+ timeout: 120,
94
+ workers: 4,
95
+ });
87
96
  expect(extraction.docx_reader).toEqual({
88
97
  kind: 'docx',
89
98
  batch_size: 10,
@@ -121,10 +130,12 @@ describe('fileUpload index', () => {
121
130
  unknown
122
131
  >;
123
132
  expect(chunkExtraction.chunker).toEqual({
124
- kind: 'naive',
133
+ kind: 'recursive',
125
134
  batch_size: 1,
126
135
  include_image_descriptions: false,
127
- chunk_size: 200,
136
+ chunk_overlap: 200,
137
+ chunk_size: 1200,
138
+ separators: ['\n\n', '\n', ' ', '.', ',', ''],
128
139
  });
129
140
  });
130
141
 
@@ -22,40 +22,60 @@ export const defaultDocumentUploadConfig: DocumentUploadConfig = {
22
22
  workflowConfig: {
23
23
  name: WORKFLOW_ID,
24
24
  workflow_name: 'DocumentAI',
25
- definition: { workflow_name: 'DocumentAI' },
26
25
  parameters: {
27
- initialization: {
28
- store: { batch_size: 10, pages_per_part: 25 },
26
+ chunk_extraction: {
27
+ chunker: {
28
+ batch_size: 1,
29
+ chunk_overlap: 200,
30
+ chunk_size: 1200,
31
+ include_image_descriptions: false,
32
+ kind: 'recursive',
33
+ separators: ['\n\n', '\n', ' ', '.', ',', ''],
34
+ },
29
35
  },
30
36
  document_extraction: {
31
- pdf_reader: { kind: 'pypdf', batch_size: 10 },
32
37
  docx_reader: {
33
- kind: 'docx',
34
38
  batch_size: 10,
39
+ kind: 'docx',
35
40
  split_by_sections: false,
36
41
  },
37
- pptx_reader: { kind: 'pptx', batch_size: 10, include_notes: true },
38
- xlsx_reader: {
39
- kind: 'xlsx',
42
+ markdown_reader: {
40
43
  batch_size: 10,
41
- max_rows: 10000,
42
- max_cols: 100,
43
- include_empty_sheets: false,
44
+ kind: 'markdown',
45
+ },
46
+ pdf_reader: {
47
+ batch_size: 10,
48
+ ignore_headers_footers: true,
49
+ kind: 'vision',
50
+ max_tokens: 16384,
51
+ model: 'gemini-2.5-flash',
52
+ retries: 3,
53
+ timeout: 120,
54
+ workers: 4,
44
55
  },
45
- markdown_reader: { kind: 'markdown', batch_size: 10 },
46
56
  plaintext_reader: {
47
- kind: 'plaintext',
48
57
  batch_size: 10,
58
+ kind: 'plaintext',
49
59
  max_content_size: 500000,
50
60
  min_space_ratio: 0.02,
51
61
  },
62
+ pptx_reader: {
63
+ batch_size: 10,
64
+ include_notes: true,
65
+ kind: 'pptx',
66
+ },
67
+ xlsx_reader: {
68
+ batch_size: 10,
69
+ include_empty_sheets: false,
70
+ kind: 'xlsx',
71
+ max_cols: 100,
72
+ max_rows: 10000,
73
+ },
52
74
  },
53
- chunk_extraction: {
54
- chunker: {
55
- kind: 'naive',
56
- batch_size: 1,
57
- include_image_descriptions: false,
58
- chunk_size: 200,
75
+ initialization: {
76
+ store: {
77
+ batch_size: 10,
78
+ pages_per_part: 25,
59
79
  },
60
80
  },
61
81
  },
@@ -336,7 +336,7 @@ export interface SearchStoreModel {
336
336
 
337
337
  export interface DocumentUploadConfig {
338
338
  baseUrl: string;
339
- userId: string;
339
+ userId?: string;
340
340
  workflowId: string;
341
341
  searchStoreConfig: {
342
342
  models: SearchStoreModel[];
@@ -128,6 +128,32 @@ describe('useFileUpload runWorkflow', () => {
128
128
  expect(upload.getFileState('key-1')?.status).toBe('success');
129
129
  expect(upload.getFileState('key-1')?.metadata.documentId).toBeUndefined();
130
130
  });
131
+
132
+ it('marks involved files failed on a bare SSE `error` event (no status field)', async () => {
133
+ const captured: { cb?: (event: SseEvent) => void } = {};
134
+ const events: string[] = [];
135
+ const upload = useFileUpload({
136
+ client: createMockClient(captured),
137
+ workflowId: 'wf',
138
+ storeId: 'ss-1',
139
+ onEvent: (e) => events.push(e.type),
140
+ });
141
+
142
+ upload.files.value.set('key-1', makeEntry('key-1', 'file-1'));
143
+
144
+ await upload.runWorkflow(['file-1']);
145
+ captured.cb!({
146
+ event: 'error',
147
+ data: JSON.stringify({ error: 'ActivityError: Activity task failed' }),
148
+ });
149
+
150
+ expect(upload.getFileState('key-1')?.status).toBe('failed');
151
+ expect(upload.getFileState('key-1')?.error?.message).toBe(
152
+ 'ActivityError: Activity task failed',
153
+ );
154
+ expect(upload.workflowRun.value?.status).toBe('failed');
155
+ expect(events).toContain('workflow:failed');
156
+ });
131
157
  });
132
158
 
133
159
  describe('useFileUpload maxFilesPerUpload', () => {
@@ -1126,6 +1126,7 @@ export function useFileUpload(
1126
1126
  let data: {
1127
1127
  id?: string;
1128
1128
  status?: string;
1129
+ error?: string;
1129
1130
  documents?: Array<{ document_id?: string; file_id?: string }>;
1130
1131
  };
1131
1132
  try {
@@ -1134,6 +1135,11 @@ export function useFileUpload(
1134
1135
  data = {};
1135
1136
  }
1136
1137
 
1138
+ const isFailure =
1139
+ data.status === 'failed' ||
1140
+ data.status === 'error' ||
1141
+ event.event === 'error';
1142
+
1137
1143
  const runEvent: WorkflowRunEvent = {
1138
1144
  id: data.id ?? '',
1139
1145
  status: data.status ?? event.event,
@@ -1149,16 +1155,19 @@ export function useFileUpload(
1149
1155
  Array.isArray(data.documents) ? data.documents : [],
1150
1156
  );
1151
1157
  emit({ type: 'workflow:completed', runId });
1152
- } else if (data.status === 'failed' || data.status === 'error') {
1158
+ } else if (isFailure) {
1153
1159
  workflowRun.value.status = 'failed';
1154
1160
  workflowRun.value.completedAt = now();
1161
+ const message =
1162
+ (typeof data.error === 'string' && data.error.trim()) ||
1163
+ `Workflow run ${runId} failed.`;
1155
1164
  workflowRun.value.error = {
1156
1165
  code: 'WORKFLOW_RUN_FAILED',
1157
- message: `Workflow run ${runId} failed.`,
1166
+ message,
1158
1167
  };
1159
1168
  const workflowErr: FileUploadError = {
1160
1169
  code: 'UPLOAD_FAILED',
1161
- message: `Workflow run ${runId} failed.`,
1170
+ message,
1162
1171
  occurredAt: now(),
1163
1172
  };
1164
1173
  for (const key of involvedStateKeys) {
@@ -171,7 +171,7 @@ export function createDocumentUploadProvider(
171
171
  } = config;
172
172
 
173
173
  const defaultHeaders: Record<string, string> = {
174
- 'x-user-id': userId,
174
+ ...(userId ? { 'x-user-id': userId } : {}),
175
175
  ...(config.headers ?? {}),
176
176
  };
177
177
 
package/src/index.ts CHANGED
@@ -66,6 +66,7 @@ export {
66
66
  CkConversation,
67
67
  CkConversationLayout,
68
68
  CkCopyMessageActionButton,
69
+ CkDropZoneOverlay,
69
70
  CkFeedbackButton,
70
71
  CkFeedbackDialog,
71
72
  CkFileItemsList,
@@ -87,6 +88,10 @@ export {
87
88
  export type {
88
89
  CkConversationLayoutProps,
89
90
  CkConversationProps,
91
+ CkDropZoneOverlayProps,
92
+ CkDropZoneOverlayEmits,
93
+ CkDropZoneRejection,
94
+ CkDropZoneRejectionReason,
90
95
  CkFeedbackButtonProps,
91
96
  CkFeedbackDialogEmits,
92
97
  CkFeedbackDialogProps,