From 873d8bc7a13c26d4708536a4693c0e6b09b46d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Wed, 9 Oct 2024 14:53:16 +0800 Subject: [PATCH 01/42] feat(inline-diff): support hide accpet widget (#4066) --- .../src/browser/ai-core.contribution.ts | 29 ++++++++++--------- .../inline-diff/inline-diff-previewer.ts | 4 +++ .../inline-stream-diff.handler.tsx | 6 ++++ .../live-preview.component.tsx | 15 ++++++++++ .../live-preview.decoration.tsx | 18 +++++++++++- 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/packages/ai-native/src/browser/ai-core.contribution.ts b/packages/ai-native/src/browser/ai-core.contribution.ts index 260f74d00e..bf359220b8 100644 --- a/packages/ai-native/src/browser/ai-core.contribution.ts +++ b/packages/ai-native/src/browser/ai-core.contribution.ts @@ -491,20 +491,6 @@ export class AINativeBrowserContribution args: false, when: `editorFocus && ${InlineChatIsVisible.raw}`, }); - keybindings.registerKeybinding({ - command: AI_INLINE_DIFF_PARTIAL_EDIT.id, - keybinding: 'ctrl+y', - args: true, - priority: 100, - when: `editorTextFocus && ${InlineDiffPartialEditsIsVisible.raw}`, - }); - keybindings.registerKeybinding({ - command: AI_INLINE_DIFF_PARTIAL_EDIT.id, - keybinding: 'ctrl+n', - args: false, - priority: 100, - when: `editorTextFocus && ${InlineDiffPartialEditsIsVisible.raw}`, - }); if (this.inlineChatFeatureRegistry.getInteractiveInputHandler()) { keybindings.registerKeybinding( @@ -538,5 +524,20 @@ export class AINativeBrowserContribution ); } } + + keybindings.registerKeybinding({ + command: AI_INLINE_DIFF_PARTIAL_EDIT.id, + keybinding: 'ctrl+y', + args: true, + priority: 100, + when: `editorTextFocus && ${InlineDiffPartialEditsIsVisible.raw}`, + }); + keybindings.registerKeybinding({ + command: AI_INLINE_DIFF_PARTIAL_EDIT.id, + keybinding: 'ctrl+n', + args: false, + priority: 100, + when: `editorTextFocus && ${InlineDiffPartialEditsIsVisible.raw}`, + }); } } diff --git a/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts b/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts index e058ca588c..7f811d7c6b 100644 --- a/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts +++ b/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts @@ -19,6 +19,10 @@ import { InlineDiffWidget } from './inline-diff-widget'; export interface IDiffPreviewerOptions { disposeWhenEditorClosed: boolean; + /** + * 是否隐藏接受部分编辑的 widget,用于只展示 diff 的场景 + */ + hideAcceptPartialEditWidget?: boolean; } export interface IInlineDiffPreviewerNode extends IDisposable { diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx index 6079b34f67..eef6b5f1cd 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx @@ -101,6 +101,12 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr setPreviewerOptions(options: IDiffPreviewerOptions): void { this.previewerOptions = options; + + this.livePreviewDiffDecorationModel.setPreviewerOptions({ + partialEditWidgetOptions: { + hideAcceptPartialEditWidget: options.hideAcceptPartialEditWidget, + }, + }); } initialize(selection: Selection): void { diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.component.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.component.tsx index a9da956097..7df8c8b1e4 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.component.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.component.tsx @@ -124,6 +124,13 @@ const PartialEditComponent = (props: { ); }; +export interface IPartialEditWidgetOptions { + /** + * In some case, we don't want to show the accept and reject button + */ + hideAcceptPartialEditWidget?: boolean; +} + @Injectable({ multiple: true }) export class AcceptPartialEditWidget extends ReactInlineContentWidget { static ID = 'AcceptPartialEditWidgetID'; @@ -142,6 +149,10 @@ export class AcceptPartialEditWidget extends ReactInlineContentWidget { positionPreference = [ContentWidgetPositionPreference.EXACT]; + constructor(protected readonly editor: ICodeEditor, protected editWidgetOptions?: IPartialEditWidgetOptions) { + super(editor); + } + public addedLinesCount: number = 0; public deletedLinesCount: number = 0; public status: IWidgetStatus = 'pending'; @@ -166,6 +177,10 @@ export class AcceptPartialEditWidget extends ReactInlineContentWidget { } public renderView(): React.ReactNode { + if (this.editWidgetOptions?.hideAcceptPartialEditWidget) { + return; + } + const keyStrings = this.getSequenceKeyStrings(); if (!keyStrings) { return; diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx index e067b0f6c2..4197fae4f2 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx @@ -29,6 +29,7 @@ import { AddedRangeDecoration, EPartialEdit, IPartialEditEvent, + IPartialEditWidgetOptions, IRemovedWidgetState, IRemovedZoneWidgetOptions, ITextLinesTokens, @@ -53,6 +54,10 @@ export interface ITotalCodeInfo { unresolvedChangedLinesCount: number; } +export interface IModelOptions { + partialEditWidgetOptions?: IPartialEditWidgetOptions; +} + @Injectable({ multiple: true }) export class LivePreviewDiffDecorationModel extends Disposable { @Autowired(INJECTOR_TOKEN) @@ -76,6 +81,10 @@ export class LivePreviewDiffDecorationModel extends Disposable { public readonly onPartialEditWidgetListChange: Event = this._onPartialEditWidgetListChange.event; + protected options: IModelOptions = { + partialEditWidgetOptions: {}, + }; + protected model: ITextModel; // Parts that require snapshots @@ -575,7 +584,10 @@ export class LivePreviewDiffDecorationModel extends Disposable { } private createPartialEditWidget(lineNumber: number): AcceptPartialEditWidget { - const acceptPartialEditWidget = this.injector.get(AcceptPartialEditWidget, [this.monacoEditor]); + const acceptPartialEditWidget = this.injector.get(AcceptPartialEditWidget, [ + this.monacoEditor, + this.options.partialEditWidgetOptions, + ]); acceptPartialEditWidget.show({ position: { lineNumber, column: 1 } }); const disposable = acceptPartialEditWidget.onDispose(() => { @@ -702,4 +714,8 @@ export class LivePreviewDiffDecorationModel extends Disposable { } } } + + setPreviewerOptions(options: IModelOptions) { + this.options = options; + } } From a08cb4139f038c3240270aa8003ffcb2df98249b Mon Sep 17 00:00:00 2001 From: zhanba Date: Thu, 10 Oct 2024 10:26:16 +0800 Subject: [PATCH 02/42] fix: build error in node16 (#4069) --- .../hosted/api/vscode/debug/extension-debug-adapter-starter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts b/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts index dd0beb3779..68fd273dce 100644 --- a/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts +++ b/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts @@ -1,7 +1,7 @@ import assert from 'assert'; import { ChildProcess, SpawnOptions, fork, spawn } from 'child_process'; +import { EventEmitter } from 'events'; import net from 'net'; -import { EventEmitter } from 'node:events'; import stream from 'stream'; import { DebugAdapterForkExecutable, DebugStreamConnection } from '@opensumi/ide-debug'; From 7e0bbe0e9c48d83f8a18cdb5c4d09449eec85993 Mon Sep 17 00:00:00 2001 From: "opensumi[bot]" <99156626+opensumi[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:17:56 +0800 Subject: [PATCH 03/42] fix: build error in node16 (#4070) Co-authored-by: zhanba --- .../hosted/api/vscode/debug/extension-debug-adapter-starter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts b/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts index dd0beb3779..68fd273dce 100644 --- a/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts +++ b/packages/extension/src/hosted/api/vscode/debug/extension-debug-adapter-starter.ts @@ -1,7 +1,7 @@ import assert from 'assert'; import { ChildProcess, SpawnOptions, fork, spawn } from 'child_process'; +import { EventEmitter } from 'events'; import net from 'net'; -import { EventEmitter } from 'node:events'; import stream from 'stream'; import { DebugAdapterForkExecutable, DebugStreamConnection } from '@opensumi/ide-debug'; From c4bf2ff6f9611218de2e1b35b9c60bf8c8163345 Mon Sep 17 00:00:00 2001 From: nxps Date: Thu, 10 Oct 2024 18:06:08 +0800 Subject: [PATCH 04/42] chore: update xterm imports to use @xterm/xterm package (#4036) (#4068) --- packages/ai-native/package.json | 4 +- .../contrib/terminal/ai-terminal.service.ts | 2 +- .../decoration/terminal-decoration.tsx | 2 +- .../contrib/terminal/ps1-terminal.service.tsx | 2 +- .../__tests__/browser/client.test.ts | 11 ++- .../links/protocol-link-provider.test.ts | 5 +- .../validated-local-link-provider.test.ts | 4 +- .../__tests__/browser/mock.service.ts | 2 +- .../browser/terminal.hover.manager.test.ts | 2 +- .../terminal-next/__tests__/browser/utils.ts | 2 +- packages/terminal-next/package.json | 12 +-- .../src/browser/component/terminal.view.tsx | 2 +- .../terminal-next/src/browser/links/base.ts | 2 +- .../links/external-link-provider-adapter.ts | 2 +- .../src/browser/links/helpers.ts | 2 +- .../src/browser/links/link-manager.ts | 2 +- .../terminal-next/src/browser/links/link.ts | 2 +- .../browser/links/protocol-link-provider.ts | 2 +- .../links/validated-local-link-provider.ts | 2 +- .../src/browser/terminal.addon.ts | 2 +- .../src/browser/terminal.preference.ts | 2 +- .../src/browser/terminal.theme.ts | 2 +- .../src/browser/terminal.typeAhead.addon.ts | 2 +- .../src/browser/xterm-private.d.ts | 2 +- packages/terminal-next/src/browser/xterm.ts | 14 +-- packages/terminal-next/src/common/client.ts | 2 +- packages/terminal-next/src/common/pty.ts | 2 +- packages/terminal-next/src/common/service.ts | 2 +- packages/terminal-next/src/common/theme.ts | 2 +- .../src/common/xterm-private.d.ts | 2 +- packages/terminal-next/src/common/xterm.ts | 2 +- yarn.lock | 98 +++++++++---------- 32 files changed, 101 insertions(+), 97 deletions(-) diff --git a/packages/ai-native/package.json b/packages/ai-native/package.json index cd90de1768..62ede81354 100644 --- a/packages/ai-native/package.json +++ b/packages/ai-native/package.json @@ -37,13 +37,13 @@ "@opensumi/ide-theme": "workspace:*", "@opensumi/ide-utils": "workspace:*", "@opensumi/ide-workspace": "workspace:*", + "@xterm/xterm": "5.5.0", "ansi-regex": "^2.0.0", "dom-align": "^1.7.0", "js-tiktoken": "1.0.12", "react-chat-elements": "^12.0.10", "react-highlight": "^0.15.0", - "web-tree-sitter": "0.22.6", - "xterm": "5.3.0" + "web-tree-sitter": "0.22.6" }, "devDependencies": { "@opensumi/ide-core-browser": "workspace:*" diff --git a/packages/ai-native/src/browser/contrib/terminal/ai-terminal.service.ts b/packages/ai-native/src/browser/contrib/terminal/ai-terminal.service.ts index fa526d139e..02374a4984 100644 --- a/packages/ai-native/src/browser/contrib/terminal/ai-terminal.service.ts +++ b/packages/ai-native/src/browser/contrib/terminal/ai-terminal.service.ts @@ -1,4 +1,4 @@ -import { IMarker } from 'xterm'; +import { IMarker } from '@xterm/xterm'; import { Autowired, Injectable } from '@opensumi/di'; import { AIActionItem } from '@opensumi/ide-core-browser/lib/components/ai-native'; diff --git a/packages/ai-native/src/browser/contrib/terminal/decoration/terminal-decoration.tsx b/packages/ai-native/src/browser/contrib/terminal/decoration/terminal-decoration.tsx index 2c86b97d45..00061f6da9 100644 --- a/packages/ai-native/src/browser/contrib/terminal/decoration/terminal-decoration.tsx +++ b/packages/ai-native/src/browser/contrib/terminal/decoration/terminal-decoration.tsx @@ -1,6 +1,6 @@ +import { IDecoration, IMarker, Terminal } from '@xterm/xterm'; import React from 'react'; import { Root, createRoot } from 'react-dom/client'; -import { IDecoration, IMarker, Terminal } from 'xterm'; import { Autowired, Injectable } from '@opensumi/di'; import { AIActionItem } from '@opensumi/ide-core-browser/lib/components/ai-native'; diff --git a/packages/ai-native/src/browser/contrib/terminal/ps1-terminal.service.tsx b/packages/ai-native/src/browser/contrib/terminal/ps1-terminal.service.tsx index 32b6068028..f28de19446 100644 --- a/packages/ai-native/src/browser/contrib/terminal/ps1-terminal.service.tsx +++ b/packages/ai-native/src/browser/contrib/terminal/ps1-terminal.service.tsx @@ -1,7 +1,7 @@ +import { IDecoration, IDisposable, IMarker, Terminal } from '@xterm/xterm'; import domAlign from 'dom-align'; import React from 'react'; import { Root, createRoot } from 'react-dom/client'; -import { IDecoration, IDisposable, IMarker, Terminal } from 'xterm'; import { Autowired, Injectable } from '@opensumi/di'; import { localize } from '@opensumi/ide-core-browser'; diff --git a/packages/terminal-next/__tests__/browser/client.test.ts b/packages/terminal-next/__tests__/browser/client.test.ts index 54805b01ee..edc1ac422f 100644 --- a/packages/terminal-next/__tests__/browser/client.test.ts +++ b/packages/terminal-next/__tests__/browser/client.test.ts @@ -21,7 +21,7 @@ import { injector } from './inject'; import { createProxyServer, createWsServer } from './proxy'; import { createBufferLineArray, delay } from './utils'; -import type { ITerminalAddon } from 'xterm'; +import type { ITerminalAddon } from '@xterm/xterm'; function createDOMContainer() { const div = document.createElement('div'); @@ -41,13 +41,16 @@ class MockXTermAddonWebgl { } } -jest.mock('xterm', () => { +jest.mock('@xterm/xterm', () => { const Terminal = class MockXTerminal { private _text = ''; public options = {}; get cols() { return 0; } + get onLineFeed() { + return Event.None; + } get onResize() { return Event.None; } @@ -109,11 +112,11 @@ jest.mock('xterm', () => { } }; return { - ...jest.requireActual('xterm'), + ...jest.requireActual('@xterm/xterm'), Terminal, }; }); -jest.mock('xterm-addon-webgl', () => MockXTermAddonWebgl); +jest.mock('@xterm/addon-webgl', () => MockXTermAddonWebgl); describe('Terminal Client', () => { let client: ITerminalClient; diff --git a/packages/terminal-next/__tests__/browser/links/protocol-link-provider.test.ts b/packages/terminal-next/__tests__/browser/links/protocol-link-provider.test.ts index d25910d21f..8833b1447a 100644 --- a/packages/terminal-next/__tests__/browser/links/protocol-link-provider.test.ts +++ b/packages/terminal-next/__tests__/browser/links/protocol-link-provider.test.ts @@ -1,6 +1,7 @@ -import { ILink, Terminal } from 'xterm'; +import { ILink, Terminal } from '@xterm/xterm'; + +import { createBrowserInjector } from '@opensumi/ide-dev-tool/src/injector-helper'; -import { createBrowserInjector } from '../../../../../tools/dev-tool/src/injector-helper'; import { TerminalProtocolLinkProvider } from '../../../src/browser/links/protocol-link-provider'; describe('Workbench - TerminalWebLinkProvider', () => { diff --git a/packages/terminal-next/__tests__/browser/links/validated-local-link-provider.test.ts b/packages/terminal-next/__tests__/browser/links/validated-local-link-provider.test.ts index 3422b522f3..d620c6721d 100644 --- a/packages/terminal-next/__tests__/browser/links/validated-local-link-provider.test.ts +++ b/packages/terminal-next/__tests__/browser/links/validated-local-link-provider.test.ts @@ -1,8 +1,8 @@ -import { ILink, Terminal } from 'xterm'; +import { ILink, Terminal } from '@xterm/xterm'; import { OperatingSystem, URI } from '@opensumi/ide-core-common'; +import { createBrowserInjector } from '@opensumi/ide-dev-tool/src/injector-helper'; -import { createBrowserInjector } from '../../../../../tools/dev-tool/src/injector-helper'; import { TerminalValidatedLocalLinkProvider } from '../../../src/browser/links/validated-local-link-provider'; const unixLinks = ['/foo', '~/foo', './foo', '../foo', '/foo/bar', '/foo/bar+more', 'foo/bar', 'foo/bar+more']; diff --git a/packages/terminal-next/__tests__/browser/mock.service.ts b/packages/terminal-next/__tests__/browser/mock.service.ts index 744fd80e42..be2378fd12 100644 --- a/packages/terminal-next/__tests__/browser/mock.service.ts +++ b/packages/terminal-next/__tests__/browser/mock.service.ts @@ -1,5 +1,5 @@ +import { Terminal } from '@xterm/xterm'; import WebSocket from 'ws'; -import { Terminal } from 'xterm'; import { Injectable } from '@opensumi/di'; import { WSChannel } from '@opensumi/ide-connection'; diff --git a/packages/terminal-next/__tests__/browser/terminal.hover.manager.test.ts b/packages/terminal-next/__tests__/browser/terminal.hover.manager.test.ts index c8280dedc8..65435ef57e 100644 --- a/packages/terminal-next/__tests__/browser/terminal.hover.manager.test.ts +++ b/packages/terminal-next/__tests__/browser/terminal.hover.manager.test.ts @@ -1,5 +1,5 @@ /* eslint-disable no-console */ -import { IViewportRange, Terminal } from 'xterm'; +import { IViewportRange, Terminal } from '@xterm/xterm'; import { Injector } from '@opensumi/di'; import { LayoutState } from '@opensumi/ide-core-browser/lib/layout/layout-state'; diff --git a/packages/terminal-next/__tests__/browser/utils.ts b/packages/terminal-next/__tests__/browser/utils.ts index bc5e34e36c..e8b9b1426f 100644 --- a/packages/terminal-next/__tests__/browser/utils.ts +++ b/packages/terminal-next/__tests__/browser/utils.ts @@ -1,4 +1,4 @@ -import { IBufferCell, IBufferLine } from 'xterm'; +import { IBufferCell, IBufferLine } from '@xterm/xterm'; export async function delay(ms: number) { return new Promise((resolve) => { diff --git a/packages/terminal-next/package.json b/packages/terminal-next/package.json index e0fd3b1024..4dd3f4999f 100644 --- a/packages/terminal-next/package.json +++ b/packages/terminal-next/package.json @@ -22,13 +22,13 @@ "@opensumi/ide-core-node": "workspace:*", "@opensumi/ide-file-service": "workspace:*", "@opensumi/ide-utils": "workspace:*", + "@xterm/addon-canvas": "0.7.0", + "@xterm/addon-fit": "0.10.0", + "@xterm/addon-search": "0.15.0", + "@xterm/addon-webgl": "0.18.0", + "@xterm/xterm": "5.5.0", "node-pty": "1.0.0", - "os-locale": "^4.0.0", - "xterm": "5.3.0", - "xterm-addon-canvas": "0.4.0", - "xterm-addon-fit": "0.8.0", - "xterm-addon-search": "0.12.0", - "xterm-addon-webgl": "0.15.0" + "os-locale": "^4.0.0" }, "devDependencies": { "@opensumi/ide-components": "workspace:*", diff --git a/packages/terminal-next/src/browser/component/terminal.view.tsx b/packages/terminal-next/src/browser/component/terminal.view.tsx index 90ec248e1d..74aceb043d 100644 --- a/packages/terminal-next/src/browser/component/terminal.view.tsx +++ b/packages/terminal-next/src/browser/component/terminal.view.tsx @@ -19,7 +19,7 @@ import ResizeView, { ResizeDirection } from './resize.view'; import styles from './terminal.module.less'; import TerminalWidget from './terminal.widget'; -import 'xterm/css/xterm.css'; +import '@xterm/xterm/css/xterm.css'; export default observer(() => { const controller = useInjectable(ITerminalController); diff --git a/packages/terminal-next/src/browser/links/base.ts b/packages/terminal-next/src/browser/links/base.ts index 582784e0d1..3ccc74daa3 100644 --- a/packages/terminal-next/src/browser/links/base.ts +++ b/packages/terminal-next/src/browser/links/base.ts @@ -1,6 +1,6 @@ import { TerminalLink } from './link'; -import type { ILink, ILinkProvider } from 'xterm'; +import type { ILink, ILinkProvider } from '@xterm/xterm'; export abstract class TerminalBaseLinkProvider implements ILinkProvider { private _activeLinks: TerminalLink[] | undefined; diff --git a/packages/terminal-next/src/browser/links/external-link-provider-adapter.ts b/packages/terminal-next/src/browser/links/external-link-provider-adapter.ts index 622ff44a71..ecaae29c17 100644 --- a/packages/terminal-next/src/browser/links/external-link-provider-adapter.ts +++ b/packages/terminal-next/src/browser/links/external-link-provider-adapter.ts @@ -8,7 +8,7 @@ import { convertLinkRangeToBuffer, getXtermLineContent } from './helpers'; import { TerminalLink } from './link'; import { XtermLinkMatcherHandler } from './link-manager'; -import type { IBufferLine, IViewportRange, Terminal } from 'xterm'; +import type { IBufferLine, IViewportRange, Terminal } from '@xterm/xterm'; /** * An adapter to convert a simple external link provider into an internal link provider that diff --git a/packages/terminal-next/src/browser/links/helpers.ts b/packages/terminal-next/src/browser/links/helpers.ts index a932b22850..e373cce137 100644 --- a/packages/terminal-next/src/browser/links/helpers.ts +++ b/packages/terminal-next/src/browser/links/helpers.ts @@ -6,7 +6,7 @@ import { IRange } from '@opensumi/ide-core-common/lib/types'; -import type { IBuffer, IBufferCellPosition, IBufferLine, IBufferRange, IViewportRange } from 'xterm'; +import type { IBuffer, IBufferCellPosition, IBufferLine, IBufferRange, IViewportRange } from '@xterm/xterm'; export function convertLinkRangeToBuffer(lines: IBufferLine[], bufferWidth: number, range: IRange, startLine: number) { const bufferRange: IBufferRange = { diff --git a/packages/terminal-next/src/browser/links/link-manager.ts b/packages/terminal-next/src/browser/links/link-manager.ts index 17172c8b44..48575fbe22 100644 --- a/packages/terminal-next/src/browser/links/link-manager.ts +++ b/packages/terminal-next/src/browser/links/link-manager.ts @@ -1,4 +1,4 @@ -import { ILinkProvider, IViewportRange, Terminal } from 'xterm'; +import { ILinkProvider, IViewportRange, Terminal } from '@xterm/xterm'; import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di'; import { IOpenerService, PreferenceService } from '@opensumi/ide-core-browser'; diff --git a/packages/terminal-next/src/browser/links/link.ts b/packages/terminal-next/src/browser/links/link.ts index f276eba939..404bf5b4dc 100644 --- a/packages/terminal-next/src/browser/links/link.ts +++ b/packages/terminal-next/src/browser/links/link.ts @@ -13,7 +13,7 @@ import { import { convertBufferRangeToViewport } from './helpers'; -import type { IBufferRange, ILink, ILinkDecorations, IViewportRange, Terminal } from 'xterm'; +import type { IBufferRange, ILink, ILinkDecorations, IViewportRange, Terminal } from '@xterm/xterm'; // default delay time (ms) for showing tooltip when mouse is over a link const DEFAULT_HOVER_DELAY = 500; diff --git a/packages/terminal-next/src/browser/links/protocol-link-provider.ts b/packages/terminal-next/src/browser/links/protocol-link-provider.ts index 0bce3f3ac0..5a9b58c8d1 100644 --- a/packages/terminal-next/src/browser/links/protocol-link-provider.ts +++ b/packages/terminal-next/src/browser/links/protocol-link-provider.ts @@ -7,7 +7,7 @@ import { TerminalBaseLinkProvider } from './base'; import { convertLinkRangeToBuffer, getXtermLineContent } from './helpers'; import { TerminalLink } from './link'; -import type { IBufferLine, IViewportRange, Terminal } from 'xterm'; +import type { IBufferLine, IViewportRange, Terminal } from '@xterm/xterm'; @Injectable({ multiple: true }) export class TerminalProtocolLinkProvider extends TerminalBaseLinkProvider { diff --git a/packages/terminal-next/src/browser/links/validated-local-link-provider.ts b/packages/terminal-next/src/browser/links/validated-local-link-provider.ts index 2eb4eace04..7edd39e3d6 100644 --- a/packages/terminal-next/src/browser/links/validated-local-link-provider.ts +++ b/packages/terminal-next/src/browser/links/validated-local-link-provider.ts @@ -16,7 +16,7 @@ import { FOLDER_IN_WORKSPACE_LABEL, FOLDER_NOT_IN_WORKSPACE_LABEL, OPEN_FILE_LAB import { XtermLinkMatcherHandler } from './link-manager'; import type { TerminalClient } from '../terminal.client'; -import type { IBufferLine, IViewportRange, Terminal } from 'xterm'; +import type { IBufferLine, IViewportRange, Terminal } from '@xterm/xterm'; const pathPrefix = '(\\.\\.?|\\~)'; const pathSeparatorClause = '\\/'; diff --git a/packages/terminal-next/src/browser/terminal.addon.ts b/packages/terminal-next/src/browser/terminal.addon.ts index 7df2ae841c..afde7fa879 100644 --- a/packages/terminal-next/src/browser/terminal.addon.ts +++ b/packages/terminal-next/src/browser/terminal.addon.ts @@ -1,4 +1,4 @@ -import { ITerminalAddon, Terminal } from 'xterm'; +import { ITerminalAddon, Terminal } from '@xterm/xterm'; import { Disposable, Emitter } from '@opensumi/ide-core-common'; diff --git a/packages/terminal-next/src/browser/terminal.preference.ts b/packages/terminal-next/src/browser/terminal.preference.ts index 2cb51fbd6e..950229ecca 100644 --- a/packages/terminal-next/src/browser/terminal.preference.ts +++ b/packages/terminal-next/src/browser/terminal.preference.ts @@ -1,5 +1,5 @@ +import { ITerminalOptions } from '@xterm/xterm'; import pickBy from 'lodash/pickBy'; -import { ITerminalOptions } from 'xterm'; import { Autowired, Injectable } from '@opensumi/di'; import { PreferenceService } from '@opensumi/ide-core-browser'; diff --git a/packages/terminal-next/src/browser/terminal.theme.ts b/packages/terminal-next/src/browser/terminal.theme.ts index 7faeba7503..49f496a6ab 100644 --- a/packages/terminal-next/src/browser/terminal.theme.ts +++ b/packages/terminal-next/src/browser/terminal.theme.ts @@ -6,7 +6,7 @@ import { ITerminalTheme } from '../common'; import * as TERMINAL_COLOR from './terminal.color'; -import type { ITheme } from 'xterm'; +import type { ITheme } from '@xterm/xterm'; @Injectable() export class TerminalTheme extends Themable implements ITerminalTheme { diff --git a/packages/terminal-next/src/browser/terminal.typeAhead.addon.ts b/packages/terminal-next/src/browser/terminal.typeAhead.addon.ts index ed32c44c96..c77ecac626 100644 --- a/packages/terminal-next/src/browser/terminal.typeAhead.addon.ts +++ b/packages/terminal-next/src/browser/terminal.typeAhead.addon.ts @@ -22,7 +22,7 @@ import { CodeTerminalSettingId } from '../common/preference'; import { Color, RGBA } from './terminal.typeAhead.ext'; import { IXtermCore, XtermAttributes } from './xterm-private'; -import type { IBuffer, IBufferCell, IDisposable, ITerminalAddon, Terminal } from 'xterm'; +import type { IBuffer, IBufferCell, IDisposable, ITerminalAddon, Terminal } from '@xterm/xterm'; export const DEFAULT_LOCAL_ECHO_EXCLUDE: ReadonlyArray = ['vim', 'vi', 'nano', 'tmux']; diff --git a/packages/terminal-next/src/browser/xterm-private.d.ts b/packages/terminal-next/src/browser/xterm-private.d.ts index bff80eef06..84fccd0e1f 100644 --- a/packages/terminal-next/src/browser/xterm-private.d.ts +++ b/packages/terminal-next/src/browser/xterm-private.d.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { IBufferCell } from 'xterm'; +import { IBufferCell } from '@xterm/xterm'; export type XtermAttributes = Omit & { clone?(): XtermAttributes }; diff --git a/packages/terminal-next/src/browser/xterm.ts b/packages/terminal-next/src/browser/xterm.ts index 235721413a..558be51e11 100644 --- a/packages/terminal-next/src/browser/xterm.ts +++ b/packages/terminal-next/src/browser/xterm.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ -import { ITerminalOptions, ITheme, Terminal } from 'xterm'; -import { FitAddon } from 'xterm-addon-fit'; -import { ISearchOptions, SearchAddon } from 'xterm-addon-search'; +import { FitAddon } from '@xterm/addon-fit'; +import { ISearchOptions, SearchAddon } from '@xterm/addon-search'; +import { ITerminalOptions, ITheme, Terminal } from '@xterm/xterm'; import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di'; import { IClipboardService } from '@opensumi/ide-core-browser'; @@ -26,8 +26,8 @@ import { TERMINAL_OVERVIEW_RULER_FIND_MATCH_FOREGROUND_COLOR, } from './terminal.color'; -import type { CanvasAddon as CanvasAddonType } from 'xterm-addon-canvas'; -import type { WebglAddon as WebglAddonType } from 'xterm-addon-webgl'; +import type { CanvasAddon as CanvasAddonType } from '@xterm/addon-canvas'; +import type { WebglAddon as WebglAddonType } from '@xterm/addon-webgl'; export interface XTermOptions { cwd?: string; @@ -85,7 +85,7 @@ export class XTerm extends Disposable implements IXTerm { try { if (!this._canvasAddon) { // @ts-ignore - this._canvasAddon = new (await import('xterm-addon-canvas')).CanvasAddon(); + this._canvasAddon = new (await import('@xterm/addon-canvas')).CanvasAddon(); } this.addDispose(this._canvasAddon); @@ -104,7 +104,7 @@ export class XTerm extends Disposable implements IXTerm { try { if (!this._webglAddon) { // @ts-ignore - this._webglAddon = new (await import('xterm-addon-webgl')).WebglAddon(); + this._webglAddon = new (await import('@xterm/addon-webgl')).WebglAddon(); } this.addDispose(this._webglAddon); diff --git a/packages/terminal-next/src/common/client.ts b/packages/terminal-next/src/common/client.ts index ef8a7f1553..b9ea98523c 100644 --- a/packages/terminal-next/src/common/client.ts +++ b/packages/terminal-next/src/common/client.ts @@ -1,4 +1,4 @@ -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { Deferred, Disposable, Event, IDisposable } from '@opensumi/ide-core-common'; diff --git a/packages/terminal-next/src/common/pty.ts b/packages/terminal-next/src/common/pty.ts index 79487345f9..c64dedb828 100644 --- a/packages/terminal-next/src/common/pty.ts +++ b/packages/terminal-next/src/common/pty.ts @@ -1,6 +1,6 @@ +import { Terminal as XTerm } from '@xterm/xterm'; import { IPty as INodePty } from 'node-pty'; import * as pty from 'node-pty'; -import { Terminal as XTerm } from 'xterm'; import { IThemeColor, MaybePromise, OperatingSystem, Uri } from '@opensumi/ide-core-common'; diff --git a/packages/terminal-next/src/common/service.ts b/packages/terminal-next/src/common/service.ts index f7ae60d2e7..775321b09a 100644 --- a/packages/terminal-next/src/common/service.ts +++ b/packages/terminal-next/src/common/service.ts @@ -1,4 +1,4 @@ -import { ITerminalOptions as IXtermTerminalOptions } from 'xterm'; +import { ITerminalOptions as IXtermTerminalOptions } from '@xterm/xterm'; import { IDisposable, OperatingSystem } from '@opensumi/ide-core-common'; diff --git a/packages/terminal-next/src/common/theme.ts b/packages/terminal-next/src/common/theme.ts index aea0eaf878..b508de0490 100644 --- a/packages/terminal-next/src/common/theme.ts +++ b/packages/terminal-next/src/common/theme.ts @@ -1,4 +1,4 @@ -import { ITheme } from 'xterm'; +import { ITheme } from '@xterm/xterm'; export const ITerminalTheme = Symbol('ITerminalTheme'); export interface ITerminalTheme { diff --git a/packages/terminal-next/src/common/xterm-private.d.ts b/packages/terminal-next/src/common/xterm-private.d.ts index 1d33e9702e..169e39f948 100644 --- a/packages/terminal-next/src/common/xterm-private.d.ts +++ b/packages/terminal-next/src/common/xterm-private.d.ts @@ -1,4 +1,4 @@ -import { IBufferCell } from 'xterm'; +import { IBufferCell } from '@xterm/xterm'; export type XTermAttributes = Omit & { clone?(): XTermAttributes }; diff --git a/packages/terminal-next/src/common/xterm.ts b/packages/terminal-next/src/common/xterm.ts index 598cf95d73..418e30fa35 100644 --- a/packages/terminal-next/src/common/xterm.ts +++ b/packages/terminal-next/src/common/xterm.ts @@ -1,4 +1,4 @@ -import { ITerminalOptions, ITheme, Terminal } from 'xterm'; +import { ITerminalOptions, ITheme, Terminal } from '@xterm/xterm'; import { SupportedOptions } from './preference'; diff --git a/yarn.lock b/yarn.lock index 0070a1f278..7b865243b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2084,13 +2084,13 @@ __metadata: "@opensumi/ide-theme": "workspace:*" "@opensumi/ide-utils": "workspace:*" "@opensumi/ide-workspace": "workspace:*" + "@xterm/xterm": "npm:5.5.0" ansi-regex: "npm:^2.0.0" dom-align: "npm:^1.7.0" js-tiktoken: "npm:1.0.12" react-chat-elements: "npm:^12.0.10" react-highlight: "npm:^0.15.0" web-tree-sitter: "npm:0.22.6" - xterm: "npm:5.3.0" languageName: unknown linkType: soft @@ -2986,14 +2986,14 @@ __metadata: "@opensumi/ide-variable": "workspace:*" "@opensumi/ide-workspace": "workspace:*" "@types/http-proxy": "npm:^1.17.2" + "@xterm/addon-canvas": "npm:0.7.0" + "@xterm/addon-fit": "npm:0.10.0" + "@xterm/addon-search": "npm:0.15.0" + "@xterm/addon-webgl": "npm:0.18.0" + "@xterm/xterm": "npm:5.5.0" http-proxy: "npm:^1.18.0" node-pty: "npm:1.0.0" os-locale: "npm:^4.0.0" - xterm: "npm:5.3.0" - xterm-addon-canvas: "npm:0.4.0" - xterm-addon-fit: "npm:0.8.0" - xterm-addon-search: "npm:0.12.0" - xterm-addon-webgl: "npm:0.15.0" languageName: unknown linkType: soft @@ -4782,6 +4782,49 @@ __metadata: languageName: node linkType: hard +"@xterm/addon-canvas@npm:0.7.0": + version: 0.7.0 + resolution: "@xterm/addon-canvas@npm:0.7.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: 10/63300bb472f9a06675af99375c02b63d1072765c52b2fed29c8dae310fe0be6858cc09bd0cc37dc2a58fed7dfe1c0808b25a02753d071e6d46b7efdb8f163bf0 + languageName: node + linkType: hard + +"@xterm/addon-fit@npm:0.10.0": + version: 0.10.0 + resolution: "@xterm/addon-fit@npm:0.10.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: 10/8edfad561c0d0316c5883cbe2ce56109f105a2b2bf53b71d5f8c788e656a3205c1093a659dddcf4025a459e4b7ff8e07b6c6a19815c8711deeded560de5f1893 + languageName: node + linkType: hard + +"@xterm/addon-search@npm:0.15.0": + version: 0.15.0 + resolution: "@xterm/addon-search@npm:0.15.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: 10/f45475d837c5bcd5277aa24301464be5f786311dc086d8eb650fe67839347b9922291556643cedde881bc41d99c6a6d4a1498fafda98396d355613a471f59e8d + languageName: node + linkType: hard + +"@xterm/addon-webgl@npm:0.18.0": + version: 0.18.0 + resolution: "@xterm/addon-webgl@npm:0.18.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: 10/ba3250afd41ea32b5f302d63b20e7dec107aec64c3c1fbc0142215bf5167f63a5907423e260712bd1c637ad549db267aa1e0afc2080472354ac25d8c7f2c2281 + languageName: node + linkType: hard + +"@xterm/xterm@npm:5.5.0": + version: 5.5.0 + resolution: "@xterm/xterm@npm:5.5.0" + checksum: 10/d4cdc402de81a83a3e0ef93f38072cb8f54abe4d65865f2e29b92cbc2593f86d052f6b993895c9e5dec97f47548f504e90bcea0aad6845917c09b03f2f3a4629 + languageName: node + linkType: hard + "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -20167,49 +20210,6 @@ __metadata: languageName: node linkType: hard -"xterm-addon-canvas@npm:0.4.0": - version: 0.4.0 - resolution: "xterm-addon-canvas@npm:0.4.0" - peerDependencies: - xterm: ^5.0.0 - checksum: 10/f1448dd22dbe982fff712a1cb124920a31b1c15acfe506ab1a0f8f10f2e4be9b2a39d53d76efee3250cbafaa48e261b4cbc9ce5a27e55c3b63ce35de59f6003f - languageName: node - linkType: hard - -"xterm-addon-fit@npm:0.8.0": - version: 0.8.0 - resolution: "xterm-addon-fit@npm:0.8.0" - peerDependencies: - xterm: ^5.0.0 - checksum: 10/5af2041b442f7c804eda2e6f62e3b68b5159b0ae6bd96e2aa8d85b26441df57291cbfed653d1196d4af5d9b94bfc39993df8b409a25c35e0d36bdaf6f5cdfe5f - languageName: node - linkType: hard - -"xterm-addon-search@npm:0.12.0": - version: 0.12.0 - resolution: "xterm-addon-search@npm:0.12.0" - peerDependencies: - xterm: ^5.0.0 - checksum: 10/569c1a76408544d18350e57b912cece7beeb420b3952abd3ab403358dabb7327e6cfc0e5423cf5d47868aec138e50dbeaa0126eeb0eee6be0806f92c508f3a0d - languageName: node - linkType: hard - -"xterm-addon-webgl@npm:0.15.0": - version: 0.15.0 - resolution: "xterm-addon-webgl@npm:0.15.0" - peerDependencies: - xterm: ^5.0.0 - checksum: 10/c93e58629931735120a4ca49264775fed9369b72380fc6f4d55eea8760a2ca0483e2d5730618f71e4fae8c128e610024a24728f207961098d2188e1067eacdfa - languageName: node - linkType: hard - -"xterm@npm:5.3.0": - version: 5.3.0 - resolution: "xterm@npm:5.3.0" - checksum: 10/3690b6a6d744f1d2932279975bb8e6c786e70c675531045016ecfe0f9b7957e2fc6811b815335f3e0e84b40ffae654f6ee4afe55a5768534744497e62252dd50 - languageName: node - linkType: hard - "y-leveldb@npm:^0.1.0": version: 0.1.2 resolution: "y-leveldb@npm:0.1.2" From 538e9cefb5b73f9b749ef79129fc0a1328bfb3ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Thu, 10 Oct 2024 19:47:37 +0800 Subject: [PATCH 05/42] fix(inline-diff): fix error in calculating lines of code change (#4074) --- .../live-preview.decoration.tsx | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx index 4197fae4f2..cf6970bc0a 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx @@ -90,7 +90,7 @@ export class LivePreviewDiffDecorationModel extends Disposable { // Parts that require snapshots private addedRangeDec: EnhanceDecorationsCollection; private partialEditWidgetList: AcceptPartialEditWidget[] = []; - private removedZoneWidgets: Array = []; + private removedZoneWidgets: RemovedZoneWidget[] = []; private zone: LineRange; constructor(private readonly monacoEditor: ICodeEditor) { @@ -515,17 +515,29 @@ export class LivePreviewDiffDecorationModel extends Disposable { return newElement; } - /** - * 获取当前编辑器的代码采纳状态 - * 1. 已经采纳的代码信息 - * 2. 还未处理的代码信息 - */ - getTotalCodeInfo(): ITotalCodeInfo { - const resolvedList = this.partialEditWidgetList.filter((w) => w.isAccepted); - const unresolvedList = this.partialEditWidgetList.filter((w) => w.isPending); - - const resolvedStatus = caculate(resolvedList); - const unresolvedStatus = caculate(unresolvedList); + static computeCodeInfo( + partialEditWidgetList: AcceptPartialEditWidget[], + addedDecList: IEnhanceModelDeltaDecoration[], + removedWidgetList: RemovedZoneWidget[], + ): ITotalCodeInfo { + // 代码除了新增和删除行,还需要统计变更行 + // 1. 新增 N 行 => N + // 2. 删除 N 行 => N + // 3. 新增 M 行,删除 N 行 => max(M, N) + // 综上所述,变更行数 = sum(list.map(item => max(新增行数, 删除行数))) + const resolvedStatus = caculate(partialEditWidgetList); + const unresolvedStatus = { added: 0, deleted: 0, changed: 0 }; + partialEditWidgetList.forEach((v, idx) => { + if (v.status === 'pending') { + const addedDec = addedDecList[idx]; + const removedWidget = removedWidgetList[idx]; + const addedLinesCount = addedDec?.length || 0; + const deletedLinesCount = removedWidget?.height || 0; + unresolvedStatus.added += addedLinesCount; + unresolvedStatus.deleted += deletedLinesCount; + unresolvedStatus.changed += Math.max(addedLinesCount, deletedLinesCount); + } + }); return { totalAddedLinesCount: resolvedStatus.added, @@ -536,11 +548,6 @@ export class LivePreviewDiffDecorationModel extends Disposable { unresolvedChangedLinesCount: unresolvedStatus.changed, }; - // 代码除了新增和删除行,还需要统计变更行 - // 1. 新增 N 行 => N - // 2. 删除 N 行 => N - // 3. 新增 M 行,删除 N 行 => max(M, N) - // 综上所述,变更行数 = sum(list.map(item => max(新增行数, 删除行数))) function caculate(list: AcceptPartialEditWidget[]) { const result = { added: 0, deleted: 0, changed: 0 }; list.forEach((widget) => { @@ -554,6 +561,19 @@ export class LivePreviewDiffDecorationModel extends Disposable { } } + /** + * 获取当前编辑器的代码采纳状态 + * 1. 已经采纳的代码信息 + * 2. 还未处理的代码信息 + */ + getTotalCodeInfo(): ITotalCodeInfo { + const partialEditWidgetList = this.partialEditWidgetList; + const addedDecList = this.addedRangeDec.getDecorations(); + const removedWidgetList = this.removedZoneWidgets; + + return LivePreviewDiffDecorationModel.computeCodeInfo(partialEditWidgetList, addedDecList, removedWidgetList); + } + /** * 记录 partial edit widget 与 added range 的映射关系(主要用于位置计算) */ From 6643c17ff8775df1385907f3dd72a175b3b8760e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Thu, 10 Oct 2024 21:07:17 +0800 Subject: [PATCH 06/42] feat(iframe): support load webview by srcdoc (#4071) --- package.json | 4 +- .../src/react-providers/config-provider.tsx | 5 + packages/startup/entry/web/render-app.tsx | 4 +- packages/startup/package.json | 5 +- .../__tests__/webview/webview.channel.test.ts | 4 +- packages/webview/package.json | 3 +- packages/webview/scripts/bundle-webview.mjs | 69 +++++ .../webview/src/browser/iframe-webview.ts | 12 +- .../webview/src/browser/iframe/prebuilt.ts | 8 + .../webview/src/browser/webview.service.ts | 2 +- .../src/electron-webview/host-channel.ts | 5 + packages/webview/src/webview-host/common.ts | 1 + .../src/webview-host/web-iframe-channel.ts | 90 +++++++ .../src/webview-host/web-preload-builtin.ts | 9 + .../webview/src/webview-host/web-preload.ts | 75 +----- .../src/webview-host/webview-manager.ts | 7 +- .../configs/webpack.config.webview.js | 4 - tools/dev-tool/src/server.ts | 6 +- yarn.lock | 252 ++++++++++++++++++ 19 files changed, 472 insertions(+), 93 deletions(-) create mode 100644 packages/webview/scripts/bundle-webview.mjs create mode 100644 packages/webview/src/browser/iframe/prebuilt.ts create mode 100644 packages/webview/src/webview-host/web-iframe-channel.ts create mode 100644 packages/webview/src/webview-host/web-preload-builtin.ts diff --git a/package.json b/package.json index 8d15457eba..a84d0ac403 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,13 @@ "add:node": "tsx ./scripts/add-node", "add:browser": "tsx ./scripts/add-browser", "build": "yarn run compile", - "build:all": "yarn run build && yarn run build:worker-host && yarn run build:ext-host && yarn run build:components && yarn build:monaco-worker", + "build:all": "yarn build:webview-prebuilt && yarn run build && yarn run build:worker-host && yarn run build:ext-host && yarn run build:components && yarn build:monaco-worker", "compile": "cross-env NODE_ENV=production tsx ./scripts/build", "build:worker-host": "cd packages/extension && yarn run compile:worker", "build:ext-host": "cd packages/extension && yarn run build:ext-host", "build:cli-engine": "cd tools/cli-engine && yarn run build", "build:monaco-worker": "cd packages/monaco && yarn run build:worker", + "build:webview-prebuilt": "yarn workspace @opensumi/ide-webview bundle-webview", "watch:ext-host": "cd packages/extension && yarn run watch:ext-host", "watch:worker-host": "cd packages/extension && yarn run watch:worker", "watch": "yarn run rebuild:node && cross-env NODE_ENV=production tsx ./scripts/watch", @@ -95,6 +96,7 @@ "cross-env": "^7.0.3", "debug": "^4.3.2", "depcheck": "^1.4.7", + "esbuild": "^0.24.0", "eslint": "^8.9.0", "eslint-config-prettier": "^8.4.0", "eslint-import-resolver-typescript": "^2.5.0", diff --git a/packages/core-browser/src/react-providers/config-provider.tsx b/packages/core-browser/src/react-providers/config-provider.tsx index e48f3bc06d..28ed6fa14b 100644 --- a/packages/core-browser/src/react-providers/config-provider.tsx +++ b/packages/core-browser/src/react-providers/config-provider.tsx @@ -121,6 +121,11 @@ export interface AppConfig { * 默认值:`http://${deviceIp}:${port}/webview`, */ webviewEndpoint?: string; + /** + * if you don't want to use the webviewEndpoint, you can use the built-in webview. + * webview content will be loaded by `iframe.srcdoc`. + */ + useBuiltinWebview?: boolean; /** * Worker 插件的默认启动路径 */ diff --git a/packages/startup/entry/web/render-app.tsx b/packages/startup/entry/web/render-app.tsx index 1227fb7168..9d7985c2b4 100644 --- a/packages/startup/entry/web/render-app.tsx +++ b/packages/startup/entry/web/render-app.tsx @@ -57,9 +57,6 @@ export async function renderApp(opts: IClientAppOpts) { opts.extWorkerHost = opts.extWorkerHost || process.env.EXTENSION_WORKER_HOST; - const anotherHostName = process.env.WEBVIEW_HOST || defaultHost; - opts.webviewEndpoint = opts.webviewEndpoint || `http://${anotherHostName}:8899`; - opts.editorBackgroundImage = 'https://img.alicdn.com/imgextra/i2/O1CN01dqjQei1tpbj9z9VPH_!!6000000005951-55-tps-87-78.svg'; @@ -102,6 +99,7 @@ export const getDefaultClientAppOpts = ({ }, useCdnIcon: true, useExperimentalShadowDom: true, + useBuiltinWebview: true, defaultPreferences: { 'general.language': defaultLanguage, 'general.theme': 'opensumi-design-dark-theme', diff --git a/packages/startup/package.json b/packages/startup/package.json index 4202514ba2..53cb3700c3 100644 --- a/packages/startup/package.json +++ b/packages/startup/package.json @@ -11,9 +11,8 @@ "scripts": { "prepublishOnly": "yarn run build", "start:lite": "webpack-dev-server --config ./webpack.lite.config.js", - "start": "run-p start:client:open start:server start:webview", - "start:e2e": "run-p start:client:e2e start:server start:webview", - "start:webview": "webpack-dev-server --config ./webpack.webview.js", + "start": "run-p start:client:open start:server", + "start:e2e": "run-p start:client:e2e start:server", "start:client": "webpack-dev-server --config ./webpack.config.js", "start:server": "cross-env IS_DEV=1 NODE_ENV=development EXT_MODE=js KTLOG_SHOW_DEBUG=1 nodemon --inspect=9999 ./entry/web/server.ts", "start:no-inspect:client": "yarn start:client", diff --git a/packages/webview/__tests__/webview/webview.channel.test.ts b/packages/webview/__tests__/webview/webview.channel.test.ts index e04e858388..691afba1eb 100644 --- a/packages/webview/__tests__/webview/webview.channel.test.ts +++ b/packages/webview/__tests__/webview/webview.channel.test.ts @@ -5,7 +5,7 @@ mockElectronRenderer(); import { MockedElectronIpcRenderer } from '@opensumi/ide-core-common/lib/mocks/electron/ipcRenderer'; import { ElectronWebviewChannel } from '../../src/electron-webview/host-channel'; -import { WebIframeChannel } from '../../src/webview-host/web-preload'; +import { WebIframeChannel, getIdFromSearch } from '../../src/webview-host/web-iframe-channel'; import { WebviewPanelManager } from '../../src/webview-host/webview-manager'; const { JSDOM } = require('jsdom'); @@ -31,7 +31,7 @@ describe('electron webview test', () => { }); describe('web iframe webview test', () => { - const manager = new WebviewPanelManager(new WebIframeChannel()); + const manager = new WebviewPanelManager(new WebIframeChannel(getIdFromSearch)); it.skip('iframe webview test', () => { (manager as any).init(); diff --git a/packages/webview/package.json b/packages/webview/package.json index 3bea1a644e..5f448cd643 100644 --- a/packages/webview/package.json +++ b/packages/webview/package.json @@ -10,7 +10,8 @@ "typings": "lib/index.d.ts", "scripts": { "prepublishOnly": "yarn run build", - "build": "tsc --build ../../configs/ts/references/tsconfig.webview.json" + "build": "tsc --build ../../configs/ts/references/tsconfig.webview.json", + "bundle-webview": "node ./scripts/bundle-webview.mjs" }, "repository": { "type": "git", diff --git a/packages/webview/scripts/bundle-webview.mjs b/packages/webview/scripts/bundle-webview.mjs new file mode 100644 index 0000000000..3a608221eb --- /dev/null +++ b/packages/webview/scripts/bundle-webview.mjs @@ -0,0 +1,69 @@ +/* eslint-disable no-console */ +import { mkdir, writeFile } from 'fs/promises'; + +import debug from 'debug'; +import * as esbuild from 'esbuild'; + +const log = debug('webview:bundle-webview'); + +const result = await esbuild.build({ + entryPoints: ['src/webview-host/web-preload-builtin.ts'], + sourcemap: false, + write: false, + bundle: true, + minify: true, +}); + +log( + 'build result', + result.outputFiles.map((v) => ({ + path: v.path, + length: v.text.length, + })), +); + +const output = result.outputFiles[0].text; + +const htmlWithScript = /* html */ ` + + + + + + Webview Panel Container + + + + + + +`; + +const toWrite = /* javascript */ ` +/* This file is generated by scripts/bundle-webview.mjs */ +/* eslint-disable */ +/* prettier-ignore */ +const htmlContent = ${JSON.stringify(htmlWithScript)}; + +export const createHTML = (channelId: string) => { + return htmlContent.replace('{{channelId}}', JSON.stringify(channelId)); +}; +`.trimStart(); + +await writeFile('src/browser/iframe/prebuilt.ts', toWrite); + +console.log('Successfully bundled webview, write to src/browser/iframe/prebuilt.ts'); + +if (process.env.DEBUG) { + try { + await mkdir('lib/prebuilt', { recursive: true }); + await writeFile('lib/prebuilt/output.js', output); + await writeFile('lib/prebuilt/webview.html', htmlWithScript); + } catch (error) { + console.log('===== ~ error:', error); + } +} diff --git a/packages/webview/src/browser/iframe-webview.ts b/packages/webview/src/browser/iframe-webview.ts index 12c32f4eb0..2e6c1ad490 100644 --- a/packages/webview/src/browser/iframe-webview.ts +++ b/packages/webview/src/browser/iframe-webview.ts @@ -2,6 +2,7 @@ import { Autowired, Injectable } from '@opensumi/di'; import { AppConfig, Disposable, DomListener, IDisposable, URI, getDebugLogger } from '@opensumi/ide-core-browser'; import { AbstractWebviewPanel } from './abstract-webview'; +import { createHTML } from './iframe/prebuilt'; import { IWebview, IWebviewContentOptions } from './types'; @Injectable({ multiple: true }) @@ -21,6 +22,9 @@ export class IFrameWebviewPanel extends AbstractWebviewPanel implements IWebview super(id, options); this.iframe = document.createElement('iframe'); + this.iframe.name = `webview-${this.id}`; + this.iframe.id = `webview-${this.id}`; + this.iframe.setAttribute('allow', 'autoplay'); const sandboxRules = new Set(['allow-same-origin', 'allow-scripts']); @@ -29,7 +33,13 @@ export class IFrameWebviewPanel extends AbstractWebviewPanel implements IWebview sandboxRules.add('allow-forms'); } this.iframe.setAttribute('sandbox', Array.from(sandboxRules).join(' ')); - this.iframe.setAttribute('src', `${this.config.webviewEndpoint}/index.html?id=${this.id}`); + + if (this.config.useBuiltinWebview || !this.config.webviewEndpoint) { + this.iframe.setAttribute('srcdoc', createHTML(this.id)); + } else { + this.iframe.setAttribute('src', `${this.config.webviewEndpoint}/index.html?id=${this.id}`); + } + this.iframe.style.border = 'none'; this.iframe.style.width = '100%'; this.iframe.style.position = 'absolute'; diff --git a/packages/webview/src/browser/iframe/prebuilt.ts b/packages/webview/src/browser/iframe/prebuilt.ts new file mode 100644 index 0000000000..c3a85b8ba7 --- /dev/null +++ b/packages/webview/src/browser/iframe/prebuilt.ts @@ -0,0 +1,8 @@ +/* This file is generated by scripts/bundle-webview.mjs */ +/* eslint-disable */ +/* prettier-ignore */ +const htmlContent = "\n\n \n \n \n \n Webview Panel Container\n \n\n \n \n \n\n"; + +export const createHTML = (channelId: string) => { + return htmlContent.replace('{{channelId}}', JSON.stringify(channelId)); +}; diff --git a/packages/webview/src/browser/webview.service.ts b/packages/webview/src/browser/webview.service.ts index 25bd290f05..ddc3680fc1 100644 --- a/packages/webview/src/browser/webview.service.ts +++ b/packages/webview/src/browser/webview.service.ts @@ -243,7 +243,7 @@ export class WebviewServiceImpl implements IWebviewService { getWebviewThemeData(theme: ITheme): IWebviewThemeData { const editorFontFamily = this.editorPreferences['editor.fontFamily']; - const editorFontWeight = this.editorPreferences['editor.fontFamily']; + const editorFontWeight = this.editorPreferences['editor.fontWeight']; const editorFontSize = this.editorPreferences['editor.fontSize']; const exportedColors = getColorRegistry() diff --git a/packages/webview/src/electron-webview/host-channel.ts b/packages/webview/src/electron-webview/host-channel.ts index 763df03840..4b2abc6f70 100644 --- a/packages/webview/src/electron-webview/host-channel.ts +++ b/packages/webview/src/electron-webview/host-channel.ts @@ -1,6 +1,7 @@ import { ipcRenderer } from 'electron'; import { IWebviewChannel } from '../webview-host/common'; +import { getIdFromSearch } from '../webview-host/web-iframe-channel'; import { WebviewPanelManager } from '../webview-host/webview-manager'; export class ElectronWebviewChannel implements IWebviewChannel { @@ -11,6 +12,10 @@ export class ElectronWebviewChannel implements IWebviewChannel { public isInDevelopmentMode = false; + get id() { + return getIdFromSearch(); + } + constructor() { window.addEventListener('message', (e) => { if (e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) { diff --git a/packages/webview/src/webview-host/common.ts b/packages/webview/src/webview-host/common.ts index b085fcbddd..4c460d1c8d 100644 --- a/packages/webview/src/webview-host/common.ts +++ b/packages/webview/src/webview-host/common.ts @@ -63,6 +63,7 @@ export interface IWebviewChannel { ready?: Promise; onIframeLoaded?: (iframe: HTMLIFrameElement) => void; fakeLoad: boolean; + id: string; onKeydown?: (event: KeyboardEvent) => void; } diff --git a/packages/webview/src/webview-host/web-iframe-channel.ts b/packages/webview/src/webview-host/web-iframe-channel.ts new file mode 100644 index 0000000000..7325d53b54 --- /dev/null +++ b/packages/webview/src/webview-host/web-iframe-channel.ts @@ -0,0 +1,90 @@ +/* istanbul ignore file */ +import { IWebviewChannel } from './common'; + +export const getIdFromSearch = () => { + const params = new URLSearchParams(document.location.search); + const id = params.get('id'); + if (id) { + return id; + } else { + throw new Error('Missing "id" parameter in URL'); + } +}; + +export class WebIframeChannel implements IWebviewChannel { + private handlers = new Map(); + focusIframeOnCreate?: boolean; + ready?: Promise; + fakeLoad = false; + private isInDevelopmentMode = false; + + private _id: string; + get id() { + if (!this._id) { + this._id = this.getId() ?? ''; + } + return this._id; + } + + constructor(protected getId: () => string) { + window.addEventListener('message', (e) => { + if (e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) { + // Came from inner iframe + this.postMessage(e.data.command, e.data.data); + return; + } + + const channel = e.data.channel; + const handler = this.handlers.get(channel); + if (handler) { + handler(e, e.data.data); + } else { + // eslint-disable-next-line no-console + console.log('no handler for ', e); + } + }); + + this.ready = new Promise((resolve) => { + // TODO 等待service worker完成 未来资源使用service worker时需要加入 + resolve(); + }); + + this.onMessage('devtools-opened', () => { + this.isInDevelopmentMode = true; + }); + } + + get inDev() { + return this.isInDevelopmentMode; + } + + postMessage(channel, data?) { + if (window.parent !== window) { + window.parent.postMessage({ target: this.id, channel, data }, '*'); + } + } + + onMessage(channel, handler) { + this.handlers.set(channel, handler); + } + + onIframeLoaded(newFrame) { + // newFrame.contentWindow.onbeforeunload = () => { + // if (this.isInDevelopmentMode) { // Allow reloads while developing a webview + // this.postMessage('do-reload'); + // return false; + // } + // // Block navigation when not in development mode + // console.log('prevented webview navigation'); + // return false; + // }; + } + + onKeydown(event: KeyboardEvent) { + // 在浏览器上,需要阻止一些默认的keydown快捷键 + if (event.key === 's' && (event.metaKey || event.ctrlKey)) { + // 阻止保存 + event.preventDefault(); + } + } +} diff --git a/packages/webview/src/webview-host/web-preload-builtin.ts b/packages/webview/src/webview-host/web-preload-builtin.ts new file mode 100644 index 0000000000..87fb0ecd05 --- /dev/null +++ b/packages/webview/src/webview-host/web-preload-builtin.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +import { WebIframeChannel } from './web-iframe-channel'; +import { WebviewPanelManager } from './webview-manager'; + +interface ExtendedWindow extends Window { + channelId: string; +} + +new WebviewPanelManager(new WebIframeChannel(() => (window as unknown as ExtendedWindow).channelId)); diff --git a/packages/webview/src/webview-host/web-preload.ts b/packages/webview/src/webview-host/web-preload.ts index 13865df514..ff79c99166 100644 --- a/packages/webview/src/webview-host/web-preload.ts +++ b/packages/webview/src/webview-host/web-preload.ts @@ -1,76 +1,5 @@ /* istanbul ignore file */ -import { IWebviewChannel } from './common'; +import { WebIframeChannel, getIdFromSearch } from './web-iframe-channel'; import { WebviewPanelManager } from './webview-manager'; -export class WebIframeChannel implements IWebviewChannel { - private handlers = new Map(); - focusIframeOnCreate?: boolean | undefined; - ready?: Promise | undefined; - fakeLoad = false; - private isInDevelopmentMode = false; - private id = document!.location!.search!.match(/\bid=([\w-]+)/)![1]; - - constructor() { - window.addEventListener('message', (e) => { - if (e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) { - // Came from inner iframe - this.postMessage(e.data.command, e.data.data); - return; - } - - const channel = e.data.channel; - const handler = this.handlers.get(channel); - if (handler) { - handler(e, e.data.data); - } else { - // eslint-disable-next-line no-console - console.log('no handler for ', e); - } - }); - - this.ready = new Promise(async (resolve) => { - // TODO 等待service worker完成 未来资源使用service worker时需要加入 - resolve(); - }); - - this.onMessage('devtools-opened', () => { - this.isInDevelopmentMode = true; - }); - } - - get inDev() { - return this.isInDevelopmentMode; - } - - postMessage(channel, data?) { - if (window.parent !== window) { - window.parent.postMessage({ target: this.id, channel, data }, '*'); - } - } - - onMessage(channel, handler) { - this.handlers.set(channel, handler); - } - - onIframeLoaded(newFrame) { - // newFrame.contentWindow.onbeforeunload = () => { - // if (this.isInDevelopmentMode) { // Allow reloads while developing a webview - // this.postMessage('do-reload'); - // return false; - // } - // // Block navigation when not in development mode - // console.log('prevented webview navigation'); - // return false; - // }; - } - - onKeydown(event: KeyboardEvent) { - // 在浏览器上,需要阻止一些默认的keydown快捷键 - if (event.key === 's' && (event.metaKey || event.ctrlKey)) { - // 阻止保存 - event.preventDefault(); - } - } -} - -new WebviewPanelManager(new WebIframeChannel()); +new WebviewPanelManager(new WebIframeChannel(getIdFromSearch)); diff --git a/packages/webview/src/webview-host/webview-manager.ts b/packages/webview/src/webview-host/webview-manager.ts index 6b7cf2a4c9..9e714a8ea1 100644 --- a/packages/webview/src/webview-host/webview-manager.ts +++ b/packages/webview/src/webview-host/webview-manager.ts @@ -9,15 +9,16 @@ export class WebviewPanelManager { private loadTimeout; private pendingMessages: any[] = []; private initialScrollProgress: number; - private ID: string | undefined; + + get ID() { + return this.channel.id; + } constructor(private channel: IWebviewChannel) { document.addEventListener('DOMContentLoaded', this.init.bind(this)); } private init() { - const idMatch = document.location.search.match(/\bid=([\w-]+)/); - this.ID = idMatch ? idMatch[1] : undefined; if (!document.body) { return; } diff --git a/tools/cli-engine/configs/webpack.config.webview.js b/tools/cli-engine/configs/webpack.config.webview.js index 60f1fcf3ce..d9cda8079f 100644 --- a/tools/cli-engine/configs/webpack.config.webview.js +++ b/tools/cli-engine/configs/webpack.config.webview.js @@ -1,7 +1,6 @@ const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); -const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); const tsConfigPath = path.join(__dirname, './tsconfig.json'); const distDir = path.join(__dirname, '../lib/node/webview'); @@ -44,8 +43,5 @@ module.exports = { new HtmlWebpackPlugin({ template: path.join(__dirname, '../src/webview/webview-host/webview.html'), }), - new NodePolyfillPlugin({ - includeAliases: ['process', 'Buffer'], - }), ], }; diff --git a/tools/dev-tool/src/server.ts b/tools/dev-tool/src/server.ts index fc72708a74..98e0bfe150 100644 --- a/tools/dev-tool/src/server.ts +++ b/tools/dev-tool/src/server.ts @@ -6,7 +6,7 @@ import Koa from 'koa'; import KoaRouter from 'koa-router'; import Static from 'koa-static'; -import { Injector, Provider } from '@opensumi/di'; +import { Injector } from '@opensumi/di'; import { Deferred } from '@opensumi/ide-core-common'; import { IServerAppOpts, NodeModule, ServerApp } from '@opensumi/ide-core-node'; import { @@ -48,6 +48,10 @@ export async function startServer( } }); + router.get('/', (ctx) => { + ctx.body = 'OpenSumi'; + }); + app.use(router.routes()); if (options && options.mountStaticPath) { diff --git a/yarn.lock b/yarn.lock index 7b865243b1..9c3ee73113 100644 --- a/yarn.lock +++ b/yarn.lock @@ -805,6 +805,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/aix-ppc64@npm:0.24.0" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/android-arm64@npm:0.19.12" @@ -812,6 +819,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm64@npm:0.24.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/android-arm@npm:0.19.12" @@ -819,6 +833,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm@npm:0.24.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/android-x64@npm:0.19.12" @@ -826,6 +847,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-x64@npm:0.24.0" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/darwin-arm64@npm:0.19.12" @@ -833,6 +861,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-arm64@npm:0.24.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/darwin-x64@npm:0.19.12" @@ -840,6 +875,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-x64@npm:0.24.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/freebsd-arm64@npm:0.19.12" @@ -847,6 +889,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-arm64@npm:0.24.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/freebsd-x64@npm:0.19.12" @@ -854,6 +903,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-x64@npm:0.24.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-arm64@npm:0.19.12" @@ -861,6 +917,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm64@npm:0.24.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-arm@npm:0.19.12" @@ -868,6 +931,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm@npm:0.24.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-ia32@npm:0.19.12" @@ -875,6 +945,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ia32@npm:0.24.0" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-loong64@npm:0.19.12" @@ -882,6 +959,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-loong64@npm:0.24.0" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-mips64el@npm:0.19.12" @@ -889,6 +973,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-mips64el@npm:0.24.0" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-ppc64@npm:0.19.12" @@ -896,6 +987,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ppc64@npm:0.24.0" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-riscv64@npm:0.19.12" @@ -903,6 +1001,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-riscv64@npm:0.24.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-s390x@npm:0.19.12" @@ -910,6 +1015,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-s390x@npm:0.24.0" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-x64@npm:0.19.12" @@ -917,6 +1029,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-x64@npm:0.24.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/netbsd-x64@npm:0.19.12" @@ -924,6 +1043,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/netbsd-x64@npm:0.24.0" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-arm64@npm:0.24.0" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/openbsd-x64@npm:0.19.12" @@ -931,6 +1064,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-x64@npm:0.24.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/sunos-x64@npm:0.19.12" @@ -938,6 +1078,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/sunos-x64@npm:0.24.0" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/win32-arm64@npm:0.19.12" @@ -945,6 +1092,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-arm64@npm:0.24.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/win32-ia32@npm:0.19.12" @@ -952,6 +1106,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-ia32@npm:0.24.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/win32-x64@npm:0.19.12" @@ -959,6 +1120,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-x64@npm:0.24.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -1979,6 +2147,7 @@ __metadata: cross-env: "npm:^7.0.3" debug: "npm:^4.3.2" depcheck: "npm:^1.4.7" + esbuild: "npm:^0.24.0" eslint: "npm:^8.9.0" eslint-config-prettier: "npm:^8.4.0" eslint-import-resolver-typescript: "npm:^2.5.0" @@ -8369,6 +8538,89 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.24.0": + version: 0.24.0 + resolution: "esbuild@npm:0.24.0" + dependencies: + "@esbuild/aix-ppc64": "npm:0.24.0" + "@esbuild/android-arm": "npm:0.24.0" + "@esbuild/android-arm64": "npm:0.24.0" + "@esbuild/android-x64": "npm:0.24.0" + "@esbuild/darwin-arm64": "npm:0.24.0" + "@esbuild/darwin-x64": "npm:0.24.0" + "@esbuild/freebsd-arm64": "npm:0.24.0" + "@esbuild/freebsd-x64": "npm:0.24.0" + "@esbuild/linux-arm": "npm:0.24.0" + "@esbuild/linux-arm64": "npm:0.24.0" + "@esbuild/linux-ia32": "npm:0.24.0" + "@esbuild/linux-loong64": "npm:0.24.0" + "@esbuild/linux-mips64el": "npm:0.24.0" + "@esbuild/linux-ppc64": "npm:0.24.0" + "@esbuild/linux-riscv64": "npm:0.24.0" + "@esbuild/linux-s390x": "npm:0.24.0" + "@esbuild/linux-x64": "npm:0.24.0" + "@esbuild/netbsd-x64": "npm:0.24.0" + "@esbuild/openbsd-arm64": "npm:0.24.0" + "@esbuild/openbsd-x64": "npm:0.24.0" + "@esbuild/sunos-x64": "npm:0.24.0" + "@esbuild/win32-arm64": "npm:0.24.0" + "@esbuild/win32-ia32": "npm:0.24.0" + "@esbuild/win32-x64": "npm:0.24.0" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10/500f83a1216d6548053007b85c070d8293395db344605b17418c6cf1217e5e8d338fa77fc8af27c23faa121c5528e5b0004d46d3a0cdeb87d48f1b5fa0164bc5 + languageName: node + linkType: hard + "esbuild@npm:~0.19.10": version: 0.19.12 resolution: "esbuild@npm:0.19.12" From 9c0d68a8f8e11450866e28224843c182126163a3 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 11 Oct 2024 09:29:08 +0800 Subject: [PATCH 07/42] fix: tab keybinding invalid when always visible (#4075) --- .../intelligent-completions.controller.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts index 3f2a76176f..aa773e329f 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts @@ -1,4 +1,4 @@ -import { PreferenceService } from '@opensumi/ide-core-browser'; +import { Key, KeybindingRegistry, KeybindingScope, PreferenceService } from '@opensumi/ide-core-browser'; import { MultiLineEditsIsVisible } from '@opensumi/ide-core-browser/lib/contextkey/ai-native'; import { AINativeSettingSectionsId, @@ -13,11 +13,15 @@ import { ICodeEditor, ICursorPositionChangedEvent, IRange, ITextModel, Range } f import { empty } from '@opensumi/ide-utils/lib/strings'; import { autorun, transaction } from '@opensumi/monaco-editor-core/esm/vs/base/common/observable'; import { ObservableValue } from '@opensumi/monaco-editor-core/esm/vs/base/common/observableInternal/base'; +import { EditorContextKeys } from '@opensumi/monaco-editor-core/esm/vs/editor/common/editorContextKeys'; +import { inlineSuggestCommitId } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/commandIds'; +import { InlineCompletionContextKeys } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys'; import { InlineCompletionsController } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController'; import { SuggestItemInfo, SuggestWidgetAdaptor, } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider'; +import { ContextKeyExpr } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/common/contextkey'; import { AINativeContextKey } from '../../contextkey/ai-native.contextkey.service'; import { REWRITE_DECORATION_INLINE_ADD, RewriteWidget } from '../../widget/rewrite/rewrite-widget'; @@ -54,6 +58,10 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll return this.injector.get(PreferenceService); } + private get keybindingRegistry(): KeybindingRegistry { + return this.injector.get(KeybindingRegistry); + } + private multiLineDecorationModel: MultiLineDecorationModel; private additionsDeletionsDecorationModel: AdditionsDeletionsDecorationModel; private aiNativeContextKey: AINativeContextKey; @@ -76,6 +84,27 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll let observableDisposable = new Disposable(); const register = () => { + /** + * by: https://github.com/microsoft/vscode/blob/release/1.87/src/vs/editor/contrib/inlineCompletions/browser/commands.ts#L136 + * 修改了原生的 inline completion 的 tab keybinding when 条件,使其不受 suggest 的影响 + */ + observableDisposable.addDispose( + this.keybindingRegistry.registerKeybinding( + { + command: inlineSuggestCommitId, + keybinding: Key.TAB.code, + when: ContextKeyExpr.and( + InlineCompletionContextKeys.inlineSuggestionVisible, + EditorContextKeys.tabMovesFocus.toNegated(), + InlineCompletionContextKeys.inlineSuggestionHasIndentationLessThanTabSize, + // SuggestContext.Visible.toNegated(), // 只去除了这个 when 条件 + EditorContextKeys.hoverFocused.toNegated(), + ), + }, + KeybindingScope.USER, + ), + ); + const inlineCompletionsController = InlineCompletionsController.get(this.monacoEditor); if (inlineCompletionsController) { observableDisposable.addDispose( From 85572363049eac330a2f72c619ab9d5efd39ed72 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 01:33:52 +0000 Subject: [PATCH 08/42] chore: update manifest.json to v3.4.2 --- packages/types/manifest.json | 236 +++++++++++++++++------------------ 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/packages/types/manifest.json b/packages/types/manifest.json index 718447cdf7..c697a1d95d 100644 --- a/packages/types/manifest.json +++ b/packages/types/manifest.json @@ -1,301 +1,301 @@ { "meta": { "@opensumi/ide-addons": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-ai-native": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-collaboration": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-comments": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-components": { - "version": "3.4.1", + "version": "3.4.2", "entry": [] }, "@opensumi/ide-connection": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-core-browser": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["common"] }, "@opensumi/ide-core-common": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node"] }, "@opensumi/ide-core-electron-main": { - "version": "3.4.1", + "version": "3.4.2", "entry": [] }, "@opensumi/ide-core-node": { - "version": "3.4.1", + "version": "3.4.2", "entry": [] }, "@opensumi/ide-debug": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-decoration": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-design": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-editor": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-electron-basic": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser"] }, "@opensumi/ide-explorer": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser"] }, "@opensumi/ide-express-file-server": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension-manager": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension-storage": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-file-scheme": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-file-search": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "common"] }, "@opensumi/ide-file-service": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-file-tree-next": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-i18n": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-keymaps": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-logs": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-main-layout": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-markdown": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-markers": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-menu-bar": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser"] }, "@opensumi/ide-monaco": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-monaco-enhance": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-opened-editor": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-outline": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-output": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-overlay": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-preferences": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-process": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "common"] }, "@opensumi/ide-quick-open": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/remote-cli": { - "version": "3.4.1", + "version": "3.4.2", "entry": [] }, "@opensumi/ide-remote-opener": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-scm": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-search": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-startup": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser"] }, "@opensumi/ide-static-resource": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser"] }, "@opensumi/ide-status-bar": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-storage": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-task": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-terminal-next": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["node", "browser", "common"] }, "@opensumi/ide-testing": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-theme": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-toolbar": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser"] }, "@opensumi/sumi": { - "version": "3.4.1", + "version": "3.4.2", "entry": [] }, "@opensumi/ide-utils": { - "version": "3.4.1", + "version": "3.4.2", "entry": [] }, "@opensumi/ide-variable": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-webview": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-workspace": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] }, "@opensumi/ide-workspace-edit": { - "version": "3.4.1", + "version": "3.4.2", "entry": ["browser", "common"] } }, "packages": { - "@opensumi/ide-addons": "3.4.1", - "@opensumi/ide-ai-native": "3.4.1", - "@opensumi/ide-collaboration": "3.4.1", - "@opensumi/ide-comments": "3.4.1", - "@opensumi/ide-components": "3.4.1", - "@opensumi/ide-connection": "3.4.1", - "@opensumi/ide-core-browser": "3.4.1", - "@opensumi/ide-core-common": "3.4.1", - "@opensumi/ide-core-electron-main": "3.4.1", - "@opensumi/ide-core-node": "3.4.1", - "@opensumi/ide-debug": "3.4.1", - "@opensumi/ide-decoration": "3.4.1", - "@opensumi/ide-design": "3.4.1", - "@opensumi/ide-editor": "3.4.1", - "@opensumi/ide-electron-basic": "3.4.1", - "@opensumi/ide-explorer": "3.4.1", - "@opensumi/ide-express-file-server": "3.4.1", - "@opensumi/ide-extension": "3.4.1", - "@opensumi/ide-extension-manager": "3.4.1", - "@opensumi/ide-extension-storage": "3.4.1", - "@opensumi/ide-file-scheme": "3.4.1", - "@opensumi/ide-file-search": "3.4.1", - "@opensumi/ide-file-service": "3.4.1", - "@opensumi/ide-file-tree-next": "3.4.1", - "@opensumi/ide-i18n": "3.4.1", - "@opensumi/ide-keymaps": "3.4.1", - "@opensumi/ide-logs": "3.4.1", - "@opensumi/ide-main-layout": "3.4.1", - "@opensumi/ide-markdown": "3.4.1", - "@opensumi/ide-markers": "3.4.1", - "@opensumi/ide-menu-bar": "3.4.1", - "@opensumi/ide-monaco": "3.4.1", - "@opensumi/ide-monaco-enhance": "3.4.1", - "@opensumi/ide-opened-editor": "3.4.1", - "@opensumi/ide-outline": "3.4.1", - "@opensumi/ide-output": "3.4.1", - "@opensumi/ide-overlay": "3.4.1", - "@opensumi/ide-preferences": "3.4.1", - "@opensumi/ide-process": "3.4.1", - "@opensumi/ide-quick-open": "3.4.1", - "@opensumi/remote-cli": "3.4.1", - "@opensumi/ide-remote-opener": "3.4.1", - "@opensumi/ide-scm": "3.4.1", - "@opensumi/ide-search": "3.4.1", - "@opensumi/ide-startup": "3.4.1", - "@opensumi/ide-static-resource": "3.4.1", - "@opensumi/ide-status-bar": "3.4.1", - "@opensumi/ide-storage": "3.4.1", - "@opensumi/ide-task": "3.4.1", - "@opensumi/ide-terminal-next": "3.4.1", - "@opensumi/ide-testing": "3.4.1", - "@opensumi/ide-theme": "3.4.1", - "@opensumi/ide-toolbar": "3.4.1", - "@opensumi/sumi": "3.4.1", - "@opensumi/ide-utils": "3.4.1", - "@opensumi/ide-variable": "3.4.1", - "@opensumi/ide-webview": "3.4.1", - "@opensumi/ide-workspace": "3.4.1", - "@opensumi/ide-workspace-edit": "3.4.1" + "@opensumi/ide-addons": "3.4.2", + "@opensumi/ide-ai-native": "3.4.2", + "@opensumi/ide-collaboration": "3.4.2", + "@opensumi/ide-comments": "3.4.2", + "@opensumi/ide-components": "3.4.2", + "@opensumi/ide-connection": "3.4.2", + "@opensumi/ide-core-browser": "3.4.2", + "@opensumi/ide-core-common": "3.4.2", + "@opensumi/ide-core-electron-main": "3.4.2", + "@opensumi/ide-core-node": "3.4.2", + "@opensumi/ide-debug": "3.4.2", + "@opensumi/ide-decoration": "3.4.2", + "@opensumi/ide-design": "3.4.2", + "@opensumi/ide-editor": "3.4.2", + "@opensumi/ide-electron-basic": "3.4.2", + "@opensumi/ide-explorer": "3.4.2", + "@opensumi/ide-express-file-server": "3.4.2", + "@opensumi/ide-extension": "3.4.2", + "@opensumi/ide-extension-manager": "3.4.2", + "@opensumi/ide-extension-storage": "3.4.2", + "@opensumi/ide-file-scheme": "3.4.2", + "@opensumi/ide-file-search": "3.4.2", + "@opensumi/ide-file-service": "3.4.2", + "@opensumi/ide-file-tree-next": "3.4.2", + "@opensumi/ide-i18n": "3.4.2", + "@opensumi/ide-keymaps": "3.4.2", + "@opensumi/ide-logs": "3.4.2", + "@opensumi/ide-main-layout": "3.4.2", + "@opensumi/ide-markdown": "3.4.2", + "@opensumi/ide-markers": "3.4.2", + "@opensumi/ide-menu-bar": "3.4.2", + "@opensumi/ide-monaco": "3.4.2", + "@opensumi/ide-monaco-enhance": "3.4.2", + "@opensumi/ide-opened-editor": "3.4.2", + "@opensumi/ide-outline": "3.4.2", + "@opensumi/ide-output": "3.4.2", + "@opensumi/ide-overlay": "3.4.2", + "@opensumi/ide-preferences": "3.4.2", + "@opensumi/ide-process": "3.4.2", + "@opensumi/ide-quick-open": "3.4.2", + "@opensumi/remote-cli": "3.4.2", + "@opensumi/ide-remote-opener": "3.4.2", + "@opensumi/ide-scm": "3.4.2", + "@opensumi/ide-search": "3.4.2", + "@opensumi/ide-startup": "3.4.2", + "@opensumi/ide-static-resource": "3.4.2", + "@opensumi/ide-status-bar": "3.4.2", + "@opensumi/ide-storage": "3.4.2", + "@opensumi/ide-task": "3.4.2", + "@opensumi/ide-terminal-next": "3.4.2", + "@opensumi/ide-testing": "3.4.2", + "@opensumi/ide-theme": "3.4.2", + "@opensumi/ide-toolbar": "3.4.2", + "@opensumi/sumi": "3.4.2", + "@opensumi/ide-utils": "3.4.2", + "@opensumi/ide-variable": "3.4.2", + "@opensumi/ide-webview": "3.4.2", + "@opensumi/ide-workspace": "3.4.2", + "@opensumi/ide-workspace-edit": "3.4.2" } } From c34b6681b15ab002adf3e6649f417037b348bb2c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 01:34:06 +0000 Subject: [PATCH 09/42] v3.4.2 --- lerna.json | 2 +- packages/addons/package.json | 2 +- packages/ai-native/package.json | 2 +- packages/collaboration/package.json | 2 +- packages/comments/package.json | 2 +- packages/components/package.json | 2 +- packages/connection/package.json | 2 +- packages/core-browser/package.json | 2 +- packages/core-common/package.json | 2 +- packages/core-electron-main/package.json | 2 +- packages/core-node/package.json | 2 +- packages/debug/package.json | 2 +- packages/decoration/package.json | 2 +- packages/design/package.json | 2 +- packages/editor/package.json | 2 +- packages/electron-basic/package.json | 2 +- packages/explorer/package.json | 2 +- packages/express-file-server/package.json | 2 +- packages/extension-manager/package.json | 2 +- packages/extension-storage/package.json | 2 +- packages/extension/package.json | 2 +- packages/file-scheme/package.json | 2 +- packages/file-search/package.json | 2 +- packages/file-service/package.json | 2 +- packages/file-tree-next/package.json | 2 +- packages/i18n/package.json | 2 +- packages/keymaps/package.json | 2 +- packages/logs-core/package.json | 2 +- packages/main-layout/package.json | 2 +- packages/markdown/package.json | 2 +- packages/markers/package.json | 2 +- packages/menu-bar/package.json | 2 +- packages/monaco-enhance/package.json | 2 +- packages/monaco/package.json | 2 +- packages/opened-editor/package.json | 2 +- packages/outline/package.json | 2 +- packages/output/package.json | 2 +- packages/overlay/package.json | 2 +- packages/preferences/package.json | 2 +- packages/process/package.json | 2 +- packages/quick-open/package.json | 2 +- packages/remote-opener/package.json | 2 +- packages/scm/package.json | 2 +- packages/search/package.json | 2 +- packages/startup/package.json | 2 +- packages/static-resource/package.json | 2 +- packages/status-bar/package.json | 2 +- packages/storage/package.json | 2 +- packages/task/package.json | 2 +- packages/terminal-next/package.json | 2 +- packages/testing/package.json | 2 +- packages/theme/package.json | 2 +- packages/toolbar/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/variable/package.json | 2 +- packages/webview/package.json | 2 +- packages/workspace-edit/package.json | 2 +- packages/workspace/package.json | 2 +- tools/cli-engine/package.json | 2 +- tools/dev-tool/package.json | 2 +- tools/playwright/package.json | 2 +- 62 files changed, 62 insertions(+), 62 deletions(-) diff --git a/lerna.json b/lerna.json index a158d216c8..8402407620 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "3.4.1" + "version": "3.4.2" } diff --git a/packages/addons/package.json b/packages/addons/package.json index 7e28ddaece..3f3317ef07 100644 --- a/packages/addons/package.json +++ b/packages/addons/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-addons", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/ai-native/package.json b/packages/ai-native/package.json index cd90de1768..eec52146f6 100644 --- a/packages/ai-native/package.json +++ b/packages/ai-native/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-ai-native", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index 0b1f4b60f2..210b1ab036 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-collaboration", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/comments/package.json b/packages/comments/package.json index 5fd6704ed8..ce685d4d81 100644 --- a/packages/comments/package.json +++ b/packages/comments/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-comments", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/components/package.json b/packages/components/package.json index c88dcd3e4f..bae5979e42 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-components", - "version": "3.4.1", + "version": "3.4.2", "description": "@opensumi/ide-components", "license": "MIT", "main": "lib/index.js", diff --git a/packages/connection/package.json b/packages/connection/package.json index 0e0bf1474b..a05e038d67 100644 --- a/packages/connection/package.json +++ b/packages/connection/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-connection", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/core-browser/package.json b/packages/core-browser/package.json index 0f86305f9f..5c0ed694aa 100644 --- a/packages/core-browser/package.json +++ b/packages/core-browser/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-browser", - "version": "3.4.1", + "version": "3.4.2", "description": "@opensumi/ide-core-browser", "files": [ "lib", diff --git a/packages/core-common/package.json b/packages/core-common/package.json index 0891683cfe..c20cbb2412 100644 --- a/packages/core-common/package.json +++ b/packages/core-common/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-common", - "version": "3.4.1", + "version": "3.4.2", "description": "@opensumi/ide-core-common", "files": [ "lib", diff --git a/packages/core-electron-main/package.json b/packages/core-electron-main/package.json index 78f1d0d246..f6f06123a7 100644 --- a/packages/core-electron-main/package.json +++ b/packages/core-electron-main/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-electron-main", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "browser-preload" diff --git a/packages/core-node/package.json b/packages/core-node/package.json index d738daf7a5..b0b8ab8b68 100644 --- a/packages/core-node/package.json +++ b/packages/core-node/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-node", - "version": "3.4.1", + "version": "3.4.2", "description": "@opensumi/ide-core-node", "files": [ "lib", diff --git a/packages/debug/package.json b/packages/debug/package.json index 1c13e2fcfc..be6e83a6f7 100644 --- a/packages/debug/package.json +++ b/packages/debug/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-debug", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/decoration/package.json b/packages/decoration/package.json index 5544e37667..764af88c37 100644 --- a/packages/decoration/package.json +++ b/packages/decoration/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-decoration", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/design/package.json b/packages/design/package.json index eb6efa1fd6..b3c52ea8f2 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-design", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/editor/package.json b/packages/editor/package.json index ed22260c02..1134423daf 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-editor", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/electron-basic/package.json b/packages/electron-basic/package.json index 7722de3e54..fb1d28431b 100644 --- a/packages/electron-basic/package.json +++ b/packages/electron-basic/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-electron-basic", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/explorer/package.json b/packages/explorer/package.json index d580c53164..c957d577dc 100644 --- a/packages/explorer/package.json +++ b/packages/explorer/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-explorer", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/express-file-server/package.json b/packages/express-file-server/package.json index f601de61c3..47ca118157 100644 --- a/packages/express-file-server/package.json +++ b/packages/express-file-server/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-express-file-server", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/extension-manager/package.json b/packages/extension-manager/package.json index 3d3dfe45d0..2df403bf20 100644 --- a/packages/extension-manager/package.json +++ b/packages/extension-manager/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension-manager", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/extension-storage/package.json b/packages/extension-storage/package.json index aec2a4cc92..d77d2d4b9b 100644 --- a/packages/extension-storage/package.json +++ b/packages/extension-storage/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension-storage", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/extension/package.json b/packages/extension/package.json index bf308f2f5c..ed48181114 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "hosted" diff --git a/packages/file-scheme/package.json b/packages/file-scheme/package.json index 125b959bf9..2fa10fee80 100644 --- a/packages/file-scheme/package.json +++ b/packages/file-scheme/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-scheme", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/file-search/package.json b/packages/file-search/package.json index 8136c599e1..9361c47715 100644 --- a/packages/file-search/package.json +++ b/packages/file-search/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-search", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/file-service/package.json b/packages/file-service/package.json index 2f03495fb4..052abb4047 100644 --- a/packages/file-service/package.json +++ b/packages/file-service/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-service", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/file-tree-next/package.json b/packages/file-tree-next/package.json index cbce9a8928..70e8bef83e 100644 --- a/packages/file-tree-next/package.json +++ b/packages/file-tree-next/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-tree-next", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 04bd04fc06..e8a2637fdd 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-i18n", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index ceb9207c42..58c2a8ccb5 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-keymaps", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/logs-core/package.json b/packages/logs-core/package.json index 8abe84a782..0203e9780a 100644 --- a/packages/logs-core/package.json +++ b/packages/logs-core/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-logs", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/main-layout/package.json b/packages/main-layout/package.json index 1bc0f68e05..cd9d1a90a0 100644 --- a/packages/main-layout/package.json +++ b/packages/main-layout/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-main-layout", - "version": "3.4.1", + "version": "3.4.2", "description": "@opensumi/ide-main-layout", "files": [ "lib", diff --git a/packages/markdown/package.json b/packages/markdown/package.json index b41aaacf53..ca168bd526 100644 --- a/packages/markdown/package.json +++ b/packages/markdown/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-markdown", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/markers/package.json b/packages/markers/package.json index 221976facf..e773e7763c 100644 --- a/packages/markers/package.json +++ b/packages/markers/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-markers", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/menu-bar/package.json b/packages/menu-bar/package.json index ea19cbb11b..27bb29204a 100644 --- a/packages/menu-bar/package.json +++ b/packages/menu-bar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-menu-bar", - "version": "3.4.1", + "version": "3.4.2", "description": "@opensumi/ide-menu-bar", "files": [ "lib", diff --git a/packages/monaco-enhance/package.json b/packages/monaco-enhance/package.json index ac790e8627..7d13d11045 100644 --- a/packages/monaco-enhance/package.json +++ b/packages/monaco-enhance/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-monaco-enhance", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/monaco/package.json b/packages/monaco/package.json index db7d0d53e7..10b6ac1820 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-monaco", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src", diff --git a/packages/opened-editor/package.json b/packages/opened-editor/package.json index 6a2ec3617c..ae1ced6bb9 100644 --- a/packages/opened-editor/package.json +++ b/packages/opened-editor/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-opened-editor", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/outline/package.json b/packages/outline/package.json index 14e0cb901d..4a30774541 100644 --- a/packages/outline/package.json +++ b/packages/outline/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-outline", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/output/package.json b/packages/output/package.json index ec7386c408..8d0510415a 100644 --- a/packages/output/package.json +++ b/packages/output/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-output", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/overlay/package.json b/packages/overlay/package.json index 8813bed533..f0fd60798d 100644 --- a/packages/overlay/package.json +++ b/packages/overlay/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-overlay", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/preferences/package.json b/packages/preferences/package.json index fb4e0536ce..c328730973 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-preferences", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/process/package.json b/packages/process/package.json index cc513546db..b27ff683e1 100644 --- a/packages/process/package.json +++ b/packages/process/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-process", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/quick-open/package.json b/packages/quick-open/package.json index abc2b838ed..761cd9119b 100644 --- a/packages/quick-open/package.json +++ b/packages/quick-open/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-quick-open", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/remote-opener/package.json b/packages/remote-opener/package.json index 4647e18a34..80357c6754 100644 --- a/packages/remote-opener/package.json +++ b/packages/remote-opener/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-remote-opener", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/scm/package.json b/packages/scm/package.json index e5237d919c..87264fbbf9 100644 --- a/packages/scm/package.json +++ b/packages/scm/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-scm", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/search/package.json b/packages/search/package.json index ede3fbfbd0..e5b380eb0a 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-search", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/startup/package.json b/packages/startup/package.json index 4202514ba2..5e7359d26f 100644 --- a/packages/startup/package.json +++ b/packages/startup/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-startup", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/static-resource/package.json b/packages/static-resource/package.json index f524e56092..12c2cbf974 100644 --- a/packages/static-resource/package.json +++ b/packages/static-resource/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-static-resource", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/status-bar/package.json b/packages/status-bar/package.json index 34be3a40e1..8b9cf53683 100644 --- a/packages/status-bar/package.json +++ b/packages/status-bar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-status-bar", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/storage/package.json b/packages/storage/package.json index cd9a15e6b7..93374d55bf 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-storage", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/task/package.json b/packages/task/package.json index 4296b32a82..a9a464273a 100644 --- a/packages/task/package.json +++ b/packages/task/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-task", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/terminal-next/package.json b/packages/terminal-next/package.json index e0fd3b1024..4301471e33 100644 --- a/packages/terminal-next/package.json +++ b/packages/terminal-next/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-terminal-next", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/testing/package.json b/packages/testing/package.json index a1d1099ad7..b07fff6cc7 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-testing", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/theme/package.json b/packages/theme/package.json index 18fb0b83ad..96ff163ff5 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-theme", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json index b0be3d37fe..6d917bb647 100644 --- a/packages/toolbar/package.json +++ b/packages/toolbar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-toolbar", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/types/package.json b/packages/types/package.json index a9bf7a531d..e50246d33c 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/sumi", - "version": "3.4.1", + "version": "3.4.2", "typings": "index.d.ts", "license": "MIT", "repository": { diff --git a/packages/utils/package.json b/packages/utils/package.json index 0fad10e4c4..e9f4a22e42 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-utils", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/variable/package.json b/packages/variable/package.json index a425d39bc0..4359327367 100644 --- a/packages/variable/package.json +++ b/packages/variable/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-variable", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/webview/package.json b/packages/webview/package.json index 3bea1a644e..f104b60db1 100644 --- a/packages/webview/package.json +++ b/packages/webview/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-webview", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/workspace-edit/package.json b/packages/workspace-edit/package.json index 3f1e92dae6..de296c7d39 100644 --- a/packages/workspace-edit/package.json +++ b/packages/workspace-edit/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-workspace-edit", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 95fb67618f..d2078b30ce 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-workspace", - "version": "3.4.1", + "version": "3.4.2", "files": [ "lib", "src" diff --git a/tools/cli-engine/package.json b/tools/cli-engine/package.json index 40e6a8d021..4a6be3b775 100644 --- a/tools/cli-engine/package.json +++ b/tools/cli-engine/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/cli-engine", - "version": "3.4.1", + "version": "3.4.2", "description": "Integration engine runtime for opensumi-cli and opensumi extension", "license": "MIT", "files": [ diff --git a/tools/dev-tool/package.json b/tools/dev-tool/package.json index e97f4f2076..56c634f0bc 100644 --- a/tools/dev-tool/package.json +++ b/tools/dev-tool/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-dev-tool", - "version": "3.4.1", + "version": "3.4.2", "repository": { "type": "git", "url": "git@github.com:opensumi/core.git" diff --git a/tools/playwright/package.json b/tools/playwright/package.json index 579d266f56..1c9cbaee81 100644 --- a/tools/playwright/package.json +++ b/tools/playwright/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/playwright", - "version": "3.4.1", + "version": "3.4.2", "description": "E2E test module for OpenSumi", "files": [ "lib", From 7377d4162d21cef58e0f2ac381d9b7ea6af5a042 Mon Sep 17 00:00:00 2001 From: Hang Ma Date: Fri, 11 Oct 2024 10:42:12 +0800 Subject: [PATCH 10/42] chore: add missing ajv dep for keymaps package (#4072) --- packages/keymaps/package.json | 3 ++- yarn.lock | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index ceb9207c42..06cb1b33f3 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -17,7 +17,8 @@ "url": "git@github.com:opensumi/core.git" }, "dependencies": { - "@opensumi/ide-core-common": "workspace:*" + "@opensumi/ide-core-common": "workspace:*", + "ajv": "^6.10.0" }, "devDependencies": { "@opensumi/ide-components": "workspace:*", diff --git a/yarn.lock b/yarn.lock index 9c3ee73113..31f9fe28b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2753,6 +2753,7 @@ __metadata: "@opensumi/ide-file-service": "workspace:*" "@opensumi/ide-preferences": "workspace:*" "@opensumi/ide-quick-open": "workspace:*" + ajv: "npm:^6.10.0" languageName: unknown linkType: soft From c2e97aef1876672a17e62ab355ad9c953aec14cb Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 11 Oct 2024 11:11:26 +0800 Subject: [PATCH 11/42] fix: fix unexpected file operations on explorer (#4073) --- .../src/browser/file-tree.service.ts | 39 +++++++++++++++---- .../services/file-tree-model.service.ts | 24 +++++++----- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/packages/file-tree-next/src/browser/file-tree.service.ts b/packages/file-tree-next/src/browser/file-tree.service.ts index 09ef102959..fe5e7e98fe 100644 --- a/packages/file-tree-next/src/browser/file-tree.service.ts +++ b/packages/file-tree-next/src/browser/file-tree.service.ts @@ -634,7 +634,29 @@ export class FileTreeService extends Tree implements IFileTreeService { } } if (path) { - return this.root?.getTreeNodeByPath(path) as File | Directory; + const node = this.root?.getTreeNodeByPath(path) as File | Directory; + if (!node) { + // 尝试从再上层获取节点,可能为压缩节点 + let parentNode: Directory | undefined; + const paths = path.split(Path.separator); + while (paths.length >= 1) { + paths.pop(); + const parentPath = paths.join(Path.separator); + parentNode = this.root?.getTreeNodeByPath(parentPath) as Directory; + if (parentNode) { + break; + } + } + // 找到最相邻的父节点,从父节点的子节点中筛选出节点 + if (parentNode && Directory.is(parentNode)) { + for (const child of (parentNode as Directory).children || []) { + if (child.path.includes(path)) { + return child as Directory | File; + } + } + } + } + return node; } } @@ -713,13 +735,14 @@ export class FileTreeService extends Tree implements IFileTreeService { })) .filter((node) => node && !!node.node) as ISortNode[]; - nodes.sort((pathA, pathB) => { - // 直接获取节点深度比通过path取深度更可靠 - const pathADepth = pathA.node?.depth || 0; - const pathBDepth = pathB.node?.depth || 0; - return pathADepth - pathBDepth; - }); - + if (_paths.length > 1) { + nodes.sort((pathA, pathB) => { + // 直接获取节点深度比通过path取深度更可靠 + const pathADepth = pathA.node?.depth || 0; + const pathBDepth = pathB.node?.depth || 0; + return pathADepth - pathBDepth; + }); + } const roots = [] as ISortNode[]; for (let index = nodes.length - 1; index >= 0; index--) { // 从后往前遍历整个列表 diff --git a/packages/file-tree-next/src/browser/services/file-tree-model.service.ts b/packages/file-tree-next/src/browser/services/file-tree-model.service.ts index 78bf3e40cd..f29477bde1 100644 --- a/packages/file-tree-next/src/browser/services/file-tree-model.service.ts +++ b/packages/file-tree-next/src/browser/services/file-tree-model.service.ts @@ -1005,15 +1005,19 @@ export class FileTreeModelService { // 当存在选中的文件时,默认选中首个文件作为焦点 nextFocusedFile = this.selectedFiles[0]; } else { - const lastFile = roots[roots.length - 1].node; - const lastIndex = this.treeModel.root.getIndexAtTreeNode(lastFile); - let nextIndex = lastIndex + 1; - if (nextIndex >= this.treeModel.root.branchSize) { - const firstFile = roots[0].node; - const firstIndex = this.treeModel.root.getIndexAtTreeNode(firstFile); - nextIndex = firstIndex - 1; + const lastFile = roots[roots.length - 1]?.node; + if (!lastFile) { + nextFocusedFile = undefined; + } else { + const lastIndex = this.treeModel.root.getIndexAtTreeNode(lastFile); + let nextIndex = lastIndex + 1; + if (nextIndex >= this.treeModel.root.branchSize) { + const firstFile = roots[0].node; + const firstIndex = this.treeModel.root.getIndexAtTreeNode(firstFile); + nextIndex = firstIndex - 1; + } + nextFocusedFile = this.treeModel.root.getTreeNodeAtIndex(nextIndex); } - nextFocusedFile = this.treeModel.root.getTreeNodeAtIndex(nextIndex); } const toPromise = [] as Promise[]; @@ -1233,7 +1237,7 @@ export class FileTreeModelService { this.selectFileDecoration(node as File, false); } this.fileTreeService.updateRefreshable(true); - } else if (Directory.is(target)) { + } else if (Directory.is(target) && !Directory.isRoot(target)) { // 更新压缩目录展示名称 // 由于节点移动时默认仅更新节点路径 // 我们需要自己更新额外的参数,如uri, filestat等 @@ -1295,7 +1299,7 @@ export class FileTreeModelService { } if (this.fileTreeService.isCompactMode) { if (promptHandle.type === TreeNodeType.CompositeTreeNode) { - const isEmptyDirectory = !parent.children || parent.children.length === 0; + const isEmptyDirectory = (!parent.children || parent.children.length === 0) && !Directory.isRoot(parent); if (isEmptyDirectory) { const parentUri = parent.uri.resolve(newName); const newNodeName = [parent.name].concat(newName).join(Path.separator); From 5eaf92b4763611cb86803b6109d85a1716b9890b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Fri, 11 Oct 2024 11:18:30 +0800 Subject: [PATCH 12/42] fix(pty): cannot run bash with bash integration (#4076) --- packages/terminal-next/src/node/pty.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/terminal-next/src/node/pty.ts b/packages/terminal-next/src/node/pty.ts index 1a21ab63b5..4158b4aed6 100644 --- a/packages/terminal-next/src/node/pty.ts +++ b/packages/terminal-next/src/node/pty.ts @@ -194,7 +194,11 @@ export class PtyService extends Disposable implements IPtyService { options.args = []; } if (Array.isArray(options.args)) { - options.args.push('--init-file', bashIntegrationPath); + // bash 的参数中,如果有 --init-file 则不再添加 + if (!options.args.includes('--init-file')) { + // --init-file 要放在最前面,bash 的启动参数必须要 long options 在前面,否则会启动失败 + options.args.unshift('--init-file', bashIntegrationPath); + } } } From dc90f5d7513342fbd2b066d6996712e702728526 Mon Sep 17 00:00:00 2001 From: "opensumi[bot]" <99156626+opensumi[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:29:04 +0800 Subject: [PATCH 13/42] chore: add missing ajv dep for keymaps package (#4077) Co-authored-by: kengtou.mh --- packages/keymaps/package.json | 3 ++- yarn.lock | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index 58c2a8ccb5..8431eb16dc 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -17,7 +17,8 @@ "url": "git@github.com:opensumi/core.git" }, "dependencies": { - "@opensumi/ide-core-common": "workspace:*" + "@opensumi/ide-core-common": "workspace:*", + "ajv": "^6.10.0" }, "devDependencies": { "@opensumi/ide-components": "workspace:*", diff --git a/yarn.lock b/yarn.lock index 00afb2af5b..43c6ba690b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2584,6 +2584,7 @@ __metadata: "@opensumi/ide-file-service": "workspace:*" "@opensumi/ide-preferences": "workspace:*" "@opensumi/ide-quick-open": "workspace:*" + ajv: "npm:^6.10.0" languageName: unknown linkType: soft From 4e7ad511876227dc4bce91185e40e502180da3ff Mon Sep 17 00:00:00 2001 From: John Date: Fri, 11 Oct 2024 11:42:47 +0800 Subject: [PATCH 14/42] fix: slash command unseen (#4079) --- packages/ai-native/src/browser/chat/chat.view.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/ai-native/src/browser/chat/chat.view.tsx b/packages/ai-native/src/browser/chat/chat.view.tsx index 5ab1072e7d..5e5f066bb7 100644 --- a/packages/ai-native/src/browser/chat/chat.view.tsx +++ b/packages/ai-native/src/browser/chat/chat.view.tsx @@ -515,6 +515,7 @@ export const AIChatView = observer(() => { await renderUserMessage({ relationId, message, + command, agentId, }); @@ -532,6 +533,7 @@ export const AIChatView = observer(() => { relationId, message, agentId, + command, request, msgId, }); From 1197c3ac2b72a891473fed54111459a5a565d848 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 11 Oct 2024 11:43:14 +0800 Subject: [PATCH 15/42] fix: inline diff interactive input invalid (#4080) --- .../widget/inline-chat/inline-chat-editor.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts b/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts index 14bafd8247..3d57a1ea67 100644 --- a/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts +++ b/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts @@ -1,4 +1,4 @@ -import { AINativeConfigService, PreferenceService } from '@opensumi/ide-core-browser'; +import { AINativeConfigService, IAIInlineChatService, PreferenceService } from '@opensumi/ide-core-browser'; import { Disposable, IDisposable } from '@opensumi/ide-core-common'; import { AIInlineChatContentWidgetId, @@ -46,7 +46,7 @@ export class InlineChatEditorController extends BaseAIMonacoEditorController { } private get aiInlineChatService(): AIInlineChatService { - return this.injector.get(AIInlineChatService); + return this.injector.get(IAIInlineChatService); } private get inlineChatFeatureRegistry(): InlineChatFeatureRegistry { From 95ba163c4e6a0dcc04effbdfb7f2a4feebd33a83 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 05:13:32 +0000 Subject: [PATCH 16/42] chore: update manifest.json to v3.4.3 --- packages/types/manifest.json | 236 +++++++++++++++++------------------ 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/packages/types/manifest.json b/packages/types/manifest.json index c697a1d95d..1a285f4829 100644 --- a/packages/types/manifest.json +++ b/packages/types/manifest.json @@ -1,301 +1,301 @@ { "meta": { "@opensumi/ide-addons": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-ai-native": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-collaboration": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-comments": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-components": { - "version": "3.4.2", + "version": "3.4.3", "entry": [] }, "@opensumi/ide-connection": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-core-browser": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["common"] }, "@opensumi/ide-core-common": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node"] }, "@opensumi/ide-core-electron-main": { - "version": "3.4.2", + "version": "3.4.3", "entry": [] }, "@opensumi/ide-core-node": { - "version": "3.4.2", + "version": "3.4.3", "entry": [] }, "@opensumi/ide-debug": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-decoration": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-design": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-editor": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-electron-basic": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser"] }, "@opensumi/ide-explorer": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser"] }, "@opensumi/ide-express-file-server": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension-manager": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension-storage": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-file-scheme": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-file-search": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "common"] }, "@opensumi/ide-file-service": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-file-tree-next": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-i18n": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-keymaps": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-logs": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-main-layout": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-markdown": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-markers": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-menu-bar": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser"] }, "@opensumi/ide-monaco": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-monaco-enhance": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-opened-editor": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-outline": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-output": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-overlay": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-preferences": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-process": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "common"] }, "@opensumi/ide-quick-open": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/remote-cli": { - "version": "3.4.2", + "version": "3.4.3", "entry": [] }, "@opensumi/ide-remote-opener": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-scm": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-search": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-startup": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser"] }, "@opensumi/ide-static-resource": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser"] }, "@opensumi/ide-status-bar": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-storage": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-task": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-terminal-next": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["node", "browser", "common"] }, "@opensumi/ide-testing": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-theme": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-toolbar": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser"] }, "@opensumi/sumi": { - "version": "3.4.2", + "version": "3.4.3", "entry": [] }, "@opensumi/ide-utils": { - "version": "3.4.2", + "version": "3.4.3", "entry": [] }, "@opensumi/ide-variable": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-webview": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-workspace": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] }, "@opensumi/ide-workspace-edit": { - "version": "3.4.2", + "version": "3.4.3", "entry": ["browser", "common"] } }, "packages": { - "@opensumi/ide-addons": "3.4.2", - "@opensumi/ide-ai-native": "3.4.2", - "@opensumi/ide-collaboration": "3.4.2", - "@opensumi/ide-comments": "3.4.2", - "@opensumi/ide-components": "3.4.2", - "@opensumi/ide-connection": "3.4.2", - "@opensumi/ide-core-browser": "3.4.2", - "@opensumi/ide-core-common": "3.4.2", - "@opensumi/ide-core-electron-main": "3.4.2", - "@opensumi/ide-core-node": "3.4.2", - "@opensumi/ide-debug": "3.4.2", - "@opensumi/ide-decoration": "3.4.2", - "@opensumi/ide-design": "3.4.2", - "@opensumi/ide-editor": "3.4.2", - "@opensumi/ide-electron-basic": "3.4.2", - "@opensumi/ide-explorer": "3.4.2", - "@opensumi/ide-express-file-server": "3.4.2", - "@opensumi/ide-extension": "3.4.2", - "@opensumi/ide-extension-manager": "3.4.2", - "@opensumi/ide-extension-storage": "3.4.2", - "@opensumi/ide-file-scheme": "3.4.2", - "@opensumi/ide-file-search": "3.4.2", - "@opensumi/ide-file-service": "3.4.2", - "@opensumi/ide-file-tree-next": "3.4.2", - "@opensumi/ide-i18n": "3.4.2", - "@opensumi/ide-keymaps": "3.4.2", - "@opensumi/ide-logs": "3.4.2", - "@opensumi/ide-main-layout": "3.4.2", - "@opensumi/ide-markdown": "3.4.2", - "@opensumi/ide-markers": "3.4.2", - "@opensumi/ide-menu-bar": "3.4.2", - "@opensumi/ide-monaco": "3.4.2", - "@opensumi/ide-monaco-enhance": "3.4.2", - "@opensumi/ide-opened-editor": "3.4.2", - "@opensumi/ide-outline": "3.4.2", - "@opensumi/ide-output": "3.4.2", - "@opensumi/ide-overlay": "3.4.2", - "@opensumi/ide-preferences": "3.4.2", - "@opensumi/ide-process": "3.4.2", - "@opensumi/ide-quick-open": "3.4.2", - "@opensumi/remote-cli": "3.4.2", - "@opensumi/ide-remote-opener": "3.4.2", - "@opensumi/ide-scm": "3.4.2", - "@opensumi/ide-search": "3.4.2", - "@opensumi/ide-startup": "3.4.2", - "@opensumi/ide-static-resource": "3.4.2", - "@opensumi/ide-status-bar": "3.4.2", - "@opensumi/ide-storage": "3.4.2", - "@opensumi/ide-task": "3.4.2", - "@opensumi/ide-terminal-next": "3.4.2", - "@opensumi/ide-testing": "3.4.2", - "@opensumi/ide-theme": "3.4.2", - "@opensumi/ide-toolbar": "3.4.2", - "@opensumi/sumi": "3.4.2", - "@opensumi/ide-utils": "3.4.2", - "@opensumi/ide-variable": "3.4.2", - "@opensumi/ide-webview": "3.4.2", - "@opensumi/ide-workspace": "3.4.2", - "@opensumi/ide-workspace-edit": "3.4.2" + "@opensumi/ide-addons": "3.4.3", + "@opensumi/ide-ai-native": "3.4.3", + "@opensumi/ide-collaboration": "3.4.3", + "@opensumi/ide-comments": "3.4.3", + "@opensumi/ide-components": "3.4.3", + "@opensumi/ide-connection": "3.4.3", + "@opensumi/ide-core-browser": "3.4.3", + "@opensumi/ide-core-common": "3.4.3", + "@opensumi/ide-core-electron-main": "3.4.3", + "@opensumi/ide-core-node": "3.4.3", + "@opensumi/ide-debug": "3.4.3", + "@opensumi/ide-decoration": "3.4.3", + "@opensumi/ide-design": "3.4.3", + "@opensumi/ide-editor": "3.4.3", + "@opensumi/ide-electron-basic": "3.4.3", + "@opensumi/ide-explorer": "3.4.3", + "@opensumi/ide-express-file-server": "3.4.3", + "@opensumi/ide-extension": "3.4.3", + "@opensumi/ide-extension-manager": "3.4.3", + "@opensumi/ide-extension-storage": "3.4.3", + "@opensumi/ide-file-scheme": "3.4.3", + "@opensumi/ide-file-search": "3.4.3", + "@opensumi/ide-file-service": "3.4.3", + "@opensumi/ide-file-tree-next": "3.4.3", + "@opensumi/ide-i18n": "3.4.3", + "@opensumi/ide-keymaps": "3.4.3", + "@opensumi/ide-logs": "3.4.3", + "@opensumi/ide-main-layout": "3.4.3", + "@opensumi/ide-markdown": "3.4.3", + "@opensumi/ide-markers": "3.4.3", + "@opensumi/ide-menu-bar": "3.4.3", + "@opensumi/ide-monaco": "3.4.3", + "@opensumi/ide-monaco-enhance": "3.4.3", + "@opensumi/ide-opened-editor": "3.4.3", + "@opensumi/ide-outline": "3.4.3", + "@opensumi/ide-output": "3.4.3", + "@opensumi/ide-overlay": "3.4.3", + "@opensumi/ide-preferences": "3.4.3", + "@opensumi/ide-process": "3.4.3", + "@opensumi/ide-quick-open": "3.4.3", + "@opensumi/remote-cli": "3.4.3", + "@opensumi/ide-remote-opener": "3.4.3", + "@opensumi/ide-scm": "3.4.3", + "@opensumi/ide-search": "3.4.3", + "@opensumi/ide-startup": "3.4.3", + "@opensumi/ide-static-resource": "3.4.3", + "@opensumi/ide-status-bar": "3.4.3", + "@opensumi/ide-storage": "3.4.3", + "@opensumi/ide-task": "3.4.3", + "@opensumi/ide-terminal-next": "3.4.3", + "@opensumi/ide-testing": "3.4.3", + "@opensumi/ide-theme": "3.4.3", + "@opensumi/ide-toolbar": "3.4.3", + "@opensumi/sumi": "3.4.3", + "@opensumi/ide-utils": "3.4.3", + "@opensumi/ide-variable": "3.4.3", + "@opensumi/ide-webview": "3.4.3", + "@opensumi/ide-workspace": "3.4.3", + "@opensumi/ide-workspace-edit": "3.4.3" } } From 2b50dea600f7cf8f26c356b7a99b9224eba0e0ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 05:13:47 +0000 Subject: [PATCH 17/42] v3.4.3 --- lerna.json | 2 +- packages/addons/package.json | 2 +- packages/ai-native/package.json | 2 +- packages/collaboration/package.json | 2 +- packages/comments/package.json | 2 +- packages/components/package.json | 2 +- packages/connection/package.json | 2 +- packages/core-browser/package.json | 2 +- packages/core-common/package.json | 2 +- packages/core-electron-main/package.json | 2 +- packages/core-node/package.json | 2 +- packages/debug/package.json | 2 +- packages/decoration/package.json | 2 +- packages/design/package.json | 2 +- packages/editor/package.json | 2 +- packages/electron-basic/package.json | 2 +- packages/explorer/package.json | 2 +- packages/express-file-server/package.json | 2 +- packages/extension-manager/package.json | 2 +- packages/extension-storage/package.json | 2 +- packages/extension/package.json | 2 +- packages/file-scheme/package.json | 2 +- packages/file-search/package.json | 2 +- packages/file-service/package.json | 2 +- packages/file-tree-next/package.json | 2 +- packages/i18n/package.json | 2 +- packages/keymaps/package.json | 2 +- packages/logs-core/package.json | 2 +- packages/main-layout/package.json | 2 +- packages/markdown/package.json | 2 +- packages/markers/package.json | 2 +- packages/menu-bar/package.json | 2 +- packages/monaco-enhance/package.json | 2 +- packages/monaco/package.json | 2 +- packages/opened-editor/package.json | 2 +- packages/outline/package.json | 2 +- packages/output/package.json | 2 +- packages/overlay/package.json | 2 +- packages/preferences/package.json | 2 +- packages/process/package.json | 2 +- packages/quick-open/package.json | 2 +- packages/remote-opener/package.json | 2 +- packages/scm/package.json | 2 +- packages/search/package.json | 2 +- packages/startup/package.json | 2 +- packages/static-resource/package.json | 2 +- packages/status-bar/package.json | 2 +- packages/storage/package.json | 2 +- packages/task/package.json | 2 +- packages/terminal-next/package.json | 2 +- packages/testing/package.json | 2 +- packages/theme/package.json | 2 +- packages/toolbar/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/variable/package.json | 2 +- packages/webview/package.json | 2 +- packages/workspace-edit/package.json | 2 +- packages/workspace/package.json | 2 +- tools/cli-engine/package.json | 2 +- tools/dev-tool/package.json | 2 +- tools/playwright/package.json | 2 +- 62 files changed, 62 insertions(+), 62 deletions(-) diff --git a/lerna.json b/lerna.json index 8402407620..b40aadbbab 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "3.4.2" + "version": "3.4.3" } diff --git a/packages/addons/package.json b/packages/addons/package.json index 3f3317ef07..e42c04ede2 100644 --- a/packages/addons/package.json +++ b/packages/addons/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-addons", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/ai-native/package.json b/packages/ai-native/package.json index eec52146f6..857f7efd5c 100644 --- a/packages/ai-native/package.json +++ b/packages/ai-native/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-ai-native", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index 210b1ab036..ce7798de2a 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-collaboration", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/comments/package.json b/packages/comments/package.json index ce685d4d81..84f28b4a51 100644 --- a/packages/comments/package.json +++ b/packages/comments/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-comments", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/components/package.json b/packages/components/package.json index bae5979e42..43c1dcd0b5 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-components", - "version": "3.4.2", + "version": "3.4.3", "description": "@opensumi/ide-components", "license": "MIT", "main": "lib/index.js", diff --git a/packages/connection/package.json b/packages/connection/package.json index a05e038d67..b66309b7f6 100644 --- a/packages/connection/package.json +++ b/packages/connection/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-connection", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/core-browser/package.json b/packages/core-browser/package.json index 5c0ed694aa..96d3e04e1b 100644 --- a/packages/core-browser/package.json +++ b/packages/core-browser/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-browser", - "version": "3.4.2", + "version": "3.4.3", "description": "@opensumi/ide-core-browser", "files": [ "lib", diff --git a/packages/core-common/package.json b/packages/core-common/package.json index c20cbb2412..6d92a85eb1 100644 --- a/packages/core-common/package.json +++ b/packages/core-common/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-common", - "version": "3.4.2", + "version": "3.4.3", "description": "@opensumi/ide-core-common", "files": [ "lib", diff --git a/packages/core-electron-main/package.json b/packages/core-electron-main/package.json index f6f06123a7..c11d43e3eb 100644 --- a/packages/core-electron-main/package.json +++ b/packages/core-electron-main/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-electron-main", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "browser-preload" diff --git a/packages/core-node/package.json b/packages/core-node/package.json index b0b8ab8b68..050a8314ba 100644 --- a/packages/core-node/package.json +++ b/packages/core-node/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-node", - "version": "3.4.2", + "version": "3.4.3", "description": "@opensumi/ide-core-node", "files": [ "lib", diff --git a/packages/debug/package.json b/packages/debug/package.json index be6e83a6f7..5c33ea6836 100644 --- a/packages/debug/package.json +++ b/packages/debug/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-debug", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/decoration/package.json b/packages/decoration/package.json index 764af88c37..4bdc8a0ca6 100644 --- a/packages/decoration/package.json +++ b/packages/decoration/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-decoration", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/design/package.json b/packages/design/package.json index b3c52ea8f2..9de8007c6c 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-design", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/editor/package.json b/packages/editor/package.json index 1134423daf..b02334a6a5 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-editor", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/electron-basic/package.json b/packages/electron-basic/package.json index fb1d28431b..9655af2df7 100644 --- a/packages/electron-basic/package.json +++ b/packages/electron-basic/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-electron-basic", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/explorer/package.json b/packages/explorer/package.json index c957d577dc..50dc5b644f 100644 --- a/packages/explorer/package.json +++ b/packages/explorer/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-explorer", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/express-file-server/package.json b/packages/express-file-server/package.json index 47ca118157..daee2f8834 100644 --- a/packages/express-file-server/package.json +++ b/packages/express-file-server/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-express-file-server", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/extension-manager/package.json b/packages/extension-manager/package.json index 2df403bf20..78deb95221 100644 --- a/packages/extension-manager/package.json +++ b/packages/extension-manager/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension-manager", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/extension-storage/package.json b/packages/extension-storage/package.json index d77d2d4b9b..cb052ea482 100644 --- a/packages/extension-storage/package.json +++ b/packages/extension-storage/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension-storage", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/extension/package.json b/packages/extension/package.json index ed48181114..2bae6cfec2 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "hosted" diff --git a/packages/file-scheme/package.json b/packages/file-scheme/package.json index 2fa10fee80..1b12d9edec 100644 --- a/packages/file-scheme/package.json +++ b/packages/file-scheme/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-scheme", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/file-search/package.json b/packages/file-search/package.json index 9361c47715..5aa269862a 100644 --- a/packages/file-search/package.json +++ b/packages/file-search/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-search", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/file-service/package.json b/packages/file-service/package.json index 052abb4047..67f81ed8d8 100644 --- a/packages/file-service/package.json +++ b/packages/file-service/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-service", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/file-tree-next/package.json b/packages/file-tree-next/package.json index 70e8bef83e..c1626c4991 100644 --- a/packages/file-tree-next/package.json +++ b/packages/file-tree-next/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-tree-next", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/i18n/package.json b/packages/i18n/package.json index e8a2637fdd..8a4c3537db 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-i18n", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index 8431eb16dc..8e69a3ff89 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-keymaps", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/logs-core/package.json b/packages/logs-core/package.json index 0203e9780a..4f6b12baa1 100644 --- a/packages/logs-core/package.json +++ b/packages/logs-core/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-logs", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/main-layout/package.json b/packages/main-layout/package.json index cd9d1a90a0..09f282a00e 100644 --- a/packages/main-layout/package.json +++ b/packages/main-layout/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-main-layout", - "version": "3.4.2", + "version": "3.4.3", "description": "@opensumi/ide-main-layout", "files": [ "lib", diff --git a/packages/markdown/package.json b/packages/markdown/package.json index ca168bd526..66bdf0a31e 100644 --- a/packages/markdown/package.json +++ b/packages/markdown/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-markdown", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/markers/package.json b/packages/markers/package.json index e773e7763c..dc0d7c5409 100644 --- a/packages/markers/package.json +++ b/packages/markers/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-markers", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/menu-bar/package.json b/packages/menu-bar/package.json index 27bb29204a..213b7f14b9 100644 --- a/packages/menu-bar/package.json +++ b/packages/menu-bar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-menu-bar", - "version": "3.4.2", + "version": "3.4.3", "description": "@opensumi/ide-menu-bar", "files": [ "lib", diff --git a/packages/monaco-enhance/package.json b/packages/monaco-enhance/package.json index 7d13d11045..6b3202f1f4 100644 --- a/packages/monaco-enhance/package.json +++ b/packages/monaco-enhance/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-monaco-enhance", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/monaco/package.json b/packages/monaco/package.json index 10b6ac1820..a5e28719ee 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-monaco", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src", diff --git a/packages/opened-editor/package.json b/packages/opened-editor/package.json index ae1ced6bb9..e101d65cfb 100644 --- a/packages/opened-editor/package.json +++ b/packages/opened-editor/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-opened-editor", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/outline/package.json b/packages/outline/package.json index 4a30774541..6110165f59 100644 --- a/packages/outline/package.json +++ b/packages/outline/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-outline", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/output/package.json b/packages/output/package.json index 8d0510415a..2385402359 100644 --- a/packages/output/package.json +++ b/packages/output/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-output", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/overlay/package.json b/packages/overlay/package.json index f0fd60798d..26e2350ce4 100644 --- a/packages/overlay/package.json +++ b/packages/overlay/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-overlay", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/preferences/package.json b/packages/preferences/package.json index c328730973..fc1466da0c 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-preferences", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/process/package.json b/packages/process/package.json index b27ff683e1..b2981d62d9 100644 --- a/packages/process/package.json +++ b/packages/process/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-process", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/quick-open/package.json b/packages/quick-open/package.json index 761cd9119b..a63921e2af 100644 --- a/packages/quick-open/package.json +++ b/packages/quick-open/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-quick-open", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/remote-opener/package.json b/packages/remote-opener/package.json index 80357c6754..3c65a95698 100644 --- a/packages/remote-opener/package.json +++ b/packages/remote-opener/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-remote-opener", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/scm/package.json b/packages/scm/package.json index 87264fbbf9..671eb8d1d8 100644 --- a/packages/scm/package.json +++ b/packages/scm/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-scm", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/search/package.json b/packages/search/package.json index e5b380eb0a..a3d9c246cf 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-search", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/startup/package.json b/packages/startup/package.json index 5e7359d26f..36388dc9e7 100644 --- a/packages/startup/package.json +++ b/packages/startup/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-startup", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/static-resource/package.json b/packages/static-resource/package.json index 12c2cbf974..22d434e250 100644 --- a/packages/static-resource/package.json +++ b/packages/static-resource/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-static-resource", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/status-bar/package.json b/packages/status-bar/package.json index 8b9cf53683..8d104f5d51 100644 --- a/packages/status-bar/package.json +++ b/packages/status-bar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-status-bar", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/storage/package.json b/packages/storage/package.json index 93374d55bf..dcc71403b5 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-storage", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/task/package.json b/packages/task/package.json index a9a464273a..4b1737ca97 100644 --- a/packages/task/package.json +++ b/packages/task/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-task", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/terminal-next/package.json b/packages/terminal-next/package.json index 4301471e33..95c2ccb62e 100644 --- a/packages/terminal-next/package.json +++ b/packages/terminal-next/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-terminal-next", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/testing/package.json b/packages/testing/package.json index b07fff6cc7..1c174bf956 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-testing", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/theme/package.json b/packages/theme/package.json index 96ff163ff5..29f46cffc6 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-theme", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json index 6d917bb647..ffdeaac0c2 100644 --- a/packages/toolbar/package.json +++ b/packages/toolbar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-toolbar", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/types/package.json b/packages/types/package.json index e50246d33c..a98d75fc8f 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/sumi", - "version": "3.4.2", + "version": "3.4.3", "typings": "index.d.ts", "license": "MIT", "repository": { diff --git a/packages/utils/package.json b/packages/utils/package.json index e9f4a22e42..362e0a8975 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-utils", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/variable/package.json b/packages/variable/package.json index 4359327367..6fc781f0ad 100644 --- a/packages/variable/package.json +++ b/packages/variable/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-variable", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/webview/package.json b/packages/webview/package.json index f104b60db1..6f8f4aeca9 100644 --- a/packages/webview/package.json +++ b/packages/webview/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-webview", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/workspace-edit/package.json b/packages/workspace-edit/package.json index de296c7d39..056e062bda 100644 --- a/packages/workspace-edit/package.json +++ b/packages/workspace-edit/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-workspace-edit", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/packages/workspace/package.json b/packages/workspace/package.json index d2078b30ce..7e576268a0 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-workspace", - "version": "3.4.2", + "version": "3.4.3", "files": [ "lib", "src" diff --git a/tools/cli-engine/package.json b/tools/cli-engine/package.json index 4a6be3b775..f3b0386b1a 100644 --- a/tools/cli-engine/package.json +++ b/tools/cli-engine/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/cli-engine", - "version": "3.4.2", + "version": "3.4.3", "description": "Integration engine runtime for opensumi-cli and opensumi extension", "license": "MIT", "files": [ diff --git a/tools/dev-tool/package.json b/tools/dev-tool/package.json index 56c634f0bc..e06c698423 100644 --- a/tools/dev-tool/package.json +++ b/tools/dev-tool/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-dev-tool", - "version": "3.4.2", + "version": "3.4.3", "repository": { "type": "git", "url": "git@github.com:opensumi/core.git" diff --git a/tools/playwright/package.json b/tools/playwright/package.json index 1c9cbaee81..6a385d7d4c 100644 --- a/tools/playwright/package.json +++ b/tools/playwright/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/playwright", - "version": "3.4.2", + "version": "3.4.3", "description": "E2E test module for OpenSumi", "files": [ "lib", From 67c2f898cbc1d46757c7aa0dba809cd70ffcfc22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Fri, 11 Oct 2024 15:43:14 +0800 Subject: [PATCH 18/42] feat: enhance data store (#4081) --- .../remote-service/data-store/index.test.ts | 16 ++-- .../core-common/src/remote-service/README.md | 18 ++--- .../remote-service/data-store/decorators.ts | 64 +++++++++------ .../src/remote-service/data-store/select.ts | 6 +- .../src/remote-service/data-store/store.ts | 81 ++++++++++++++----- packages/utils/src/disposable.ts | 4 + packages/utils/src/event.ts | 4 +- 7 files changed, 124 insertions(+), 69 deletions(-) diff --git a/packages/core-common/__tests__/remote-service/data-store/index.test.ts b/packages/core-common/__tests__/remote-service/data-store/index.test.ts index 5257027a36..9a5fe69600 100644 --- a/packages/core-common/__tests__/remote-service/data-store/index.test.ts +++ b/packages/core-common/__tests__/remote-service/data-store/index.test.ts @@ -8,7 +8,7 @@ describe('InMemoryDataStore', () => { { user: 'pebbles', age: 1, active: true }, ]; - const store = new InMemoryDataStore<(typeof users)[0]>({ + const store = new InMemoryDataStore<(typeof users)[0], 'user'>({ id: 'user', }); @@ -23,12 +23,12 @@ describe('InMemoryDataStore', () => { const userBarney = store.get('barney'); expect(userBarney).toEqual(users[0]); - expect(store.size()).toBe(3); + expect(store.count()).toBe(3); expect(addCount).toBe(3); const items = store.find({ active: true }); expect(items).toEqual([users[0], users[2]]); - expect(store.size({ active: true })).toBe(2); + expect(store.count({ active: true })).toBe(2); store.on('updated', (oldValue, newValue) => { expect(oldValue.user).toBe('barney'); @@ -41,7 +41,7 @@ describe('InMemoryDataStore', () => { }); interface TestItem { - id?: string; + id: string; name: string; } @@ -87,8 +87,8 @@ describe('InMemoryDataStore2', () => { store.create({ name: 'test1' }); store.create({ name: 'test2' }); - expect(store.size()).toBe(2); - expect(store.size({ name: 'test1' })).toBe(1); + expect(store.count()).toBe(2); + expect(store.count({ name: 'test1' })).toBe(1); }); test('should get item by id', () => { @@ -123,9 +123,9 @@ describe('InMemoryDataStore2', () => { test('should remove item', () => { const item = store.create({ name: 'test' }); - store.remove(item.id!); + store.remove(item.id); - expect(store.get(item.id!)).toBeUndefined(); + expect(store.get(item.id)).toBeUndefined(); }); test('should emit removed event on remove', () => { diff --git a/packages/core-common/src/remote-service/README.md b/packages/core-common/src/remote-service/README.md index 850061d3de..5f9f9c543a 100644 --- a/packages/core-common/src/remote-service/README.md +++ b/packages/core-common/src/remote-service/README.md @@ -345,16 +345,18 @@ class TerminalService { 由于装饰器的执行是在类实例化之前,所以我们可以在 `GDataStore` 这个装饰器中收集 token,然后将它们加入 Injector 即可: ```ts -const dataStore = [] as [string, DataStoreOptions][]; +function generateToken(type: 'global' | 'session', token: string, options?: DataStoreOptions) { + // ... +} + +export type GDataStore = InMemoryDataStore; export function GDataStore(token: string, options?: DataStoreOptions): PropertyDecorator { - dataStore.push([token, options]); + const sym = generateToken('global', token, options); - return Autowired(GDataStore, { - tag: String(token), + return Autowired(sym, { + tag: token, }); } - -export type GDataStore = InMemoryDataStore; ``` 用一个闭包中的变量 `dataStore` 来储存,然后在创建 Injector 的时候将所有的 token 放入 injector: @@ -363,10 +365,8 @@ export type GDataStore = InMemoryDataStore; function _injectDataStores(injector: Injector) { dataStore.forEach(([token, opts]) => { injector.addProviders({ - token: GDataStore, + token, useValue: new InMemoryDataStore(opts), - tag: String(token), - dropdownForTag: false, }); }); } diff --git a/packages/core-common/src/remote-service/data-store/decorators.ts b/packages/core-common/src/remote-service/data-store/decorators.ts index 2a0abf82de..6d64ce795c 100644 --- a/packages/core-common/src/remote-service/data-store/decorators.ts +++ b/packages/core-common/src/remote-service/data-store/decorators.ts @@ -2,58 +2,72 @@ import { Autowired, Injector } from '@opensumi/di'; import { DataStoreOptions, InMemoryDataStore } from './store'; +type DataStoreItem = Record< + string, + { + sym: symbol; + options: DataStoreOptions | undefined; + } +>; + const dataStore = { - global: {} as Record, - session: {} as Record, + GDataStore: {} as DataStoreItem, + SessionDataStore: {} as DataStoreItem, } as const; +type DataStoreType = keyof typeof dataStore; -function saveToken(type: 'global' | 'session', token: string, options?: DataStoreOptions) { +function generateToken(type: DataStoreType, token: string, options?: DataStoreOptions) { if (dataStore[type][token]) { // 同样的 token 只能被注入一次,options 也以第一次为准 - return; + return dataStore[type][token].sym; } - dataStore[type][token] = options; + const sym = Symbol(`${type}:${token}`); + dataStore[type][token] = { + sym, + options, + }; + return sym; } -export type GDataStore = InMemoryDataStore; +export type GDataStore< + Item extends Record, + PrimaryKey = keyof Item, + PrimaryKeyType = Item[PrimaryKey], +> = InMemoryDataStore; export function GDataStore(token: string, options?: DataStoreOptions): PropertyDecorator { - saveToken('global', token, options); + const sym = generateToken('GDataStore', token, options); - return Autowired(GDataStore, { - tag: String(token), - }); + return Autowired(sym); } -export type SessionDataStore = InMemoryDataStore; +export type SessionDataStore< + Item extends Record, + PrimaryKey = keyof Item, + PrimaryKeyType = Item[PrimaryKey], +> = InMemoryDataStore; export function SessionDataStore(token: string, options?: DataStoreOptions): PropertyDecorator { - saveToken('session', token, options); + const sym = generateToken('SessionDataStore', token, options); - return Autowired(SessionDataStore, { - tag: String(token), - }); + return Autowired(sym); } -function _injectDataStores(type: 'global' | 'session', injector: Injector) { +function _injectDataStores(type: DataStoreType, injector: Injector) { const stores = dataStore[type]; if (stores) { - const token = type === 'global' ? GDataStore : SessionDataStore; - injector.addProviders( - ...Object.entries(stores).map(([tag, opts]) => ({ - token, - useValue: new InMemoryDataStore(opts), - tag, - dropdownForTag: false, + ...Object.values(stores).map((opts) => ({ + token: opts.sym, + useValue: new InMemoryDataStore(opts.options), })), ); } } export function injectGDataStores(injector: Injector) { - _injectDataStores('global', injector); + _injectDataStores('GDataStore', injector); } export function injectSessionDataStores(injector: Injector) { - _injectDataStores('session', injector); + _injectDataStores('SessionDataStore', injector); } diff --git a/packages/core-common/src/remote-service/data-store/select.ts b/packages/core-common/src/remote-service/data-store/select.ts index 0cc0ce24e0..2bc444f0fd 100644 --- a/packages/core-common/src/remote-service/data-store/select.ts +++ b/packages/core-common/src/remote-service/data-store/select.ts @@ -1,7 +1,7 @@ import { isIterable } from '@opensumi/ide-utils'; -export type Query = Record; -export type Store = Iterable | Record | Map; +export type Query = Record; +export type Store = Iterable | Record | Map; function makeMatcher(query: Query) { const statements = [] as string[]; @@ -13,7 +13,7 @@ function makeMatcher(query: Query) { return ${statements.join(' && ')}; `; - return new Function('item', matcher) as (item: Query) => boolean; + return new Function('item', matcher) as (item: any) => boolean; } export function select>(items: T, query: Query): I[] { diff --git a/packages/core-common/src/remote-service/data-store/store.ts b/packages/core-common/src/remote-service/data-store/store.ts index 9eacb1445d..153be7372d 100644 --- a/packages/core-common/src/remote-service/data-store/store.ts +++ b/packages/core-common/src/remote-service/data-store/store.ts @@ -1,30 +1,37 @@ import extend from 'lodash/extend'; import { EventEmitter } from '@opensumi/events'; +import { isUndefined } from '@opensumi/ide-utils'; import { select } from './select'; -export interface DataStore { - create(item: Item): Item; - find(query: Record): Item[] | undefined; - size(query: Record): number; - get(id: string, query?: Record): Item | undefined; - update(id: string, item: Partial): void; - remove(id: string): void; -} +/** + * The query looks like: + * { field: value } + * { field: conditions } + */ +export type Query = Record; -export interface DataStoreEvent extends Record { +export interface DataStoreEvent { created: [item: Item]; updated: [oldItem: Item, newItem: Item]; removed: [item: Item]; + + [key: string]: any[]; } export interface DataStoreOptions { id?: string; } -export class InMemoryDataStore extends EventEmitter> implements DataStore { - private store = new Map(); +type MarkOptional = Omit & Partial; + +export class InMemoryDataStore< + Item extends Record, + PrimaryKey extends keyof Item = 'id', + PrimaryKeyType = Required[PrimaryKey], +> extends EventEmitter> { + private store = new Map(); private _uid = 0; /** * primary key @@ -36,8 +43,8 @@ export class InMemoryDataStore extends EventEmitter> this.id = options?.id || 'id'; } - create(item: Item): Item { - const id = item[this.id] || String(this._uid++); + create(item: MarkOptional): Item { + const id = item[this.id] || (this._uid++ as PrimaryKeyType); const result = extend({}, item, { [this.id]: id }) as Item; this.store.set(id, result); @@ -46,29 +53,32 @@ export class InMemoryDataStore extends EventEmitter> return result; } - find(query: Record): Item[] | undefined { + find(query?: Query): Item[] | undefined { + if (isUndefined(query)) { + return Array.from(this.store.values()); + } return select(this.store, query); } - size(query?: Record): number { - if (!query) { + count(query?: Query): number { + if (isUndefined(query)) { return this.store.size; } return this.find(query)?.length || 0; } - get(id: string): Item | undefined { + get(id: PrimaryKeyType): Item | undefined { return this.store.get(id); } - has(id: string): boolean { + has(id: PrimaryKeyType): boolean { return this.store.has(id); } - update(id: string, item: Partial): void { + update(id: PrimaryKeyType, item: Partial): void { const current = this.store.get(id); - if (!current) { + if (isUndefined(current)) { return; } @@ -78,7 +88,7 @@ export class InMemoryDataStore extends EventEmitter> this.store.set(id, result); } - remove(id: string): void { + remove(id: PrimaryKeyType): void { const item = this.store.get(id); if (item) { this.emit('removed', item); @@ -86,4 +96,33 @@ export class InMemoryDataStore extends EventEmitter> this.store.delete(id); } + + removeItem(item: Item): void { + const id = item[this.id] as PrimaryKeyType; + if (isUndefined(id)) { + return; + } + + this.remove(id); + } + + removeAll(query?: Query): void { + if (isUndefined(query)) { + const items = Array.from(this.store.values()); + this.store.clear(); + + items.forEach((item) => { + this.emit('removed', item); + }); + return; + } + + const items = this.find(query); + if (items) { + items.forEach((item) => { + this.store.delete(item[this.id]); + this.emit('removed', item); + }); + } + } } diff --git a/packages/utils/src/disposable.ts b/packages/utils/src/disposable.ts index 79b315a68f..d8542f95db 100644 --- a/packages/utils/src/disposable.ts +++ b/packages/utils/src/disposable.ts @@ -369,6 +369,10 @@ export class RefCountedDisposable { constructor(private readonly _disposable: IDisposable) {} + get disposed() { + return this._counter <= 0; + } + acquire() { this._counter++; return this; diff --git a/packages/utils/src/event.ts b/packages/utils/src/event.ts index 4f0cc132dc..c77fb1d155 100644 --- a/packages/utils/src/event.ts +++ b/packages/utils/src/event.ts @@ -1045,9 +1045,7 @@ export class Dispatcher implements IDisposable { } dispose(): void { - if (this._emitter) { - this._emitter.dispose(); - } + this._emitter.dispose(); } } From c3f851dc6a4f4143d32592237df4786e6b7350c9 Mon Sep 17 00:00:00 2001 From: wangxiaojuan Date: Fri, 11 Oct 2024 16:40:16 +0800 Subject: [PATCH 19/42] fix: incorrect actionType in data reporting (#4084) --- packages/ai-native/src/browser/components/ChatEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ai-native/src/browser/components/ChatEditor.tsx b/packages/ai-native/src/browser/components/ChatEditor.tsx index c7fbe0358a..91d899f7d8 100644 --- a/packages/ai-native/src/browser/components/ChatEditor.tsx +++ b/packages/ai-native/src/browser/components/ChatEditor.tsx @@ -92,7 +92,7 @@ export const CodeEditorWithHighlight = (props: Props) => { agentId, command, actionSource: ActionSourceEnum.Chat, - actionType: ActionTypeEnum.ChatCopyCode, + actionType: ActionTypeEnum.ChatInsertCode, }); } } From 9878e7a9eb7b9409638e2aaec9e6355bd3e10280 Mon Sep 17 00:00:00 2001 From: "opensumi[bot]" <99156626+opensumi[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:23:09 +0800 Subject: [PATCH 20/42] fix: incorrect actionType in data reporting (#4085) Co-authored-by: wangxiaojuan --- packages/ai-native/src/browser/components/ChatEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ai-native/src/browser/components/ChatEditor.tsx b/packages/ai-native/src/browser/components/ChatEditor.tsx index c7fbe0358a..91d899f7d8 100644 --- a/packages/ai-native/src/browser/components/ChatEditor.tsx +++ b/packages/ai-native/src/browser/components/ChatEditor.tsx @@ -92,7 +92,7 @@ export const CodeEditorWithHighlight = (props: Props) => { agentId, command, actionSource: ActionSourceEnum.Chat, - actionType: ActionTypeEnum.ChatCopyCode, + actionType: ActionTypeEnum.ChatInsertCode, }); } } From 10120c456d96f91048a2e8618b70160a437a8a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Fri, 11 Oct 2024 19:14:04 +0800 Subject: [PATCH 21/42] chore(ext-service): remove unused method (#4086) --- .../__tests__/node/extension.service.test.ts | 2 +- .../src/browser/extension.service.ts | 2 +- packages/extension/src/common/extension.ts | 1 - .../extension/src/node/extension.service.ts | 19 ++++++++----------- packages/i18n/src/common/en-US.lang.ts | 2 +- .../src/browser/terminal.controller.ts | 2 +- 6 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/extension/__tests__/node/extension.service.test.ts b/packages/extension/__tests__/node/extension.service.test.ts index 9cfc5fd781..be05a5f30b 100644 --- a/packages/extension/__tests__/node/extension.service.test.ts +++ b/packages/extension/__tests__/node/extension.service.test.ts @@ -157,7 +157,7 @@ describe('Extension Service', () => { }); it('should create connect listenPath', async () => { - const listenPath = await extensionService.getElectronMainThreadListenPath2(mockExtClientId); + const listenPath = await extensionService.getElectronMainThreadListenPath(mockExtClientId); expect(path.dirname(listenPath)).toBe(path.join(os.tmpdir(), 'sumi-ipc')); }); it('should create ext server listen option', async () => { diff --git a/packages/extension/src/browser/extension.service.ts b/packages/extension/src/browser/extension.service.ts index a511dc4946..6622ca4d4c 100644 --- a/packages/extension/src/browser/extension.service.ts +++ b/packages/extension/src/browser/extension.service.ts @@ -412,7 +412,7 @@ export class ExtensionServiceImpl extends WithEventBus implements ExtensionServi break; } case ERestartPolicy.Always: - this.progressService.withProgress( + await this.progressService.withProgress( { location: ProgressLocation.Notification, title: localize('extension.exthostRestarting.content'), diff --git a/packages/extension/src/common/extension.ts b/packages/extension/src/common/extension.ts index f568b738fc..e1750175fc 100644 --- a/packages/extension/src/common/extension.ts +++ b/packages/extension/src/common/extension.ts @@ -93,7 +93,6 @@ export interface IExtensionNodeService { ensureProcessReady(clientId: string): Promise; getExtProcessId(clientId: string): Promise; getElectronMainThreadListenPath(clientId: string): Promise; - getElectronMainThreadListenPath2(clientId: string): Promise; getExtServerListenOption(clientId: string); getExtension( extensionPath: string, diff --git a/packages/extension/src/node/extension.service.ts b/packages/extension/src/node/extension.service.ts index a80c68f905..b3bc25a371 100644 --- a/packages/extension/src/node/extension.service.ts +++ b/packages/extension/src/node/extension.service.ts @@ -74,7 +74,7 @@ function detectExtFileType(): 'js' | 'ts' { @Injectable() export class ExtensionNodeServiceImpl implements IExtensionNodeService { - private instanceId = 'ExtensionNodeServiceImpl:' + Date.now(); + private LOG_TAG = 'ExtensionNodeServiceImpl:' + Date.now(); static MaxExtProcessCount = 5; // ws 断开 5 分钟后杀掉插件进程 static ProcessCloseExitThreshold: number = 5 * 60 * 1000; @@ -187,14 +187,9 @@ export class ExtensionNodeServiceImpl implements IExtensionNodeService { return this.electronMainThreadListenPaths.get(clientId)!; } - public async getElectronMainThreadListenPath2(clientId: string): Promise { - return await this.getElectronMainThreadListenPath(clientId); - } - private setExtProcessConnectionForward() { - this.logger.log('setExtProcessConnectionForward', this.instanceId); - this._setMainThreadConnection(async (connectionResult) => { - const { channel, clientId } = connectionResult; + this.logger.log('setExtProcessConnectionForward', this.LOG_TAG); + this._setMainThreadConnection(async ({ channel, clientId }) => { this.maybeZombieClients.delete(clientId); if (this.clientExtProcessExtConnectionDeferredMap.get(clientId)) { @@ -249,9 +244,8 @@ export class ExtensionNodeServiceImpl implements IExtensionNodeService { @pMemoize((clientId: string) => clientId) public async createProcess(clientId: string, options?: ICreateProcessOptions) { - this.logger.log('createProcess instanceId', this.instanceId); + this.logger.log(this.LOG_TAG, 'create extension process for client:', clientId); this.logger.log('appconfig exthost', this.appConfig.extHost); - this.logger.log('createProcess clientId', clientId); // 检查是否超过限制最大的进程数 const processClientIdArr = Array.from(this.clientExtProcessMap.keys()); @@ -259,7 +253,10 @@ export class ExtensionNodeServiceImpl implements IExtensionNodeService { if (processClientIdArr.length >= maxExtProcessCount) { const killProcessClientId = processClientIdArr[0]; this.disposeClientExtProcess(killProcessClientId); - this.logger.error(`Process count is over limit, max count is ${maxExtProcessCount}`); + this.logger.error( + `Process count is over limit, max count is ${maxExtProcessCount}, try kill`, + killProcessClientId, + ); } await this._createExtServer(clientId, options); await this._createExtHostProcess(clientId, options); diff --git a/packages/i18n/src/common/en-US.lang.ts b/packages/i18n/src/common/en-US.lang.ts index 7dc1992db7..4662905d96 100644 --- a/packages/i18n/src/common/en-US.lang.ts +++ b/packages/i18n/src/common/en-US.lang.ts @@ -524,7 +524,7 @@ export const localizationBundle = { 'preference.general.language': 'Language', 'preference.general.language.change.refresh.info': 'After changing the language, it should be restarted to take effect. Will it be refreshed immediately?', - 'preference.general.language.change.refresh.now': 'Now', + 'preference.general.language.change.refresh.now': 'Refresh', 'preference.general.language.change.refresh.later': 'Later', 'preference.debug.internalConsoleOptions': 'Controls when the internal debug console should open.', diff --git a/packages/terminal-next/src/browser/terminal.controller.ts b/packages/terminal-next/src/browser/terminal.controller.ts index d1859751a1..2fa5f06d9d 100644 --- a/packages/terminal-next/src/browser/terminal.controller.ts +++ b/packages/terminal-next/src/browser/terminal.controller.ts @@ -380,7 +380,7 @@ export class TerminalController extends WithEventBus implements ITerminalControl * 等待预先连接成功 */ client.attached.promise.then(() => { - widget.name = client.name; + widget.rename(client.name); // client.term.writeln('\x1b[2mTerminal restored\x1b[22m'); /** From e7b2f9b1e7fd83ba15f5a11ca3f5e0bf89b15184 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 13:48:26 +0800 Subject: [PATCH 22/42] chore(deps-dev): bump @commitlint/cli from 19.2.2 to 19.5.0 (#4057) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 196 +++++++++++++++++++++++++++++------------------------- 1 file changed, 106 insertions(+), 90 deletions(-) diff --git a/yarn.lock b/yarn.lock index 31f9fe28b9..978124f030 100644 --- a/yarn.lock +++ b/yarn.lock @@ -555,19 +555,19 @@ __metadata: linkType: hard "@commitlint/cli@npm:^19.2.1": - version: 19.2.2 - resolution: "@commitlint/cli@npm:19.2.2" - dependencies: - "@commitlint/format": "npm:^19.0.3" - "@commitlint/lint": "npm:^19.2.2" - "@commitlint/load": "npm:^19.2.0" - "@commitlint/read": "npm:^19.2.1" - "@commitlint/types": "npm:^19.0.3" - execa: "npm:^8.0.1" + version: 19.5.0 + resolution: "@commitlint/cli@npm:19.5.0" + dependencies: + "@commitlint/format": "npm:^19.5.0" + "@commitlint/lint": "npm:^19.5.0" + "@commitlint/load": "npm:^19.5.0" + "@commitlint/read": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" + tinyexec: "npm:^0.3.0" yargs: "npm:^17.0.0" bin: commitlint: cli.js - checksum: 10/bff139177aecffe809ec8665a7ffd3f9acae144ec8634b6ed93802ae9a3333bc978f69ba26dacd2bbc0e06e3dada8ca49fe49bd5316c916e626f8df8dcc03dc9 + checksum: 10/1d3384cc9823462da3a35308a145dc4fcf92025f7af976e1ceb9cbe9cbd7b7b83703fe0e9ca12fc7f4903ea2fe68c8c1492c18409ba301894c01cb2264a00795 languageName: node linkType: hard @@ -581,158 +581,157 @@ __metadata: languageName: node linkType: hard -"@commitlint/config-validator@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/config-validator@npm:19.0.3" +"@commitlint/config-validator@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/config-validator@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" ajv: "npm:^8.11.0" - checksum: 10/a1a9678e0994d87fa98f0aee1a877dfaf60640b657589260ec958898d51affabba73d6684edafa1cc979e4e94b51f14fbd9b605eae77c2838ee52bcbcc110bef + checksum: 10/681bfdcabcb0ff794ea65d95128083869c97039c3a352219d6d88a2d4f3d0412b8ec515db77433fc6b0fce072051beb103d16889d42e76ea97873191ec191b23 languageName: node linkType: hard -"@commitlint/ensure@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/ensure@npm:19.0.3" +"@commitlint/ensure@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/ensure@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" lodash.camelcase: "npm:^4.3.0" lodash.kebabcase: "npm:^4.1.1" lodash.snakecase: "npm:^4.1.1" lodash.startcase: "npm:^4.4.0" lodash.upperfirst: "npm:^4.3.1" - checksum: 10/d8fdc4712985f9ccdbd871c9eabb9d2bdde22296b882b42bd32ab52b6679c5d799ff557d20a99cebb0008831fd31a540d771331e6e5e26bbafbb6b88f47148b6 + checksum: 10/a9d575637121221cb63232ee96024a63614052ccc205ec8fdab53feed70104b85608e31b4632f280d2876f10a2243474191d96e448b222abfc8d8ab48f9f8e7e languageName: node linkType: hard -"@commitlint/execute-rule@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/execute-rule@npm:19.0.0" - checksum: 10/4c5cbf9ab0e2b85b00ceea84e5598b1b3cceaa20a655ee954c45259cca9efc80cf5cf7d9eec04715a100c2da282cbcf6aba960ad53a47178090c0513426ac236 +"@commitlint/execute-rule@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/execute-rule@npm:19.5.0" + checksum: 10/ff05568c3a287ef8564171d5bc5d4510b2e00b552e4703f79db3d62f3cba9d669710717695d199e04c2117d41f9e72d7e43a342d5c1b62d456bc8e8bb7dda1e9 languageName: node linkType: hard -"@commitlint/format@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/format@npm:19.0.3" +"@commitlint/format@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/format@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" chalk: "npm:^5.3.0" - checksum: 10/ccd71c669e43272fc7d55aba38b149ebc1fab40364ddb4182d4067210592981d42e51d2295a5c0476a34a7a296f14eaee54cc3aa246e3e5d477ed2ae5917a532 + checksum: 10/685b64ebee936d71bbbf66276b11d50b0227f2ad0df3c00317d5b7e25bce8b1b8dbc65cc7c5c7fafc76cad11a83ad4378a666bf8f12a3eb1c7d6a2a6c6cb25aa languageName: node linkType: hard -"@commitlint/is-ignored@npm:^19.2.2": - version: 19.2.2 - resolution: "@commitlint/is-ignored@npm:19.2.2" +"@commitlint/is-ignored@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/is-ignored@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" semver: "npm:^7.6.0" - checksum: 10/f412734496aba808c8bcbddd59c615600d62447ad2b62049805a044b1f299ff6628e2c9ce5022e55848099edc2591f62a7780842d9dffcd60ab3889bc93fea62 + checksum: 10/1c7ee34686fd098587f9717763473477d49e847f470a317903f922d13091271d013a046f61b43b31b34eba4e4b0f76369b7427588269bbdc4c5f622d3ace2c95 languageName: node linkType: hard -"@commitlint/lint@npm:^19.2.2": - version: 19.2.2 - resolution: "@commitlint/lint@npm:19.2.2" +"@commitlint/lint@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/lint@npm:19.5.0" dependencies: - "@commitlint/is-ignored": "npm:^19.2.2" - "@commitlint/parse": "npm:^19.0.3" - "@commitlint/rules": "npm:^19.0.3" - "@commitlint/types": "npm:^19.0.3" - checksum: 10/9bf2ffa0f6cdde3d53d755b95ca717afd193f4560ae5bb0f5ffd7f1bbd571ddc99b27417733c70e1adbd74a5197e4525493b2dfc116680a939db7728fefa805c + "@commitlint/is-ignored": "npm:^19.5.0" + "@commitlint/parse": "npm:^19.5.0" + "@commitlint/rules": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" + checksum: 10/bba8cd17a90876b6b2cd2f869ee4d08cd3e5ad8a10f2c273d379d3b6602da30c46c2d9d0925710d7b9ebf180b3d1f02409adfc0f1a888cc566d88c9ee5862bdd languageName: node linkType: hard -"@commitlint/load@npm:^19.2.0": - version: 19.2.0 - resolution: "@commitlint/load@npm:19.2.0" +"@commitlint/load@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/load@npm:19.5.0" dependencies: - "@commitlint/config-validator": "npm:^19.0.3" - "@commitlint/execute-rule": "npm:^19.0.0" - "@commitlint/resolve-extends": "npm:^19.1.0" - "@commitlint/types": "npm:^19.0.3" + "@commitlint/config-validator": "npm:^19.5.0" + "@commitlint/execute-rule": "npm:^19.5.0" + "@commitlint/resolve-extends": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" chalk: "npm:^5.3.0" cosmiconfig: "npm:^9.0.0" cosmiconfig-typescript-loader: "npm:^5.0.0" lodash.isplainobject: "npm:^4.0.6" lodash.merge: "npm:^4.6.2" lodash.uniq: "npm:^4.5.0" - checksum: 10/5cd35a0a60064c70c06ab6bd8b1ae02cf6ecc1d0520b76c68cdc7c12094338f04c19e2df5d7ae30d681e858871c4f1963ae39e4969ed61139959cf4b300030fc + checksum: 10/87a9450c768632c09e9d98993752a5622aee698642eee5a9b31c3c48625455e043406b7ea6e02a8f41d86c524c9ecbdb9b823caf67da3048f0d96531177fda28 languageName: node linkType: hard -"@commitlint/message@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/message@npm:19.0.0" - checksum: 10/446ee97c12a4175a8b7a4cbf3754c01d54cd911973c7af9a2eac69277fb891e638ddc3db132f57588883b68eadf59074d388ec1808a205957042f71027244167 +"@commitlint/message@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/message@npm:19.5.0" + checksum: 10/ad6993476ce3e6ed6ed7ae5327ac8d5116ca70168d9de6dff656a7e6f2b9f01a1c3ac7a13418831b5cdc3148ea9bcd78c32bdb7aa863280108e176ff803f7a51 languageName: node linkType: hard -"@commitlint/parse@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/parse@npm:19.0.3" +"@commitlint/parse@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/parse@npm:19.5.0" dependencies: - "@commitlint/types": "npm:^19.0.3" + "@commitlint/types": "npm:^19.5.0" conventional-changelog-angular: "npm:^7.0.0" conventional-commits-parser: "npm:^5.0.0" - checksum: 10/ddd7a6007d37d7154f6b18bfa06dc26beb109cd4bcabe7e9ca2ff24088325ab2c7b09cc01cceb9d62e6e60affffe3d19e9685fab06d3506d047166d888d25487 + checksum: 10/2a6f8bbbd79aa36a7e1128c60cecb322557110aa4aa8757c741c2f79071c540ba56957cef81fb64f4a304535e462d0c48b5c1ef1b2766fea7971d38ec5ad6384 languageName: node linkType: hard -"@commitlint/read@npm:^19.2.1": - version: 19.2.1 - resolution: "@commitlint/read@npm:19.2.1" +"@commitlint/read@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/read@npm:19.5.0" dependencies: - "@commitlint/top-level": "npm:^19.0.0" - "@commitlint/types": "npm:^19.0.3" - execa: "npm:^8.0.1" + "@commitlint/top-level": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" git-raw-commits: "npm:^4.0.0" minimist: "npm:^1.2.8" - checksum: 10/840ebd183b2fe36dea03701552d825a9a1770d300b9416ab2a731fdeed66cf8c9dd8be133d92ac017cb9bf29e2ef5aee91a641f2b643bb5b33005f7b392ec953 + tinyexec: "npm:^0.3.0" + checksum: 10/0ea2da48ae1bab9add9e831a1659306567755c20ec74cf04e6e50ef1e520970decd259af652995f55eef422a3f1382f0e64e5fbc23606176f766f71076ad872b languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^19.1.0": - version: 19.1.0 - resolution: "@commitlint/resolve-extends@npm:19.1.0" +"@commitlint/resolve-extends@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/resolve-extends@npm:19.5.0" dependencies: - "@commitlint/config-validator": "npm:^19.0.3" - "@commitlint/types": "npm:^19.0.3" + "@commitlint/config-validator": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" global-directory: "npm:^4.0.1" import-meta-resolve: "npm:^4.0.0" lodash.mergewith: "npm:^4.6.2" resolve-from: "npm:^5.0.0" - checksum: 10/453f8828b091886dc7cb4b13285bf3300be94266c3fc13453ab62fddc524a3969434dcebea3e4c4775621576fa25b41efbc62d773e3c44c1e87d12d7211166de + checksum: 10/71a1c9423570dedb55809f4ad7c35962607cb06921364116e8f2d8c3d37a7ff2a43747ad5a9cd924b58614e6880a42a3fa1510244748bb6997469b52b0fecd78 languageName: node linkType: hard -"@commitlint/rules@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/rules@npm:19.0.3" +"@commitlint/rules@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/rules@npm:19.5.0" dependencies: - "@commitlint/ensure": "npm:^19.0.3" - "@commitlint/message": "npm:^19.0.0" - "@commitlint/to-lines": "npm:^19.0.0" - "@commitlint/types": "npm:^19.0.3" - execa: "npm:^8.0.1" - checksum: 10/218033d96b0bae7dbea0e46483f8af823c17b492e4b0c4dca93a6312876d051cc88f4272d009e7eb06ff05585ec511aedd703132be17c7248698a4eac909986b + "@commitlint/ensure": "npm:^19.5.0" + "@commitlint/message": "npm:^19.5.0" + "@commitlint/to-lines": "npm:^19.5.0" + "@commitlint/types": "npm:^19.5.0" + checksum: 10/2c879d2cd50a3b4572cea41f044cc3091f0a11ef5ead0bb54bfa564ea637e0d93e08ae322ec4c99bb5b379b82835ace595d1c8dab6e35c1b68b63292160a61b3 languageName: node linkType: hard -"@commitlint/to-lines@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/to-lines@npm:19.0.0" - checksum: 10/5e7d5679aa242cd21be2076a8c8715aa3c9f4c3133f588df08c6b02f56a8a5b1a5d9e402076bd926dd2b61883e4b2c53fd6c9aa3554e3f54cd2296b2566eb1c2 +"@commitlint/to-lines@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/to-lines@npm:19.5.0" + checksum: 10/68aaca7bf1331b5f2f604e814d57f483ead81a8296f8cff5667249510a5601825dfbbaccade3d02e0aca580b973c01419276d693cc9aa888cbe11022daa9dce6 languageName: node linkType: hard -"@commitlint/top-level@npm:^19.0.0": - version: 19.0.0 - resolution: "@commitlint/top-level@npm:19.0.0" +"@commitlint/top-level@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/top-level@npm:19.5.0" dependencies: find-up: "npm:^7.0.0" - checksum: 10/47b0994d03f26caf2812110ead535bd10157beed6b3dff9cbb4eea165de9245673ba7d31829cd54af5855f7b075ebbf812b1f79586248be3932797888efeadf5 + checksum: 10/f6b5a3746c458e12c7a9e93f7c856ba90fba6e61db614ea1201e6b6e92cb8161dd13e88d8c9b408709ea0c19bc949cffcd1dd356cb6f51fc2ede8df48c1fd410 languageName: node linkType: hard @@ -746,6 +745,16 @@ __metadata: languageName: node linkType: hard +"@commitlint/types@npm:^19.5.0": + version: 19.5.0 + resolution: "@commitlint/types@npm:19.5.0" + dependencies: + "@types/conventional-commits-parser": "npm:^5.0.0" + chalk: "npm:^5.3.0" + checksum: 10/a26f33ec6987d7d93bdbd7e1b177cfac30ca056ea383faf343c6a09c0441aa057a24be1459c3d4e7e91edd2ecf8d6c4dd670948c9d22646d64767137c6db098a + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -9091,7 +9100,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:8.0.1, execa@npm:^8.0.1": +"execa@npm:8.0.1": version: 8.0.1 resolution: "execa@npm:8.0.1" dependencies: @@ -18903,6 +18912,13 @@ __metadata: languageName: node linkType: hard +"tinyexec@npm:^0.3.0": + version: 0.3.0 + resolution: "tinyexec@npm:0.3.0" + checksum: 10/317cc536d091ce7e50271287798d91ef53c4dc80088844d890752a2c7387d213004cba83e5e1d9129390ced617625e34f4a8f0ba5779e31c9b6939f9be0d3543 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" From a2c4de054e12468a6f7dc0b62caa1837b0214035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Mon, 14 Oct 2024 19:44:28 +0800 Subject: [PATCH 23/42] fix(inline-diff): fix cannot listen partial accept event (#4088) --- packages/ai-native/src/browser/index.ts | 5 +++++ .../src/browser/widget/inline-diff/index.ts | 1 + .../widget/inline-diff/inline-diff-previewer.ts | 4 +--- .../inline-diff/inline-diff.controller.ts | 12 ------------ .../widget/inline-diff/inline-diff.service.ts | 17 +++++++++++++++++ .../inline-stream-diff.handler.tsx | 4 ---- .../live-preview.decoration.tsx | 7 ++++--- 7 files changed, 28 insertions(+), 22 deletions(-) create mode 100644 packages/ai-native/src/browser/widget/inline-diff/inline-diff.service.ts diff --git a/packages/ai-native/src/browser/index.ts b/packages/ai-native/src/browser/index.ts index a3ab706f63..8acb9c3297 100644 --- a/packages/ai-native/src/browser/index.ts +++ b/packages/ai-native/src/browser/index.ts @@ -47,6 +47,7 @@ import { AINativePreferencesContribution } from './preferences'; import { AINativeCoreContribution } from './types'; import { InlineChatFeatureRegistry } from './widget/inline-chat/inline-chat.feature.registry'; import { AIInlineChatService } from './widget/inline-chat/inline-chat.service'; +import { InlineDiffService } from './widget/inline-diff'; @Injectable() export class AINativeModule extends BrowserModule { @@ -135,6 +136,10 @@ export class AINativeModule extends BrowserModule { token: IAIInlineCompletionsProvider, useClass: AIInlineCompletionsProvider, }, + { + token: InlineDiffService, + useClass: InlineDiffService, + }, ]; backServices = [ diff --git a/packages/ai-native/src/browser/widget/inline-diff/index.ts b/packages/ai-native/src/browser/widget/inline-diff/index.ts index 6354279ca0..3d0ebb35fe 100644 --- a/packages/ai-native/src/browser/widget/inline-diff/index.ts +++ b/packages/ai-native/src/browser/widget/inline-diff/index.ts @@ -1,3 +1,4 @@ export * from './inline-diff.controller'; export * from './inline-diff-previewer'; export * from './inline-diff-widget'; +export * from './inline-diff.service'; diff --git a/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts b/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts index 7f811d7c6b..db577e7410 100644 --- a/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts +++ b/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts @@ -392,9 +392,7 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer()); - public readonly onPartialEditEvent: Event = this._onPartialEditEvent.event; - private readonly _onMaxLineCount = new Emitter(); public readonly onMaxLineCount: Event = this._onMaxLineCount.event; @@ -232,14 +228,6 @@ export class InlineDiffController extends BaseAIMonacoEditorController { return; } - if (previewer instanceof LiveInlineDiffPreviewer) { - previewer.addDispose( - previewer.onPartialEditEvent!((event) => { - this._onPartialEditEvent.fire(event); - }), - ); - } - previewer.addDispose(previewer.onLineCount((lineCount) => this._onMaxLineCount.fire(lineCount))); } diff --git a/packages/ai-native/src/browser/widget/inline-diff/inline-diff.service.ts b/packages/ai-native/src/browser/widget/inline-diff/inline-diff.service.ts new file mode 100644 index 0000000000..ac289f8260 --- /dev/null +++ b/packages/ai-native/src/browser/widget/inline-diff/inline-diff.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@opensumi/di'; +import { Emitter } from '@opensumi/ide-utils'; + +import { IPartialEditEvent } from '../inline-stream-diff/live-preview.component'; + +@Injectable() +export class InlineDiffService { + /** + * Used in `codeblitz`, do not remove it. + */ + private _partialEventEmitter = new Emitter(); + public onPartialEdit = this._partialEventEmitter.event; + + public firePartialEdit(event: IPartialEditEvent) { + this._partialEventEmitter.fire(event); + } +} diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx index eef6b5f1cd..c4e1623d55 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx @@ -514,10 +514,6 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr this.monacoEditor.focus(); } - get onPartialEditEvent() { - return this.livePreviewDiffDecorationModel.onPartialEditEvent; - } - acceptAll(): void { this.livePreviewDiffDecorationModel.acceptUnProcessed(); this.dispose(); diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx index cf6970bc0a..639f00eba0 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx @@ -19,6 +19,7 @@ import { IDecorationSerializableState, IEnhanceModelDeltaDecoration, } from '../../model/enhanceDecorationsCollection'; +import { InlineDiffService } from '../inline-diff'; import styles from './inline-stream-diff.module.less'; import { InlineStreamDiffService } from './inline-stream-diff.service'; @@ -69,8 +70,8 @@ export class LivePreviewDiffDecorationModel extends Disposable { @Autowired(InlineStreamDiffService) private readonly inlineStreamDiffService: InlineStreamDiffService; - private readonly _onPartialEditEvent = this.registerDispose(new Emitter()); - public readonly onPartialEditEvent: Event = this._onPartialEditEvent.event; + @Autowired(InlineDiffService) + private readonly inlineDiffService: InlineDiffService; private activeLineDec: IEditorDecorationsCollection; private pendingRangeDec: IEditorDecorationsCollection; @@ -499,7 +500,7 @@ export class LivePreviewDiffDecorationModel extends Disposable { this.monacoEditor.focus(); - this._onPartialEditEvent.fire(event); + this.inlineDiffService.firePartialEdit(event); this.firePartialEditWidgetList(); } From 0a97a427ef10940c9b5b85a1bc7c9c049fb86634 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 15 Oct 2024 11:27:04 +0800 Subject: [PATCH 24/42] fix: ai feature accidental invalid (#4089) * fix: accidental ai feature invalid * fix: improve code --- .../src/browser/contrib/base/index.ts | 8 ++- .../intelligent-completions.controller.ts | 14 ++-- .../problem-fix/problem-fix.controller.ts | 8 +-- .../inline-chat-editor.controller.ts | 68 ++++++++++--------- .../inline-diff/inline-diff.controller.ts | 16 ++--- .../inline-hint/inline-hint.controller.ts | 12 ++-- .../inline-input/inline-input.controller.ts | 8 +-- 7 files changed, 68 insertions(+), 66 deletions(-) diff --git a/packages/ai-native/src/browser/contrib/base/index.ts b/packages/ai-native/src/browser/contrib/base/index.ts index eb8b441bbd..ecd310622b 100644 --- a/packages/ai-native/src/browser/contrib/base/index.ts +++ b/packages/ai-native/src/browser/contrib/base/index.ts @@ -67,6 +67,8 @@ export abstract class BaseAIMonacoEditorController extends Disposable implements this.cancellationTokenSource = new CancellationTokenSource(); } + public featureDisposable = new Disposable(); + protected allowedSchemes: string[] = [Schemes.file, Schemes.notebookCell]; constructor( @@ -80,7 +82,11 @@ export abstract class BaseAIMonacoEditorController extends Disposable implements this.addDispose( this.monacoEditor.onDidChangeModel(({ newModelUrl }) => { - const shouldMount = newModelUrl && this.allowedSchemes.includes(newModelUrl.scheme); + if (!newModelUrl) { + return; + } + + const shouldMount = this.allowedSchemes.includes(newModelUrl.scheme); if (shouldMount !== isMounted) { isMounted = !!shouldMount; if (isMounted) { diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts index aa773e329f..01db85c240 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts @@ -77,7 +77,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll this.aiNativeContextKey = this.injector.get(AINativeContextKey, [this.monacoEditor.contextKeyService]); this.registerFeature(this.monacoEditor); - return this; + return this.featureDisposable; } private handlerAlwaysVisiblePreference(): void { @@ -148,7 +148,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll register(); } - this.addDispose( + this.featureDisposable.addDispose( this.preferenceService.onSpecificPreferenceChange( AINativeSettingSectionsId.IntelligentCompletionsAlwaysVisible, ({ newValue }) => { @@ -356,7 +356,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll } private registerFeature(monacoEditor: ICodeEditor): void { - this.addDispose( + this.featureDisposable.addDispose( Event.any( monacoEditor.onDidChangeCursorPosition, monacoEditor.onDidChangeModelContent, @@ -367,8 +367,8 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll ); const multiLineEditsIsVisibleKey = new Set([MultiLineEditsIsVisible.raw]); - this.addDispose(this.whenMultiLineEditsVisibleDisposable); - this.addDispose( + this.featureDisposable.addDispose(this.whenMultiLineEditsVisibleDisposable); + this.featureDisposable.addDispose( this.aiNativeContextKey.contextKeyService!.onDidChangeContext((e) => { if (e.payload.affectsSome(multiLineEditsIsVisibleKey)) { const isVisible = this.aiNativeContextKey.multiLineEditsIsVisible.get(); @@ -379,7 +379,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll }), ); - this.addDispose( + this.featureDisposable.addDispose( Event.any( monacoEditor.onDidChangeModel, monacoEditor.onDidChangeModelContent, @@ -391,6 +391,6 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll ); const inlineCompletionsSource = this.injector.get(InlineCompletionsSource, [this.monacoEditor]); - this.addDispose(inlineCompletionsSource.fetch()); + this.featureDisposable.addDispose(inlineCompletionsSource.fetch()); } } diff --git a/packages/ai-native/src/browser/contrib/problem-fix/problem-fix.controller.ts b/packages/ai-native/src/browser/contrib/problem-fix/problem-fix.controller.ts index 80c99812f9..70270cc74b 100644 --- a/packages/ai-native/src/browser/contrib/problem-fix/problem-fix.controller.ts +++ b/packages/ai-native/src/browser/contrib/problem-fix/problem-fix.controller.ts @@ -67,11 +67,9 @@ export class ProblemFixController extends BaseAIMonacoEditorController { mount(): IDisposable { this.aiNativeContextKey = this.injector.get(AINativeContextKey, [this.monacoEditor.contextKeyService]); - const disposable = new Disposable(); - const provider = this.problemFixProviderRegistry.getHoverFixProvider(); if (!provider) { - return disposable; + return Disposable.NULL; } // 先去掉 monaco 默认的 MarkerHoverParticipant,以及之前注册的 AIMonacoHoverParticipant @@ -82,7 +80,7 @@ export class ProblemFixController extends BaseAIMonacoEditorController { AIMonacoHoverParticipant.injector = this.injector; HoverParticipantRegistry.register(AIMonacoHoverParticipant); - disposable.addDispose( + this.featureDisposable.addDispose( this.problemFixService.onHoverFixTrigger((part) => { const hoverController = this.monacoEditor?.getContribution(HoverController.ID); if (hoverController) { @@ -93,7 +91,7 @@ export class ProblemFixController extends BaseAIMonacoEditorController { }), ); - return disposable; + return this.featureDisposable; } private async handleHoverFix(part: MarkerHover, provider: IHoverFixHandler) { diff --git a/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts b/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts index 3d57a1ea67..a8fc2c182b 100644 --- a/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts +++ b/packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts @@ -83,59 +83,47 @@ export class InlineChatEditorController extends BaseAIMonacoEditorController { mount(): IDisposable { this.inlineDiffController = InlineDiffController.get(this.monacoEditor)!; - this.doContribute(); - return this; - } - - private disposeAllWidget() { - [this.aiInlineContentWidget, this.aiInlineChatDisposable, this.aiInlineChatOperationDisposable].forEach( - (widget) => { - widget?.dispose(); - }, - ); - - this.inlineChatInUsing = false; - this.cancelToken(); - } - - public doContribute(): IDisposable { if (!this.monacoEditor) { - return this; + return this.featureDisposable; } - const monacoEditor = this.monacoEditor; - - this.disposables.push( + this.featureDisposable.addDispose( this.aiInlineChatService.onInlineChatVisible((value: boolean) => { if (value) { - this.showInlineChat(monacoEditor); + this.showInlineChat(this.monacoEditor); } else { this.cancelToken(); this.disposeAllWidget(); } }), + ); + + this.featureDisposable.addDispose( this.codeActionService.onCodeActionRun(({ id, range }) => { const currentEditor = this.workbenchEditorService.currentEditor; // 可能存在两个 editor 但 uri 是同一个的情况,所以需要根据 editor 的 id 来判断 - if (currentEditor?.getId() !== monacoEditor!.getId()) { + if (currentEditor?.getId() !== this.monacoEditor!.getId()) { return; } - monacoEditor.setSelection(range); - this.showInlineChat(monacoEditor); + this.monacoEditor.setSelection(range); + this.showInlineChat(this.monacoEditor); if (this.aiInlineContentWidget) { this.aiInlineContentWidget.clickActionId(id, 'codeAction'); } }), - monacoEditor.onWillChangeModel(() => { + ); + + this.featureDisposable.addDispose( + this.monacoEditor.onWillChangeModel(() => { this.disposeAllWidget(); }), ); let needShowInlineChat = false; - this.disposables.push( - monacoEditor.onMouseDown((event: monaco.IEditorMouseEvent) => { + this.featureDisposable.addDispose( + this.monacoEditor.onMouseDown((event: monaco.IEditorMouseEvent) => { const target = event.target; const detail = (target as any).detail; @@ -149,7 +137,10 @@ export class InlineChatEditorController extends BaseAIMonacoEditorController { this.disposeAllWidget(); } }), - monacoEditor.onMouseUp((event: monaco.IEditorMouseEvent) => { + ); + + this.featureDisposable.addDispose( + this.monacoEditor.onMouseUp((event: monaco.IEditorMouseEvent) => { const target = event.target; const detail = (target as any).detail; if (detail && typeof detail === 'string' && detail === AIInlineChatContentWidgetId) { @@ -164,7 +155,7 @@ export class InlineChatEditorController extends BaseAIMonacoEditorController { AINativeSettingSectionsId.InlineChatAutoVisible, true, ); - this.disposables.push( + this.featureDisposable.addDispose( this.preferenceService.onSpecificPreferenceChange( AINativeSettingSectionsId.InlineChatAutoVisible, ({ newValue }) => { @@ -173,9 +164,9 @@ export class InlineChatEditorController extends BaseAIMonacoEditorController { ), ); - this.disposables.push( + this.featureDisposable.addDispose( Event.debounce( - Event.any(monacoEditor.onDidChangeCursorSelection, monacoEditor.onMouseUp), + Event.any(this.monacoEditor.onDidChangeCursorSelection, this.monacoEditor.onMouseUp), (_, e) => e, 100, )(() => { @@ -189,11 +180,22 @@ export class InlineChatEditorController extends BaseAIMonacoEditorController { return; } - this.showInlineChat(monacoEditor); + this.showInlineChat(this.monacoEditor); }), ); - return this; + return this.featureDisposable; + } + + private disposeAllWidget() { + [this.aiInlineContentWidget, this.aiInlineChatDisposable, this.aiInlineChatOperationDisposable].forEach( + (widget) => { + widget?.dispose(); + }, + ); + + this.inlineChatInUsing = false; + this.cancelToken(); } protected showInlineContentWidget(monacoEditor: monaco.ICodeEditor, selection: monaco.Selection): void { diff --git a/packages/ai-native/src/browser/widget/inline-diff/inline-diff.controller.ts b/packages/ai-native/src/browser/widget/inline-diff/inline-diff.controller.ts index afd1d3cbb2..d3e73269c5 100644 --- a/packages/ai-native/src/browser/widget/inline-diff/inline-diff.controller.ts +++ b/packages/ai-native/src/browser/widget/inline-diff/inline-diff.controller.ts @@ -53,7 +53,7 @@ export class InlineDiffController extends BaseAIMonacoEditorController { private _previewerNodeStore = new Map(); mount(): IDisposable { - this.registerDispose( + this.featureDisposable.addDispose( this.eventBus.on(EditorGroupCloseEvent, (e: EditorGroupCloseEvent) => { const uriString = e.payload.resource.uri.toString(); const node = this.getStoredState(uriString); @@ -66,7 +66,7 @@ export class InlineDiffController extends BaseAIMonacoEditorController { this.registerInlineDiffFeature(this.monacoEditor); - return this; + return this.featureDisposable; } storeState(key: string) { @@ -110,12 +110,10 @@ export class InlineDiffController extends BaseAIMonacoEditorController { } } - registerInlineDiffFeature(monacoEditor: monaco.ICodeEditor): IDisposable { - const disposable = new Disposable(); - + registerInlineDiffFeature(monacoEditor: monaco.ICodeEditor): void { const model = monacoEditor.getModel(); - disposable.addDispose( + this.featureDisposable.addDispose( monacoEditor.onWillChangeModel((e) => { if (!e.oldModelUrl) { return; @@ -128,7 +126,7 @@ export class InlineDiffController extends BaseAIMonacoEditorController { }), ); - disposable.addDispose( + this.featureDisposable.addDispose( monacoEditor.onDidChangeModel((e) => { if (!e.newModelUrl) { return; @@ -138,15 +136,13 @@ export class InlineDiffController extends BaseAIMonacoEditorController { ); if (model) { - disposable.addDispose( + this.featureDisposable.addDispose( model.onWillDispose(() => { const uriString = model.uri.toString(); this.destroyPreviewer(uriString); }), ); } - - return disposable; } showPreviewerByStream( diff --git a/packages/ai-native/src/browser/widget/inline-hint/inline-hint.controller.ts b/packages/ai-native/src/browser/widget/inline-hint/inline-hint.controller.ts index 12e079406b..d5d33d763f 100644 --- a/packages/ai-native/src/browser/widget/inline-hint/inline-hint.controller.ts +++ b/packages/ai-native/src/browser/widget/inline-hint/inline-hint.controller.ts @@ -76,14 +76,14 @@ export class InlineHintController extends BaseAIMonacoEditorController { } }; - this.addDispose( + this.featureDisposable.addDispose( monacoEditor.onDidChangeCursorPosition((e: monaco.editor.ICursorPositionChangedEvent) => { hideHint(); showHint(e.position); }), ); - this.addDispose( + this.featureDisposable.addDispose( monacoEditor.onDidFocusEditorWidget(() => { const currentPosition = monacoEditor.getPosition(); @@ -94,13 +94,13 @@ export class InlineHintController extends BaseAIMonacoEditorController { }), ); - this.addDispose( + this.featureDisposable.addDispose( monacoEditor.onDidBlurEditorWidget(() => { hideHint(); }), ); - this.addDispose( + this.featureDisposable.addDispose( this.inlineCompletionsService.onVisibleCompletion((v) => { if (v) { hideHint(); @@ -108,8 +108,8 @@ export class InlineHintController extends BaseAIMonacoEditorController { }), ); - this.addDispose(hintDisposable); + this.featureDisposable.addDispose(hintDisposable); - return this; + return this.featureDisposable; } } diff --git a/packages/ai-native/src/browser/widget/inline-input/inline-input.controller.ts b/packages/ai-native/src/browser/widget/inline-input/inline-input.controller.ts index a194365347..ddad437a33 100644 --- a/packages/ai-native/src/browser/widget/inline-input/inline-input.controller.ts +++ b/packages/ai-native/src/browser/widget/inline-input/inline-input.controller.ts @@ -133,7 +133,7 @@ export class InlineInputController extends BaseAIMonacoEditorController { inputDisposable.dispose(); }; - this.addDispose( + this.featureDisposable.addDispose( this.inlineInputChatService.onInteractiveInputVisibleInPosition((position) => { hideInput(); @@ -144,7 +144,7 @@ export class InlineInputController extends BaseAIMonacoEditorController { ); const showInput = (position: monaco.Position, monacoEditor: ICodeEditor) => { - this.addDispose( + this.featureDisposable.addDispose( monacoEditor.onWillChangeModel(() => { hideInput(); }), @@ -270,8 +270,8 @@ export class InlineInputController extends BaseAIMonacoEditorController { inputDisposable.addDispose(inlineInputChatWidget); }; - this.addDispose(inputDisposable); + this.featureDisposable.addDispose(inputDisposable); - return this; + return this.featureDisposable; } } From 9177ff9e324b356fd7d05cd580f3a9295a0a083f Mon Sep 17 00:00:00 2001 From: John Date: Tue, 15 Oct 2024 19:03:22 +0800 Subject: [PATCH 25/42] fix: chat render unusual (#4095) * feat: support markdown react render * fix: chat markdown * chore: improve code * chore: improve code --- .../ai-native/src/browser/chat/chat.view.tsx | 9 +- .../src/browser/components/ChatMarkdown.tsx | 92 +++++----- .../src/browser/components/ChatReply.tsx | 22 ++- .../components/src/markdown-react/index.ts | 2 + .../components/src/markdown-react/parse.tsx | 160 ++++++++++++++++++ .../components/src/markdown-react/render.ts | 144 ++++++++++++++++ 6 files changed, 368 insertions(+), 61 deletions(-) create mode 100644 packages/components/src/markdown-react/index.ts create mode 100644 packages/components/src/markdown-react/parse.tsx create mode 100644 packages/components/src/markdown-react/render.ts diff --git a/packages/ai-native/src/browser/chat/chat.view.tsx b/packages/ai-native/src/browser/chat/chat.view.tsx index 5e5f066bb7..a8133d1b06 100644 --- a/packages/ai-native/src/browser/chat/chat.view.tsx +++ b/packages/ai-native/src/browser/chat/chat.view.tsx @@ -140,7 +140,10 @@ export const AIChatView = observer(() => { const scrollToBottom = React.useCallback(() => { if (containerRef && containerRef.current) { - containerRef.current.scrollTop = Number.MAX_SAFE_INTEGER; + const lastElement = containerRef.current.lastElementChild; + if (lastElement) { + lastElement.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } // 出现滚动条时出现分割线 if (containerRef.current.scrollHeight > containerRef.current.clientHeight) { containerRef.current.classList.add(SCROLL_CLASSNAME); @@ -162,10 +165,6 @@ export const AIChatView = observer(() => { handleDispatchMessage({ type: 'init', payload: [firstMsg] }); }, []); - React.useEffect(() => { - scrollToBottom(); - }, [loading]); - React.useEffect(() => { const disposer = new Disposable(); diff --git a/packages/ai-native/src/browser/components/ChatMarkdown.tsx b/packages/ai-native/src/browser/components/ChatMarkdown.tsx index a383e17a9a..b3341d14fb 100644 --- a/packages/ai-native/src/browser/components/ChatMarkdown.tsx +++ b/packages/ai-native/src/browser/components/ChatMarkdown.tsx @@ -1,11 +1,9 @@ import cls from 'classnames'; -import React, { useEffect, useRef, useState } from 'react'; -import ReactDOM from 'react-dom/client'; +import React, { ReactNode, useEffect, useRef, useState } from 'react'; +import { MarkdownReactParser, MarkdownReactRenderer } from '@opensumi/ide-components/lib/markdown-react'; import { IMarkedOptions, marked } from '@opensumi/ide-components/lib/utils'; import { AppConfig, ConfigProvider, useInjectable } from '@opensumi/ide-core-browser'; -import { defaultGenerator } from '@opensumi/ide-core-common/lib/id-generator'; -import { escape } from '@opensumi/ide-utils/lib/strings'; import { IMarkdownString, MarkdownString } from '@opensumi/monaco-editor-core/esm/vs/base/common/htmlContent'; import { CodeEditorWithHighlight } from './ChatEditor'; @@ -24,45 +22,49 @@ interface MarkdownProps { export const ChatMarkdown = (props: MarkdownProps) => { const ref = useRef(null); const appConfig = useInjectable(AppConfig); + const [reactParser, setReactParser] = useState(); + const [tokensList, setTokensList] = useState(); useEffect(() => { const element = ref.current; if (!element) { return; } - const codeRenderedElements = new Map(); const markdown: IMarkdownString = typeof props.markdown === 'string' ? new MarkdownString(props.markdown) : props.markdown; - const renderer = new marked.Renderer(); - renderer.link = (href: string | null, title: string | null, text: string): string => - `${text}`; + const renderer: MarkdownReactRenderer = new MarkdownReactRenderer(); + renderer.link = (href: string, text: ReactNode): React.ReactElement => ( + + {text} + + ); renderer.code = (code, lang) => { - const id = defaultGenerator.nextId(); - const container = document.createElement('div'); const language = postProcessCodeBlockLanguageId(lang); - const dom = ReactDOM.createRoot(container); - dom.render( - -
-
{language}
- -
-
, + + return ( +
+ +
+
{language}
+ +
+
+
); - codeRenderedElements.set(id, { container, root: dom }); - return `
${escape(code)}
`; }; - renderer.codespan = (code) => `${code}`; + renderer.codespan = (code) => {code}; + + const reactParser = new MarkdownReactParser({ renderer }); const markedOptions = props.markedOptions ?? {}; - markedOptions.renderer = renderer; + markedOptions.renderer = reactParser; let value = markdown.value ?? ''; if (value.length > 100_000) { @@ -70,6 +72,7 @@ export const ChatMarkdown = (props: MarkdownProps) => { } let renderedMarkdown: string; + let tokensList: marked.TokensList; if (props.fillInIncompleteTokens) { const opts = { ...marked.defaults, @@ -78,33 +81,22 @@ export const ChatMarkdown = (props: MarkdownProps) => { const tokens = marked.lexer(value, opts); const newTokens = fillInIncompleteTokens(tokens); renderedMarkdown = marked.parser(newTokens, opts); + tokensList = newTokens; } else { - renderedMarkdown = marked.parse(value, markedOptions); + const tokens = marked.lexer(value, marked.defaults); + renderedMarkdown = marked.parser(tokens, markedOptions); + tokensList = tokens; } - element.innerHTML = renderedMarkdown; - - const codePlaceholderElements = element.querySelectorAll('div[data-code]'); - codePlaceholderElements.forEach((placeholderElement) => { - const renderedElement = codeRenderedElements.get(placeholderElement.dataset['code'] ?? ''); - if (renderedElement && renderedElement.container) { - placeholderElement.innerText = ''; - placeholderElement.append(renderedElement.container); - } - }); - - return () => { - if (codeRenderedElements.size > 0) { - codeRenderedElements.forEach(({ root }) => { - requestAnimationFrame(() => { - root.unmount(); - }); - }); - } - }; + setTokensList(tokensList); + setReactParser(reactParser); }, [props.markdown]); - return
; + return ( +
+ {tokensList && reactParser && reactParser.parse(tokensList)} +
+ ); }; export function postProcessCodeBlockLanguageId(lang: string | undefined): string { diff --git a/packages/ai-native/src/browser/components/ChatReply.tsx b/packages/ai-native/src/browser/components/ChatReply.tsx index ae133490b4..9416a0a824 100644 --- a/packages/ai-native/src/browser/components/ChatReply.tsx +++ b/packages/ai-native/src/browser/components/ChatReply.tsx @@ -1,4 +1,14 @@ -import React, { Fragment, ReactNode, useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react'; +import React, { + Fragment, + ReactNode, + startTransition, + useCallback, + useEffect, + useMemo, + useReducer, + useRef, + useState, +} from 'react'; import { Button } from '@opensumi/ide-components/lib/button'; import { BasicRecycleTree, IBasicRecycleTreeHandle, IBasicTreeData } from '@opensumi/ide-components/lib/recycle-tree'; @@ -192,10 +202,6 @@ export const ChatReply = (props: IChatReplyProps) => { disposableCollection.push( request.response.onDidChange(() => { - if (onDidChange) { - onDidChange(); - } - history.updateAssistantMessage(msgId, { content: request.response.responseText }); if (request.response.isComplete) { @@ -212,7 +218,11 @@ export const ChatReply = (props: IChatReplyProps) => { agentId, }); } - update(); + + startTransition(() => { + onDidChange?.(); + update(); + }); }), ); diff --git a/packages/components/src/markdown-react/index.ts b/packages/components/src/markdown-react/index.ts new file mode 100644 index 0000000000..d09fd7da24 --- /dev/null +++ b/packages/components/src/markdown-react/index.ts @@ -0,0 +1,2 @@ +export * from './render'; +export * from './parse'; diff --git a/packages/components/src/markdown-react/parse.tsx b/packages/components/src/markdown-react/parse.tsx new file mode 100644 index 0000000000..07bf29aeb8 --- /dev/null +++ b/packages/components/src/markdown-react/parse.tsx @@ -0,0 +1,160 @@ +import { marked } from 'marked'; +import React, { ReactNode } from 'react'; + +import { HeadingLevels, MarkdownReactRenderer } from './render'; + +/** + * 这里通过重新实现 marked.Renderer 的所有方法,实现一个能直接渲染 React 的 Markdown 渲染器 + */ +export class MarkdownReactParser extends marked.Renderer { + private renderer: MarkdownReactRenderer; + + constructor(options: { renderer: MarkdownReactRenderer }) { + super(); + + this.renderer = options.renderer; + } + + parse(tokens: marked.Token[]): ReactNode[] { + return tokens.map((token) => { + switch (token.type) { + case 'html': { + return
; + } + + case 'space': { + return null; + } + + case 'heading': { + const level = token.depth as HeadingLevels; + return this.renderer.heading(this.parseInline(token.tokens), level); + } + + case 'paragraph': { + return this.renderer.paragraph(this.parseInline(token.tokens)); + } + + case 'text': { + const textToken = token as marked.Tokens.Text; + return textToken.tokens ? this.parseInline(textToken.tokens) : token.text; + } + + case 'blockquote': { + const blockquoteToken = token as marked.Tokens.Blockquote; + const quote = this.parse(blockquoteToken.tokens); + return this.renderer.blockquote(quote); + } + + case 'list': { + const listToken = token as marked.Tokens.List; + + const children = listToken.items.map((item) => { + const listItemChildren: ReactNode[] = []; + + if (item.task) { + listItemChildren.push(this.renderer.checkbox(item.checked ?? false)); + } + + listItemChildren.push(this.parse(item.tokens)); + + return this.renderer.listItem(listItemChildren); + }); + + return this.renderer.list(children, token.ordered); + } + + case 'code': { + return this.renderer.code(token.text, token.lang); + } + + case 'table': { + const tableToken = token as marked.Tokens.Table; + const headerCells = tableToken.header.map((cell, index) => + this.renderer.tableCell(this.parseInline(cell.tokens), { header: true, align: token.align[index] }), + ); + + const headerRow = this.renderer.tableRow(headerCells); + const header = this.renderer.tableHeader(headerRow); + + const bodyChilren = tableToken.rows.map((row) => { + const rowChildren = row.map((cell, index) => + this.renderer.tableCell(this.parseInline(cell.tokens), { + header: false, + align: token.align[index], + }), + ); + + return this.renderer.tableRow(rowChildren); + }); + + const body = this.renderer.tableBody(bodyChilren); + + return this.renderer.table([header, body]); + } + + case 'hr': { + return this.renderer.hr(); + } + + default: { + // eslint-disable-next-line no-console + console.warn(`Token with "${token.type}" type was not found`); + return null; + } + } + }); + } + + parseInline(tokens: marked.Token[] = []): ReactNode[] { + return tokens.map((token) => { + switch (token.type) { + case 'text': { + return this.renderer.text(unescape(token.text)); + } + + case 'strong': { + return this.renderer.strong(this.parseInline(token.tokens)); + } + + case 'em': { + return this.renderer.em(this.parseInline(token.tokens)); + } + + case 'del': { + return this.renderer.del(this.parseInline(token.tokens)); + } + + case 'codespan': { + return this.renderer.codespan(unescape(token.text)); + } + + case 'link': { + return this.renderer.link(token.href, this.parseInline(token.tokens)); + } + + case 'image': { + return this.renderer.image(token.href, token.text, token.title); + } + + case 'html': { + return this.renderer.html(token.text); + } + + case 'br': { + return this.renderer.br(); + } + + case 'escape': { + return this.renderer.text(token.text); + } + + default: { + // eslint-disable-next-line no-console + console.warn(`Token with "${token.type}" type was not found`); + return null; + } + } + }); + } +} diff --git a/packages/components/src/markdown-react/render.ts b/packages/components/src/markdown-react/render.ts new file mode 100644 index 0000000000..fe9ba6da33 --- /dev/null +++ b/packages/components/src/markdown-react/render.ts @@ -0,0 +1,144 @@ +import { ElementType, ReactElement, ReactNode, createElement } from 'react'; + +export type HeadingLevels = 1 | 2 | 3 | 4 | 5 | 6; +export interface TableFlags { + header?: boolean; + align?: 'center' | 'left' | 'right' | null; +} + +export type CustomReactRenderer = Partial; +export type RendererMethods = keyof MarkdownReactRenderer; + +export interface ReactRendererOptions { + baseURL?: string; + openLinksInNewTab?: boolean; + langPrefix?: string; + renderer?: CustomReactRenderer; +} + +export class MarkdownReactRenderer { + private uid = 0; + private options: ReactRendererOptions; + + constructor(options: ReactRendererOptions = {}) { + this.options = options; + } + + private node(el: T, children: ReactNode = null, props = {}): ReactElement { + const elProps = { + key: `marked-react-${this.uid}`, + }; + + this.incrementUID(); + return createElement(el, { ...props, ...elProps }, children); + } + + private incrementUID() { + this.uid += 1; + } + + heading(children: ReactNode, level: HeadingLevels) { + return this.node(`h${level}`, children); + } + + paragraph(children: ReactNode) { + return this.node('p', children); + } + + private joinBase(path: string, base?: string) { + if (!base) { + return path; + } + + try { + return new URL(path, base).href; + } catch { + return path; + } + } + + link(href: string, text: ReactNode) { + const url = this.joinBase(href, this.options.baseURL); + const target = this.options.openLinksInNewTab ? '_blank' : null; + return this.node('a', text, { href: url, target }); + } + + image(src: string, alt: string, title: string | null = null) { + const url = this.joinBase(src, this.options.baseURL); + return this.node('img', null, { src: url, alt, title }); + } + + codespan(code: ReactNode, lang: string | null = null) { + const className = lang ? `${this.options.langPrefix}${lang}` : null; + return this.node('code', code, { className }); + } + + code(code: ReactNode | string, lang: string | undefined) { + return this.node('pre', this.codespan(code, lang)); + } + + blockquote(children: ReactNode) { + return this.node('blockquote', children); + } + + list(children: ReactNode, ordered: boolean) { + return this.node(ordered ? 'ol' : 'ul', children); + } + + listItem(children: ReactNode[]) { + return this.node('li', children); + } + + checkbox(checked: ReactNode) { + return this.node('input', null, { type: 'checkbox', disabled: true, checked }); + } + + table(children: ReactNode[]) { + return this.node('table', children); + } + + tableHeader(children: ReactNode) { + return this.node('thead', children); + } + + tableBody(children: ReactNode[]) { + return this.node('tbody', children); + } + + tableRow(children: ReactNode[]) { + return this.node('tr', children); + } + + tableCell(children: ReactNode[], flags: TableFlags) { + const tag = flags.header ? 'th' : 'td'; + return this.node(tag, children, { align: flags.align }); + } + + strong(children: ReactNode) { + return this.node('strong', children); + } + + em(children: ReactNode) { + return this.node('em', children); + } + + del(children: ReactNode) { + return this.node('del', children); + } + + text(text: ReactNode) { + return text; + } + + html(html: ReactNode) { + return html; + } + + hr() { + return this.node('hr'); + } + + br() { + return this.node('br'); + } +} From 8041472e6422ef0544a6b279543ceafa148775a0 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 15 Oct 2024 20:57:37 +0800 Subject: [PATCH 26/42] fix: add config for diff editor state restore (#4096) * fix: add configs for diff editor state restore * fix: handle optional chaining for diffEditor disposal --- .../src/react-providers/config-provider.tsx | 4 ++++ .../src/browser/editor-collection.service.ts | 17 +++++++++++++---- .../src/browser/workbench-editor.service.ts | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/core-browser/src/react-providers/config-provider.tsx b/packages/core-browser/src/react-providers/config-provider.tsx index e48f3bc06d..a556a8fe1f 100644 --- a/packages/core-browser/src/react-providers/config-provider.tsx +++ b/packages/core-browser/src/react-providers/config-provider.tsx @@ -298,6 +298,10 @@ export interface AppConfig { * This is useful when your scenario is one-time use, and you can control the opening of the editor tab yourself. */ disableRestoreEditorGroupState?: boolean; + /** + * 启用 Diff 编辑器状态恢复逻辑 + */ + enableRestoreDiffEditorState?: boolean; } export interface ICollaborationClientOpts { diff --git a/packages/editor/src/browser/editor-collection.service.ts b/packages/editor/src/browser/editor-collection.service.ts index e4f98ede52..2370d7e09d 100644 --- a/packages/editor/src/browser/editor-collection.service.ts +++ b/packages/editor/src/browser/editor-collection.service.ts @@ -1,5 +1,5 @@ import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di'; -import { IContextKeyService, IRange, PreferenceService } from '@opensumi/ide-core-browser'; +import { AppConfig, IContextKeyService, IRange, PreferenceService } from '@opensumi/ide-core-browser'; import { ResourceContextKey } from '@opensumi/ide-core-browser/lib/contextkey'; import { MonacoService } from '@opensumi/ide-core-browser/lib/monaco'; import { @@ -559,6 +559,9 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { @Autowired(EditorCollectionService) private collectionService: EditorCollectionServiceImpl; + @Autowired(AppConfig) + private appConfig: AppConfig; + private originalDocModelRef: IEditorDocumentModelRef | null; private modifiedDocModelRef: IEditorDocumentModelRef | null; @@ -639,8 +642,10 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { } disposeModel(originalUri: string, modifiedUri: string) { - const key = `${originalUri}-${modifiedUri}`; - this.diffEditorModelCache.delete(key); + if (this.diffEditorModelCache.size > 0) { + const key = `${originalUri}-${modifiedUri}`; + this.diffEditorModelCache.delete(key); + } } async compare( @@ -658,7 +663,11 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { const original = this.originalDocModel.getMonacoModel(); const modified = this.modifiedDocModel.getMonacoModel(); const key = `${original.uri.toString()}-${modified.uri.toString()}`; - let model = this.diffEditorModelCache.get(key); + let model: monaco.editor.IDiffEditorViewModel | undefined; + if (this.appConfig.enableRestoreDiffEditorState) { + model = this.diffEditorModelCache.get(key); + } + if (!model) { model = this.monacoDiffEditor.createViewModel({ original, modified }); this.diffEditorModelCache.set(key, model); diff --git a/packages/editor/src/browser/workbench-editor.service.ts b/packages/editor/src/browser/workbench-editor.service.ts index 5fa28bf558..6e5c950695 100644 --- a/packages/editor/src/browser/workbench-editor.service.ts +++ b/packages/editor/src/browser/workbench-editor.service.ts @@ -1568,7 +1568,7 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup { const query = uri.getParsedQuery(); this.doDisposeDocRef(new URI(query.original)); this.doDisposeDocRef(new URI(query.modified)); - this.diffEditor.disposeModel(query.original, query.modified); + this.diffEditor?.disposeModel(query.original, query.modified); } else if (uri.scheme === 'mergeEditor') { this.mergeEditor && this.mergeEditor.dispose(); } else { From 33b2de658c2455c31e7610ed80354a602b278d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E8=A1=A8=E5=93=A5?= Date: Tue, 15 Oct 2024 21:03:52 +0800 Subject: [PATCH 27/42] chore: use tiktoken instead of js-tiktoken (#4094) --- packages/ai-native/package.json | 2 +- .../inline-completions/prompt/prompt.ts | 14 +++++++++----- .../inline-completions/prompt/tokenizer.ts | 5 ++--- tools/dev-tool/src/webpack.js | 3 +++ yarn.lock | 18 ++++++++---------- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/ai-native/package.json b/packages/ai-native/package.json index 652b91a71b..d7e3e8a272 100644 --- a/packages/ai-native/package.json +++ b/packages/ai-native/package.json @@ -40,9 +40,9 @@ "@xterm/xterm": "5.5.0", "ansi-regex": "^2.0.0", "dom-align": "^1.7.0", - "js-tiktoken": "1.0.12", "react-chat-elements": "^12.0.10", "react-highlight": "^0.15.0", + "tiktoken": "1.0.12", "web-tree-sitter": "0.22.6" }, "devDependencies": { diff --git a/packages/ai-native/src/browser/contrib/inline-completions/prompt/prompt.ts b/packages/ai-native/src/browser/contrib/inline-completions/prompt/prompt.ts index 68b8574f31..71958602c9 100644 --- a/packages/ai-native/src/browser/contrib/inline-completions/prompt/prompt.ts +++ b/packages/ai-native/src/browser/contrib/inline-completions/prompt/prompt.ts @@ -1,5 +1,4 @@ -// @ts-ignore -import { Tiktoken } from 'js-tiktoken'; +import { Tiktoken } from 'tiktoken/lite'; import { Injector } from '@opensumi/di'; @@ -59,7 +58,12 @@ export const getMarkerForSnippets = (text: string, language: string) => { return lines.map((line) => getMarkerByLanguage(line, language)).join('\n'); }; -export const getCroppedTextByLine = (text: string, maxTokenSize: number, textTokens: number[][], reverse = false) => { +export const getCroppedTextByLine = ( + text: string, + maxTokenSize: number, + textTokens: Uint32Array[], + reverse = false, +) => { const currentTokenSize = textTokens.reduce((prev, cur) => prev + cur.length, 0); if (currentTokenSize < maxTokenSize) { return text; @@ -110,7 +114,7 @@ export const getCroppedTextByLine = (text: string, maxTokenSize: number, textTok export const getCroppedText = async ( text: string, maxTokenSize: number, - textTokens: number[][], + textTokens: Uint32Array[], strategy = StrategyType.InterceptBasedOnLine, tokenizer: Tiktoken, parser?: LanguageParser, @@ -118,7 +122,7 @@ export const getCroppedText = async ( reverse = false, token?: monaco.CancellationToken, ): Promise => { - let tokens: number[]; + let tokens: Uint32Array; if (strategy === StrategyType.InterceptBasedOnLine) { // 按行进行裁剪 text = getCroppedTextByLine(text, maxTokenSize, textTokens, reverse); diff --git a/packages/ai-native/src/browser/contrib/inline-completions/prompt/tokenizer.ts b/packages/ai-native/src/browser/contrib/inline-completions/prompt/tokenizer.ts index e0a348ed6b..22cbe91807 100644 --- a/packages/ai-native/src/browser/contrib/inline-completions/prompt/tokenizer.ts +++ b/packages/ai-native/src/browser/contrib/inline-completions/prompt/tokenizer.ts @@ -1,5 +1,4 @@ -// @ts-ignore -import { Tiktoken, getEncoding } from 'js-tiktoken'; +import { Tiktoken, get_encoding } from 'tiktoken'; import { TokenizerName } from '../types'; @@ -10,7 +9,7 @@ export const getTokenizer = (tokenizerName = TokenizerName.cl100k_base) => { if (tokenizer) { return tokenizer; } - tokenizer = getEncoding('cl100k_base'); + tokenizer = get_encoding('cl100k_base'); TOKENIZER_CACHE.set(tokenizerName, tokenizer); return tokenizer; }; diff --git a/tools/dev-tool/src/webpack.js b/tools/dev-tool/src/webpack.js index 5d5394f81e..ce3b78547d 100644 --- a/tools/dev-tool/src/webpack.js +++ b/tools/dev-tool/src/webpack.js @@ -45,6 +45,9 @@ exports.createWebpackConfig = function (dir, entry, extraConfig) { cache: { type: 'filesystem', }, + experiments: { + asyncWebAssembly: true, // 启用 WebAssembly 支持 + }, resolve: { extensions: ['.ts', '.tsx', '.js', '.json', '.less'], plugins: [ diff --git a/yarn.lock b/yarn.lock index 978124f030..b9c7dd0dd1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2265,9 +2265,9 @@ __metadata: "@xterm/xterm": "npm:5.5.0" ansi-regex: "npm:^2.0.0" dom-align: "npm:^1.7.0" - js-tiktoken: "npm:1.0.12" react-chat-elements: "npm:^12.0.10" react-highlight: "npm:^0.15.0" + tiktoken: "npm:1.0.12" web-tree-sitter: "npm:0.22.6" languageName: unknown linkType: soft @@ -12221,15 +12221,6 @@ __metadata: languageName: node linkType: hard -"js-tiktoken@npm:1.0.12": - version: 1.0.12 - resolution: "js-tiktoken@npm:1.0.12" - dependencies: - base64-js: "npm:^1.5.1" - checksum: 10/21aaa9302409fefc5ac18695579b04e0223cdda2566e5cc4a95de228333bbadfc2e16110fceca1824d7faa43081ef378e6bc72238a2230374a85f88638556305 - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -18889,6 +18880,13 @@ __metadata: languageName: node linkType: hard +"tiktoken@npm:1.0.12": + version: 1.0.12 + resolution: "tiktoken@npm:1.0.12" + checksum: 10/595ab2e93f1937a1af8baf057f1a2951cfd7b5d4c0986807c1fc8e1a2118800a31cec81cdbcb115c4be5eec4fd9d5c23ac23691a227658c1010aeefec5dfa3ea + languageName: node + linkType: hard + "timeago.js@npm:^4.0.2": version: 4.0.2 resolution: "timeago.js@npm:4.0.2" From f4b74b6e02f55a24641f16924cf01873ae377c4e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 16 Oct 2024 01:07:01 +0000 Subject: [PATCH 28/42] chore: update manifest.json to v3.4.4 --- packages/types/manifest.json | 236 +++++++++++++++++------------------ 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/packages/types/manifest.json b/packages/types/manifest.json index 1a285f4829..73d6ac97d4 100644 --- a/packages/types/manifest.json +++ b/packages/types/manifest.json @@ -1,301 +1,301 @@ { "meta": { "@opensumi/ide-addons": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-ai-native": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-collaboration": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-comments": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-components": { - "version": "3.4.3", + "version": "3.4.4", "entry": [] }, "@opensumi/ide-connection": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-core-browser": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["common"] }, "@opensumi/ide-core-common": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node"] }, "@opensumi/ide-core-electron-main": { - "version": "3.4.3", + "version": "3.4.4", "entry": [] }, "@opensumi/ide-core-node": { - "version": "3.4.3", + "version": "3.4.4", "entry": [] }, "@opensumi/ide-debug": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-decoration": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-design": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-editor": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-electron-basic": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser"] }, "@opensumi/ide-explorer": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser"] }, "@opensumi/ide-express-file-server": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension-manager": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-extension-storage": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-file-scheme": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-file-search": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "common"] }, "@opensumi/ide-file-service": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-file-tree-next": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-i18n": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-keymaps": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-logs": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-main-layout": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-markdown": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-markers": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-menu-bar": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser"] }, "@opensumi/ide-monaco": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-monaco-enhance": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-opened-editor": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-outline": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-output": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-overlay": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-preferences": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-process": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "common"] }, "@opensumi/ide-quick-open": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/remote-cli": { - "version": "3.4.3", + "version": "3.4.4", "entry": [] }, "@opensumi/ide-remote-opener": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-scm": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-search": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-startup": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser"] }, "@opensumi/ide-static-resource": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser"] }, "@opensumi/ide-status-bar": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-storage": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-task": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-terminal-next": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["node", "browser", "common"] }, "@opensumi/ide-testing": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-theme": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-toolbar": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser"] }, "@opensumi/sumi": { - "version": "3.4.3", + "version": "3.4.4", "entry": [] }, "@opensumi/ide-utils": { - "version": "3.4.3", + "version": "3.4.4", "entry": [] }, "@opensumi/ide-variable": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-webview": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-workspace": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] }, "@opensumi/ide-workspace-edit": { - "version": "3.4.3", + "version": "3.4.4", "entry": ["browser", "common"] } }, "packages": { - "@opensumi/ide-addons": "3.4.3", - "@opensumi/ide-ai-native": "3.4.3", - "@opensumi/ide-collaboration": "3.4.3", - "@opensumi/ide-comments": "3.4.3", - "@opensumi/ide-components": "3.4.3", - "@opensumi/ide-connection": "3.4.3", - "@opensumi/ide-core-browser": "3.4.3", - "@opensumi/ide-core-common": "3.4.3", - "@opensumi/ide-core-electron-main": "3.4.3", - "@opensumi/ide-core-node": "3.4.3", - "@opensumi/ide-debug": "3.4.3", - "@opensumi/ide-decoration": "3.4.3", - "@opensumi/ide-design": "3.4.3", - "@opensumi/ide-editor": "3.4.3", - "@opensumi/ide-electron-basic": "3.4.3", - "@opensumi/ide-explorer": "3.4.3", - "@opensumi/ide-express-file-server": "3.4.3", - "@opensumi/ide-extension": "3.4.3", - "@opensumi/ide-extension-manager": "3.4.3", - "@opensumi/ide-extension-storage": "3.4.3", - "@opensumi/ide-file-scheme": "3.4.3", - "@opensumi/ide-file-search": "3.4.3", - "@opensumi/ide-file-service": "3.4.3", - "@opensumi/ide-file-tree-next": "3.4.3", - "@opensumi/ide-i18n": "3.4.3", - "@opensumi/ide-keymaps": "3.4.3", - "@opensumi/ide-logs": "3.4.3", - "@opensumi/ide-main-layout": "3.4.3", - "@opensumi/ide-markdown": "3.4.3", - "@opensumi/ide-markers": "3.4.3", - "@opensumi/ide-menu-bar": "3.4.3", - "@opensumi/ide-monaco": "3.4.3", - "@opensumi/ide-monaco-enhance": "3.4.3", - "@opensumi/ide-opened-editor": "3.4.3", - "@opensumi/ide-outline": "3.4.3", - "@opensumi/ide-output": "3.4.3", - "@opensumi/ide-overlay": "3.4.3", - "@opensumi/ide-preferences": "3.4.3", - "@opensumi/ide-process": "3.4.3", - "@opensumi/ide-quick-open": "3.4.3", - "@opensumi/remote-cli": "3.4.3", - "@opensumi/ide-remote-opener": "3.4.3", - "@opensumi/ide-scm": "3.4.3", - "@opensumi/ide-search": "3.4.3", - "@opensumi/ide-startup": "3.4.3", - "@opensumi/ide-static-resource": "3.4.3", - "@opensumi/ide-status-bar": "3.4.3", - "@opensumi/ide-storage": "3.4.3", - "@opensumi/ide-task": "3.4.3", - "@opensumi/ide-terminal-next": "3.4.3", - "@opensumi/ide-testing": "3.4.3", - "@opensumi/ide-theme": "3.4.3", - "@opensumi/ide-toolbar": "3.4.3", - "@opensumi/sumi": "3.4.3", - "@opensumi/ide-utils": "3.4.3", - "@opensumi/ide-variable": "3.4.3", - "@opensumi/ide-webview": "3.4.3", - "@opensumi/ide-workspace": "3.4.3", - "@opensumi/ide-workspace-edit": "3.4.3" + "@opensumi/ide-addons": "3.4.4", + "@opensumi/ide-ai-native": "3.4.4", + "@opensumi/ide-collaboration": "3.4.4", + "@opensumi/ide-comments": "3.4.4", + "@opensumi/ide-components": "3.4.4", + "@opensumi/ide-connection": "3.4.4", + "@opensumi/ide-core-browser": "3.4.4", + "@opensumi/ide-core-common": "3.4.4", + "@opensumi/ide-core-electron-main": "3.4.4", + "@opensumi/ide-core-node": "3.4.4", + "@opensumi/ide-debug": "3.4.4", + "@opensumi/ide-decoration": "3.4.4", + "@opensumi/ide-design": "3.4.4", + "@opensumi/ide-editor": "3.4.4", + "@opensumi/ide-electron-basic": "3.4.4", + "@opensumi/ide-explorer": "3.4.4", + "@opensumi/ide-express-file-server": "3.4.4", + "@opensumi/ide-extension": "3.4.4", + "@opensumi/ide-extension-manager": "3.4.4", + "@opensumi/ide-extension-storage": "3.4.4", + "@opensumi/ide-file-scheme": "3.4.4", + "@opensumi/ide-file-search": "3.4.4", + "@opensumi/ide-file-service": "3.4.4", + "@opensumi/ide-file-tree-next": "3.4.4", + "@opensumi/ide-i18n": "3.4.4", + "@opensumi/ide-keymaps": "3.4.4", + "@opensumi/ide-logs": "3.4.4", + "@opensumi/ide-main-layout": "3.4.4", + "@opensumi/ide-markdown": "3.4.4", + "@opensumi/ide-markers": "3.4.4", + "@opensumi/ide-menu-bar": "3.4.4", + "@opensumi/ide-monaco": "3.4.4", + "@opensumi/ide-monaco-enhance": "3.4.4", + "@opensumi/ide-opened-editor": "3.4.4", + "@opensumi/ide-outline": "3.4.4", + "@opensumi/ide-output": "3.4.4", + "@opensumi/ide-overlay": "3.4.4", + "@opensumi/ide-preferences": "3.4.4", + "@opensumi/ide-process": "3.4.4", + "@opensumi/ide-quick-open": "3.4.4", + "@opensumi/remote-cli": "3.4.4", + "@opensumi/ide-remote-opener": "3.4.4", + "@opensumi/ide-scm": "3.4.4", + "@opensumi/ide-search": "3.4.4", + "@opensumi/ide-startup": "3.4.4", + "@opensumi/ide-static-resource": "3.4.4", + "@opensumi/ide-status-bar": "3.4.4", + "@opensumi/ide-storage": "3.4.4", + "@opensumi/ide-task": "3.4.4", + "@opensumi/ide-terminal-next": "3.4.4", + "@opensumi/ide-testing": "3.4.4", + "@opensumi/ide-theme": "3.4.4", + "@opensumi/ide-toolbar": "3.4.4", + "@opensumi/sumi": "3.4.4", + "@opensumi/ide-utils": "3.4.4", + "@opensumi/ide-variable": "3.4.4", + "@opensumi/ide-webview": "3.4.4", + "@opensumi/ide-workspace": "3.4.4", + "@opensumi/ide-workspace-edit": "3.4.4" } } From 591891f890560abddd476796a0a7a5b9683b1847 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 16 Oct 2024 01:07:16 +0000 Subject: [PATCH 29/42] v3.4.4 --- lerna.json | 2 +- packages/addons/package.json | 2 +- packages/ai-native/package.json | 2 +- packages/collaboration/package.json | 2 +- packages/comments/package.json | 2 +- packages/components/package.json | 2 +- packages/connection/package.json | 2 +- packages/core-browser/package.json | 2 +- packages/core-common/package.json | 2 +- packages/core-electron-main/package.json | 2 +- packages/core-node/package.json | 2 +- packages/debug/package.json | 2 +- packages/decoration/package.json | 2 +- packages/design/package.json | 2 +- packages/editor/package.json | 2 +- packages/electron-basic/package.json | 2 +- packages/explorer/package.json | 2 +- packages/express-file-server/package.json | 2 +- packages/extension-manager/package.json | 2 +- packages/extension-storage/package.json | 2 +- packages/extension/package.json | 2 +- packages/file-scheme/package.json | 2 +- packages/file-search/package.json | 2 +- packages/file-service/package.json | 2 +- packages/file-tree-next/package.json | 2 +- packages/i18n/package.json | 2 +- packages/keymaps/package.json | 2 +- packages/logs-core/package.json | 2 +- packages/main-layout/package.json | 2 +- packages/markdown/package.json | 2 +- packages/markers/package.json | 2 +- packages/menu-bar/package.json | 2 +- packages/monaco-enhance/package.json | 2 +- packages/monaco/package.json | 2 +- packages/opened-editor/package.json | 2 +- packages/outline/package.json | 2 +- packages/output/package.json | 2 +- packages/overlay/package.json | 2 +- packages/preferences/package.json | 2 +- packages/process/package.json | 2 +- packages/quick-open/package.json | 2 +- packages/remote-opener/package.json | 2 +- packages/scm/package.json | 2 +- packages/search/package.json | 2 +- packages/startup/package.json | 2 +- packages/static-resource/package.json | 2 +- packages/status-bar/package.json | 2 +- packages/storage/package.json | 2 +- packages/task/package.json | 2 +- packages/terminal-next/package.json | 2 +- packages/testing/package.json | 2 +- packages/theme/package.json | 2 +- packages/toolbar/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/variable/package.json | 2 +- packages/webview/package.json | 2 +- packages/workspace-edit/package.json | 2 +- packages/workspace/package.json | 2 +- tools/cli-engine/package.json | 2 +- tools/dev-tool/package.json | 2 +- tools/playwright/package.json | 2 +- 62 files changed, 62 insertions(+), 62 deletions(-) diff --git a/lerna.json b/lerna.json index b40aadbbab..264cf94ded 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "3.4.3" + "version": "3.4.4" } diff --git a/packages/addons/package.json b/packages/addons/package.json index e42c04ede2..a5b166e48e 100644 --- a/packages/addons/package.json +++ b/packages/addons/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-addons", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/ai-native/package.json b/packages/ai-native/package.json index 857f7efd5c..a0036e8f6e 100644 --- a/packages/ai-native/package.json +++ b/packages/ai-native/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-ai-native", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index ce7798de2a..88bca2ee06 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-collaboration", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/comments/package.json b/packages/comments/package.json index 84f28b4a51..d864b34e4e 100644 --- a/packages/comments/package.json +++ b/packages/comments/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-comments", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/components/package.json b/packages/components/package.json index 43c1dcd0b5..e479bcd4ef 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-components", - "version": "3.4.3", + "version": "3.4.4", "description": "@opensumi/ide-components", "license": "MIT", "main": "lib/index.js", diff --git a/packages/connection/package.json b/packages/connection/package.json index b66309b7f6..5e9b525061 100644 --- a/packages/connection/package.json +++ b/packages/connection/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-connection", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/core-browser/package.json b/packages/core-browser/package.json index 96d3e04e1b..b5545926f0 100644 --- a/packages/core-browser/package.json +++ b/packages/core-browser/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-browser", - "version": "3.4.3", + "version": "3.4.4", "description": "@opensumi/ide-core-browser", "files": [ "lib", diff --git a/packages/core-common/package.json b/packages/core-common/package.json index 6d92a85eb1..8df4db377d 100644 --- a/packages/core-common/package.json +++ b/packages/core-common/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-common", - "version": "3.4.3", + "version": "3.4.4", "description": "@opensumi/ide-core-common", "files": [ "lib", diff --git a/packages/core-electron-main/package.json b/packages/core-electron-main/package.json index c11d43e3eb..9f827c42e3 100644 --- a/packages/core-electron-main/package.json +++ b/packages/core-electron-main/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-electron-main", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "browser-preload" diff --git a/packages/core-node/package.json b/packages/core-node/package.json index 050a8314ba..489b767ac7 100644 --- a/packages/core-node/package.json +++ b/packages/core-node/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-core-node", - "version": "3.4.3", + "version": "3.4.4", "description": "@opensumi/ide-core-node", "files": [ "lib", diff --git a/packages/debug/package.json b/packages/debug/package.json index 5c33ea6836..9b3439be94 100644 --- a/packages/debug/package.json +++ b/packages/debug/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-debug", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/decoration/package.json b/packages/decoration/package.json index 4bdc8a0ca6..d591eeef5e 100644 --- a/packages/decoration/package.json +++ b/packages/decoration/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-decoration", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/design/package.json b/packages/design/package.json index 9de8007c6c..2d4fed8eb7 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-design", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/editor/package.json b/packages/editor/package.json index b02334a6a5..4fca7987e6 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-editor", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/electron-basic/package.json b/packages/electron-basic/package.json index 9655af2df7..4b2f2e7362 100644 --- a/packages/electron-basic/package.json +++ b/packages/electron-basic/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-electron-basic", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/explorer/package.json b/packages/explorer/package.json index 50dc5b644f..b8eee026d9 100644 --- a/packages/explorer/package.json +++ b/packages/explorer/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-explorer", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/express-file-server/package.json b/packages/express-file-server/package.json index daee2f8834..15c6c478de 100644 --- a/packages/express-file-server/package.json +++ b/packages/express-file-server/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-express-file-server", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/extension-manager/package.json b/packages/extension-manager/package.json index 78deb95221..8a79441689 100644 --- a/packages/extension-manager/package.json +++ b/packages/extension-manager/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension-manager", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/extension-storage/package.json b/packages/extension-storage/package.json index cb052ea482..5f64f054f3 100644 --- a/packages/extension-storage/package.json +++ b/packages/extension-storage/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension-storage", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/extension/package.json b/packages/extension/package.json index 2bae6cfec2..32f6ba746c 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-extension", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "hosted" diff --git a/packages/file-scheme/package.json b/packages/file-scheme/package.json index 1b12d9edec..278bacdbf2 100644 --- a/packages/file-scheme/package.json +++ b/packages/file-scheme/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-scheme", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/file-search/package.json b/packages/file-search/package.json index 5aa269862a..a3d1ce35f3 100644 --- a/packages/file-search/package.json +++ b/packages/file-search/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-search", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/file-service/package.json b/packages/file-service/package.json index 67f81ed8d8..44e861ee00 100644 --- a/packages/file-service/package.json +++ b/packages/file-service/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-service", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/file-tree-next/package.json b/packages/file-tree-next/package.json index c1626c4991..5f5ab766be 100644 --- a/packages/file-tree-next/package.json +++ b/packages/file-tree-next/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-file-tree-next", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 8a4c3537db..1e8a806104 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-i18n", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index 8e69a3ff89..e7cb28e819 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-keymaps", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/logs-core/package.json b/packages/logs-core/package.json index 4f6b12baa1..914a4b3caa 100644 --- a/packages/logs-core/package.json +++ b/packages/logs-core/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-logs", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/main-layout/package.json b/packages/main-layout/package.json index 09f282a00e..085777f5d7 100644 --- a/packages/main-layout/package.json +++ b/packages/main-layout/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-main-layout", - "version": "3.4.3", + "version": "3.4.4", "description": "@opensumi/ide-main-layout", "files": [ "lib", diff --git a/packages/markdown/package.json b/packages/markdown/package.json index 66bdf0a31e..274a76f641 100644 --- a/packages/markdown/package.json +++ b/packages/markdown/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-markdown", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/markers/package.json b/packages/markers/package.json index dc0d7c5409..05812179be 100644 --- a/packages/markers/package.json +++ b/packages/markers/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-markers", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/menu-bar/package.json b/packages/menu-bar/package.json index 213b7f14b9..24ab6eeccd 100644 --- a/packages/menu-bar/package.json +++ b/packages/menu-bar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-menu-bar", - "version": "3.4.3", + "version": "3.4.4", "description": "@opensumi/ide-menu-bar", "files": [ "lib", diff --git a/packages/monaco-enhance/package.json b/packages/monaco-enhance/package.json index 6b3202f1f4..47026af7b6 100644 --- a/packages/monaco-enhance/package.json +++ b/packages/monaco-enhance/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-monaco-enhance", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/monaco/package.json b/packages/monaco/package.json index a5e28719ee..e977b87db7 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-monaco", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src", diff --git a/packages/opened-editor/package.json b/packages/opened-editor/package.json index e101d65cfb..3bb69cae6f 100644 --- a/packages/opened-editor/package.json +++ b/packages/opened-editor/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-opened-editor", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/outline/package.json b/packages/outline/package.json index 6110165f59..e76af73a75 100644 --- a/packages/outline/package.json +++ b/packages/outline/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-outline", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/output/package.json b/packages/output/package.json index 2385402359..92e9fa9ee2 100644 --- a/packages/output/package.json +++ b/packages/output/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-output", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/overlay/package.json b/packages/overlay/package.json index 26e2350ce4..eb7e1dccde 100644 --- a/packages/overlay/package.json +++ b/packages/overlay/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-overlay", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/preferences/package.json b/packages/preferences/package.json index fc1466da0c..a706b6ce8e 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-preferences", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/process/package.json b/packages/process/package.json index b2981d62d9..ae171ac8e1 100644 --- a/packages/process/package.json +++ b/packages/process/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-process", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/quick-open/package.json b/packages/quick-open/package.json index a63921e2af..c9998d8773 100644 --- a/packages/quick-open/package.json +++ b/packages/quick-open/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-quick-open", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/remote-opener/package.json b/packages/remote-opener/package.json index 3c65a95698..b3f37cbd5c 100644 --- a/packages/remote-opener/package.json +++ b/packages/remote-opener/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-remote-opener", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/scm/package.json b/packages/scm/package.json index 671eb8d1d8..99ce93bd50 100644 --- a/packages/scm/package.json +++ b/packages/scm/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-scm", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/search/package.json b/packages/search/package.json index a3d9c246cf..5b1cdd9500 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-search", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/startup/package.json b/packages/startup/package.json index 36388dc9e7..cdfe2f0d33 100644 --- a/packages/startup/package.json +++ b/packages/startup/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-startup", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/static-resource/package.json b/packages/static-resource/package.json index 22d434e250..6e63b33931 100644 --- a/packages/static-resource/package.json +++ b/packages/static-resource/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-static-resource", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/status-bar/package.json b/packages/status-bar/package.json index 8d104f5d51..67408e80a4 100644 --- a/packages/status-bar/package.json +++ b/packages/status-bar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-status-bar", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/storage/package.json b/packages/storage/package.json index dcc71403b5..5edf7e8f58 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-storage", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/task/package.json b/packages/task/package.json index 4b1737ca97..be6e69d8c4 100644 --- a/packages/task/package.json +++ b/packages/task/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-task", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/terminal-next/package.json b/packages/terminal-next/package.json index 95c2ccb62e..5366e89e67 100644 --- a/packages/terminal-next/package.json +++ b/packages/terminal-next/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-terminal-next", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/testing/package.json b/packages/testing/package.json index 1c174bf956..aa99c6373d 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-testing", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/theme/package.json b/packages/theme/package.json index 29f46cffc6..d7fec5f185 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-theme", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json index ffdeaac0c2..86cb918b8b 100644 --- a/packages/toolbar/package.json +++ b/packages/toolbar/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-toolbar", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/types/package.json b/packages/types/package.json index a98d75fc8f..cfc0437d18 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/sumi", - "version": "3.4.3", + "version": "3.4.4", "typings": "index.d.ts", "license": "MIT", "repository": { diff --git a/packages/utils/package.json b/packages/utils/package.json index 362e0a8975..0ef65aa6ea 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-utils", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/variable/package.json b/packages/variable/package.json index 6fc781f0ad..4178d23be2 100644 --- a/packages/variable/package.json +++ b/packages/variable/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-variable", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/webview/package.json b/packages/webview/package.json index 6f8f4aeca9..4d0615d678 100644 --- a/packages/webview/package.json +++ b/packages/webview/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-webview", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/workspace-edit/package.json b/packages/workspace-edit/package.json index 056e062bda..4ebe6b0f7a 100644 --- a/packages/workspace-edit/package.json +++ b/packages/workspace-edit/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-workspace-edit", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 7e576268a0..f9ab6d84f2 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-workspace", - "version": "3.4.3", + "version": "3.4.4", "files": [ "lib", "src" diff --git a/tools/cli-engine/package.json b/tools/cli-engine/package.json index f3b0386b1a..867b4032f5 100644 --- a/tools/cli-engine/package.json +++ b/tools/cli-engine/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/cli-engine", - "version": "3.4.3", + "version": "3.4.4", "description": "Integration engine runtime for opensumi-cli and opensumi extension", "license": "MIT", "files": [ diff --git a/tools/dev-tool/package.json b/tools/dev-tool/package.json index e06c698423..e28b01bea8 100644 --- a/tools/dev-tool/package.json +++ b/tools/dev-tool/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/ide-dev-tool", - "version": "3.4.3", + "version": "3.4.4", "repository": { "type": "git", "url": "git@github.com:opensumi/core.git" diff --git a/tools/playwright/package.json b/tools/playwright/package.json index 6a385d7d4c..f12f4a36ec 100644 --- a/tools/playwright/package.json +++ b/tools/playwright/package.json @@ -1,6 +1,6 @@ { "name": "@opensumi/playwright", - "version": "3.4.3", + "version": "3.4.4", "description": "E2E test module for OpenSumi", "files": [ "lib", From 7d79b7ed42ec81915c564f3c3502a62907530fa4 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 16 Oct 2024 11:01:16 +0800 Subject: [PATCH 30/42] style: editor tab design style (#4099) --- packages/ai-native/src/browser/ai-core.contribution.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/ai-native/src/browser/ai-core.contribution.ts b/packages/ai-native/src/browser/ai-core.contribution.ts index bf359220b8..3e9249bad8 100644 --- a/packages/ai-native/src/browser/ai-core.contribution.ts +++ b/packages/ai-native/src/browser/ai-core.contribution.ts @@ -56,7 +56,6 @@ import { runWhenIdle, } from '@opensumi/ide-core-common'; import { DESIGN_MENU_BAR_RIGHT } from '@opensumi/ide-design'; -import { DesignBrowserCtxMenuService } from '@opensumi/ide-design/lib/browser/override/menu.service'; import { IEditor } from '@opensumi/ide-editor'; import { BrowserEditorContribution, IEditorFeatureRegistry } from '@opensumi/ide-editor/lib/browser'; import { IMainLayoutService } from '@opensumi/ide-main-layout'; @@ -137,7 +136,7 @@ export class AINativeBrowserContribution protected readonly injector: Injector; @Autowired(IBrowserCtxMenu) - private readonly ctxMenuRenderer: DesignBrowserCtxMenuService; + private readonly ctxMenuRenderer: IBrowserCtxMenu; @Autowired(AINativeCoreContribution) private readonly contributions: ContributionProvider; From cce388e24bc60aa88239319ac56fd48377c14978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Wed, 16 Oct 2024 14:14:21 +0800 Subject: [PATCH 31/42] feat(ext): support `sumiContributesOverride` field (#4092) --- .../src/ai-native/ai-config.service.ts | 2 +- .../browser/vscode/contributes/view-containers.ts | 14 ++++++++------ packages/extension/src/node/extension.scanner.ts | 7 +++++++ .../overrides/extension/extension-node.service.ts | 1 + packages/startup/entry/web/app.tsx | 3 ++- packages/startup/entry/web/render-app.tsx | 5 +++++ 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/core-browser/src/ai-native/ai-config.service.ts b/packages/core-browser/src/ai-native/ai-config.service.ts index d7d7754005..fdfdbd0eb3 100644 --- a/packages/core-browser/src/ai-native/ai-config.service.ts +++ b/packages/core-browser/src/ai-native/ai-config.service.ts @@ -4,7 +4,7 @@ import { IAINativeCapabilities } from '@opensumi/ide-core-common'; import { LayoutViewSizeConfig } from '../layout/constants'; import { AppConfig } from '../react-providers/config-provider'; -const DEFAULT_CAPABILITIES: Required = { +export const DEFAULT_CAPABILITIES: Required = { supportsMarkers: true, supportsChatAssistant: true, supportsInlineChat: true, diff --git a/packages/extension/src/browser/vscode/contributes/view-containers.ts b/packages/extension/src/browser/vscode/contributes/view-containers.ts index 6b74034af0..ef84e64ba3 100644 --- a/packages/extension/src/browser/vscode/contributes/view-containers.ts +++ b/packages/extension/src/browser/vscode/contributes/view-containers.ts @@ -36,16 +36,18 @@ export class ViewContainersContributionPoint extends VSCodeContributePoint Date: Thu, 17 Oct 2024 10:05:23 +0800 Subject: [PATCH 32/42] chore: improve inline diff widget render (#4100) --- .../live-preview.decoration.tsx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx index 639f00eba0..7a44d7dd91 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx @@ -1,6 +1,14 @@ import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di'; import { StackingLevel } from '@opensumi/ide-core-browser'; -import { ActionSourceEnum, ActionTypeEnum, Disposable, Emitter, Event, IAIReporter } from '@opensumi/ide-core-common'; +import { + ActionSourceEnum, + ActionTypeEnum, + Disposable, + Emitter, + Event, + IAIReporter, + runWhenIdle, +} from '@opensumi/ide-core-common'; import { ISingleEditOperation } from '@opensumi/ide-editor'; import { ICodeEditor, IEditorDecorationsCollection, ITextModel, Position, Range } from '@opensumi/ide-monaco'; import { StandaloneServices } from '@opensumi/ide-monaco/lib/browser/monaco-api/services'; @@ -668,10 +676,11 @@ export class LivePreviewDiffDecorationModel extends Disposable { } public touchRemovedWidget(states: IRemovedWidgetState[]) { - this.clearRemovedWidgets(); - - states.forEach(({ textLines, position }) => { - this.showRemovedWidgetByLineNumber(position.lineNumber, textLines, {}); + runWhenIdle(() => { + this.clearRemovedWidgets(); + states.forEach(({ textLines, position }) => { + this.showRemovedWidgetByLineNumber(position.lineNumber, textLines, {}); + }); }); } From 0cace9073b31c9da0d58ed17cda4942dd6e165e3 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 17 Oct 2024 13:47:30 +0800 Subject: [PATCH 33/42] feat: improve ghost text render (#4102) --- .../ai-native/src/browser/ai-core.contribution.ts | 2 +- .../intelligent-completions.controller.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/ai-native/src/browser/ai-core.contribution.ts b/packages/ai-native/src/browser/ai-core.contribution.ts index 3e9249bad8..ab5e66e0ec 100644 --- a/packages/ai-native/src/browser/ai-core.contribution.ts +++ b/packages/ai-native/src/browser/ai-core.contribution.ts @@ -422,8 +422,8 @@ export class AINativeBrowserContribution execute: async (visible: boolean) => { if (!visible) { this.aiCompletionsService.hideStatusBarItem(); + this.aiInlineCompletionsProvider.setVisibleCompletion(false); this.aiInlineCompletionsProvider.cancelRequest(); - this.aiCompletionsService.setVisibleCompletion(false); } }, }); diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts index 01db85c240..70cf57991f 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts @@ -21,6 +21,7 @@ import { SuggestItemInfo, SuggestWidgetAdaptor, } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider'; +import { SuggestController } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/suggest/browser/suggestController'; import { ContextKeyExpr } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/common/contextkey'; import { AINativeContextKey } from '../../contextkey/ai-native.contextkey.service'; @@ -129,6 +130,19 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll } }), ); + + observableDisposable.addDispose( + autorun((reader) => { + const state = inlineCompletionsController.model.read(reader)?.state.read(reader); + const suggestController = SuggestController.get(this.monacoEditor); + // 当阴影字符超出一行的时候,强制让 suggest 面板向上展示,避免遮挡补全内容 + if (state && state.primaryGhostText?.lineCount >= 2) { + suggestController?.forceRenderingAbove(); + } else { + suggestController?.stopForceRenderingAbove(); + } + }), + ); } }; From eb63446badb11c1c90a1e67dc0c882f67c61246f Mon Sep 17 00:00:00 2001 From: John Date: Thu, 17 Oct 2024 15:07:38 +0800 Subject: [PATCH 34/42] style: beautify suggest style (#4101) --- packages/design/src/browser/style/global.less | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/design/src/browser/style/global.less b/packages/design/src/browser/style/global.less index f663d348f9..7b91072f91 100644 --- a/packages/design/src/browser/style/global.less +++ b/packages/design/src/browser/style/global.less @@ -132,7 +132,9 @@ html { right: 4px !important; } - .monaco-hover { + .monaco-hover, + .suggest-widget, + .suggest-details { background-color: var(--kt-modal-background) !important; border-color: transparent; box-shadow: 0px 9px 28px 8px var(--design-boxShadow-primary), 0px 3px 6px -4px var(--design-boxShadow-secondary), @@ -140,6 +142,10 @@ html { border-radius: 8px !important; } + .suggest-widget { + overflow: hidden; + } + .monaco-scrollable-element { > .scrollbar > .slider { background: var(--scrollbarSlider-background); From f112878642a4d3ea4b689391f615a2f20fe29015 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 18 Oct 2024 14:35:25 +0800 Subject: [PATCH 35/42] fix: rewrite content width (#4103) --- .../ai-native/src/browser/widget/rewrite/rewrite-widget.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ai-native/src/browser/widget/rewrite/rewrite-widget.tsx b/packages/ai-native/src/browser/widget/rewrite/rewrite-widget.tsx index a67e95570c..4fa6b0e0ee 100644 --- a/packages/ai-native/src/browser/widget/rewrite/rewrite-widget.tsx +++ b/packages/ai-native/src/browser/widget/rewrite/rewrite-widget.tsx @@ -129,6 +129,7 @@ const TextBoxProvider = React.memo((props: ITextBoxProviderProps) => { const lineCount = currentLineNumber - range.startLineNumber; const spaceWidth = virtualEditor!.getOption(monaco.editor.EditorOption.fontInfo).spaceWidth; + const contentLeft = virtualEditor!.getOption(monaco.editor.EditorOption.layoutInfo).contentLeft; let maxColumnWidth = 0; const tabSize = virtualModel.getOptions().tabSize; Array.from( @@ -149,7 +150,7 @@ const TextBoxProvider = React.memo((props: ITextBoxProviderProps) => { } }); - setEditorSize({ width: maxColumnWidth * spaceWidth, height: lineHeight * (lineCount + 1) }); + setEditorSize({ width: maxColumnWidth * spaceWidth + contentLeft * 2, height: lineHeight * (lineCount + 1) }); }, [editorSize, editor], ); From 06b3924cdb4f5d3d461221d711b056472a5643fc Mon Sep 17 00:00:00 2001 From: John Date: Fri, 18 Oct 2024 16:24:02 +0800 Subject: [PATCH 36/42] refactor: intelligent completion & implement code edits api (#4105) * refactor: inline-completion * feat: implement lint error code edits api * chore: improve code * chore: improve code * chore: improve code --- .../multi-line.decoration.test.ts | 7 +- .../src/browser/ai-core.contribution.ts | 6 + .../inline-completions.controller.ts} | 74 ++++++---- .../model/competionModel.ts | 2 +- .../model/inlineCompletionRequestTask.ts | 10 +- .../contrib/inline-completions/promptCache.ts | 2 +- .../service/ai-completions.service.ts | 2 +- .../additions-deletions.decoration.ts | 9 +- .../{ => decoration}/multi-line.decoration.ts | 5 +- .../contrib/intelligent-completions/index.ts | 34 +++++ .../intelligent-completions.controller.ts | 61 +++----- ...ntelligent-completions.feature.registry.ts | 23 +++- .../intelligent-completions.ts | 15 -- .../lint-error.source.ts | 130 ++++++++++++++++++ packages/ai-native/src/browser/types.ts | 27 +++- .../ai-native/ai-native.contribution.ts | 102 ++++---------- 16 files changed, 323 insertions(+), 186 deletions(-) rename packages/ai-native/src/browser/contrib/{intelligent-completions/intelligent-completions.source.ts => inline-completions/inline-completions.controller.ts} (66%) rename packages/ai-native/src/browser/contrib/intelligent-completions/{ => decoration}/additions-deletions.decoration.ts (90%) rename packages/ai-native/src/browser/contrib/intelligent-completions/{ => decoration}/multi-line.decoration.ts (98%) create mode 100644 packages/ai-native/src/browser/contrib/intelligent-completions/index.ts delete mode 100644 packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.ts create mode 100644 packages/ai-native/src/browser/contrib/intelligent-completions/lint-error.source.ts diff --git a/packages/ai-native/__test__/browser/contrib/intelligent-completions/multi-line.decoration.test.ts b/packages/ai-native/__test__/browser/contrib/intelligent-completions/multi-line.decoration.test.ts index 3bb600891f..263e8824b4 100644 --- a/packages/ai-native/__test__/browser/contrib/intelligent-completions/multi-line.decoration.test.ts +++ b/packages/ai-native/__test__/browser/contrib/intelligent-completions/multi-line.decoration.test.ts @@ -2,13 +2,12 @@ import { GHOST_TEXT, GHOST_TEXT_DESCRIPTION, MultiLineDecorationModel, -} from '@opensumi/ide-ai-native/lib/browser/contrib/intelligent-completions/multi-line.decoration'; +} from '@opensumi/ide-ai-native/lib/browser/contrib/intelligent-completions/decoration/multi-line.decoration'; +import { IMultiLineDiffChangeResult } from '@opensumi/ide-ai-native/lib/browser/contrib/intelligent-completions/diff-computer'; +import { EnhanceDecorationsCollection } from '@opensumi/ide-ai-native/lib/browser/model/enhanceDecorationsCollection'; import { ICodeEditor, IPosition } from '@opensumi/ide-monaco'; import { monacoApi } from '@opensumi/ide-monaco/lib/browser/monaco-api'; -import { IMultiLineDiffChangeResult } from '../../../../src/browser/contrib/intelligent-completions/diff-computer'; -import { EnhanceDecorationsCollection } from '../../../../src/browser/model/enhanceDecorationsCollection'; - describe('MultiLineDecorationModel', () => { let editor: ICodeEditor; let decorationsCollection: EnhanceDecorationsCollection; diff --git a/packages/ai-native/src/browser/ai-core.contribution.ts b/packages/ai-native/src/browser/ai-core.contribution.ts index ab5e66e0ec..5b85a47c7a 100644 --- a/packages/ai-native/src/browser/ai-core.contribution.ts +++ b/packages/ai-native/src/browser/ai-core.contribution.ts @@ -76,6 +76,7 @@ import { ChatProxyService } from './chat/chat-proxy.service'; import { AIChatView } from './chat/chat.view'; import { CodeActionSingleHandler } from './contrib/code-action/code-action.handler'; import { AIInlineCompletionsProvider } from './contrib/inline-completions/completeProvider'; +import { InlineCompletionsController } from './contrib/inline-completions/inline-completions.controller'; import { AICompletionsService } from './contrib/inline-completions/service/ai-completions.service'; import { IntelligentCompletionsController } from './contrib/intelligent-completions/intelligent-completions.controller'; import { ProblemFixController } from './contrib/problem-fix/problem-fix.controller'; @@ -255,6 +256,11 @@ export class AINativeBrowserContribution new SyncDescriptor(IntelligentCompletionsController, [this.injector]), EditorContributionInstantiation.AfterFirstRender, ); + register( + InlineCompletionsController.ID, + new SyncDescriptor(InlineCompletionsController, [this.injector]), + EditorContributionInstantiation.AfterFirstRender, + ); } if (supportsProblemFix) { register( diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.source.ts b/packages/ai-native/src/browser/contrib/inline-completions/inline-completions.controller.ts similarity index 66% rename from packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.source.ts rename to packages/ai-native/src/browser/contrib/inline-completions/inline-completions.controller.ts index 159b5ba48a..d433e1de77 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.source.ts +++ b/packages/ai-native/src/browser/contrib/inline-completions/inline-completions.controller.ts @@ -1,13 +1,13 @@ import debounce from 'lodash/debounce'; -import { Autowired, INJECTOR_TOKEN, Injectable, Injector, Optional } from '@opensumi/di'; import { AI_INLINE_COMPLETION_VISIBLE } from '@opensumi/ide-core-browser/lib/ai-native/command'; import { CommandService, CommandServiceImpl, - Disposable, + IAICompletionOption, IDisposable, IEventBus, + IntelligentCompletionsRegistryToken, Sequencer, runWhenIdle, } from '@opensumi/ide-core-common'; @@ -18,28 +18,40 @@ import { empty } from '@opensumi/ide-utils/lib/strings'; import { InlineCompletionContextKeys } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys'; import { IAIInlineCompletionsProvider } from '../../../common'; +import { AINativeContextKey } from '../../contextkey/ai-native.contextkey.service'; +import { BaseAIMonacoEditorController } from '../base'; +import { IIntelligentCompletionsResult } from '../intelligent-completions'; +import { IntelligentCompletionsRegistry } from '../intelligent-completions/intelligent-completions.feature.registry'; -import { IIntelligentCompletionsResult } from './intelligent-completions'; +export class InlineCompletionsController extends BaseAIMonacoEditorController { + public static readonly ID = 'editor.contrib.ai.inline.completions'; -@Injectable({ multiple: true }) -export class InlineCompletionsSource extends Disposable { - @Autowired(INJECTOR_TOKEN) - protected readonly injector: Injector; + public static get(editor: ICodeEditor): InlineCompletionsController | null { + return editor.getContribution(InlineCompletionsController.ID); + } + + private get eventBus(): IEventBus { + return this.injector.get(IEventBus); + } - @Autowired(IEventBus) - private eventBus: IEventBus; + private get commandService(): CommandServiceImpl { + return this.injector.get(CommandService); + } - @Autowired(CommandService) - private commandService: CommandServiceImpl; + private get aiInlineCompletionsProvider(): IAIInlineCompletionsProvider { + return this.injector.get(IAIInlineCompletionsProvider); + } - @Autowired(IAIInlineCompletionsProvider) - private readonly aiInlineCompletionsProvider: IAIInlineCompletionsProvider; + private get intelligentCompletionsRegistry(): IntelligentCompletionsRegistry { + return this.injector.get(IntelligentCompletionsRegistryToken); + } + private aiNativeContextKey: AINativeContextKey; private sequencer = new Sequencer(); private preDidShowItems: InlineCompletions | undefined; - constructor(@Optional() private readonly monacoEditor: ICodeEditor) { - super(); + public mount(): IDisposable { + this.aiNativeContextKey = this.injector.get(AINativeContextKey, [this.monacoEditor.contextKeyService]); // 判断用户是否选择了一块区域或者移动光标 取消掉请补全请求 const selectionChange = () => { @@ -62,7 +74,7 @@ export class InlineCompletionsSource extends Disposable { }); const inlineVisibleKey = new Set([InlineCompletionContextKeys.inlineSuggestionVisible.key]); - this.addDispose( + this.featureDisposable.addDispose( this.monacoEditor.contextKeyService.onDidChangeContext((e) => { // inline completion 真正消失时 if (e.affectsSome(inlineVisibleKey)) { @@ -79,7 +91,7 @@ export class InlineCompletionsSource extends Disposable { }), ); - this.addDispose( + this.featureDisposable.addDispose( this.eventBus.on(EditorSelectionChangeEvent, (e) => { if (e.payload.source === 'mouse') { debouncedSelectionChange(); @@ -90,7 +102,7 @@ export class InlineCompletionsSource extends Disposable { }), ); - this.addDispose( + this.featureDisposable.addDispose( this.monacoEditor.onDidChangeModelContent((e) => { const changes = e.changes; for (const change of changes) { @@ -104,17 +116,15 @@ export class InlineCompletionsSource extends Disposable { }), ); - this.addDispose( + this.featureDisposable.addDispose( this.monacoEditor.onDidBlurEditorText(() => { this.commandService.executeCommand(AI_INLINE_COMPLETION_VISIBLE.id, false); }), ); - } - public fetch(): IDisposable { let prePosition: Position | undefined; - this.addDispose( + this.featureDisposable.addDispose( monacoApi.languages.registerInlineCompletionsProvider('*', { groupId: 'ai-native-intelligent-completions', provideInlineCompletions: async (model, position, context, token) => { @@ -150,6 +160,24 @@ export class InlineCompletionsSource extends Disposable { }), ); - return this; + return this.featureDisposable; + } + + public async fetchProvider(bean: IAICompletionOption): Promise { + const provider = this.intelligentCompletionsRegistry.getInlineCompletionsProvider(); + if (!provider) { + return; + } + + // 如果上一次补全结果还在,则不重复请求 + const isVisible = this.aiNativeContextKey.multiLineEditsIsVisible.get(); + if (isVisible) { + return; + } + + const position = this.monacoEditor.getPosition()!; + const inlineCompletionModel = await provider(this.monacoEditor, position, bean, this.token); + + return inlineCompletionModel; } } diff --git a/packages/ai-native/src/browser/contrib/inline-completions/model/competionModel.ts b/packages/ai-native/src/browser/contrib/inline-completions/model/competionModel.ts index 104f06f6dc..7e5f86210f 100644 --- a/packages/ai-native/src/browser/contrib/inline-completions/model/competionModel.ts +++ b/packages/ai-native/src/browser/contrib/inline-completions/model/competionModel.ts @@ -1,6 +1,6 @@ import * as monaco from '@opensumi/ide-monaco'; -import { IIntelligentCompletionsResult } from '../../intelligent-completions/intelligent-completions'; +import { IIntelligentCompletionsResult } from '../../intelligent-completions'; /** * 缓存的结果 diff --git a/packages/ai-native/src/browser/contrib/inline-completions/model/inlineCompletionRequestTask.ts b/packages/ai-native/src/browser/contrib/inline-completions/model/inlineCompletionRequestTask.ts index 56fdaf6d2d..674ceb9656 100644 --- a/packages/ai-native/src/browser/contrib/inline-completions/model/inlineCompletionRequestTask.ts +++ b/packages/ai-native/src/browser/contrib/inline-completions/model/inlineCompletionRequestTask.ts @@ -16,9 +16,9 @@ import { WorkbenchEditorService } from '@opensumi/ide-editor'; import { WorkbenchEditorServiceImpl } from '@opensumi/ide-editor/lib/browser/workbench-editor.service'; import * as monaco from '@opensumi/ide-monaco'; -import { IIntelligentCompletionsResult } from '../../intelligent-completions/intelligent-completions'; -import { IntelligentCompletionsController } from '../../intelligent-completions/intelligent-completions.controller'; +import { IIntelligentCompletionsResult } from '../../intelligent-completions'; import { IntelligentCompletionsRegistry } from '../../intelligent-completions/intelligent-completions.feature.registry'; +import { InlineCompletionsController } from '../inline-completions.controller'; import { InlineCompletionItem } from '../model/competionModel'; import { PromptCache } from '../promptCache'; import { lineBasedPromptProcessor } from '../provider'; @@ -174,14 +174,14 @@ export class InlineCompletionRequestTask extends Disposable { } else { try { this.aiCompletionsService.updateStatusBarItem('running', true); - const provider = this.intelligentCompletionsRegistry.getProvider(); + const provider = this.intelligentCompletionsRegistry.getInlineCompletionsProvider(); if (provider) { const editor = this.workbenchEditorService.currentCodeEditor; if (!editor) { return []; } - const intelligentCompletionsHandler = IntelligentCompletionsController.get(editor.monacoEditor); - completeResult = await intelligentCompletionsHandler?.fetchProvider(requestBean); + const inlineCompletionsHandler = InlineCompletionsController.get(editor.monacoEditor); + completeResult = await inlineCompletionsHandler?.fetchProvider(requestBean); } else { completeResult = await this.aiCompletionsService.complete(requestBean); } diff --git a/packages/ai-native/src/browser/contrib/inline-completions/promptCache.ts b/packages/ai-native/src/browser/contrib/inline-completions/promptCache.ts index 04363842c8..20e0c7027f 100644 --- a/packages/ai-native/src/browser/contrib/inline-completions/promptCache.ts +++ b/packages/ai-native/src/browser/contrib/inline-completions/promptCache.ts @@ -9,7 +9,7 @@ import { } from '@opensumi/ide-core-browser'; import { IHashCalculateService } from '@opensumi/ide-core-common/lib/hash-calculate/hash-calculate'; -import { IIntelligentCompletionsResult } from '../intelligent-completions/intelligent-completions'; +import { IIntelligentCompletionsResult } from '../intelligent-completions'; /** * 缓存服务 diff --git a/packages/ai-native/src/browser/contrib/inline-completions/service/ai-completions.service.ts b/packages/ai-native/src/browser/contrib/inline-completions/service/ai-completions.service.ts index 6e25625d0b..2906a8f3ac 100644 --- a/packages/ai-native/src/browser/contrib/inline-completions/service/ai-completions.service.ts +++ b/packages/ai-native/src/browser/contrib/inline-completions/service/ai-completions.service.ts @@ -15,7 +15,7 @@ import { } from '@opensumi/ide-core-common'; import { CompletionRT, IAIReporter } from '@opensumi/ide-core-common/lib/types/ai-native/reporter'; -import { IIntelligentCompletionsResult } from '../../intelligent-completions/intelligent-completions'; +import { IIntelligentCompletionsResult } from '../../intelligent-completions'; @Injectable() export class AICompletionsService extends Disposable { diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/additions-deletions.decoration.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.ts similarity index 90% rename from packages/ai-native/src/browser/contrib/intelligent-completions/additions-deletions.decoration.ts rename to packages/ai-native/src/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.ts index a1e2902762..6eb08fc848 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/additions-deletions.decoration.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.ts @@ -1,10 +1,9 @@ import { ICodeEditor, IModelDeltaDecoration, IRange, TrackedRangeStickiness } from '@opensumi/ide-monaco'; -import { EnhanceDecorationsCollection } from '../../model/enhanceDecorationsCollection'; -import { REWRITE_DECORATION_INLINE_ADD } from '../../widget/rewrite/rewrite-widget'; - -import { IMultiLineDiffChangeResult } from './diff-computer'; -import styles from './intelligent-completions.module.less'; +import { EnhanceDecorationsCollection } from '../../../model/enhanceDecorationsCollection'; +import { REWRITE_DECORATION_INLINE_ADD } from '../../../widget/rewrite/rewrite-widget'; +import { IMultiLineDiffChangeResult } from '../diff-computer'; +import styles from '../intelligent-completions.module.less'; export class AdditionsDeletionsDecorationModel { private deletionsDecorations: EnhanceDecorationsCollection; diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/multi-line.decoration.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/decoration/multi-line.decoration.ts similarity index 98% rename from packages/ai-native/src/browser/contrib/intelligent-completions/multi-line.decoration.ts rename to packages/ai-native/src/browser/contrib/intelligent-completions/decoration/multi-line.decoration.ts index e22554d393..82e881fec7 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/multi-line.decoration.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/decoration/multi-line.decoration.ts @@ -4,9 +4,8 @@ import { empty } from '@opensumi/ide-utils/lib/strings'; import { EditOperation } from '@opensumi/monaco-editor-core/esm/vs/editor/common/core/editOperation'; import { LineDecoration } from '@opensumi/monaco-editor-core/esm/vs/editor/common/viewLayout/lineDecorations'; -import { EnhanceDecorationsCollection } from '../../model/enhanceDecorationsCollection'; - -import { IMultiLineDiffChangeResult } from './diff-computer'; +import { EnhanceDecorationsCollection } from '../../../model/enhanceDecorationsCollection'; +import { IMultiLineDiffChangeResult } from '../diff-computer'; export interface IModificationsInline { newValue: string; diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts new file mode 100644 index 0000000000..cdd5de1e21 --- /dev/null +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts @@ -0,0 +1,34 @@ +import { IRange, InlineCompletion } from '@opensumi/ide-monaco'; + +import type { ILinterErrorData } from './lint-error.source'; + +export interface IIntelligentCompletionsResult { + readonly items: InlineCompletion[]; + /** + * 定义的额外信息 + */ + extra?: T; +} + +export enum ECodeEditsSource { + LinterErrors = 'lint_errors', +} + +export interface ICodeEditsContextBean { + typing: ECodeEditsSource.LinterErrors; + data: ILinterErrorData; +} + +export interface ICodeEdit { + /** + * 插入的文本 + */ + readonly insertText: string; + /** + * 替换的文本范围 + */ + readonly range: IRange; +} +export interface ICodeEditsResult { + readonly items: ICodeEdit[]; +} diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts index 70cf57991f..05c9691075 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts @@ -1,14 +1,6 @@ import { Key, KeybindingRegistry, KeybindingScope, PreferenceService } from '@opensumi/ide-core-browser'; import { MultiLineEditsIsVisible } from '@opensumi/ide-core-browser/lib/contextkey/ai-native'; -import { - AINativeSettingSectionsId, - Disposable, - Event, - IAICompletionOption, - IDisposable, - IntelligentCompletionsRegistryToken, - runWhenIdle, -} from '@opensumi/ide-core-common'; +import { AINativeSettingSectionsId, Disposable, Event, IDisposable, runWhenIdle } from '@opensumi/ide-core-common'; import { ICodeEditor, ICursorPositionChangedEvent, IRange, ITextModel, Range } from '@opensumi/ide-monaco'; import { empty } from '@opensumi/ide-utils/lib/strings'; import { autorun, transaction } from '@opensumi/monaco-editor-core/esm/vs/base/common/observable'; @@ -28,17 +20,17 @@ import { AINativeContextKey } from '../../contextkey/ai-native.contextkey.servic import { REWRITE_DECORATION_INLINE_ADD, RewriteWidget } from '../../widget/rewrite/rewrite-widget'; import { BaseAIMonacoEditorController } from '../base'; -import { AdditionsDeletionsDecorationModel } from './additions-deletions.decoration'; +import { AdditionsDeletionsDecorationModel } from './decoration/additions-deletions.decoration'; +import { MultiLineDecorationModel } from './decoration/multi-line.decoration'; import { IMultiLineDiffChangeResult, computeMultiLineDiffChanges, mergeMultiLineDiffChanges, wordChangesToLineChangesMap, } from './diff-computer'; -import { IIntelligentCompletionsResult } from './intelligent-completions'; -import { IntelligentCompletionsRegistry } from './intelligent-completions.feature.registry'; -import { InlineCompletionsSource } from './intelligent-completions.source'; -import { MultiLineDecorationModel } from './multi-line.decoration'; +import { LintErrorCodeEditsSource } from './lint-error.source'; + +import { ICodeEditsResult } from '.'; export class IntelligentCompletionsController extends BaseAIMonacoEditorController { public static readonly ID = 'editor.contrib.ai.intelligent.completions'; @@ -47,10 +39,6 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll return editor.getContribution(IntelligentCompletionsController.ID); } - private get intelligentCompletionsRegistry(): IntelligentCompletionsRegistry { - return this.injector.get(IntelligentCompletionsRegistryToken); - } - private get model(): ITextModel { return this.monacoEditor.getModel()!; } @@ -183,45 +171,30 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll } } - public async fetchProvider(bean: IAICompletionOption): Promise { - const provider = this.intelligentCompletionsRegistry.getProvider(); - if (!provider) { - return; - } - + public async fetchProvider(editsResult: ICodeEditsResult): Promise { // 如果上一次补全结果还在,则不重复请求 const isVisible = this.aiNativeContextKey.multiLineEditsIsVisible.get(); if (isVisible) { return; } - const position = this.monacoEditor.getPosition()!; - const intelligentCompletionModel = await provider(this.monacoEditor, position, bean, this.token); - - if ( - intelligentCompletionModel && - intelligentCompletionModel.enableMultiLine && - intelligentCompletionModel.items.length > 0 - ) { - return this.applyInlineDecorations(intelligentCompletionModel); + if (editsResult && editsResult.items.length > 0) { + this.applyInlineDecorations(editsResult); } - - return intelligentCompletionModel; } - private applyInlineDecorations(completionModel: IIntelligentCompletionsResult) { + private applyInlineDecorations(completionModel: ICodeEditsResult) { const { items } = completionModel; - - const position = this.monacoEditor.getPosition()!; - const model = this.monacoEditor.getModel(); const { range, insertText } = items[0]; - const insertTextString = insertText.toString(); - // 如果只是开启了 enableMultiLine 而没有传递 range ,则不显示 multi line + // code edits 必须提供 range if (!range) { - return completionModel; + return; } + const position = this.monacoEditor.getPosition()!; + const model = this.monacoEditor.getModel(); + const insertTextString = insertText.toString(); const originalContent = model?.getValueInRange(range); const eol = this.model.getEOL(); @@ -404,7 +377,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll }), ); - const inlineCompletionsSource = this.injector.get(InlineCompletionsSource, [this.monacoEditor]); - this.featureDisposable.addDispose(inlineCompletionsSource.fetch()); + const lintErrorCodeEditsSource = this.injector.get(LintErrorCodeEditsSource, [this.monacoEditor, this.token]); + this.featureDisposable.addDispose(lintErrorCodeEditsSource.mount()); } } diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.ts index 1d3f123732..a2b60e469a 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.ts @@ -1,17 +1,30 @@ import { Injectable } from '@opensumi/di'; import { Disposable } from '@opensumi/ide-core-common'; -import { IIntelligentCompletionProvider, IIntelligentCompletionsRegistry } from '../../types'; +import { ICodeEditsProvider, IIntelligentCompletionProvider, IIntelligentCompletionsRegistry } from '../../types'; @Injectable() export class IntelligentCompletionsRegistry extends Disposable implements IIntelligentCompletionsRegistry { - private provider: IIntelligentCompletionProvider | undefined; + private inlineCompletionsProvider: IIntelligentCompletionProvider | undefined; + private codeEditsProvider: ICodeEditsProvider | undefined; registerIntelligentCompletionProvider(provider: IIntelligentCompletionProvider): void { - this.provider = provider; + this.inlineCompletionsProvider = provider; } - getProvider(): IIntelligentCompletionProvider | undefined { - return this.provider; + registerInlineCompletionsProvider(provider: IIntelligentCompletionProvider): void { + this.inlineCompletionsProvider = provider; + } + + registerCodeEditsProvider(provider: ICodeEditsProvider): void { + this.codeEditsProvider = provider; + } + + getInlineCompletionsProvider(): IIntelligentCompletionProvider | undefined { + return this.inlineCompletionsProvider; + } + + getCodeEditsProvider(): ICodeEditsProvider | undefined { + return this.codeEditsProvider; } } diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.ts deleted file mode 100644 index 594c3df4a6..0000000000 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { InlineCompletion } from '@opensumi/ide-monaco'; - -export interface IIntelligentCompletionsResult { - readonly items: InlineCompletion[]; - /** - * 是否开启多行补全 - * 开启后,items 中的 range 必填 - * 否则显示默认的 inline completion - */ - readonly enableMultiLine?: boolean | undefined; - /** - * 定义的额外信息 - */ - extra?: T; -} diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/lint-error.source.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/lint-error.source.ts new file mode 100644 index 0000000000..3cdbf88121 --- /dev/null +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/lint-error.source.ts @@ -0,0 +1,130 @@ +import { Autowired, Injectable, Optional } from '@opensumi/di'; +import { + CancellationToken, + Disposable, + IDisposable, + IntelligentCompletionsRegistryToken, +} from '@opensumi/ide-core-common'; +import { ICodeEditor, ICursorPositionChangedEvent, IPosition, Position } from '@opensumi/ide-monaco'; +import { URI } from '@opensumi/ide-monaco/lib/browser/monaco-api'; +import { IWorkspaceService } from '@opensumi/ide-workspace'; +import { StandaloneServices } from '@opensumi/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; +import { + IMarker, + IMarkerService, + IRelatedInformation, + MarkerSeverity, +} from '@opensumi/monaco-editor-core/esm/vs/platform/markers/common/markers'; + +import { IntelligentCompletionsController } from './intelligent-completions.controller'; +import { IntelligentCompletionsRegistry } from './intelligent-completions.feature.registry'; + +import { ECodeEditsSource } from '.'; + +export interface ILinterErrorData { + relativeWorkspacePath: string; + errors: Array; +} + +export interface IMarkerErrorData { + message: string; + range: { + startPosition: IPosition; + endPosition: IPosition; + }; + source: URI; + severity: string; + relatedInformation?: IRelatedInformation[]; +} + +namespace MarkerErrorData { + export function toData(marker: IMarker): IMarkerErrorData { + return { + message: marker.message, + range: { + startPosition: { + lineNumber: marker.startLineNumber, + column: marker.startColumn, + }, + endPosition: { + lineNumber: marker.endLineNumber, + column: marker.endColumn, + }, + }, + source: marker.resource, + relatedInformation: marker.relatedInformation, + severity: MarkerSeverity.toString(marker.severity), + }; + } +} + +@Injectable({ multiple: true }) +export class LintErrorCodeEditsSource extends Disposable { + @Autowired(IntelligentCompletionsRegistryToken) + private readonly intelligentCompletionsRegistry: IntelligentCompletionsRegistry; + + @Autowired(IWorkspaceService) + private readonly workspaceService: IWorkspaceService; + + private get model() { + return this.monacoEditor.getModel(); + } + + constructor( + @Optional() private readonly monacoEditor: ICodeEditor, + @Optional() private readonly token: CancellationToken, + ) { + super(); + } + + public mount(): IDisposable { + let prePosition = this.monacoEditor.getPosition(); + + this.addDispose( + // 仅在光标的行号发生变化时,才触发 + this.monacoEditor.onDidChangeCursorPosition((event: ICursorPositionChangedEvent) => { + const currentPosition = event.position; + if (prePosition && prePosition.lineNumber !== currentPosition.lineNumber) { + this.doTrigger(currentPosition); + } + prePosition = currentPosition; + }), + ); + return this; + } + + private async doTrigger(position: Position) { + if (!this.model) { + return; + } + + const markerService = StandaloneServices.get(IMarkerService); + const resource = this.model.uri; + + let markers = markerService.read({ resource, severities: MarkerSeverity.Error }); + markers = markers.filter((marker) => Math.abs(marker.startLineNumber - position.lineNumber) <= 1); + + if (markers.length) { + const provider = this.intelligentCompletionsRegistry.getCodeEditsProvider(); + if (provider) { + const relativeWorkspacePath = await this.workspaceService.asRelativePath(resource.path); + const result = await provider( + this.monacoEditor, + position, + { + typing: ECodeEditsSource.LinterErrors, + data: { + relativeWorkspacePath: relativeWorkspacePath?.path ?? resource.path, + errors: markers.map((marker) => MarkerErrorData.toData(marker)), + }, + }, + this.token, + ); + + if (result) { + IntelligentCompletionsController.get(this.monacoEditor)?.fetchProvider(result); + } + } + } + } +} diff --git a/packages/ai-native/src/browser/types.ts b/packages/ai-native/src/browser/types.ts index f4387f7977..8bad328488 100644 --- a/packages/ai-native/src/browser/types.ts +++ b/packages/ai-native/src/browser/types.ts @@ -19,7 +19,11 @@ import { IMarker } from '@opensumi/monaco-editor-core/esm/vs/platform/markers/co import { IChatWelcomeMessageContent, ISampleQuestions, ITerminalCommandSuggestionDesc } from '../common'; -import { IIntelligentCompletionsResult } from './contrib/intelligent-completions/intelligent-completions'; +import { + ICodeEditsContextBean, + ICodeEditsResult, + IIntelligentCompletionsResult, +} from './contrib/intelligent-completions'; import { BaseTerminalDetectionLineMatcher } from './contrib/terminal/matcher'; import { InlineChatController } from './widget/inline-chat/inline-chat-controller'; @@ -81,11 +85,11 @@ export interface IInlineChatFeatureRegistry { */ registerTerminalInlineChat(operational: AIActionItem, handler: ITerminalInlineChatHandler): IDisposable; /** - * 注销 terminal 内联功能 + * 注册 terminal 内联功能 */ unregisterTerminalInlineChat(operational: AIActionItem): void; /** - * proposed api,可能随时都会有变化 + * 注册 interactive input 功能 */ registerInteractiveInput( strategyOptions: IInteractiveInputRunStrategy, @@ -212,8 +216,24 @@ export type IIntelligentCompletionProvider = ( contextBean: IAICompletionOption, token: CancellationToken, ) => MaybePromise; + +export type ICodeEditsProvider = ( + editor: ICodeEditor, + position: IPosition, + contextBean: ICodeEditsContextBean, + token: CancellationToken, +) => MaybePromise; + export interface IIntelligentCompletionsRegistry { + /** + * @deprecated use registerInlineCompletionProvider API + */ registerIntelligentCompletionProvider(provider: IIntelligentCompletionProvider): void; + registerInlineCompletionsProvider(provider: IIntelligentCompletionProvider): void; + /** + * 注册 code edits 功能 + */ + registerCodeEditsProvider(provider: ICodeEditsProvider): void; } export interface IProblemFixContext { @@ -267,6 +287,7 @@ export interface AINativeCoreContribution { registerTerminalProvider?(registry: ITerminalProviderRegistry): void; /** * 注册智能代码补全相关功能 + * proposed api */ registerIntelligentCompletionFeature?(registry: IIntelligentCompletionsRegistry): void; } diff --git a/packages/startup/entry/sample-modules/ai-native/ai-native.contribution.ts b/packages/startup/entry/sample-modules/ai-native/ai-native.contribution.ts index bff19a10ab..f2ee368fb2 100644 --- a/packages/startup/entry/sample-modules/ai-native/ai-native.contribution.ts +++ b/packages/startup/entry/sample-modules/ai-native/ai-native.contribution.ts @@ -40,7 +40,7 @@ import { ReplyResponse, getDebugLogger, } from '@opensumi/ide-core-common'; -import { ICodeEditor, NewSymbolName, NewSymbolNameTag } from '@opensumi/ide-monaco'; +import { ICodeEditor, NewSymbolName, NewSymbolNameTag, Range } from '@opensumi/ide-monaco'; import { MarkdownString } from '@opensumi/monaco-editor-core/esm/vs/base/common/htmlContent'; import { SlashCommand } from './SlashCommand'; @@ -425,82 +425,32 @@ export class AINativeContribution implements AINativeCoreContribution { } registerIntelligentCompletionFeature(registry: IIntelligentCompletionsRegistry): void { - registry.registerIntelligentCompletionProvider(async (editor, position, bean, token) => { - const model = editor.getModel()!; - const value = model.getValueInRange({ - startLineNumber: position.lineNumber, - startColumn: 1, - endLineNumber: position.lineNumber + 3, - endColumn: model?.getLineMaxColumn(position.lineNumber + 3), - }); - - const cancelController = new AbortController(); - const { signal } = cancelController; - - token.onCancellationRequested(() => { - cancelController.abort(); - }); - - /** - * mock randown - */ - const getRandomString = (length) => { - const characters = 'opensumi'; - let result = ''; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * characters.length)); - } - return result; - }; - - const insertRandomStrings = (originalString) => { - const minChanges = 2; - const maxChanges = 5; - const changesCount = Math.floor(Math.random() * (maxChanges - minChanges + 1)) + minChanges; - let modifiedString = originalString; - for (let i = 0; i < changesCount; i++) { - const randomIndex = Math.floor(Math.random() * originalString.length); - const operation = Math.random() < 0.5 ? 'delete' : 'insert'; - if (operation === 'delete') { - modifiedString = modifiedString.slice(0, randomIndex) + modifiedString.slice(randomIndex + 1); - } else { - const randomChar = getRandomString(1); - modifiedString = modifiedString.slice(0, randomIndex) + randomChar + modifiedString.slice(randomIndex); - } - } - return modifiedString; - }; - - try { - await new Promise((resolve, reject) => { - const timeout = setTimeout(resolve, 1000); - - signal.addEventListener('abort', () => { - clearTimeout(timeout); - reject(new DOMException('Aborted', 'AbortError')); - }); - }); - - return { - items: [ - { - insertText: insertRandomStrings(value), - range: { - startLineNumber: position.lineNumber, - startColumn: 1, - endLineNumber: position.lineNumber + 3, - endColumn: model?.getLineMaxColumn(position.lineNumber + 3), + registry.registerInlineCompletionsProvider(async (editor, position, bean, token) => ({ + items: [{ insertText: 'Hello OpenSumi' }], + })); + + registry.registerCodeEditsProvider(async (editor, position, bean, token) => { + const model = editor.getModel(); + const maxLine = Math.max(position.lineNumber + 3, model?.getLineCount() ?? 0); + const lineMaxColumn = model?.getLineMaxColumn(maxLine); + + return { + items: [ + { + insertText: 'Hello OpenSumi', + range: Range.fromPositions( + { + lineNumber: position.lineNumber, + column: 1, }, - }, - ], - enableMultiLine: true, - }; - } catch (error) { - if (error.name === 'AbortError') { - return { items: [] }; - } - throw error; - } + { + lineNumber: position.lineNumber + 3, + column: lineMaxColumn ?? 1, + }, + ), + }, + ], + }; }); } } From 9fbc930f9dacddda504c5438cd83d9a46189a5d0 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 22 Oct 2024 10:48:22 +0800 Subject: [PATCH 37/42] fix: diff editor model not exist error (#4109) --- .../src/react-providers/config-provider.tsx | 4 -- .../src/browser/editor-collection.service.ts | 40 ++++++------------- .../src/browser/workbench-editor.service.ts | 1 - packages/editor/src/common/editor.ts | 24 ++++++++++- 4 files changed, 34 insertions(+), 35 deletions(-) diff --git a/packages/core-browser/src/react-providers/config-provider.tsx b/packages/core-browser/src/react-providers/config-provider.tsx index 819aaab3e0..28ed6fa14b 100644 --- a/packages/core-browser/src/react-providers/config-provider.tsx +++ b/packages/core-browser/src/react-providers/config-provider.tsx @@ -303,10 +303,6 @@ export interface AppConfig { * This is useful when your scenario is one-time use, and you can control the opening of the editor tab yourself. */ disableRestoreEditorGroupState?: boolean; - /** - * 启用 Diff 编辑器状态恢复逻辑 - */ - enableRestoreDiffEditorState?: boolean; } export interface ICollaborationClientOpts { diff --git a/packages/editor/src/browser/editor-collection.service.ts b/packages/editor/src/browser/editor-collection.service.ts index 2370d7e09d..213c1f95d3 100644 --- a/packages/editor/src/browser/editor-collection.service.ts +++ b/packages/editor/src/browser/editor-collection.service.ts @@ -9,7 +9,6 @@ import { Emitter as EventEmitter, ILineChange, ISelection, - LRUCache, OnEvent, URI, WithEventBus, @@ -32,7 +31,7 @@ import { IUndoStopOptions, ResourceDecorationNeedChangeEvent, } from '../common'; -import { IEditorDocumentModel, IEditorDocumentModelRef } from '../common/editor'; +import { IEditorDocumentModel, IEditorDocumentModelRef, isTextEditorViewState } from '../common/editor'; import { MonacoEditorDecorationApplier } from './decoration-applier'; import { EditorDocumentModelContentChangedEvent, IEditorDocumentModelService } from './doc-model/types'; @@ -514,7 +513,7 @@ export class BrowserCodeEditor extends BaseMonacoEditorWrapper implements ICodeE protected restoreState() { if (this.currentUri) { const state = this.editorState.get(this.currentUri.toString()); - if (state) { + if (isTextEditorViewState(state)) { this.monacoEditor.restoreViewState(state); } } @@ -608,8 +607,6 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { public onRefOpen = this._onRefOpen.event; - private diffEditorModelCache = new LRUCache(100); - protected saveCurrentState() { if (this.currentUri) { const state = this.monacoDiffEditor.saveViewState(); @@ -619,10 +616,13 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { } } - protected restoreState() { + protected restoreState(options: IResourceOpenOptions) { if (this.currentUri) { const state = this.editorState.get(this.currentUri.toString()); - if (state) { + if (isTextEditorViewState(state)) { + if (options.range || options.originalRange) { + state.modified!.cursorState = []; // 避免重复的选中态 + } this.monacoDiffEditor.restoreViewState(state); } } @@ -641,13 +641,6 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { ); } - disposeModel(originalUri: string, modifiedUri: string) { - if (this.diffEditorModelCache.size > 0) { - const key = `${originalUri}-${modifiedUri}`; - this.diffEditorModelCache.delete(key); - } - } - async compare( originalDocModelRef: IEditorDocumentModelRef, modifiedDocModelRef: IEditorDocumentModelRef, @@ -662,17 +655,7 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { } const original = this.originalDocModel.getMonacoModel(); const modified = this.modifiedDocModel.getMonacoModel(); - const key = `${original.uri.toString()}-${modified.uri.toString()}`; - let model: monaco.editor.IDiffEditorViewModel | undefined; - if (this.appConfig.enableRestoreDiffEditorState) { - model = this.diffEditorModelCache.get(key); - } - - if (!model) { - model = this.monacoDiffEditor.createViewModel({ original, modified }); - this.diffEditorModelCache.set(key, model); - } - + const model = this.monacoDiffEditor.createViewModel({ original, modified }); this.monacoDiffEditor.setModel(model); if (rawUri) { @@ -687,11 +670,14 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { }), }); } + await model?.waitForDiff(); + + // 需要等待 Diff 渲染,否则无法获取当前的 Diff 代码折叠状态 + this.restoreState(options); if (options.range || options.originalRange) { const range = (options.range || options.originalRange) as monaco.IRange; const currentEditor = options.range ? this.modifiedEditor.monacoEditor : this.originalEditor.monacoEditor; - await model?.waitForDiff(); // 必须使用 setTimeout, 因为两边的 editor 出现时机问题,diffEditor 是异步显示和渲染 setTimeout(() => { currentEditor.revealRangeInCenter(range); @@ -706,8 +692,6 @@ export class BrowserDiffEditor extends WithEventBus implements IDiffEditor { currentEditor.revealRangeInCenter(range); }); }); - } else { - this.restoreState(); } this._onRefOpen.fire(originalDocModelRef); this._onRefOpen.fire(modifiedDocModelRef); diff --git a/packages/editor/src/browser/workbench-editor.service.ts b/packages/editor/src/browser/workbench-editor.service.ts index 6e5c950695..8588545ad3 100644 --- a/packages/editor/src/browser/workbench-editor.service.ts +++ b/packages/editor/src/browser/workbench-editor.service.ts @@ -1568,7 +1568,6 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup { const query = uri.getParsedQuery(); this.doDisposeDocRef(new URI(query.original)); this.doDisposeDocRef(new URI(query.modified)); - this.diffEditor?.disposeModel(query.original, query.modified); } else if (uri.scheme === 'mergeEditor') { this.mergeEditor && this.mergeEditor.dispose(); } else { diff --git a/packages/editor/src/common/editor.ts b/packages/editor/src/common/editor.ts index fe23f2c604..39a7fc358d 100644 --- a/packages/editor/src/common/editor.ts +++ b/packages/editor/src/common/editor.ts @@ -22,6 +22,8 @@ import { IDocModelUpdateOptions } from './types'; import type { EOL, + ICodeEditorViewState, + IDiffEditorViewState, IEditorOptions, ICodeEditor as IMonacoCodeEditor, ITextModel, @@ -317,8 +319,6 @@ export interface IDiffEditor extends IDisposable { getLineChanges(): ILineChange[] | null; onRefOpen: Event; - - disposeModel(originalUri: string, modifiedUri: string): void; } @Injectable() @@ -989,3 +989,23 @@ export function getSimpleEditorOptions(): IEditorOptions { * in case the column does not exist yet. */ export type EditorGroupColumn = number; + +export function isTextEditorViewState(candidate: unknown): candidate is ICodeEditorViewState | IDiffEditorViewState { + const viewState = candidate as (ICodeEditorViewState | IDiffEditorViewState) | undefined; + if (!viewState) { + return false; + } + + const diffEditorViewState = viewState as IDiffEditorViewState; + if (diffEditorViewState.modified) { + return isTextEditorViewState(diffEditorViewState.modified); + } + + const codeEditorViewState = viewState as ICodeEditorViewState; + + return !!( + codeEditorViewState.contributionsState && + codeEditorViewState.viewState && + Array.isArray(codeEditorViewState.cursorState) + ); +} From f895f0b74f7e9175b1578fde737c8cc0b57abddf Mon Sep 17 00:00:00 2001 From: John Date: Tue, 22 Oct 2024 16:24:57 +0800 Subject: [PATCH 38/42] feat: implement line change code edits api (#4106) * feat: implement line change code edits api * feat: implement line change code edits api * chore: add line change data * fix: improve path --- .../contrib/intelligent-completions/index.ts | 17 +- .../intelligent-completions.controller.ts | 29 +++- .../intelligent-completions/source/base.ts | 151 ++++++++++++++++++ .../source/line-change.source.ts | 54 +++++++ .../{ => source}/lint-error.source.ts | 61 ++----- 5 files changed, 255 insertions(+), 57 deletions(-) create mode 100644 packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts create mode 100644 packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts rename packages/ai-native/src/browser/contrib/intelligent-completions/{ => source}/lint-error.source.ts (57%) diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts index cdd5de1e21..fabd22dd06 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts @@ -1,6 +1,7 @@ import { IRange, InlineCompletion } from '@opensumi/ide-monaco'; -import type { ILinterErrorData } from './lint-error.source'; +import type { ILineChangeData } from './source/line-change.source'; +import type { ILinterErrorData } from './source/lint-error.source'; export interface IIntelligentCompletionsResult { readonly items: InlineCompletion[]; @@ -12,12 +13,18 @@ export interface IIntelligentCompletionsResult { export enum ECodeEditsSource { LinterErrors = 'lint_errors', + LineChange = 'line_change', } -export interface ICodeEditsContextBean { - typing: ECodeEditsSource.LinterErrors; - data: ILinterErrorData; -} +export type ICodeEditsContextBean = + | { + typing: ECodeEditsSource.LinterErrors; + data: ILinterErrorData; + } + | { + typing: ECodeEditsSource.LineChange; + data: ILineChangeData; + }; export interface ICodeEdit { /** diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts index 05c9691075..ae0fdb66cd 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts @@ -28,9 +28,9 @@ import { mergeMultiLineDiffChanges, wordChangesToLineChangesMap, } from './diff-computer'; -import { LintErrorCodeEditsSource } from './lint-error.source'; - -import { ICodeEditsResult } from '.'; +import { CodeEditsResultValue, CodeEditsSourceCollection } from './source/base'; +import { LineChangeCodeEditsSource } from './source/line-change.source'; +import { LintErrorCodeEditsSource } from './source/lint-error.source'; export class IntelligentCompletionsController extends BaseAIMonacoEditorController { public static readonly ID = 'editor.contrib.ai.intelligent.completions'; @@ -171,7 +171,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll } } - public async fetchProvider(editsResult: ICodeEditsResult): Promise { + private async fetchProvider(editsResult: CodeEditsResultValue): Promise { // 如果上一次补全结果还在,则不重复请求 const isVisible = this.aiNativeContextKey.multiLineEditsIsVisible.get(); if (isVisible) { @@ -183,7 +183,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll } } - private applyInlineDecorations(completionModel: ICodeEditsResult) { + private applyInlineDecorations(completionModel: CodeEditsResultValue) { const { items } = completionModel; const { range, insertText } = items[0]; @@ -377,7 +377,22 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll }), ); - const lintErrorCodeEditsSource = this.injector.get(LintErrorCodeEditsSource, [this.monacoEditor, this.token]); - this.featureDisposable.addDispose(lintErrorCodeEditsSource.mount()); + const codeEditsSourceCollection = this.injector.get(CodeEditsSourceCollection, [ + [LintErrorCodeEditsSource, LineChangeCodeEditsSource], + this.monacoEditor, + ]); + + codeEditsSourceCollection.mount(); + + this.featureDisposable.addDispose( + autorun((reader) => { + const source = codeEditsSourceCollection.codeEditsResult.read(reader); + if (source) { + this.fetchProvider(source); + } + }), + ); + + this.featureDisposable.addDispose(codeEditsSourceCollection); } } diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts new file mode 100644 index 0000000000..59cf6c8f29 --- /dev/null +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts @@ -0,0 +1,151 @@ +import { Autowired, INJECTOR_TOKEN, Injectable, Injector, Optional } from '@opensumi/di'; +import { + CancellationTokenSource, + Disposable, + IDisposable, + IntelligentCompletionsRegistryToken, + MaybePromise, + uuid, +} from '@opensumi/ide-core-common'; +import { ConstructorOf } from '@opensumi/ide-core-common'; +import { ICodeEditor, IPosition } from '@opensumi/ide-monaco'; +import { DisposableStore } from '@opensumi/monaco-editor-core/esm/vs/base/common/lifecycle'; +import { + autorunDelta, + debouncedObservable, + derived, + disposableObservableValue, + transaction, +} from '@opensumi/monaco-editor-core/esm/vs/base/common/observable'; + +import { ICodeEdit, ICodeEditsContextBean, ICodeEditsResult } from '../index'; +import { IntelligentCompletionsRegistry } from '../intelligent-completions.feature.registry'; + +@Injectable({ multiple: true }) +export abstract class BaseCodeEditsSource extends Disposable { + @Autowired(IntelligentCompletionsRegistryToken) + private readonly intelligentCompletionsRegistry: IntelligentCompletionsRegistry; + + protected abstract doTrigger(...args: any[]): MaybePromise; + + public readonly codeEditsResult = disposableObservableValue(this, undefined); + + public abstract priority: number; + public abstract mount(): IDisposable; + + constructor(@Optional() protected readonly monacoEditor: ICodeEditor) { + super(); + } + + protected cancellationTokenSource = new CancellationTokenSource(); + + protected get model() { + return this.monacoEditor.getModel(); + } + + protected get token() { + return this.cancellationTokenSource.token; + } + + public cancelToken() { + this.cancellationTokenSource.cancel(); + this.cancellationTokenSource = new CancellationTokenSource(); + } + + protected resetCodeEditsResult = derived(this, () => { + transaction((tx) => { + this.codeEditsResult.set(undefined, tx); + }); + }); + + protected async launchProvider(editor: ICodeEditor, position: IPosition, bean: ICodeEditsContextBean): Promise { + const provider = this.intelligentCompletionsRegistry.getCodeEditsProvider(); + if (provider) { + const result = await provider(editor, position, bean, this.token); + + if (result) { + const codeEditsResultValue = new CodeEditsResultValue(result, this); + + transaction((tx) => { + this.codeEditsResult.set(codeEditsResultValue, tx); + }); + } + } + } +} + +export class CodeEditsResultValue extends Disposable { + public readonly uid = uuid(6); + + constructor(private readonly raw: ICodeEditsResult, private readonly source: BaseCodeEditsSource) { + super(); + } + + public get items(): ICodeEdit[] { + return this.raw.items; + } + + public get priority(): number { + return this.source.priority; + } +} + +@Injectable({ multiple: true }) +export class CodeEditsSourceCollection extends Disposable { + @Autowired(INJECTOR_TOKEN) + private readonly injector: Injector; + + public readonly codeEditsResult = disposableObservableValue(this, undefined); + + constructor( + private readonly constructorSources: ConstructorOf[], + private readonly monacoEditor: ICodeEditor, + ) { + super(); + } + + public mount() { + const sources = this.constructorSources.map((source) => this.injector.get(source, [this.monacoEditor])); + + sources.forEach((source) => this.addDispose(source.mount())); + + const store = this.registerDispose(new DisposableStore()); + + // 观察所有 source 的 codeEditsResult + const observerCodeEditsResult = derived((reader) => ({ + codeEditsResults: new Map(sources.map((source) => [source, source.codeEditsResult.read(reader)])), + })); + + this.addDispose( + autorunDelta( + // 这里需要做 debounce 0 处理,将多次连续的事务通知合并为一次 + debouncedObservable(observerCodeEditsResult, 0, store), + ({ lastValue, newValue }) => { + // 只拿最新的订阅值,如果 uid 相同,表示该值没有变化,就不用往下通知了 + const lastSources = sources.filter((source) => { + const newValueResult = newValue?.codeEditsResults.get(source); + const lastValueResult = lastValue?.codeEditsResults?.get(source); + return newValueResult && (!lastValueResult || newValueResult.uid !== lastValueResult.uid); + }); + + let highestPriority = 0; + let currentResult: CodeEditsResultValue | undefined; + + for (const source of lastSources) { + const value = source.codeEditsResult.get(); + + if (value && value.priority > highestPriority) { + highestPriority = value.priority; + currentResult = value; + } + } + + transaction((tx) => { + // 只通知最高优先级的结果 + this.codeEditsResult.set(currentResult, tx); + }); + }, + ), + ); + } +} diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts new file mode 100644 index 0000000000..ed173c53e6 --- /dev/null +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts @@ -0,0 +1,54 @@ +import { Injectable } from '@opensumi/di'; +import { IDisposable } from '@opensumi/ide-core-common'; +import { ICursorPositionChangedEvent, Position } from '@opensumi/ide-monaco'; + +import { ECodeEditsSource } from '../index'; + +import { BaseCodeEditsSource } from './base'; + +export interface ILineChangeData { + currentLineNumber: number; + preLineNumber?: number; +} + +@Injectable({ multiple: true }) +export class LineChangeCodeEditsSource extends BaseCodeEditsSource { + public priority = 2; + + private prePosition = this.monacoEditor.getPosition(); + + public mount(): IDisposable { + this.addDispose( + this.monacoEditor.onDidChangeCursorPosition((event: ICursorPositionChangedEvent) => { + const currentPosition = event.position; + if (this.prePosition && this.prePosition.lineNumber !== currentPosition.lineNumber) { + this.doTrigger(currentPosition); + this.prePosition = currentPosition; + } + }), + ); + return this; + } + + private lastEditTime: number | null = null; + protected doTrigger(position: Position) { + if (!position) { + return; + } + + // 如果在 60 秒内再次编辑代码,则不触发 + const currentTime = Date.now(); + if (this.lastEditTime && currentTime - this.lastEditTime < 60 * 1000) { + return; + } + + this.lastEditTime = currentTime; + this.launchProvider(this.monacoEditor, position, { + typing: ECodeEditsSource.LineChange, + data: { + preLineNumber: this.prePosition?.lineNumber, + currentLineNumber: position.lineNumber, + }, + }); + } +} diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/lint-error.source.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/source/lint-error.source.ts similarity index 57% rename from packages/ai-native/src/browser/contrib/intelligent-completions/lint-error.source.ts rename to packages/ai-native/src/browser/contrib/intelligent-completions/source/lint-error.source.ts index 3cdbf88121..a8dbdbc32e 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/lint-error.source.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/source/lint-error.source.ts @@ -1,11 +1,6 @@ -import { Autowired, Injectable, Optional } from '@opensumi/di'; -import { - CancellationToken, - Disposable, - IDisposable, - IntelligentCompletionsRegistryToken, -} from '@opensumi/ide-core-common'; -import { ICodeEditor, ICursorPositionChangedEvent, IPosition, Position } from '@opensumi/ide-monaco'; +import { Autowired, Injectable } from '@opensumi/di'; +import { IDisposable } from '@opensumi/ide-core-common'; +import { ICursorPositionChangedEvent, IPosition, Position } from '@opensumi/ide-monaco'; import { URI } from '@opensumi/ide-monaco/lib/browser/monaco-api'; import { IWorkspaceService } from '@opensumi/ide-workspace'; import { StandaloneServices } from '@opensumi/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; @@ -16,10 +11,9 @@ import { MarkerSeverity, } from '@opensumi/monaco-editor-core/esm/vs/platform/markers/common/markers'; -import { IntelligentCompletionsController } from './intelligent-completions.controller'; -import { IntelligentCompletionsRegistry } from './intelligent-completions.feature.registry'; +import { ECodeEditsSource } from '../index'; -import { ECodeEditsSource } from '.'; +import { BaseCodeEditsSource } from './base'; export interface ILinterErrorData { relativeWorkspacePath: string; @@ -59,24 +53,12 @@ namespace MarkerErrorData { } @Injectable({ multiple: true }) -export class LintErrorCodeEditsSource extends Disposable { - @Autowired(IntelligentCompletionsRegistryToken) - private readonly intelligentCompletionsRegistry: IntelligentCompletionsRegistry; +export class LintErrorCodeEditsSource extends BaseCodeEditsSource { + public priority = 1; @Autowired(IWorkspaceService) private readonly workspaceService: IWorkspaceService; - private get model() { - return this.monacoEditor.getModel(); - } - - constructor( - @Optional() private readonly monacoEditor: ICodeEditor, - @Optional() private readonly token: CancellationToken, - ) { - super(); - } - public mount(): IDisposable { let prePosition = this.monacoEditor.getPosition(); @@ -93,7 +75,7 @@ export class LintErrorCodeEditsSource extends Disposable { return this; } - private async doTrigger(position: Position) { + protected async doTrigger(position: Position) { if (!this.model) { return; } @@ -105,26 +87,15 @@ export class LintErrorCodeEditsSource extends Disposable { markers = markers.filter((marker) => Math.abs(marker.startLineNumber - position.lineNumber) <= 1); if (markers.length) { - const provider = this.intelligentCompletionsRegistry.getCodeEditsProvider(); - if (provider) { - const relativeWorkspacePath = await this.workspaceService.asRelativePath(resource.path); - const result = await provider( - this.monacoEditor, - position, - { - typing: ECodeEditsSource.LinterErrors, - data: { - relativeWorkspacePath: relativeWorkspacePath?.path ?? resource.path, - errors: markers.map((marker) => MarkerErrorData.toData(marker)), - }, - }, - this.token, - ); + const relativeWorkspacePath = await this.workspaceService.asRelativePath(resource.path); - if (result) { - IntelligentCompletionsController.get(this.monacoEditor)?.fetchProvider(result); - } - } + this.launchProvider(this.monacoEditor, position, { + typing: ECodeEditsSource.LinterErrors, + data: { + relativeWorkspacePath: relativeWorkspacePath?.path ?? resource.path, + errors: markers.map((marker) => MarkerErrorData.toData(marker)), + }, + }); } } } From 3383a0db63679cecea39ff95e89a06fb84e078f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Wed, 23 Oct 2024 09:51:33 +0800 Subject: [PATCH 39/42] feat: add option to render removed widget immediately (#4113) * fix(inline-diff): check for disposed state * feat: add option to render removed widget immediately --- .../widget/inline-diff/inline-diff-previewer.ts | 5 +++++ .../inline-stream-diff/inline-stream-diff.handler.tsx | 1 + .../inline-stream-diff/live-preview.decoration.tsx | 11 +++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts b/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts index db577e7410..8f86b7a19e 100644 --- a/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts +++ b/packages/ai-native/src/browser/widget/inline-diff/inline-diff-previewer.ts @@ -23,6 +23,11 @@ export interface IDiffPreviewerOptions { * 是否隐藏接受部分编辑的 widget,用于只展示 diff 的场景 */ hideAcceptPartialEditWidget?: boolean; + + /** + * 默认情况下,removed widget 会在 `runWhenIdle` 内被添加,如果需要立即添加,可以设置为 true + */ + renderRemovedWidgetImmediately?: boolean; } export interface IInlineDiffPreviewerNode extends IDisposable { diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx index c4e1623d55..61697a4496 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx @@ -106,6 +106,7 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr partialEditWidgetOptions: { hideAcceptPartialEditWidget: options.hideAcceptPartialEditWidget, }, + renderRemovedWidgetImmediately: options.renderRemovedWidgetImmediately, }); } diff --git a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx index 7a44d7dd91..0d471d7844 100644 --- a/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +++ b/packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx @@ -65,6 +65,7 @@ export interface ITotalCodeInfo { export interface IModelOptions { partialEditWidgetOptions?: IPartialEditWidgetOptions; + renderRemovedWidgetImmediately?: boolean; } @Injectable({ multiple: true }) @@ -676,12 +677,18 @@ export class LivePreviewDiffDecorationModel extends Disposable { } public touchRemovedWidget(states: IRemovedWidgetState[]) { - runWhenIdle(() => { + const run = () => { this.clearRemovedWidgets(); states.forEach(({ textLines, position }) => { this.showRemovedWidgetByLineNumber(position.lineNumber, textLines, {}); }); - }); + }; + + if (this.options.renderRemovedWidgetImmediately) { + run(); + } else { + runWhenIdle(run); + } } public touchPendingRange(range: LineRange) { From e6b2804c9cfe61c9be07d2d6bf223005bce1be07 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 23 Oct 2024 15:02:52 +0800 Subject: [PATCH 40/42] chore: improve code edits source trigger (#4114) --- .../contrib/intelligent-completions/index.ts | 21 ++-- .../intelligent-completions.controller.ts | 54 +++++--- .../intelligent-completions/source/base.ts | 115 ++++++++---------- .../source/line-change.source.ts | 2 +- .../source/lint-error.source.ts | 2 +- 5 files changed, 102 insertions(+), 92 deletions(-) diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts index fabd22dd06..36ba5b88fc 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/index.ts @@ -1,3 +1,4 @@ +import { Disposable } from '@opensumi/ide-core-common'; import { IRange, InlineCompletion } from '@opensumi/ide-monaco'; import type { ILineChangeData } from './source/line-change.source'; @@ -17,14 +18,8 @@ export enum ECodeEditsSource { } export type ICodeEditsContextBean = - | { - typing: ECodeEditsSource.LinterErrors; - data: ILinterErrorData; - } - | { - typing: ECodeEditsSource.LineChange; - data: ILineChangeData; - }; + | { typing: ECodeEditsSource.LinterErrors; data: ILinterErrorData } + | { typing: ECodeEditsSource.LineChange; data: ILineChangeData }; export interface ICodeEdit { /** @@ -39,3 +34,13 @@ export interface ICodeEdit { export interface ICodeEditsResult { readonly items: ICodeEdit[]; } + +export class CodeEditsResultValue extends Disposable { + constructor(private readonly raw: ICodeEditsResult) { + super(); + } + + public get items(): ICodeEdit[] { + return this.raw.items; + } +} diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts index ae0fdb66cd..5b2b2faab8 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts @@ -1,6 +1,13 @@ import { Key, KeybindingRegistry, KeybindingScope, PreferenceService } from '@opensumi/ide-core-browser'; import { MultiLineEditsIsVisible } from '@opensumi/ide-core-browser/lib/contextkey/ai-native'; -import { AINativeSettingSectionsId, Disposable, Event, IDisposable, runWhenIdle } from '@opensumi/ide-core-common'; +import { + AINativeSettingSectionsId, + Disposable, + Event, + IDisposable, + IntelligentCompletionsRegistryToken, + runWhenIdle, +} from '@opensumi/ide-core-common'; import { ICodeEditor, ICursorPositionChangedEvent, IRange, ITextModel, Range } from '@opensumi/ide-monaco'; import { empty } from '@opensumi/ide-utils/lib/strings'; import { autorun, transaction } from '@opensumi/monaco-editor-core/esm/vs/base/common/observable'; @@ -28,10 +35,13 @@ import { mergeMultiLineDiffChanges, wordChangesToLineChangesMap, } from './diff-computer'; -import { CodeEditsResultValue, CodeEditsSourceCollection } from './source/base'; +import { IntelligentCompletionsRegistry } from './intelligent-completions.feature.registry'; +import { CodeEditsSourceCollection } from './source/base'; import { LineChangeCodeEditsSource } from './source/line-change.source'; import { LintErrorCodeEditsSource } from './source/lint-error.source'; +import { CodeEditsResultValue } from './index'; + export class IntelligentCompletionsController extends BaseAIMonacoEditorController { public static readonly ID = 'editor.contrib.ai.intelligent.completions'; @@ -51,6 +61,10 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll return this.injector.get(KeybindingRegistry); } + private get intelligentCompletionsRegistry(): IntelligentCompletionsRegistry { + return this.injector.get(IntelligentCompletionsRegistryToken); + } + private multiLineDecorationModel: MultiLineDecorationModel; private additionsDeletionsDecorationModel: AdditionsDeletionsDecorationModel; private aiNativeContextKey: AINativeContextKey; @@ -171,18 +185,6 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll } } - private async fetchProvider(editsResult: CodeEditsResultValue): Promise { - // 如果上一次补全结果还在,则不重复请求 - const isVisible = this.aiNativeContextKey.multiLineEditsIsVisible.get(); - if (isVisible) { - return; - } - - if (editsResult && editsResult.items.length > 0) { - this.applyInlineDecorations(editsResult); - } - } - private applyInlineDecorations(completionModel: CodeEditsResultValue) { const { items } = completionModel; const { range, insertText } = items[0]; @@ -385,10 +387,26 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll codeEditsSourceCollection.mount(); this.featureDisposable.addDispose( - autorun((reader) => { - const source = codeEditsSourceCollection.codeEditsResult.read(reader); - if (source) { - this.fetchProvider(source); + autorun(async (reader) => { + const context = codeEditsSourceCollection.codeEditsContextBean.read(reader); + + // 如果上一次补全结果还在,则不重复请求 + const isVisible = this.aiNativeContextKey.multiLineEditsIsVisible.get(); + if (isVisible) { + return; + } + + const provider = this.intelligentCompletionsRegistry.getCodeEditsProvider(); + if (context && provider) { + const result = await provider( + this.monacoEditor, + this.monacoEditor.getPosition()!, + context.bean, + codeEditsSourceCollection.token, + ); + if (result && result.items.length > 0) { + this.applyInlineDecorations(new CodeEditsResultValue(result)); + } } }), ); diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts index 59cf6c8f29..999455a404 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/source/base.ts @@ -1,14 +1,13 @@ import { Autowired, INJECTOR_TOKEN, Injectable, Injector, Optional } from '@opensumi/di'; import { CancellationTokenSource, + ConstructorOf, Disposable, IDisposable, - IntelligentCompletionsRegistryToken, MaybePromise, uuid, } from '@opensumi/ide-core-common'; -import { ConstructorOf } from '@opensumi/ide-core-common'; -import { ICodeEditor, IPosition } from '@opensumi/ide-monaco'; +import { ICodeEditor } from '@opensumi/ide-monaco'; import { DisposableStore } from '@opensumi/monaco-editor-core/esm/vs/base/common/lifecycle'; import { autorunDelta, @@ -18,17 +17,29 @@ import { transaction, } from '@opensumi/monaco-editor-core/esm/vs/base/common/observable'; -import { ICodeEdit, ICodeEditsContextBean, ICodeEditsResult } from '../index'; -import { IntelligentCompletionsRegistry } from '../intelligent-completions.feature.registry'; +import { ICodeEditsContextBean } from '../index'; + +export class CodeEditsContextBean extends Disposable { + public readonly uid = uuid(6); + + constructor(private readonly raw: ICodeEditsContextBean, private readonly source: BaseCodeEditsSource) { + super(); + } + + public get priority() { + return this.source.priority; + } + + public get bean() { + return this.raw; + } +} @Injectable({ multiple: true }) export abstract class BaseCodeEditsSource extends Disposable { - @Autowired(IntelligentCompletionsRegistryToken) - private readonly intelligentCompletionsRegistry: IntelligentCompletionsRegistry; - protected abstract doTrigger(...args: any[]): MaybePromise; - public readonly codeEditsResult = disposableObservableValue(this, undefined); + public readonly codeEditsContextBean = disposableObservableValue(this, undefined); public abstract priority: number; public abstract mount(): IDisposable; @@ -37,56 +48,21 @@ export abstract class BaseCodeEditsSource extends Disposable { super(); } - protected cancellationTokenSource = new CancellationTokenSource(); - protected get model() { return this.monacoEditor.getModel(); } - protected get token() { - return this.cancellationTokenSource.token; - } - - public cancelToken() { - this.cancellationTokenSource.cancel(); - this.cancellationTokenSource = new CancellationTokenSource(); - } - - protected resetCodeEditsResult = derived(this, () => { + protected resetBean() { transaction((tx) => { - this.codeEditsResult.set(undefined, tx); + this.codeEditsContextBean.set(undefined, tx); }); - }); - - protected async launchProvider(editor: ICodeEditor, position: IPosition, bean: ICodeEditsContextBean): Promise { - const provider = this.intelligentCompletionsRegistry.getCodeEditsProvider(); - if (provider) { - const result = await provider(editor, position, bean, this.token); - - if (result) { - const codeEditsResultValue = new CodeEditsResultValue(result, this); - - transaction((tx) => { - this.codeEditsResult.set(codeEditsResultValue, tx); - }); - } - } } -} -export class CodeEditsResultValue extends Disposable { - public readonly uid = uuid(6); - - constructor(private readonly raw: ICodeEditsResult, private readonly source: BaseCodeEditsSource) { - super(); - } - - public get items(): ICodeEdit[] { - return this.raw.items; - } - - public get priority(): number { - return this.source.priority; + protected setBean(bean: ICodeEditsContextBean) { + transaction((tx) => { + const context = new CodeEditsContextBean(bean, this); + this.codeEditsContextBean.set(context, tx); + }); } } @@ -95,7 +71,18 @@ export class CodeEditsSourceCollection extends Disposable { @Autowired(INJECTOR_TOKEN) private readonly injector: Injector; - public readonly codeEditsResult = disposableObservableValue(this, undefined); + private cancellationTokenSource = new CancellationTokenSource(); + + public readonly codeEditsContextBean = disposableObservableValue(this, undefined); + + public get token() { + return this.cancellationTokenSource.token; + } + + public cancelToken() { + this.cancellationTokenSource.cancel(); + this.cancellationTokenSource = new CancellationTokenSource(); + } constructor( private readonly constructorSources: ConstructorOf[], @@ -111,38 +98,38 @@ export class CodeEditsSourceCollection extends Disposable { const store = this.registerDispose(new DisposableStore()); - // 观察所有 source 的 codeEditsResult - const observerCodeEditsResult = derived((reader) => ({ - codeEditsResults: new Map(sources.map((source) => [source, source.codeEditsResult.read(reader)])), + // 观察所有 source 的 codeEditsContextBean + const observerCodeEditsContextBean = derived((reader) => ({ + codeEditsContextBean: new Map(sources.map((source) => [source, source.codeEditsContextBean.read(reader)])), })); this.addDispose( autorunDelta( // 这里需要做 debounce 0 处理,将多次连续的事务通知合并为一次 - debouncedObservable(observerCodeEditsResult, 0, store), + debouncedObservable(observerCodeEditsContextBean, 0, store), ({ lastValue, newValue }) => { // 只拿最新的订阅值,如果 uid 相同,表示该值没有变化,就不用往下通知了 const lastSources = sources.filter((source) => { - const newValueResult = newValue?.codeEditsResults.get(source); - const lastValueResult = lastValue?.codeEditsResults?.get(source); - return newValueResult && (!lastValueResult || newValueResult.uid !== lastValueResult.uid); + const newBean = newValue?.codeEditsContextBean.get(source); + const lastBean = lastValue?.codeEditsContextBean?.get(source); + return newBean && (!lastBean || newBean.uid !== lastBean.uid); }); let highestPriority = 0; - let currentResult: CodeEditsResultValue | undefined; + let contextBean: CodeEditsContextBean | undefined; for (const source of lastSources) { - const value = source.codeEditsResult.get(); + const value = source.codeEditsContextBean.get(); - if (value && value.priority > highestPriority) { + if (value && value.priority >= highestPriority) { highestPriority = value.priority; - currentResult = value; + contextBean = value; } } transaction((tx) => { // 只通知最高优先级的结果 - this.codeEditsResult.set(currentResult, tx); + this.codeEditsContextBean.set(contextBean, tx); }); }, ), diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts index ed173c53e6..e9b4a798ed 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/source/line-change.source.ts @@ -43,7 +43,7 @@ export class LineChangeCodeEditsSource extends BaseCodeEditsSource { } this.lastEditTime = currentTime; - this.launchProvider(this.monacoEditor, position, { + this.setBean({ typing: ECodeEditsSource.LineChange, data: { preLineNumber: this.prePosition?.lineNumber, diff --git a/packages/ai-native/src/browser/contrib/intelligent-completions/source/lint-error.source.ts b/packages/ai-native/src/browser/contrib/intelligent-completions/source/lint-error.source.ts index a8dbdbc32e..03b7a54126 100644 --- a/packages/ai-native/src/browser/contrib/intelligent-completions/source/lint-error.source.ts +++ b/packages/ai-native/src/browser/contrib/intelligent-completions/source/lint-error.source.ts @@ -89,7 +89,7 @@ export class LintErrorCodeEditsSource extends BaseCodeEditsSource { if (markers.length) { const relativeWorkspacePath = await this.workspaceService.asRelativePath(resource.path); - this.launchProvider(this.monacoEditor, position, { + this.setBean({ typing: ECodeEditsSource.LinterErrors, data: { relativeWorkspacePath: relativeWorkspacePath?.path ?? resource.path, From 2639b6e3b049112e794e938103c8e7c051c67000 Mon Sep 17 00:00:00 2001 From: bk1012 Date: Wed, 23 Oct 2024 15:40:20 +0800 Subject: [PATCH 41/42] feat: support VSCode API: provideDocumentRangesFormattingEdits (#4116) --- .../types/vscode/typings/vscode.language.d.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/types/vscode/typings/vscode.language.d.ts b/packages/types/vscode/typings/vscode.language.d.ts index 983a949b13..5026706679 100644 --- a/packages/types/vscode/typings/vscode.language.d.ts +++ b/packages/types/vscode/typings/vscode.language.d.ts @@ -2375,6 +2375,25 @@ declare module 'vscode' { * signaled by returning `undefined`, `null`, or an empty array. */ provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult; + + /** + * Provide formatting edits for multiple ranges in a document. + * + * This function is optional but allows a formatter to perform faster when formatting only modified ranges or when + * formatting a large number of selections. + * + * The given ranges are hints and providers can decide to format a smaller + * or larger range. Often this is done by adjusting the start and end + * of the range to full syntax nodes. + * + * @param document The document in which the command was invoked. + * @param ranges The ranges which should be formatted. + * @param options Options controlling formatting. + * @param token A cancellation token. + * @returns A set of text edits or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined`, `null`, or an empty array. + */ + provideDocumentRangesFormattingEdits?(document: TextDocument, ranges: Range[], options: FormattingOptions, token: CancellationToken): ProviderResult; } /** From d5d4dae62c2a5f794711cbb2d696cc0b35652db6 Mon Sep 17 00:00:00 2001 From: bk1012 Date: Wed, 23 Oct 2024 15:40:32 +0800 Subject: [PATCH 42/42] feat: support AuthenticationForceNewSessionOptions (#4115) --- .../core-common/src/types/authentication.ts | 7 -- .../vscode/api/main.thread.authentication.ts | 5 +- .../vscode/typings/vscode.authentication.d.ts | 98 ++++++++++++------- 3 files changed, 66 insertions(+), 44 deletions(-) diff --git a/packages/core-common/src/types/authentication.ts b/packages/core-common/src/types/authentication.ts index c7dc8ce50f..dd37a2db64 100644 --- a/packages/core-common/src/types/authentication.ts +++ b/packages/core-common/src/types/authentication.ts @@ -106,10 +106,3 @@ export interface SessionRequest { export interface SessionRequestInfo { [scopes: string]: SessionRequest; } - -export interface AuthenticationGetSessionOptions { - createIfNone: boolean; - clearSessionPreference: boolean; - forceNewSession?: boolean | { detail: string }; - silent?: boolean; -} diff --git a/packages/extension/src/browser/vscode/api/main.thread.authentication.ts b/packages/extension/src/browser/vscode/api/main.thread.authentication.ts index b2b19a7e0c..625b68cfc0 100644 --- a/packages/extension/src/browser/vscode/api/main.thread.authentication.ts +++ b/packages/extension/src/browser/vscode/api/main.thread.authentication.ts @@ -2,7 +2,6 @@ import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di'; import { IRPCProtocol } from '@opensumi/ide-connection'; import { Disposable, ILogger, QuickPickService, formatLocalize, localize } from '@opensumi/ide-core-browser'; import { - AuthenticationGetSessionOptions, AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, @@ -13,6 +12,8 @@ import { IDialogService, IMessageService } from '@opensumi/ide-overlay'; import { ExtHostAPIIdentifier, IExtHostAuthentication, IMainThreadAuthentication } from '../../../common/vscode'; import { IActivationEventService } from '../../types'; +import type vscode from 'vscode'; + @Injectable({ multiple: true }) export class MainThreadAuthenticationProvider extends Disposable implements IAuthenticationProvider { @Autowired(IAuthenticationService) @@ -248,7 +249,7 @@ export class MainThreadAuthentication extends Disposable implements IMainThreadA scopes: string[], extensionId: string, extensionName: string, - options: AuthenticationGetSessionOptions, + options: vscode.AuthenticationGetSessionOptions, ): Promise { const sessions = await this.authenticationService.getSessions(providerId, scopes, true); const supportsMultipleAccounts = this.authenticationService.supportsMultipleAccounts(providerId); diff --git a/packages/types/vscode/typings/vscode.authentication.d.ts b/packages/types/vscode/typings/vscode.authentication.d.ts index 5899b59840..e92b857e2b 100644 --- a/packages/types/vscode/typings/vscode.authentication.d.ts +++ b/packages/types/vscode/typings/vscode.authentication.d.ts @@ -40,6 +40,16 @@ declare module 'vscode' { readonly label: string; } + /** + * Optional options to be used when calling {@link authentication.getSession} with the flag `forceNewSession`. + */ + export interface AuthenticationForceNewSessionOptions { + /** + * An optional message that will be displayed to the user when we ask to re-authenticate. Providing additional context + * as to why you are asking a user to re-authenticate can help increase the odds that they will accept. + */ + detail?: string; + } /** * Options to be used when getting an {@link AuthenticationSession} from an {@link AuthenticationProvider}. @@ -60,14 +70,17 @@ declare module 'vscode' { createIfNone?: boolean; /** - * Whether we should attempt to reauthenticate even if there is already a session available. - * - * If true, a modal dialog will be shown asking the user to sign in again. This is mostly used for scenarios - * where the token needs to be re minted because it has lost some authorization. - * - * Defaults to false. - */ - forceNewSession?: boolean | { detail: string }; + * Whether we should attempt to reauthenticate even if there is already a session available. + * + * If true, a modal dialog will be shown asking the user to sign in again. This is mostly used for scenarios + * where the token needs to be re minted because it has lost some authorization. + * + * If there are no existing sessions and forceNewSession is true, it will behave identically to + * {@link AuthenticationGetSessionOptions.createIfNone createIfNone}. + * + * This defaults to false. + */ + forceNewSession?: boolean | AuthenticationForceNewSessionOptions; /** @@ -202,34 +215,49 @@ declare module 'vscode' { */ export namespace authentication { /** - * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not - * registered, or if the user does not consent to sharing authentication information with - * the extension. If there are multiple sessions with the same scopes, the user will be shown a - * quickpick to select which account they would like to use. - * - * Currently, there are only two authentication providers that are contributed from built in extensions - * to VS Code that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider - * @param options The {@link GetSessionOptions} to use - * @returns A thenable that resolves to an authentication session - */ - export function getSession(providerId: string, scopes: string[], options: AuthenticationGetSessionOptions & { createIfNone: true }): Thenable; + * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not + * registered, or if the user does not consent to sharing authentication information with + * the extension. If there are multiple sessions with the same scopes, the user will be shown a + * quickpick to select which account they would like to use. + * + * Currently, there are only two authentication providers that are contributed from built in extensions + * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. + * @param providerId The id of the provider to use + * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider + * @param options The {@link AuthenticationGetSessionOptions} to use + * @returns A thenable that resolves to an authentication session + */ + export function getSession(providerId: string, scopes: readonly string[], options: AuthenticationGetSessionOptions & { /** */createIfNone: true }): Thenable; - /** - * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not - * registered, or if the user does not consent to sharing authentication information with - * the extension. If there are multiple sessions with the same scopes, the user will be shown a - * quickpick to select which account they would like to use. - * - * Currently, there are only two authentication providers that are contributed from built in extensions - * to VS Code that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider - * @param options The {@link GetSessionOptions} to use - * @returns A thenable that resolves to an authentication session if available, or undefined if there are no sessions - */ - export function getSession(providerId: string, scopes: string[], options?: AuthenticationGetSessionOptions): Thenable; + /** + * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not + * registered, or if the user does not consent to sharing authentication information with + * the extension. If there are multiple sessions with the same scopes, the user will be shown a + * quickpick to select which account they would like to use. + * + * Currently, there are only two authentication providers that are contributed from built in extensions + * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. + * @param providerId The id of the provider to use + * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider + * @param options The {@link AuthenticationGetSessionOptions} to use + * @returns A thenable that resolves to an authentication session + */ + export function getSession(providerId: string, scopes: readonly string[], options: AuthenticationGetSessionOptions & { /** literal-type defines return type */forceNewSession: true | AuthenticationForceNewSessionOptions }): Thenable; + + /** + * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not + * registered, or if the user does not consent to sharing authentication information with + * the extension. If there are multiple sessions with the same scopes, the user will be shown a + * quickpick to select which account they would like to use. + * + * Currently, there are only two authentication providers that are contributed from built in extensions + * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. + * @param providerId The id of the provider to use + * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider + * @param options The {@link AuthenticationGetSessionOptions} to use + * @returns A thenable that resolves to an authentication session if available, or undefined if there are no sessions + */ + export function getSession(providerId: string, scopes: readonly string[], options?: AuthenticationGetSessionOptions): Thenable; /** * An {@link Event} which fires when the authentication sessions of an authentication provider have