@opensumi/ide-extension 3.7.2-next-1739945875.0 → 3.7.2-next-1740016705.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/worker-host.js +223 -52
  2. package/package.json +35 -35
@@ -50894,9 +50894,10 @@ exports["default"] = warningOnce;
50894
50894
  * Where possible, operations execute without creating a new Buffer and copying everything over.
50895
50895
  */
50896
50896
  Object.defineProperty(exports, "__esModule", ({ value: true }));
50897
- exports.Cursor = exports.Buffers = exports.emptyBuffer = void 0;
50897
+ exports.Cursor = exports.Buffers = exports.buffer4Capacity = exports.emptyBuffer = void 0;
50898
50898
  exports.copy = copy;
50899
50899
  exports.emptyBuffer = new Uint8Array(0);
50900
+ exports.buffer4Capacity = new Uint8Array(4);
50900
50901
  function copy(source, target, targetStart, sourceStart, sourceEnd) {
50901
50902
  target.set(source.subarray(sourceStart, sourceEnd), targetStart);
50902
50903
  }
@@ -50946,6 +50947,31 @@ class Buffers {
50946
50947
  }
50947
50948
  return target;
50948
50949
  }
50950
+ slice4(start) {
50951
+ let end = start + 4;
50952
+ const buffers = this.buffers;
50953
+ if (end > this.size) {
50954
+ end = this.size;
50955
+ }
50956
+ if (start >= end) {
50957
+ return exports.emptyBuffer;
50958
+ }
50959
+ let startBytes = 0;
50960
+ let si = 0;
50961
+ for (; si < buffers.length && startBytes + buffers[si].length <= start; si++) {
50962
+ startBytes += buffers[si].length;
50963
+ }
50964
+ const target = exports.buffer4Capacity;
50965
+ let ti = 0;
50966
+ for (let ii = si; ti < end - start && ii < buffers.length; ii++) {
50967
+ const len = buffers[ii].length;
50968
+ const _start = ti === 0 ? start - startBytes : 0;
50969
+ const _end = ti + len >= end - start ? Math.min(_start + (end - start) - ti, len) : len;
50970
+ copy(buffers[ii], target, ti, _start, _end);
50971
+ ti += _end - _start;
50972
+ }
50973
+ return target;
50974
+ }
50949
50975
  pos(i) {
50950
50976
  if (i < 0 || i >= this.size) {
50951
50977
  throw new Error(`out of range, ${i} not in [0, ${this.size})`);
@@ -51117,6 +51143,11 @@ class Cursor {
51117
51143
  this.skip(n);
51118
51144
  return buffers;
51119
51145
  }
51146
+ read4() {
51147
+ const buffers = this.buffers.slice4(this.offset);
51148
+ this.skip(4);
51149
+ return buffers;
51150
+ }
51120
51151
  skip(n) {
51121
51152
  let count = 0;
51122
51153
  while (this.chunkIndex < this.buffers.buffers.length) {
@@ -51419,6 +51450,7 @@ exports.BaseConnection = BaseConnection;
51419
51450
 
51420
51451
  Object.defineProperty(exports, "__esModule", ({ value: true }));
51421
51452
  exports.LengthFieldBasedFrameDecoder = exports.indicator = void 0;
51453
+ /* eslint-disable no-console */
51422
51454
  const writer_1 = __webpack_require__(/*! @furyjs/fury/dist/lib/writer */ "../../node_modules/@furyjs/fury/dist/lib/writer.js");
51423
51455
  const ide_core_common_1 = __webpack_require__(/*! @opensumi/ide-core-common */ "../core-common/lib/index.js");
51424
51456
  const buffers_1 = __webpack_require__(/*! ../../buffers/buffers */ "../connection/lib/common/buffers/buffers.js");
@@ -51426,26 +51458,33 @@ const buffers_1 = __webpack_require__(/*! ../../buffers/buffers */ "../connectio
51426
51458
  * You can use `Buffer.from('\r\n\r\n')` to get this indicator.
51427
51459
  */
51428
51460
  exports.indicator = new Uint8Array([0x0d, 0x0a, 0x0d, 0x0a]);
51461
+ /**
51462
+ * The number of bytes in the length field.
51463
+ *
51464
+ * How many bytes are used to represent data length.
51465
+ *
51466
+ * For example, if the length field is 4 bytes, then the maximum length of the data is 2^32 = 4GB
51467
+ */
51468
+ const lengthFieldLength = 4;
51429
51469
  /**
51430
51470
  * sticky packet unpacking problems are generally problems at the transport layer.
51431
51471
  * we use a length field to represent the length of the data, and then read the data according to the length
51432
51472
  */
51433
51473
  class LengthFieldBasedFrameDecoder {
51434
51474
  constructor() {
51435
- this.dataEmitter = new ide_core_common_1.Emitter();
51436
- this.onData = this.dataEmitter.event;
51437
51475
  this.buffers = new buffers_1.Buffers();
51438
51476
  this.cursor = this.buffers.cursor();
51477
+ this.processingPromise = null;
51439
51478
  this.contentLength = -1;
51440
51479
  this.state = 0;
51441
- /**
51442
- * The number of bytes in the length field.
51443
- *
51444
- * How many bytes are used to represent data length.
51445
- *
51446
- * For example, if the length field is 4 bytes, then the maximum length of the data is 2^32 = 4GB
51447
- */
51448
- this.lengthFieldLength = 4;
51480
+ }
51481
+ onData(listener) {
51482
+ this._onDataListener = listener;
51483
+ return {
51484
+ dispose: () => {
51485
+ this._onDataListener = null;
51486
+ },
51487
+ };
51449
51488
  }
51450
51489
  reset() {
51451
51490
  this.contentLength = -1;
@@ -51454,30 +51493,70 @@ class LengthFieldBasedFrameDecoder {
51454
51493
  }
51455
51494
  push(chunk) {
51456
51495
  this.buffers.push(chunk);
51457
- let done = false;
51458
- while (!done) {
51459
- done = this.readFrame();
51496
+ // 确保同一时间只有一个处理过程
51497
+ if (!this.processingPromise) {
51498
+ this.processingPromise = this.processBuffers().finally(() => {
51499
+ this.processingPromise = null;
51500
+ });
51460
51501
  }
51461
51502
  }
51462
- readFrame() {
51463
- const found = this.readLengthField();
51464
- if (found) {
51503
+ async processBuffers() {
51504
+ let iterations = 0;
51505
+ let hasMoreData = false;
51506
+ do {
51507
+ hasMoreData = false;
51508
+ while (iterations < LengthFieldBasedFrameDecoder.MAX_ITERATIONS) {
51509
+ if (this.buffers.byteLength === 0) {
51510
+ break;
51511
+ }
51512
+ const result = await this.readFrame();
51513
+ if (result === true) {
51514
+ break;
51515
+ }
51516
+ iterations++;
51517
+ if (iterations % 10 === 0) {
51518
+ await new Promise((resolve) => setTimeout(resolve, 0));
51519
+ }
51520
+ }
51521
+ // 检查剩余数据
51522
+ if (this.buffers.byteLength > 0) {
51523
+ hasMoreData = true;
51524
+ // 异步继续处理,避免阻塞
51525
+ await new Promise((resolve) => setImmediate(resolve));
51526
+ iterations = 0; // 重置迭代计数器
51527
+ }
51528
+ } while (hasMoreData);
51529
+ }
51530
+ async readFrame() {
51531
+ try {
51532
+ const found = this.readLengthField();
51533
+ if (!found) {
51534
+ return true;
51535
+ }
51465
51536
  const start = this.cursor.offset;
51466
51537
  const end = start + this.contentLength;
51467
- const binary = this.buffers.slice(start, end);
51468
- this.dataEmitter.fire(binary);
51469
- if (this.buffers.byteLength > end) {
51470
- this.contentLength = -1;
51471
- this.state = 0;
51472
- this.cursor.moveTo(end);
51473
- // has more data, continue to parse
51474
- return false;
51538
+ if (end > this.buffers.byteLength) {
51539
+ return true;
51475
51540
  }
51476
- // delete used buffers
51541
+ const binary = this.buffers.slice(start, end);
51542
+ // 立即清理已处理的数据
51477
51543
  this.buffers.splice(0, end);
51478
51544
  this.reset();
51545
+ if (this._onDataListener) {
51546
+ try {
51547
+ await Promise.resolve().then(() => { var _a; return (_a = this._onDataListener) === null || _a === void 0 ? void 0 : _a.call(this, binary); });
51548
+ }
51549
+ catch (error) {
51550
+ console.error('[Frame Decoder] Error in data listener:', error);
51551
+ }
51552
+ }
51553
+ return false;
51554
+ }
51555
+ catch (error) {
51556
+ console.error('[Frame Decoder] Error processing frame:', error);
51557
+ this.reset();
51558
+ return true;
51479
51559
  }
51480
- return true;
51481
51560
  }
51482
51561
  readLengthField() {
51483
51562
  const bufferLength = this.buffers.byteLength;
@@ -51493,12 +51572,12 @@ class LengthFieldBasedFrameDecoder {
51493
51572
  return false;
51494
51573
  }
51495
51574
  if (this.contentLength === -1) {
51496
- if (this.cursor.offset + this.lengthFieldLength > bufferLength) {
51575
+ if (this.cursor.offset + lengthFieldLength > bufferLength) {
51497
51576
  // Not enough data yet, wait for more data
51498
51577
  return false;
51499
51578
  }
51500
51579
  // read the content length
51501
- const buf = this.cursor.read(this.lengthFieldLength);
51580
+ const buf = this.cursor.read4();
51502
51581
  // fury writer use little endian
51503
51582
  this.contentLength = (0, ide_core_common_1.readUInt32LE)(buf, 0);
51504
51583
  }
@@ -51513,12 +51592,12 @@ class LengthFieldBasedFrameDecoder {
51513
51592
  let result = iter.next();
51514
51593
  while (!result.done) {
51515
51594
  switch (result.value) {
51516
- case 0x0d:
51595
+ case 0x0d: // \r
51517
51596
  switch (this.state) {
51518
51597
  case 0:
51519
51598
  this.state = 1;
51520
51599
  break;
51521
- case 2:
51600
+ case 2: // 第二个 \r
51522
51601
  this.state = 3;
51523
51602
  break;
51524
51603
  default:
@@ -51526,12 +51605,12 @@ class LengthFieldBasedFrameDecoder {
51526
51605
  break;
51527
51606
  }
51528
51607
  break;
51529
- case 0x0a:
51608
+ case 0x0a: // \n
51530
51609
  switch (this.state) {
51531
51610
  case 1:
51532
51611
  this.state = 2;
51533
51612
  break;
51534
- case 3:
51613
+ case 3: // 第二个 \n
51535
51614
  this.state = 4;
51536
51615
  iter.return();
51537
51616
  break;
@@ -51548,19 +51627,27 @@ class LengthFieldBasedFrameDecoder {
51548
51627
  }
51549
51628
  }
51550
51629
  dispose() {
51551
- this.dataEmitter.dispose();
51630
+ this._onDataListener = null;
51552
51631
  this.buffers.dispose();
51632
+ this.reset();
51553
51633
  }
51554
51634
  static construct(content) {
51555
- LengthFieldBasedFrameDecoder.writer.reset();
51556
- LengthFieldBasedFrameDecoder.writer.buffer(exports.indicator);
51557
- LengthFieldBasedFrameDecoder.writer.uint32(content.byteLength);
51558
- LengthFieldBasedFrameDecoder.writer.buffer(content);
51559
- return LengthFieldBasedFrameDecoder.writer.dump();
51635
+ // 每次都创建新的 writer,避免所有权问题
51636
+ const writer = (0, writer_1.BinaryWriter)({});
51637
+ try {
51638
+ writer.buffer(exports.indicator);
51639
+ writer.uint32(content.byteLength);
51640
+ writer.buffer(content);
51641
+ return writer;
51642
+ }
51643
+ catch (error) {
51644
+ console.warn('[Frame Decoder] Error constructing frame:', error);
51645
+ throw error;
51646
+ }
51560
51647
  }
51561
51648
  }
51562
51649
  exports.LengthFieldBasedFrameDecoder = LengthFieldBasedFrameDecoder;
51563
- LengthFieldBasedFrameDecoder.writer = (0, writer_1.BinaryWriter)({});
51650
+ LengthFieldBasedFrameDecoder.MAX_ITERATIONS = 50;
51564
51651
  //# sourceMappingURL=frame-decoder.js.map
51565
51652
 
51566
51653
  /***/ }),
@@ -51739,10 +51826,17 @@ class StreamConnection extends base_1.BaseConnection {
51739
51826
  });
51740
51827
  }
51741
51828
  send(data) {
51742
- const result = frame_decoder_1.LengthFieldBasedFrameDecoder.construct(data);
51743
- this.writable.write(result, () => {
51744
- // TODO: logger error
51745
- });
51829
+ const handle = frame_decoder_1.LengthFieldBasedFrameDecoder.construct(data).dumpAndOwn();
51830
+ try {
51831
+ this.writable.write(handle.get(), (error) => {
51832
+ if (error) {
51833
+ console.error('Failed to write data:', error);
51834
+ }
51835
+ });
51836
+ }
51837
+ finally {
51838
+ handle.dispose();
51839
+ }
51746
51840
  }
51747
51841
  onMessage(cb) {
51748
51842
  return this.decoder.onData(cb);
@@ -51811,22 +51905,84 @@ exports.StreamConnection = StreamConnection;
51811
51905
 
51812
51906
  Object.defineProperty(exports, "__esModule", ({ value: true }));
51813
51907
  exports.WSWebSocketConnection = void 0;
51908
+ const constants_1 = __webpack_require__(/*! ../../constants */ "../connection/lib/common/constants.js");
51814
51909
  const base_1 = __webpack_require__(/*! ./base */ "../connection/lib/common/connection/drivers/base.js");
51910
+ const frame_decoder_1 = __webpack_require__(/*! ./frame-decoder */ "../connection/lib/common/connection/drivers/frame-decoder.js");
51815
51911
  class WSWebSocketConnection extends base_1.BaseConnection {
51816
51912
  constructor(socket) {
51817
51913
  super();
51818
51914
  this.socket = socket;
51915
+ this.decoder = new frame_decoder_1.LengthFieldBasedFrameDecoder();
51916
+ this.sendQueue = [];
51917
+ this.pendingSize = 0;
51918
+ this.sending = false;
51919
+ this.socket.on('message', (data) => {
51920
+ this.decoder.push(data);
51921
+ });
51922
+ }
51923
+ async processSendQueue() {
51924
+ if (this.sending) {
51925
+ return;
51926
+ }
51927
+ this.sending = true;
51928
+ while (this.sendQueue.length > 0) {
51929
+ const { data, resolve, reject } = this.sendQueue[0];
51930
+ let handle = null;
51931
+ try {
51932
+ handle = frame_decoder_1.LengthFieldBasedFrameDecoder.construct(data).dumpAndOwn();
51933
+ const packet = handle.get();
51934
+ for (let i = 0; i < packet.byteLength; i += constants_1.chunkSize) {
51935
+ if (!this.isOpen()) {
51936
+ throw new Error('Connection closed while sending');
51937
+ }
51938
+ await new Promise((resolve, reject) => {
51939
+ const chunk = packet.subarray(i, Math.min(i + constants_1.chunkSize, packet.byteLength));
51940
+ this.socket.send(chunk, { binary: true }, (error) => {
51941
+ if (error) {
51942
+ reject(error);
51943
+ }
51944
+ else {
51945
+ resolve();
51946
+ }
51947
+ });
51948
+ });
51949
+ }
51950
+ resolve();
51951
+ }
51952
+ catch (error) {
51953
+ reject(error instanceof Error ? error : new Error(String(error)));
51954
+ }
51955
+ finally {
51956
+ if (handle) {
51957
+ try {
51958
+ handle.dispose();
51959
+ }
51960
+ catch (error) {
51961
+ console.warn('[WSWebSocket] Error disposing handle:', error);
51962
+ }
51963
+ }
51964
+ this.pendingSize -= this.sendQueue[0].data.byteLength;
51965
+ this.sendQueue.shift();
51966
+ }
51967
+ }
51968
+ this.sending = false;
51819
51969
  }
51820
51970
  send(data) {
51821
- this.socket.send(data);
51971
+ return new Promise((resolve, reject) => {
51972
+ // 检查队列大小限制
51973
+ if (this.sendQueue.length >= WSWebSocketConnection.MAX_QUEUE_SIZE) {
51974
+ reject(new Error('Send queue full'));
51975
+ return;
51976
+ }
51977
+ this.pendingSize += data.byteLength;
51978
+ this.sendQueue.push({ data, resolve, reject });
51979
+ this.processSendQueue().catch((error) => {
51980
+ console.error('[WSWebSocket] Error processing queue:', error);
51981
+ });
51982
+ });
51822
51983
  }
51823
51984
  onMessage(cb) {
51824
- this.socket.on('message', cb);
51825
- return {
51826
- dispose: () => {
51827
- this.socket.off('message', cb);
51828
- },
51829
- };
51985
+ return this.decoder.onData(cb);
51830
51986
  }
51831
51987
  onceClose(cb) {
51832
51988
  this.socket.once('close', cb);
@@ -51841,9 +51997,17 @@ class WSWebSocketConnection extends base_1.BaseConnection {
51841
51997
  }
51842
51998
  dispose() {
51843
51999
  this.socket.removeAllListeners();
52000
+ // 拒绝所有待发送的消息
52001
+ while (this.sendQueue.length > 0) {
52002
+ const { reject } = this.sendQueue.shift();
52003
+ reject(new Error('Connection disposed'));
52004
+ }
52005
+ this.pendingSize = 0;
52006
+ this.sending = false;
51844
52007
  }
51845
52008
  }
51846
52009
  exports.WSWebSocketConnection = WSWebSocketConnection;
52010
+ WSWebSocketConnection.MAX_QUEUE_SIZE = 1000; // 限制队列长度
51847
52011
  //# sourceMappingURL=ws-websocket.js.map
51848
52012
 
51849
52013
  /***/ }),
@@ -51872,8 +52036,12 @@ tslib_1.__exportStar(__webpack_require__(/*! ./drivers */ "../connection/lib/com
51872
52036
  "use strict";
51873
52037
 
51874
52038
  Object.defineProperty(exports, "__esModule", ({ value: true }));
51875
- exports.METHOD_NOT_REGISTERED = void 0;
52039
+ exports.chunkSize = exports.METHOD_NOT_REGISTERED = void 0;
51876
52040
  exports.METHOD_NOT_REGISTERED = '$$METHOD_NOT_REGISTERED';
52041
+ /**
52042
+ * 分片大小, 1MB
52043
+ */
52044
+ exports.chunkSize = 1 * 1024 * 1024;
51877
52045
  //# sourceMappingURL=constants.js.map
51878
52046
 
51879
52047
  /***/ }),
@@ -52130,6 +52298,9 @@ const oneOf = (schemas, context) => {
52130
52298
  case 7:
52131
52299
  v = serializers[7].read();
52132
52300
  break;
52301
+ default: {
52302
+ throw new Error('unknown index: ' + idx);
52303
+ }
52133
52304
  }
52134
52305
  v.kind = kinds[idx];
52135
52306
  return v;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-extension",
3
- "version": "3.7.2-next-1739945875.0",
3
+ "version": "3.7.2-next-1740016705.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "hosted"
@@ -23,18 +23,18 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@opensumi/events": "^1.0.0",
26
- "@opensumi/ide-connection": "3.7.2-next-1739945875.0",
27
- "@opensumi/ide-core-browser": "3.7.2-next-1739945875.0",
28
- "@opensumi/ide-core-node": "3.7.2-next-1739945875.0",
29
- "@opensumi/ide-debug": "3.7.2-next-1739945875.0",
30
- "@opensumi/ide-file-search": "3.7.2-next-1739945875.0",
31
- "@opensumi/ide-file-service": "3.7.2-next-1739945875.0",
32
- "@opensumi/ide-logs": "3.7.2-next-1739945875.0",
33
- "@opensumi/ide-markdown": "3.7.2-next-1739945875.0",
34
- "@opensumi/ide-task": "3.7.2-next-1739945875.0",
35
- "@opensumi/ide-terminal-next": "3.7.2-next-1739945875.0",
36
- "@opensumi/ide-utils": "3.7.2-next-1739945875.0",
37
- "@opensumi/ide-webview": "3.7.2-next-1739945875.0",
26
+ "@opensumi/ide-connection": "3.7.2-next-1740016705.0",
27
+ "@opensumi/ide-core-browser": "3.7.2-next-1740016705.0",
28
+ "@opensumi/ide-core-node": "3.7.2-next-1740016705.0",
29
+ "@opensumi/ide-debug": "3.7.2-next-1740016705.0",
30
+ "@opensumi/ide-file-search": "3.7.2-next-1740016705.0",
31
+ "@opensumi/ide-file-service": "3.7.2-next-1740016705.0",
32
+ "@opensumi/ide-logs": "3.7.2-next-1740016705.0",
33
+ "@opensumi/ide-markdown": "3.7.2-next-1740016705.0",
34
+ "@opensumi/ide-task": "3.7.2-next-1740016705.0",
35
+ "@opensumi/ide-terminal-next": "3.7.2-next-1740016705.0",
36
+ "@opensumi/ide-utils": "3.7.2-next-1740016705.0",
37
+ "@opensumi/ide-webview": "3.7.2-next-1740016705.0",
38
38
  "address": "^1.1.2",
39
39
  "glob-to-regexp": "0.4.1",
40
40
  "is-running": "^2.1.0",
@@ -45,28 +45,28 @@
45
45
  "v8-inspect-profiler": "^0.1.1"
46
46
  },
47
47
  "devDependencies": {
48
- "@opensumi/ide-ai-native": "3.7.2-next-1739945875.0",
49
- "@opensumi/ide-comments": "3.7.2-next-1739945875.0",
50
- "@opensumi/ide-components": "3.7.2-next-1739945875.0",
48
+ "@opensumi/ide-ai-native": "3.7.2-next-1740016705.0",
49
+ "@opensumi/ide-comments": "3.7.2-next-1740016705.0",
50
+ "@opensumi/ide-components": "3.7.2-next-1740016705.0",
51
51
  "@opensumi/ide-core-browser": "workspace:*",
52
- "@opensumi/ide-core-common": "3.7.2-next-1739945875.0",
53
- "@opensumi/ide-decoration": "3.7.2-next-1739945875.0",
54
- "@opensumi/ide-dev-tool": "3.7.2-next-1739945875.0",
55
- "@opensumi/ide-editor": "3.7.2-next-1739945875.0",
56
- "@opensumi/ide-extension-storage": "3.7.2-next-1739945875.0",
57
- "@opensumi/ide-file-tree-next": "3.7.2-next-1739945875.0",
58
- "@opensumi/ide-i18n": "3.7.2-next-1739945875.0",
59
- "@opensumi/ide-main-layout": "3.7.2-next-1739945875.0",
60
- "@opensumi/ide-monaco": "3.7.2-next-1739945875.0",
61
- "@opensumi/ide-output": "3.7.2-next-1739945875.0",
62
- "@opensumi/ide-overlay": "3.7.2-next-1739945875.0",
63
- "@opensumi/ide-quick-open": "3.7.2-next-1739945875.0",
64
- "@opensumi/ide-scm": "3.7.2-next-1739945875.0",
65
- "@opensumi/ide-testing": "3.7.2-next-1739945875.0",
66
- "@opensumi/ide-theme": "3.7.2-next-1739945875.0",
67
- "@opensumi/ide-toolbar": "3.7.2-next-1739945875.0",
68
- "@opensumi/ide-workspace": "3.7.2-next-1739945875.0",
69
- "@opensumi/ide-workspace-edit": "3.7.2-next-1739945875.0"
52
+ "@opensumi/ide-core-common": "3.7.2-next-1740016705.0",
53
+ "@opensumi/ide-decoration": "3.7.2-next-1740016705.0",
54
+ "@opensumi/ide-dev-tool": "3.7.2-next-1740016705.0",
55
+ "@opensumi/ide-editor": "3.7.2-next-1740016705.0",
56
+ "@opensumi/ide-extension-storage": "3.7.2-next-1740016705.0",
57
+ "@opensumi/ide-file-tree-next": "3.7.2-next-1740016705.0",
58
+ "@opensumi/ide-i18n": "3.7.2-next-1740016705.0",
59
+ "@opensumi/ide-main-layout": "3.7.2-next-1740016705.0",
60
+ "@opensumi/ide-monaco": "3.7.2-next-1740016705.0",
61
+ "@opensumi/ide-output": "3.7.2-next-1740016705.0",
62
+ "@opensumi/ide-overlay": "3.7.2-next-1740016705.0",
63
+ "@opensumi/ide-quick-open": "3.7.2-next-1740016705.0",
64
+ "@opensumi/ide-scm": "3.7.2-next-1740016705.0",
65
+ "@opensumi/ide-testing": "3.7.2-next-1740016705.0",
66
+ "@opensumi/ide-theme": "3.7.2-next-1740016705.0",
67
+ "@opensumi/ide-toolbar": "3.7.2-next-1740016705.0",
68
+ "@opensumi/ide-workspace": "3.7.2-next-1740016705.0",
69
+ "@opensumi/ide-workspace-edit": "3.7.2-next-1740016705.0"
70
70
  },
71
- "gitHead": "e491fa42318a9b37cfedf17b812c905c000c9aff"
71
+ "gitHead": "7c37a4e83a01dd8978ba55fc4b69e9ebb1f0b1f3"
72
72
  }