@opensumi/ide-ai-native 3.8.1-next-1740735952.0 → 3.8.1-next-1741061006.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 (85) hide show
  1. package/lib/browser/ai-core.contribution.d.ts +4 -1
  2. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contribution.js +20 -1
  4. package/lib/browser/ai-core.contribution.js.map +1 -1
  5. package/lib/browser/chat/chat-manager.service.d.ts +1 -0
  6. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  7. package/lib/browser/chat/chat-manager.service.js +13 -0
  8. package/lib/browser/chat/chat-manager.service.js.map +1 -1
  9. package/lib/browser/chat/chat.internal.service.d.ts +1 -0
  10. package/lib/browser/chat/chat.internal.service.d.ts.map +1 -1
  11. package/lib/browser/chat/chat.internal.service.js +3 -0
  12. package/lib/browser/chat/chat.internal.service.js.map +1 -1
  13. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  14. package/lib/browser/chat/chat.view.js +22 -3
  15. package/lib/browser/chat/chat.view.js.map +1 -1
  16. package/lib/browser/components/ChatHistory.d.ts +0 -1
  17. package/lib/browser/components/ChatHistory.d.ts.map +1 -1
  18. package/lib/browser/components/ChatHistory.js +14 -14
  19. package/lib/browser/components/ChatHistory.js.map +1 -1
  20. package/lib/browser/components/ChatInput.d.ts.map +1 -1
  21. package/lib/browser/components/ChatInput.js.map +1 -1
  22. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js +1 -1
  23. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js.map +1 -1
  24. package/lib/browser/contrib/intelligent-completions/view/default.d.ts.map +1 -1
  25. package/lib/browser/contrib/intelligent-completions/view/default.js +6 -0
  26. package/lib/browser/contrib/intelligent-completions/view/default.js.map +1 -1
  27. package/lib/browser/mcp/base-apply.service.d.ts +31 -40
  28. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  29. package/lib/browser/mcp/base-apply.service.js +233 -167
  30. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  31. package/lib/browser/mcp/tools/components/EditFile.d.ts.map +1 -1
  32. package/lib/browser/mcp/tools/components/EditFile.js +55 -41
  33. package/lib/browser/mcp/tools/components/EditFile.js.map +1 -1
  34. package/lib/browser/mcp/tools/components/index.module.less +22 -3
  35. package/lib/browser/mcp/tools/editFile.js +1 -1
  36. package/lib/browser/mcp/tools/editFile.js.map +1 -1
  37. package/lib/browser/mcp/tools/handlers/EditFile.d.ts +5 -1
  38. package/lib/browser/mcp/tools/handlers/EditFile.d.ts.map +1 -1
  39. package/lib/browser/mcp/tools/handlers/EditFile.js +4 -4
  40. package/lib/browser/mcp/tools/handlers/EditFile.js.map +1 -1
  41. package/lib/browser/model/msg-history-manager.d.ts +1 -0
  42. package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
  43. package/lib/browser/model/msg-history-manager.js +12 -2
  44. package/lib/browser/model/msg-history-manager.js.map +1 -1
  45. package/lib/browser/types.d.ts +1 -1
  46. package/lib/browser/types.d.ts.map +1 -1
  47. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts +6 -0
  48. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -0
  49. package/lib/browser/widget/inline-diff/inline-diff-manager.js +27 -0
  50. package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -0
  51. package/lib/browser/widget/inline-diff/inline-diff-widget.module.less +12 -0
  52. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +2 -0
  53. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  54. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +11 -4
  55. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  56. package/lib/common/types.d.ts +17 -0
  57. package/lib/common/types.d.ts.map +1 -1
  58. package/lib/common/types.js.map +1 -1
  59. package/lib/node/base-language-model.d.ts +1 -1
  60. package/lib/node/base-language-model.d.ts.map +1 -1
  61. package/lib/node/base-language-model.js +54 -3
  62. package/lib/node/base-language-model.js.map +1 -1
  63. package/package.json +23 -23
  64. package/src/browser/ai-core.contribution.ts +25 -1
  65. package/src/browser/chat/chat-manager.service.ts +12 -0
  66. package/src/browser/chat/chat.internal.service.ts +4 -0
  67. package/src/browser/chat/chat.view.tsx +25 -3
  68. package/src/browser/components/ChatHistory.tsx +21 -15
  69. package/src/browser/components/ChatInput.tsx +0 -1
  70. package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +1 -1
  71. package/src/browser/contrib/intelligent-completions/view/default.ts +7 -0
  72. package/src/browser/mcp/base-apply.service.ts +266 -213
  73. package/src/browser/mcp/tools/components/EditFile.tsx +82 -60
  74. package/src/browser/mcp/tools/components/index.module.less +22 -3
  75. package/src/browser/mcp/tools/editFile.ts +2 -2
  76. package/src/browser/mcp/tools/handlers/EditFile.ts +4 -4
  77. package/src/browser/model/msg-history-manager.ts +12 -2
  78. package/src/browser/types.ts +1 -1
  79. package/src/browser/widget/inline-diff/inline-diff-manager.tsx +38 -0
  80. package/src/browser/widget/inline-diff/inline-diff-widget.module.less +12 -0
  81. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +13 -4
  82. package/src/common/types.ts +20 -0
  83. package/src/node/base-language-model.ts +63 -1
  84. /package/lib/browser/components/{chat-history.css → chat-history.module.less} +0 -0
  85. /package/src/browser/components/{chat-history.css → chat-history.module.less} +0 -0
@@ -1,3 +1,4 @@
1
+ import { IMarker } from '@opensumi/ide-core-browser';
1
2
  export declare enum NearestCodeBlockType {
2
3
  Block = "block",
3
4
  Line = "line"
@@ -40,4 +41,20 @@ export interface MCPTool {
40
41
  inputSchema: any;
41
42
  providerName: string;
42
43
  }
44
+ export interface CodeBlockData {
45
+ toolCallId: string;
46
+ codeEdit: string;
47
+ updatedCode?: string;
48
+ relativePath: string;
49
+ status: CodeBlockStatus;
50
+ iterationCount: number;
51
+ createdAt: number;
52
+ version: number;
53
+ instructions?: string;
54
+ applyResult?: {
55
+ diff: string;
56
+ diagnosticInfos: IMarker[];
57
+ };
58
+ }
59
+ export type CodeBlockStatus = 'generating' | 'pending' | 'success' | 'rejected' | 'failed' | 'cancelled';
43
60
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"AAAA,oBAAY,oBAAoB;IAC9B,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QACL,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,GAAG,EAAE;YACH,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AAGD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,GACR,OAAO,CAAC;QACT,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IAEH,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAEpE,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,oBAAY,oBAAoB;IAC9B,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QACL,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,GAAG,EAAE;YACH,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AAGD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,GACR,OAAO,CAAC;QACT,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IAEH,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAEpE,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,EAAE,OAAO,EAAE,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,uCAAe,CAAA;IACf,qCAAa,CAAA;AACf,CAAC,EAHW,oBAAoB,oCAApB,oBAAoB,QAG/B"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":";;;AAEA,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,uCAAe,CAAA;IACf,qCAAa,CAAA;AACf,CAAC,EAHW,oBAAoB,oCAApB,oBAAoB,QAG/B"}
@@ -9,6 +9,6 @@ export declare abstract class BaseLanguageModel {
9
9
  request(request: string, chatReadableStream: ChatReadableStream, options: IAIBackServiceOption, cancellationToken?: CancellationToken): Promise<any>;
10
10
  private convertToolRequestToAITool;
11
11
  protected abstract getModelIdentifier(provider: any, modelId?: string): any;
12
- protected handleStreamingRequest(provider: any, request: string, tools: ToolRequest[], chatReadableStream: ChatReadableStream, history?: IChatMessage[], modelId?: string, temperature?: number, topP?: number, topK?: number, providerOptions?: Record<string, any>, cancellationToken?: CancellationToken): Promise<any>;
12
+ protected handleStreamingRequest(provider: any, request: string, tools: ToolRequest[], chatReadableStream: ChatReadableStream, history?: IChatMessage[], modelId?: string, temperature?: number, topP?: number, topK?: number, providerOptions?: Record<string, any>, trimTexts?: [string, string], cancellationToken?: CancellationToken): Promise<any>;
13
13
  }
14
14
  //# sourceMappingURL=base-language-model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-language-model.d.ts","sourceRoot":"","sources":["../../src/node/base-language-model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,oBAAoB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EACL,8BAA8B,EAE9B,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAE5C,8BACsB,iBAAiB;IAErC,SAAS,CAAC,QAAQ,CAAC,6BAA6B,EAAE,8BAA8B,CAAC;IAEjF,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,GAAG;IAEzE,OAAO,CAAC,sBAAsB;IAexB,OAAO,CACX,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,oBAAoB,EAC7B,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,GAAG,CAAC;IA0Bf,OAAO,CAAC,0BAA0B;IAUlC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG;cAE3D,sBAAsB,CACpC,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,EAAE,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,GAAE,YAAY,EAAO,EAC5B,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrC,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,GAAG,CAAC;CAyFhB"}
1
+ {"version":3,"file":"base-language-model.d.ts","sourceRoot":"","sources":["../../src/node/base-language-model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,oBAAoB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EACL,8BAA8B,EAE9B,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAE5C,8BACsB,iBAAiB;IAErC,SAAS,CAAC,QAAQ,CAAC,6BAA6B,EAAE,8BAA8B,CAAC;IAEjF,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,GAAG;IAEzE,OAAO,CAAC,sBAAsB;IAexB,OAAO,CACX,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,oBAAoB,EAC7B,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,GAAG,CAAC;IA2Bf,OAAO,CAAC,0BAA0B;IAUlC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG;cAE3D,sBAAsB,CACpC,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,EAAE,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,GAAE,YAAY,EAAO,EAC5B,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,GAAG,CAAC;CAqJhB"}
@@ -29,7 +29,7 @@ let BaseLanguageModel = class BaseLanguageModel {
29
29
  const registry = this.toolInvocationRegistryManager.getRegistry(clientId);
30
30
  allFunctions = options.noTool ? [] : registry.getAllFunctions();
31
31
  }
32
- return this.handleStreamingRequest(provider, request, allFunctions, chatReadableStream, options.history || [], options.modelId, options.temperature, options.topP, options.topK, options.providerOptions, cancellationToken);
32
+ return this.handleStreamingRequest(provider, request, allFunctions, chatReadableStream, options.history || [], options.modelId, options.temperature, options.topP, options.topK, options.providerOptions, options.trimTexts, cancellationToken);
33
33
  }
34
34
  convertToolRequestToAITool(toolRequest) {
35
35
  return (0, ai_1.tool)({
@@ -39,7 +39,7 @@ let BaseLanguageModel = class BaseLanguageModel {
39
39
  execute: async (args, options) => await toolRequest.handler(JSON.stringify(args), options),
40
40
  });
41
41
  }
42
- async handleStreamingRequest(provider, request, tools, chatReadableStream, history = [], modelId, temperature, topP, topK, providerOptions, cancellationToken) {
42
+ async handleStreamingRequest(provider, request, tools, chatReadableStream, history = [], modelId, temperature, topP, topK, providerOptions, trimTexts, cancellationToken) {
43
43
  try {
44
44
  const aiTools = Object.fromEntries(tools.map((tool) => [tool.name, this.convertToolRequestToAITool(tool)]));
45
45
  const abortController = new AbortController();
@@ -68,9 +68,38 @@ let BaseLanguageModel = class BaseLanguageModel {
68
68
  topK: topK || 1,
69
69
  providerOptions,
70
70
  });
71
+ // 状态跟踪变量
72
+ let isFirstChunk = true;
73
+ let bufferedText = '';
74
+ const pendingLines = [];
71
75
  for await (const chunk of stream.fullStream) {
72
76
  if (chunk.type === 'text-delta') {
73
- chatReadableStream.emitData({ kind: 'content', content: chunk.textDelta });
77
+ if (trimTexts === null || trimTexts === void 0 ? void 0 : trimTexts.length) {
78
+ // 将收到的文本追加到缓冲区
79
+ bufferedText += chunk.textDelta;
80
+ // 处理第一个文本块的前缀(只处理一次)
81
+ if (isFirstChunk && bufferedText.includes(trimTexts[0])) {
82
+ bufferedText = bufferedText.substring(bufferedText.indexOf(trimTexts[0]) + trimTexts[0].length);
83
+ isFirstChunk = false;
84
+ }
85
+ // 检查是否有完整的行,并将它们添加到待发送行队列
86
+ const lines = bufferedText.split('\n');
87
+ // 最后一个元素可能是不完整的行,保留在缓冲区
88
+ bufferedText = lines.pop() || '';
89
+ // 将完整的行添加到待发送队列
90
+ if (lines.length > 0) {
91
+ pendingLines.push(...lines);
92
+ }
93
+ // 发送除最后几行外的所有行(保留足够的行以处理后缀)
94
+ while (pendingLines.length > 3) {
95
+ // 保留最后3行以确保能完整识别后缀
96
+ const lineToSend = pendingLines.shift() + '\n';
97
+ chatReadableStream.emitData({ kind: 'content', content: lineToSend });
98
+ }
99
+ }
100
+ else {
101
+ chatReadableStream.emitData({ kind: 'content', content: chunk.textDelta });
102
+ }
74
103
  }
75
104
  else if (chunk.type === 'tool-call') {
76
105
  chatReadableStream.emitData({
@@ -121,6 +150,28 @@ let BaseLanguageModel = class BaseLanguageModel {
121
150
  chatReadableStream.emitError(new Error(chunk.error));
122
151
  }
123
152
  }
153
+ if (trimTexts === null || trimTexts === void 0 ? void 0 : trimTexts[1]) {
154
+ // 完成处理所有块后,检查并发送剩余文本
155
+ // 将剩余缓冲区加入待发送行
156
+ if (bufferedText) {
157
+ pendingLines.push(bufferedText);
158
+ }
159
+ // 处理最后一行可能存在的后缀
160
+ if (pendingLines.length > 0) {
161
+ let lastLine = pendingLines[pendingLines.length - 1];
162
+ if (lastLine.endsWith(trimTexts[1])) {
163
+ // 移除后缀
164
+ lastLine = lastLine.substring(0, lastLine.length - trimTexts[1].length);
165
+ pendingLines[pendingLines.length - 1] = lastLine;
166
+ }
167
+ }
168
+ // 发送所有剩余的行
169
+ for (let i = 0; i < pendingLines.length; i++) {
170
+ const isLastLine = i === pendingLines.length - 1;
171
+ const lineToSend = pendingLines[i] + (isLastLine ? '' : '\n');
172
+ chatReadableStream.emitData({ kind: 'content', content: lineToSend });
173
+ }
174
+ }
124
175
  chatReadableStream.end();
125
176
  }
126
177
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"base-language-model.js","sourceRoot":"","sources":["../../src/node/base-language-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-language-model.js","sourceRoot":"","sources":["../../src/node/base-language-model.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-ai-native",
3
- "version": "3.8.1-next-1740735952.0",
3
+ "version": "3.8.1-next-1741061006.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -23,26 +23,26 @@
23
23
  "@ai-sdk/deepseek": "^0.1.11",
24
24
  "@ai-sdk/openai-compatible": "^0.1.11",
25
25
  "@modelcontextprotocol/sdk": "^1.3.1",
26
- "@opensumi/ide-addons": "3.8.1-next-1740735952.0",
27
- "@opensumi/ide-components": "3.8.1-next-1740735952.0",
28
- "@opensumi/ide-connection": "3.8.1-next-1740735952.0",
29
- "@opensumi/ide-core-common": "3.8.1-next-1740735952.0",
30
- "@opensumi/ide-core-node": "3.8.1-next-1740735952.0",
31
- "@opensumi/ide-debug": "3.8.1-next-1740735952.0",
32
- "@opensumi/ide-design": "3.8.1-next-1740735952.0",
33
- "@opensumi/ide-editor": "3.8.1-next-1740735952.0",
34
- "@opensumi/ide-file-search": "3.8.1-next-1740735952.0",
35
- "@opensumi/ide-file-service": "3.8.1-next-1740735952.0",
36
- "@opensumi/ide-main-layout": "3.8.1-next-1740735952.0",
37
- "@opensumi/ide-markers": "3.8.1-next-1740735952.0",
38
- "@opensumi/ide-monaco": "3.8.1-next-1740735952.0",
39
- "@opensumi/ide-overlay": "3.8.1-next-1740735952.0",
40
- "@opensumi/ide-preferences": "3.8.1-next-1740735952.0",
41
- "@opensumi/ide-search": "3.8.1-next-1740735952.0",
42
- "@opensumi/ide-terminal-next": "3.8.1-next-1740735952.0",
43
- "@opensumi/ide-theme": "3.8.1-next-1740735952.0",
44
- "@opensumi/ide-utils": "3.8.1-next-1740735952.0",
45
- "@opensumi/ide-workspace": "3.8.1-next-1740735952.0",
26
+ "@opensumi/ide-addons": "3.8.1-next-1741061006.0",
27
+ "@opensumi/ide-components": "3.8.1-next-1741061006.0",
28
+ "@opensumi/ide-connection": "3.8.1-next-1741061006.0",
29
+ "@opensumi/ide-core-common": "3.8.1-next-1741061006.0",
30
+ "@opensumi/ide-core-node": "3.8.1-next-1741061006.0",
31
+ "@opensumi/ide-debug": "3.8.1-next-1741061006.0",
32
+ "@opensumi/ide-design": "3.8.1-next-1741061006.0",
33
+ "@opensumi/ide-editor": "3.8.1-next-1741061006.0",
34
+ "@opensumi/ide-file-search": "3.8.1-next-1741061006.0",
35
+ "@opensumi/ide-file-service": "3.8.1-next-1741061006.0",
36
+ "@opensumi/ide-main-layout": "3.8.1-next-1741061006.0",
37
+ "@opensumi/ide-markers": "3.8.1-next-1741061006.0",
38
+ "@opensumi/ide-monaco": "3.8.1-next-1741061006.0",
39
+ "@opensumi/ide-overlay": "3.8.1-next-1741061006.0",
40
+ "@opensumi/ide-preferences": "3.8.1-next-1741061006.0",
41
+ "@opensumi/ide-search": "3.8.1-next-1741061006.0",
42
+ "@opensumi/ide-terminal-next": "3.8.1-next-1741061006.0",
43
+ "@opensumi/ide-theme": "3.8.1-next-1741061006.0",
44
+ "@opensumi/ide-utils": "3.8.1-next-1741061006.0",
45
+ "@opensumi/ide-workspace": "3.8.1-next-1741061006.0",
46
46
  "@xterm/xterm": "5.5.0",
47
47
  "ai": "^4.1.45",
48
48
  "ansi-regex": "^2.0.0",
@@ -57,7 +57,7 @@
57
57
  "zod-to-json-schema": "^3.24.1"
58
58
  },
59
59
  "devDependencies": {
60
- "@opensumi/ide-core-browser": "3.8.1-next-1740735952.0"
60
+ "@opensumi/ide-core-browser": "3.8.1-next-1741061006.0"
61
61
  },
62
- "gitHead": "146fbbde51d4fdad04edbdad51d77ad6eff2d48d"
62
+ "gitHead": "82226cbbc03f9b5b875d581216035e858c57163c"
63
63
  }
@@ -59,7 +59,11 @@ import {
59
59
  } from '@opensumi/ide-core-common';
60
60
  import { DESIGN_MENU_BAR_RIGHT } from '@opensumi/ide-design';
61
61
  import { IEditor, WorkbenchEditorService } from '@opensumi/ide-editor';
62
- import { BrowserEditorContribution, IEditorFeatureRegistry } from '@opensumi/ide-editor/lib/browser';
62
+ import {
63
+ BrowserEditorContribution,
64
+ EditorComponentRegistry,
65
+ IEditorFeatureRegistry,
66
+ } from '@opensumi/ide-editor/lib/browser';
63
67
  import { WorkbenchEditorServiceImpl } from '@opensumi/ide-editor/lib/browser/workbench-editor.service';
64
68
  import { IMainLayoutService } from '@opensumi/ide-main-layout';
65
69
  import { ISettingRegistry, SettingContribution } from '@opensumi/ide-preferences';
@@ -100,6 +104,7 @@ import {
100
104
  AIRightTabRenderer,
101
105
  } from './layout/tabbar.view';
102
106
  import { AIChatLogoAvatar } from './layout/view/avatar/avatar.view';
107
+ import { BaseApplyService } from './mcp/base-apply.service';
103
108
  import {
104
109
  AINativeCoreContribution,
105
110
  IChatFeatureRegistry,
@@ -116,6 +121,7 @@ import {
116
121
  import { InlineChatEditorController } from './widget/inline-chat/inline-chat-editor.controller';
117
122
  import { InlineChatFeatureRegistry } from './widget/inline-chat/inline-chat.feature.registry';
118
123
  import { InlineChatService } from './widget/inline-chat/inline-chat.service';
124
+ import { InlineDiffManager } from './widget/inline-diff/inline-diff-manager';
119
125
  import { InlineDiffController } from './widget/inline-diff/inline-diff.controller';
120
126
  import { InlineHintController } from './widget/inline-hint/inline-hint.controller';
121
127
  import { InlineInputController } from './widget/inline-input/inline-input.controller';
@@ -123,6 +129,8 @@ import { InlineInputService } from './widget/inline-input/inline-input.service';
123
129
  import { InlineStreamDiffService } from './widget/inline-stream-diff/inline-stream-diff.service';
124
130
  import { SumiLightBulbWidget } from './widget/light-bulb';
125
131
 
132
+ export const INLINE_DIFF_MANAGER_WIDGET_ID = 'inline-diff-manager-widget';
133
+
126
134
  @Domain(
127
135
  ClientAppContribution,
128
136
  BrowserEditorContribution,
@@ -237,6 +245,9 @@ export class AINativeBrowserContribution
237
245
  @Autowired(IChatInternalService)
238
246
  private readonly chatInternalService: ChatInternalService;
239
247
 
248
+ @Autowired(BaseApplyService)
249
+ private readonly applyService: BaseApplyService;
250
+
240
251
  constructor() {
241
252
  this.registerFeature();
242
253
  }
@@ -524,6 +535,19 @@ export class AINativeBrowserContribution
524
535
  });
525
536
  }
526
537
 
538
+ registerEditorComponent(registry: EditorComponentRegistry): void {
539
+ registry.registerEditorSideWidget({
540
+ id: INLINE_DIFF_MANAGER_WIDGET_ID,
541
+ component: InlineDiffManager,
542
+ displaysOnResource: (resource) => {
543
+ if (this.applyService.getUriPendingCodeBlock(resource.uri)) {
544
+ return true;
545
+ }
546
+ return false;
547
+ },
548
+ });
549
+ }
550
+
527
551
  registerCommands(commands: CommandRegistry): void {
528
552
  commands.registerCommand(AI_INLINE_CHAT_VISIBLE, {
529
553
  execute: (value: boolean) => {
@@ -9,6 +9,7 @@ import {
9
9
  IStorage,
10
10
  STORAGE_NAMESPACE,
11
11
  StorageProvider,
12
+ debounce,
12
13
  } from '@opensumi/ide-core-common';
13
14
  import { ChatMessageRole, IChatMessage, IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
14
15
 
@@ -89,6 +90,7 @@ export class ChatManagerService extends Disposable {
89
90
  const savedSessions = this.fromJSON(sessionsModelData);
90
91
  savedSessions.forEach((session) => {
91
92
  this.#sessionModels.set(session.sessionId, session);
93
+ this.listenSession(session);
92
94
  });
93
95
  await this.storageInitEmitter.fireAndAwait();
94
96
  }
@@ -100,6 +102,7 @@ export class ChatManagerService extends Disposable {
100
102
  startSession() {
101
103
  const model = new ChatModel();
102
104
  this.#sessionModels.set(model.sessionId, model);
105
+ this.listenSession(model);
103
106
  return model;
104
107
  }
105
108
 
@@ -196,6 +199,15 @@ export class ChatManagerService extends Disposable {
196
199
  }
197
200
  }
198
201
 
202
+ protected listenSession(session: ChatModel) {
203
+ this.addDispose(
204
+ session.history.onMessageAdditionalChange(() => {
205
+ this.saveSessions();
206
+ }),
207
+ );
208
+ }
209
+
210
+ @debounce(1000)
199
211
  protected saveSessions() {
200
212
  this._chatStorage.set('sessionModels', this.getSessions());
201
213
  }
@@ -94,6 +94,10 @@ export class ChatInternalService extends Disposable {
94
94
  return this.chatManagerService.getSessions();
95
95
  }
96
96
 
97
+ getSession(sessionId: string) {
98
+ return this.chatManagerService.getSession(sessionId);
99
+ }
100
+
97
101
  activateSession(sessionId: string) {
98
102
  const targetSession = this.chatManagerService.getSession(sessionId);
99
103
  if (!targetSession) {
@@ -89,6 +89,7 @@ export const AIChatView = () => {
89
89
  const layoutService = useInjectable<IMainLayoutService>(IMainLayoutService);
90
90
  const msgHistoryManager = aiChatService.sessionModel.history;
91
91
  const containerRef = React.useRef<HTMLDivElement>(null);
92
+ const autoScroll = React.useRef<boolean>(true);
92
93
  const chatInputRef = React.useRef<{ setInputValue: (v: string) => void } | null>(null);
93
94
  const dialogService = useInjectable<IDialogService>(IDialogService);
94
95
  const aiNativeConfigService = useInjectable<AINativeConfigService>(AINativeConfigService);
@@ -165,8 +166,29 @@ export const AIChatView = () => {
165
166
  [],
166
167
  );
167
168
 
169
+ const onDidWheel = React.useCallback(
170
+ (e: WheelEvent) => {
171
+ // 向上滚动
172
+ if (e.deltaY < 0) {
173
+ autoScroll.current = false;
174
+ } else {
175
+ autoScroll.current = true;
176
+ }
177
+ },
178
+ [autoScroll],
179
+ );
180
+
181
+ React.useEffect(() => {
182
+ if (containerRef.current) {
183
+ containerRef.current.addEventListener('wheel', onDidWheel);
184
+ return () => {
185
+ containerRef.current?.removeEventListener('wheel', onDidWheel);
186
+ };
187
+ }
188
+ }, [autoScroll]);
189
+
168
190
  const scrollToBottom = React.useCallback(() => {
169
- if (containerRef && containerRef.current) {
191
+ if (containerRef && containerRef.current && autoScroll.current) {
170
192
  const lastElement = containerRef.current.lastElementChild;
171
193
  if (lastElement) {
172
194
  lastElement.scrollIntoView({ behavior: 'smooth', block: 'end' });
@@ -176,7 +198,7 @@ export const AIChatView = () => {
176
198
  containerRef.current.classList.add(SCROLL_CLASSNAME);
177
199
  }
178
200
  }
179
- }, [containerRef]);
201
+ }, [containerRef, autoScroll]);
180
202
 
181
203
  const handleDispatchMessage = React.useCallback(
182
204
  (dispatch: TDispatchAction) => {
@@ -198,7 +220,7 @@ export const AIChatView = () => {
198
220
  disposer.addDispose(
199
221
  chatApiService.onScrollToBottom(() => {
200
222
  requestAnimationFrame(() => {
201
- scrollToBottom();
223
+ // scrollToBottom();
202
224
  });
203
225
  }),
204
226
  );
@@ -2,10 +2,11 @@ import cls from 'classnames';
2
2
  import React, { FC, memo, useCallback, useEffect, useRef, useState } from 'react';
3
3
 
4
4
  import { Icon, Input, Loading, Popover, PopoverPosition, PopoverTriggerType, getIcon } from '@opensumi/ide-components';
5
- import './chat-history.css';
6
5
  import { localize } from '@opensumi/ide-core-browser';
7
6
  import { EnhanceIcon } from '@opensumi/ide-core-browser/lib/components/ai-native';
8
7
 
8
+ import styles from './chat-history.module.less';
9
+
9
10
  export interface IChatHistoryItem {
10
11
  id: string;
11
12
  title: string;
@@ -162,22 +163,25 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
162
163
  (item: IChatHistoryItem) => (
163
164
  <div
164
165
  key={item.id}
165
- className={cls('dm-chat-history-item', item.id === currentId ? 'dm-chat-history-item-selected' : '')}
166
+ className={cls(
167
+ styles['dm-chat-history-item'],
168
+ item.id === currentId ? styles['dm-chat-history-item-selected'] : '',
169
+ )}
166
170
  onClick={() => handleHistoryItemSelect(item)}
167
171
  >
168
- <div className='dm-chat-history-item-content'>
172
+ <div className={styles['dm-chat-history-item-content']}>
169
173
  {item.loading ? (
170
174
  <Loading />
171
175
  ) : (
172
176
  <Icon icon='message' style={{ width: '16px', height: '16px', marginRight: 4 }} />
173
177
  )}
174
178
  {!historyTitleEditable?.[item.id] ? (
175
- <span id={`dm-chat-history-item-title-${item.id}`} className='dm-chat-history-item-title'>
179
+ <span id={`dm-chat-history-item-title-${item.id}`} className={styles['dm-chat-history-item-title']}>
176
180
  {item.title}
177
181
  </span>
178
182
  ) : (
179
183
  <Input
180
- className='dm-chat-history-item-title'
184
+ className={styles['dm-chat-history-item-title']}
181
185
  defaultValue={item.title}
182
186
  ref={inputRef}
183
187
  onPressEnter={(e: any) => {
@@ -187,7 +191,7 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
187
191
  />
188
192
  )}
189
193
  </div>
190
- <div className='dm-chat-history-item-actions'>
194
+ <div className={styles['dm-chat-history-item-actions']}>
191
195
  {/* <EditOutlined
192
196
  title={localize('aiNative.operate.chatHistory.edit')}
193
197
  style={{ marginRight: 8 }}
@@ -198,7 +202,7 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
198
202
  }}
199
203
  /> */}
200
204
  <EnhanceIcon
201
- className={cls('dm-chat-history-item-actions-delete', getIcon('delete'))}
205
+ className={cls(styles['dm-chat-history-item-actions-delete'], getIcon('delete'))}
202
206
  onClick={(e) => {
203
207
  e.preventDefault();
204
208
  e.stopPropagation();
@@ -237,10 +241,10 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
237
241
  value={searchValue}
238
242
  onChange={handleSearchChange}
239
243
  />
240
- <div className='dm-chat-history-list'>
244
+ <div className={styles['dm-chat-history-list']}>
241
245
  {groupedHistoryList.map((group) => (
242
246
  <div key={group.key} style={{ padding: '4px' }}>
243
- <div className='dm-chat-history-time'>{group.key}</div>
247
+ <div className={styles['dm-chat-history-time']}>{group.key}</div>
244
248
  {group.items.map(renderHistoryItem)}
245
249
  </div>
246
250
  ))}
@@ -253,11 +257,11 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
253
257
  const getPopupContainer = useCallback((triggerNode: HTMLElement) => triggerNode.parentElement!, []);
254
258
 
255
259
  return (
256
- <div className={cls('dm-chat-history-header', className)}>
257
- <div className='dm-chat-history-header-title'>
260
+ <div className={cls(styles['dm-chat-history-header'], className)}>
261
+ <div className={styles['dm-chat-history-header-title']}>
258
262
  <span>{title}</span>
259
263
  </div>
260
- <div className='dm-chat-history-header-actions'>
264
+ <div className={styles['dm-chat-history-header-actions']}>
261
265
  <Popover
262
266
  id='dm-chat-history-header-actions-history'
263
267
  content={renderHistory()}
@@ -267,10 +271,12 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
267
271
  getPopupContainer={getPopupContainer}
268
272
  >
269
273
  <div
270
- className='dm-chat-history-header-actions-history'
274
+ className={styles['dm-chat-history-header-actions-history']}
271
275
  title={localize('aiNative.operate.chatHistory.title')}
272
276
  >
273
- <EnhanceIcon className={cls('dm-chat-history-header-actions-history', 'codicon codicon-history')} />
277
+ <EnhanceIcon
278
+ className={cls(styles['dm-chat-history-header-actions-history'], 'codicon codicon-history')}
279
+ />
274
280
  </div>
275
281
  </Popover>
276
282
  <Popover
@@ -279,7 +285,7 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
279
285
  title={localize('aiNative.operate.newChat.title')}
280
286
  >
281
287
  <EnhanceIcon
282
- className={cls('dm-chat-history-header-actions-new', getIcon('plus'))}
288
+ className={cls(styles['dm-chat-history-header-actions-new'], getIcon('plus'))}
283
289
  onClick={handleNewChat}
284
290
  />
285
291
  </Popover>
@@ -15,7 +15,6 @@ import { ChatProxyService } from '../chat/chat-proxy.service';
15
15
  import { ChatFeatureRegistry } from '../chat/chat.feature.registry';
16
16
  import { IChatSlashCommandItem } from '../types';
17
17
 
18
- import { ChatContext } from './ChatContext';
19
18
  import styles from './components.module.less';
20
19
 
21
20
  const INSTRUCTION_BOTTOM = 8;
@@ -290,7 +290,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll
290
290
  const range = completionModel.items[0].range;
291
291
  if (position.lineNumber < range.startLineNumber || position.lineNumber > range.endLineNumber) {
292
292
  runWhenIdle(() => {
293
- this.discard.get();
293
+ this.hide();
294
294
  });
295
295
  }
296
296
  }
@@ -1,3 +1,5 @@
1
+ import { AI_CODE_EDITS_COMMANDS } from '@opensumi/ide-core-browser/lib/ai-native/command';
2
+ import { CommandService } from '@opensumi/ide-core-common';
1
3
  import {
2
4
  InlineCompletionContext,
3
5
  InlineCompletionTriggerKind,
@@ -27,6 +29,7 @@ import {
27
29
 
28
30
  import { CodeEditsResultValue, ICodeEdit, ICodeEditsResult } from '../index';
29
31
 
32
+
30
33
  import { BaseCodeEditsView } from './base';
31
34
 
32
35
  /**
@@ -115,6 +118,10 @@ export class DefaultCodeEditsView extends BaseCodeEditsView {
115
118
  return completionModel;
116
119
  },
117
120
  freeInlineCompletions: () => [],
121
+ handleRejection: (completions, item) => {
122
+ const commandService: CommandService = this.injector.get(CommandService);
123
+ commandService.executeCommand(AI_CODE_EDITS_COMMANDS.DISCARD.id);
124
+ },
118
125
  } as InlineCompletionsProvider<ICodeEditsResult<ICodeEdit>>,
119
126
  ],
120
127
  } as unknown as LanguageFeatureRegistry<InlineCompletionsProvider>,