index.d.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. import { ChainedCommands } from '@tiptap/core/dist/packages/core/src/types';
  2. import { ChainedCommands as ChainedCommands_2 } from '@tiptap/core';
  3. import { Editor } from '@tiptap/core';
  4. import { EditorEvents } from '@tiptap/core';
  5. import { EditorOptions } from '@tiptap/core';
  6. import { Extensions } from '@tiptap/core';
  7. import { Fragment } from 'prosemirror-model';
  8. import { Instance } from 'tippy.js';
  9. import { JSONContent } from '@tiptap/core';
  10. import { SingleCommands } from '@tiptap/core';
  11. import { Transaction } from '@tiptap/pm/state';
  12. declare class AbstractMenuButton extends HTMLElement implements AiEditorEventListener {
  13. template: string;
  14. editor?: InnerEditor;
  15. options?: AiEditorOptions;
  16. alwaysEnabledButtons: string[];
  17. protected constructor();
  18. protected registerClickListener(): void;
  19. connectedCallback(): void;
  20. onClick(commands: ChainedCommands): void;
  21. onCreate(props: EditorEvents["create"], options: AiEditorOptions): void;
  22. onTransaction(event: EditorEvents["transaction"]): void;
  23. onActive(editor: Editor): boolean;
  24. onEditableChange(editable: boolean): void;
  25. }
  26. export declare type AIBubbleMenuItem = {
  27. prompt: string;
  28. icon: string;
  29. title: string;
  30. } | string;
  31. export declare interface AiClient {
  32. start: (payload: string) => void;
  33. stop: () => void;
  34. }
  35. export declare interface AiClientListener {
  36. onStart: (aiClient: AiClient) => void;
  37. onStop: () => void;
  38. onMessage: (bodyString: string) => void;
  39. }
  40. export declare interface AiEditorEvent {
  41. type: string;
  42. value: any;
  43. }
  44. export declare interface AiEditorEventListener {
  45. onCreate: (props: EditorEvents['create'], options: AiEditorOptions) => void;
  46. onTransaction: (props: EditorEvents['transaction']) => void;
  47. onEditableChange: (editable: boolean) => void;
  48. onEvent?: (event: AiEditorEvent) => void;
  49. }
  50. export declare type AiEditorOptions = {
  51. element: string | Element;
  52. content?: string;
  53. contentIsMarkdown?: boolean;
  54. contentRetention?: boolean;
  55. contentRetentionKey?: string;
  56. lang?: string;
  57. editable?: boolean;
  58. i18n?: Record<string, Record<string, string>>;
  59. placeholder?: string;
  60. theme?: "light" | "dark";
  61. onMentionQuery?: (query: string) => any[] | Promise<any[]>;
  62. onCreateBefore?: (editor: LinwitDocEditor, extensions: Extensions) => void | Extensions;
  63. onCreated?: (editor: LinwitDocEditor) => void;
  64. onChange?: (editor: LinwitDocEditor) => void;
  65. onTransaction?: (editor: LinwitDocEditor, transaction: Transaction) => void;
  66. onFocus?: (editor: LinwitDocEditor) => void;
  67. onBlur?: (editor: LinwitDocEditor) => void;
  68. onDestroy?: (editor: LinwitDocEditor) => void;
  69. onSave?: (editor: LinwitDocEditor) => boolean;
  70. onFullscreen?: (isFullscreen: boolean) => void;
  71. toolbarKeys?: (string | CustomMenu | MenuGroup)[];
  72. alwaysEnabledToolbarKeys?: string[];
  73. toolbarExcludeKeys?: DefaultToolbarKey[];
  74. toolbarSize?: 'small' | 'medium' | 'large';
  75. draggable?: boolean;
  76. htmlPasteConfig?: HtmlPasteConfig;
  77. codeBlock?: {
  78. languages?: LanguageItem[];
  79. codeExplainPrompt?: string;
  80. codeCommentsPrompt?: string;
  81. };
  82. textSelectionBubbleMenu?: {
  83. enable?: boolean;
  84. elementTagName?: string;
  85. items?: (string | BubbleMenuItem)[];
  86. };
  87. link?: {
  88. autolink?: boolean;
  89. rel?: string;
  90. class?: string;
  91. bubbleMenuItems?: (string | BubbleMenuItem)[];
  92. };
  93. container?: {
  94. defaultType?: string;
  95. typeItems?: string[];
  96. };
  97. uploader?: Uploader;
  98. image?: {
  99. customMenuInvoke?: (editor: LinwitDocEditor) => void;
  100. uploadUrl?: string;
  101. uploadHeaders?: (() => Record<string, any>) | Record<string, any>;
  102. uploadFormName?: string;
  103. uploader?: Uploader;
  104. uploaderEvent?: UploaderEvent;
  105. defaultSize?: number;
  106. allowBase64?: boolean;
  107. bubbleMenuEnable?: boolean;
  108. bubbleMenuItems?: (string | BubbleMenuItem)[];
  109. };
  110. video?: {
  111. customMenuInvoke?: (editor: LinwitDocEditor) => void;
  112. uploadUrl?: string;
  113. uploadHeaders?: (() => Record<string, any>) | Record<string, any>;
  114. uploadFormName?: string;
  115. uploader?: Uploader;
  116. uploaderEvent?: UploaderEvent;
  117. };
  118. attachment?: {
  119. customMenuInvoke?: (editor: LinwitDocEditor) => void;
  120. uploadUrl?: string;
  121. uploadHeaders?: (() => Record<string, any>) | Record<string, any>;
  122. uploadFormName?: string;
  123. uploader?: Uploader;
  124. uploaderEvent?: UploaderEvent;
  125. };
  126. fontFamily?: {
  127. values: NameAndValue[];
  128. };
  129. fontSize?: {
  130. defaultValue?: number;
  131. values?: NameAndValue[];
  132. };
  133. lineHeight?: {
  134. values?: string[];
  135. };
  136. emoji?: {
  137. values?: string[];
  138. };
  139. textCounter?: (text: string) => number;
  140. ai?: AiGlobalConfig;
  141. } & Partial<Omit<EditorOptions, "element">>;
  142. export declare interface AiGlobalConfig {
  143. models: Record<string, AiModelConfig>;
  144. modelFactory?: AiModelFactory;
  145. onTokenConsume?: (modelName: string, modelConfig: AiModelConfig, count: number) => void;
  146. onCreateClientUrl?: (modelName: string, modelConfig: AiModelConfig, onSuccess: (url: string) => void, onFailure: () => void) => void;
  147. bubblePanelEnable?: boolean;
  148. bubblePanelModel?: string;
  149. bubblePanelMenus?: AIBubbleMenuItem[];
  150. bubblePanelIcon?: string;
  151. menus?: AiMenu[];
  152. commands?: AiMenu[];
  153. translate?: {
  154. prompt?: (language: string, selectText: string) => string;
  155. translateMenuItems?: TranslateMenuItem[];
  156. };
  157. codeBlock?: {
  158. codeComments?: {
  159. model: string;
  160. prompt: string;
  161. };
  162. codeExplain?: {
  163. model: string;
  164. prompt: string;
  165. };
  166. };
  167. }
  168. export declare interface AiMenu {
  169. icon: string;
  170. name: string;
  171. prompt?: string;
  172. text?: "selected" | "focusBefore";
  173. model?: string;
  174. onClick?: (event: MouseEvent, editor: LinwitDocEditor) => void;
  175. children?: AiMenu[];
  176. }
  177. export declare interface AiMessage {
  178. role: string;
  179. content: string;
  180. index: number;
  181. status: 0 | 1 | 2;
  182. }
  183. export declare interface AiMessageListener {
  184. onStart: (aiClient: AiClient) => void;
  185. onStop: () => void;
  186. onMessage: (message: AiMessage) => void;
  187. }
  188. declare abstract class AiModel {
  189. editor: InnerEditor;
  190. globalConfig: AiGlobalConfig;
  191. aiModelName: string;
  192. aiModelConfig: AiModelConfig;
  193. protected constructor(editor: InnerEditor, globalConfig: AiGlobalConfig, aiModelName: string);
  194. chatWithPayload(payload: any, listener: AiMessageListener): void;
  195. chat(selectedText: string, prompt: string, listener: AiMessageListener): void;
  196. /**
  197. * 创建客户端链接 URL
  198. */
  199. abstract createAiClientUrl(): string;
  200. /**
  201. * 创建客户端
  202. */
  203. abstract createAiClient(url: string, listener: AiMessageListener): AiClient;
  204. /**
  205. * 封装消息,把 prompt 转换为协议需要的格式
  206. * @param prompt
  207. */
  208. abstract wrapPayload(prompt: string): any;
  209. }
  210. declare interface AiModelConfig {
  211. temperature?: number;
  212. maxTokens?: number;
  213. }
  214. export declare interface AiModelFactory {
  215. create: (name: string, editor: Editor, globalConfig: AiGlobalConfig) => AiModel;
  216. }
  217. export declare class AiModelManager {
  218. private static models;
  219. static init(editor: InnerEditor, globalConfig: AiGlobalConfig): void;
  220. static get(modelName: string): AiModel;
  221. static set(modelName: string, aiModel: AiModel): void;
  222. }
  223. export declare type BubbleMenuItem = {
  224. id: string;
  225. title?: string;
  226. icon: string;
  227. holder?: any;
  228. isActive?: (editor: LinwitDocEditor) => boolean;
  229. onInit?: (editor: LinwitDocEditor, tippyInstance: Instance, parentEle: HTMLElement) => any;
  230. onClick?: (editor: LinwitDocEditor, tippyInstance: Instance, parentEle: HTMLElement, holder: any) => void;
  231. };
  232. export declare class CustomAiModel extends AiModel {
  233. constructor(editor: InnerEditor, globalConfig: AiGlobalConfig);
  234. createAiClient(url: string, listener: AiMessageListener): AiClient;
  235. wrapPayload(promptMessage: string): string;
  236. createAiClientUrl(): string;
  237. }
  238. export declare interface CustomAiModelConfig extends AiModelConfig {
  239. url: (() => string) | string;
  240. method?: string;
  241. headers?: () => Record<string, any> | undefined;
  242. wrapPayload: (prompt: string) => string;
  243. parseMessage: (bodyString: string) => AiMessage | undefined;
  244. protocol: "sse" | "websocket" | "http";
  245. }
  246. export declare interface CustomMenu {
  247. id?: string;
  248. className?: string;
  249. icon?: string;
  250. html?: string;
  251. tip?: string;
  252. onClick?: (event: MouseEvent, editor: LinwitDocEditor) => void;
  253. onCreate?: (button: HTMLElement, editor: LinwitDocEditor) => void;
  254. }
  255. declare type DefaultToolbarKey = (typeof defaultToolbarKeys)[number];
  256. declare const defaultToolbarKeys: string[];
  257. declare class Footer extends HTMLElement implements AiEditorEventListener {
  258. count: number;
  259. draggable: boolean;
  260. constructor();
  261. initDraggable(draggable?: boolean): void;
  262. updateCharacters(): void;
  263. onCreate(event: EditorEvents["create"], _: AiEditorOptions): void;
  264. onTransaction(event: EditorEvents["transaction"]): void;
  265. onEditableChange(editable: boolean): void;
  266. }
  267. declare class Header extends HTMLElement implements AiEditorEventListener {
  268. menuButtons: AbstractMenuButton[];
  269. constructor();
  270. connectedCallback(): void;
  271. onCreate(event: EditorEvents["create"], options: AiEditorOptions): void;
  272. onTransaction(event: EditorEvents["transaction"]): void;
  273. onEditableChange(editable: boolean): void;
  274. }
  275. export declare interface HtmlPasteConfig {
  276. pasteAsText?: boolean;
  277. pasteClean?: boolean;
  278. removeEmptyParagraphs?: boolean;
  279. pasteProcessor?: (html: string) => string;
  280. }
  281. export declare class InnerEditor extends Editor {
  282. linwitDocEditor: LinwitDocEditor;
  283. constructor(linwitDocEditor: LinwitDocEditor, options?: Partial<EditorOptions>);
  284. parseHtml(html: string): Fragment;
  285. parseMarkdown(markdown: string): Fragment;
  286. insertMarkdown(markdown: string): void;
  287. }
  288. declare type LanguageItem = {
  289. name: string;
  290. value: string;
  291. alias?: string[];
  292. };
  293. export declare class LinwitDocEditor {
  294. customLayout: boolean;
  295. innerEditor: InnerEditor;
  296. container: HTMLDivElement;
  297. header: Header;
  298. mainEl: HTMLDivElement;
  299. footer: Footer;
  300. options: AiEditorOptions;
  301. eventComponents: AiEditorEventListener[];
  302. constructor(_: AiEditorOptions);
  303. private initI18nAndInnerEditor;
  304. protected initInnerEditor(): void;
  305. protected getExtensions(): Extensions;
  306. protected onCreate(props: EditorEvents['create']): void;
  307. protected onTransaction(transEvent: EditorEvents['transaction']): void;
  308. getHtml(): string;
  309. getJson(): JSONContent;
  310. getText(): string;
  311. getSelectedText(): string;
  312. getMarkdown(): any;
  313. getOptions(): AiEditorOptions;
  314. getAttributes(name: string): Record<string, any>;
  315. setAttributes(name: string, attributes: Record<string, any>): void;
  316. isActive(nameOrAttrs: any, attrs?: {}): boolean;
  317. commands(): SingleCommands;
  318. commandsChain(): ChainedCommands_2;
  319. getOutline(): any[];
  320. focus(): this;
  321. focusPos(pos: number): this;
  322. focusStart(): this;
  323. focusEnd(): this;
  324. isFocused(): boolean;
  325. blur(): this;
  326. insert(content: any): this;
  327. insertMarkdown(content: string): this;
  328. setEditable(editable: boolean): this;
  329. setContent(content: string): this;
  330. setMarkdownContent(content: string): this;
  331. clear(): this;
  332. isEmpty(): boolean;
  333. changeLang(lang: string): this;
  334. changeTheme(theme?: "dark" | "light"): void;
  335. removeRetention(): this;
  336. destroy(): void;
  337. isDestroyed(): boolean;
  338. }
  339. export declare interface MenuGroup {
  340. title?: string;
  341. icon?: string;
  342. toolbarKeys: (string | CustomMenu | MenuGroup)[];
  343. }
  344. export declare interface NameAndValue {
  345. name: string;
  346. value: any;
  347. }
  348. export declare class OpenaiAiModel extends AiModel {
  349. constructor(editor: InnerEditor, globalConfig: AiGlobalConfig);
  350. createAiClient(url: string, listener: AiMessageListener): AiClient;
  351. wrapPayload(prompt: string): string;
  352. createAiClientUrl(): string;
  353. }
  354. export declare interface OpenaiModelConfig extends AiModelConfig {
  355. endpoint?: string;
  356. customUrl?: string | (() => string);
  357. apiKey?: string;
  358. model: string;
  359. }
  360. export declare class SparkAiModel extends AiModel {
  361. constructor(editor: InnerEditor, globalConfig: AiGlobalConfig);
  362. createAiClient(url: string, listener: AiMessageListener): AiClient;
  363. wrapPayload(promptMessage: string): string;
  364. getDomain(sparkAiModelConfig: SparkAiModelConfig): "4.0Ultra" | "generalv3.5" | "generalv3" | "generalv2" | "lite" | "general";
  365. createAiClientUrl(): string;
  366. }
  367. export declare interface SparkAiModelConfig extends AiModelConfig {
  368. appId: string;
  369. apiKey: string;
  370. apiSecret: string;
  371. protocol?: string;
  372. version?: string;
  373. }
  374. export declare type TranslateMenuItem = {
  375. title: string;
  376. language?: string;
  377. } | string;
  378. export declare type Uploader = (file: File, uploadUrl: string, headers: Record<string, any>, formName: string) => Promise<Record<string, any>>;
  379. export declare interface UploaderEvent {
  380. onUploadBefore?: (file: File, uploadUrl: string, headers: Record<string, any>) => void | boolean;
  381. onSuccess?: (file: File, response: any) => any;
  382. onFailed?: (file: File, response: any) => void;
  383. onError?: (file: File, err: any) => void;
  384. }
  385. export declare class WenXinAiModel extends AiModel {
  386. constructor(editor: InnerEditor, globalConfig: AiGlobalConfig);
  387. createAiClient(url: string, listener: AiMessageListener): AiClient;
  388. wrapPayload(prompt: string): string;
  389. createAiClientUrl(): string;
  390. }
  391. export declare interface WenXinAiModelConfig extends AiModelConfig {
  392. access_token: string;
  393. protocol?: string;
  394. version?: string;
  395. }
  396. export { }