@copilotkit/react-textarea 0.24.0 → 0.25.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 (222) hide show
  1. package/.turbo/turbo-build.log +99 -99
  2. package/CHANGELOG.md +11 -0
  3. package/dist/{chunk-WJYQWL4I.mjs → chunk-2C7O2EVM.mjs} +1 -1
  4. package/dist/{chunk-WJYQWL4I.mjs.map → chunk-2C7O2EVM.mjs.map} +1 -1
  5. package/dist/{chunk-KCHYD3EB.mjs → chunk-2CDXHWVF.mjs} +1 -1
  6. package/dist/chunk-2CDXHWVF.mjs.map +1 -0
  7. package/dist/{chunk-GCMQHIRF.mjs → chunk-2QDCE7PD.mjs} +1 -1
  8. package/dist/chunk-2QDCE7PD.mjs.map +1 -0
  9. package/dist/{chunk-ND5PXTAW.mjs → chunk-3PQ7GSFE.mjs} +1 -1
  10. package/dist/chunk-3PQ7GSFE.mjs.map +1 -0
  11. package/dist/{chunk-GIJ3JZ4P.mjs → chunk-5IISSXS2.mjs} +11 -11
  12. package/dist/chunk-5IISSXS2.mjs.map +1 -0
  13. package/dist/{chunk-RQHOUUXQ.mjs → chunk-5UNJXFUO.mjs} +1 -1
  14. package/dist/{chunk-RQHOUUXQ.mjs.map → chunk-5UNJXFUO.mjs.map} +1 -1
  15. package/dist/{chunk-JYVC4AW3.mjs → chunk-74HF6Q3L.mjs} +26 -27
  16. package/dist/chunk-74HF6Q3L.mjs.map +1 -0
  17. package/dist/{chunk-MPME5BW2.mjs → chunk-7LSRNPNI.mjs} +1 -1
  18. package/dist/chunk-7LSRNPNI.mjs.map +1 -0
  19. package/dist/{chunk-4UYKBG35.mjs → chunk-7SZDD6XT.mjs} +4 -8
  20. package/dist/chunk-7SZDD6XT.mjs.map +1 -0
  21. package/dist/{chunk-AQHORK66.mjs → chunk-7VKOE5UL.mjs} +6 -10
  22. package/dist/chunk-7VKOE5UL.mjs.map +1 -0
  23. package/dist/{chunk-463BFNUP.mjs → chunk-AUCHS4VR.mjs} +2 -2
  24. package/dist/chunk-AUCHS4VR.mjs.map +1 -0
  25. package/dist/{chunk-JAFCXEPU.mjs → chunk-BLRAOGXD.mjs} +2 -2
  26. package/dist/{chunk-JAFCXEPU.mjs.map → chunk-BLRAOGXD.mjs.map} +1 -1
  27. package/dist/{chunk-O4MHJSK2.mjs → chunk-CK7Q3Y5A.mjs} +2 -2
  28. package/dist/{chunk-IXJ2HCOA.mjs → chunk-ECR45NSD.mjs} +1 -1
  29. package/dist/chunk-ECR45NSD.mjs.map +1 -0
  30. package/dist/{chunk-OELUUJZY.mjs → chunk-EZCKXWQF.mjs} +1 -1
  31. package/dist/chunk-EZCKXWQF.mjs.map +1 -0
  32. package/dist/{chunk-KGKLUWKW.mjs → chunk-F626GQCD.mjs} +1 -1
  33. package/dist/chunk-F626GQCD.mjs.map +1 -0
  34. package/dist/{chunk-5EJ5XOGP.mjs → chunk-FK2XUDQQ.mjs} +2 -2
  35. package/dist/chunk-FK2XUDQQ.mjs.map +1 -0
  36. package/dist/chunk-FP2EKU3L.mjs +28 -0
  37. package/dist/chunk-FP2EKU3L.mjs.map +1 -0
  38. package/dist/{chunk-F3MHL6ZY.mjs → chunk-GQN2HYFJ.mjs} +2 -5
  39. package/dist/chunk-GQN2HYFJ.mjs.map +1 -0
  40. package/dist/{chunk-AXN37AHC.mjs → chunk-K5LNB36H.mjs} +1 -1
  41. package/dist/chunk-K5LNB36H.mjs.map +1 -0
  42. package/dist/{chunk-JHTAOLEW.mjs → chunk-KDVMG3XF.mjs} +1 -1
  43. package/dist/chunk-KDVMG3XF.mjs.map +1 -0
  44. package/dist/{chunk-2NURR2DX.mjs → chunk-KMXSZRIA.mjs} +2 -2
  45. package/dist/chunk-KMXSZRIA.mjs.map +1 -0
  46. package/dist/{chunk-4S5ZJH3I.mjs → chunk-KNQIEOFP.mjs} +1 -1
  47. package/dist/{chunk-4S5ZJH3I.mjs.map → chunk-KNQIEOFP.mjs.map} +1 -1
  48. package/dist/{chunk-YQU7WG7T.mjs → chunk-LZ3UOAQ4.mjs} +3 -3
  49. package/dist/chunk-LZ3UOAQ4.mjs.map +1 -0
  50. package/dist/{chunk-NKW5OU2S.mjs → chunk-M2DR4KVB.mjs} +1 -1
  51. package/dist/chunk-M2DR4KVB.mjs.map +1 -0
  52. package/dist/{chunk-GUH3Y2H4.mjs → chunk-NTLVQENP.mjs} +5 -5
  53. package/dist/chunk-NTLVQENP.mjs.map +1 -0
  54. package/dist/{chunk-O5OWT5GE.mjs → chunk-PDCIGRCE.mjs} +8 -29
  55. package/dist/chunk-PDCIGRCE.mjs.map +1 -0
  56. package/dist/{chunk-YW3REYX6.mjs → chunk-QRKKPCUD.mjs} +2 -4
  57. package/dist/chunk-QRKKPCUD.mjs.map +1 -0
  58. package/dist/{chunk-RR6OQGTI.mjs → chunk-RBR32FWA.mjs} +1 -1
  59. package/dist/chunk-RBR32FWA.mjs.map +1 -0
  60. package/dist/{chunk-YTOPHPSG.mjs → chunk-T6MTDQZ7.mjs} +1 -1
  61. package/dist/chunk-T6MTDQZ7.mjs.map +1 -0
  62. package/dist/{chunk-QJDMIGLU.mjs → chunk-TZLW7PBU.mjs} +9 -12
  63. package/dist/chunk-TZLW7PBU.mjs.map +1 -0
  64. package/dist/{chunk-CSGFJU3L.mjs → chunk-U3LUDDT5.mjs} +2 -2
  65. package/dist/chunk-U3LUDDT5.mjs.map +1 -0
  66. package/dist/{chunk-LNAIMEB2.mjs → chunk-UEQYKC4W.mjs} +1 -1
  67. package/dist/chunk-UEQYKC4W.mjs.map +1 -0
  68. package/dist/{chunk-OD7ZMOVE.mjs → chunk-V55OPCG4.mjs} +2 -2
  69. package/dist/chunk-V55OPCG4.mjs.map +1 -0
  70. package/dist/{chunk-4HHYJGZE.mjs → chunk-VYECMH73.mjs} +7 -25
  71. package/dist/chunk-VYECMH73.mjs.map +1 -0
  72. package/dist/{chunk-3L6CNVCE.mjs → chunk-W2ZHOUV6.mjs} +5 -5
  73. package/dist/chunk-W2ZHOUV6.mjs.map +1 -0
  74. package/dist/{chunk-UHD44NC5.mjs → chunk-WVRTFPNO.mjs} +10 -20
  75. package/dist/chunk-WVRTFPNO.mjs.map +1 -0
  76. package/dist/{chunk-4LOLCQGR.mjs → chunk-ZEHF3AXH.mjs} +4 -9
  77. package/dist/chunk-ZEHF3AXH.mjs.map +1 -0
  78. package/dist/{chunk-XHUMROEY.mjs → chunk-ZKRM3DIR.mjs} +1 -1
  79. package/dist/chunk-ZKRM3DIR.mjs.map +1 -0
  80. package/dist/{chunk-WLPYYGES.mjs → chunk-ZMNOLW5V.mjs} +6 -16
  81. package/dist/chunk-ZMNOLW5V.mjs.map +1 -0
  82. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +31 -31
  83. package/dist/components/base-copilot-textarea/render-element.mjs +1 -1
  84. package/dist/components/base-copilot-textarea/render-placeholder.mjs +1 -1
  85. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +2 -2
  86. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +1 -1
  87. package/dist/components/copilot-textarea/copilot-textarea.mjs +40 -40
  88. package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +1 -1
  89. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +1 -1
  90. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +1 -1
  91. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +15 -15
  92. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +10 -10
  93. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +11 -11
  94. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +3 -3
  95. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +11 -11
  96. package/dist/components/index.mjs +40 -40
  97. package/dist/components/manual-ui/chip-with-icon.mjs +1 -5
  98. package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
  99. package/dist/components/source-search-box/source-search-box.mjs +4 -4
  100. package/dist/components/ui/button.mjs +2 -2
  101. package/dist/components/ui/card.mjs +46 -42
  102. package/dist/components/ui/card.mjs.map +1 -1
  103. package/dist/components/ui/command.mjs +3 -3
  104. package/dist/components/ui/dialog.mjs +2 -2
  105. package/dist/components/ui/label.mjs +2 -2
  106. package/dist/components/ui/separator.mjs +14 -16
  107. package/dist/components/ui/separator.mjs.map +1 -1
  108. package/dist/components/ui/textarea.mjs +1 -1
  109. package/dist/components/ui/textarea.mjs.map +1 -1
  110. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.d.ts +1 -1
  111. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +4 -4
  112. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +2 -2
  113. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +3 -3
  114. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +8 -8
  115. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +8 -8
  116. package/dist/hooks/misc/use-autosize-textarea.mjs +1 -1
  117. package/dist/index.mjs +40 -40
  118. package/dist/lib/debouncer.mjs +1 -1
  119. package/dist/lib/editor-to-text.mjs +1 -1
  120. package/dist/lib/get-text-around-cursor.mjs +1 -1
  121. package/dist/lib/retry.mjs +1 -1
  122. package/dist/lib/slatejs-edits/add-autocompletions.mjs +1 -1
  123. package/dist/lib/slatejs-edits/clear-autocompletions.mjs +1 -1
  124. package/dist/lib/slatejs-edits/replace-text.mjs +1 -1
  125. package/dist/lib/slatejs-edits/with-partial-history.mjs +1 -1
  126. package/dist/lib/stream-promise-flatten.mjs +1 -1
  127. package/dist/lib/utils.mjs +1 -1
  128. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +5 -5
  129. package/dist/types/autosuggestions-config/editing-api-config.mjs +1 -1
  130. package/dist/types/autosuggestions-config/index.mjs +6 -6
  131. package/dist/types/autosuggestions-config/insertions-api-config.mjs +1 -1
  132. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +1 -1
  133. package/dist/types/autosuggestions-config/suggestions-api-config.mjs +1 -1
  134. package/dist/types/base/base-autosuggestions-config.d.ts +55 -2
  135. package/dist/types/base/base-autosuggestions-config.mjs +1 -1
  136. package/dist/types/base/editor-autocomplete-state.mjs +2 -2
  137. package/dist/types/base/index.mjs +1 -1
  138. package/dist/types/index.mjs +6 -6
  139. package/package.json +2 -2
  140. package/src/components/base-copilot-textarea/base-copilot-textarea.tsx +31 -37
  141. package/src/components/base-copilot-textarea/render-element.tsx +3 -5
  142. package/src/components/base-copilot-textarea/render-placeholder.tsx +2 -4
  143. package/src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx +2 -5
  144. package/src/components/base-copilot-textarea/use-add-branding-css.tsx +2 -4
  145. package/src/components/copilot-textarea/copilot-textarea.tsx +11 -18
  146. package/src/components/hovering-toolbar/hovering-editor-provider.tsx +1 -3
  147. package/src/components/hovering-toolbar/hovering-toolbar-components.tsx +14 -31
  148. package/src/components/hovering-toolbar/hovering-toolbar.tsx +4 -16
  149. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.tsx +11 -25
  150. package/src/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.tsx +2 -7
  151. package/src/components/manual-ui/chip-with-icon.tsx +3 -12
  152. package/src/components/source-search-box/source-search-box.tsx +2 -12
  153. package/src/components/ui/button.tsx +6 -13
  154. package/src/components/ui/card.tsx +35 -65
  155. package/src/components/ui/command.tsx +8 -21
  156. package/src/components/ui/dialog.tsx +8 -29
  157. package/src/components/ui/label.tsx +3 -8
  158. package/src/components/ui/separator.tsx +13 -18
  159. package/src/components/ui/textarea.tsx +3 -4
  160. package/src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts +13 -27
  161. package/src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx +1 -5
  162. package/src/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.ts +4 -11
  163. package/src/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.tsx +5 -10
  164. package/src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx +15 -35
  165. package/src/hooks/misc/use-autosize-textarea.tsx +1 -4
  166. package/src/lib/debouncer.ts +1 -3
  167. package/src/lib/editor-to-text.ts +4 -7
  168. package/src/lib/get-text-around-cursor.ts +2 -14
  169. package/src/lib/retry.tsx +1 -1
  170. package/src/lib/slatejs-edits/add-autocompletions.ts +2 -2
  171. package/src/lib/slatejs-edits/clear-autocompletions.ts +1 -4
  172. package/src/lib/slatejs-edits/replace-text.ts +1 -1
  173. package/src/lib/slatejs-edits/with-partial-history.ts +4 -11
  174. package/src/lib/stream-promise-flatten.ts +1 -3
  175. package/src/lib/utils.ts +4 -8
  176. package/src/types/autosuggestions-config/autosuggestions-config-user-specified.tsx +3 -7
  177. package/src/types/autosuggestions-config/autosuggestions-config.tsx +5 -18
  178. package/src/types/autosuggestions-config/editing-api-config.tsx +3 -5
  179. package/src/types/autosuggestions-config/insertions-api-config.tsx +2 -3
  180. package/src/types/autosuggestions-config/subtypes/chatlike-api-endpoint.tsx +18 -26
  181. package/src/types/autosuggestions-config/subtypes/make-system-prompt.ts +1 -4
  182. package/src/types/autosuggestions-config/suggestions-api-config.tsx +2 -3
  183. package/src/types/base/autosuggestions-bare-function.ts +2 -2
  184. package/src/types/base/base-autosuggestions-config.tsx +80 -3
  185. package/src/types/base/editor-autocomplete-state.ts +1 -1
  186. package/dist/chunk-2NURR2DX.mjs.map +0 -1
  187. package/dist/chunk-3L6CNVCE.mjs.map +0 -1
  188. package/dist/chunk-463BFNUP.mjs.map +0 -1
  189. package/dist/chunk-4HHYJGZE.mjs.map +0 -1
  190. package/dist/chunk-4LOLCQGR.mjs.map +0 -1
  191. package/dist/chunk-4UYKBG35.mjs.map +0 -1
  192. package/dist/chunk-5EJ5XOGP.mjs.map +0 -1
  193. package/dist/chunk-6Z2ATUNY.mjs +0 -15
  194. package/dist/chunk-6Z2ATUNY.mjs.map +0 -1
  195. package/dist/chunk-AQHORK66.mjs.map +0 -1
  196. package/dist/chunk-AXN37AHC.mjs.map +0 -1
  197. package/dist/chunk-CSGFJU3L.mjs.map +0 -1
  198. package/dist/chunk-F3MHL6ZY.mjs.map +0 -1
  199. package/dist/chunk-GCMQHIRF.mjs.map +0 -1
  200. package/dist/chunk-GIJ3JZ4P.mjs.map +0 -1
  201. package/dist/chunk-GUH3Y2H4.mjs.map +0 -1
  202. package/dist/chunk-IXJ2HCOA.mjs.map +0 -1
  203. package/dist/chunk-JHTAOLEW.mjs.map +0 -1
  204. package/dist/chunk-JYVC4AW3.mjs.map +0 -1
  205. package/dist/chunk-KCHYD3EB.mjs.map +0 -1
  206. package/dist/chunk-KGKLUWKW.mjs.map +0 -1
  207. package/dist/chunk-LNAIMEB2.mjs.map +0 -1
  208. package/dist/chunk-MPME5BW2.mjs.map +0 -1
  209. package/dist/chunk-ND5PXTAW.mjs.map +0 -1
  210. package/dist/chunk-NKW5OU2S.mjs.map +0 -1
  211. package/dist/chunk-O5OWT5GE.mjs.map +0 -1
  212. package/dist/chunk-OD7ZMOVE.mjs.map +0 -1
  213. package/dist/chunk-OELUUJZY.mjs.map +0 -1
  214. package/dist/chunk-QJDMIGLU.mjs.map +0 -1
  215. package/dist/chunk-RR6OQGTI.mjs.map +0 -1
  216. package/dist/chunk-UHD44NC5.mjs.map +0 -1
  217. package/dist/chunk-WLPYYGES.mjs.map +0 -1
  218. package/dist/chunk-XHUMROEY.mjs.map +0 -1
  219. package/dist/chunk-YQU7WG7T.mjs.map +0 -1
  220. package/dist/chunk-YTOPHPSG.mjs.map +0 -1
  221. package/dist/chunk-YW3REYX6.mjs.map +0 -1
  222. /package/dist/{chunk-O4MHJSK2.mjs.map → chunk-CK7Q3Y5A.mjs.map} +0 -0
@@ -1,10 +1,7 @@
1
1
  import { Ref, RefObject, useEffect } from "react";
2
2
 
3
3
  // Updates the height of a <textarea> when the value changes.
4
- const useAutosizeTextArea = (
5
- textAreaRef: RefObject<HTMLTextAreaElement>,
6
- value: string
7
- ) => {
4
+ const useAutosizeTextArea = (textAreaRef: RefObject<HTMLTextAreaElement>, value: string) => {
8
5
  useEffect(() => {
9
6
  if (textAreaRef.current !== null) {
10
7
  // We need to reset the height momentarily to get the correct scrollHeight for the textarea
@@ -1,6 +1,4 @@
1
- export type AsyncFunction<T extends any[]> = (
2
- ...args: [...T, AbortSignal]
3
- ) => Promise<void>;
1
+ export type AsyncFunction<T extends any[]> = (...args: [...T, AbortSignal]) => Promise<void>;
4
2
 
5
3
  export class Debouncer<T extends any[]> {
6
4
  private timeoutId?: number;
@@ -5,7 +5,7 @@ import { SuggestionAwareText } from "../types/base/custom-editor";
5
5
 
6
6
  function nodeChildrenToTextComponents(
7
7
  editor: BaseEditor & ReactEditor & HistoryEditor,
8
- nodes: Descendant[]
8
+ nodes: Descendant[],
9
9
  ): SuggestionAwareText[] {
10
10
  // find inlineable elements
11
11
  const indeciesOfInlineElements = new Set(
@@ -16,7 +16,7 @@ function nodeChildrenToTextComponents(
16
16
  }
17
17
  return -1;
18
18
  })
19
- .filter((index) => index !== -1)
19
+ .filter((index) => index !== -1),
20
20
  );
21
21
 
22
22
  // ignorable elements = inline elements,
@@ -28,8 +28,7 @@ function nodeChildrenToTextComponents(
28
28
  }
29
29
 
30
30
  const isNeighbourOfInline =
31
- indeciesOfInlineElements.has(index - 1) ||
32
- indeciesOfInlineElements.has(index + 1);
31
+ indeciesOfInlineElements.has(index - 1) || indeciesOfInlineElements.has(index + 1);
33
32
  if (isNeighbourOfInline) {
34
33
  return (node as any).text !== "";
35
34
  }
@@ -53,9 +52,7 @@ function nodeChildrenToTextComponents(
53
52
  .reduce((acc, val) => acc.concat(val), []);
54
53
  }
55
54
 
56
- export const editorToText = (
57
- editor: BaseEditor & ReactEditor & HistoryEditor
58
- ) => {
55
+ export const editorToText = (editor: BaseEditor & ReactEditor & HistoryEditor) => {
59
56
  const flattened = nodeChildrenToTextComponents(editor, editor.children);
60
57
 
61
58
  const text = flattened.map((textComponent) => textComponent.text).join("\n");
@@ -1,14 +1,4 @@
1
- import {
2
- Editor,
3
- Node,
4
- Path,
5
- Range,
6
- Text,
7
- Element,
8
- BasePoint,
9
- BaseRange,
10
- Point,
11
- } from "slate";
1
+ import { Editor, Node, Path, Range, Text, Element, BasePoint, BaseRange, Point } from "slate";
12
2
  import { EditorAutocompleteState } from "../types/base/editor-autocomplete-state";
13
3
 
14
4
  export interface EditorTextState {
@@ -19,9 +9,7 @@ export interface EditorTextState {
19
9
  textAfterCursor: string;
20
10
  }
21
11
 
22
- export function getTextAroundCollapsedCursor(
23
- editor: Editor
24
- ): EditorAutocompleteState | null {
12
+ export function getTextAroundCollapsedCursor(editor: Editor): EditorAutocompleteState | null {
25
13
  const { selection } = editor;
26
14
  if (!selection || !Range.isCollapsed(selection)) {
27
15
  return null;
package/src/lib/retry.tsx CHANGED
@@ -2,7 +2,7 @@ export function retry<T>(
2
2
  fn: () => Promise<T>,
3
3
  retriesLeft: number = 2,
4
4
  interval: number = 200,
5
- backoff: number = 1.5
5
+ backoff: number = 1.5,
6
6
  ): Promise<T> {
7
7
  return new Promise((resolve, reject) => {
8
8
  fn()
@@ -4,7 +4,7 @@ import { CustomEditor } from "../../types/base/custom-editor";
4
4
  export function addAutocompletionsToEditor(
5
5
  editor: CustomEditor,
6
6
  newSuggestion: string,
7
- point: BasePoint
7
+ point: BasePoint,
8
8
  ) {
9
9
  const editorPosition = editor.selection;
10
10
 
@@ -20,7 +20,7 @@ export function addAutocompletionsToEditor(
20
20
  ],
21
21
  {
22
22
  at: point,
23
- }
23
+ },
24
24
  );
25
25
 
26
26
  // restore cursor position
@@ -13,10 +13,7 @@ export function clearAutocompletionsFromEditor(editor: CustomEditor) {
13
13
  try {
14
14
  Transforms.removeNodes(editor, { at: path });
15
15
  } catch (e) {
16
- console.log(
17
- "CopilotTextarea.clearAutocompletionsFromEditor: error removing node",
18
- e
19
- );
16
+ console.log("CopilotTextarea.clearAutocompletionsFromEditor: error removing node", e);
20
17
  }
21
18
  }
22
19
  }
@@ -22,7 +22,7 @@ export function replaceEditorText(editor: Editor, newText: string) {
22
22
  ],
23
23
  {
24
24
  at: [0],
25
- }
25
+ },
26
26
  );
27
27
  }
28
28
  }
@@ -3,14 +3,11 @@ import { HistoryEditor } from "slate-history";
3
3
 
4
4
  // Copy-pasted from `https://github.com/ianstormtaylor/slate/blob/main/packages/slate-history/src/with-history.ts`
5
5
  // With one exception: the `shouldSave` function is passed in as an argument to `withPartialHistory` instead of being hardcoded
6
- export type ShouldSaveToHistory = (
7
- op: Operation,
8
- prev: Operation | undefined
9
- ) => boolean;
6
+ export type ShouldSaveToHistory = (op: Operation, prev: Operation | undefined) => boolean;
10
7
 
11
8
  export const withPartialHistory = <T extends Editor>(
12
9
  editor: T,
13
- shouldSave: ShouldSaveToHistory
10
+ shouldSave: ShouldSaveToHistory,
14
11
  ) => {
15
12
  const e = editor as T & HistoryEditor;
16
13
  const { apply } = e;
@@ -69,8 +66,7 @@ export const withPartialHistory = <T extends Editor>(
69
66
  const { operations, history } = e;
70
67
  const { undos } = history;
71
68
  const lastBatch = undos[undos.length - 1];
72
- const lastOp =
73
- lastBatch && lastBatch.operations[lastBatch.operations.length - 1];
69
+ const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];
74
70
  let save = HistoryEditor.isSaving(e);
75
71
  let merge = HistoryEditor.isMerging(e);
76
72
 
@@ -144,10 +140,7 @@ const shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {
144
140
  return false;
145
141
  };
146
142
 
147
- export const defaultShouldSave = (
148
- op: Operation,
149
- prev: Operation | undefined
150
- ): boolean => {
143
+ export const defaultShouldSave = (op: Operation, prev: Operation | undefined): boolean => {
151
144
  if (op.type === "set_selection") {
152
145
  return false;
153
146
  }
@@ -8,9 +8,7 @@
8
8
  * @returns {ReadableStream<A>} - The flattened stream.
9
9
  */
10
10
 
11
- export function streamPromiseFlatten<A>(
12
- promise: Promise<ReadableStream<A>>
13
- ): ReadableStream<A> {
11
+ export function streamPromiseFlatten<A>(promise: Promise<ReadableStream<A>>): ReadableStream<A> {
14
12
  return new ReadableStream<A>({
15
13
  async start(controller) {
16
14
  try {
package/src/lib/utils.ts CHANGED
@@ -8,13 +8,10 @@ export function cn(...inputs: ClassValue[]) {
8
8
 
9
9
  export const nanoid = customAlphabet(
10
10
  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
11
- 7
11
+ 7,
12
12
  ); // 7-character random string
13
13
 
14
- export async function fetcher<JSON = any>(
15
- input: RequestInfo,
16
- init?: RequestInit
17
- ): Promise<JSON> {
14
+ export async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {
18
15
  const res = await fetch(input, init);
19
16
 
20
17
  if (!res.ok) {
@@ -43,13 +40,12 @@ export function formatDate(input: string | number | Date): string {
43
40
  }
44
41
 
45
42
  export const arraysAreEqual = (arr1: number[], arr2: number[]): boolean =>
46
- arr1.length === arr2.length &&
47
- arr1.every((value, index) => value === arr2[index]);
43
+ arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
48
44
 
49
45
  export function nullableCompatibleEqualityCheck<T>(
50
46
  naiveEqualityCheck: (a: T, b: T) => boolean,
51
47
  a: T | null | undefined,
52
- b: T | null | undefined
48
+ b: T | null | undefined,
53
49
  ): boolean {
54
50
  if (a === null || a === undefined || b === null || b === undefined) {
55
51
  return a === b;
@@ -3,18 +3,14 @@ import { InsertionsApiConfig } from "./insertions-api-config";
3
3
  import { SuggestionsApiConfig } from "./suggestions-api-config";
4
4
 
5
5
  // Mostly mirrors a partial SuggestionsApiConfig, but with some fields MANDATORY.
6
- export interface SuggestionsApiConfigUserSpecified
7
- extends Partial<SuggestionsApiConfig> {}
6
+ export interface SuggestionsApiConfigUserSpecified extends Partial<SuggestionsApiConfig> {}
8
7
 
9
8
  // Mostly mirrors a partial InsertionsApiConfig, but with some fields MANDATORY.
10
- export interface InsertionsApiConfigUserSpecified
11
- extends Partial<InsertionsApiConfig> {}
9
+ export interface InsertionsApiConfigUserSpecified extends Partial<InsertionsApiConfig> {}
12
10
 
13
11
  // Mostly mirrors a partial AutosuggestionsConfig, but with some fields MANDATORY.
14
12
  export interface AutosuggestionsConfigUserSpecified
15
- extends Partial<
16
- Omit<AutosuggestionsConfig, "chatApiConfigs" | "textareaPurpose">
17
- > {
13
+ extends Partial<Omit<AutosuggestionsConfig, "chatApiConfigs" | "textareaPurpose">> {
18
14
  textareaPurpose: string; // the user MUST specify textareaPurpose - it's not optional
19
15
  chatApiConfigs: {
20
16
  suggestionsApiConfig?: SuggestionsApiConfigUserSpecified;
@@ -1,27 +1,14 @@
1
- import {
2
- BaseAutosuggestionsConfig,
3
- defaultBaseAutosuggestionsConfig,
4
- } from "../base";
5
- import {
6
- SuggestionsApiConfig,
7
- defaultSuggestionsApiConfig,
8
- } from "./suggestions-api-config";
9
- import {
10
- InsertionsApiConfig,
11
- defaultInsertionsApiConfig,
12
- } from "./insertions-api-config";
1
+ import { BaseAutosuggestionsConfig, defaultBaseAutosuggestionsConfig } from "../base";
2
+ import { SuggestionsApiConfig, defaultSuggestionsApiConfig } from "./suggestions-api-config";
3
+ import { InsertionsApiConfig, defaultInsertionsApiConfig } from "./insertions-api-config";
13
4
  import { ChatlikeApiEndpoint } from ".";
14
- import {
15
- EditingApiConfig,
16
- defaultEditingApiConfig,
17
- } from "./editing-api-config";
5
+ import { EditingApiConfig, defaultEditingApiConfig } from "./editing-api-config";
18
6
  import { defaultCopilotContextCategories } from "@copilotkit/react-core";
19
7
 
20
8
  // Like the base autosuggestions config, with 2 additional fields:
21
9
  // 1. contextCategories: string[] | undefined;
22
10
  // 2. instead of apiConfigs, we have chatApiConfigs: a higher-level abstraction that uses a ChatGPT-like API endpoint.
23
- export interface AutosuggestionsConfig
24
- extends Omit<BaseAutosuggestionsConfig, "apiConfig"> {
11
+ export interface AutosuggestionsConfig extends Omit<BaseAutosuggestionsConfig, "apiConfig"> {
25
12
  contextCategories: string[];
26
13
  chatApiConfigs: {
27
14
  suggestionsApiConfig: SuggestionsApiConfig;
@@ -9,7 +9,7 @@ export interface EditingApiConfig {
9
9
 
10
10
  export const defaultEditingMakeSystemPrompt: MakeSystemPrompt = (
11
11
  textareaPurpose,
12
- contextString
12
+ contextString,
13
13
  ) => {
14
14
  return `You are a versatile writing assistant.
15
15
 
@@ -45,14 +45,12 @@ export const defaultEditingFewShotMessages: MinimalChatGPTMessage[] = [
45
45
  {
46
46
  role: "user",
47
47
  name: "TextToEdit",
48
- content:
49
- "While I was there I also picked up some apples, oranges, and bananas. ",
48
+ content: "While I was there I also picked up some apples, oranges, and bananas. ",
50
49
  },
51
50
  {
52
51
  role: "user",
53
52
  name: "TextAfterCursor",
54
- content:
55
- "The grocery store was having a sale on fruit, so I decided to stock up.",
53
+ content: "The grocery store was having a sale on fruit, so I decided to stock up.",
56
54
  },
57
55
  {
58
56
  role: "user",
@@ -9,7 +9,7 @@ export interface InsertionsApiConfig {
9
9
 
10
10
  export const defaultInsertionsMakeSystemPrompt: MakeSystemPrompt = (
11
11
  textareaPurpose,
12
- contextString
12
+ contextString,
13
13
  ) => {
14
14
  return `You are a versatile writing assistant.
15
15
 
@@ -39,8 +39,7 @@ export const defaultInsertionsFewShotMessages: MinimalChatGPTMessage[] = [
39
39
  {
40
40
  role: "user",
41
41
  name: "TextAfterCursor",
42
- content:
43
- "While I was there I also picked up some apples, oranges, and bananas.",
42
+ content: "While I was there I also picked up some apples, oranges, and bananas.",
44
43
  },
45
44
  {
46
45
  role: "user",
@@ -1,19 +1,16 @@
1
- import {
2
- CopilotApiConfig,
3
- copilotApiConfigExtrapolator,
4
- } from "@copilotkit/react-core";
1
+ import { CopilotApiConfig, copilotApiConfigExtrapolator } from "@copilotkit/react-core";
5
2
  import { MinimalChatGPTMessage } from "./minimal-chat-gpt-message";
6
3
 
7
4
  export type ChatlikeApiEndpointImpl = (
8
5
  abortSignal: AbortSignal,
9
6
  messages: MinimalChatGPTMessage[],
10
- forwardedProps?: { [key: string]: any }
7
+ forwardedProps?: { [key: string]: any },
11
8
  ) => Promise<string>;
12
9
 
13
10
  export type StreamingChatlikeApiEndpointImpl = (
14
11
  abortSignal: AbortSignal,
15
12
  messages: MinimalChatGPTMessage[],
16
- forwardedProps?: { [key: string]: any }
13
+ forwardedProps?: { [key: string]: any },
17
14
  ) => Promise<ReadableStream<string>>;
18
15
 
19
16
  export class ChatlikeApiEndpoint {
@@ -28,30 +25,25 @@ export class ChatlikeApiEndpoint {
28
25
  * @param apiEndpoint The URL of the OpenAI-compatible API endpoint.
29
26
  * @returns A new instance of ChatlikeApiEndpoint.
30
27
  */
31
- static fromCopilotApiConfig(
32
- copilotApiConfig: CopilotApiConfig
33
- ): ChatlikeApiEndpoint {
28
+ static fromCopilotApiConfig(copilotApiConfig: CopilotApiConfig): ChatlikeApiEndpoint {
34
29
  return new ChatlikeApiEndpoint(
35
30
  async (
36
31
  abortSignal: AbortSignal,
37
32
  messages: MinimalChatGPTMessage[],
38
- forwardedProps?: { [key: string]: any }
33
+ forwardedProps?: { [key: string]: any },
39
34
  ) => {
40
- const res = await fetch(
41
- copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint,
42
- {
43
- method: "POST",
44
- headers: {
45
- ...copilotApiConfig.headers,
46
- },
47
- body: JSON.stringify({
48
- ...forwardedProps,
49
- ...copilotApiConfig.body,
50
- messages: messages,
51
- }),
52
- signal: abortSignal,
53
- }
54
- );
35
+ const res = await fetch(copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint, {
36
+ method: "POST",
37
+ headers: {
38
+ ...copilotApiConfig.headers,
39
+ },
40
+ body: JSON.stringify({
41
+ ...forwardedProps,
42
+ ...copilotApiConfig.body,
43
+ messages: messages,
44
+ }),
45
+ signal: abortSignal,
46
+ });
55
47
 
56
48
  const bodySteram: ReadableStream<Uint8Array> | null = res.body;
57
49
  if (!bodySteram) {
@@ -62,7 +54,7 @@ export class ChatlikeApiEndpoint {
62
54
  const stringStream = bodySteram.pipeThrough(new TextDecoderStream());
63
55
 
64
56
  return stringStream;
65
- }
57
+ },
66
58
  );
67
59
  }
68
60
 
@@ -1,4 +1 @@
1
- export type MakeSystemPrompt = (
2
- textareaPurpose: string,
3
- contextString: string
4
- ) => string;
1
+ export type MakeSystemPrompt = (textareaPurpose: string, contextString: string) => string;
@@ -9,7 +9,7 @@ export interface SuggestionsApiConfig {
9
9
 
10
10
  export const defaultSuggestionsMakeSystemPrompt: MakeSystemPrompt = (
11
11
  textareaPurpose,
12
- contextString
12
+ contextString,
13
13
  ) => {
14
14
  return `You are a versatile writing assistant.
15
15
 
@@ -39,8 +39,7 @@ export const defaultSuggestionsFewShotMessages: MinimalChatGPTMessage[] = [
39
39
  {
40
40
  role: "user",
41
41
  name: "TextAfterCursor",
42
- content:
43
- "While I was there I also picked up some apples, oranges, and bananas.",
42
+ content: "While I was there I also picked up some apples, oranges, and bananas.",
44
43
  },
45
44
  {
46
45
  role: "user",
@@ -11,14 +11,14 @@ export interface EditingEditorState extends InsertionEditorState {
11
11
 
12
12
  export type AutosuggestionsBareFunction = (
13
13
  editorState: InsertionEditorState,
14
- abortSignal: AbortSignal
14
+ abortSignal: AbortSignal,
15
15
  ) => Promise<string>;
16
16
 
17
17
  export type Generator_InsertionOrEditingSuggestion = (
18
18
  editorState: EditingEditorState,
19
19
  prompt: string,
20
20
  documents: DocumentPointer[],
21
- abortSignal: AbortSignal
21
+ abortSignal: AbortSignal,
22
22
  ) => Promise<ReadableStream<string>>;
23
23
 
24
24
  export interface InsertionEditorApiConfig {
@@ -1,25 +1,102 @@
1
1
  import { BaseCopilotTextareaApiConfig } from "./autosuggestions-bare-function";
2
2
  import { defaultCopilotContextCategories } from "@copilotkit/react-core";
3
3
 
4
+ /**
5
+ * @interface BaseAutosuggestionsConfig
6
+ *
7
+ * @property {string} textareaPurpose - The purpose of the textarea. This is used to guide the autosuggestions.
8
+ *
9
+ * @property {string[]} contextCategories - The categories of context to consider when providing autosuggestions.
10
+ *
11
+ * @property {number} debounceTime - The amount of time (in milliseconds) to wait before triggering autosuggestions after the user has stopped typing.
12
+ *
13
+ * @property {BaseCopilotTextareaApiConfig} apiConfig - The configuration for the API that provides the autosuggestions.
14
+ *
15
+ * @property {boolean} disableWhenEmpty - Whether to disable autosuggestions when the textarea is empty.
16
+ *
17
+ * @property {boolean} disabled - Whether to disable autosuggestions entirely.
18
+ *
19
+ * @property {boolean} temporarilyDisableWhenMovingCursorWithoutChangingText - Whether to temporarily disable autosuggestions when the user moves the cursor without changing the text.
20
+ *
21
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldAcceptAutosuggestionOnKeyPress - A function that determines whether to accept the current autosuggestion based on a key press event. By default, the Tab key is used to accept the autosuggestion. Example code:
22
+ *
23
+ * ```typescript
24
+ * const defaultShouldAcceptAutosuggestionOnKeyPress = (event: React.KeyboardEvent<HTMLDivElement>) => {
25
+ * // if tab, accept the autosuggestion
26
+ * if (event.key === "Tab") {
27
+ * return true;
28
+ * }
29
+ * return false;
30
+ * }
31
+ * ```
32
+ *
33
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldToggleHoveringEditorOnKeyPress - A function that determines whether to toggle the hovering editor based on a key press event. By default, the Command + K key combination is used to toggle the hovering editor. Example code:
34
+ *
35
+ * ```typescript
36
+ * const defaultShouldToggleHoveringEditorOnKeyPress = (event: React.KeyboardEvent<HTMLDivElement>) => {
37
+ * // if command-k, toggle the hovering editor
38
+ * if (event.key === "k" && event.metaKey) {
39
+ * return true;
40
+ * }
41
+ * return false;
42
+ * }
43
+ * ```
44
+ */
4
45
  export interface BaseAutosuggestionsConfig {
5
46
  textareaPurpose: string;
6
47
  contextCategories: string[];
7
48
  debounceTime: number;
8
- acceptAutosuggestionKey: string;
49
+ apiConfig: BaseCopilotTextareaApiConfig;
50
+
9
51
  disableWhenEmpty: boolean;
10
52
  disabled: boolean;
11
53
  temporarilyDisableWhenMovingCursorWithoutChangingText: boolean;
12
- apiConfig: BaseCopilotTextareaApiConfig;
54
+ shouldAcceptAutosuggestionOnKeyPress: (event: React.KeyboardEvent<HTMLDivElement>) => boolean;
55
+ shouldToggleHoveringEditorOnKeyPress: (event: React.KeyboardEvent<HTMLDivElement>) => boolean;
13
56
  }
14
57
 
58
+ // by default, command-k toggles the hovering editor
59
+ const defaultShouldToggleHoveringEditorOnKeyPress = (
60
+ event: React.KeyboardEvent<HTMLDivElement>,
61
+ ) => {
62
+ // if command-k, toggle the hovering editor
63
+ if (event.key === "k" && event.metaKey) {
64
+ return true;
65
+ }
66
+ return false;
67
+ };
68
+
69
+ const defaultShouldAcceptAutosuggestionOnKeyPress = (
70
+ event: React.KeyboardEvent<HTMLDivElement>,
71
+ ) => {
72
+ // if tab, accept the autosuggestion
73
+ if (event.key === "Tab") {
74
+ return true;
75
+ }
76
+ return false;
77
+ };
78
+
79
+ /**
80
+ * Default configuration for the BaseAutosuggestions.
81
+ *
82
+ * @property {number} debounceTime - The amount of time to wait before triggering the autosuggestions API call.
83
+ * @property {string[]} contextCategories - The categories to use for context when making the autosuggestions API call.
84
+ * @property {boolean} disableWhenEmpty - Whether to disable the autosuggestions when the textarea is empty.
85
+ * @property {boolean} disabled - Whether to disable the autosuggestions feature entirely.
86
+ * @property {boolean} temporarilyDisableWhenMovingCursorWithoutChangingText - Whether to temporarily disable the autosuggestions when the cursor is moved without changing the text.
87
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldToggleHoveringEditorOnKeyPress - A function that determines whether to toggle the hovering editor based on a key press event.
88
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldAcceptAutosuggestionOnKeyPress - A function that determines whether to accept the autosuggestion based on a key press event.
89
+ */
90
+
15
91
  export const defaultBaseAutosuggestionsConfig: Omit<
16
92
  BaseAutosuggestionsConfig,
17
93
  "textareaPurpose" | "apiConfig"
18
94
  > = {
19
95
  debounceTime: 250,
20
96
  contextCategories: defaultCopilotContextCategories,
21
- acceptAutosuggestionKey: "Tab",
22
97
  disableWhenEmpty: true,
23
98
  disabled: false,
24
99
  temporarilyDisableWhenMovingCursorWithoutChangingText: true,
100
+ shouldToggleHoveringEditorOnKeyPress: defaultShouldToggleHoveringEditorOnKeyPress,
101
+ shouldAcceptAutosuggestionOnKeyPress: defaultShouldAcceptAutosuggestionOnKeyPress,
25
102
  };
@@ -9,7 +9,7 @@ export interface EditorAutocompleteState {
9
9
 
10
10
  export function areEqual_autocompleteState(
11
11
  prev: EditorAutocompleteState,
12
- next: EditorAutocompleteState
12
+ next: EditorAutocompleteState,
13
13
  ) {
14
14
  return (
15
15
  prev.cursorPoint.offset === next.cursorPoint.offset &&
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/ui/button.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;AA2CjC;AAvCN,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,IAAyD,QAAQ;AAAjE,iBAAE,aAAW,SAAS,MAAM,UAAU,MA1CzC,IA0CG,IAAgD,kBAAhD,IAAgD,CAA9C,aAAW,WAAS,QAAM;AAC3B,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE,oBAAC;AAAA,MACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MAC1D;AAAA,OACI,MACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc","sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/hovering-toolbar/hovering-toolbar.tsx"],"names":["selection"],"mappings":";;;;;;;;;;;;;;;;AACA,SAAS,WAAoB,QAAQ,gBAAgB;AACrD,SAAiD,kBAAkB;AACnE,SAAS,UAAU,yBAAyB;AA4HlC;AAzGH,IAAM,kBAEa,CAAC,UAAU;AACnC,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,SAAS,SAAS;AACxB,QAAM,YAAY,kBAAkB;AACpC,QAAM,EAAE,aAAa,eAAe,IAAI,yBAAyB;AAGjE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,YAAU,MAAM;AACd,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,UAAM,EAAE,WAAAA,WAAU,IAAI;AAEtB,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AAEA,QAAI,CAACA,YAAW;AACd,SAAG,gBAAgB,OAAO;AAC1B;AAAA,IACF;AAEA,UAAM,eAAe,OAAO,aAAa;AACzC,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,WAAW,CAAC;AAC1C,UAAM,OAAO,SAAS,sBAAsB;AAM5C,QACE,KAAK,QAAQ,KACb,KAAK,SAAS,KACd,KAAK,UAAU,KACf,KAAK,WAAW,GAChB;AACA;AAAA,IACF;AAEA,UAAM,iBAAiB;AACvB,UAAM,2BAA2B;AACjC,UAAM,6BAA6B;AACnC,QAAI,MACF,KAAK,MAAM,OAAO,UAAU,GAAG,eAAe;AAEhD,QAAI,MAAM,gBAAgB;AACxB,YAAM,KAAK,SAAS,OAAO,UAAU;AAAA,IACvC,WAAW,MAAM,GAAG,eAAe,OAAO,cAAc,gBAAgB;AACtE,YAAM,KAAK,MAAM,OAAO,UAAU,GAAG,eAAe;AAAA,IACtD;AAEA,QAAI,OACF,KAAK,OACL,OAAO,UACP,GAAG,cAAc,IACjB,KAAK,QAAQ,IACb;AAEF,QAAI,OAAO,gBAAgB;AACzB,aAAO;AAAA,IACT,WAAW,OAAO,GAAG,cAAc,OAAO,aAAa,gBAAgB;AACrE,aAAO,OAAO,aAAa,GAAG,cAAc;AAAA,IAC9C;AAEA,OAAG,MAAM,UAAU;AACnB,OAAG,MAAM,MAAM,GAAG;AAClB,OAAG,MAAM,OAAO,GAAG;AAAA,EACrB,CAAC;AAED,YAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9D,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,KAAK,cAAc,CAAC;AAExB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SACE,oBAAC;AAAA,IACC,8BAAC;AAAA,MACC;AAAA,MACA,WACE,MAAM,sBACN;AAAA,MAGD,yBAAe,aACd,oBAAC;AAAA,QACC,aAAa,YAAY,QAAQ,SAAS;AAAA,QAC1C,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AACjB,yBAAe,KAAK;AAAA,QACtB;AAAA,QACA,kBAAkB,CAAC,iBAAiB;AAClC,kBAAQ,IAAI,iBAAiB,YAAY;AAEzC,qBAAW,OAAO,QAAQ,EAAE,IAAI,UAAU,CAAC;AAC3C,qBAAW,WAAW,QAAQ,cAAc;AAAA,YAC1C,IAAI;AAAA,UACN,CAAC;AACD,yBAAe,KAAK;AAAA,QACtB;AAAA,QACA,mBAAmB,MAAM;AAAA,OAC3B;AAAA,KAEJ;AAAA,GACF;AAEJ;AAEA,SAAS,YAAY,QAAgB,WAAyC;AAC5E,QAAM,mBAAmB,uBAAuB,MAAM;AACtD,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,kBAAkB,8BAA8B,MAAM;AAAA,IACtD,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAChB;AACF","sourcesContent":["import { css } from \"@emotion/css\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { BaseSelection, Editor, Range, Location, Transforms } from \"slate\";\nimport { useSlate, useSlateSelection } from \"slate-react\";\nimport { HoveringInsertionPromptBox } from \"./text-insertion-prompt-box\";\nimport { Button, Icon, Menu, Portal } from \"./hovering-toolbar-components\";\nimport { useHoveringEditorContext } from \"./hovering-editor-provider\";\nimport {\n getFullEditorTextWithNewlines,\n getTextAroundSelection,\n} from \"../../lib/get-text-around-cursor\";\nimport {\n EditingEditorState,\n InsertionEditorApiConfig,\n} from \"../../types/base/autosuggestions-bare-function\";\n\nexport interface HoveringToolbarProps {\n apiConfig: InsertionEditorApiConfig;\n contextCategories: string[];\n hoverMenuClassname: string | undefined;\n}\n\nexport const HoveringToolbar: (\n props: HoveringToolbarProps\n) => JSX.Element | null = (props) => {\n const ref = useRef<HTMLDivElement>(null);\n const editor = useSlate();\n const selection = useSlateSelection();\n const { isDisplayed, setIsDisplayed } = useHoveringEditorContext();\n\n // only render on client\n const [isClient, setIsClient] = useState(false);\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n useEffect(() => {\n const el = ref.current;\n const { selection } = editor;\n\n if (!el) {\n return;\n }\n\n if (!selection) {\n el.removeAttribute(\"style\");\n return;\n }\n\n const domSelection = window.getSelection();\n if (!domSelection) {\n return;\n }\n\n const domRange = domSelection.getRangeAt(0);\n const rect = domRange.getBoundingClientRect();\n\n // We use window = (0,0,0,0) as a signal that the selection is not in the original copilot-textarea,\n // but inside the hovering window.\n //\n // in such case, we simply do nothing.\n if (\n rect.top === 0 &&\n rect.left === 0 &&\n rect.width === 0 &&\n rect.height === 0\n ) {\n return;\n }\n\n const minGapFromEdge = 60;\n const verticalOffsetFromCorner = 35;\n const horizontalOffsetFromCorner = 15;\n let top =\n rect.top + window.scrollY - el.offsetHeight + verticalOffsetFromCorner;\n // make sure top is in the viewport and not too close to the edge\n if (top < minGapFromEdge) {\n top = rect.bottom + window.scrollY + minGapFromEdge;\n } else if (top + el.offsetHeight > window.innerHeight - minGapFromEdge) {\n top = rect.top + window.scrollY - el.offsetHeight - minGapFromEdge;\n }\n\n let left =\n rect.left +\n window.scrollX -\n el.offsetWidth / 2 +\n rect.width / 2 +\n horizontalOffsetFromCorner;\n // make sure left is in the viewport and not too close to the edge\n if (left < minGapFromEdge) {\n left = minGapFromEdge;\n } else if (left + el.offsetWidth > window.innerWidth - minGapFromEdge) {\n left = window.innerWidth - el.offsetWidth - minGapFromEdge;\n }\n\n el.style.opacity = \"1\";\n el.style.top = `${top}px`;\n el.style.left = `${left}px`;\n });\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n setIsDisplayed(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref, setIsDisplayed]);\n\n if (!isClient) {\n return null;\n }\n\n return (\n <Portal>\n <Menu\n ref={ref}\n className={\n props.hoverMenuClassname ||\n \"p-2 absolute z-10 top-[-10000px] left-[-10000px] mt-[-6px] opacity-0 transition-opacity duration-700\"\n }\n >\n {isDisplayed && selection && (\n <HoveringInsertionPromptBox\n editorState={editorState(editor, selection)}\n apiConfig={props.apiConfig}\n closeWindow={() => {\n setIsDisplayed(false);\n }}\n performInsertion={(insertedText) => {\n console.log(\"inserted text\", insertedText);\n // replace the selection with the inserted text\n Transforms.delete(editor, { at: selection });\n Transforms.insertText(editor, insertedText, {\n at: selection,\n });\n setIsDisplayed(false);\n }}\n contextCategories={props.contextCategories}\n />\n )}\n </Menu>\n </Portal>\n );\n};\n\nfunction editorState(editor: Editor, selection: Location): EditingEditorState {\n const textAroundCursor = getTextAroundSelection(editor);\n if (textAroundCursor) {\n return textAroundCursor;\n }\n\n return {\n textBeforeCursor: getFullEditorTextWithNewlines(editor),\n textAfterCursor: \"\",\n selectedText: \"\",\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/source-search-box/source-search-box.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,SAAS,gBAAgB;AAmDnB,cAkBU,YAlBV;AArBC,SAAS,gBAAgB,OAA6B;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAiB,EAAE;AAE7D,SACE,qBAAC;AAAA,IACC,WAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe,CAAC,UAAU;AACxB,uBAAiB,KAAK;AAAA,IACxB;AAAA,IACA,QAAQ,CAAC,OAAO,WAAW;AAEzB,UAAI,MAAM,eAAe;AAAI,eAAO;AAGpC,UAAI,MAAM,WAAW,MAAM,UAAU;AAAG,eAAO;AAG/C,aAAO;AAAA,IACT;AAAA,IAEA;AAAA,0BAAC;AAAA,QACC,OAAO,MAAM;AAAA,QACb,WAAU;AAAA,QACV,aAAY;AAAA,OACd;AAAA,MACA,qBAAC;AAAA,QACC;AAAA,8BAAC;AAAA,YAAa;AAAA,WAAiB;AAAA,UAE/B,oBAAC;AAAA,YAAa,SAAQ;AAAA,YACnB,gBAAM,eAAe,IAAI,CAAC,gBAAgB;AACzC,qBACE,oBAAC;AAAA,gBAEC,OAAO,YAAY;AAAA,gBACnB,UAAU,CAAC,UAAU;AACnB,wBAAM,eAAe,WAAW;AAAA,gBAClC;AAAA,gBAEA,+BAAC;AAAA,kBAAI,WAAU;AAAA,kBACb;AAAA,wCAAC;AAAA,sBAAK,OAAM;AAAA,sBAAO,QAAO;AAAA,sBACxB,8BAAC;AAAA,wBACC,KAAK,YAAY;AAAA,wBACjB,KAAK,YAAY;AAAA,wBACjB,WAAU;AAAA,uBACZ;AAAA,qBACF;AAAA,oBACC,YAAY;AAAA;AAAA,iBACf;AAAA,iBAfK,QAAQ,YAAY,qBAAqB,YAAY,MAgB5D;AAAA,YAEJ,CAAC;AAAA,WACH;AAAA,UAqBA,oBAAC,oBAAiB;AAAA;AAAA,OACpB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,oBAAC;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAc,OAAe;AAAA,IAErC;AAAA,GACH;AAEJ","sourcesContent":["import { useState } from \"react\";\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from \"../ui/command\";\n\nimport {\n Calculator,\n Calendar,\n CreditCard,\n Settings,\n Smile,\n User,\n} from \"lucide-react\";\n\nimport { DocumentPointer } from \"@copilotkit/react-core\";\n\nexport interface SourceSearchBoxProps {\n searchTerm: string;\n suggestedFiles: DocumentPointer[];\n onSelectedFile: (filePointer: DocumentPointer) => void;\n}\n\nexport function SourceSearchBox(props: SourceSearchBoxProps) {\n const [selectedValue, setSelectedValue] = useState<string>(\"\");\n\n return (\n <Command\n className=\"rounded-lg border shadow-md\"\n value={selectedValue}\n onValueChange={(value) => {\n setSelectedValue(value);\n }}\n filter={(value, search) => {\n // if the search term is empty, show all commands\n if (props.searchTerm === \"\") return 1;\n\n // if the search term is a prefix of the command, show it\n if (value.startsWith(props.searchTerm)) return 1;\n\n // otherwise, don't show it\n return 0;\n }}\n >\n <CommandInput\n value={props.searchTerm}\n className=\"rounded-t-lg hidden\"\n placeholder=\"Search for a command...\"\n />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n\n <CommandGroup heading=\"Available resources\">\n {props.suggestedFiles.map((filePointer) => {\n return (\n <CommandItem\n key={`word-${filePointer.sourceApplication}.${filePointer.name}`}\n value={filePointer.name}\n onSelect={(value) => {\n props.onSelectedFile(filePointer);\n }}\n >\n <div className=\" px-3 flex flex-row gap-1 items-center\">\n <Logo width=\"20px\" height=\"20px\">\n <img\n src={filePointer.iconImageUri}\n alt={filePointer.sourceApplication}\n className=\"w-full h-full\"\n />\n </Logo>\n {filePointer.name}\n </div>\n </CommandItem>\n );\n })}\n </CommandGroup>\n\n {/* <CommandGroup heading=\"Suggestions\">\n <CommandItem\n onSelect={(value) => {\n console.log(value);\n console.log(value);\n }}\n >\n <Calendar className=\"mr-2 h-4 w-4\" />\n <span>Calendar</span>\n </CommandItem>\n <CommandItem>\n <Smile className=\"mr-2 h-4 w-4\" />\n <span>Search Emoji</span>\n </CommandItem>\n <CommandItem>\n <Calculator className=\"mr-2 h-4 w-4\" />\n <span>Calculator</span>\n </CommandItem>\n </CommandGroup> */}\n <CommandSeparator />\n </CommandList>\n </Command>\n );\n}\n\nexport function Logo({\n children,\n width,\n height,\n}: {\n children: React.ReactNode;\n width: string;\n height: string;\n}) {\n return (\n <div\n className=\"flex items-center justify-center\"\n style={{ width: width, height: height }}\n >\n {children}\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,SAAS,sBAAsB;AAC/B,SAAS,aAAa,kBAAkB;AA0BjC,SAAS,0CACd,iBACA,mBACA,oBACA,kBACwC;AACxC,QAAM,EAAE,kBAAkB,iBAAiB,IAAI,WAAW,cAAc;AAExE,QAAM,oBAAoB;AAAA,IACxB,CACE,aACA,iBACA,WACA,gBACG;AACH,YAAM,MAAM,MAAM,MAAM,MAAY;AAClC,cAAM,WAAoC;AAAA,UACxC;AAAA,YACE,MAAM;AAAA,YACN,SAAS,mBAAmB;AAAA,cAC1B;AAAA,cACA,iBAAiB,WAAW,iBAAiB;AAAA,YAC/C;AAAA,UACF;AAAA,UACA,GAAG,mBAAmB;AAAA,UACtB;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,YAAY;AAAA,UACvB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,YAAY;AAAA,UACvB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,cACJ,oBAAoB,qBAAqB,gBAAgB;AAC3D,eAAO,MAAM,YAAY;AAAA,UACvB;AAAA,UACA;AAAA,UACA,mBAAmB;AAAA,QACrB;AAAA,MACF,EAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,CAAC,oBAAoB,kBAAkB,mBAAmB,eAAe;AAAA,EAC3E;AAEA,QAAM,kBAAkB;AAAA,IACtB,CACE,aACA,eACA,WACA,gBACG;AACH,YAAM,MAAM,MAAM,MAAM,MAAY;AAClC,cAAM,WAAoC;AAAA,UACxC;AAAA,YACE,MAAM;AAAA,YACN,SAAS,iBAAiB;AAAA,cACxB;AAAA,cACA,iBAAiB,WAAW,iBAAiB;AAAA,YAC/C;AAAA,UACF;AAAA,UACA,GAAG,iBAAiB;AAAA,UACpB;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,YAAY;AAAA,UACvB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,YAAY;AAAA,UACvB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,YAAY;AAAA,UACvB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,cACJ,oBAAoB,qBAAqB,gBAAgB;AAC3D,eAAO,MAAM,YAAY;AAAA,UACvB;AAAA,UACA;AAAA,UACA,iBAAiB;AAAA,QACnB;AAAA,MACF,EAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,CAAC,kBAAkB,kBAAkB,mBAAmB,eAAe;AAAA,EACzE;AAEA,QAAM,6BAA6B;AAAA,IACjC,CACE,aACA,iBACA,WACA,gBACG;AACH,UAAI,YAAY,iBAAiB,IAAI;AACnC,eAAO,MAAM;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,MAAM;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,mBAAmB,eAAe;AAAA,EACrC;AAEA,SAAO;AACT","sourcesContent":["import { CopilotContext } from \"@copilotkit/react-core\";\nimport { useCallback, useContext } from \"react\";\nimport { ChatlikeApiEndpoint, MinimalChatGPTMessage } from \"../../types\";\nimport { retry } from \"../../lib/retry\";\nimport {\n EditingEditorState,\n Generator_InsertionOrEditingSuggestion,\n InsertionEditorApiConfig,\n InsertionEditorState,\n} from \"../../types/base/autosuggestions-bare-function\";\nimport { InsertionsApiConfig } from \"../../types/autosuggestions-config/insertions-api-config\";\nimport { EditingApiConfig } from \"../../types/autosuggestions-config/editing-api-config\";\nimport { DocumentPointer } from \"@copilotkit/react-core\";\n\n/**\n * Returns a memoized function that sends a request to the specified API endpoint to get an autosuggestion for the user's input.\n * The function takes in the text before and after the cursor, and an abort signal.\n * It sends a POST request to the API endpoint with the messages array containing the system message, few shot messages, and user messages.\n * The function returns the suggestion from the API response.\n *\n * @param textareaPurpose - The purpose of the textarea. This is included in the system message.\n * @param apiEndpoint - The API endpoint to send the autosuggestion request to.\n * @param makeSystemMessage - A function that takes in a context string and returns a system message to include in the autosuggestion request.\n * @param fewShotMessages - An array of few shot messages to include in the autosuggestion request.\n * @param contextCategories - The categories of context strings we want to include. By default, we include the (default) \"global\" context category.\n * @returns A memoized function that sends a request to the specified API endpoint to get an autosuggestion for the user's input.\n */\nexport function useMakeStandardInsertionOrEditingFunction(\n textareaPurpose: string,\n contextCategories: string[],\n insertionApiConfig: InsertionsApiConfig,\n editingApiConfig: EditingApiConfig\n): Generator_InsertionOrEditingSuggestion {\n const { getContextString, copilotApiConfig } = useContext(CopilotContext);\n\n const insertionFunction = useCallback(\n async (\n editorState: EditingEditorState,\n insertionPrompt: string,\n documents: DocumentPointer[],\n abortSignal: AbortSignal\n ) => {\n const res = await retry(async () => {\n const messages: MinimalChatGPTMessage[] = [\n {\n role: \"system\",\n content: insertionApiConfig.makeSystemPrompt(\n textareaPurpose,\n getContextString(documents, contextCategories)\n ),\n },\n ...insertionApiConfig.fewShotMessages,\n {\n role: \"user\",\n name: \"TextAfterCursor\",\n content: editorState.textAfterCursor,\n },\n {\n role: \"user\",\n name: \"TextBeforeCursor\",\n content: editorState.textBeforeCursor,\n },\n {\n role: \"user\",\n name: \"InsertionPrompt\",\n content: insertionPrompt,\n },\n ];\n\n const apiEndpoint =\n ChatlikeApiEndpoint.fromCopilotApiConfig(copilotApiConfig);\n return await apiEndpoint.run(\n abortSignal,\n messages,\n insertionApiConfig.forwardedParams\n );\n });\n\n return res;\n },\n [insertionApiConfig, getContextString, contextCategories, textareaPurpose]\n );\n\n const editingFunction = useCallback(\n async (\n editorState: EditingEditorState,\n editingPrompt: string,\n documents: DocumentPointer[],\n abortSignal: AbortSignal\n ) => {\n const res = await retry(async () => {\n const messages: MinimalChatGPTMessage[] = [\n {\n role: \"system\",\n content: editingApiConfig.makeSystemPrompt(\n textareaPurpose,\n getContextString(documents, contextCategories)\n ),\n },\n ...editingApiConfig.fewShotMessages,\n {\n role: \"user\",\n name: \"TextBeforeCursor\",\n content: editorState.textBeforeCursor,\n },\n {\n role: \"user\",\n name: \"TextToEdit\",\n content: editorState.selectedText,\n },\n {\n role: \"user\",\n name: \"TextAfterCursor\",\n content: editorState.textAfterCursor,\n },\n {\n role: \"user\",\n name: \"EditingPrompt\",\n content: editingPrompt,\n },\n ];\n\n const apiEndpoint =\n ChatlikeApiEndpoint.fromCopilotApiConfig(copilotApiConfig);\n return await apiEndpoint.run(\n abortSignal,\n messages,\n editingApiConfig.forwardedParams\n );\n });\n\n return res;\n },\n [editingApiConfig, getContextString, contextCategories, textareaPurpose]\n );\n\n const insertionOrEditingFunction = useCallback(\n async (\n editorState: EditingEditorState,\n insertionPrompt: string,\n documents: DocumentPointer[],\n abortSignal: AbortSignal\n ) => {\n if (editorState.selectedText === \"\") {\n return await insertionFunction(\n editorState,\n insertionPrompt,\n documents,\n abortSignal\n );\n } else {\n return await editingFunction(\n editorState,\n insertionPrompt,\n documents,\n abortSignal\n );\n }\n },\n [insertionFunction, editingFunction]\n );\n\n return insertionOrEditingFunction;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.tsx"],"names":[],"mappings":";;;;;AAGA,OAAO,UAAU;AACjB,OAAO,YAAY;AAYf,SACE,KADF;AALG,IAAM,uBAA4D,CAAC;AAAA,EACxE;AAAA,EACA;AACF,MAAM;AACJ,SACE,qBAAC;AAAA,IAAI,WAAU;AAAA,IACb;AAAA,0BAAC;AAAA,QAAM,WAAU;AAAA,QAAG;AAAA,OAAiB;AAAA,MACrC,oBAAC;AAAA,QAAI,WAAU;AAAA,QACZ,wBAAc,IAAI,CAAC,aAAa,UAAU;AACzC,iBACE,oBAAC;AAAA,YAEC;AAAA,YACA,UAAU,MAAM;AACd;AAAA,gBAAiB,CAAC,SAChB,KAAK,OAAO,CAAC,OAAO,OAAO,WAAW;AAAA,cACxC;AAAA,YACF;AAAA,aANK,QAAQ,YAAY,qBAAqB,YAAY,MAO5D;AAAA,QAEJ,CAAC;AAAA,OACH;AAAA;AAAA,GACF;AAEJ;AAOO,IAAM,kBAAiD,CAAC;AAAA,EAC7D;AAAA,EACA;AACF,MAAM;AACJ,SACE,oBAAC;AAAA,IACC,OAAO,YAAY;AAAA,IACnB;AAAA,IACA,QACE,oBAAC;AAAA,MACC,KAAK,YAAY;AAAA,MACjB,KAAK,YAAY;AAAA,MACjB,IAAI,EAAE,iBAAiB,cAAc;AAAA,KACtC;AAAA,GAEL;AAEJ","sourcesContent":["import { DocumentPointer } from \"@copilotkit/react-core\";\nimport { Label } from \"../../ui/label\";\nimport React from \"react\";\nimport Chip from \"@mui/material/Chip/Chip.js\";\nimport Avatar from \"@mui/material/Avatar/Avatar.js\";\n\nexport interface IncludedFilesPreviewProps {\n includedFiles: DocumentPointer[];\n setIncludedFiles: React.Dispatch<React.SetStateAction<DocumentPointer[]>>;\n}\n\nexport const IncludedFilesPreview: React.FC<IncludedFilesPreviewProps> = ({\n includedFiles,\n setIncludedFiles,\n}) => {\n return (\n <div className=\"flex flex-col gap-2 mt-2\">\n <Label className=\"\">Included context:</Label>\n <div className=\"flex flex-wrap gap-2\">\n {includedFiles.map((filePointer, index) => {\n return (\n <FileChipPreview\n key={`file-${filePointer.sourceApplication}.${filePointer.name}`}\n filePointer={filePointer}\n onDelete={() => {\n setIncludedFiles((prev) =>\n prev.filter((fp) => fp !== filePointer)\n );\n }}\n />\n );\n })}\n </div>\n </div>\n );\n};\n\nexport interface FileChipPreviewProp {\n filePointer: DocumentPointer;\n onDelete: () => void;\n}\n\nexport const FileChipPreview: React.FC<FileChipPreviewProp> = ({\n filePointer,\n onDelete,\n}) => {\n return (\n <Chip\n label={filePointer.name}\n onDelete={onDelete}\n avatar={\n <Avatar\n src={filePointer.iconImageUri}\n alt={filePointer.sourceApplication}\n sx={{ backgroundColor: \"transparent\" }}\n ></Avatar>\n }\n />\n );\n};\n"]}