@@ -8,11 +8,12 @@ import {
88 IAIBackService ,
99 CancellationToken ,
1010 ChatResponse ,
11+ ECodeEditsSourceTyping ,
1112} from '@opensumi/ide-core-common' ;
1213import { ClientAppContribution , Domain , getIcon } from '@opensumi/ide-core-browser' ;
1314import { ComponentContribution , ComponentRegistry } from '@opensumi/ide-core-browser/lib/layout' ;
14- import { AINativeCoreContribution , ERunStrategy , IChatFeatureRegistry , IInlineChatFeatureRegistry , IProblemFixContext , IProblemFixProviderRegistry , IRenameCandidatesProviderRegistry , ITerminalProviderRegistry , TChatSlashCommandSend , TerminalSuggestionReadableStream } from '@opensumi/ide-ai-native/lib/browser/types' ;
15- import { ICodeEditor , MarkdownString , NewSymbolNameTag } from '@opensumi/ide-monaco' ;
15+ import { AINativeCoreContribution , ERunStrategy , IChatFeatureRegistry , IInlineChatFeatureRegistry , IIntelligentCompletionsRegistry , IProblemFixContext , IProblemFixProviderRegistry , IRenameCandidatesProviderRegistry , ITerminalProviderRegistry , TChatSlashCommandSend , TerminalSuggestionReadableStream } from '@opensumi/ide-ai-native/lib/browser/types' ;
16+ import { ICodeEditor , MarkdownString , NewSymbolNameTag , Range } from '@opensumi/ide-monaco' ;
1617import { MessageService } from '@opensumi/ide-overlay/lib/browser/message.service' ;
1718import { BaseTerminalDetectionLineMatcher , JavaMatcher , MatcherType , NodeMatcher , NPMMatcher , ShellMatcher , TSCMatcher } from '@opensumi/ide-ai-native/lib/browser/contrib/terminal/matcher' ;
1819import { ChatService } from '@opensumi/ide-ai-native/lib/browser/chat/chat.api.service' ;
@@ -22,12 +23,13 @@ import { listenReadable } from '@opensumi/ide-utils/lib/stream';
2223
2324import { AI_MENU_BAR_LEFT_ACTION , EInlineOperation } from './constants'
2425import { LeftToolbar } from './components/left-toolbar'
25- import { explainPrompt , testPrompt , optimizePrompt , detectIntentPrompt , RenamePromptManager , terminalCommandSuggestionPrompt } from './prompt'
26+ import { explainPrompt , testPrompt , optimizePrompt , detectIntentPrompt , RenamePromptManager , terminalCommandSuggestionPrompt , codeEditsLintErrorPrompt } from './prompt'
2627import { CommandRender } from './command/command-render'
2728import { AITerminalDebugService } from './ai-terminal-debug.service'
2829import { InlineChatOperationModel } from './inline-chat-operation'
2930import { AICommandService } from './command/command.service'
3031import hiPng from './assets/hi.png'
32+ import { ILinterErrorData } from '@opensumi/ide-ai-native/lib/browser/contrib/intelligent-completions/source/lint-error.source' ;
3133
3234@Domain ( ComponentContribution , AINativeCoreContribution )
3335export class AINativeContribution implements ComponentContribution , AINativeCoreContribution {
@@ -551,4 +553,47 @@ ${editor.getModel()!.getValueInRange(editRange)}
551553 } ,
552554 } ) ;
553555 }
556+
557+ registerIntelligentCompletionFeature ( registry : IIntelligentCompletionsRegistry ) : void {
558+ registry . registerCodeEditsProvider ( async ( editor , _position , bean , token ) => {
559+ const model = editor . getModel ( ) ;
560+ if ( ! model ) {
561+ return ;
562+ }
563+
564+ if ( bean . typing === ECodeEditsSourceTyping . LinterErrors ) {
565+ const errors = ( bean . data as ILinterErrorData ) . errors ;
566+
567+ if ( errors . length === 0 ) {
568+ return ;
569+ }
570+
571+ const lastItem = errors [ errors . length - 1 ] ;
572+ const lastRange = lastItem . range ;
573+
574+ const waringRange = Range . fromPositions (
575+ { lineNumber : errors [ 0 ] . range . startPosition . lineNumber , column : 1 } ,
576+ { lineNumber : lastRange . endPosition . lineNumber , column : model ! . getLineMaxColumn ( lastRange . endPosition . lineNumber ) }
577+ ) ;
578+
579+ const prompt = codeEditsLintErrorPrompt ( model . getValueInRange ( waringRange ) , errors ) ;
580+ const response = await this . aiBackService . request ( prompt , { } , token ) ;
581+
582+ if ( response . data ) {
583+ const controller = new InlineChatController ( { enableCodeblockRender : true } ) ;
584+ const codeData = controller [ 'calculateCodeBlocks' ] ( response . data ) ;
585+
586+ return {
587+ items : [
588+ {
589+ insertText : codeData ,
590+ range : waringRange
591+ }
592+ ]
593+ } ;
594+ }
595+ }
596+ return undefined ;
597+ } ) ;
598+ }
554599}
0 commit comments