@@ -36,7 +36,7 @@ import { onBeforeUnmount, reactive, provide } from 'vue'
3636import { Button } from ' @opentiny/vue'
3737import { registerCompletion , type CompletionRegistration , type RegisterCompletionOptions } from ' monacopilot'
3838import { VueMonaco , PluginPanel } from ' @opentiny/tiny-engine-common/component'
39- import { useHelp , useLayout } from ' @opentiny/tiny-engine-meta-register'
39+ import { useHelp , useLayout , getMergeMeta } 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'
@@ -70,6 +70,7 @@ export default {
7070 const { PLUGIN_NAME } = useLayout ()
7171
7272 type RequestHandler = NonNullable <RegisterCompletionOptions [' requestHandler' ]>
73+ type TriggerMode = NonNullable <RegisterCompletionOptions [' trigger' ]>
7374 let completion: CompletionRegistration | null = null
7475
7576 const panelState = reactive ({
@@ -120,43 +121,50 @@ export default {
120121 // 保留原有的 ESLint
121122 state .linterWorker = initLinter (editor , monacoRef .value .getMonaco (), state ) as any
122123
123- // 🆕 新增: 注册 AI 补全
124- try {
125- const monaco = monacoRef .value .getMonaco ()
126- const editor = monacoRef .value .getEditor ()
127-
128- completion = registerCompletion (monaco , editor , {
129- language: ' javascript' ,
130- filename: ' page.js' ,
131- maxContextLines: 50 ,
132- enableCaching: true ,
133- allowFollowUpCompletions: false ,
134- trigger: ' onIdle' ,
135- triggerIf : ({ text , position }) => {
136- return shouldTriggerCompletion ({
137- text ,
138- position
139- })
140- },
141- requestHandler: createCompletionHandler () as RequestHandler
142- })
143-
144- monaco .editor .addEditorAction ({
145- id: ' monacopilot.triggerCompletion' ,
146- label: ' Complete Code' ,
147- contextMenuGroupId: ' navigation' ,
148- run : () => {
149- completion ! .trigger ()
150- }
151- })
152- } catch (error ) {
153- // eslint-disable-next-line no-console
154- console .error (' ❌ AI 补全注册失败:' , error )
124+ const { aiCompletionEnabled, aiCompletionTrigger = ' onIdle' } =
125+ getMergeMeta (' engine.plugins.pagecontroller' )?.options || {}
126+
127+ if (aiCompletionEnabled ) {
128+ try {
129+ const monaco = monacoRef .value .getMonaco ()
130+ const editor = monacoRef .value .getEditor ()
131+
132+ completion = registerCompletion (monaco , editor , {
133+ language: ' javascript' ,
134+ filename: ' page.js' ,
135+ maxContextLines: 50 ,
136+ enableCaching: true ,
137+ allowFollowUpCompletions: false ,
138+ trigger: aiCompletionTrigger as TriggerMode ,
139+ triggerIf : ({ text , position }) => {
140+ return shouldTriggerCompletion ({
141+ text ,
142+ position
143+ })
144+ },
145+ requestHandler: createCompletionHandler () as RequestHandler
146+ })
147+
148+ monaco .editor .addEditorAction ({
149+ id: ' monacopilot.triggerCompletion' ,
150+ label: ' Complete Code' ,
151+ contextMenuGroupId: ' navigation' ,
152+ run : () => {
153+ completion ! .trigger ()
154+ }
155+ })
156+ } catch (error ) {
157+ // eslint-disable-next-line no-console
158+ console .error (' ❌ AI 补全注册失败:' , error )
159+ }
155160 }
156161 }
157162
158163 onBeforeUnmount (() => {
159- completion ?.deregister ?.()
164+ // 清理 AI 补全
165+ if (completion ) {
166+ completion .deregister ()
167+ }
160168 ;(state .completionProvider as any )?.forEach ?.((provider : any ) => {
161169 provider ?.dispose ?.()
162170 })
0 commit comments