@copilotkit/react-textarea 0.27.0-alpha.5 → 0.27.1-alpha.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 (219) hide show
  1. package/.turbo/turbo-build.log +147 -147
  2. package/CHANGELOG.md +31 -0
  3. package/dist/chunk-224UKA7C.mjs +33 -0
  4. package/dist/chunk-224UKA7C.mjs.map +1 -0
  5. package/dist/chunk-2C7O2EVM.mjs +27 -0
  6. package/dist/chunk-2C7O2EVM.mjs.map +1 -0
  7. package/dist/chunk-2QDCE7PD.mjs +29 -0
  8. package/dist/chunk-2QDCE7PD.mjs.map +1 -0
  9. package/dist/chunk-3PQ7GSFE.mjs +17 -0
  10. package/dist/chunk-3PQ7GSFE.mjs.map +1 -0
  11. package/dist/chunk-47L4PLG4.mjs +45 -0
  12. package/dist/chunk-47L4PLG4.mjs.map +1 -0
  13. package/dist/chunk-4NHVQZ67.mjs +107 -0
  14. package/dist/chunk-4NHVQZ67.mjs.map +1 -0
  15. package/dist/chunk-4OJ3H65F.mjs +86 -0
  16. package/dist/chunk-4OJ3H65F.mjs.map +1 -0
  17. package/dist/chunk-5UNJXFUO.mjs +29 -0
  18. package/dist/chunk-5UNJXFUO.mjs.map +1 -0
  19. package/dist/chunk-72P3KOHZ.mjs +91 -0
  20. package/dist/chunk-72P3KOHZ.mjs.map +1 -0
  21. package/dist/chunk-7LSRNPNI.mjs +59 -0
  22. package/dist/chunk-7LSRNPNI.mjs.map +1 -0
  23. package/dist/chunk-7SUZ6CXM.mjs +47 -0
  24. package/dist/chunk-7SUZ6CXM.mjs.map +1 -0
  25. package/dist/chunk-AZHILHKM.mjs +19 -0
  26. package/dist/chunk-AZHILHKM.mjs.map +1 -0
  27. package/dist/chunk-DE5K76I2.mjs +3 -0
  28. package/dist/chunk-DE5K76I2.mjs.map +1 -0
  29. package/dist/chunk-DRV2FOHZ.mjs +65 -0
  30. package/dist/chunk-DRV2FOHZ.mjs.map +1 -0
  31. package/dist/chunk-ECR45NSD.mjs +101 -0
  32. package/dist/chunk-ECR45NSD.mjs.map +1 -0
  33. package/dist/chunk-EPBVNDKE.mjs +46 -0
  34. package/dist/chunk-EPBVNDKE.mjs.map +1 -0
  35. package/dist/chunk-FJNUPSQK.mjs +72 -0
  36. package/dist/chunk-FJNUPSQK.mjs.map +1 -0
  37. package/dist/chunk-FP2EKU3L.mjs +28 -0
  38. package/dist/chunk-FP2EKU3L.mjs.map +1 -0
  39. package/dist/chunk-GQN2HYFJ.mjs +22 -0
  40. package/dist/chunk-GQN2HYFJ.mjs.map +1 -0
  41. package/dist/chunk-H4VKQGVU.mjs +3 -0
  42. package/dist/chunk-H4VKQGVU.mjs.map +1 -0
  43. package/dist/chunk-HSCZA5TS.mjs +27 -0
  44. package/dist/chunk-HSCZA5TS.mjs.map +1 -0
  45. package/dist/chunk-IU3WTXLQ.mjs +3 -0
  46. package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
  47. package/dist/chunk-JJLQVT7S.mjs +10 -0
  48. package/dist/chunk-JJLQVT7S.mjs.map +1 -0
  49. package/dist/chunk-JYWINDWZ.mjs +46 -0
  50. package/dist/chunk-JYWINDWZ.mjs.map +1 -0
  51. package/dist/chunk-KDVMG3XF.mjs +63 -0
  52. package/dist/chunk-KDVMG3XF.mjs.map +1 -0
  53. package/dist/chunk-KFQZHRPJ.mjs +19 -0
  54. package/dist/chunk-KFQZHRPJ.mjs.map +1 -0
  55. package/dist/chunk-KJNSWCJC.mjs +112 -0
  56. package/dist/chunk-KJNSWCJC.mjs.map +1 -0
  57. package/dist/chunk-KNQIEOFP.mjs +18 -0
  58. package/dist/chunk-KNQIEOFP.mjs.map +1 -0
  59. package/dist/chunk-KTTN5H7S.mjs +202 -0
  60. package/dist/chunk-KTTN5H7S.mjs.map +1 -0
  61. package/dist/chunk-L7VVZH4Q.mjs +3 -0
  62. package/dist/chunk-L7VVZH4Q.mjs.map +1 -0
  63. package/dist/chunk-LQZBI6XD.mjs +112 -0
  64. package/dist/chunk-LQZBI6XD.mjs.map +1 -0
  65. package/dist/chunk-M2DR4KVB.mjs +33 -0
  66. package/dist/chunk-M2DR4KVB.mjs.map +1 -0
  67. package/dist/chunk-MMVDU6DF.mjs +3 -0
  68. package/dist/chunk-MMVDU6DF.mjs.map +1 -0
  69. package/dist/chunk-MRXNTQOX.mjs +55 -0
  70. package/dist/chunk-MRXNTQOX.mjs.map +1 -0
  71. package/dist/chunk-NT3GWKWK.mjs +59 -0
  72. package/dist/chunk-NT3GWKWK.mjs.map +1 -0
  73. package/dist/chunk-OHO4G6DR.mjs +19 -0
  74. package/dist/chunk-OHO4G6DR.mjs.map +1 -0
  75. package/dist/chunk-P4QVFRLY.mjs +103 -0
  76. package/dist/chunk-P4QVFRLY.mjs.map +1 -0
  77. package/dist/chunk-PTZVE6NC.mjs +94 -0
  78. package/dist/chunk-PTZVE6NC.mjs.map +1 -0
  79. package/dist/chunk-RKQ6RTZM.mjs +77 -0
  80. package/dist/chunk-RKQ6RTZM.mjs.map +1 -0
  81. package/dist/chunk-RUV6NBIF.mjs +3 -0
  82. package/dist/chunk-RUV6NBIF.mjs.map +1 -0
  83. package/dist/chunk-T6MTDQZ7.mjs +45 -0
  84. package/dist/chunk-T6MTDQZ7.mjs.map +1 -0
  85. package/dist/chunk-VPEH6V7T.mjs +83 -0
  86. package/dist/chunk-VPEH6V7T.mjs.map +1 -0
  87. package/dist/chunk-WADHCMPK.mjs +3 -0
  88. package/dist/chunk-WADHCMPK.mjs.map +1 -0
  89. package/dist/chunk-WFTAAA7R.mjs +44 -0
  90. package/dist/chunk-WFTAAA7R.mjs.map +1 -0
  91. package/dist/chunk-WJHSY5T6.mjs +3 -0
  92. package/dist/chunk-WJHSY5T6.mjs.map +1 -0
  93. package/dist/chunk-WTASPE2W.mjs +105 -0
  94. package/dist/chunk-WTASPE2W.mjs.map +1 -0
  95. package/dist/chunk-XV7MLLXQ.mjs +18 -0
  96. package/dist/chunk-XV7MLLXQ.mjs.map +1 -0
  97. package/dist/chunk-YLXEQDMS.mjs +217 -0
  98. package/dist/chunk-YLXEQDMS.mjs.map +1 -0
  99. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +35 -1745
  100. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -1
  101. package/dist/components/base-copilot-textarea/render-element.mjs +3 -51
  102. package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -1
  103. package/dist/components/base-copilot-textarea/render-placeholder.mjs +3 -49
  104. package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -1
  105. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +4 -86
  106. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -1
  107. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +3 -57
  108. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -1
  109. package/dist/components/copilot-textarea/copilot-textarea.mjs +44 -2192
  110. package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -1
  111. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +3 -17
  112. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -1
  113. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +3 -137
  114. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -1
  115. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +18 -875
  116. package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -1
  117. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +12 -558
  118. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -1
  119. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +13 -581
  120. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -1
  121. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +5 -102
  122. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs.map +1 -1
  123. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +14 -581
  124. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -1
  125. package/dist/components/index.mjs +45 -2193
  126. package/dist/components/index.mjs.map +1 -1
  127. package/dist/components/manual-ui/chip-with-icon.mjs +6 -5
  128. package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
  129. package/dist/components/source-search-box/source-search-box.mjs +6 -211
  130. package/dist/components/source-search-box/source-search-box.mjs.map +1 -1
  131. package/dist/components/ui/button.mjs +4 -85
  132. package/dist/components/ui/button.mjs.map +1 -1
  133. package/dist/components/ui/card.mjs +7 -53
  134. package/dist/components/ui/card.mjs.map +1 -1
  135. package/dist/components/ui/command.mjs +5 -244
  136. package/dist/components/ui/command.mjs.map +1 -1
  137. package/dist/components/ui/dialog.mjs +4 -144
  138. package/dist/components/ui/dialog.mjs.map +1 -1
  139. package/dist/components/ui/label.mjs +4 -60
  140. package/dist/components/ui/label.mjs.map +1 -1
  141. package/dist/components/ui/separator.mjs +8 -50
  142. package/dist/components/ui/separator.mjs.map +1 -1
  143. package/dist/components/ui/textarea.mjs +7 -48
  144. package/dist/components/ui/textarea.mjs.map +1 -1
  145. package/dist/context/index.mjs +2 -0
  146. package/dist/context/index.mjs.map +1 -1
  147. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +6 -158
  148. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -1
  149. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +4 -168
  150. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -1
  151. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +5 -148
  152. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -1
  153. package/dist/hooks/index.mjs +2 -0
  154. package/dist/hooks/index.mjs.map +1 -1
  155. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +4 -114
  156. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -1
  157. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +4 -166
  158. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -1
  159. package/dist/hooks/misc/use-autosize-textarea.mjs +3 -15
  160. package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -1
  161. package/dist/index.mjs +49 -2195
  162. package/dist/index.mjs.map +1 -1
  163. package/dist/lib/debouncer.mjs +3 -51
  164. package/dist/lib/debouncer.mjs.map +1 -1
  165. package/dist/lib/editor-to-text.mjs +3 -43
  166. package/dist/lib/editor-to-text.mjs.map +1 -1
  167. package/dist/lib/get-text-around-cursor.mjs +3 -102
  168. package/dist/lib/get-text-around-cursor.mjs.map +1 -1
  169. package/dist/lib/retry.mjs +3 -17
  170. package/dist/lib/retry.mjs.map +1 -1
  171. package/dist/lib/slatejs-edits/add-autocompletions.mjs +3 -25
  172. package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -1
  173. package/dist/lib/slatejs-edits/clear-autocompletions.mjs +3 -20
  174. package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -1
  175. package/dist/lib/slatejs-edits/replace-text.mjs +3 -27
  176. package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -1
  177. package/dist/lib/slatejs-edits/with-partial-history.mjs +3 -106
  178. package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -1
  179. package/dist/lib/stream-promise-flatten.mjs +3 -47
  180. package/dist/lib/stream-promise-flatten.mjs.map +1 -1
  181. package/dist/lib/utils.mjs +3 -71
  182. package/dist/lib/utils.mjs.map +1 -1
  183. package/dist/lib/utils.test.mjs +1 -0
  184. package/dist/lib/utils.test.mjs.map +1 -1
  185. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +2 -0
  186. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -1
  187. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +8 -274
  188. package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -1
  189. package/dist/types/autosuggestions-config/editing-api-config.mjs +3 -87
  190. package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -1
  191. package/dist/types/autosuggestions-config/index.mjs +9 -274
  192. package/dist/types/autosuggestions-config/index.mjs.map +1 -1
  193. package/dist/types/autosuggestions-config/insertions-api-config.mjs +3 -78
  194. package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -1
  195. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +2 -0
  196. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -1
  197. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs +2 -0
  198. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -1
  199. package/dist/types/autosuggestions-config/suggestions-api-config.mjs +3 -64
  200. package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -1
  201. package/dist/types/base/autosuggestion-state.mjs +2 -0
  202. package/dist/types/base/autosuggestion-state.mjs.map +1 -1
  203. package/dist/types/base/autosuggestions-bare-function.mjs +2 -0
  204. package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -1
  205. package/dist/types/base/base-autosuggestions-config.mjs +3 -26
  206. package/dist/types/base/base-autosuggestions-config.mjs.map +1 -1
  207. package/dist/types/base/base-copilot-textarea-props.mjs +2 -0
  208. package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -1
  209. package/dist/types/base/custom-editor.mjs +2 -0
  210. package/dist/types/base/custom-editor.mjs.map +1 -1
  211. package/dist/types/base/editor-autocomplete-state.mjs +4 -17
  212. package/dist/types/base/editor-autocomplete-state.mjs.map +1 -1
  213. package/dist/types/base/index.mjs +4 -26
  214. package/dist/types/base/index.mjs.map +1 -1
  215. package/dist/types/html-copilot-textarea-element.mjs +2 -0
  216. package/dist/types/html-copilot-textarea-element.mjs.map +1 -1
  217. package/dist/types/index.mjs +11 -275
  218. package/dist/types/index.mjs.map +1 -1
  219. package/package.json +3 -3
@@ -0,0 +1,45 @@
1
+ import { editorToText } from './chunk-T6MTDQZ7.mjs';
2
+ import { useEffect, useRef } from 'react';
3
+ import { useSlateSelector } from 'slate-react';
4
+ import { Range } from 'slate';
5
+ import { jsx, Fragment } from 'react/jsx-runtime';
6
+
7
+ function TrackerTextEditedSinceLastCursorMovement(props) {
8
+ const cursorState = useSlateSelector((state) => ({
9
+ selection: state.selection,
10
+ text: editorToText(state)
11
+ }));
12
+ const previousState = usePrevious(cursorState);
13
+ useEffect(() => {
14
+ if (!previousState) {
15
+ return;
16
+ }
17
+ if (cursorChangedWithoutTextChanged(previousState, cursorState)) {
18
+ props.setCursorMovedSinceLastTextChange(true);
19
+ }
20
+ }, [props.setCursorMovedSinceLastTextChange, cursorState]);
21
+ return /* @__PURE__ */ jsx(Fragment, {});
22
+ }
23
+ var cursorChangedWithoutTextChanged = (prev, next) => {
24
+ const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);
25
+ const isTextSame = prev.text === next.text;
26
+ return isSelectionChanged && isTextSame;
27
+ };
28
+ var isSelectionEqual = (a, b) => {
29
+ if (!a && !b)
30
+ return true;
31
+ if (!a || !b)
32
+ return false;
33
+ return Range.equals(a, b);
34
+ };
35
+ function usePrevious(value) {
36
+ const ref = useRef();
37
+ useEffect(() => {
38
+ ref.current = value;
39
+ });
40
+ return ref.current;
41
+ }
42
+
43
+ export { TrackerTextEditedSinceLastCursorMovement };
44
+ //# sourceMappingURL=out.js.map
45
+ //# sourceMappingURL=chunk-47L4PLG4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx"],"names":[],"mappings":";;;;;AAAA,SAAgB,WAAW,cAAc;AAEzC,SAAS,wBAAwB;AACjC,SAAS,aAAa;AA0Bb;AApBF,SAAS,yCACd,OACa;AACb,QAAM,cAAmC,iBAAiB,CAAC,WAAW;AAAA,IACpE,WAAW,MAAM;AAAA,IACjB,MAAM,aAAa,KAAK;AAAA,EAC1B,EAAE;AAEF,QAAM,gBAAgB,YAAY,WAAW;AAE7C,YAAU,MAAM;AACd,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,QAAI,gCAAgC,eAAe,WAAW,GAAG;AAC/D,YAAM,kCAAkC,IAAI;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,MAAM,mCAAmC,WAAW,CAAC;AAEzD,SAAO,gCAAE;AACX;AAOA,IAAM,kCAAkC,CACtC,MACA,SACY;AAEZ,QAAM,qBAAqB,CAAC,iBAAiB,KAAK,WAAW,KAAK,SAAS;AAG3E,QAAM,aAAa,KAAK,SAAS,KAAK;AAEtC,SAAO,sBAAsB;AAC/B;AAEA,IAAM,mBAAmB,CAAC,GAAkB,MAAqB;AAC/D,MAAI,CAAC,KAAK,CAAC;AAAG,WAAO;AACrB,MAAI,CAAC,KAAK,CAAC;AAAG,WAAO;AACrB,SAAO,MAAM,OAAO,GAAG,CAAC;AAC1B;AAiBA,SAAS,YAAe,OAAyB;AAC/C,QAAM,MAAM,OAAU;AAEtB,YAAU,MAAM;AACd,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO,IAAI;AACb","sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { BaseSelection } from \"slate\";\nimport { useSlateSelector } from \"slate-react\";\nimport { Range } from \"slate\";\nimport { editorToText } from \"../../lib/editor-to-text\";\n\ninterface TrackerTextEditedSinceLastCursorMovementProps {\n setCursorMovedSinceLastTextChange: (value: boolean) => void;\n}\nexport function TrackerTextEditedSinceLastCursorMovement(\n props: TrackerTextEditedSinceLastCursorMovementProps,\n): JSX.Element {\n const cursorState: RelevantEditorState = useSlateSelector((state) => ({\n selection: state.selection,\n text: editorToText(state),\n }));\n\n const previousState = usePrevious(cursorState);\n\n useEffect(() => {\n if (!previousState) {\n return;\n }\n\n if (cursorChangedWithoutTextChanged(previousState, cursorState)) {\n props.setCursorMovedSinceLastTextChange(true);\n }\n }, [props.setCursorMovedSinceLastTextChange, cursorState]);\n\n return <></>;\n}\n\ntype RelevantEditorState = {\n selection: BaseSelection;\n text: string;\n};\n\nconst cursorChangedWithoutTextChanged = (\n prev: RelevantEditorState,\n next: RelevantEditorState,\n): boolean => {\n // Check if the selection has changed\n const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);\n\n // Check if the text content remains the same\n const isTextSame = prev.text === next.text;\n\n return isSelectionChanged && isTextSame;\n};\n\nconst isSelectionEqual = (a: BaseSelection, b: BaseSelection) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return Range.equals(a, b);\n};\n\n/**\n * Easily keep track of the *previous* value of a variable.\n *\n * Example:\n * ```\n * const [count, setCount] = useState(0);\n * const prevCount = usePrevious(count);\n *\n * useEffect(() => {\n * if (count > prevCount) {\n * console.log('Now I know that count is bigger than before');\n * }\n * }, [count, prevCount]);\n * ```\n */\nfunction usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n });\n\n return ref.current;\n}\n"]}
@@ -0,0 +1,107 @@
1
+ import { Transforms, Editor, Operation, Path } from 'slate';
2
+ import { HistoryEditor } from 'slate-history';
3
+
4
+ // src/lib/slatejs-edits/with-partial-history.ts
5
+ var withPartialHistory = (editor, shouldSave) => {
6
+ const e = editor;
7
+ const { apply } = e;
8
+ e.history = { undos: [], redos: [] };
9
+ e.redo = () => {
10
+ const { history } = e;
11
+ const { redos } = history;
12
+ if (redos.length > 0) {
13
+ const batch = redos[redos.length - 1];
14
+ if (batch.selectionBefore) {
15
+ Transforms.setSelection(e, batch.selectionBefore);
16
+ }
17
+ HistoryEditor.withoutSaving(e, () => {
18
+ Editor.withoutNormalizing(e, () => {
19
+ for (const op of batch.operations) {
20
+ e.apply(op);
21
+ }
22
+ });
23
+ });
24
+ history.redos.pop();
25
+ e.writeHistory("undos", batch);
26
+ }
27
+ };
28
+ e.undo = () => {
29
+ const { history } = e;
30
+ const { undos } = history;
31
+ if (undos.length > 0) {
32
+ const batch = undos[undos.length - 1];
33
+ HistoryEditor.withoutSaving(e, () => {
34
+ Editor.withoutNormalizing(e, () => {
35
+ const inverseOps = batch.operations.map(Operation.inverse).reverse();
36
+ for (const op of inverseOps) {
37
+ e.apply(op);
38
+ }
39
+ if (batch.selectionBefore) {
40
+ Transforms.setSelection(e, batch.selectionBefore);
41
+ }
42
+ });
43
+ });
44
+ e.writeHistory("redos", batch);
45
+ history.undos.pop();
46
+ }
47
+ };
48
+ e.apply = (op) => {
49
+ const { operations, history } = e;
50
+ const { undos } = history;
51
+ const lastBatch = undos[undos.length - 1];
52
+ const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];
53
+ let save = HistoryEditor.isSaving(e);
54
+ let merge = HistoryEditor.isMerging(e);
55
+ if (save == null) {
56
+ save = shouldSave(op, lastOp);
57
+ }
58
+ if (save) {
59
+ if (merge == null) {
60
+ if (lastBatch == null) {
61
+ merge = false;
62
+ } else if (operations.length !== 0) {
63
+ merge = true;
64
+ } else {
65
+ merge = shouldMerge(op, lastOp);
66
+ }
67
+ }
68
+ if (lastBatch && merge) {
69
+ lastBatch.operations.push(op);
70
+ } else {
71
+ const batch = {
72
+ operations: [op],
73
+ selectionBefore: e.selection
74
+ };
75
+ e.writeHistory("undos", batch);
76
+ }
77
+ while (undos.length > 100) {
78
+ undos.shift();
79
+ }
80
+ history.redos = [];
81
+ }
82
+ apply(op);
83
+ };
84
+ e.writeHistory = (stack, batch) => {
85
+ e.history[stack].push(batch);
86
+ };
87
+ return e;
88
+ };
89
+ var shouldMerge = (op, prev) => {
90
+ if (prev && op.type === "insert_text" && prev.type === "insert_text" && op.offset === prev.offset + prev.text.length && Path.equals(op.path, prev.path)) {
91
+ return true;
92
+ }
93
+ if (prev && op.type === "remove_text" && prev.type === "remove_text" && op.offset + op.text.length === prev.offset && Path.equals(op.path, prev.path)) {
94
+ return true;
95
+ }
96
+ return false;
97
+ };
98
+ var defaultShouldSave = (op, prev) => {
99
+ if (op.type === "set_selection") {
100
+ return false;
101
+ }
102
+ return true;
103
+ };
104
+
105
+ export { defaultShouldSave, withPartialHistory };
106
+ //# sourceMappingURL=out.js.map
107
+ //# sourceMappingURL=chunk-4NHVQZ67.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/slatejs-edits/with-partial-history.ts"],"names":[],"mappings":";AAAA,SAAS,QAAQ,WAAW,MAAa,kBAAkB;AAC3D,SAAS,qBAAqB;AAMvB,IAAM,qBAAqB,CAChC,QACA,eACG;AACH,QAAM,IAAI;AACV,QAAM,EAAE,MAAM,IAAI;AAClB,IAAE,UAAU,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AAEnC,IAAE,OAAO,MAAM;AACb,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,EAAE,MAAM,IAAI;AAElB,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,MAAM,MAAM,SAAS,CAAC;AAEpC,UAAI,MAAM,iBAAiB;AACzB,mBAAW,aAAa,GAAG,MAAM,eAAe;AAAA,MAClD;AAEA,oBAAc,cAAc,GAAG,MAAM;AACnC,eAAO,mBAAmB,GAAG,MAAM;AACjC,qBAAW,MAAM,MAAM,YAAY;AACjC,cAAE,MAAM,EAAE;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,cAAQ,MAAM,IAAI;AAClB,QAAE,aAAa,SAAS,KAAK;AAAA,IAC/B;AAAA,EACF;AAEA,IAAE,OAAO,MAAM;AACb,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,EAAE,MAAM,IAAI;AAElB,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,MAAM,MAAM,SAAS,CAAC;AAEpC,oBAAc,cAAc,GAAG,MAAM;AACnC,eAAO,mBAAmB,GAAG,MAAM;AACjC,gBAAM,aAAa,MAAM,WAAW,IAAI,UAAU,OAAO,EAAE,QAAQ;AAEnE,qBAAW,MAAM,YAAY;AAC3B,cAAE,MAAM,EAAE;AAAA,UACZ;AACA,cAAI,MAAM,iBAAiB;AACzB,uBAAW,aAAa,GAAG,MAAM,eAAe;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,QAAE,aAAa,SAAS,KAAK;AAC7B,cAAQ,MAAM,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,IAAE,QAAQ,CAAC,OAAkB;AAC3B,UAAM,EAAE,YAAY,QAAQ,IAAI;AAChC,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,UAAM,SAAS,aAAa,UAAU,WAAW,UAAU,WAAW,SAAS,CAAC;AAChF,QAAI,OAAO,cAAc,SAAS,CAAC;AACnC,QAAI,QAAQ,cAAc,UAAU,CAAC;AAErC,QAAI,QAAQ,MAAM;AAChB,aAAO,WAAW,IAAI,MAAM;AAAA,IAC9B;AAEA,QAAI,MAAM;AACR,UAAI,SAAS,MAAM;AACjB,YAAI,aAAa,MAAM;AACrB,kBAAQ;AAAA,QACV,WAAW,WAAW,WAAW,GAAG;AAClC,kBAAQ;AAAA,QACV,OAAO;AACL,kBAAQ,YAAY,IAAI,MAAM;AAAA,QAChC;AAAA,MACF;AAEA,UAAI,aAAa,OAAO;AACtB,kBAAU,WAAW,KAAK,EAAE;AAAA,MAC9B,OAAO;AACL,cAAM,QAAQ;AAAA,UACZ,YAAY,CAAC,EAAE;AAAA,UACf,iBAAiB,EAAE;AAAA,QACrB;AACA,UAAE,aAAa,SAAS,KAAK;AAAA,MAC/B;AAEA,aAAO,MAAM,SAAS,KAAK;AACzB,cAAM,MAAM;AAAA,MACd;AAEA,cAAQ,QAAQ,CAAC;AAAA,IACnB;AAEA,UAAM,EAAE;AAAA,EACV;AAEA,IAAE,eAAe,CAAC,OAA0B,UAAe;AACzD,MAAE,QAAQ,KAAK,EAAE,KAAK,KAAK;AAAA,EAC7B;AAEA,SAAO;AACT;AAMA,IAAM,cAAc,CAAC,IAAe,SAAyC;AAC3E,MACE,QACA,GAAG,SAAS,iBACZ,KAAK,SAAS,iBACd,GAAG,WAAW,KAAK,SAAS,KAAK,KAAK,UACtC,KAAK,OAAO,GAAG,MAAM,KAAK,IAAI,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,MACE,QACA,GAAG,SAAS,iBACZ,KAAK,SAAS,iBACd,GAAG,SAAS,GAAG,KAAK,WAAW,KAAK,UACpC,KAAK,OAAO,GAAG,MAAM,KAAK,IAAI,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,IAAe,SAAyC;AACxF,MAAI,GAAG,SAAS,iBAAiB;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO;AACT","sourcesContent":["import { Editor, Operation, Path, Range, Transforms } from \"slate\";\nimport { HistoryEditor } from \"slate-history\";\n\n// Copy-pasted from `https://github.com/ianstormtaylor/slate/blob/main/packages/slate-history/src/with-history.ts`\n// With one exception: the `shouldSave` function is passed in as an argument to `withPartialHistory` instead of being hardcoded\nexport type ShouldSaveToHistory = (op: Operation, prev: Operation | undefined) => boolean;\n\nexport const withPartialHistory = <T extends Editor>(\n editor: T,\n shouldSave: ShouldSaveToHistory,\n) => {\n const e = editor as T & HistoryEditor;\n const { apply } = e;\n e.history = { undos: [], redos: [] };\n\n e.redo = () => {\n const { history } = e;\n const { redos } = history;\n\n if (redos.length > 0) {\n const batch = redos[redos.length - 1];\n\n if (batch.selectionBefore) {\n Transforms.setSelection(e, batch.selectionBefore);\n }\n\n HistoryEditor.withoutSaving(e, () => {\n Editor.withoutNormalizing(e, () => {\n for (const op of batch.operations) {\n e.apply(op);\n }\n });\n });\n\n history.redos.pop();\n e.writeHistory(\"undos\", batch);\n }\n };\n\n e.undo = () => {\n const { history } = e;\n const { undos } = history;\n\n if (undos.length > 0) {\n const batch = undos[undos.length - 1];\n\n HistoryEditor.withoutSaving(e, () => {\n Editor.withoutNormalizing(e, () => {\n const inverseOps = batch.operations.map(Operation.inverse).reverse();\n\n for (const op of inverseOps) {\n e.apply(op);\n }\n if (batch.selectionBefore) {\n Transforms.setSelection(e, batch.selectionBefore);\n }\n });\n });\n\n e.writeHistory(\"redos\", batch);\n history.undos.pop();\n }\n };\n\n e.apply = (op: Operation) => {\n const { operations, history } = e;\n const { undos } = history;\n const lastBatch = undos[undos.length - 1];\n const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];\n let save = HistoryEditor.isSaving(e);\n let merge = HistoryEditor.isMerging(e);\n\n if (save == null) {\n save = shouldSave(op, lastOp);\n }\n\n if (save) {\n if (merge == null) {\n if (lastBatch == null) {\n merge = false;\n } else if (operations.length !== 0) {\n merge = true;\n } else {\n merge = shouldMerge(op, lastOp);\n }\n }\n\n if (lastBatch && merge) {\n lastBatch.operations.push(op);\n } else {\n const batch = {\n operations: [op],\n selectionBefore: e.selection,\n };\n e.writeHistory(\"undos\", batch);\n }\n\n while (undos.length > 100) {\n undos.shift();\n }\n\n history.redos = [];\n }\n\n apply(op);\n };\n\n e.writeHistory = (stack: \"undos\" | \"redos\", batch: any) => {\n e.history[stack].push(batch);\n };\n\n return e;\n};\n\n/**\n * Check whether to merge an operation into the previous operation.\n */\n\nconst shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {\n if (\n prev &&\n op.type === \"insert_text\" &&\n prev.type === \"insert_text\" &&\n op.offset === prev.offset + prev.text.length &&\n Path.equals(op.path, prev.path)\n ) {\n return true;\n }\n\n if (\n prev &&\n op.type === \"remove_text\" &&\n prev.type === \"remove_text\" &&\n op.offset + op.text.length === prev.offset &&\n Path.equals(op.path, prev.path)\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const defaultShouldSave = (op: Operation, prev: Operation | undefined): boolean => {\n if (op.type === \"set_selection\") {\n return false;\n }\n\n return true;\n};\n"]}
@@ -0,0 +1,86 @@
1
+ // src/types/autosuggestions-config/editing-api-config.tsx
2
+ var defaultEditingMakeSystemPrompt = (textareaPurpose, contextString) => {
3
+ return `You are a versatile writing assistant helping the user edit a portion of their text.
4
+
5
+ The user is writing some text.
6
+ The purpose is: "${textareaPurpose}"
7
+
8
+ The following external context is also provided. Use it when relevant.
9
+ \`\`\`
10
+ ${contextString}
11
+ \`\`\`
12
+
13
+ The user has provided you with a PROMPT for EDITING a PORTION of the text.
14
+ Your job is to come up with a new EDITED version OF THE SEGMENT IN QUESTION - AS BEST YOU CAN.
15
+ Only rewrite the portion of the text that the user has marked as "TextToEdit"!!!
16
+
17
+ Adjust yourself to the user's style and implied intent.
18
+
19
+ The conversation will be structured as follows:
20
+ <TextBeforeCursor>
21
+ <TextToEdit>
22
+ <TextAfterCursor>
23
+ <EditingPrompt>
24
+
25
+ <YourEditSuggestion>
26
+ `;
27
+ };
28
+ var defaultEditingFewShotMessages = [
29
+ {
30
+ role: "user",
31
+ name: "TextBeforeCursor",
32
+ content: "This morning I woke up and went straight to the grocery store. "
33
+ },
34
+ {
35
+ role: "user",
36
+ name: "TextToEdit",
37
+ content: "While I was there I picked up some apples, oranges, and bananas. "
38
+ },
39
+ {
40
+ role: "user",
41
+ name: "TextAfterCursor",
42
+ content: "The grocery store was having a sale on fruit, so I decided to stock up."
43
+ },
44
+ {
45
+ role: "user",
46
+ name: "EditingPrompt",
47
+ content: "I also bought a big watermelon"
48
+ },
49
+ {
50
+ role: "assistant",
51
+ content: "While I was there I picked up some apples, oranges, and bananas, and a big watermelon."
52
+ },
53
+ {
54
+ role: "user",
55
+ name: "TextBeforeCursor",
56
+ content: "Yesterday, I spent the afternoon working on my new project. "
57
+ },
58
+ {
59
+ role: "user",
60
+ name: "TextToEdit",
61
+ content: "It's quite challenging and requires a lot of focus. "
62
+ },
63
+ {
64
+ role: "user",
65
+ name: "TextAfterCursor",
66
+ content: "I'm really excited about the potential outcomes of this project."
67
+ },
68
+ {
69
+ role: "user",
70
+ name: "EditingPrompt",
71
+ content: "emphasize the complexity and my enthusiasm for the project"
72
+ },
73
+ {
74
+ role: "assistant",
75
+ content: "It's a highly complex task that demands intense concentration, but I'm incredibly enthusiastic about the promising prospects of this project."
76
+ }
77
+ ];
78
+ var defaultEditingApiConfig = {
79
+ makeSystemPrompt: defaultEditingMakeSystemPrompt,
80
+ fewShotMessages: defaultEditingFewShotMessages,
81
+ forwardedParams: void 0
82
+ };
83
+
84
+ export { defaultEditingApiConfig, defaultEditingFewShotMessages, defaultEditingMakeSystemPrompt };
85
+ //# sourceMappingURL=out.js.map
86
+ //# sourceMappingURL=chunk-4OJ3H65F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/autosuggestions-config/editing-api-config.tsx"],"names":[],"mappings":";AASO,IAAM,iCAAmD,CAC9D,iBACA,kBACG;AACH,SAAO;AAAA;AAAA;AAAA,mBAGW;AAAA;AAAA;AAAA;AAAA,EAIlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBF;AAEO,IAAM,gCAAyD;AAAA,EACpE;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SACE;AAAA,EACJ;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SACE;AAAA,EACJ;AACF;AAEO,IAAM,0BAA4C;AAAA,EACvD,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB","sourcesContent":["import { MakeSystemPrompt } from \"./subtypes/make-system-prompt\";\nimport { MinimalChatGPTMessage } from \"./subtypes/minimal-chat-gpt-message\";\n\nexport interface EditingApiConfig {\n makeSystemPrompt: MakeSystemPrompt;\n fewShotMessages: MinimalChatGPTMessage[];\n forwardedParams: { [key: string]: any } | undefined;\n}\n\nexport const defaultEditingMakeSystemPrompt: MakeSystemPrompt = (\n textareaPurpose,\n contextString,\n) => {\n return `You are a versatile writing assistant helping the user edit a portion of their text.\n \nThe user is writing some text.\nThe purpose is: \\\"${textareaPurpose}\\\"\n\nThe following external context is also provided. Use it when relevant.\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThe user has provided you with a PROMPT for EDITING a PORTION of the text. \nYour job is to come up with a new EDITED version OF THE SEGMENT IN QUESTION - AS BEST YOU CAN.\nOnly rewrite the portion of the text that the user has marked as \"TextToEdit\"!!!\n\nAdjust yourself to the user's style and implied intent.\n\nThe conversation will be structured as follows:\n<TextBeforeCursor>\n<TextToEdit>\n<TextAfterCursor>\n<EditingPrompt>\n\n<YourEditSuggestion>\n`;\n};\n\nexport const defaultEditingFewShotMessages: MinimalChatGPTMessage[] = [\n {\n role: \"user\",\n name: \"TextBeforeCursor\",\n content: \"This morning I woke up and went straight to the grocery store. \",\n },\n {\n role: \"user\",\n name: \"TextToEdit\",\n content: \"While I was there I picked up some apples, oranges, and bananas. \",\n },\n {\n role: \"user\",\n name: \"TextAfterCursor\",\n content: \"The grocery store was having a sale on fruit, so I decided to stock up.\",\n },\n {\n role: \"user\",\n name: \"EditingPrompt\",\n content: \"I also bought a big watermelon\",\n },\n {\n role: \"assistant\",\n content:\n \"While I was there I picked up some apples, oranges, and bananas, and a big watermelon.\",\n },\n\n {\n role: \"user\",\n name: \"TextBeforeCursor\",\n content: \"Yesterday, I spent the afternoon working on my new project. \",\n },\n {\n role: \"user\",\n name: \"TextToEdit\",\n content: \"It's quite challenging and requires a lot of focus. \",\n },\n {\n role: \"user\",\n name: \"TextAfterCursor\",\n content: \"I'm really excited about the potential outcomes of this project.\",\n },\n {\n role: \"user\",\n name: \"EditingPrompt\",\n content: \"emphasize the complexity and my enthusiasm for the project\",\n },\n {\n role: \"assistant\",\n content:\n \"It's a highly complex task that demands intense concentration, but I'm incredibly enthusiastic about the promising prospects of this project.\",\n },\n];\n\nexport const defaultEditingApiConfig: EditingApiConfig = {\n makeSystemPrompt: defaultEditingMakeSystemPrompt,\n fewShotMessages: defaultEditingFewShotMessages,\n forwardedParams: undefined,\n};\n"]}
@@ -0,0 +1,29 @@
1
+ import { Transforms, Editor } from 'slate';
2
+
3
+ // src/lib/slatejs-edits/replace-text.ts
4
+ function replaceEditorText(editor, newText) {
5
+ Transforms.delete(editor, {
6
+ at: {
7
+ anchor: Editor.start(editor, []),
8
+ focus: Editor.end(editor, [])
9
+ }
10
+ });
11
+ if (newText && newText !== "") {
12
+ Transforms.insertNodes(
13
+ editor,
14
+ [
15
+ {
16
+ type: "paragraph",
17
+ children: [{ text: newText }]
18
+ }
19
+ ],
20
+ {
21
+ at: [0]
22
+ }
23
+ );
24
+ }
25
+ }
26
+
27
+ export { replaceEditorText };
28
+ //# sourceMappingURL=out.js.map
29
+ //# sourceMappingURL=chunk-5UNJXFUO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/slatejs-edits/replace-text.ts"],"names":[],"mappings":";AAAA,SAAS,QAAQ,kBAAkB;AAE5B,SAAS,kBAAkB,QAAgB,SAAiB;AAEjE,aAAW,OAAO,QAAQ;AAAA,IACxB,IAAI;AAAA,MACF,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,MAC/B,OAAO,OAAO,IAAI,QAAQ,CAAC,CAAC;AAAA,IAC9B;AAAA,EACF,CAAC;AAGD,MAAI,WAAW,YAAY,IAAI;AAE7B,eAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,UAAU,CAAC,EAAE,MAAM,QAAQ,CAAC;AAAA,QAC9B;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI,CAAC,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF","sourcesContent":["import { Editor, Transforms } from \"slate\";\n\nexport function replaceEditorText(editor: Editor, newText: string) {\n // clear all previous text\n Transforms.delete(editor, {\n at: {\n anchor: Editor.start(editor, []),\n focus: Editor.end(editor, []),\n },\n });\n\n // insert new text\n if (newText && newText !== \"\") {\n // don't insert empty text - results in strange visual behavior\n Transforms.insertNodes(\n editor,\n [\n {\n type: \"paragraph\",\n children: [{ text: newText }],\n },\n ],\n {\n at: [0],\n },\n );\n }\n}\n"]}
@@ -0,0 +1,91 @@
1
+ import { areEqual_autocompleteState } from './chunk-JJLQVT7S.mjs';
2
+ import { nullableCompatibleEqualityCheck } from './chunk-7SUZ6CXM.mjs';
3
+ import { Debouncer } from './chunk-M2DR4KVB.mjs';
4
+ import { __async } from './chunk-MRXNTQOX.mjs';
5
+ import { useState, useCallback, useMemo, useEffect } from 'react';
6
+
7
+ function useAutosuggestions(debounceTime, shouldAcceptAutosuggestionOnKeyPress, autosuggestionFunction, insertAutocompleteSuggestion, disableWhenEmpty, disabled) {
8
+ const [previousAutocompleteState, setPreviousAutocompleteState] = useState(null);
9
+ const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] = useState(null);
10
+ const awaitForAndAppendSuggestion = useCallback(
11
+ (editorAutocompleteState, abortSignal) => __async(this, null, function* () {
12
+ if (disabled) {
13
+ return;
14
+ }
15
+ if (disableWhenEmpty && editorAutocompleteState.textBeforeCursor === "" && editorAutocompleteState.textAfterCursor === "") {
16
+ return;
17
+ }
18
+ const suggestion = yield autosuggestionFunction(editorAutocompleteState, abortSignal);
19
+ if (!suggestion || abortSignal.aborted) {
20
+ throw new DOMException("Aborted", "AbortError");
21
+ }
22
+ setCurrentAutocompleteSuggestion({
23
+ text: suggestion,
24
+ point: editorAutocompleteState.cursorPoint
25
+ });
26
+ }),
27
+ [autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty, disabled]
28
+ );
29
+ const debouncedFunction = useMemo(
30
+ () => new Debouncer(debounceTime),
31
+ [debounceTime]
32
+ );
33
+ useEffect(() => {
34
+ return () => {
35
+ debouncedFunction.cancel();
36
+ setCurrentAutocompleteSuggestion(null);
37
+ };
38
+ }, [debouncedFunction, disabled]);
39
+ const onChange = useCallback(
40
+ (newEditorState) => {
41
+ const editorStateHasChanged = !nullableCompatibleEqualityCheck(
42
+ areEqual_autocompleteState,
43
+ previousAutocompleteState,
44
+ newEditorState
45
+ );
46
+ setPreviousAutocompleteState(newEditorState);
47
+ if (!editorStateHasChanged) {
48
+ return;
49
+ }
50
+ setCurrentAutocompleteSuggestion(null);
51
+ if (newEditorState) {
52
+ debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);
53
+ } else {
54
+ debouncedFunction.cancel();
55
+ }
56
+ },
57
+ [
58
+ previousAutocompleteState,
59
+ setPreviousAutocompleteState,
60
+ debouncedFunction,
61
+ awaitForAndAppendSuggestion,
62
+ setCurrentAutocompleteSuggestion
63
+ ]
64
+ );
65
+ const keyDownHandler = useCallback(
66
+ (event) => {
67
+ if (currentAutocompleteSuggestion) {
68
+ if (shouldAcceptAutosuggestionOnKeyPress(event)) {
69
+ event.preventDefault();
70
+ insertAutocompleteSuggestion(currentAutocompleteSuggestion);
71
+ setCurrentAutocompleteSuggestion(null);
72
+ }
73
+ }
74
+ },
75
+ [
76
+ currentAutocompleteSuggestion,
77
+ setCurrentAutocompleteSuggestion,
78
+ insertAutocompleteSuggestion,
79
+ shouldAcceptAutosuggestionOnKeyPress
80
+ ]
81
+ );
82
+ return {
83
+ currentAutocompleteSuggestion,
84
+ onChangeHandler: onChange,
85
+ onKeyDownHandler: keyDownHandler
86
+ };
87
+ }
88
+
89
+ export { useAutosuggestions };
90
+ //# sourceMappingURL=out.js.map
91
+ //# sourceMappingURL=chunk-72P3KOHZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,aAAa,WAAW,SAAS,gBAAgB;AAgBnD,SAAS,mBACd,cACA,sCACA,wBACA,8BACA,kBACA,UAC0B;AAC1B,QAAM,CAAC,2BAA2B,4BAA4B,IAC5D,SAAyC,IAAI;AAE/C,QAAM,CAAC,+BAA+B,gCAAgC,IACpE,SAAqC,IAAI;AAE3C,QAAM,8BAGe;AAAA,IACnB,CAAO,yBAAkD,gBAA6B;AAEpF,UAAI,UAAU;AACZ;AAAA,MACF;AAEA,UACE,oBACA,wBAAwB,qBAAqB,MAC7C,wBAAwB,oBAAoB,IAC5C;AACA;AAAA,MACF;AAGA,YAAM,aAAa,MAAM,uBAAuB,yBAAyB,WAAW;AAGpF,UAAI,CAAC,cAAc,YAAY,SAAS;AACtC,cAAM,IAAI,aAAa,WAAW,YAAY;AAAA,MAChD;AAEA,uCAAiC;AAAA,QAC/B,MAAM;AAAA,QACN,OAAO,wBAAwB;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IACA,CAAC,wBAAwB,kCAAkC,kBAAkB,QAAQ;AAAA,EACvF;AAEA,QAAM,oBAAoB;AAAA,IACxB,MAAM,IAAI,UAA8D,YAAY;AAAA,IACpF,CAAC,YAAY;AAAA,EACf;AAGA,YAAU,MAAM;AACd,WAAO,MAAM;AACX,wBAAkB,OAAO;AACzB,uCAAiC,IAAI;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,mBAAmB,QAAQ,CAAC;AAEhC,QAAM,WAAW;AAAA,IACf,CAAC,mBAAmD;AAClD,YAAM,wBAAwB,CAAC;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,mCAA6B,cAAc;AAG3C,UAAI,CAAC,uBAAuB;AAC1B;AAAA,MACF;AAGA,uCAAiC,IAAI;AAGrC,UAAI,gBAAgB;AAClB,0BAAkB,SAAS,6BAA6B,cAAc;AAAA,MACxE,OAAO;AACL,0BAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,UAA+C;AAC9C,UAAI,+BAA+B;AACjC,YAAI,qCAAqC,KAAK,GAAG;AAC/C,gBAAM,eAAe;AACrB,uCAA6B,6BAA6B;AAC1D,2CAAiC,IAAI;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AACF","sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Debouncer } from \"../../lib/debouncer\";\nimport { nullableCompatibleEqualityCheck } from \"../../lib/utils\";\nimport { AutosuggestionsBareFunction } from \"../../types/base\";\nimport { AutosuggestionState } from \"../../types/base/autosuggestion-state\";\nimport {\n EditorAutocompleteState,\n areEqual_autocompleteState,\n} from \"../../types/base/editor-autocomplete-state\";\n\nexport interface UseAutosuggestionsResult {\n currentAutocompleteSuggestion: AutosuggestionState | null;\n onChangeHandler: (newEditorState: EditorAutocompleteState | null) => void;\n onKeyDownHandler: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function useAutosuggestions(\n debounceTime: number,\n shouldAcceptAutosuggestionOnKeyPress: (event: React.KeyboardEvent<HTMLDivElement>) => boolean,\n autosuggestionFunction: AutosuggestionsBareFunction,\n insertAutocompleteSuggestion: (suggestion: AutosuggestionState) => void,\n disableWhenEmpty: boolean,\n disabled: boolean,\n): UseAutosuggestionsResult {\n const [previousAutocompleteState, setPreviousAutocompleteState] =\n useState<EditorAutocompleteState | null>(null);\n\n const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] =\n useState<AutosuggestionState | null>(null);\n\n const awaitForAndAppendSuggestion: (\n editorAutocompleteState: EditorAutocompleteState,\n abortSignal: AbortSignal,\n ) => Promise<void> = useCallback(\n async (editorAutocompleteState: EditorAutocompleteState, abortSignal: AbortSignal) => {\n // early return if disabled\n if (disabled) {\n return;\n }\n\n if (\n disableWhenEmpty &&\n editorAutocompleteState.textBeforeCursor === \"\" &&\n editorAutocompleteState.textAfterCursor === \"\"\n ) {\n return;\n }\n\n // fetch the suggestion\n const suggestion = await autosuggestionFunction(editorAutocompleteState, abortSignal);\n\n // We'll assume for now that the autocomplete function might or might not respect the abort signal.\n if (!suggestion || abortSignal.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n setCurrentAutocompleteSuggestion({\n text: suggestion,\n point: editorAutocompleteState.cursorPoint,\n });\n },\n [autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty, disabled],\n );\n\n const debouncedFunction = useMemo(\n () => new Debouncer<[editorAutocompleteState: EditorAutocompleteState]>(debounceTime),\n [debounceTime],\n );\n\n // clean current state when unmounting or disabling\n useEffect(() => {\n return () => {\n debouncedFunction.cancel();\n setCurrentAutocompleteSuggestion(null);\n };\n }, [debouncedFunction, disabled]);\n\n const onChange = useCallback(\n (newEditorState: EditorAutocompleteState | null) => {\n const editorStateHasChanged = !nullableCompatibleEqualityCheck(\n areEqual_autocompleteState,\n previousAutocompleteState,\n newEditorState,\n );\n setPreviousAutocompleteState(newEditorState);\n\n // if no change, do nothing\n if (!editorStateHasChanged) {\n return;\n }\n\n // if change, then first null out the current suggestion\n setCurrentAutocompleteSuggestion(null);\n\n // then try to get a new suggestion, debouncing to avoid too many requests while typing\n if (newEditorState) {\n debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);\n } else {\n debouncedFunction.cancel();\n }\n },\n [\n previousAutocompleteState,\n setPreviousAutocompleteState,\n debouncedFunction,\n awaitForAndAppendSuggestion,\n setCurrentAutocompleteSuggestion,\n ],\n );\n\n const keyDownHandler = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (currentAutocompleteSuggestion) {\n if (shouldAcceptAutosuggestionOnKeyPress(event)) {\n event.preventDefault();\n insertAutocompleteSuggestion(currentAutocompleteSuggestion);\n setCurrentAutocompleteSuggestion(null);\n }\n }\n },\n [\n currentAutocompleteSuggestion,\n setCurrentAutocompleteSuggestion,\n insertAutocompleteSuggestion,\n shouldAcceptAutosuggestionOnKeyPress,\n ],\n );\n\n return {\n currentAutocompleteSuggestion,\n onChangeHandler: onChange,\n onKeyDownHandler: keyDownHandler,\n };\n}\n"]}
@@ -0,0 +1,59 @@
1
+ import { useEffect } from 'react';
2
+
3
+ // src/components/base-copilot-textarea/use-add-branding-css.tsx
4
+ function useAddBrandingCss(suggestionStyleAugmented, disableBranding) {
5
+ const cssSelector = ".copilot-textarea.with-branding";
6
+ useEffect(() => {
7
+ if (disableBranding) {
8
+ return;
9
+ }
10
+ const styleEl = document.createElement("style");
11
+ styleEl.id = "dynamic-styles";
12
+ let dynamicStyles = Object.entries(suggestionStyleAugmented).map(([key, value]) => {
13
+ const kebabCaseKey = key.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, "$1-$2").toLowerCase();
14
+ return `${kebabCaseKey}: ${value};`;
15
+ }).join(" ");
16
+ dynamicStyles += `font-style: normal; font-size: x-small;`;
17
+ dynamicStyles += `content: "CopilotKit";`;
18
+ dynamicStyles += `bottom: 6px;`;
19
+ dynamicStyles += `right: 6px;`;
20
+ dynamicStyles += `pointer-events: none;`;
21
+ dynamicStyles += `font-weight: 200;`;
22
+ dynamicStyles += `padding: 0;`;
23
+ dynamicStyles += `margin: 0;`;
24
+ dynamicStyles += `border: 0;`;
25
+ dynamicStyles += `line-height: 1;`;
26
+ dynamicStyles += `position: absolute;`;
27
+ styleEl.innerHTML = `
28
+ ${cssSelector}::after {
29
+ ${dynamicStyles}
30
+ }
31
+ `;
32
+ document.head.appendChild(styleEl);
33
+ const textarea = document.querySelector(cssSelector);
34
+ const handleScroll = () => {
35
+ const styleEl2 = document.getElementById("dynamic-styles");
36
+ if (styleEl2 && textarea) {
37
+ const offsetFromBottom = -textarea.scrollTop + 6;
38
+ const offsetFromRight = -textarea.scrollLeft + 6;
39
+ styleEl2.innerHTML = `
40
+ ${cssSelector}::after {
41
+ ${dynamicStyles}
42
+ bottom: ${offsetFromBottom}px;
43
+ right: ${offsetFromRight}px;
44
+ }
45
+ `;
46
+ }
47
+ };
48
+ textarea == null ? void 0 : textarea.addEventListener("scroll", handleScroll);
49
+ return () => {
50
+ var _a;
51
+ (_a = document.getElementById("dynamic-styles")) == null ? void 0 : _a.remove();
52
+ textarea == null ? void 0 : textarea.removeEventListener("scroll", handleScroll);
53
+ };
54
+ }, [disableBranding, suggestionStyleAugmented]);
55
+ }
56
+
57
+ export { useAddBrandingCss };
58
+ //# sourceMappingURL=out.js.map
59
+ //# sourceMappingURL=chunk-7LSRNPNI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/base-copilot-textarea/use-add-branding-css.tsx"],"names":["styleEl"],"mappings":";AAAA,SAAS,iBAAiB;AAEnB,SAAS,kBACd,0BACA,iBACA;AACA,QAAM,cAAc;AACpB,YAAU,MAAM;AACd,QAAI,iBAAiB;AACnB;AAAA,IACF;AAIA,UAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,YAAQ,KAAK;AAGb,QAAI,gBAAgB,OAAO,QAAQ,wBAAwB,EACxD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,YAAM,eAAe,IAAI,QAAQ,gCAAgC,OAAO,EAAE,YAAY;AACtF,aAAO,GAAG,iBAAiB;AAAA,IAC7B,CAAC,EACA,KAAK,GAAG;AAGX,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AAGjB,YAAQ,YAAY;AAAA,QAChB;AAAA,UACE;AAAA;AAAA;AAIN,aAAS,KAAK,YAAY,OAAO;AAIjC,UAAM,WAAW,SAAS,cAAc,WAAW;AACnD,UAAM,eAAe,MAAM;AACzB,YAAMA,WAAU,SAAS,eAAe,gBAAgB;AACxD,UAAIA,YAAW,UAAU;AACvB,cAAM,mBAAmB,CAAC,SAAS,YAAY;AAC/C,cAAM,kBAAkB,CAAC,SAAS,aAAa;AAC/C,QAAAA,SAAQ,YAAY;AAAA,YAChB;AAAA,cACE;AAAA,sBACQ;AAAA,qBACD;AAAA;AAAA;AAAA,MAGf;AAAA,IACF;AAEA,yCAAU,iBAAiB,UAAU;AAGrC,WAAO,MAAM;AApEjB;AAqEM,qBAAS,eAAe,gBAAgB,MAAxC,mBAA2C;AAC3C,2CAAU,oBAAoB,UAAU;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,iBAAiB,wBAAwB,CAAC;AAChD","sourcesContent":["import { useEffect } from \"react\";\n\nexport function useAddBrandingCss(\n suggestionStyleAugmented: React.CSSProperties,\n disableBranding: boolean | undefined,\n) {\n const cssSelector = \".copilot-textarea.with-branding\";\n useEffect(() => {\n if (disableBranding) {\n return;\n }\n\n // ---\n // 1: Add the CSS to the DOM\n const styleEl = document.createElement(\"style\");\n styleEl.id = \"dynamic-styles\";\n\n // Build the CSS string dynamically\n let dynamicStyles = Object.entries(suggestionStyleAugmented)\n .map(([key, value]) => {\n const kebabCaseKey = key.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\").toLowerCase();\n return `${kebabCaseKey}: ${value};`;\n })\n .join(\" \");\n\n // Append overrides for italics and font-size\n dynamicStyles += `font-style: normal; font-size: x-small;`;\n dynamicStyles += `content: \"CopilotKit\";`;\n dynamicStyles += `bottom: 6px;`;\n dynamicStyles += `right: 6px;`;\n dynamicStyles += `pointer-events: none;`;\n dynamicStyles += `font-weight: 200;`;\n dynamicStyles += `padding: 0;`;\n dynamicStyles += `margin: 0;`;\n dynamicStyles += `border: 0;`;\n dynamicStyles += `line-height: 1;`;\n dynamicStyles += `position: absolute;`;\n\n // Append it to the ::after class\n styleEl.innerHTML = `\n ${cssSelector}::after {\n ${dynamicStyles}\n }\n `;\n\n document.head.appendChild(styleEl);\n\n // ---\n // 2: Add the scroll listener (to keep the branding in the bottom right as the textarea scrolls)\n const textarea = document.querySelector(cssSelector);\n const handleScroll = () => {\n const styleEl = document.getElementById(\"dynamic-styles\");\n if (styleEl && textarea) {\n const offsetFromBottom = -textarea.scrollTop + 6;\n const offsetFromRight = -textarea.scrollLeft + 6;\n styleEl.innerHTML = `\n ${cssSelector}::after {\n ${dynamicStyles}\n bottom: ${offsetFromBottom}px;\n right: ${offsetFromRight}px;\n }\n `;\n }\n };\n\n textarea?.addEventListener(\"scroll\", handleScroll);\n\n // Cleanup\n return () => {\n document.getElementById(\"dynamic-styles\")?.remove();\n textarea?.removeEventListener(\"scroll\", handleScroll);\n };\n }, [disableBranding, suggestionStyleAugmented]);\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { __async } from './chunk-MRXNTQOX.mjs';
2
+ import { clsx } from 'clsx';
3
+ import { customAlphabet } from 'nanoid';
4
+ import { twMerge } from 'tailwind-merge';
5
+
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ var nanoid = customAlphabet(
10
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
11
+ 7
12
+ );
13
+ function fetcher(input, init) {
14
+ return __async(this, null, function* () {
15
+ const res = yield fetch(input, init);
16
+ if (!res.ok) {
17
+ const json = yield res.json();
18
+ if (json.error) {
19
+ const error = new Error(json.error);
20
+ error.status = res.status;
21
+ throw error;
22
+ } else {
23
+ throw new Error("An unexpected error occurred");
24
+ }
25
+ }
26
+ return res.json();
27
+ });
28
+ }
29
+ function formatDate(input) {
30
+ const date = new Date(input);
31
+ return date.toLocaleDateString("en-US", {
32
+ month: "long",
33
+ day: "numeric",
34
+ year: "numeric"
35
+ });
36
+ }
37
+ var arraysAreEqual = (arr1, arr2) => arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
38
+ function nullableCompatibleEqualityCheck(naiveEqualityCheck, a, b) {
39
+ if (a === null || a === void 0 || b === null || b === void 0) {
40
+ return a === b;
41
+ }
42
+ return naiveEqualityCheck(a, b);
43
+ }
44
+
45
+ export { arraysAreEqual, cn, fetcher, formatDate, nanoid, nullableCompatibleEqualityCheck };
46
+ //# sourceMappingURL=out.js.map
47
+ //# sourceMappingURL=chunk-7SUZ6CXM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":";;;;;AAAA,SAAS,YAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;AAEO,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AACF;AAEA,SAAsB,QAAoB,OAAoB,MAAmC;AAAA;AAC/F,UAAM,MAAM,MAAM,MAAM,OAAO,IAAI;AAEnC,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAI,KAAK,OAAO;AACd,cAAM,QAAQ,IAAI,MAAM,KAAK,KAAK;AAGlC,cAAM,SAAS,IAAI;AACnB,cAAM;AAAA,MACR,OAAO;AACL,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,IACF;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAEO,SAAS,WAAW,OAAuC;AAChE,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC;AACH;AAEO,IAAM,iBAAiB,CAAC,MAAgB,SAC7C,KAAK,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC,OAAO,UAAU,UAAU,KAAK,KAAK,CAAC;AAE5E,SAAS,gCACd,oBACA,GACA,GACS;AACT,MAAI,MAAM,QAAQ,MAAM,UAAa,MAAM,QAAQ,MAAM,QAAW;AAClE,WAAO,MAAM;AAAA,EACf;AAEA,SAAO,mBAAmB,GAAG,CAAC;AAChC","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { customAlphabet } from \"nanoid\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport const nanoid = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n); // 7-character random string\n\nexport async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {\n const res = await fetch(input, init);\n\n if (!res.ok) {\n const json = await res.json();\n if (json.error) {\n const error = new Error(json.error) as Error & {\n status: number;\n };\n error.status = res.status;\n throw error;\n } else {\n throw new Error(\"An unexpected error occurred\");\n }\n }\n\n return res.json();\n}\n\nexport function formatDate(input: string | number | Date): string {\n const date = new Date(input);\n return date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport const arraysAreEqual = (arr1: number[], arr2: number[]): boolean =>\n arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);\n\nexport function nullableCompatibleEqualityCheck<T>(\n naiveEqualityCheck: (a: T, b: T) => boolean,\n a: T | null | undefined,\n b: T | null | undefined,\n): boolean {\n if (a === null || a === undefined || b === null || b === undefined) {\n return a === b;\n }\n\n return naiveEqualityCheck(a, b);\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { defaultEditingApiConfig } from './chunk-4OJ3H65F.mjs';
2
+ import { defaultInsertionsApiConfig } from './chunk-RKQ6RTZM.mjs';
3
+ import { defaultSuggestionsApiConfig } from './chunk-KDVMG3XF.mjs';
4
+ import { defaultBaseAutosuggestionsConfig } from './chunk-FP2EKU3L.mjs';
5
+ import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
6
+ import { defaultCopilotContextCategories } from '@copilotkit/react-core';
7
+
8
+ var defaultAutosuggestionsConfig = __spreadProps(__spreadValues({}, defaultBaseAutosuggestionsConfig), {
9
+ contextCategories: defaultCopilotContextCategories,
10
+ chatApiConfigs: {
11
+ suggestionsApiConfig: defaultSuggestionsApiConfig,
12
+ insertionApiConfig: defaultInsertionsApiConfig,
13
+ editingApiConfig: defaultEditingApiConfig
14
+ }
15
+ });
16
+
17
+ export { defaultAutosuggestionsConfig };
18
+ //# sourceMappingURL=out.js.map
19
+ //# sourceMappingURL=chunk-AZHILHKM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/autosuggestions-config/autosuggestions-config.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAIA,SAAS,uCAAuC;AAczC,IAAM,+BAGT,iCACC,mCADD;AAAA,EAEF,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,IACd,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,EACpB;AACF","sourcesContent":["import { BaseAutosuggestionsConfig, defaultBaseAutosuggestionsConfig } from \"../base\";\nimport { SuggestionsApiConfig, defaultSuggestionsApiConfig } from \"./suggestions-api-config\";\nimport { InsertionsApiConfig, defaultInsertionsApiConfig } from \"./insertions-api-config\";\nimport { EditingApiConfig, defaultEditingApiConfig } from \"./editing-api-config\";\nimport { defaultCopilotContextCategories } from \"@copilotkit/react-core\";\n\n// Like the base autosuggestions config, with 2 additional fields:\n// 1. contextCategories: string[] | undefined;\n// 2. instead of apiConfigs, we have chatApiConfigs: a higher-level abstraction that uses a ChatGPT-like API endpoint.\nexport interface AutosuggestionsConfig extends Omit<BaseAutosuggestionsConfig, \"apiConfig\"> {\n contextCategories: string[];\n chatApiConfigs: {\n suggestionsApiConfig: SuggestionsApiConfig;\n insertionApiConfig: InsertionsApiConfig;\n editingApiConfig: EditingApiConfig;\n };\n}\n\nexport const defaultAutosuggestionsConfig: Omit<\n AutosuggestionsConfig,\n \"textareaPurpose\" | \"apiEndpoint\"\n> = {\n ...defaultBaseAutosuggestionsConfig,\n contextCategories: defaultCopilotContextCategories,\n chatApiConfigs: {\n suggestionsApiConfig: defaultSuggestionsApiConfig,\n insertionApiConfig: defaultInsertionsApiConfig,\n editingApiConfig: defaultEditingApiConfig,\n },\n};\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=out.js.map
3
+ //# sourceMappingURL=chunk-DE5K76I2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { withPartialHistory, defaultShouldSave } from './chunk-4NHVQZ67.mjs';
2
+ import { useMemo } from 'react';
3
+ import { createEditor, Element } from 'slate';
4
+ import { withReact } from 'slate-react';
5
+
6
+ var shouldSave = (op, prev) => {
7
+ const excludedNodeType = "suggestion";
8
+ if (op.type === "insert_node" && Element.isElement(op.node) && op.node.type === excludedNodeType) {
9
+ return false;
10
+ }
11
+ if (op.type === "remove_node" && Element.isElement(op.node) && op.node.type === excludedNodeType) {
12
+ return false;
13
+ }
14
+ if (op.type === "set_node" && "type" in op.newProperties && op.newProperties.type === excludedNodeType) {
15
+ return false;
16
+ }
17
+ if (op.type == "set_node" && "type" in op.properties && op.properties.type === excludedNodeType) {
18
+ return false;
19
+ }
20
+ if (op.type === "merge_node" && "type" in op.properties && op.properties.type === excludedNodeType) {
21
+ return false;
22
+ }
23
+ if (op.type === "split_node" && "type" in op.properties && op.properties.type === excludedNodeType) {
24
+ return false;
25
+ }
26
+ return defaultShouldSave(op, prev);
27
+ };
28
+ function useCopilotTextareaEditor() {
29
+ const editor = useMemo(() => {
30
+ const editor2 = withPartialHistory(withReact(createEditor()), shouldSave);
31
+ const { isVoid } = editor2;
32
+ editor2.isVoid = (element) => {
33
+ switch (element.type) {
34
+ case "suggestion":
35
+ return true;
36
+ default:
37
+ return isVoid(element);
38
+ }
39
+ };
40
+ const { markableVoid } = editor2;
41
+ editor2.markableVoid = (element) => {
42
+ switch (element.type) {
43
+ case "suggestion":
44
+ return true;
45
+ default:
46
+ return markableVoid(element);
47
+ }
48
+ };
49
+ const { isInline } = editor2;
50
+ editor2.isInline = (element) => {
51
+ switch (element.type) {
52
+ case "suggestion":
53
+ return element.inline;
54
+ default:
55
+ return isInline(element);
56
+ }
57
+ };
58
+ return editor2;
59
+ }, []);
60
+ return editor;
61
+ }
62
+
63
+ export { useCopilotTextareaEditor };
64
+ //# sourceMappingURL=out.js.map
65
+ //# sourceMappingURL=chunk-DRV2FOHZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx"],"names":["editor"],"mappings":";;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,cAAc,eAAe;AACtC,SAAS,iBAAiB;AAQ1B,IAAM,aAAkC,CAAC,IAAI,SAAS;AACpD,QAAM,mBAAmB;AAEzB,MACE,GAAG,SAAS,iBACZ,QAAQ,UAAU,GAAG,IAAI,KACzB,GAAG,KAAK,SAAS,kBACjB;AACA,WAAO;AAAA,EACT;AAEA,MACE,GAAG,SAAS,iBACZ,QAAQ,UAAU,GAAG,IAAI,KACzB,GAAG,KAAK,SAAS,kBACjB;AACA,WAAO;AAAA,EACT;AAEA,MACE,GAAG,SAAS,cACZ,UAAU,GAAG,iBACb,GAAG,cAAc,SAAS,kBAC1B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,GAAG,QAAQ,cAAc,UAAU,GAAG,cAAc,GAAG,WAAW,SAAS,kBAAkB;AAC/F,WAAO;AAAA,EACT;AAEA,MACE,GAAG,SAAS,gBACZ,UAAU,GAAG,cACb,GAAG,WAAW,SAAS,kBACvB;AACA,WAAO;AAAA,EACT;AAEA,MACE,GAAG,SAAS,gBACZ,UAAU,GAAG,cACb,GAAG,WAAW,SAAS,kBACvB;AACA,WAAO;AAAA,EACT;AAGA,SAAO,kBAAkB,IAAI,IAAI;AACnC;AAEO,SAAS,2BAAyC;AACvD,QAAM,SAAS,QAAQ,MAAM;AAC3B,UAAMA,UAAS,mBAAmB,UAAU,aAAa,CAAC,GAAG,UAAU;AAEvE,UAAM,EAAE,OAAO,IAAIA;AACnB,IAAAA,QAAO,SAAS,CAAC,YAAY;AAC3B,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO,OAAO,OAAO;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,EAAE,aAAa,IAAIA;AACzB,IAAAA,QAAO,eAAe,CAAC,YAAY;AACjC,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO,aAAa,OAAO;AAAA,MAC/B;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,IAAIA;AACrB,IAAAA,QAAO,WAAW,CAAC,YAAY;AAC7B,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,iBAAO,QAAQ;AAAA,QACjB;AACE,iBAAO,SAAS,OAAO;AAAA,MAC3B;AAAA,IACF;AAEA,WAAOA;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO;AACT","sourcesContent":["import { useMemo } from \"react\";\nimport { createEditor, Element } from \"slate\";\nimport { withReact } from \"slate-react\";\nimport {\n defaultShouldSave,\n ShouldSaveToHistory,\n withPartialHistory,\n} from \"../../lib/slatejs-edits/with-partial-history\";\nimport { CustomEditor } from \"../../types/base/custom-editor\";\n\nconst shouldSave: ShouldSaveToHistory = (op, prev) => {\n const excludedNodeType = \"suggestion\";\n // Check if the operation involves the suggestion inline node type\n if (\n op.type === \"insert_node\" &&\n Element.isElement(op.node) &&\n op.node.type === excludedNodeType\n ) {\n return false;\n }\n\n if (\n op.type === \"remove_node\" &&\n Element.isElement(op.node) &&\n op.node.type === excludedNodeType\n ) {\n return false;\n }\n\n if (\n op.type === \"set_node\" &&\n \"type\" in op.newProperties &&\n op.newProperties.type === excludedNodeType\n ) {\n return false;\n }\n\n if (op.type == \"set_node\" && \"type\" in op.properties && op.properties.type === excludedNodeType) {\n return false;\n }\n\n if (\n op.type === \"merge_node\" &&\n \"type\" in op.properties &&\n op.properties.type === excludedNodeType\n ) {\n return false;\n }\n\n if (\n op.type === \"split_node\" &&\n \"type\" in op.properties &&\n op.properties.type === excludedNodeType\n ) {\n return false;\n }\n\n // Otherwise, save the operation to history\n return defaultShouldSave(op, prev);\n};\n\nexport function useCopilotTextareaEditor(): CustomEditor {\n const editor = useMemo(() => {\n const editor = withPartialHistory(withReact(createEditor()), shouldSave);\n\n const { isVoid } = editor;\n editor.isVoid = (element) => {\n switch (element.type) {\n case \"suggestion\":\n return true;\n default:\n return isVoid(element);\n }\n };\n\n const { markableVoid } = editor;\n editor.markableVoid = (element) => {\n switch (element.type) {\n case \"suggestion\":\n return true;\n default:\n return markableVoid(element);\n }\n };\n\n const { isInline } = editor;\n editor.isInline = (element) => {\n switch (element.type) {\n case \"suggestion\":\n return element.inline;\n default:\n return isInline(element);\n }\n };\n\n return editor;\n }, []);\n\n return editor;\n}\n"]}