3434/* metaService: engine.plugins.pagecontroller.Main */
3535import { onBeforeUnmount , reactive , provide } from ' vue'
3636import { Button } from ' @opentiny/vue'
37- import { registerCompletion } from ' monacopilot'
37+ import { registerCompletion , type CompletionRegistration } from ' monacopilot'
3838import { VueMonaco , PluginPanel } from ' @opentiny/tiny-engine-common/component'
3939import { useHelp , useLayout } from ' @opentiny/tiny-engine-meta-register'
4040import { initCompletion } from ' @opentiny/tiny-engine-common/js/completion'
4141import { initLinter } from ' @opentiny/tiny-engine-common/js/linter'
4242import useMethod , { saveMethod , highlightMethod , getMethodNameList , getMethods } from ' ./js/method'
43- import { shouldTriggerCompletion } from ' ./ai-completion/triggers/completionTrigger'
4443import { createCompletionHandler } from ' ./ai-completion/adapters/index'
44+ import { shouldTriggerCompletion } from ' ./ai-completion/triggers/completionTrigger'
45+ import { debounceManager } from ' ./ai-completion/utils/debounceManager'
4546
4647export const api = {
4748 saveMethod ,
@@ -69,6 +70,9 @@ export default {
6970
7071 const { PLUGIN_NAME } = useLayout ()
7172
73+ // 存储 AI 补全注册信息
74+ let completionRegistration: CompletionRegistration | null = null
75+
7276 const panelState = reactive ({
7377 emitEvent: emit
7478 })
@@ -122,17 +126,19 @@ export default {
122126 const monacoInstance = monacoRef .value .getMonaco ()
123127 const editorInstance = monacoRef .value .getEditor ()
124128
125- registerCompletion (monacoInstance , editorInstance , {
129+ // 配置防抖管理器
130+ debounceManager .setDebounceDelay (300 ) // 防抖延迟 300ms
131+ debounceManager .setDebounceEnabled (true )
132+
133+ completionRegistration = registerCompletion (monacoInstance , editorInstance , {
126134 language: ' javascript' ,
127- endpoint: ' /app-center/api/chat/completions' ,
128135 filename: ' page.js' ,
129- trigger: ' onTyping' ,
130136 maxContextLines: 50 ,
131137 enableCaching: true ,
132138 allowFollowUpCompletions: true ,
133139
134140 // 🎯 智能触发判断(在请求前执行,避免不必要的请求)
135- triggerIf : (params ) => {
141+ triggerIf : () => {
136142 const model = editorInstance .getModel ()
137143 const position = editorInstance .getPosition ()
138144
@@ -143,13 +149,16 @@ export default {
143149 position: {
144150 lineNumber: position .lineNumber ,
145151 column: position .column
146- },
147- triggerType: params .triggerType || ' onTyping'
152+ }
148153 })
149154 },
150155
151- // 🚀 请求处理器:支持 DeepSeek 和 Qwen 模型
152- requestHandler: createCompletionHandler () as any
156+ requestHandler: debounceManager .createRequestHandler (createCompletionHandler ())
157+ })
158+
159+ // 注册快捷键:Ctrl+Space 触发 AI 补全
160+ editorInstance .addCommand (monacoInstance .KeyMod .CtrlCmd | monacoInstance .KeyCode .Space , () => {
161+ completionRegistration ?.trigger ?.()
153162 })
154163 } catch (error ) {
155164 // eslint-disable-next-line no-console
@@ -158,6 +167,9 @@ export default {
158167 }
159168
160169 onBeforeUnmount (() => {
170+ // 清理 AI 补全
171+ completionRegistration ?.deregister ?.()
172+ debounceManager .reset ()
161173 ;(state .completionProvider as any )?.forEach ?.((provider : any ) => {
162174 provider ?.dispose ?.()
163175 })
0 commit comments