@aleph-alpha/chat-kit 5.13.0 → 6.1.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 (199) hide show
  1. package/dist/{CkHistory.vue_vue_type_script_setup_true_lang-BNcJURkq.js → CkHistory.vue_vue_type_script_setup_true_lang-Cr8vF94e.js} +221 -115
  2. package/dist/adapters/responses-api.d.ts +1 -1
  3. package/dist/adapters/responses-api.d.ts.map +1 -1
  4. package/dist/adapters/responses-api.js +9 -7
  5. package/dist/apl-fqmucPXA.js +140 -0
  6. package/dist/asciiarmor-DucZyvP0.js +56 -0
  7. package/dist/asn1-BnOEsgAm.js +144 -0
  8. package/dist/asterisk-QAlztEwS.js +345 -0
  9. package/dist/brainfuck-DZVCuF_t.js +53 -0
  10. package/dist/chat-kit.css +1177 -12
  11. package/dist/clike-CTYGlS6x.js +799 -0
  12. package/dist/clojure-BhXMqnxz.js +849 -0
  13. package/dist/cmake-BGaNd9E7.js +71 -0
  14. package/dist/cobol-4yqQntpt.js +120 -0
  15. package/dist/coffeescript-D2dXvhEc.js +308 -0
  16. package/dist/commonlisp-CF_VNHQR.js +130 -0
  17. package/dist/components/base/CkHistoryItem/CkHistoryItem.vue.d.ts.map +1 -1
  18. package/dist/components/base/CkHistoryWrapper/CkHistoryWrapper.vue.d.ts.map +1 -1
  19. package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.d.ts.map +1 -1
  20. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.d.ts +41 -0
  21. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.d.ts.map +1 -0
  22. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.vue.d.ts +26 -0
  23. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.vue.d.ts.map +1 -0
  24. package/dist/components/base/CkMilkdownEditor/codeMirrorTheme.d.ts +20 -0
  25. package/dist/components/base/CkMilkdownEditor/codeMirrorTheme.d.ts.map +1 -0
  26. package/dist/components/base/CkMilkdownEditor/createCrepeEditor.d.ts +42 -0
  27. package/dist/components/base/CkMilkdownEditor/createCrepeEditor.d.ts.map +1 -0
  28. package/dist/components/base/CkMilkdownEditor/crepeIcons.d.ts +33 -0
  29. package/dist/components/base/CkMilkdownEditor/crepeIcons.d.ts.map +1 -0
  30. package/dist/components/base/CkMilkdownEditor/index.d.ts +3 -0
  31. package/dist/components/base/CkMilkdownEditor/index.d.ts.map +1 -0
  32. package/dist/components/base/CkMilkdownEditor/markdownClassAttrs.d.ts +16 -0
  33. package/dist/components/base/CkMilkdownEditor/markdownClassAttrs.d.ts.map +1 -0
  34. package/dist/components/base/CkMilkdownEditor/types.d.ts +98 -0
  35. package/dist/components/base/CkMilkdownEditor/types.d.ts.map +1 -0
  36. package/dist/components/base/index.d.ts +2 -0
  37. package/dist/components/base/index.d.ts.map +1 -1
  38. package/dist/components/index.d.ts +2 -2
  39. package/dist/components/index.d.ts.map +1 -1
  40. package/dist/components/index.js +12 -11
  41. package/dist/composables/fileUpload/useFileUpload.d.ts.map +1 -1
  42. package/dist/composables/index.js +1 -1
  43. package/dist/composables/useChat.d.ts.map +1 -1
  44. package/dist/composables/useConversations.d.ts.map +1 -1
  45. package/dist/createCrepeEditor-CFbvSH3s.js +74141 -0
  46. package/dist/crystal-DyuLTqLs.js +398 -0
  47. package/dist/css-DkSyTW67.js +1772 -0
  48. package/dist/cypher-Dlu_3r4V.js +121 -0
  49. package/dist/d-UURgV0Ux.js +179 -0
  50. package/dist/diff-B_Bi2Crb.js +25 -0
  51. package/dist/dockerfile-Bvk733Ga.js +201 -0
  52. package/dist/dtd-Dy74G54E.js +114 -0
  53. package/dist/dylan-TSb-Nfix.js +314 -0
  54. package/dist/ebnf-4fKAGW3a.js +140 -0
  55. package/dist/ecl-B59qGGVg.js +178 -0
  56. package/dist/eiffel-Dze7nlu3.js +134 -0
  57. package/dist/elm-DG7jkhNZ.js +176 -0
  58. package/dist/erlang-BO6gOnGA.js +674 -0
  59. package/dist/factor-CMxFHDqz.js +65 -0
  60. package/dist/fcl-CDDUNjTj.js +141 -0
  61. package/dist/forth-B9D2JCeE.js +116 -0
  62. package/dist/fortran-CAG2BFbe.js +467 -0
  63. package/dist/gas-0Aw8zDr5.js +293 -0
  64. package/dist/gherkin-DhZlEZiy.js +115 -0
  65. package/dist/groovy-CpwJiBl7.js +223 -0
  66. package/dist/handlers/index.js +1 -1
  67. package/dist/handlers/useChatKitLabels.d.ts +62 -1
  68. package/dist/handlers/useChatKitLabels.d.ts.map +1 -1
  69. package/dist/haskell-ySd-OUo8.js +459 -0
  70. package/dist/haxe-7MlzfeYV.js +514 -0
  71. package/dist/http-BqypyemW.js +79 -0
  72. package/dist/idl-4HIGJlDI.js +985 -0
  73. package/dist/index-A5rWjRtZ.js +689 -0
  74. package/dist/index-B0ldhzaj.js +385 -0
  75. package/dist/index-BVOjyn3y.js +2490 -0
  76. package/dist/index-BWvkps_G.js +309 -0
  77. package/dist/index-BaS8OW8V.js +151 -0
  78. package/dist/index-BlHHEbV-.js +406 -0
  79. package/dist/index-BoqzHVNB.js +82 -0
  80. package/dist/index-C6zYjwIQ.js +704 -0
  81. package/dist/{index-Dn4ctxk8.js → index-C72e57-5.js} +48 -24
  82. package/dist/index-CMJGuXap.js +330 -0
  83. package/dist/index-CRfGWVdQ.js +116 -0
  84. package/dist/index-C_gTb50u.js +81 -0
  85. package/dist/index-DSU7cBGz.js +178 -0
  86. package/dist/index-DSq3gvqU.js +1767 -0
  87. package/dist/index-Da3777l2.js +289 -0
  88. package/dist/index-DdlzabmR.js +1021 -0
  89. package/dist/index-DhY_9bdS.js +61 -0
  90. package/dist/index-Dm6C1blN.js +1052 -0
  91. package/dist/index-Tj3pzx-E.js +327 -0
  92. package/dist/index-ZeRS5rER.js +97 -0
  93. package/dist/index-gzleljO6.js +157 -0
  94. package/dist/index-naWlQpaL.js +642 -0
  95. package/dist/index-sKO1lHHC.js +312 -0
  96. package/dist/index.d.ts +2 -2
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +15 -14
  99. package/dist/javascript-Bt8B7yTi.js +992 -0
  100. package/dist/julia-Bs6JJhYG.js +407 -0
  101. package/dist/livescript-DmzgM3Yt.js +296 -0
  102. package/dist/lua-Cvg8VrAA.js +256 -0
  103. package/dist/mathematica-DNLOL9PQ.js +110 -0
  104. package/dist/mbox-Ga7d4MMN.js +117 -0
  105. package/dist/mirc-Dma3B8rS.js +107 -0
  106. package/dist/mllike-DHn7xckP.js +334 -0
  107. package/dist/modelica-0d55jYY0.js +147 -0
  108. package/dist/mscgen-DdqZYINH.js +135 -0
  109. package/dist/mumps-Btr8VblO.js +93 -0
  110. package/dist/nginx-DTDtBDVN.js +141 -0
  111. package/dist/nsis-CyKBdPWp.js +62 -0
  112. package/dist/ntriples-CvgOYMpL.js +153 -0
  113. package/dist/octave-DYBj3-tl.js +200 -0
  114. package/dist/oz-R_e8WMIi.js +231 -0
  115. package/dist/pascal-GD8iposT.js +105 -0
  116. package/dist/perl-DL9mHpoi.js +1105 -0
  117. package/dist/pig-C_4T4YIV.js +101 -0
  118. package/dist/powershell-B0suO7Vd.js +328 -0
  119. package/dist/properties-BR-vP1aU.js +58 -0
  120. package/dist/protobuf-BxgpyhoW.js +77 -0
  121. package/dist/pug-vHnWR0UE.js +405 -0
  122. package/dist/puppet-Bdao66PW.js +137 -0
  123. package/dist/python-BFGRmuZ9.js +426 -0
  124. package/dist/q-CrbCVq4a.js +131 -0
  125. package/dist/r-V7nswm59.js +170 -0
  126. package/dist/rpm-C-DLY-If.js +109 -0
  127. package/dist/ruby-CQTpZw6f.js +331 -0
  128. package/dist/sas-D2UG-yhZ.js +207 -0
  129. package/dist/scheme-BKzrkGJD.js +222 -0
  130. package/dist/shell-BlsXDxCn.js +222 -0
  131. package/dist/sieve-CjwBwOY5.js +135 -0
  132. package/dist/simple-mode-DMneyfDu.js +130 -0
  133. package/dist/smalltalk-BOIGQuhN.js +121 -0
  134. package/dist/solr-CwD7U71z.js +69 -0
  135. package/dist/sparql-DYskk2vE.js +249 -0
  136. package/dist/spreadsheet-Bgtt3oLP.js +87 -0
  137. package/dist/sql-Cei9CMfk.js +342 -0
  138. package/dist/stex-C1nZSzAw.js +230 -0
  139. package/dist/stylus-BkS-boTH.js +565 -0
  140. package/dist/swift-FRZi1uvB.js +291 -0
  141. package/dist/tcl-CUcaCdmq.js +114 -0
  142. package/dist/test-utils/createTextPlugin.d.ts +7 -1
  143. package/dist/test-utils/createTextPlugin.d.ts.map +1 -1
  144. package/dist/textile-BnFpjsrl.js +414 -0
  145. package/dist/tiddlywiki-CjprD-Qp.js +218 -0
  146. package/dist/tiki-DK9DOeWn.js +268 -0
  147. package/dist/toml-BOuWGMcf.js +76 -0
  148. package/dist/troff-E1bJ0PPL.js +61 -0
  149. package/dist/ttcn-cfg-Dc39-fIP.js +133 -0
  150. package/dist/ttcn-tKd4HLu4.js +192 -0
  151. package/dist/turtle-Dq7-1WAf.js +124 -0
  152. package/dist/{useChatKitLabels-CMOr3Kjq.js → useChatKitLabels-Ww1Q7xUr.js} +26 -3
  153. package/dist/vb-Dp90gtsv.js +196 -0
  154. package/dist/vbscript-Bfn8O8I7.js +478 -0
  155. package/dist/velocity-BwIZK1TH.js +149 -0
  156. package/dist/verilog-CnT9bMk0.js +429 -0
  157. package/dist/vhdl-DCkMIyT9.js +158 -0
  158. package/dist/webidl-BTLTThCm.js +204 -0
  159. package/dist/xquery-BrBUuxMR.js +525 -0
  160. package/dist/yacas-b5lAVEIl.js +130 -0
  161. package/dist/z80-ClgwfNdB.js +92 -0
  162. package/package.json +11 -5
  163. package/src/adapters/responses-api.spec.ts +86 -0
  164. package/src/adapters/responses-api.ts +13 -9
  165. package/src/components/base/CkCitationCard/CkCitationCard.vue +1 -1
  166. package/src/components/base/CkCitationLabel/CkCitationLabel.vue +1 -1
  167. package/src/components/base/CkConversationLayout/CkConversationLayout.spec.ts +1 -5
  168. package/src/components/base/CkCopyMessageButton/CkCopyMessageButton.spec.ts +1 -1
  169. package/src/components/base/CkFeedbackButton/CkFeedbackButton.vue +3 -3
  170. package/src/components/base/CkFeedbackDialog/CkFeedbackDialog.vue +9 -9
  171. package/src/components/base/CkHistoryItem/CkHistoryItem.vue +5 -7
  172. package/src/components/base/CkHistoryWrapper/CkHistoryWrapper.vue +2 -1
  173. package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.ts +9 -4
  174. package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.vue +1 -1
  175. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.spec.ts +221 -0
  176. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.ts +274 -0
  177. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.vue +151 -0
  178. package/src/components/base/CkMilkdownEditor/codeMirrorTheme.ts +132 -0
  179. package/src/components/base/CkMilkdownEditor/createCrepeEditor.ts +192 -0
  180. package/src/components/base/CkMilkdownEditor/crepeIcons.ts +77 -0
  181. package/src/components/base/CkMilkdownEditor/index.ts +2 -0
  182. package/src/components/base/CkMilkdownEditor/markdownClassAttrs.ts +64 -0
  183. package/src/components/base/CkMilkdownEditor/milkdown-theme.css +441 -0
  184. package/src/components/base/CkMilkdownEditor/types.ts +100 -0
  185. package/src/components/base/CkModelSelector/CkModelSelector.vue +3 -3
  186. package/src/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.stories.ts +2 -2
  187. package/src/components/base/index.ts +6 -0
  188. package/src/components/index.ts +4 -0
  189. package/src/composables/fileUpload/useFileUpload.ts +45 -30
  190. package/src/composables/fileUpload/useFileUploadWrapper.spec.ts +1 -1
  191. package/src/composables/fileUpload/useFileUploadWrapper.ts +3 -3
  192. package/src/composables/useChat.ts +3 -1
  193. package/src/composables/useConversations.ts +8 -5
  194. package/src/handlers/useChatKitLabels.spec.ts +0 -1
  195. package/src/handlers/useChatKitLabels.ts +29 -2
  196. package/src/handlers/useMarkdownParser.ts +1 -1
  197. package/src/index.ts +4 -0
  198. package/src/test-setup.ts +3 -3
  199. package/src/test-utils/createTextPlugin.ts +11 -3
@@ -137,8 +137,9 @@ class Semaphore {
137
137
  }
138
138
 
139
139
  release(): void {
140
- if (this.queue.length > 0) {
141
- this.queue.shift()!();
140
+ const next = this.queue.shift();
141
+ if (next) {
142
+ next();
142
143
  } else {
143
144
  this.permits++;
144
145
  }
@@ -184,7 +185,12 @@ function generateCanvasThumbnail(
184
185
  const canvas = document.createElement('canvas');
185
186
  canvas.width = w;
186
187
  canvas.height = h;
187
- const ctx = canvas.getContext('2d')!;
188
+ const ctx = canvas.getContext('2d');
189
+ if (!ctx) {
190
+ URL.revokeObjectURL(url);
191
+ reject(new Error('Canvas 2D context is not available'));
192
+ return;
193
+ }
188
194
  ctx.drawImage(img, 0, 0, w, h);
189
195
 
190
196
  const dataUrl = canvas.toDataURL('image/png');
@@ -284,12 +290,18 @@ async function runCustomValidators(
284
290
  // Retry
285
291
  // ---------------------------------------------------------------------------
286
292
 
293
+ function extractHttpStatus(err: unknown): number | undefined {
294
+ const e = err as {
295
+ httpStatus?: number;
296
+ status?: number;
297
+ response?: { status?: number };
298
+ } | null;
299
+ return e?.httpStatus ?? e?.status ?? e?.response?.status;
300
+ }
301
+
287
302
  function isRetryable(err: unknown, policy: RetryPolicy): boolean {
288
303
  if (!policy.retryableStatusCodes?.length) return true;
289
- const status =
290
- (err as any)?.httpStatus ??
291
- (err as any)?.status ??
292
- (err as any)?.response?.status;
304
+ const status = extractHttpStatus(err);
293
305
  return status != null && policy.retryableStatusCodes.includes(status);
294
306
  }
295
307
 
@@ -608,10 +620,11 @@ export function useFileUpload(
608
620
 
609
621
  for (let i = 0; i < uploadReady.length; i++) {
610
622
  const { stateKey } = uploadReady[i] as { file: File; stateKey: string };
611
- const entry = files.value.get(stateKey)!;
623
+ const entry = files.value.get(stateKey);
624
+ if (!entry) continue;
625
+ const startedAt = entry.uploadStartedAt ?? completedAt;
612
626
  const durationMs =
613
- new Date(completedAt).getTime() -
614
- new Date(entry.uploadStartedAt!).getTime();
627
+ new Date(completedAt).getTime() - new Date(startedAt).getTime();
615
628
 
616
629
  const remoteResult = results[i] as
617
630
  | { id?: string; documentId?: string }
@@ -682,12 +695,13 @@ export function useFileUpload(
682
695
  const uploadErr: FileUploadError = {
683
696
  code: 'UPLOAD_FAILED',
684
697
  message: (err as Error).message ?? 'Upload failed.',
685
- httpStatus: (err as any)?.httpStatus ?? (err as any)?.status,
698
+ httpStatus: extractHttpStatus(err),
686
699
  occurredAt: completedAt,
687
700
  };
688
701
 
689
702
  for (const { stateKey } of uploadReady) {
690
- const entry = files.value.get(stateKey)!;
703
+ const entry = files.value.get(stateKey);
704
+ if (!entry) continue;
691
705
  const durationMs = entry.uploadStartedAt
692
706
  ? new Date(completedAt).getTime() -
693
707
  new Date(entry.uploadStartedAt).getTime()
@@ -764,16 +778,17 @@ export function useFileUpload(
764
778
 
765
779
  const uploadStarted = now();
766
780
  for (const { stateKey } of uploadReady) {
781
+ const attemptCount = (files.value.get(stateKey)?.attemptCount ?? 0) + 1;
767
782
  updateEntry(stateKey, {
768
783
  status: 'uploading',
769
784
  uploadStartedAt: uploadStarted,
770
- attemptCount: (files.value.get(stateKey)?.attemptCount ?? 0) + 1,
785
+ attemptCount,
771
786
  lastAttemptAt: uploadStarted,
772
787
  });
773
788
  emit({
774
789
  type: 'file:uploading',
775
790
  fileId: stateKey,
776
- attemptCount: files.value.get(stateKey)!.attemptCount,
791
+ attemptCount,
777
792
  });
778
793
  }
779
794
 
@@ -863,17 +878,20 @@ export function useFileUpload(
863
878
  ): UploadResult {
864
879
  return {
865
880
  id: groupId,
866
- results: batch.map(({ stateKey }) => {
867
- const entry = files.value.get(stateKey)!;
868
- return {
869
- fileId: stateKey,
870
- success: entry.status === 'success',
871
- status: entry.status,
872
- remoteFileId: entry.remoteFileId ?? undefined,
873
- error: entry.error ?? undefined,
874
- uploadDate: entry.uploadCompletedAt ?? entry.queuedAt,
875
- metadata: entry.metadata,
876
- } satisfies UploadFileResult;
881
+ results: batch.flatMap(({ stateKey }) => {
882
+ const entry = files.value.get(stateKey);
883
+ if (!entry) return [];
884
+ return [
885
+ {
886
+ fileId: stateKey,
887
+ success: entry.status === 'success',
888
+ status: entry.status,
889
+ remoteFileId: entry.remoteFileId ?? undefined,
890
+ error: entry.error ?? undefined,
891
+ uploadDate: entry.uploadCompletedAt ?? entry.queuedAt,
892
+ metadata: entry.metadata,
893
+ } satisfies UploadFileResult,
894
+ ];
877
895
  }),
878
896
  };
879
897
  }
@@ -927,10 +945,7 @@ export function useFileUpload(
927
945
  try {
928
946
  await client.delete(endpoints.file(storeId, entry.remoteFileId));
929
947
  } catch (err) {
930
- const status =
931
- (err as any)?.httpStatus ??
932
- (err as any)?.status ??
933
- (err as any)?.response?.status;
948
+ const status = extractHttpStatus(err);
934
949
 
935
950
  if (status === 404) {
936
951
  // File no longer exists on the server — proceed with local removal.
@@ -1022,7 +1037,7 @@ export function useFileUpload(
1022
1037
  files.value.delete(entry.id);
1023
1038
  if (db) {
1024
1039
  deletePersistedEntry(db, persistStoreName, entry.id).catch(
1025
- () => {},
1040
+ () => undefined,
1026
1041
  );
1027
1042
  }
1028
1043
  }
@@ -206,7 +206,7 @@ describe('useFileUploadWrapper handleFilesSelected', () => {
206
206
  const { handleFilesSelected } = provider.useDocumentUpload('conv-1');
207
207
 
208
208
  const event = makeInputEvent([createFile('a.pdf')]);
209
- const input = (event as any).target as HTMLInputElement;
209
+ const input = event.target as unknown as HTMLInputElement;
210
210
 
211
211
  const valueSetter = vi.spyOn(input, 'value', 'set');
212
212
 
@@ -401,9 +401,9 @@ export function createDocumentUploadProvider(
401
401
  }
402
402
  }
403
403
 
404
- const successFileIds = result.results
405
- .filter((r) => r.success && r.remoteFileId)
406
- .map((r) => r.remoteFileId!);
404
+ const successFileIds = result.results.flatMap((r) =>
405
+ r.success && r.remoteFileId ? [r.remoteFileId] : [],
406
+ );
407
407
 
408
408
  if (successFileIds.length > 0) {
409
409
  await upload.runWorkflow(successFileIds);
@@ -15,4 +15,6 @@
15
15
  * await chat.sendMessage({ role: 'user', content: 'Hello' });
16
16
  * ```
17
17
  */
18
- export function useChat() {}
18
+ export function useChat() {
19
+ throw new Error('useChat is not implemented yet.');
20
+ }
@@ -216,11 +216,14 @@ export function useConversations(
216
216
  const raw = await http.post<RawConversation>(path, body);
217
217
  const created = mapConversation(raw);
218
218
 
219
- conversations.value = placeholder
220
- ? conversations.value.map((c) =>
221
- c.id === placeholder!.id ? created : c,
222
- )
223
- : [created, ...conversations.value];
219
+ if (placeholder) {
220
+ const placeholderId = placeholder.id;
221
+ conversations.value = conversations.value.map((c) =>
222
+ c.id === placeholderId ? created : c,
223
+ );
224
+ } else {
225
+ conversations.value = [created, ...conversations.value];
226
+ }
224
227
 
225
228
  return created;
226
229
  } catch (e) {
@@ -1,4 +1,3 @@
1
- /* eslint-disable vue/one-component-per-file */
2
1
  import type { ChatKitLabels } from './useChatKitLabels';
3
2
  import {
4
3
  CHAT_KIT_LABELS,
@@ -111,10 +111,28 @@ export type ChatKitLabels = {
111
111
  * set and more conversations exist than the limit.
112
112
  */
113
113
  historyShowAll?: string;
114
+ /** Accessible name of the "Bold" button in the `CkMilkdownEditor` toolbar. */
115
+ markdownEditorBold?: string;
116
+ /** Accessible name of the "Italic" button in the `CkMilkdownEditor` toolbar. */
117
+ markdownEditorItalic?: string;
118
+ /** Accessible name of the "Strikethrough" button in the `CkMilkdownEditor` toolbar. */
119
+ markdownEditorStrikethrough?: string;
120
+ /** Accessible name of the "Inline code" button in the `CkMilkdownEditor` toolbar. */
121
+ markdownEditorInlineCode?: string;
122
+ /** Accessible name of the "Link" button in the `CkMilkdownEditor` toolbar. */
123
+ markdownEditorLink?: string;
124
+ /** Placeholder of the URL input in the `CkMilkdownEditor` link tooltip. */
125
+ markdownEditorLinkPlaceholder?: string;
126
+ /** Label of the copy button on a `CkMilkdownEditor` code block. */
127
+ markdownEditorCopyCode?: string;
128
+ /** Placeholder of the language search input on a `CkMilkdownEditor` code block. */
129
+ markdownEditorSearchLanguage?: string;
130
+ /** Empty-state text of the language search on a `CkMilkdownEditor` code block. */
131
+ markdownEditorNoLanguageFound?: string;
114
132
  };
115
133
 
116
134
  /** English defaults used when no labels are provided by the consumer. */
117
- export const defaultChatKitLabels: ChatKitLabels = {
135
+ export const defaultChatKitLabels = {
118
136
  agentAvatarAlt: 'Agent avatar',
119
137
  agentLoadingAvatarAlt: 'Agent loading',
120
138
  inputPlaceholder: 'Type a message...',
@@ -150,7 +168,16 @@ export const defaultChatKitLabels: ChatKitLabels = {
150
168
  historyItemEditAction: 'Edit',
151
169
  historyItemDeleteAction: 'Delete',
152
170
  historyShowAll: 'Show all',
153
- };
171
+ markdownEditorBold: 'Bold',
172
+ markdownEditorItalic: 'Italic',
173
+ markdownEditorStrikethrough: 'Strikethrough',
174
+ markdownEditorInlineCode: 'Inline code',
175
+ markdownEditorLink: 'Link',
176
+ markdownEditorLinkPlaceholder: 'Paste or type a link…',
177
+ markdownEditorCopyCode: 'Copy code',
178
+ markdownEditorSearchLanguage: 'Search language…',
179
+ markdownEditorNoLanguageFound: 'No language found',
180
+ } satisfies Required<ChatKitLabels>;
154
181
 
155
182
  /** Vue injection key for ChatKit labels. */
156
183
  export const CHAT_KIT_LABELS: InjectionKey<ComputedRef<ChatKitLabels>> =
@@ -100,7 +100,7 @@ export function useMarkdownParser(
100
100
  let cachedProcessor: SyncProcessor | undefined;
101
101
 
102
102
  function getProcessor(list: PluggableList): SyncProcessor {
103
- if (list === cachedPlugins) return cachedProcessor!;
103
+ if (list === cachedPlugins && cachedProcessor) return cachedProcessor;
104
104
  cachedPlugins = list;
105
105
  cachedProcessor = buildProcessor(list);
106
106
  return cachedProcessor;
package/src/index.ts CHANGED
@@ -99,6 +99,7 @@ export {
99
99
  CkStopIcon,
100
100
  CkUserMessage,
101
101
  CkEditableUserMessage,
102
+ CkMilkdownEditor,
102
103
  } from './components';
103
104
  export type {
104
105
  CkAgentMessageHeaderProps,
@@ -141,6 +142,9 @@ export type {
141
142
  CkUserMessageProps,
142
143
  CkEditableUserMessageProps,
143
144
  CkEditableUserMessageEmits,
145
+ CkMilkdownEditorEmits,
146
+ CkMilkdownEditorExposed,
147
+ CkMilkdownEditorProps,
144
148
  } from './components';
145
149
 
146
150
  // Helpers
package/src/test-setup.ts CHANGED
@@ -6,7 +6,7 @@ import '@testing-library/jest-dom/vitest';
6
6
 
7
7
  // ResizeObserver is not available in JSDOM
8
8
  global.ResizeObserver = class ResizeObserver {
9
- observe(): void {}
10
- unobserve(): void {}
11
- disconnect(): void {}
9
+ observe = (): void => undefined;
10
+ unobserve = (): void => undefined;
11
+ disconnect = (): void => undefined;
12
12
  };
@@ -1,7 +1,15 @@
1
+ type TextPluginNode = {
2
+ type: string;
3
+ value?: string;
4
+ children?: TextPluginNode[];
5
+ };
6
+
1
7
  export function createTextPlugin(transform: (text: string) => string) {
2
- return () => (tree: any) => {
3
- const visit = (node: any) => {
4
- if (node.type === 'text') node.value = transform(node.value);
8
+ return () => (tree: TextPluginNode) => {
9
+ const visit = (node: TextPluginNode) => {
10
+ if (node.type === 'text' && node.value !== undefined) {
11
+ node.value = transform(node.value);
12
+ }
5
13
  if (node.children) node.children.forEach(visit);
6
14
  };
7
15
  visit(tree);