@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.
Files changed (197) hide show
  1. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  2. package/lib/browser/ai-core.contribution.js +4 -9
  3. package/lib/browser/ai-core.contribution.js.map +1 -1
  4. package/lib/browser/chat/apply.service.d.ts +0 -3
  5. package/lib/browser/chat/apply.service.d.ts.map +1 -1
  6. package/lib/browser/chat/apply.service.js +0 -47
  7. package/lib/browser/chat/apply.service.js.map +1 -1
  8. package/lib/browser/chat/chat-manager.service.d.ts +0 -1
  9. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  10. package/lib/browser/chat/chat-manager.service.js +3 -9
  11. package/lib/browser/chat/chat-manager.service.js.map +1 -1
  12. package/lib/browser/chat/chat-model.d.ts +1 -8
  13. package/lib/browser/chat/chat-model.d.ts.map +1 -1
  14. package/lib/browser/chat/chat-model.js +76 -113
  15. package/lib/browser/chat/chat-model.js.map +1 -1
  16. package/lib/browser/chat/chat-proxy.service.d.ts +2 -0
  17. package/lib/browser/chat/chat-proxy.service.d.ts.map +1 -1
  18. package/lib/browser/chat/chat-proxy.service.js +57 -50
  19. package/lib/browser/chat/chat-proxy.service.js.map +1 -1
  20. package/lib/browser/chat/chat.feature.registry.d.ts +1 -4
  21. package/lib/browser/chat/chat.feature.registry.d.ts.map +1 -1
  22. package/lib/browser/chat/chat.feature.registry.js +0 -6
  23. package/lib/browser/chat/chat.feature.registry.js.map +1 -1
  24. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  25. package/lib/browser/chat/chat.view.js +10 -51
  26. package/lib/browser/chat/chat.view.js.map +1 -1
  27. package/lib/browser/components/ChatEditor.js +2 -2
  28. package/lib/browser/components/ChatEditor.js.map +1 -1
  29. package/lib/browser/components/ChatHistory.d.ts.map +1 -1
  30. package/lib/browser/components/ChatHistory.js +1 -2
  31. package/lib/browser/components/ChatHistory.js.map +1 -1
  32. package/lib/browser/components/ChatMentionInput.d.ts.map +1 -1
  33. package/lib/browser/components/ChatMentionInput.js +28 -124
  34. package/lib/browser/components/ChatMentionInput.js.map +1 -1
  35. package/lib/browser/components/ChatToolRender.d.ts.map +1 -1
  36. package/lib/browser/components/ChatToolRender.js +2 -7
  37. package/lib/browser/components/ChatToolRender.js.map +1 -1
  38. package/lib/browser/components/ChatToolRender.module.less +0 -25
  39. package/lib/browser/components/components.module.less +0 -7
  40. package/lib/browser/components/mention-input/mention-input.d.ts.map +1 -1
  41. package/lib/browser/components/mention-input/mention-input.js +13 -155
  42. package/lib/browser/components/mention-input/mention-input.js.map +1 -1
  43. package/lib/browser/components/mention-input/mention-input.module.less +0 -165
  44. package/lib/browser/components/mention-input/types.d.ts +1 -15
  45. package/lib/browser/components/mention-input/types.d.ts.map +1 -1
  46. package/lib/browser/components/mention-input/types.js +0 -1
  47. package/lib/browser/components/mention-input/types.js.map +1 -1
  48. package/lib/browser/components/utils.d.ts +2 -2
  49. package/lib/browser/context/llm-context.service.d.ts +2 -21
  50. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  51. package/lib/browser/context/llm-context.service.js +20 -162
  52. package/lib/browser/context/llm-context.service.js.map +1 -1
  53. package/lib/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.d.ts.map +1 -1
  54. package/lib/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.js.map +1 -1
  55. package/lib/browser/contrib/intelligent-completions/diff-computer.js +1 -1
  56. package/lib/browser/contrib/intelligent-completions/diff-computer.js.map +1 -1
  57. package/lib/browser/contrib/terminal/terminal.feature.registry.js.map +1 -1
  58. package/lib/browser/index.d.ts.map +1 -1
  59. package/lib/browser/index.js +0 -7
  60. package/lib/browser/index.js.map +1 -1
  61. package/lib/browser/layout/ai-layout.d.ts.map +1 -1
  62. package/lib/browser/layout/ai-layout.js +4 -6
  63. package/lib/browser/layout/ai-layout.js.map +1 -1
  64. package/lib/browser/layout/tabbar.view.d.ts +1 -1
  65. package/lib/browser/layout/tabbar.view.d.ts.map +1 -1
  66. package/lib/browser/layout/tabbar.view.js +12 -5
  67. package/lib/browser/layout/tabbar.view.js.map +1 -1
  68. package/lib/browser/mcp/base-apply.service.d.ts +4 -5
  69. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  70. package/lib/browser/mcp/base-apply.service.js +5 -23
  71. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  72. package/lib/browser/mcp/mcp-server-proxy.service.d.ts +1 -3
  73. package/lib/browser/mcp/mcp-server-proxy.service.d.ts.map +1 -1
  74. package/lib/browser/mcp/mcp-server-proxy.service.js +0 -4
  75. package/lib/browser/mcp/mcp-server-proxy.service.js.map +1 -1
  76. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  77. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.js.map +1 -1
  78. package/lib/browser/mcp/tools/handlers/ListDir.js.map +1 -1
  79. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  80. package/lib/browser/model/msg-history-manager.d.ts +1 -47
  81. package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
  82. package/lib/browser/model/msg-history-manager.js +2 -127
  83. package/lib/browser/model/msg-history-manager.js.map +1 -1
  84. package/lib/browser/preferences/schema.d.ts.map +1 -1
  85. package/lib/browser/preferences/schema.js +0 -5
  86. package/lib/browser/preferences/schema.js.map +1 -1
  87. package/lib/browser/types.d.ts +1 -12
  88. package/lib/browser/types.d.ts.map +1 -1
  89. package/lib/browser/types.js.map +1 -1
  90. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts.map +1 -1
  91. package/lib/browser/widget/inline-stream-diff/live-preview.component.js.map +1 -1
  92. package/lib/common/index.d.ts +1 -5
  93. package/lib/common/index.d.ts.map +1 -1
  94. package/lib/common/index.js +0 -2
  95. package/lib/common/index.js.map +1 -1
  96. package/lib/common/llm-context.d.ts +0 -19
  97. package/lib/common/llm-context.d.ts.map +1 -1
  98. package/lib/common/llm-context.js.map +1 -1
  99. package/lib/common/prompts/context-prompt-provider.d.ts +2 -0
  100. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  101. package/lib/common/prompts/context-prompt-provider.js +29 -35
  102. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  103. package/lib/common/types.d.ts +0 -21
  104. package/lib/common/types.d.ts.map +1 -1
  105. package/lib/common/types.js.map +1 -1
  106. package/lib/common/utils.d.ts +0 -1
  107. package/lib/common/utils.d.ts.map +1 -1
  108. package/lib/common/utils.js +2 -5
  109. package/lib/common/utils.js.map +1 -1
  110. package/lib/node/base-language-model.d.ts +1 -2
  111. package/lib/node/base-language-model.d.ts.map +1 -1
  112. package/lib/node/base-language-model.js +1 -10
  113. package/lib/node/base-language-model.js.map +1 -1
  114. package/lib/node/mcp/sumi-mcp-server.d.ts +1 -3
  115. package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
  116. package/lib/node/mcp/sumi-mcp-server.js +1 -7
  117. package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
  118. package/lib/node/mcp-server-manager-impl.d.ts +1 -3
  119. package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
  120. package/lib/node/mcp-server-manager-impl.js +2 -14
  121. package/lib/node/mcp-server-manager-impl.js.map +1 -1
  122. package/package.json +24 -25
  123. package/src/browser/ai-core.contribution.ts +4 -14
  124. package/src/browser/chat/apply.service.ts +1 -62
  125. package/src/browser/chat/chat-manager.service.ts +7 -16
  126. package/src/browser/chat/chat-model.ts +73 -130
  127. package/src/browser/chat/chat-proxy.service.ts +81 -68
  128. package/src/browser/chat/chat.feature.registry.ts +1 -17
  129. package/src/browser/chat/chat.view.tsx +12 -74
  130. package/src/browser/components/ChatEditor.tsx +1 -1
  131. package/src/browser/components/ChatHistory.tsx +1 -2
  132. package/src/browser/components/ChatMentionInput.tsx +32 -144
  133. package/src/browser/components/ChatToolRender.module.less +0 -25
  134. package/src/browser/components/ChatToolRender.tsx +2 -10
  135. package/src/browser/components/components.module.less +0 -7
  136. package/src/browser/components/mention-input/mention-input.module.less +0 -165
  137. package/src/browser/components/mention-input/mention-input.tsx +29 -244
  138. package/src/browser/components/mention-input/types.ts +0 -15
  139. package/src/browser/context/llm-context.service.ts +21 -182
  140. package/src/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.ts +1 -1
  141. package/src/browser/contrib/intelligent-completions/diff-computer.ts +1 -1
  142. package/src/browser/contrib/terminal/terminal.feature.registry.ts +1 -1
  143. package/src/browser/index.ts +0 -8
  144. package/src/browser/layout/ai-layout.tsx +8 -12
  145. package/src/browser/layout/tabbar.view.tsx +23 -10
  146. package/src/browser/mcp/base-apply.service.ts +10 -30
  147. package/src/browser/mcp/mcp-server-proxy.service.ts +1 -6
  148. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +1 -1
  149. package/src/browser/mcp/tools/getOpenEditorFileDiagnostics.ts +1 -1
  150. package/src/browser/mcp/tools/handlers/ListDir.ts +1 -1
  151. package/src/browser/mcp/tools/runTerminalCmd.ts +1 -1
  152. package/src/browser/model/msg-history-manager.ts +2 -181
  153. package/src/browser/preferences/schema.ts +0 -5
  154. package/src/browser/types.ts +0 -18
  155. package/src/browser/widget/inline-stream-diff/live-preview.component.tsx +1 -0
  156. package/src/common/index.ts +1 -6
  157. package/src/common/llm-context.ts +0 -23
  158. package/src/common/prompts/context-prompt-provider.ts +40 -55
  159. package/src/common/types.ts +0 -18
  160. package/src/common/utils.ts +1 -4
  161. package/src/node/base-language-model.ts +13 -10
  162. package/src/node/mcp/sumi-mcp-server.ts +2 -10
  163. package/src/node/mcp-server-manager-impl.ts +2 -17
  164. package/lib/browser/rules/rules.contribution.d.ts +0 -29
  165. package/lib/browser/rules/rules.contribution.d.ts.map +0 -1
  166. package/lib/browser/rules/rules.contribution.js +0 -94
  167. package/lib/browser/rules/rules.contribution.js.map +0 -1
  168. package/lib/browser/rules/rules.module.less +0 -174
  169. package/lib/browser/rules/rules.service.d.ts +0 -25
  170. package/lib/browser/rules/rules.service.d.ts.map +0 -1
  171. package/lib/browser/rules/rules.service.js +0 -180
  172. package/lib/browser/rules/rules.service.js.map +0 -1
  173. package/lib/browser/rules/rules.view.d.ts +0 -3
  174. package/lib/browser/rules/rules.view.d.ts.map +0 -1
  175. package/lib/browser/rules/rules.view.js +0 -76
  176. package/lib/browser/rules/rules.view.js.map +0 -1
  177. package/lib/common/MDC_PARSER_README.md +0 -171
  178. package/lib/common/image-compression.d.ts +0 -25
  179. package/lib/common/image-compression.d.ts.map +0 -1
  180. package/lib/common/image-compression.js +0 -153
  181. package/lib/common/image-compression.js.map +0 -1
  182. package/lib/common/mdc-parser.d.ts +0 -60
  183. package/lib/common/mdc-parser.d.ts.map +0 -1
  184. package/lib/common/mdc-parser.js +0 -246
  185. package/lib/common/mdc-parser.js.map +0 -1
  186. package/lib/common/prompts/system-prompt.d.ts +0 -2
  187. package/lib/common/prompts/system-prompt.d.ts.map +0 -1
  188. package/lib/common/prompts/system-prompt.js +0 -5
  189. package/lib/common/prompts/system-prompt.js.map +0 -1
  190. package/src/browser/rules/rules.contribution.ts +0 -105
  191. package/src/browser/rules/rules.module.less +0 -174
  192. package/src/browser/rules/rules.service.ts +0 -189
  193. package/src/browser/rules/rules.view.tsx +0 -127
  194. package/src/common/MDC_PARSER_README.md +0 -171
  195. package/src/common/image-compression.ts +0 -174
  196. package/src/common/mdc-parser.ts +0 -295
  197. 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-1749175927.0",
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-1749175927.0",
28
- "@opensumi/ide-components": "3.9.1-next-1749175927.0",
29
- "@opensumi/ide-connection": "3.9.1-next-1749175927.0",
30
- "@opensumi/ide-core-common": "3.9.1-next-1749175927.0",
31
- "@opensumi/ide-core-node": "3.9.1-next-1749175927.0",
32
- "@opensumi/ide-debug": "3.9.1-next-1749175927.0",
33
- "@opensumi/ide-design": "3.9.1-next-1749175927.0",
34
- "@opensumi/ide-editor": "3.9.1-next-1749175927.0",
35
- "@opensumi/ide-file-search": "3.9.1-next-1749175927.0",
36
- "@opensumi/ide-file-service": "3.9.1-next-1749175927.0",
37
- "@opensumi/ide-main-layout": "3.9.1-next-1749175927.0",
38
- "@opensumi/ide-markers": "3.9.1-next-1749175927.0",
39
- "@opensumi/ide-monaco": "3.9.1-next-1749175927.0",
40
- "@opensumi/ide-outline": "3.9.1-next-1749175927.0",
41
- "@opensumi/ide-overlay": "3.9.1-next-1749175927.0",
42
- "@opensumi/ide-preferences": "3.9.1-next-1749175927.0",
43
- "@opensumi/ide-quick-open": "3.9.1-next-1749175927.0",
44
- "@opensumi/ide-search": "3.9.1-next-1749175927.0",
45
- "@opensumi/ide-terminal-next": "3.9.1-next-1749175927.0",
46
- "@opensumi/ide-theme": "3.9.1-next-1749175927.0",
47
- "@opensumi/ide-utils": "3.9.1-next-1749175927.0",
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-1749175927.0"
64
+ "@opensumi/ide-core-browser": "3.9.1-next-1749196667.0"
66
65
  },
67
- "gitHead": "c3be72c306e4c3b8ff04f505a6886625dc22927d"
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, tabbarConfig);
817
+ registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRendererWithTab);
822
818
  } else {
823
- registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRenderer, tabbarConfig);
819
+ registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRenderer);
824
820
  }
825
821
 
826
822
  if (this.designLayoutConfig.useMergeRightWithLeftPanel) {
827
- registry.registerSlotRenderer(
828
- SlotLocation.view,
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 { ChatFeatureRegistryToken, IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
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
- this.chatFeatureRegistry,
93
- {
94
- sessionId: item.sessionId,
95
- history: new MsgHistoryManager(this.chatFeatureRegistry, item.history),
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 { ChatFeatureRegistry } from './chat.feature.registry';
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(this.chatFeatureRegistry);
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
- private processMemorySummaries(): CoreMessage[] {
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
- // MsgHistoryManager 获取消息,并过滤掉已总结的消息
424
- const recentMessages = this.history
425
- .getMessages()
426
- .filter((msg) => !msg.isSummarized)
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.content,
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
- const additional = this.history.getMessageAdditional(message.id);
437
- if (additional?.response) {
438
- const response = additional.response;
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: response.kind === 'markdownContent' ? response.content.value : response.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
- return history;
451
- }
452
-
453
- private limitTokens(history: CoreMessage[], contextWindow?: number): CoreMessage[] {
454
- if (!contextWindow) {
455
- return history;
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 {