dsh-jiuling-remote-mobile 1.0.26 → 1.0.27

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/client.js +100 -8
  2. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -863,13 +863,42 @@ window.__ModuleLoader__.load({
863
863
  if (typeof presets.list !== 'function') return function () {};
864
864
 
865
865
  /**
866
- * 「当前主视图会话」的 id —— 与官方 `installWorkspaceShortcuts` 的
867
- * `current()` 同一条判据(`dsh-client-ui-workspace/lib/client.js:106`):
868
- * `retainedBy.mainView > 0`。
866
+ * 「当前主视图会话」的 id。
867
+ *
868
+ * ⚠️⚠️ **必须优先读 `uiWorkspace.selection`,不能只靠 `retainedBy`。**
869
+ *
870
+ * 1.0.25 第一版用的是「遍历 `sessions.byId`,找 `retainedBy.mainView > 0`
871
+ * 的第一行」—— 那是官方 `installWorkspaceShortcuts` 里给快捷键用的
872
+ * `current()`(`dsh-client-ui-workspace/lib/client.js:106`),它只保证
873
+ * 「**有一个**会话被主视图持有」,**不保证唯一、也不保证是最新的那个**。
874
+ * 电脑工作区与手机工作区各有一个被持有的会话时,遍历顺序先命中谁就是谁,
875
+ * 于是用户切回手机目录后,判定仍然可能落在电脑那个会话上。
876
+ *
877
+ * 真机症状(用户截图):切回手机工作区,预设列表仍是电脑那份,
878
+ * 选中后报 `Unknown agent preset: pojia` —— 手机宿主不认识电脑的预设 id。
879
+ *
880
+ * 正解是官方自己的权威来源:`uiWorkspace.selection`
881
+ * (`createSnapshotStore({})`,见其 L761;`replaceMain()` 在切换主视图时
882
+ * 用 `this.selection.set({sessionId: reference.sessionId})` 写入,
883
+ * 见其 L982-985)。它就是「现在主视图上打开的是哪个会话」。
884
+ *
885
+ * `retainedBy` 只作为拿不到 `selection` 时的退路。
869
886
  *
870
887
  * @returns 会话 id;找不到时 `undefined`。
871
888
  */
872
889
  var currentSessionId = function () {
890
+ // ① 权威来源:`uiWorkspace.selection`。
891
+ var uiWorkspace = ctx.uiWorkspace;
892
+ if (uiWorkspace !== undefined && uiWorkspace !== null) {
893
+ var selection = uiWorkspace.selection;
894
+ if (selection !== undefined && selection !== null && typeof selection.getSnapshot === 'function') {
895
+ var chosen = selection.getSnapshot();
896
+ if (chosen && typeof chosen.sessionId === 'string' && chosen.sessionId !== '') {
897
+ return chosen.sessionId;
898
+ }
899
+ }
900
+ }
901
+ // ② 退路:`retainedBy.mainView`(官方快捷键用的那条,不唯一)。
873
902
  var sessions = ctx.sessions;
874
903
  if (sessions === undefined || sessions === null) return undefined;
875
904
  var list = sessions.list;
@@ -887,6 +916,73 @@ window.__ModuleLoader__.load({
887
916
  return undefined;
888
917
  };
889
918
 
919
+ /**
920
+ * 当前主视图所在的**工作区路径** —— 「选工作区就是开关」的那把开关本身。
921
+ *
922
+ * 用户原话:「就是选工作区的时候就作为一个开关……检测到是手机的,你就给我
923
+ * 换回手机那一套呗,检测到是电脑的就换回电脑那一套呗」。
924
+ *
925
+ * 所以判据应当落在**工作区**上,而不是绕着会话去猜。官方自己在
926
+ * `dsh-client-ui-workspace/lib/client.js:932` 就是这么定位当前工作区的:
927
+ *
928
+ * ```js
929
+ * const workspace = workspaces.items.find(
930
+ * (item) => item.sessionIds.includes(sessionId));
931
+ * ```
932
+ *
933
+ * `item.path` 即该工作区的目录 —— 电脑镜像工作区的路径里带
934
+ * `.../workspaces/<slug>/...`,`mirrorSlugOf()` 能认出 slug。
935
+ *
936
+ * @param sessionId - 当前主视图会话 id。
937
+ * @returns 工作区路径;查不到时 `undefined`。
938
+ */
939
+ var workspacePathOfCurrent = function (sessionId) {
940
+ if (typeof sessionId !== 'string' || sessionId === '') return undefined;
941
+ var workspaceService = ctx.workspaces;
942
+ if (workspaceService === undefined || workspaceService === null) return undefined;
943
+ var list = workspaceService.list;
944
+ if (list === undefined || list === null || typeof list.getSnapshot !== 'function') return undefined;
945
+ var snapshot = list.getSnapshot();
946
+ if (snapshot === undefined || snapshot === null) return undefined;
947
+ var items = snapshot.items;
948
+ if (!Array.isArray(items)) return undefined;
949
+ for (var at = 0; at < items.length; at += 1) {
950
+ var item = items[at];
951
+ if (!item || !Array.isArray(item.sessionIds)) continue;
952
+ if (item.sessionIds.indexOf(sessionId) === -1) continue;
953
+ if (typeof item.path === 'string' && item.path !== '') return item.path;
954
+ return undefined;
955
+ }
956
+ return undefined;
957
+ };
958
+
959
+ /**
960
+ * 这一屏该用电脑的预设还是手机的预设 —— **一个布尔开关**。
961
+ *
962
+ * 判据顺序(前面的赢):
963
+ *
964
+ * 1. **当前工作区的路径**是不是电脑镜像目录 —— 用户要的那个开关;
965
+ * 2. 当前会话自己的 `cwd` —— 与模型菜单完全同一条(`isRemoteSession`);
966
+ * 3. 都没有 ⇒ 当成手机(本地)。
967
+ *
968
+ * ⚠️ 第 1 条必须放最前:切工作区时 `selection` 与列表行可能晚一两帧才一致,
969
+ * 而工作区行是**已经切过去**的那一个,它最能代表用户此刻的选择。
970
+ *
971
+ * @returns 是不是电脑工作区。
972
+ */
973
+ var currentIsRemote = function () {
974
+ var sessionId = currentSessionId();
975
+ var path = workspacePathOfCurrent(sessionId);
976
+ if (typeof path === 'string' && path !== '') {
977
+ var slug = mirrorSlugOf(path);
978
+ if (slug !== undefined && mirrorSlugs[slug] === true) return true;
979
+ // 路径读到了、且不是镜像目录 ⇒ 就是手机本地工作区,直接定论。
980
+ return false;
981
+ }
982
+ if (sessionId === undefined) return false;
983
+ return isRemoteSession(sessionId, cwdOf);
984
+ };
985
+
890
986
  var hadOwn = Object.prototype.hasOwnProperty.call(presets, 'list');
891
987
  var previous = presets.list;
892
988
  var call = previous.bind(presets);
@@ -896,11 +992,7 @@ window.__ModuleLoader__.load({
896
992
  // 也靠 `error.code === 'gateway/invocation-unavailable'` 兜底,
897
993
  // 动它会让预设菜单变成错误态。
898
994
  if (!result || result.ok !== true || !result.value) return result;
899
- var sessionId = currentSessionId();
900
- var isRemote = sessionId === undefined
901
- ? false
902
- : isRemoteSession(sessionId, cwdOf);
903
- var picked = pickWorkspacePresets(result.value, isRemote);
995
+ var picked = pickWorkspacePresets(result.value, currentIsRemote());
904
996
  if (picked === result.value) return result;
905
997
  return Object.assign({}, result, { value: picked });
906
998
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-jiuling-remote-mobile",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "description": "DSH 远程目录(手机端):在选文件夹流程里多出「电脑」页签,进入电脑目录、在电脑上发起对话,并把电脑的实时消息流同步到手机本地界面(只传文本,不映射桌面)。",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",