@platejs/ai 50.1.2 → 50.2.1

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.
@@ -42,17 +42,13 @@ interface EditorPromptParams {
42
42
  isBlockSelecting: boolean;
43
43
  isSelecting: boolean;
44
44
  }
45
- type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
46
45
  interface PromptConfig {
47
46
  default: string;
48
47
  blockSelecting?: string;
49
48
  selecting?: string;
50
49
  }
51
- declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
52
- prompt?: string;
53
- }) => string;
54
50
  declare const getEditorPrompt: (editor: SlateEditor, { prompt, }: {
55
51
  prompt?: EditorPrompt;
56
52
  }) => string;
57
53
 
58
- export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type MarkdownType as M, type PromptConfig as P, BaseAIPlugin as a, type AIMode as b, removeAINodes as c, type EditorPromptParams as d, replacePlaceholders as e, getEditorPrompt as g, insertAINodes as i, removeAIMarks as r };
54
+ export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type PromptConfig as P, BaseAIPlugin as a, type AIMode as b, removeAINodes as c, type EditorPromptParams as d, getEditorPrompt as g, insertAINodes as i, removeAIMarks as r };
@@ -42,17 +42,13 @@ interface EditorPromptParams {
42
42
  isBlockSelecting: boolean;
43
43
  isSelecting: boolean;
44
44
  }
45
- type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
46
45
  interface PromptConfig {
47
46
  default: string;
48
47
  blockSelecting?: string;
49
48
  selecting?: string;
50
49
  }
51
- declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
52
- prompt?: string;
53
- }) => string;
54
50
  declare const getEditorPrompt: (editor: SlateEditor, { prompt, }: {
55
51
  prompt?: EditorPrompt;
56
52
  }) => string;
57
53
 
58
- export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type MarkdownType as M, type PromptConfig as P, BaseAIPlugin as a, type AIMode as b, removeAINodes as c, type EditorPromptParams as d, replacePlaceholders as e, getEditorPrompt as g, insertAINodes as i, removeAIMarks as r };
54
+ export { type AIToolName as A, type BaseAIPluginConfig as B, type EditorPrompt as E, type PromptConfig as P, BaseAIPlugin as a, type AIMode as b, removeAINodes as c, type EditorPromptParams as d, getEditorPrompt as g, insertAINodes as i, removeAIMarks as r };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,4 @@
1
- import { M as MarkdownType } from './getEditorPrompt-FgyoD13L.mjs';
2
- export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes, e as replacePlaceholders } from './getEditorPrompt-FgyoD13L.mjs';
1
+ export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes } from './getEditorPrompt-C7EEuMw8.mjs';
3
2
  import { SlateEditor, History } from 'platejs';
4
3
 
5
4
  declare const undoAI: (editor: SlateEditor) => void;
@@ -11,8 +10,13 @@ declare const withAIBatch: (editor: SlateEditor, fn: () => void, { split, }?: {
11
10
  split?: boolean;
12
11
  }) => void;
13
12
 
13
+ type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
14
+ declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
15
+ prompt?: string;
16
+ }) => string;
17
+
14
18
  declare const getMarkdown: (editor: SlateEditor, { type, }: {
15
19
  type: MarkdownType;
16
20
  }) => string;
17
21
 
18
- export { type AIBatch, MarkdownType, getMarkdown, undoAI, withAIBatch };
22
+ export { type AIBatch, type MarkdownType, getMarkdown, replacePlaceholders, undoAI, withAIBatch };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import { M as MarkdownType } from './getEditorPrompt-FgyoD13L.js';
2
- export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes, e as replacePlaceholders } from './getEditorPrompt-FgyoD13L.js';
1
+ export { b as AIMode, A as AIToolName, a as BaseAIPlugin, B as BaseAIPluginConfig, E as EditorPrompt, d as EditorPromptParams, P as PromptConfig, g as getEditorPrompt, i as insertAINodes, r as removeAIMarks, c as removeAINodes } from './getEditorPrompt-C7EEuMw8.js';
3
2
  import { SlateEditor, History } from 'platejs';
4
3
 
5
4
  declare const undoAI: (editor: SlateEditor) => void;
@@ -11,8 +10,13 @@ declare const withAIBatch: (editor: SlateEditor, fn: () => void, { split, }?: {
11
10
  split?: boolean;
12
11
  }) => void;
13
12
 
13
+ type MarkdownType = 'block' | 'blockSelection' | 'blockSelectionWithBlockId' | 'blockWithBlockId' | 'editor' | 'editorWithBlockId';
14
+ declare const replacePlaceholders: (editor: SlateEditor, text: string, { prompt, }?: {
15
+ prompt?: string;
16
+ }) => string;
17
+
14
18
  declare const getMarkdown: (editor: SlateEditor, { type, }: {
15
19
  type: MarkdownType;
16
20
  }) => string;
17
21
 
18
- export { type AIBatch, MarkdownType, getMarkdown, undoAI, withAIBatch };
22
+ export { type AIBatch, type MarkdownType, getMarkdown, replacePlaceholders, undoAI, withAIBatch };
package/dist/index.js CHANGED
@@ -73,11 +73,16 @@ var removeAINodes = (editor, { at = [] } = {}) => {
73
73
  };
74
74
 
75
75
  // src/lib/transforms/undoAI.ts
76
+ var import_suggestion = require("@platejs/suggestion");
76
77
  var undoAI = (editor) => {
77
- if (editor.history.undos.at(-1)?.ai && editor.api.some({
78
+ const hasAINodeOrAISuggestion = editor.api.some({
78
79
  at: [],
79
80
  match: (n) => !!n.ai
80
- })) {
81
+ }) || editor.api.some({
82
+ at: [],
83
+ match: (n) => !!n[(0, import_suggestion.getTransientSuggestionKey)()]
84
+ });
85
+ if (editor.history.undos.at(-1)?.ai && hasAINodeOrAISuggestion) {
81
86
  editor.undo();
82
87
  editor.history.redos.pop();
83
88
  }
@@ -111,11 +116,42 @@ var BaseAIPlugin = (0, import_platejs3.createTSlatePlugin)({
111
116
 
112
117
  // src/lib/utils/getEditorPrompt.ts
113
118
  var import_selection = require("@platejs/selection");
114
- var import_platejs5 = require("platejs");
119
+ var import_platejs4 = require("platejs");
120
+ var createPromptFromConfig = (config, params) => {
121
+ const { isBlockSelecting, isSelecting: isSelecting2 } = params;
122
+ if (isBlockSelecting && config.blockSelecting) {
123
+ return config.blockSelecting ?? config.default;
124
+ } else if (isSelecting2 && config.selecting) {
125
+ return config.selecting ?? config.default;
126
+ } else {
127
+ return config.default;
128
+ }
129
+ };
130
+ var getEditorPrompt = (editor, {
131
+ prompt = ""
132
+ }) => {
133
+ const params = {
134
+ editor,
135
+ isBlockSelecting: editor.getOption(
136
+ { key: import_platejs4.KEYS.blockSelection },
137
+ "isSelectingSome"
138
+ ),
139
+ isSelecting: (0, import_selection.isSelecting)(editor)
140
+ };
141
+ let promptText = "";
142
+ if (typeof prompt === "function") {
143
+ promptText = prompt(params);
144
+ } else if (typeof prompt === "object") {
145
+ promptText = createPromptFromConfig(prompt, params);
146
+ } else {
147
+ promptText = prompt;
148
+ }
149
+ return promptText;
150
+ };
115
151
 
116
152
  // src/lib/utils/getMarkdown.ts
117
153
  var import_markdown = require("@platejs/markdown");
118
- var import_platejs4 = require("platejs");
154
+ var import_platejs5 = require("platejs");
119
155
  var getMarkdown = (editor, {
120
156
  type
121
157
  }) => {
@@ -137,7 +173,7 @@ var getMarkdown = (editor, {
137
173
  const modifiedFragment = [
138
174
  {
139
175
  children: fragment[0].children,
140
- type: import_platejs4.KEYS.p
176
+ type: import_platejs5.KEYS.p
141
177
  }
142
178
  ];
143
179
  return (0, import_markdown.serializeMd)(editor, {
@@ -153,7 +189,7 @@ var getMarkdown = (editor, {
153
189
  return "";
154
190
  };
155
191
 
156
- // src/lib/utils/getEditorPrompt.ts
192
+ // src/lib/utils/replacePlaceholders.ts
157
193
  var replacePlaceholders = (editor, text, {
158
194
  prompt
159
195
  } = {}) => {
@@ -173,37 +209,6 @@ var replacePlaceholders = (editor, text, {
173
209
  });
174
210
  return result;
175
211
  };
176
- var createPromptFromConfig = (config, params) => {
177
- const { isBlockSelecting, isSelecting: isSelecting2 } = params;
178
- if (isBlockSelecting && config.blockSelecting) {
179
- return config.blockSelecting ?? config.default;
180
- } else if (isSelecting2 && config.selecting) {
181
- return config.selecting ?? config.default;
182
- } else {
183
- return config.default;
184
- }
185
- };
186
- var getEditorPrompt = (editor, {
187
- prompt = ""
188
- }) => {
189
- const params = {
190
- editor,
191
- isBlockSelecting: editor.getOption(
192
- { key: import_platejs5.KEYS.blockSelection },
193
- "isSelectingSome"
194
- ),
195
- isSelecting: (0, import_selection.isSelecting)(editor)
196
- };
197
- let promptText = "";
198
- if (typeof prompt === "function") {
199
- promptText = prompt(params);
200
- } else if (typeof prompt === "object") {
201
- promptText = createPromptFromConfig(prompt, params);
202
- } else {
203
- promptText = prompt;
204
- }
205
- return promptText;
206
- };
207
212
  // Annotate the CommonJS export names for ESM import in node:
208
213
  0 && (module.exports = {
209
214
  BaseAIPlugin,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './lib/index';\n","import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nexport const undoAI = (editor: SlateEditor) => {\n if (\n (editor.history.undos.at(-1) as any)?.ai &&\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n })\n ) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './getEditorPrompt';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n"],"mappings":"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","names":["import_platejs","import_platejs","import_platejs","import_platejs","isSelecting"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts","../src/lib/utils/replacePlaceholders.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './lib/index';\n","import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getTransientSuggestionKey } from '@platejs/suggestion';\n\nexport const undoAI = (editor: SlateEditor) => {\n const hasAINodeOrAISuggestion =\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n }) ||\n editor.api.some({\n at: [],\n match: (n) => !!n[getTransientSuggestionKey()],\n });\n\n if ((editor.history.undos.at(-1) as any)?.ai && hasAINodeOrAISuggestion) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './replacePlaceholders';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n"],"mappings":"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","names":["import_platejs","import_platejs","import_platejs","isSelecting","import_platejs"]}
package/dist/index.mjs CHANGED
@@ -43,11 +43,16 @@ var removeAINodes = (editor, { at = [] } = {}) => {
43
43
  };
44
44
 
45
45
  // src/lib/transforms/undoAI.ts
46
+ import { getTransientSuggestionKey } from "@platejs/suggestion";
46
47
  var undoAI = (editor) => {
47
- if (editor.history.undos.at(-1)?.ai && editor.api.some({
48
+ const hasAINodeOrAISuggestion = editor.api.some({
48
49
  at: [],
49
50
  match: (n) => !!n.ai
50
- })) {
51
+ }) || editor.api.some({
52
+ at: [],
53
+ match: (n) => !!n[getTransientSuggestionKey()]
54
+ });
55
+ if (editor.history.undos.at(-1)?.ai && hasAINodeOrAISuggestion) {
51
56
  editor.undo();
52
57
  editor.history.redos.pop();
53
58
  }
@@ -81,11 +86,42 @@ var BaseAIPlugin = createTSlatePlugin({
81
86
 
82
87
  // src/lib/utils/getEditorPrompt.ts
83
88
  import { isSelecting } from "@platejs/selection";
84
- import { KEYS as KEYS4 } from "platejs";
89
+ import { KEYS as KEYS3 } from "platejs";
90
+ var createPromptFromConfig = (config, params) => {
91
+ const { isBlockSelecting, isSelecting: isSelecting2 } = params;
92
+ if (isBlockSelecting && config.blockSelecting) {
93
+ return config.blockSelecting ?? config.default;
94
+ } else if (isSelecting2 && config.selecting) {
95
+ return config.selecting ?? config.default;
96
+ } else {
97
+ return config.default;
98
+ }
99
+ };
100
+ var getEditorPrompt = (editor, {
101
+ prompt = ""
102
+ }) => {
103
+ const params = {
104
+ editor,
105
+ isBlockSelecting: editor.getOption(
106
+ { key: KEYS3.blockSelection },
107
+ "isSelectingSome"
108
+ ),
109
+ isSelecting: isSelecting(editor)
110
+ };
111
+ let promptText = "";
112
+ if (typeof prompt === "function") {
113
+ promptText = prompt(params);
114
+ } else if (typeof prompt === "object") {
115
+ promptText = createPromptFromConfig(prompt, params);
116
+ } else {
117
+ promptText = prompt;
118
+ }
119
+ return promptText;
120
+ };
85
121
 
86
122
  // src/lib/utils/getMarkdown.ts
87
123
  import { serializeMd } from "@platejs/markdown";
88
- import { KEYS as KEYS3 } from "platejs";
124
+ import { KEYS as KEYS4 } from "platejs";
89
125
  var getMarkdown = (editor, {
90
126
  type
91
127
  }) => {
@@ -107,7 +143,7 @@ var getMarkdown = (editor, {
107
143
  const modifiedFragment = [
108
144
  {
109
145
  children: fragment[0].children,
110
- type: KEYS3.p
146
+ type: KEYS4.p
111
147
  }
112
148
  ];
113
149
  return serializeMd(editor, {
@@ -123,7 +159,7 @@ var getMarkdown = (editor, {
123
159
  return "";
124
160
  };
125
161
 
126
- // src/lib/utils/getEditorPrompt.ts
162
+ // src/lib/utils/replacePlaceholders.ts
127
163
  var replacePlaceholders = (editor, text, {
128
164
  prompt
129
165
  } = {}) => {
@@ -143,37 +179,6 @@ var replacePlaceholders = (editor, text, {
143
179
  });
144
180
  return result;
145
181
  };
146
- var createPromptFromConfig = (config, params) => {
147
- const { isBlockSelecting, isSelecting: isSelecting2 } = params;
148
- if (isBlockSelecting && config.blockSelecting) {
149
- return config.blockSelecting ?? config.default;
150
- } else if (isSelecting2 && config.selecting) {
151
- return config.selecting ?? config.default;
152
- } else {
153
- return config.default;
154
- }
155
- };
156
- var getEditorPrompt = (editor, {
157
- prompt = ""
158
- }) => {
159
- const params = {
160
- editor,
161
- isBlockSelecting: editor.getOption(
162
- { key: KEYS4.blockSelection },
163
- "isSelectingSome"
164
- ),
165
- isSelecting: isSelecting(editor)
166
- };
167
- let promptText = "";
168
- if (typeof prompt === "function") {
169
- promptText = prompt(params);
170
- } else if (typeof prompt === "object") {
171
- promptText = createPromptFromConfig(prompt, params);
172
- } else {
173
- promptText = prompt;
174
- }
175
- return promptText;
176
- };
177
182
  export {
178
183
  BaseAIPlugin,
179
184
  getEditorPrompt,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts"],"sourcesContent":["import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nexport const undoAI = (editor: SlateEditor) => {\n if (\n (editor.history.undos.at(-1) as any)?.ai &&\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n })\n ) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './getEditorPrompt';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n"],"mappings":"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","names":["KEYS","KEYS","KEYS","KEYS","isSelecting","KEYS"]}
1
+ {"version":3,"sources":["../src/lib/BaseAIPlugin.ts","../src/lib/transforms/insertAINodes.ts","../src/lib/transforms/removeAIMarks.ts","../src/lib/transforms/removeAINodes.ts","../src/lib/transforms/undoAI.ts","../src/lib/transforms/withAIBatch.ts","../src/lib/utils/getEditorPrompt.ts","../src/lib/utils/getMarkdown.ts","../src/lib/utils/replacePlaceholders.ts"],"sourcesContent":["import {\n type OmitFirst,\n type PluginConfig,\n bindFirst,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport { removeAIMarks, undoAI } from './transforms';\nimport { insertAINodes } from './transforms/insertAINodes';\nimport { removeAINodes } from './transforms/removeAINodes';\n\nexport type BaseAIPluginConfig = PluginConfig<\n 'ai',\n {},\n {},\n {\n ai: {\n insertNodes: OmitFirst<typeof insertAINodes>;\n removeMarks: OmitFirst<typeof removeAIMarks>;\n removeNodes: OmitFirst<typeof removeAINodes>;\n };\n }\n>;\n\nexport const BaseAIPlugin = createTSlatePlugin({\n key: KEYS.ai,\n node: { isDecoration: false, isLeaf: true },\n}).extendTransforms(({ editor }) => ({\n insertNodes: bindFirst(insertAINodes, editor),\n removeMarks: bindFirst(removeAIMarks, editor),\n removeNodes: bindFirst(removeAINodes, editor),\n undo: bindFirst(undoAI, editor),\n}));\n","import type { Descendant, Path, SlateEditor } from 'platejs';\n\nexport const insertAINodes = (\n editor: SlateEditor,\n nodes: Descendant[],\n {\n target,\n }: {\n target?: Path;\n } = {}\n) => {\n if (!target && !editor.selection?.focus.path) return;\n\n const aiNodes = nodes.map((node) => ({\n ...node,\n ai: true,\n }));\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(aiNodes, {\n at: editor.api.end(target || editor.selection!.focus.path),\n select: true,\n });\n editor.tf.collapse({ edge: 'end' });\n });\n};\n","import { type SlateEditor, type TLocation, getPluginType, KEYS } from 'platejs';\n\nexport const removeAIMarks = (\n editor: SlateEditor,\n { at = [] }: { at?: TLocation } = {}\n) => {\n const nodeType = getPluginType(editor, KEYS.ai);\n\n editor.tf.unsetNodes(nodeType, {\n at,\n match: (n) => (n as any)[nodeType],\n });\n};\n","import { type Path, type SlateEditor, TextApi } from 'platejs';\n\nexport const removeAINodes = (\n editor: SlateEditor,\n { at = [] }: { at?: Path } = {}\n) => {\n editor.tf.removeNodes({\n at,\n match: (n) => TextApi.isText(n) && !!(n as any).ai,\n });\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getTransientSuggestionKey } from '@platejs/suggestion';\n\nexport const undoAI = (editor: SlateEditor) => {\n const hasAINodeOrAISuggestion =\n editor.api.some({\n at: [],\n match: (n) => !!(n as any).ai,\n }) ||\n editor.api.some({\n at: [],\n match: (n) => !!n[getTransientSuggestionKey()],\n });\n\n if ((editor.history.undos.at(-1) as any)?.ai && hasAINodeOrAISuggestion) {\n editor.undo();\n editor.history.redos.pop();\n }\n};\n","import type { History, SlateEditor } from 'platejs';\n\nexport type AIBatch = History['undos'][number] & { ai?: boolean };\n\nexport const withAIBatch = (\n editor: SlateEditor,\n fn: () => void,\n {\n split,\n }: {\n split?: boolean;\n } = {}\n) => {\n if (split) {\n editor.tf.withNewBatch(fn);\n } else {\n editor.tf.withMerging(fn);\n }\n\n const lastBatch = editor.history.undos?.at(-1) as AIBatch | undefined;\n\n if (lastBatch) {\n lastBatch.ai = true;\n }\n};\n","import { isSelecting } from '@platejs/selection';\nimport { type SlateEditor, KEYS } from 'platejs';\n\nexport type EditorPrompt =\n | ((params: EditorPromptParams) => string)\n | PromptConfig\n | string;\n\nexport interface EditorPromptParams {\n editor: SlateEditor;\n isBlockSelecting: boolean;\n isSelecting: boolean;\n}\n\nexport interface PromptConfig {\n default: string;\n blockSelecting?: string;\n selecting?: string;\n}\n\nconst createPromptFromConfig = (\n config: PromptConfig,\n params: EditorPromptParams\n): string => {\n const { isBlockSelecting, isSelecting } = params;\n\n if (isBlockSelecting && config.blockSelecting) {\n return config.blockSelecting ?? config.default;\n } else if (isSelecting && config.selecting) {\n return config.selecting ?? config.default;\n } else {\n return config.default;\n }\n};\n\nexport const getEditorPrompt = (\n editor: SlateEditor,\n {\n prompt = '',\n }: {\n prompt?: EditorPrompt;\n }\n): string => {\n const params: EditorPromptParams = {\n editor,\n isBlockSelecting: editor.getOption(\n { key: KEYS.blockSelection },\n 'isSelectingSome'\n ),\n isSelecting: isSelecting(editor),\n };\n\n let promptText = '';\n\n if (typeof prompt === 'function') {\n promptText = prompt(params);\n } else if (typeof prompt === 'object') {\n promptText = createPromptFromConfig(prompt, params);\n } else {\n promptText = prompt;\n }\n\n return promptText;\n};\n","import { serializeMd } from '@platejs/markdown';\nimport { type SlateEditor, type TElement, KEYS } from 'platejs';\n\nimport type { MarkdownType } from './replacePlaceholders';\n\n// Internal\nexport const getMarkdown = (\n editor: SlateEditor,\n {\n type,\n }: {\n type: MarkdownType;\n }\n) => {\n if (type === 'editor' || type === 'editorWithBlockId') {\n return serializeMd(editor, {\n withBlockId: type === 'editorWithBlockId',\n });\n }\n\n if (type === 'block' || type === 'blockWithBlockId') {\n const blocks = editor.api.blocks({ mode: 'highest' }).map(([node]) => node);\n\n return serializeMd(editor, {\n value: blocks,\n withBlockId: type === 'blockWithBlockId',\n });\n }\n\n if (type === 'blockSelection' || type === 'blockSelectionWithBlockId') {\n const fragment = editor.api.fragment<TElement>();\n\n // Remove any block formatting\n if (fragment.length === 1) {\n const modifiedFragment = [\n {\n children: fragment[0].children,\n type: KEYS.p,\n },\n ];\n\n return serializeMd(editor, {\n value: modifiedFragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return serializeMd(editor, {\n value: fragment,\n withBlockId: type === 'blockSelectionWithBlockId',\n });\n }\n\n return '';\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { getMarkdown } from './getMarkdown';\n\nexport type MarkdownType =\n | 'block'\n | 'blockSelection'\n | 'blockSelectionWithBlockId'\n | 'blockWithBlockId'\n | 'editor'\n | 'editorWithBlockId';\n\nexport const replacePlaceholders = (\n editor: SlateEditor,\n text: string,\n {\n prompt,\n }: {\n prompt?: string;\n } = {}\n): string => {\n let result = text.replace('{prompt}', prompt || '');\n\n const placeholders: Record<string, MarkdownType> = {\n '{blockSelectionWithBlockId}': 'blockSelectionWithBlockId',\n '{blockSelection}': 'blockSelection',\n '{blockWithBlockId}': 'blockWithBlockId',\n '{block}': 'block',\n '{editorWithBlockId}': 'editorWithBlockId',\n '{editor}': 'editor',\n };\n\n Object.entries(placeholders).forEach(([placeholder, type]) => {\n if (result.includes(placeholder)) {\n result = result.replace(placeholder, getMarkdown(editor, { type }));\n }\n });\n\n return result;\n};\n"],"mappings":"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","names":["KEYS","KEYS","KEYS","isSelecting","KEYS"]}
@@ -1,8 +1,8 @@
1
1
  import * as platejs_react from 'platejs/react';
2
2
  import { PlateEditor, OverrideEditor, RenderNodeWrapperProps } from 'platejs/react';
3
3
  import * as platejs from 'platejs';
4
- import { ExtendConfig, SlateEditor, Range, NodeEntry, TElement, PluginConfig, Path, OmitFirst, EditorNodesOptions, TText, Descendant, RemoveNodesOptions } from 'platejs';
5
- import { B as BaseAIPluginConfig, b as AIMode, E as EditorPrompt, A as AIToolName } from '../getEditorPrompt-FgyoD13L.mjs';
4
+ import { ExtendConfig, SlateEditor, Range, NodeEntry, TElement, PluginConfig, Path, TIdElement, TRange, OmitFirst, EditorNodesOptions, TText, Descendant, RemoveNodesOptions } from 'platejs';
5
+ import { B as BaseAIPluginConfig, b as AIMode, E as EditorPrompt, A as AIToolName } from '../getEditorPrompt-C7EEuMw8.mjs';
6
6
  import { UIMessage, ChatRequestOptions } from 'ai';
7
7
  import { Range as Range$1 } from 'slate';
8
8
  import { UseChatHelpers } from '@ai-sdk/react';
@@ -45,10 +45,14 @@ declare function findTextRangeInBlock({ block, findText, }: {
45
45
  }): Range$1 | null;
46
46
 
47
47
  declare const acceptAIChat: (editor: PlateEditor) => void;
48
+ declare const acceptSuggestions: (editor: PlateEditor) => void;
48
49
 
49
50
  declare const insertBelowAIChat: (editor: PlateEditor, sourceEditor: SlateEditor, { format }?: {
50
51
  format?: "all" | "none" | "single";
51
52
  }) => void;
53
+ declare const insertBelowGenerate: (editor: PlateEditor, sourceEditor: SlateEditor, { format }?: {
54
+ format?: "all" | "none" | "single";
55
+ }) => void;
52
56
 
53
57
  declare const createFormattedBlocks: ({ blocks, format, sourceBlock, }: {
54
58
  blocks: TElement[];
@@ -73,9 +77,12 @@ type AIChatPluginConfig = PluginConfig<'aiChat', {
73
77
  _blockPath: Path | null;
74
78
  /** @private Using For streamInsertChunk */
75
79
  _mdxName: string | null;
80
+ _replaceIds: string[];
76
81
  /** @private The Editor used to generate the AI response. */
77
82
  aiEditor: SlateEditor | null;
78
83
  chat: UseChatHelpers<ChatMessage>;
84
+ chatNodes: TIdElement[];
85
+ chatSelection: TRange | null;
79
86
  /** @deprecated Use api.aiChat.node({streaming:true}) instead */
80
87
  experimental_lastTextId: string | null;
81
88
  /**
@@ -94,7 +101,9 @@ type AIChatPluginConfig = PluginConfig<'aiChat', {
94
101
  aiChat: {
95
102
  reset: OmitFirst<typeof resetAIChat>;
96
103
  submit: OmitFirst<typeof submitAIChat>;
97
- hide: () => void;
104
+ hide: (options?: {
105
+ focus?: boolean;
106
+ }) => void;
98
107
  node: (options?: EditorNodesOptions & {
99
108
  anchor?: boolean;
100
109
  streaming?: boolean;
@@ -116,9 +125,12 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
116
125
  _blockPath: Path | null;
117
126
  /** @private Using For streamInsertChunk */
118
127
  _mdxName: string | null;
128
+ _replaceIds: string[];
119
129
  /** @private The Editor used to generate the AI response. */
120
130
  aiEditor: SlateEditor | null;
121
131
  chat: UseChatHelpers<ChatMessage>;
132
+ chatNodes: TIdElement[];
133
+ chatSelection: TRange | null;
122
134
  /** @deprecated Use api.aiChat.node({streaming:true}) instead */
123
135
  experimental_lastTextId: string | null;
124
136
  /**
@@ -137,7 +149,9 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
137
149
  aiChat: {
138
150
  reset: OmitFirst<typeof resetAIChat>;
139
151
  submit: OmitFirst<typeof submitAIChat>;
140
- hide: () => void;
152
+ hide: (options?: {
153
+ focus?: boolean;
154
+ }) => void;
141
155
  node: (options?: EditorNodesOptions & {
142
156
  anchor?: boolean;
143
157
  streaming?: boolean;
@@ -149,7 +163,9 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
149
163
  } & Record<"aiChat", Pick<{
150
164
  reset: OmitFirst<typeof resetAIChat>;
151
165
  submit: OmitFirst<typeof submitAIChat>;
152
- hide: () => void;
166
+ hide: (options?: {
167
+ focus?: boolean;
168
+ }) => void;
153
169
  node: (options?: EditorNodesOptions & {
154
170
  anchor?: boolean;
155
171
  streaming?: boolean;
@@ -157,8 +173,10 @@ declare const AIChatPlugin: platejs_react.PlatePlugin<PluginConfig<"aiChat", {
157
173
  reload: () => void;
158
174
  show: () => void;
159
175
  stop: () => void;
160
- }, "node" | "reset" | "stop" | "submit">> & Record<"aiChat", {
161
- hide: () => void;
176
+ }, "node" | "stop" | "reset" | "submit">> & Record<"aiChat", {
177
+ hide: ({ focus }?: {
178
+ focus?: boolean;
179
+ }) => void;
162
180
  show: () => void;
163
181
  }>, {
164
182
  aiChat: {
@@ -242,6 +260,8 @@ declare function isCompleteMath(str: string): boolean;
242
260
 
243
261
  declare const removeAnchorAIChat: (editor: PlateEditor, options?: RemoveNodesOptions) => void;
244
262
 
263
+ declare const applyAISuggestions: (editor: SlateEditor, content: string) => void;
264
+
245
265
  declare function getLastAssistantMessage(editor: PlateEditor): ChatMessage | undefined;
246
266
  declare function useLastAssistantMessage(): ChatMessage | undefined;
247
267
 
@@ -440,4 +460,4 @@ declare const withCopilot: OverrideEditor<CopilotPluginConfig>;
440
460
 
441
461
  declare const withoutAbort: (editor: PlateEditor, fn: () => void) => void;
442
462
 
443
- export { AIChatPlugin, type AIChatPluginConfig, AIPlugin, type AIPluginConfig, type CallCompletionApiOptions, type CompleteOptions, CopilotPlugin, type CopilotPluginConfig, type GetNextWord, type SteamInsertChunkOptions, type UseEditorChatOptions, acceptAIChat, acceptCopilot, acceptCopilotNextWord, aiCommentToRange, callCompletionApi, createFormattedBlocks, escapeInput, findTextRangeInBlock, getChunkTrimmed, getCurrentBlockPath, getLastAssistantMessage, getListNode, getNextWord, insertBelowAIChat, isCompleteCodeBlock, isCompleteMath, isSameNode, nodesWithProps, removeAnchorAIChat, renderCopilotBelowNodes, replaceSelectionAIChat, resetAIChat, streamDeserializeInlineMd, streamDeserializeMd, streamInsertChunk, streamSerializeMd, submitAIChat, triggerCopilotSuggestion, useAIChatEditor, useChatChunk, useEditorChat, useLastAssistantMessage, withAIChat, withCopilot, withoutAbort };
463
+ export { AIChatPlugin, type AIChatPluginConfig, AIPlugin, type AIPluginConfig, type CallCompletionApiOptions, type CompleteOptions, CopilotPlugin, type CopilotPluginConfig, type GetNextWord, type SteamInsertChunkOptions, type UseEditorChatOptions, acceptAIChat, acceptCopilot, acceptCopilotNextWord, acceptSuggestions, aiCommentToRange, applyAISuggestions, callCompletionApi, createFormattedBlocks, escapeInput, findTextRangeInBlock, getChunkTrimmed, getCurrentBlockPath, getLastAssistantMessage, getListNode, getNextWord, insertBelowAIChat, insertBelowGenerate, isCompleteCodeBlock, isCompleteMath, isSameNode, nodesWithProps, removeAnchorAIChat, renderCopilotBelowNodes, replaceSelectionAIChat, resetAIChat, streamDeserializeInlineMd, streamDeserializeMd, streamInsertChunk, streamSerializeMd, submitAIChat, triggerCopilotSuggestion, useAIChatEditor, useChatChunk, useEditorChat, useLastAssistantMessage, withAIChat, withCopilot, withoutAbort };