dsh-vscode-mode 0.1.27 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -3409,17 +3409,20 @@ window.__ModuleLoader__.load({
3409
3409
  * @param ctx 客户端上下文(slots 服务)
3410
3410
  * @param spec slot 描述
3411
3411
  * @param render 渲染函数
3412
+ * @returns 注销函数(未注册返回 null;形态切换时用于卸载旧 slot)
3412
3413
  */
3413
3414
  function registerSlotSafely(ctx, spec, render) {
3414
3415
  const slots = ctx?.slots;
3415
3416
  if (!slots || typeof slots.inject !== "function" || typeof slots.register !== "function") {
3416
3417
  console.warn("[dsh-vscode-mode] slots 服务不可用,跳过 slot " + spec.name);
3417
- return;
3418
+ return null;
3418
3419
  }
3419
3420
  try {
3420
- slots.inject(spec.name, () => slots.register(spec, render));
3421
+ const disposer = slots.inject(spec.name, () => slots.register(spec, render));
3422
+ return typeof disposer === "function" ? disposer : null;
3421
3423
  } catch (error) {
3422
3424
  console.warn("[dsh-vscode-mode] slot " + spec.name + " 注册失败(" + String(error) + "),已跳过");
3425
+ return null;
3423
3426
  }
3424
3427
  }
3425
3428
  /**
@@ -5630,7 +5633,7 @@ window.__ModuleLoader__.load({
5630
5633
  const settings = binder.scope;
5631
5634
  let selected = autoValue("auto");
5632
5635
  /** 可选探测 betterSidebar 服务(不进 inject:缺失会让插件停靠等待,杀死回退路径)。 */
5633
- const sideService = detectSidebarService(ctx);
5636
+ let sideService = detectSidebarService(ctx);
5634
5637
  /** 「添加到对话」动作集:编辑区/Tab 右键菜单注入文件引用与代码块(conversation 服务缺失时各动作安全降级)。 */
5635
5638
  const addToConversation = createAddToConversation(ctx);
5636
5639
  /** 客户端侧兼容摘要(与 host 报告合并展示;惰性求值保证 HMR 后仍新鲜)。 */
@@ -5704,7 +5707,7 @@ window.__ModuleLoader__.load({
5704
5707
  logger: (message) => console.warn("[dsh-vscode-mode] " + message)
5705
5708
  }), "vscode-mode: file link routing");
5706
5709
  const registerLegacyTab = () => {
5707
- registerSlotSafely(ctx, {
5710
+ return registerSlotSafely(ctx, {
5708
5711
  name: "conversation.view",
5709
5712
  id: "edrv-editor",
5710
5713
  order: 5,
@@ -5720,30 +5723,60 @@ window.__ModuleLoader__.load({
5720
5723
  fileMenuItems
5721
5724
  })));
5722
5725
  };
5723
- if (sideService) ctx.effect(() => installSideEditor({
5724
- service: sideService,
5725
- renderTab: (props) => react.default.createElement(SideEditorTab, Object.assign({}, props, {
5726
- schedule,
5727
- addToConversation,
5728
- sidebarPanels,
5729
- outlineSources,
5730
- fileMenuItems
5731
- })),
5732
- activeSession: () => {
5733
- const snapshot = sessions?.list?.getSnapshot?.();
5734
- const sessionId = snapshot?.current;
5735
- if (!sessionId) return void 0;
5736
- return {
5737
- sessionId,
5738
- cwd: snapshot?.byId?.[sessionId]?.cwd
5739
- };
5740
- },
5741
- registerLegacyFallback: registerLegacyTab
5742
- }), "vscode-mode: sidebar editor tab");
5743
- else {
5744
- setEnsureSideEditor(null);
5745
- registerLegacyTab();
5746
- }
5726
+ let sideDisposer = null;
5727
+ let legacyDisposer = null;
5728
+ const applySideForm = () => {
5729
+ if (sideService) {
5730
+ if (sideDisposer !== null) return;
5731
+ if (legacyDisposer !== null) {
5732
+ legacyDisposer();
5733
+ legacyDisposer = null;
5734
+ }
5735
+ sideDisposer = ctx.effect(() => installSideEditor({
5736
+ service: sideService,
5737
+ renderTab: (props) => react.default.createElement(SideEditorTab, Object.assign({}, props, {
5738
+ schedule,
5739
+ addToConversation,
5740
+ sidebarPanels,
5741
+ outlineSources,
5742
+ fileMenuItems
5743
+ })),
5744
+ activeSession: () => {
5745
+ const snapshot = sessions?.list?.getSnapshot?.();
5746
+ const sessionId = snapshot?.current;
5747
+ if (!sessionId) return void 0;
5748
+ return {
5749
+ sessionId,
5750
+ cwd: snapshot?.byId?.[sessionId]?.cwd
5751
+ };
5752
+ },
5753
+ registerLegacyFallback: registerLegacyTab
5754
+ }), "vscode-mode: sidebar editor tab");
5755
+ } else {
5756
+ if (legacyDisposer !== null) return;
5757
+ if (sideDisposer !== null) {
5758
+ sideDisposer();
5759
+ sideDisposer = null;
5760
+ }
5761
+ setEnsureSideEditor(null);
5762
+ legacyDisposer = registerLegacyTab();
5763
+ }
5764
+ };
5765
+ applySideForm();
5766
+ let sideRetries = 0;
5767
+ const retrySideService = () => {
5768
+ if (sideService !== void 0 || sideRetries >= 15) return;
5769
+ sideRetries += 1;
5770
+ schedule(() => {
5771
+ if (sideService !== void 0) return;
5772
+ sideService = detectSidebarService(ctx);
5773
+ if (sideService !== void 0) {
5774
+ console.info("[dsh-vscode-mode] 检测到 dsh-better-sidebar,切换侧边栏编辑形态");
5775
+ applySideForm();
5776
+ } else retrySideService();
5777
+ }, 2e3);
5778
+ };
5779
+ retrySideService();
5747
5780
  registerSlotSafely(ctx, {
5748
5781
  name: "conversation.input.dock",
5749
5782
  id: "edrv-diff-dock",