@opensumi/ide-ai-native 3.9.1-next-1749175927.0 → 3.9.1-next-1749196667.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.
- package/lib/browser/ai-core.contribution.d.ts.map +1 -1
- package/lib/browser/ai-core.contribution.js +4 -9
- package/lib/browser/ai-core.contribution.js.map +1 -1
- package/lib/browser/chat/apply.service.d.ts +0 -3
- package/lib/browser/chat/apply.service.d.ts.map +1 -1
- package/lib/browser/chat/apply.service.js +0 -47
- package/lib/browser/chat/apply.service.js.map +1 -1
- package/lib/browser/chat/chat-manager.service.d.ts +0 -1
- package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
- package/lib/browser/chat/chat-manager.service.js +3 -9
- package/lib/browser/chat/chat-manager.service.js.map +1 -1
- package/lib/browser/chat/chat-model.d.ts +1 -8
- package/lib/browser/chat/chat-model.d.ts.map +1 -1
- package/lib/browser/chat/chat-model.js +76 -113
- package/lib/browser/chat/chat-model.js.map +1 -1
- package/lib/browser/chat/chat-proxy.service.d.ts +2 -0
- package/lib/browser/chat/chat-proxy.service.d.ts.map +1 -1
- package/lib/browser/chat/chat-proxy.service.js +57 -50
- package/lib/browser/chat/chat-proxy.service.js.map +1 -1
- package/lib/browser/chat/chat.feature.registry.d.ts +1 -4
- package/lib/browser/chat/chat.feature.registry.d.ts.map +1 -1
- package/lib/browser/chat/chat.feature.registry.js +0 -6
- package/lib/browser/chat/chat.feature.registry.js.map +1 -1
- package/lib/browser/chat/chat.view.d.ts.map +1 -1
- package/lib/browser/chat/chat.view.js +10 -51
- package/lib/browser/chat/chat.view.js.map +1 -1
- package/lib/browser/components/ChatEditor.js +2 -2
- package/lib/browser/components/ChatEditor.js.map +1 -1
- package/lib/browser/components/ChatHistory.d.ts.map +1 -1
- package/lib/browser/components/ChatHistory.js +1 -2
- package/lib/browser/components/ChatHistory.js.map +1 -1
- package/lib/browser/components/ChatMentionInput.d.ts.map +1 -1
- package/lib/browser/components/ChatMentionInput.js +28 -124
- package/lib/browser/components/ChatMentionInput.js.map +1 -1
- package/lib/browser/components/ChatToolRender.d.ts.map +1 -1
- package/lib/browser/components/ChatToolRender.js +2 -7
- package/lib/browser/components/ChatToolRender.js.map +1 -1
- package/lib/browser/components/ChatToolRender.module.less +0 -25
- package/lib/browser/components/components.module.less +0 -7
- package/lib/browser/components/mention-input/mention-input.d.ts.map +1 -1
- package/lib/browser/components/mention-input/mention-input.js +13 -155
- package/lib/browser/components/mention-input/mention-input.js.map +1 -1
- package/lib/browser/components/mention-input/mention-input.module.less +0 -165
- package/lib/browser/components/mention-input/types.d.ts +1 -15
- package/lib/browser/components/mention-input/types.d.ts.map +1 -1
- package/lib/browser/components/mention-input/types.js +0 -1
- package/lib/browser/components/mention-input/types.js.map +1 -1
- package/lib/browser/components/utils.d.ts +2 -2
- package/lib/browser/context/llm-context.service.d.ts +2 -21
- package/lib/browser/context/llm-context.service.d.ts.map +1 -1
- package/lib/browser/context/llm-context.service.js +20 -162
- package/lib/browser/context/llm-context.service.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/diff-computer.js +1 -1
- package/lib/browser/contrib/intelligent-completions/diff-computer.js.map +1 -1
- package/lib/browser/contrib/terminal/terminal.feature.registry.js.map +1 -1
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +0 -7
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/layout/ai-layout.d.ts.map +1 -1
- package/lib/browser/layout/ai-layout.js +4 -6
- package/lib/browser/layout/ai-layout.js.map +1 -1
- package/lib/browser/layout/tabbar.view.d.ts +1 -1
- package/lib/browser/layout/tabbar.view.d.ts.map +1 -1
- package/lib/browser/layout/tabbar.view.js +12 -5
- package/lib/browser/layout/tabbar.view.js.map +1 -1
- package/lib/browser/mcp/base-apply.service.d.ts +4 -5
- package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
- package/lib/browser/mcp/base-apply.service.js +5 -23
- package/lib/browser/mcp/base-apply.service.js.map +1 -1
- package/lib/browser/mcp/mcp-server-proxy.service.d.ts +1 -3
- package/lib/browser/mcp/mcp-server-proxy.service.d.ts.map +1 -1
- package/lib/browser/mcp/mcp-server-proxy.service.js +0 -4
- package/lib/browser/mcp/mcp-server-proxy.service.js.map +1 -1
- package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
- package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.js.map +1 -1
- package/lib/browser/mcp/tools/handlers/ListDir.js.map +1 -1
- package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
- package/lib/browser/model/msg-history-manager.d.ts +1 -47
- package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
- package/lib/browser/model/msg-history-manager.js +2 -127
- package/lib/browser/model/msg-history-manager.js.map +1 -1
- package/lib/browser/preferences/schema.d.ts.map +1 -1
- package/lib/browser/preferences/schema.js +0 -5
- package/lib/browser/preferences/schema.js.map +1 -1
- package/lib/browser/types.d.ts +1 -12
- package/lib/browser/types.d.ts.map +1 -1
- package/lib/browser/types.js.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.component.js.map +1 -1
- package/lib/common/index.d.ts +1 -5
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +0 -2
- package/lib/common/index.js.map +1 -1
- package/lib/common/llm-context.d.ts +0 -19
- package/lib/common/llm-context.d.ts.map +1 -1
- package/lib/common/llm-context.js.map +1 -1
- package/lib/common/prompts/context-prompt-provider.d.ts +2 -0
- package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
- package/lib/common/prompts/context-prompt-provider.js +29 -35
- package/lib/common/prompts/context-prompt-provider.js.map +1 -1
- package/lib/common/types.d.ts +0 -21
- package/lib/common/types.d.ts.map +1 -1
- package/lib/common/types.js.map +1 -1
- package/lib/common/utils.d.ts +0 -1
- package/lib/common/utils.d.ts.map +1 -1
- package/lib/common/utils.js +2 -5
- package/lib/common/utils.js.map +1 -1
- package/lib/node/base-language-model.d.ts +1 -2
- package/lib/node/base-language-model.d.ts.map +1 -1
- package/lib/node/base-language-model.js +1 -10
- package/lib/node/base-language-model.js.map +1 -1
- package/lib/node/mcp/sumi-mcp-server.d.ts +1 -3
- package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
- package/lib/node/mcp/sumi-mcp-server.js +1 -7
- package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
- package/lib/node/mcp-server-manager-impl.d.ts +1 -3
- package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
- package/lib/node/mcp-server-manager-impl.js +2 -14
- package/lib/node/mcp-server-manager-impl.js.map +1 -1
- package/package.json +24 -25
- package/src/browser/ai-core.contribution.ts +4 -14
- package/src/browser/chat/apply.service.ts +1 -62
- package/src/browser/chat/chat-manager.service.ts +7 -16
- package/src/browser/chat/chat-model.ts +73 -130
- package/src/browser/chat/chat-proxy.service.ts +81 -68
- package/src/browser/chat/chat.feature.registry.ts +1 -17
- package/src/browser/chat/chat.view.tsx +12 -74
- package/src/browser/components/ChatEditor.tsx +1 -1
- package/src/browser/components/ChatHistory.tsx +1 -2
- package/src/browser/components/ChatMentionInput.tsx +32 -144
- package/src/browser/components/ChatToolRender.module.less +0 -25
- package/src/browser/components/ChatToolRender.tsx +2 -10
- package/src/browser/components/components.module.less +0 -7
- package/src/browser/components/mention-input/mention-input.module.less +0 -165
- package/src/browser/components/mention-input/mention-input.tsx +29 -244
- package/src/browser/components/mention-input/types.ts +0 -15
- package/src/browser/context/llm-context.service.ts +21 -182
- package/src/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.ts +1 -1
- package/src/browser/contrib/intelligent-completions/diff-computer.ts +1 -1
- package/src/browser/contrib/terminal/terminal.feature.registry.ts +1 -1
- package/src/browser/index.ts +0 -8
- package/src/browser/layout/ai-layout.tsx +8 -12
- package/src/browser/layout/tabbar.view.tsx +23 -10
- package/src/browser/mcp/base-apply.service.ts +10 -30
- package/src/browser/mcp/mcp-server-proxy.service.ts +1 -6
- package/src/browser/mcp/tools/getDiagnosticsByPath.ts +1 -1
- package/src/browser/mcp/tools/getOpenEditorFileDiagnostics.ts +1 -1
- package/src/browser/mcp/tools/handlers/ListDir.ts +1 -1
- package/src/browser/mcp/tools/runTerminalCmd.ts +1 -1
- package/src/browser/model/msg-history-manager.ts +2 -181
- package/src/browser/preferences/schema.ts +0 -5
- package/src/browser/types.ts +0 -18
- package/src/browser/widget/inline-stream-diff/live-preview.component.tsx +1 -0
- package/src/common/index.ts +1 -6
- package/src/common/llm-context.ts +0 -23
- package/src/common/prompts/context-prompt-provider.ts +40 -55
- package/src/common/types.ts +0 -18
- package/src/common/utils.ts +1 -4
- package/src/node/base-language-model.ts +13 -10
- package/src/node/mcp/sumi-mcp-server.ts +2 -10
- package/src/node/mcp-server-manager-impl.ts +2 -17
- package/lib/browser/rules/rules.contribution.d.ts +0 -29
- package/lib/browser/rules/rules.contribution.d.ts.map +0 -1
- package/lib/browser/rules/rules.contribution.js +0 -94
- package/lib/browser/rules/rules.contribution.js.map +0 -1
- package/lib/browser/rules/rules.module.less +0 -174
- package/lib/browser/rules/rules.service.d.ts +0 -25
- package/lib/browser/rules/rules.service.d.ts.map +0 -1
- package/lib/browser/rules/rules.service.js +0 -180
- package/lib/browser/rules/rules.service.js.map +0 -1
- package/lib/browser/rules/rules.view.d.ts +0 -3
- package/lib/browser/rules/rules.view.d.ts.map +0 -1
- package/lib/browser/rules/rules.view.js +0 -76
- package/lib/browser/rules/rules.view.js.map +0 -1
- package/lib/common/MDC_PARSER_README.md +0 -171
- package/lib/common/image-compression.d.ts +0 -25
- package/lib/common/image-compression.d.ts.map +0 -1
- package/lib/common/image-compression.js +0 -153
- package/lib/common/image-compression.js.map +0 -1
- package/lib/common/mdc-parser.d.ts +0 -60
- package/lib/common/mdc-parser.d.ts.map +0 -1
- package/lib/common/mdc-parser.js +0 -246
- package/lib/common/mdc-parser.js.map +0 -1
- package/lib/common/prompts/system-prompt.d.ts +0 -2
- package/lib/common/prompts/system-prompt.d.ts.map +0 -1
- package/lib/common/prompts/system-prompt.js +0 -5
- package/lib/common/prompts/system-prompt.js.map +0 -1
- package/src/browser/rules/rules.contribution.ts +0 -105
- package/src/browser/rules/rules.module.less +0 -174
- package/src/browser/rules/rules.service.ts +0 -189
- package/src/browser/rules/rules.view.tsx +0 -127
- package/src/common/MDC_PARSER_README.md +0 -171
- package/src/common/image-compression.ts +0 -174
- package/src/common/mdc-parser.ts +0 -295
- package/src/common/prompts/system-prompt.ts +0 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensumi/ide-ai-native",
|
|
3
|
-
"version": "3.9.1-next-
|
|
3
|
+
"version": "3.9.1-next-1749196667.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"lib",
|
|
6
6
|
"src"
|
|
@@ -24,28 +24,27 @@
|
|
|
24
24
|
"@ai-sdk/openai": "^1.1.9",
|
|
25
25
|
"@ai-sdk/openai-compatible": "^0.1.11",
|
|
26
26
|
"@modelcontextprotocol/sdk": "^1.3.1",
|
|
27
|
-
"@opensumi/ide-addons": "3.9.1-next-
|
|
28
|
-
"@opensumi/ide-components": "3.9.1-next-
|
|
29
|
-
"@opensumi/ide-connection": "3.9.1-next-
|
|
30
|
-
"@opensumi/ide-core-common": "3.9.1-next-
|
|
31
|
-
"@opensumi/ide-core-node": "3.9.1-next-
|
|
32
|
-
"@opensumi/ide-debug": "3.9.1-next-
|
|
33
|
-
"@opensumi/ide-design": "3.9.1-next-
|
|
34
|
-
"@opensumi/ide-editor": "3.9.1-next-
|
|
35
|
-
"@opensumi/ide-file-search": "3.9.1-next-
|
|
36
|
-
"@opensumi/ide-file-service": "3.9.1-next-
|
|
37
|
-
"@opensumi/ide-main-layout": "3.9.1-next-
|
|
38
|
-
"@opensumi/ide-markers": "3.9.1-next-
|
|
39
|
-
"@opensumi/ide-monaco": "3.9.1-next-
|
|
40
|
-
"@opensumi/ide-outline": "3.9.1-next-
|
|
41
|
-
"@opensumi/ide-overlay": "3.9.1-next-
|
|
42
|
-
"@opensumi/ide-preferences": "3.9.1-next-
|
|
43
|
-
"@opensumi/ide-
|
|
44
|
-
"@opensumi/ide-
|
|
45
|
-
"@opensumi/ide-
|
|
46
|
-
"@opensumi/ide-
|
|
47
|
-
"@opensumi/ide-
|
|
48
|
-
"@opensumi/ide-workspace": "3.9.1-next-1749175927.0",
|
|
27
|
+
"@opensumi/ide-addons": "3.9.1-next-1749196667.0",
|
|
28
|
+
"@opensumi/ide-components": "3.9.1-next-1749196667.0",
|
|
29
|
+
"@opensumi/ide-connection": "3.9.1-next-1749196667.0",
|
|
30
|
+
"@opensumi/ide-core-common": "3.9.1-next-1749196667.0",
|
|
31
|
+
"@opensumi/ide-core-node": "3.9.1-next-1749196667.0",
|
|
32
|
+
"@opensumi/ide-debug": "3.9.1-next-1749196667.0",
|
|
33
|
+
"@opensumi/ide-design": "3.9.1-next-1749196667.0",
|
|
34
|
+
"@opensumi/ide-editor": "3.9.1-next-1749196667.0",
|
|
35
|
+
"@opensumi/ide-file-search": "3.9.1-next-1749196667.0",
|
|
36
|
+
"@opensumi/ide-file-service": "3.9.1-next-1749196667.0",
|
|
37
|
+
"@opensumi/ide-main-layout": "3.9.1-next-1749196667.0",
|
|
38
|
+
"@opensumi/ide-markers": "3.9.1-next-1749196667.0",
|
|
39
|
+
"@opensumi/ide-monaco": "3.9.1-next-1749196667.0",
|
|
40
|
+
"@opensumi/ide-outline": "3.9.1-next-1749196667.0",
|
|
41
|
+
"@opensumi/ide-overlay": "3.9.1-next-1749196667.0",
|
|
42
|
+
"@opensumi/ide-preferences": "3.9.1-next-1749196667.0",
|
|
43
|
+
"@opensumi/ide-search": "3.9.1-next-1749196667.0",
|
|
44
|
+
"@opensumi/ide-terminal-next": "3.9.1-next-1749196667.0",
|
|
45
|
+
"@opensumi/ide-theme": "3.9.1-next-1749196667.0",
|
|
46
|
+
"@opensumi/ide-utils": "3.9.1-next-1749196667.0",
|
|
47
|
+
"@opensumi/ide-workspace": "3.9.1-next-1749196667.0",
|
|
49
48
|
"@xterm/xterm": "5.5.0",
|
|
50
49
|
"ai": "^4.1.45",
|
|
51
50
|
"ansi-regex": "^2.0.0",
|
|
@@ -62,7 +61,7 @@
|
|
|
62
61
|
"zod-to-json-schema": "^3.24.1"
|
|
63
62
|
},
|
|
64
63
|
"devDependencies": {
|
|
65
|
-
"@opensumi/ide-core-browser": "3.9.1-next-
|
|
64
|
+
"@opensumi/ide-core-browser": "3.9.1-next-1749196667.0"
|
|
66
65
|
},
|
|
67
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "ff3db69fd2b8ea0dc0843e0e8ae75af793e095bd"
|
|
68
67
|
}
|
|
@@ -24,7 +24,6 @@ import {
|
|
|
24
24
|
SlotLocation,
|
|
25
25
|
SlotRendererContribution,
|
|
26
26
|
SlotRendererRegistry,
|
|
27
|
-
TabbarBehaviorConfig,
|
|
28
27
|
getIcon,
|
|
29
28
|
localize,
|
|
30
29
|
} from '@opensumi/ide-core-browser';
|
|
@@ -814,24 +813,15 @@ export class AINativeBrowserContribution
|
|
|
814
813
|
}
|
|
815
814
|
|
|
816
815
|
registerRenderer(registry: SlotRendererRegistry): void {
|
|
817
|
-
const tabbarConfig: TabbarBehaviorConfig = {
|
|
818
|
-
isLatter: true,
|
|
819
|
-
};
|
|
820
816
|
if (this.designLayoutConfig.supportExternalChatPanel) {
|
|
821
|
-
registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRendererWithTab
|
|
817
|
+
registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRendererWithTab);
|
|
822
818
|
} else {
|
|
823
|
-
registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRenderer
|
|
819
|
+
registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRenderer);
|
|
824
820
|
}
|
|
825
821
|
|
|
826
822
|
if (this.designLayoutConfig.useMergeRightWithLeftPanel) {
|
|
827
|
-
registry.registerSlotRenderer(
|
|
828
|
-
|
|
829
|
-
AILeftTabRenderer,
|
|
830
|
-
Object.assign({}, tabbarConfig, {
|
|
831
|
-
isLatter: false,
|
|
832
|
-
}),
|
|
833
|
-
);
|
|
834
|
-
registry.registerSlotRenderer(SlotLocation.extendView, AIRightTabRenderer, tabbarConfig);
|
|
823
|
+
registry.registerSlotRenderer(SlotLocation.left, AILeftTabRenderer);
|
|
824
|
+
registry.registerSlotRenderer(SlotLocation.right, AIRightTabRenderer);
|
|
835
825
|
}
|
|
836
826
|
}
|
|
837
827
|
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import { Autowired, Injectable } from '@opensumi/di';
|
|
2
|
-
import {
|
|
3
|
-
AIBackSerivcePath,
|
|
4
|
-
CancellationTokenSource,
|
|
5
|
-
IAIBackService,
|
|
6
|
-
IChatProgress,
|
|
7
|
-
URI,
|
|
8
|
-
path,
|
|
9
|
-
} from '@opensumi/ide-core-browser';
|
|
10
|
-
import { CommandService } from '@opensumi/ide-core-common/lib/command';
|
|
2
|
+
import { AIBackSerivcePath, IAIBackService, IChatProgress, URI, path } from '@opensumi/ide-core-browser';
|
|
11
3
|
import { IEditorDocumentModelService } from '@opensumi/ide-editor/lib/browser';
|
|
12
|
-
import { CodeAction, CodeActionContext, CodeActionTriggerType, ICodeEditor } from '@opensumi/ide-monaco';
|
|
13
|
-
import { languageFeaturesService } from '@opensumi/ide-monaco/lib/browser/monaco-api/languages';
|
|
14
4
|
import { SumiReadableStream } from '@opensumi/ide-utils/lib/stream';
|
|
15
5
|
import { Range } from '@opensumi/monaco-editor-core';
|
|
16
6
|
|
|
@@ -20,59 +10,8 @@ import { BaseApplyService } from '../mcp/base-apply.service';
|
|
|
20
10
|
|
|
21
11
|
import { ChatProxyService } from './chat-proxy.service';
|
|
22
12
|
|
|
23
|
-
/**
|
|
24
|
-
* Filter code actions to only apply batch fixes
|
|
25
|
-
* Skip individual fixes as consecutive WorkspaceEdits may interfere with each other
|
|
26
|
-
* @param codeAction The code action to check
|
|
27
|
-
* @returns boolean indicating if the action is auto-fixable
|
|
28
|
-
*/
|
|
29
|
-
function isAutoFixable(codeAction: CodeAction): boolean {
|
|
30
|
-
return codeAction.title.toLowerCase().includes('all');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
13
|
@Injectable()
|
|
34
14
|
export class ApplyService extends BaseApplyService {
|
|
35
|
-
@Autowired(CommandService)
|
|
36
|
-
private commandService: CommandService;
|
|
37
|
-
|
|
38
|
-
protected async postApplyHandler(editor: ICodeEditor): Promise<void> {
|
|
39
|
-
const model = editor.getModel();
|
|
40
|
-
if (!model) {
|
|
41
|
-
return Promise.resolve();
|
|
42
|
-
}
|
|
43
|
-
const providers = languageFeaturesService.codeActionProvider.ordered(model);
|
|
44
|
-
|
|
45
|
-
if (!providers) {
|
|
46
|
-
return Promise.resolve();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const [provider] = providers;
|
|
50
|
-
const range = model.getFullModelRange();
|
|
51
|
-
const context: CodeActionContext = {
|
|
52
|
-
trigger: CodeActionTriggerType.Auto,
|
|
53
|
-
};
|
|
54
|
-
const ts = new CancellationTokenSource();
|
|
55
|
-
const actionList = await provider.provideCodeActions(model, range, context, ts.token);
|
|
56
|
-
|
|
57
|
-
// 提取所有可修复的代码操作
|
|
58
|
-
const fixableActions = actionList?.actions.filter(isAutoFixable) || [];
|
|
59
|
-
|
|
60
|
-
if (fixableActions.length === 0) {
|
|
61
|
-
return Promise.resolve();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// 执行所有可修复的代码操作
|
|
65
|
-
await Promise.allSettled(
|
|
66
|
-
fixableActions.map(async (action) => {
|
|
67
|
-
if (action.command) {
|
|
68
|
-
try {
|
|
69
|
-
await this.commandService.executeCommand(action.command.id, ...(action.command.arguments || []));
|
|
70
|
-
} catch (err) {}
|
|
71
|
-
}
|
|
72
|
-
}),
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
15
|
@Autowired(IEditorDocumentModelService)
|
|
77
16
|
private readonly modelService: IEditorDocumentModelService;
|
|
78
17
|
|
|
@@ -15,13 +15,12 @@ import {
|
|
|
15
15
|
StorageProvider,
|
|
16
16
|
debounce,
|
|
17
17
|
} from '@opensumi/ide-core-common';
|
|
18
|
-
import {
|
|
18
|
+
import { IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
|
|
19
19
|
|
|
20
20
|
import { IChatAgentService, IChatFollowup, IChatRequestMessage, IChatResponseErrorDetails } from '../../common';
|
|
21
21
|
import { MsgHistoryManager } from '../model/msg-history-manager';
|
|
22
22
|
|
|
23
23
|
import { ChatModel, ChatRequestModel, ChatResponseModel, IChatProgressResponseContent } from './chat-model';
|
|
24
|
-
import { ChatFeatureRegistry } from './chat.feature.registry';
|
|
25
24
|
|
|
26
25
|
interface ISessionModel {
|
|
27
26
|
sessionId: string;
|
|
@@ -79,23 +78,17 @@ export class ChatManagerService extends Disposable {
|
|
|
79
78
|
@Autowired(PreferenceService)
|
|
80
79
|
private preferenceService: PreferenceService;
|
|
81
80
|
|
|
82
|
-
@Autowired(ChatFeatureRegistryToken)
|
|
83
|
-
private chatFeatureRegistry: ChatFeatureRegistry;
|
|
84
|
-
|
|
85
81
|
private _chatStorage: IStorage;
|
|
86
82
|
|
|
87
83
|
protected fromJSON(data: ISessionModel[]) {
|
|
88
84
|
return data
|
|
89
85
|
.filter((item) => item.history.messages.length > 0)
|
|
90
86
|
.map((item) => {
|
|
91
|
-
const model = new ChatModel(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
modelId: item.modelId,
|
|
97
|
-
},
|
|
98
|
-
);
|
|
87
|
+
const model = new ChatModel({
|
|
88
|
+
sessionId: item.sessionId,
|
|
89
|
+
history: new MsgHistoryManager(item.history),
|
|
90
|
+
modelId: item.modelId,
|
|
91
|
+
});
|
|
99
92
|
const requests = item.requests.map(
|
|
100
93
|
(request) =>
|
|
101
94
|
new ChatRequestModel(
|
|
@@ -138,9 +131,7 @@ export class ChatManagerService extends Disposable {
|
|
|
138
131
|
}
|
|
139
132
|
|
|
140
133
|
startSession() {
|
|
141
|
-
const model = new ChatModel(
|
|
142
|
-
this.chatFeatureRegistry,
|
|
143
|
-
);
|
|
134
|
+
const model = new ChatModel();
|
|
144
135
|
this.#sessionModels.set(model.sessionId, model);
|
|
145
136
|
this.listenSession(model);
|
|
146
137
|
return model;
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
import { MsgHistoryManager } from '../model/msg-history-manager';
|
|
29
29
|
import { IChatSlashCommandItem } from '../types';
|
|
30
30
|
|
|
31
|
-
import {
|
|
31
|
+
import type { ImagePart, TextPart, ToolCallPart } from 'ai';
|
|
32
32
|
|
|
33
33
|
export type IChatProgressResponseContent =
|
|
34
34
|
| IChatMarkdownContent
|
|
@@ -296,13 +296,10 @@ export class ChatRequestModel implements IChatRequestModel {
|
|
|
296
296
|
export class ChatModel extends Disposable implements IChatModel {
|
|
297
297
|
private requestIdPool = 0;
|
|
298
298
|
|
|
299
|
-
constructor(
|
|
300
|
-
private chatFeatureRegistry: ChatFeatureRegistry,
|
|
301
|
-
initParams?: { sessionId?: string; history?: MsgHistoryManager; modelId?: string },
|
|
302
|
-
) {
|
|
299
|
+
constructor(initParams?: { sessionId?: string; history?: MsgHistoryManager; modelId?: string }) {
|
|
303
300
|
super();
|
|
304
301
|
this.#sessionId = initParams?.sessionId ?? uuid();
|
|
305
|
-
this.history = initParams?.history ?? new MsgHistoryManager(
|
|
302
|
+
this.history = initParams?.history ?? new MsgHistoryManager();
|
|
306
303
|
this.#modelId = initParams?.modelId;
|
|
307
304
|
}
|
|
308
305
|
|
|
@@ -339,142 +336,88 @@ export class ChatModel extends Disposable implements IChatModel {
|
|
|
339
336
|
this.#modelId = modelId;
|
|
340
337
|
}
|
|
341
338
|
|
|
342
|
-
|
|
343
|
-
const memorySummaries = this.history.getMemorySummaries();
|
|
344
|
-
if (memorySummaries.length === 0) {
|
|
345
|
-
return [];
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const processedSummaries = memorySummaries
|
|
349
|
-
.map((summary) => {
|
|
350
|
-
try {
|
|
351
|
-
const parsed = JSON.parse(summary.content);
|
|
352
|
-
return parsed.memory || parsed.content || summary.content;
|
|
353
|
-
} catch {
|
|
354
|
-
return summary.content;
|
|
355
|
-
}
|
|
356
|
-
})
|
|
357
|
-
.filter((content) => content && content !== 'no_memory_needed')
|
|
358
|
-
.filter((content, index, self) => self.indexOf(content) === index);
|
|
359
|
-
|
|
360
|
-
return processedSummaries.length > 0
|
|
361
|
-
? [
|
|
362
|
-
{
|
|
363
|
-
role: 'system',
|
|
364
|
-
content: '以下是之前对话的总结:\n' + processedSummaries.join('\n\n'),
|
|
365
|
-
},
|
|
366
|
-
]
|
|
367
|
-
: [];
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
private processToolCall(part: IChatToolContent, history: CoreMessage[]): void {
|
|
371
|
-
if (history[history.length - 1].role !== 'assistant') {
|
|
372
|
-
history.push({
|
|
373
|
-
role: 'assistant',
|
|
374
|
-
content: [],
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
const toolCallId = part.content.id;
|
|
379
|
-
const toolCallInfo = {
|
|
380
|
-
id: toolCallId,
|
|
381
|
-
name: part.content.function.name,
|
|
382
|
-
args: this.parseJsonSafely(part.content.function.arguments || '{}', 'tool call arguments'),
|
|
383
|
-
result: this.parseJsonSafely(part.content.result || '{}', 'tool result'),
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
this.history.addToolCall(toolCallInfo);
|
|
387
|
-
this.history.setMessageAdditional(part.content.id, { toolCallId });
|
|
388
|
-
|
|
389
|
-
const lastMessage = history[history.length - 1];
|
|
390
|
-
lastMessage.content = [
|
|
391
|
-
{
|
|
392
|
-
type: 'tool-call',
|
|
393
|
-
toolCallId: part.content.id,
|
|
394
|
-
toolName: part.content.function.name,
|
|
395
|
-
args: toolCallInfo.args,
|
|
396
|
-
},
|
|
397
|
-
];
|
|
398
|
-
|
|
399
|
-
history.push({
|
|
400
|
-
role: 'tool',
|
|
401
|
-
content: [
|
|
402
|
-
{
|
|
403
|
-
type: 'tool-result',
|
|
404
|
-
toolCallId: part.content.id,
|
|
405
|
-
toolName: part.content.function.name,
|
|
406
|
-
result: toolCallInfo.result,
|
|
407
|
-
},
|
|
408
|
-
],
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
private parseJsonSafely(jsonString: string, context: string): any {
|
|
413
|
-
try {
|
|
414
|
-
return JSON.parse(jsonString);
|
|
415
|
-
} catch (e) {
|
|
416
|
-
console.error(`[ChatModel] Failed to parse ${context}:`, e);
|
|
417
|
-
return {};
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
private processRecentMessages(): CoreMessage[] {
|
|
339
|
+
getMessageHistory(contextWindow?: number) {
|
|
422
340
|
const history: CoreMessage[] = [];
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
.slice(-this.history.memoryConfig.shortTermSize);
|
|
428
|
-
|
|
429
|
-
for (const message of recentMessages) {
|
|
341
|
+
for (const request of this.requests) {
|
|
342
|
+
if (!request.response.isComplete) {
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
430
345
|
history.push({
|
|
431
346
|
role: 'user',
|
|
432
|
-
content: message.
|
|
347
|
+
content: request.message.images?.length
|
|
348
|
+
? [
|
|
349
|
+
{ type: 'text', text: request.message.prompt },
|
|
350
|
+
...request.message.images.map((image) => ({ type: 'image', image: new URL(image) } as ImagePart)),
|
|
351
|
+
]
|
|
352
|
+
: request.message.prompt,
|
|
433
353
|
});
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
if (response.kind === 'toolCall') {
|
|
440
|
-
this.processToolCall(response, history);
|
|
441
|
-
} else {
|
|
354
|
+
for (const part of request.response.responseParts) {
|
|
355
|
+
if (part.kind === 'treeData' || part.kind === 'component') {
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
if (part.kind !== 'toolCall') {
|
|
442
359
|
history.push({
|
|
443
360
|
role: 'assistant',
|
|
444
|
-
content:
|
|
361
|
+
content: [
|
|
362
|
+
{
|
|
363
|
+
type: 'text',
|
|
364
|
+
text: part.kind === 'markdownContent' ? part.content.value : part.content,
|
|
365
|
+
},
|
|
366
|
+
],
|
|
367
|
+
});
|
|
368
|
+
} else {
|
|
369
|
+
// 直接开始toolCall场景
|
|
370
|
+
if (history[history.length - 1].role !== 'assistant') {
|
|
371
|
+
history.push({
|
|
372
|
+
role: 'assistant',
|
|
373
|
+
content: [],
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
(history[history.length - 1].content as Array<TextPart | ToolCallPart>).push({
|
|
377
|
+
type: 'tool-call',
|
|
378
|
+
toolCallId: part.content.id,
|
|
379
|
+
toolName: part.content.function.name,
|
|
380
|
+
args: (() => {
|
|
381
|
+
try {
|
|
382
|
+
return JSON.parse(part.content.function.arguments || '{}');
|
|
383
|
+
} catch (e) {
|
|
384
|
+
console.error('Failed to parse tool call arguments:', e);
|
|
385
|
+
return {};
|
|
386
|
+
}
|
|
387
|
+
})(),
|
|
388
|
+
});
|
|
389
|
+
history.push({
|
|
390
|
+
role: 'tool',
|
|
391
|
+
content: [
|
|
392
|
+
{
|
|
393
|
+
type: 'tool-result',
|
|
394
|
+
toolCallId: part.content.id,
|
|
395
|
+
toolName: part.content.function.name,
|
|
396
|
+
result: (() => {
|
|
397
|
+
try {
|
|
398
|
+
return JSON.parse(part.content.result || '{}');
|
|
399
|
+
} catch (e) {
|
|
400
|
+
console.error('Failed to parse tool result:', e);
|
|
401
|
+
return {};
|
|
402
|
+
}
|
|
403
|
+
})(),
|
|
404
|
+
},
|
|
405
|
+
],
|
|
445
406
|
});
|
|
446
407
|
}
|
|
447
408
|
}
|
|
448
409
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
let currentHistory = history;
|
|
459
|
-
let tokenCount = JSON.stringify(currentHistory).length / 3;
|
|
460
|
-
|
|
461
|
-
while (tokenCount > contextWindow && currentHistory.length > 1) {
|
|
462
|
-
if (currentHistory[0].role === 'system' && currentHistory.length > 2) {
|
|
463
|
-
currentHistory = [currentHistory[0], ...currentHistory.slice(2)];
|
|
464
|
-
} else {
|
|
465
|
-
currentHistory = currentHistory.slice(1);
|
|
410
|
+
if (contextWindow) {
|
|
411
|
+
while (this.#slicedMessageCount < history.length) {
|
|
412
|
+
// 简单的使用 JSON.stringify 计算 token 数量
|
|
413
|
+
const tokenCount = JSON.stringify(history.slice(this.#slicedMessageCount)).length / 3;
|
|
414
|
+
if (tokenCount <= contextWindow) {
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
this.#slicedMessageCount++;
|
|
466
418
|
}
|
|
467
|
-
tokenCount = JSON.stringify(currentHistory).length / 3;
|
|
468
419
|
}
|
|
469
|
-
|
|
470
|
-
return currentHistory;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
getMessageHistory(contextWindow?: number): CoreMessage[] {
|
|
474
|
-
const memorySummaries = this.processMemorySummaries();
|
|
475
|
-
const recentMessages = this.processRecentMessages();
|
|
476
|
-
const history = [...memorySummaries, ...recentMessages];
|
|
477
|
-
return this.limitTokens(history, contextWindow);
|
|
420
|
+
return history.slice(this.#slicedMessageCount);
|
|
478
421
|
}
|
|
479
422
|
|
|
480
423
|
addRequest(message: IChatRequestMessage): ChatRequestModel {
|