@@ -8,11 +8,12 @@ import {
8
8
IAIBackService ,
9
9
CancellationToken ,
10
10
ChatResponse ,
11
+ ECodeEditsSourceTyping ,
11
12
} from '@opensumi/ide-core-common' ;
12
13
import { ClientAppContribution , Domain , getIcon } from '@opensumi/ide-core-browser' ;
13
14
import { 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' ;
16
17
import { MessageService } from '@opensumi/ide-overlay/lib/browser/message.service' ;
17
18
import { BaseTerminalDetectionLineMatcher , JavaMatcher , MatcherType , NodeMatcher , NPMMatcher , ShellMatcher , TSCMatcher } from '@opensumi/ide-ai-native/lib/browser/contrib/terminal/matcher' ;
18
19
import { ChatService } from '@opensumi/ide-ai-native/lib/browser/chat/chat.api.service' ;
@@ -22,12 +23,13 @@ import { listenReadable } from '@opensumi/ide-utils/lib/stream';
22
23
23
24
import { AI_MENU_BAR_LEFT_ACTION , EInlineOperation } from './constants'
24
25
import { 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'
26
27
import { CommandRender } from './command/command-render'
27
28
import { AITerminalDebugService } from './ai-terminal-debug.service'
28
29
import { InlineChatOperationModel } from './inline-chat-operation'
29
30
import { AICommandService } from './command/command.service'
30
31
import hiPng from './assets/hi.png'
32
+ import { ILinterErrorData } from '@opensumi/ide-ai-native/lib/browser/contrib/intelligent-completions/source/lint-error.source' ;
31
33
32
34
@Domain ( ComponentContribution , AINativeCoreContribution )
33
35
export class AINativeContribution implements ComponentContribution , AINativeCoreContribution {
@@ -551,4 +553,47 @@ ${editor.getModel()!.getValueInRange(editRange)}
551
553
} ,
552
554
} ) ;
553
555
}
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
+ }
554
599
}
0 commit comments