@copilotkit/react-textarea 0.19.1 → 0.21.0-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 (139) hide show
  1. package/.turbo/turbo-build.log +258 -298
  2. package/CHANGELOG.md +22 -0
  3. package/dist/{chunk-RDHPSSHJ.mjs → chunk-24SYR4JB.mjs} +13 -8
  4. package/dist/chunk-24SYR4JB.mjs.map +1 -0
  5. package/dist/{chunk-L6DZHWEL.mjs → chunk-463BFNUP.mjs} +10 -9
  6. package/dist/chunk-463BFNUP.mjs.map +1 -0
  7. package/dist/{chunk-QNJ6MXJ2.mjs → chunk-5DU2QDHZ.mjs} +3 -3
  8. package/dist/{chunk-QNJ6MXJ2.mjs.map → chunk-5DU2QDHZ.mjs.map} +1 -1
  9. package/dist/chunk-63FSISXT.mjs +48 -0
  10. package/dist/chunk-63FSISXT.mjs.map +1 -0
  11. package/dist/{chunk-HRTFMM7P.mjs → chunk-AXN37AHC.mjs} +6 -8
  12. package/dist/chunk-AXN37AHC.mjs.map +1 -0
  13. package/dist/{chunk-K2AVA67P.mjs → chunk-DYGPLRY3.mjs} +3 -3
  14. package/dist/chunk-DYGPLRY3.mjs.map +1 -0
  15. package/dist/{chunk-BBKDE7YT.mjs → chunk-F2TIBXML.mjs} +3 -3
  16. package/dist/{chunk-FN7GDKKG.mjs → chunk-GCMQHIRF.mjs} +1 -1
  17. package/dist/chunk-GCMQHIRF.mjs.map +1 -0
  18. package/dist/{chunk-7QWJ3OV7.mjs → chunk-KLROO6ID.mjs} +2 -2
  19. package/dist/{chunk-47JRPWI3.mjs → chunk-O7G7E3E3.mjs} +20 -53
  20. package/dist/chunk-O7G7E3E3.mjs.map +1 -0
  21. package/dist/{chunk-KIRROE2K.mjs → chunk-QJDMIGLU.mjs} +4 -3
  22. package/dist/chunk-QJDMIGLU.mjs.map +1 -0
  23. package/dist/{chunk-66BDXIX4.mjs → chunk-RR6OQGTI.mjs} +7 -9
  24. package/dist/chunk-RR6OQGTI.mjs.map +1 -0
  25. package/dist/{chunk-XA7M72ZO.mjs → chunk-WLPYYGES.mjs} +5 -2
  26. package/dist/chunk-WLPYYGES.mjs.map +1 -0
  27. package/dist/{chunk-OXPXFYUG.mjs → chunk-WPIA53HF.mjs} +14 -8
  28. package/dist/chunk-WPIA53HF.mjs.map +1 -0
  29. package/dist/{chunk-3TK2VELX.mjs → chunk-YXA3UPMI.mjs} +2 -2
  30. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +8 -7
  31. package/dist/components/copilot-textarea/copilot-textarea.mjs +15 -14
  32. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +7 -6
  33. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +5 -4
  34. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +6 -5
  35. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +6 -0
  36. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs.map +1 -0
  37. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +6 -5
  38. package/dist/components/index.mjs +15 -14
  39. package/dist/components/source-search-box/source-search-box.mjs +2 -2
  40. package/dist/components/ui/command.mjs +1 -1
  41. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +5 -5
  42. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +5 -5
  43. package/dist/index.css +6 -7
  44. package/dist/index.css.map +1 -1
  45. package/dist/index.mjs +15 -14
  46. package/dist/lib/stream-promise-flatten.mjs +1 -1
  47. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +3 -3
  48. package/dist/types/autosuggestions-config/editing-api-config.mjs +1 -1
  49. package/dist/types/autosuggestions-config/index.mjs +4 -4
  50. package/dist/types/autosuggestions-config/insertions-api-config.mjs +1 -1
  51. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +1 -1
  52. package/dist/types/index.mjs +4 -4
  53. package/package.json +3 -5
  54. package/src/components/copilot-textarea/copilot-textarea.tsx +8 -2
  55. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.tsx +27 -62
  56. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.tsx +1 -1
  57. package/src/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.tsx +54 -0
  58. package/src/components/source-search-box/source-search-box.tsx +9 -8
  59. package/src/components/ui/command.tsx +4 -1
  60. package/src/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.tsx +1 -1
  61. package/src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx +13 -3
  62. package/src/lib/stream-promise-flatten.ts +10 -0
  63. package/src/types/autosuggestions-config/editing-api-config.tsx +5 -7
  64. package/src/types/autosuggestions-config/insertions-api-config.tsx +6 -8
  65. package/src/types/autosuggestions-config/subtypes/chatlike-api-endpoint.tsx +4 -0
  66. package/src/types/base/autosuggestions-bare-function.ts +3 -0
  67. package/dist/chunk-47JRPWI3.mjs.map +0 -1
  68. package/dist/chunk-66BDXIX4.mjs.map +0 -1
  69. package/dist/chunk-FN7GDKKG.mjs.map +0 -1
  70. package/dist/chunk-HRTFMM7P.mjs.map +0 -1
  71. package/dist/chunk-K2AVA67P.mjs.map +0 -1
  72. package/dist/chunk-KIRROE2K.mjs.map +0 -1
  73. package/dist/chunk-L6DZHWEL.mjs.map +0 -1
  74. package/dist/chunk-OXPXFYUG.mjs.map +0 -1
  75. package/dist/chunk-RDHPSSHJ.mjs.map +0 -1
  76. package/dist/chunk-XA7M72ZO.mjs.map +0 -1
  77. package/dist/components/base-copilot-textarea/base-copilot-textarea.d.ts +0 -13
  78. package/dist/components/base-copilot-textarea/render-element.d.ts +0 -6
  79. package/dist/components/base-copilot-textarea/render-placeholder.d.ts +0 -6
  80. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.d.ts +0 -6
  81. package/dist/components/base-copilot-textarea/use-add-branding-css.d.ts +0 -3
  82. package/dist/components/copilot-textarea/copilot-textarea.d.ts +0 -19
  83. package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +0 -13
  84. package/dist/components/hovering-toolbar/hovering-toolbar-components.d.ts +0 -18
  85. package/dist/components/hovering-toolbar/hovering-toolbar.d.ts +0 -9
  86. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.d.ts +0 -26
  87. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.d.ts +0 -13
  88. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.d.ts +0 -3
  89. package/dist/components/index.d.ts +0 -14
  90. package/dist/components/manual-ui/chip-with-icon.d.ts +0 -10
  91. package/dist/components/source-search-box/source-search-box.d.ts +0 -14
  92. package/dist/components/ui/button.d.ts +0 -14
  93. package/dist/components/ui/card.d.ts +0 -10
  94. package/dist/components/ui/command.d.ts +0 -48
  95. package/dist/components/ui/dialog.d.ts +0 -18
  96. package/dist/components/ui/label.d.ts +0 -8
  97. package/dist/components/ui/separator.d.ts +0 -6
  98. package/dist/components/ui/textarea.d.ts +0 -7
  99. package/dist/context/index.d.ts +0 -1
  100. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.d.ts +0 -13
  101. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.d.ts +0 -8
  102. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.d.ts +0 -7
  103. package/dist/hooks/index.d.ts +0 -1
  104. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.d.ts +0 -21
  105. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.d.ts +0 -22
  106. package/dist/hooks/misc/use-autosize-textarea.d.ts +0 -5
  107. package/dist/index.d.ts +0 -16
  108. package/dist/lib/debouncer.d.ts +0 -11
  109. package/dist/lib/editor-to-text.d.ts +0 -7
  110. package/dist/lib/get-text-around-cursor.d.ts +0 -15
  111. package/dist/lib/retry.d.ts +0 -3
  112. package/dist/lib/slatejs-edits/add-autocompletions.d.ts +0 -8
  113. package/dist/lib/slatejs-edits/clear-autocompletions.d.ts +0 -8
  114. package/dist/lib/slatejs-edits/replace-text.d.ts +0 -5
  115. package/dist/lib/slatejs-edits/with-partial-history.d.ts +0 -10
  116. package/dist/lib/stream-promise-flatten.d.ts +0 -3
  117. package/dist/lib/utils.d.ts +0 -10
  118. package/dist/lib/utils.test.d.ts +0 -1
  119. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.d.ts +0 -22
  120. package/dist/types/autosuggestions-config/autosuggestions-config.d.ts +0 -19
  121. package/dist/types/autosuggestions-config/editing-api-config.d.ts +0 -15
  122. package/dist/types/autosuggestions-config/index.d.ts +0 -11
  123. package/dist/types/autosuggestions-config/insertions-api-config.d.ts +0 -15
  124. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.d.ts +0 -27
  125. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.d.ts +0 -3
  126. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.d.ts +0 -7
  127. package/dist/types/autosuggestions-config/suggestions-api-config.d.ts +0 -15
  128. package/dist/types/base/autosuggestion-state.d.ts +0 -8
  129. package/dist/types/base/autosuggestions-bare-function.d.ts +0 -17
  130. package/dist/types/base/base-autosuggestions-config.d.ts +0 -15
  131. package/dist/types/base/base-copilot-textarea-props.d.ts +0 -40
  132. package/dist/types/base/custom-editor.d.ts +0 -29
  133. package/dist/types/base/editor-autocomplete-state.d.ts +0 -10
  134. package/dist/types/base/index.d.ts +0 -4
  135. package/dist/types/html-copilot-textarea-element.d.ts +0 -7
  136. package/dist/types/index.d.ts +0 -14
  137. /package/dist/{chunk-BBKDE7YT.mjs.map → chunk-F2TIBXML.mjs.map} +0 -0
  138. /package/dist/{chunk-7QWJ3OV7.mjs.map → chunk-KLROO6ID.mjs.map} +0 -0
  139. /package/dist/{chunk-3TK2VELX.mjs.map → chunk-YXA3UPMI.mjs.map} +0 -0
package/dist/index.mjs CHANGED
@@ -1,16 +1,16 @@
1
1
  import './chunk-MMVDU6DF.mjs';
2
- export { CopilotTextarea } from './chunk-RDHPSSHJ.mjs';
3
- import './chunk-K2AVA67P.mjs';
4
- import './chunk-OXPXFYUG.mjs';
2
+ export { CopilotTextarea } from './chunk-24SYR4JB.mjs';
3
+ import './chunk-DYGPLRY3.mjs';
4
+ import './chunk-WPIA53HF.mjs';
5
5
  import './chunk-DE5K76I2.mjs';
6
6
  import './chunk-5FO6ISW4.mjs';
7
- export { ChatlikeApiEndpoint } from './chunk-KIRROE2K.mjs';
8
- export { defaultAutosuggestionsConfig } from './chunk-BBKDE7YT.mjs';
9
- import './chunk-HRTFMM7P.mjs';
10
- import './chunk-66BDXIX4.mjs';
7
+ export { ChatlikeApiEndpoint } from './chunk-QJDMIGLU.mjs';
8
+ export { defaultAutosuggestionsConfig } from './chunk-F2TIBXML.mjs';
9
+ import './chunk-AXN37AHC.mjs';
10
+ import './chunk-RR6OQGTI.mjs';
11
11
  import './chunk-JHTAOLEW.mjs';
12
12
  import './chunk-WADHCMPK.mjs';
13
- export { BaseCopilotTextarea } from './chunk-3TK2VELX.mjs';
13
+ export { BaseCopilotTextarea } from './chunk-YXA3UPMI.mjs';
14
14
  import './chunk-CSGFJU3L.mjs';
15
15
  import './chunk-KCHYD3EB.mjs';
16
16
  import './chunk-YQU7WG7T.mjs';
@@ -21,19 +21,20 @@ import './chunk-UHD44NC5.mjs';
21
21
  import './chunk-JAFCXEPU.mjs';
22
22
  import './chunk-OD7ZMOVE.mjs';
23
23
  import './chunk-MPME5BW2.mjs';
24
- import './chunk-7QWJ3OV7.mjs';
24
+ import './chunk-KLROO6ID.mjs';
25
25
  import './chunk-L7VVZH4Q.mjs';
26
- import './chunk-QNJ6MXJ2.mjs';
27
- import './chunk-47JRPWI3.mjs';
26
+ import './chunk-5DU2QDHZ.mjs';
27
+ import './chunk-O7G7E3E3.mjs';
28
+ import './chunk-63FSISXT.mjs';
28
29
  import './chunk-ND5PXTAW.mjs';
29
30
  import './chunk-2NURR2DX.mjs';
30
31
  import './chunk-5EJ5XOGP.mjs';
31
32
  import './chunk-YW3REYX6.mjs';
32
33
  import './chunk-XHUMROEY.mjs';
33
- import './chunk-L6DZHWEL.mjs';
34
- import './chunk-XA7M72ZO.mjs';
34
+ import './chunk-463BFNUP.mjs';
35
+ import './chunk-WLPYYGES.mjs';
35
36
  import './chunk-O5OWT5GE.mjs';
36
- import './chunk-FN7GDKKG.mjs';
37
+ import './chunk-GCMQHIRF.mjs';
37
38
  import './chunk-KGKLUWKW.mjs';
38
39
  import './chunk-WJHSY5T6.mjs';
39
40
  export { defaultBaseAutosuggestionsConfig } from './chunk-S6JUGJK2.mjs';
@@ -1,4 +1,4 @@
1
- export { streamPromiseFlatten } from '../chunk-FN7GDKKG.mjs';
1
+ export { streamPromiseFlatten } from '../chunk-GCMQHIRF.mjs';
2
2
  import '../chunk-MRXNTQOX.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=stream-promise-flatten.mjs.map
@@ -1,6 +1,6 @@
1
- export { defaultAutosuggestionsConfig } from '../../chunk-BBKDE7YT.mjs';
2
- import '../../chunk-HRTFMM7P.mjs';
3
- import '../../chunk-66BDXIX4.mjs';
1
+ export { defaultAutosuggestionsConfig } from '../../chunk-F2TIBXML.mjs';
2
+ import '../../chunk-AXN37AHC.mjs';
3
+ import '../../chunk-RR6OQGTI.mjs';
4
4
  import '../../chunk-JHTAOLEW.mjs';
5
5
  import '../../chunk-WJHSY5T6.mjs';
6
6
  import '../../chunk-S6JUGJK2.mjs';
@@ -1,4 +1,4 @@
1
- export { defaultEditingApiConfig, defaultEditingFewShotMessages, defaultEditingMakeSystemPrompt } from '../../chunk-HRTFMM7P.mjs';
1
+ export { defaultEditingApiConfig, defaultEditingFewShotMessages, defaultEditingMakeSystemPrompt } from '../../chunk-AXN37AHC.mjs';
2
2
  import '../../chunk-MRXNTQOX.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=editing-api-config.mjs.map
@@ -1,8 +1,8 @@
1
1
  import '../../chunk-5FO6ISW4.mjs';
2
- export { ChatlikeApiEndpoint } from '../../chunk-KIRROE2K.mjs';
3
- export { defaultAutosuggestionsConfig } from '../../chunk-BBKDE7YT.mjs';
4
- import '../../chunk-HRTFMM7P.mjs';
5
- import '../../chunk-66BDXIX4.mjs';
2
+ export { ChatlikeApiEndpoint } from '../../chunk-QJDMIGLU.mjs';
3
+ export { defaultAutosuggestionsConfig } from '../../chunk-F2TIBXML.mjs';
4
+ import '../../chunk-AXN37AHC.mjs';
5
+ import '../../chunk-RR6OQGTI.mjs';
6
6
  import '../../chunk-JHTAOLEW.mjs';
7
7
  import '../../chunk-WJHSY5T6.mjs';
8
8
  import '../../chunk-S6JUGJK2.mjs';
@@ -1,4 +1,4 @@
1
- export { defaultInsertionsApiConfig, defaultInsertionsFewShotMessages, defaultInsertionsMakeSystemPrompt } from '../../chunk-66BDXIX4.mjs';
1
+ export { defaultInsertionsApiConfig, defaultInsertionsFewShotMessages, defaultInsertionsMakeSystemPrompt } from '../../chunk-RR6OQGTI.mjs';
2
2
  import '../../chunk-MRXNTQOX.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=insertions-api-config.mjs.map
@@ -1,4 +1,4 @@
1
- export { ChatlikeApiEndpoint } from '../../../chunk-KIRROE2K.mjs';
1
+ export { ChatlikeApiEndpoint } from '../../../chunk-QJDMIGLU.mjs';
2
2
  import '../../../chunk-MRXNTQOX.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=chatlike-api-endpoint.mjs.map
@@ -1,9 +1,9 @@
1
1
  import '../chunk-DE5K76I2.mjs';
2
2
  import '../chunk-5FO6ISW4.mjs';
3
- export { ChatlikeApiEndpoint } from '../chunk-KIRROE2K.mjs';
4
- export { defaultAutosuggestionsConfig } from '../chunk-BBKDE7YT.mjs';
5
- import '../chunk-HRTFMM7P.mjs';
6
- import '../chunk-66BDXIX4.mjs';
3
+ export { ChatlikeApiEndpoint } from '../chunk-QJDMIGLU.mjs';
4
+ export { defaultAutosuggestionsConfig } from '../chunk-F2TIBXML.mjs';
5
+ import '../chunk-AXN37AHC.mjs';
6
+ import '../chunk-RR6OQGTI.mjs';
7
7
  import '../chunk-JHTAOLEW.mjs';
8
8
  import '../chunk-WADHCMPK.mjs';
9
9
  import '../chunk-WJHSY5T6.mjs';
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.19.1",
7
+ "version": "0.21.0-alpha.0",
8
8
  "sideEffects": [
9
9
  "**/*.css"
10
10
  ],
@@ -33,8 +33,8 @@
33
33
  "ts-jest": "^29.1.1",
34
34
  "tsup": "^6.1.3",
35
35
  "typescript": "^4.9.4",
36
- "eslint-config-custom": "0.2.0",
37
36
  "tailwind-config": "0.1.0",
37
+ "eslint-config-custom": "0.2.0",
38
38
  "tsconfig": "0.4.0"
39
39
  },
40
40
  "dependencies": {
@@ -54,14 +54,12 @@
54
54
  "lucide-react": "^0.274.0",
55
55
  "material-icons": "^1.13.10",
56
56
  "nanoid": "^4.0.2",
57
- "next": "^13.4.1",
58
- "next-themes": "^0.2.1",
59
57
  "react-dom": "^18.2.0",
60
58
  "slate": "^0.94.1",
61
59
  "slate-history": "^0.93.0",
62
60
  "slate-react": "^0.98.1",
63
61
  "tailwind-merge": "^1.13.2",
64
- "@copilotkit/react-core": "0.9.0"
62
+ "@copilotkit/react-core": "0.11.0-alpha.0"
65
63
  },
66
64
  "scripts": {
67
65
  "build": "tsup --treeshake",
@@ -24,9 +24,15 @@ export const CopilotTextarea = React.forwardRef(
24
24
  props: CopilotTextareaProps,
25
25
  ref: React.Ref<HTMLCopilotTextAreaElement>
26
26
  ): JSX.Element => {
27
+ // separate the AutosuggestionsConfigUserSpecified from the rest of the props
28
+ const {
29
+ autosuggestionsConfig: autosuggestionsConfigUserSpecified,
30
+ ...forwardedProps
31
+ } = props;
32
+
27
33
  const autosuggestionsConfig: AutosuggestionsConfig = merge(
28
34
  defaultAutosuggestionsConfig,
29
- props.autosuggestionsConfig
35
+ autosuggestionsConfigUserSpecified
30
36
  );
31
37
 
32
38
  const autosuggestionsFunction = useMakeStandardAutosuggestionFunction(
@@ -47,7 +53,7 @@ export const CopilotTextarea = React.forwardRef(
47
53
  <>
48
54
  <BaseCopilotTextarea
49
55
  ref={ref}
50
- {...props}
56
+ {...forwardedProps}
51
57
  baseAutosuggestionsConfig={{
52
58
  ...autosuggestionsConfig,
53
59
  apiConfig: {
@@ -8,12 +8,17 @@ import { SourceSearchBox } from "../../source-search-box/source-search-box";
8
8
  import { DocumentPointer } from "@copilotkit/react-core";
9
9
  import { Button } from "../../ui/button";
10
10
  import { Label } from "../../ui/label";
11
- import React, { useContext, useEffect, useRef, useState } from "react";
11
+ import React, {
12
+ useCallback,
13
+ useContext,
14
+ useEffect,
15
+ useRef,
16
+ useState,
17
+ } from "react";
12
18
 
13
- import Chip from "@mui/material/Chip";
14
- import Avatar from "@mui/material/Avatar";
15
19
  import { streamPromiseFlatten } from "../../../lib/stream-promise-flatten";
16
20
  import { CopilotContext } from "@copilotkit/react-core";
21
+ import { IncludedFilesPreview } from "./included-files-preview";
17
22
 
18
23
  export type SuggestionState = {
19
24
  editorState: EditingEditorState;
@@ -80,7 +85,6 @@ export const HoveringInsertionPromptBoxCore: React.FC<
80
85
 
81
86
  // read the generating suggestion stream and continuously update the edit suggestion
82
87
  const reader = generatingSuggestion.getReader();
83
-
84
88
  const read = async () => {
85
89
  setSuggestionIsLoading(true);
86
90
  while (true) {
@@ -105,6 +109,7 @@ export const HoveringInsertionPromptBoxCore: React.FC<
105
109
  read();
106
110
 
107
111
  return () => {
112
+ // release the lock if the reader is not closed on unmount
108
113
  const releaseLockIfNotClosed = async () => {
109
114
  try {
110
115
  await reader.closed;
@@ -117,22 +122,25 @@ export const HoveringInsertionPromptBoxCore: React.FC<
117
122
  };
118
123
  }, [generatingSuggestion]);
119
124
 
120
- // when the adjustment prompt changes, reset the edit suggestion
121
- const begingGeneratingAdjustment = async () => {
125
+ // generate an adjustment to the completed text, based on the adjustment prompt
126
+ const beginGeneratingAdjustment = useCallback(async () => {
122
127
  // don't generate text if the prompt is empty
123
128
  if (!adjustmentPrompt.trim()) {
124
129
  return;
125
130
  }
126
131
 
127
- // if the current edit suggestion is not empty, then use it as the selected text instead of the editor state's selected text
128
- let editorState = state.editorState;
132
+ // editor state includes the text being edited, and the text before/after the selection
133
+ // if the current edit suggestion is not empty, then use *it* as the "selected text" - instead of the editor state's selected text
134
+ let modificationState = state.editorState;
129
135
  if (editSuggestion !== "") {
130
- editorState.selectedText = editSuggestion;
136
+ modificationState.selectedText = editSuggestion;
131
137
  }
132
138
 
139
+ // generate the adjustment suggestion
133
140
  const adjustmentSuggestionTextStreamPromise = insertionOrEditingFunction(
134
- editorState,
141
+ modificationState,
135
142
  adjustmentPrompt,
143
+ filePointers,
136
144
  new AbortController().signal
137
145
  );
138
146
  const adjustmentSuggestionTextStream = streamPromiseFlatten(
@@ -140,7 +148,13 @@ export const HoveringInsertionPromptBoxCore: React.FC<
140
148
  );
141
149
 
142
150
  setGeneratingSuggestion(adjustmentSuggestionTextStream);
143
- };
151
+ }, [
152
+ adjustmentPrompt,
153
+ editSuggestion,
154
+ state.editorState,
155
+ insertionOrEditingFunction,
156
+ filePointers,
157
+ ]);
144
158
 
145
159
  const isLoading = suggestionIsLoading;
146
160
 
@@ -169,7 +183,7 @@ export const HoveringInsertionPromptBoxCore: React.FC<
169
183
  setAdjustmentPrompt(adjustmentPrompt + "\n");
170
184
  } else if (e.key === "Enter") {
171
185
  e.preventDefault();
172
- begingGeneratingAdjustment();
186
+ beginGeneratingAdjustment();
173
187
  }
174
188
  }}
175
189
  placeholder={placeholder}
@@ -178,7 +192,7 @@ export const HoveringInsertionPromptBoxCore: React.FC<
178
192
  rows={1}
179
193
  />
180
194
  <button
181
- onClick={begingGeneratingAdjustment}
195
+ onClick={beginGeneratingAdjustment}
182
196
  className="absolute right-2 bg-blue-500 text-white w-8 h-8 rounded-full flex items-center justify-center"
183
197
  >
184
198
  <i className="material-icons">arrow_forward</i>
@@ -266,52 +280,3 @@ export const HoveringInsertionPromptBoxCore: React.FC<
266
280
  </div>
267
281
  );
268
282
  };
269
-
270
- interface IncludedFilesPreviewProps {
271
- includedFiles: DocumentPointer[];
272
- setIncludedFiles: React.Dispatch<React.SetStateAction<DocumentPointer[]>>;
273
- }
274
-
275
- export const IncludedFilesPreview: React.FC<IncludedFilesPreviewProps> = ({
276
- includedFiles,
277
- setIncludedFiles,
278
- }) => {
279
- return (
280
- <div className="flex flex-col gap-2 mt-2">
281
- <Label className="">Included context:</Label>
282
- <div className="flex flex-wrap gap-2">
283
- {includedFiles.map((filePointer, index) => {
284
- return (
285
- <FileChipPreview
286
- key={`file-${filePointer.sourceApplication}.${filePointer.name}`}
287
- filePointer={filePointer}
288
- onDelete={() => {
289
- setIncludedFiles((prev) =>
290
- prev.filter((fp) => fp !== filePointer)
291
- );
292
- }}
293
- />
294
- );
295
- })}
296
- </div>
297
- </div>
298
- );
299
- };
300
-
301
- export interface FileChipPreviewProp {
302
- filePointer: DocumentPointer;
303
- onDelete: () => void;
304
- }
305
-
306
- export const FileChipPreview: React.FC<FileChipPreviewProp> = ({
307
- filePointer,
308
- onDelete,
309
- }) => {
310
- return (
311
- <Chip
312
- label={filePointer.name}
313
- onDelete={onDelete}
314
- avatar={<Avatar sx={{ backgroundColor: "transparent" }}></Avatar>}
315
- />
316
- );
317
- };
@@ -23,8 +23,8 @@ export const HoveringInsertionPromptBox: React.FC<Props> = (props) => {
23
23
  state={{
24
24
  editorState: props.editorState,
25
25
  }}
26
- performInsertion={props.performInsertion}
27
26
  insertionOrEditingFunction={props.apiConfig.insertionOrEditingFunction}
27
+ performInsertion={props.performInsertion}
28
28
  contextCategories={props.contextCategories}
29
29
  />
30
30
  </div>
@@ -0,0 +1,54 @@
1
+ import { DocumentPointer } from "@copilotkit/react-core";
2
+ import { Label } from "../../ui/label";
3
+ import React from "react";
4
+ import Chip from "@mui/material/Chip";
5
+ import Avatar from "@mui/material/Avatar";
6
+
7
+ export interface IncludedFilesPreviewProps {
8
+ includedFiles: DocumentPointer[];
9
+ setIncludedFiles: React.Dispatch<React.SetStateAction<DocumentPointer[]>>;
10
+ }
11
+
12
+ export const IncludedFilesPreview: React.FC<IncludedFilesPreviewProps> = ({
13
+ includedFiles,
14
+ setIncludedFiles,
15
+ }) => {
16
+ return (
17
+ <div className="flex flex-col gap-2 mt-2">
18
+ <Label className="">Included context:</Label>
19
+ <div className="flex flex-wrap gap-2">
20
+ {includedFiles.map((filePointer, index) => {
21
+ return (
22
+ <FileChipPreview
23
+ key={`file-${filePointer.sourceApplication}.${filePointer.name}`}
24
+ filePointer={filePointer}
25
+ onDelete={() => {
26
+ setIncludedFiles((prev) =>
27
+ prev.filter((fp) => fp !== filePointer)
28
+ );
29
+ }}
30
+ />
31
+ );
32
+ })}
33
+ </div>
34
+ </div>
35
+ );
36
+ };
37
+
38
+ export interface FileChipPreviewProp {
39
+ filePointer: DocumentPointer;
40
+ onDelete: () => void;
41
+ }
42
+
43
+ export const FileChipPreview: React.FC<FileChipPreviewProp> = ({
44
+ filePointer,
45
+ onDelete,
46
+ }) => {
47
+ return (
48
+ <Chip
49
+ label={filePointer.name}
50
+ onDelete={onDelete}
51
+ avatar={<Avatar sx={{ backgroundColor: "transparent" }}></Avatar>}
52
+ />
53
+ );
54
+ };
@@ -67,13 +67,12 @@ export function SourceSearchBox(props: SourceSearchBoxProps) {
67
67
  props.onSelectedFile(filePointer);
68
68
  }}
69
69
  >
70
- <div className="flex flex-row gap-3 items-center">
71
- <Logo size="30px">
70
+ <div className=" px-3 flex flex-row gap-1 items-center">
71
+ <Logo width="20px" height="20px">
72
72
  <img
73
73
  src={filePointer.iconImageUri}
74
74
  alt={filePointer.sourceApplication}
75
- width={30}
76
- height={30}
75
+ className="w-full h-full"
77
76
  />
78
77
  </Logo>
79
78
  {filePointer.name}
@@ -110,15 +109,17 @@ export function SourceSearchBox(props: SourceSearchBoxProps) {
110
109
 
111
110
  export function Logo({
112
111
  children,
113
- size = "30px",
112
+ width,
113
+ height,
114
114
  }: {
115
115
  children: React.ReactNode;
116
- size?: string;
116
+ width: string;
117
+ height: string;
117
118
  }) {
118
119
  return (
119
120
  <div
120
- className="flex items-center justify-center bg-black"
121
- style={{ width: size, height: size }}
121
+ className="flex items-center justify-center"
122
+ style={{ width: width, height: height }}
122
123
  >
123
124
  {children}
124
125
  </div>
@@ -62,7 +62,10 @@ const CommandList = React.forwardRef<
62
62
  >(({ className, ...props }, ref) => (
63
63
  <CommandPrimitive.List
64
64
  ref={ref}
65
- className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)}
65
+ className={cn(
66
+ "max-h-[300px] overflow-y-auto overflow-x-hidden pb-2",
67
+ className
68
+ )}
66
69
  {...props}
67
70
  />
68
71
  ));
@@ -36,7 +36,7 @@ export function useMakeStandardAutosuggestionFunction(
36
36
  role: "system",
37
37
  content: apiConfig.makeSystemPrompt(
38
38
  textareaPurpose,
39
- getContextString(contextCategories)
39
+ getContextString([], contextCategories)
40
40
  ),
41
41
  },
42
42
  ...apiConfig.fewShotMessages,
@@ -10,6 +10,7 @@ import {
10
10
  } from "../../types/base/autosuggestions-bare-function";
11
11
  import { InsertionsApiConfig } from "../../types/autosuggestions-config/insertions-api-config";
12
12
  import { EditingApiConfig } from "../../types/autosuggestions-config/editing-api-config";
13
+ import { DocumentPointer } from "@copilotkit/react-core";
13
14
 
14
15
  /**
15
16
  * Returns a memoized function that sends a request to the specified API endpoint to get an autosuggestion for the user's input.
@@ -36,6 +37,7 @@ export function useMakeStandardInsertionOrEditingFunction(
36
37
  async (
37
38
  editorState: EditingEditorState,
38
39
  insertionPrompt: string,
40
+ documents: DocumentPointer[],
39
41
  abortSignal: AbortSignal
40
42
  ) => {
41
43
  const res = await retry(async () => {
@@ -44,7 +46,7 @@ export function useMakeStandardInsertionOrEditingFunction(
44
46
  role: "system",
45
47
  content: insertionApiConfig.makeSystemPrompt(
46
48
  textareaPurpose,
47
- getContextString(contextCategories)
49
+ getContextString(documents, contextCategories)
48
50
  ),
49
51
  },
50
52
  ...insertionApiConfig.fewShotMessages,
@@ -83,6 +85,7 @@ export function useMakeStandardInsertionOrEditingFunction(
83
85
  async (
84
86
  editorState: EditingEditorState,
85
87
  editingPrompt: string,
88
+ documents: DocumentPointer[],
86
89
  abortSignal: AbortSignal
87
90
  ) => {
88
91
  const res = await retry(async () => {
@@ -91,7 +94,7 @@ export function useMakeStandardInsertionOrEditingFunction(
91
94
  role: "system",
92
95
  content: editingApiConfig.makeSystemPrompt(
93
96
  textareaPurpose,
94
- getContextString(contextCategories)
97
+ getContextString(documents, contextCategories)
95
98
  ),
96
99
  },
97
100
  ...editingApiConfig.fewShotMessages,
@@ -135,16 +138,23 @@ export function useMakeStandardInsertionOrEditingFunction(
135
138
  async (
136
139
  editorState: EditingEditorState,
137
140
  insertionPrompt: string,
141
+ documents: DocumentPointer[],
138
142
  abortSignal: AbortSignal
139
143
  ) => {
140
144
  if (editorState.selectedText === "") {
141
145
  return await insertionFunction(
142
146
  editorState,
143
147
  insertionPrompt,
148
+ documents,
144
149
  abortSignal
145
150
  );
146
151
  } else {
147
- return await editingFunction(editorState, insertionPrompt, abortSignal);
152
+ return await editingFunction(
153
+ editorState,
154
+ insertionPrompt,
155
+ documents,
156
+ abortSignal
157
+ );
148
158
  }
149
159
  },
150
160
  [insertionFunction, editingFunction]
@@ -1,3 +1,13 @@
1
+ /**
2
+ * Flatten a promise of a stream, into a stream.
3
+ *
4
+ * Useful because a stream already includes the notion of async value delivery,
5
+ * so it often makes sense to simply await the values rather than the generator of the values.
6
+ *
7
+ * @param {Promise<ReadableStream<A>>} promise - The promise to flatten.
8
+ * @returns {ReadableStream<A>} - The flattened stream.
9
+ */
10
+
1
11
  export function streamPromiseFlatten<A>(
2
12
  promise: Promise<ReadableStream<A>>
3
13
  ): ReadableStream<A> {
@@ -16,6 +16,11 @@ export const defaultEditingMakeSystemPrompt: MakeSystemPrompt = (
16
16
  The user is writing some text.
17
17
  The purpose is: \"${textareaPurpose}\"
18
18
 
19
+ The following external context is also provided. Use it to help you make better suggestions!!!
20
+ \`\`\`
21
+ ${contextString}
22
+ \`\`\`
23
+
19
24
  The user also provides you with a prompt for EDITING some text they are writing.
20
25
  Your job is to come up with an EDIT of the text that the user would like to use - AS BEST YOU CAN.
21
26
 
@@ -28,13 +33,6 @@ The user will provide the following information; use this to infer the best rele
28
33
  <EditingPrompt>
29
34
 
30
35
  <YourEditSuggestion>
31
-
32
- If we need to add a whitespace character to the suggested edit text, make sure to explicitly add it in.
33
-
34
- The following external context is also provided. Use it to help you make better suggestions!!!
35
- \`\`\`
36
- ${contextString}
37
- \`\`\`
38
36
  `;
39
37
  };
40
38
 
@@ -16,9 +16,14 @@ export const defaultInsertionsMakeSystemPrompt: MakeSystemPrompt = (
16
16
  The user is writing some text.
17
17
  The purpose is: \"${textareaPurpose}\"
18
18
 
19
+ The following external context is also provided. Use it to help you make better suggestions!!!
20
+ \`\`\`
21
+ ${contextString}
22
+ \`\`\`
23
+
19
24
  The user also provides you with a prompt for INSERTIONS into the text they are writing.
20
25
  Your job is to come up with an INSERTION into the text that the user would like AS BEST YOU CAN.
21
- Only guess a SHORT distance ahead. Usually 1 sentence, or at most 1 paragraph.
26
+ Only insert a SHORT segment. Usually 1 sentence, or at most 1 paragraph.
22
27
 
23
28
  Adjust yourself to the user's style and implied intent.
24
29
 
@@ -27,13 +32,6 @@ The user will provide the text before and after the cursor, as well as the inser
27
32
  <TextBeforeCursor>
28
33
  <InsertionPrompt>
29
34
  <YourSuggestion>
30
-
31
- If we need to add a whitespace character to the suggested text, make sure to explicitly add it in.
32
-
33
- The following external context is also provided. Use it to help you make better suggestions!!!
34
- \`\`\`
35
- ${contextString}
36
- \`\`\`
37
35
  `;
38
36
  };
39
37
 
@@ -41,8 +41,12 @@ export class ChatlikeApiEndpoint {
41
41
  copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint,
42
42
  {
43
43
  method: "POST",
44
+ headers: {
45
+ ...copilotApiConfig.headers,
46
+ },
44
47
  body: JSON.stringify({
45
48
  ...forwardedProps,
49
+ ...copilotApiConfig.body,
46
50
  messages: messages,
47
51
  }),
48
52
  signal: abortSignal,
@@ -1,3 +1,5 @@
1
+ import { DocumentPointer } from "@copilotkit/react-core";
2
+
1
3
  export interface InsertionEditorState {
2
4
  textBeforeCursor: string;
3
5
  textAfterCursor: string;
@@ -15,6 +17,7 @@ export type AutosuggestionsBareFunction = (
15
17
  export type Generator_InsertionOrEditingSuggestion = (
16
18
  editorState: EditingEditorState,
17
19
  prompt: string,
20
+ documents: DocumentPointer[],
18
21
  abortSignal: AbortSignal
19
22
  ) => Promise<ReadableStream<string>>;
20
23