@monaco-ai-editor/core 0.1.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.
@@ -0,0 +1,295 @@
1
+ import * as MonacoType from 'monaco-editor';
2
+
3
+ /** AI API 配置(OpenAI 兼容协议) */
4
+ interface ApiConfig {
5
+ baseUrl: string;
6
+ apiKey: string;
7
+ model: string;
8
+ /** true = 流式输出(默认),false = 一次性返回 */
9
+ streamMode?: boolean;
10
+ }
11
+ /** SQL 表结构 Schema:{ 表名: [列名, ...] } */
12
+ type SqlSchema = Record<string, string[]>;
13
+ /** 待显示的内联补全(用于 AI 幽灵文本) */
14
+ interface PendingCompletion {
15
+ lineNumber: number;
16
+ column: number;
17
+ insertText: string;
18
+ }
19
+ /** 一条聊天消息 */
20
+ interface ChatMessage {
21
+ id: string;
22
+ role: 'user' | 'assistant';
23
+ content: string;
24
+ isStreaming?: boolean;
25
+ }
26
+ /** 编辑器状态快照 */
27
+ interface EditorSnapshot {
28
+ value: string;
29
+ language: string;
30
+ theme: string;
31
+ cursorLine: number;
32
+ cursorColumn: number;
33
+ }
34
+ /** 补全上下文,传给自定义 CompletionProvider */
35
+ interface CompletionContext {
36
+ monaco: typeof MonacoType;
37
+ model: MonacoType.editor.ITextModel;
38
+ position: MonacoType.Position;
39
+ lineText: string;
40
+ /** 光标前的单词 */
41
+ currentWord: string;
42
+ fullText: string;
43
+ /** Monaco 自带的 triggerKind / triggerCharacter */
44
+ triggerCharacter?: string;
45
+ }
46
+ /**
47
+ * 扩展点:自定义补全提供者。
48
+ * 用户通过 EditorController 注册,运行时被聚合调度。
49
+ */
50
+ interface CompletionProvider {
51
+ id: string;
52
+ /** 适用的语言(不传则全部语言) */
53
+ languages?: string[];
54
+ /** 触发字符(默认无) */
55
+ triggerCharacters?: string[];
56
+ /** 判断是否触发(同步) */
57
+ shouldTrigger?: (ctx: CompletionContext) => boolean;
58
+ /** 提供建议(可异步) */
59
+ provide: (ctx: CompletionContext) => Promise<MonacoType.languages.CompletionItem[]> | MonacoType.languages.CompletionItem[];
60
+ }
61
+
62
+ declare const SQL_KEYWORDS: string[];
63
+ declare const SQL_FUNCTIONS: string[];
64
+ declare const SQL_DATA_TYPES: string[];
65
+ declare const LANGUAGES: readonly ["javascript", "typescript", "python", "json", "css", "html", "markdown", "rust", "go", "sql"];
66
+ /** Monaco 编辑器支持的 UI 本地化语言 */
67
+ declare const LOCALES: {
68
+ readonly ZH_CN: "zh-cn";
69
+ readonly EN: "en";
70
+ readonly DE: "de";
71
+ readonly ES: "es";
72
+ readonly FR: "fr";
73
+ readonly IT: "it";
74
+ readonly JA: "ja";
75
+ readonly KO: "ko";
76
+ readonly RU: "ru";
77
+ };
78
+ type Locale = (typeof LOCALES)[keyof typeof LOCALES];
79
+ declare const THEMES: readonly [{
80
+ readonly value: "vs-dark";
81
+ readonly label: "Dark";
82
+ }, {
83
+ readonly value: "light";
84
+ readonly label: "Light";
85
+ }, {
86
+ readonly value: "hc-black";
87
+ readonly label: "High Contrast";
88
+ }];
89
+ declare const AI_INLINE_LANGUAGES: string[];
90
+
91
+ /**
92
+ * 极简事件发射器,框架无关。
93
+ * 用于 EditorController / AiChatController / EditorBus 之间的事件通信。
94
+ */
95
+ type Listener<T> = (payload: T) => void;
96
+ declare class EventEmitter<EventMap> {
97
+ private listeners;
98
+ on<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): () => void;
99
+ off<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): void;
100
+ emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void;
101
+ removeAllListeners(): void;
102
+ }
103
+
104
+ interface EditorControllerEvents {
105
+ change: {
106
+ value: string;
107
+ };
108
+ cursor: {
109
+ line: number;
110
+ column: number;
111
+ };
112
+ ready: {
113
+ editor: MonacoType.editor.IStandaloneCodeEditor;
114
+ };
115
+ languageChange: {
116
+ language: string;
117
+ };
118
+ focus: void;
119
+ blur: void;
120
+ }
121
+ interface EditorControllerOptions {
122
+ container: HTMLElement;
123
+ language?: string;
124
+ theme?: string;
125
+ value?: string;
126
+ monaco: typeof MonacoType;
127
+ /** Monaco loader monaco-editor 路径配置 */
128
+ vsPath?: string;
129
+ sqlSchema?: SqlSchema;
130
+ apiConfig?: ApiConfig | null;
131
+ completionProviders?: CompletionProvider[];
132
+ /** Monaco editor options */
133
+ editorOptions?: MonacoType.editor.IStandaloneEditorConstructionOptions;
134
+ }
135
+ /**
136
+ * 框架无关的编辑器控制器。
137
+ * 封装 Monaco 实例的生命周期、核心操作、补全注册。
138
+ * 通过 EventEmitter 暴露编辑器事件,不依赖任何 UI 框架。
139
+ */
140
+ declare class EditorController extends EventEmitter<EditorControllerEvents> {
141
+ private options;
142
+ private editor;
143
+ private monaco;
144
+ private sqlProviderRegistered;
145
+ private aiProviderRegistered;
146
+ private pendingCompletionRef;
147
+ private customProviders;
148
+ private disposables;
149
+ completed: boolean;
150
+ error: Error | null;
151
+ constructor(options: EditorControllerOptions);
152
+ private init;
153
+ private bindEditorEvents;
154
+ private registerCustomCompletionProviders;
155
+ getEditor(): MonacoType.editor.IStandaloneCodeEditor | null;
156
+ getValue(): string;
157
+ setValue(value: string): void;
158
+ insertText(text: string, range?: MonacoType.IRange): void;
159
+ format(): void;
160
+ focus(): void;
161
+ setLanguage(language: string): void;
162
+ setTheme(theme: string): void;
163
+ getCursorPosition(): {
164
+ line: number;
165
+ column: number;
166
+ };
167
+ getSelection(): MonacoType.IRange | null;
168
+ /**
169
+ * 触发 AI 行内补全(Ctrl+Alt+L 快捷键)。
170
+ * 需要提前设置 apiConfig(通过 setApiConfig 或构造函数传入)。
171
+ */
172
+ setApiConfig(config: ApiConfig | null): void;
173
+ getPendingCompletionRef(): {
174
+ current: PendingCompletion | null;
175
+ };
176
+ dispose(): void;
177
+ }
178
+
179
+ interface AiChatControllerEvents {
180
+ messageAdded: ChatMessage;
181
+ messageUpdated: ChatMessage;
182
+ cleared: void;
183
+ loadingChange: {
184
+ loading: boolean;
185
+ };
186
+ error: {
187
+ message: string;
188
+ };
189
+ }
190
+ /**
191
+ * AI 聊天控制器:管理消息列表、API 调用与流式响应。
192
+ * 框架无关:通过事件通知 UI 层更新。
193
+ */
194
+ declare class AiChatController extends EventEmitter<AiChatControllerEvents> {
195
+ private messages;
196
+ private abortController;
197
+ private loading;
198
+ private apiConfig;
199
+ constructor(apiConfig: ApiConfig);
200
+ setApiConfig(config: ApiConfig): void;
201
+ getApiConfig(): ApiConfig;
202
+ getMessages(): readonly ChatMessage[];
203
+ isLoading(): boolean;
204
+ /** 发送消息,可选携带编辑器上下文 */
205
+ send(userInput: string, options?: {
206
+ editorContent?: string;
207
+ language?: string;
208
+ }): Promise<void>;
209
+ stop(): void;
210
+ clear(): void;
211
+ dispose(): void;
212
+ }
213
+
214
+ interface EditorBusEvents {
215
+ /** 编辑器已注册 */
216
+ 'editor:ready': EditorController;
217
+ /** 编辑器即将卸载 */
218
+ 'editor:dispose': void;
219
+ /** 编辑器内容变化 */
220
+ 'editor:change': {
221
+ value: string;
222
+ };
223
+ /** 编辑器光标变化 */
224
+ 'editor:cursor': {
225
+ line: number;
226
+ column: number;
227
+ };
228
+ /** 编辑器语言变化 */
229
+ 'editor:languageChange': {
230
+ language: string;
231
+ };
232
+ /** 聊天面板已注册 */
233
+ 'chat:ready': AiChatController;
234
+ /** 聊天面板卸载 */
235
+ 'chat:dispose': void;
236
+ /** 聊天面板请求向编辑器插入代码 */
237
+ 'chat:insertCode': {
238
+ code: string;
239
+ };
240
+ /** 聊天面板请求替换编辑器全部内容 */
241
+ 'chat:replaceCode': {
242
+ code: string;
243
+ };
244
+ }
245
+ /**
246
+ * 编辑器与聊天面板的通信总线。
247
+ * 在两个组件都引入时由协调器(Coordinator)创建并共享,实现自动联动。
248
+ * 当只引入其中一个组件时,bus 可为 null,组件正常独立工作。
249
+ */
250
+ declare class EditorBus extends EventEmitter<EditorBusEvents> {
251
+ private editor;
252
+ private chat;
253
+ registerEditor(controller: EditorController): () => void;
254
+ registerChat(controller: AiChatController): () => void;
255
+ getEditor(): EditorController | null;
256
+ getChat(): AiChatController | null;
257
+ /** 让聊天面板向编辑器请求当前内容 */
258
+ getEditorContent(): string;
259
+ /** 让聊天面板向编辑器请求当前语言 */
260
+ getEditorLanguage(): string | undefined;
261
+ /** 让聊天面板请求向编辑器插入代码 */
262
+ insertToEditor(code: string): void;
263
+ /** 让聊天面板请求替换编辑器全部内容 */
264
+ replaceEditor(code: string): void;
265
+ }
266
+
267
+ /**
268
+ * 注册 SQL 内置补全提供者。
269
+ * schemaRef 使用 ref 模式以支持动态更新。
270
+ * excludeLabelsRef(可选)使用 ref 模式,提供需要从内置关键字/函数中排除的 label
271
+ * (大写匹配)。用于让使用方的自定义词表覆盖内置同名项,避免重复提示。
272
+ */
273
+ declare function registerSqlCompletion(monaco: typeof MonacoType, schemaRef: {
274
+ readonly current: SqlSchema;
275
+ }, excludeLabelsRef?: {
276
+ readonly current: Set<string>;
277
+ }): MonacoType.IDisposable;
278
+
279
+ /** 非流式调用 OpenAI 兼容 API(使用原生 fetch,无 axios 依赖) */
280
+ declare function fetchAiCompletionNonStream(config: ApiConfig, context: string, prefix: string, signal?: AbortSignal): Promise<string>;
281
+ /** 流式调用(fetch + ReadableStream) */
282
+ declare function fetchAiCompletionStream(config: ApiConfig, context: string, prefix: string, onChunk: (accumulated: string) => void, signal?: AbortSignal): Promise<void>;
283
+ /** 注册 AI 内联幽灵文本提供者 */
284
+ declare function registerAiInlineCompletion(monaco: typeof MonacoType, pendingRef: {
285
+ current: PendingCompletion | null;
286
+ }): void;
287
+ /**
288
+ * 注册 AI 补全命令(Ctrl+Alt+L 手动触发,流式更新幽灵文本)。
289
+ * 框架无关:通过函数引用方式读取最新的 apiConfig。
290
+ */
291
+ declare function registerAiCompletionCommand(editor: MonacoType.editor.IStandaloneCodeEditor, getApiConfig: () => ApiConfig | null, pendingRef: {
292
+ current: PendingCompletion | null;
293
+ }, onLoadingChange?: (loading: boolean) => void, onError?: (message: string) => void): MonacoType.IDisposable;
294
+
295
+ export { AI_INLINE_LANGUAGES, AiChatController, type AiChatControllerEvents, type ApiConfig, type ChatMessage, type CompletionContext, type CompletionProvider, EditorBus, type EditorBusEvents, EditorController, type EditorControllerEvents, type EditorControllerOptions, type EditorSnapshot, EventEmitter, LANGUAGES, LOCALES, type Listener, type Locale, type PendingCompletion, SQL_DATA_TYPES, SQL_FUNCTIONS, SQL_KEYWORDS, type SqlSchema, THEMES, fetchAiCompletionNonStream, fetchAiCompletionStream, registerAiCompletionCommand, registerAiInlineCompletion, registerSqlCompletion };