dsh-zen-remote 2.0.0 → 2.0.1

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 (43) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/docs/remote-access.md +2 -2
  4. package/lib/client.js +255 -21
  5. package/lib/fingerprint.js +4 -2
  6. package/lib/fingerprint.js.map +1 -1
  7. package/lib/intercept.js +152 -11
  8. package/lib/intercept.js.map +1 -1
  9. package/lib/merge-streams.js +11 -4
  10. package/lib/merge-streams.js.map +1 -1
  11. package/lib/relay-access.js.map +1 -1
  12. package/lib/relay-server.js +32 -11
  13. package/lib/relay-server.js.map +1 -1
  14. package/lib/types/client/effects/model-group-side.d.ts +13 -0
  15. package/lib/types/client/effects/model-group-side.d.ts.map +1 -0
  16. package/lib/types/client/index.d.ts.map +1 -1
  17. package/lib/types/client/styles/remote-session.css.d.ts +1 -1
  18. package/lib/types/client/styles/remote-session.css.d.ts.map +1 -1
  19. package/lib/types/client-data/model-group-side.d.ts +44 -0
  20. package/lib/types/client-data/model-group-side.d.ts.map +1 -0
  21. package/lib/types/fingerprint.d.ts +4 -2
  22. package/lib/types/fingerprint.d.ts.map +1 -1
  23. package/lib/types/intercept.d.ts +19 -9
  24. package/lib/types/intercept.d.ts.map +1 -1
  25. package/lib/types/merge-streams.d.ts +7 -2
  26. package/lib/types/merge-streams.d.ts.map +1 -1
  27. package/lib/types/relay-access.d.ts.map +1 -1
  28. package/lib/types/relay-server.d.ts.map +1 -1
  29. package/lib/types/virtual-id.d.ts +14 -0
  30. package/lib/types/virtual-id.d.ts.map +1 -1
  31. package/lib/virtual-id.js +14 -0
  32. package/lib/virtual-id.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/client/effects/model-group-side.ts +132 -0
  35. package/src/client/index.tsx +7 -0
  36. package/src/client/styles/remote-session.css.ts +43 -20
  37. package/src/client-data/model-group-side.ts +65 -0
  38. package/src/fingerprint.ts +4 -2
  39. package/src/intercept.ts +158 -10
  40. package/src/merge-streams.ts +11 -4
  41. package/src/relay-access.ts +6 -3
  42. package/src/relay-server.ts +49 -11
  43. package/src/virtual-id.ts +15 -0
package/README.md CHANGED
@@ -90,7 +90,7 @@ dsh plugin --profile web add dsh-zen-remote
90
90
  // ~/.dsh/profiles/desktop/package.json
91
91
  {
92
92
  "dependencies": {
93
- "dsh-zen-remote": "^2.0.0" // for local development: "link:/path/to/dsh-zen-remote"
93
+ "dsh-zen-remote": "^2.0.1" // for local development: "link:/path/to/dsh-zen-remote"
94
94
  }
95
95
  }
96
96
  ```
package/README.zh-CN.md CHANGED
@@ -90,7 +90,7 @@ dsh plugin --profile web add dsh-zen-remote
90
90
  // ~/.dsh/profiles/desktop/package.json
91
91
  {
92
92
  "dependencies": {
93
- "dsh-zen-remote": "^2.0.0" // 本地开发换成 "link:/path/to/dsh-zen-remote"
93
+ "dsh-zen-remote": "^2.0.1" // 本地开发换成 "link:/path/to/dsh-zen-remote"
94
94
  }
95
95
  }
96
96
  ```
@@ -325,7 +325,7 @@ sudo cloudflared service install # 通了再装成常驻服务
325
325
  | `/v1/upload` | POST | 远程会话的**非图片附件**上传:请求体是原始字节流(不是 JSON);查询串按允许清单规范化重建——只保留 `sessionId`(恰好一次、过共享表,未共享 403)与 `name`(至多一次);上限 100 MiB,`Content-Length` 预检加流式计数双保险,超限 413(先回拒绝再排空尾部字节);每设备并发 8(超出 429);随后与 `/v1/http` 一样**进程内**交给宿主 `/api` 共享 handler——上传回执落进的会话与之后 `session/prompt` 解析附件引用的会话是同一个 |
326
326
  | `/v1/unshare` | POST | 子客户端主动关闭某会话的远程(只认共享表内的会话) |
327
327
 
328
- **允许清单里的方法**(其余一律 `forbidden-method`):会话读写(`session/follow`、`session/page`、`session/prompt`、`session/cancel`、`session/rename`、`session/selectModel`、`session/updateQueue`、`session/attachment`、`session/projections`)、新建与分叉(`session/create`、`session/fork`,结果自动共享)、子智能体(`subagents/prompt`、`subagents/interruptByParent`,按父会话判定)、附件与 @ 引用(`fileUploads/upload`、`fileReferences/list`、`sessionReferenceResolver/candidates`)、面板长尾(`goals/*` 五个、`commands/list|execute`、`agentPresets/select`、`sessionFeedback/record`)、文件树与预览(`workspaceFiles/list|changes|read|readBytes|stat`)、终端(`terminal/*`)、任务(`job/list|follow|kill`)、`skills/list`、消息反馈(`messageFeedback/*`)、`schedule/list`、工作区会话操作(`workspace/pinSession` 等)、以及四个全局读:`session/control` 流、`session/list`、`workspace/follow` 流与 `session/modelCatalog`。前三个不带会话参数,安全靠**输出过滤**:每一帧/每一行结果先按共享表过滤,未共享会话的行到不了客户端;`session/list` 结果行里指向不可访问会话的 `parentSessionId` 字段也会被删掉(行的其余部分照常透传)。`session/modelCatalog` 同样无参数、全局只读——它就是服务端的模型提供方目录,只有分组与模型 id、显示名,不带会话数据;服务端会把结果里的 `failures` 数组清空(宿主的逐组错误文本可能带端点或凭据细节,客户端本来也不展示它)。`sessionReferenceResolver/candidates`(@ 引用候选)的答案带**每一个**服务端会话的标题、目录与现成 mention,同样走行级输出过滤,只放行已共享会话的行。审批/提问事件经 `$zr/events` 订阅转发,逐事件按 `agentId` 判定可达性。
328
+ **允许清单里的方法**(其余一律 `forbidden-method`):会话读写(`session/follow`、`session/page`、`session/prompt`、`session/cancel`、`session/rename`、`session/selectModel`、`session/updateQueue`、`session/attachment`、`session/projections`)、新建与分叉(`session/create`、`session/fork`,结果自动共享)、子智能体(`subagents/prompt`、`subagents/interruptByParent`,按父会话判定)、附件与 @ 引用(`fileUploads/upload`、`fileReferences/list`、`sessionReferenceResolver/candidates`)、面板长尾(`goals/*` 五个、`commands/list|execute`、`agentPresets/select`、`sessionFeedback/record`)、文件树与预览(`workspaceFiles/list|changes|read|readBytes|stat`)、终端(`terminal/*`)、任务(`job/list|follow|kill`)、`skills/list`、消息反馈(`messageFeedback/*`)、`schedule/list`、工作区会话操作(`workspace/pinSession` 等)、以及四个全局读:`session/control` 流、`session/list`、`workspace/follow` 流与 `session/modelCatalog`。前三个不带会话参数,安全靠**输出过滤**:每一帧/每一行结果先按共享表过滤,未共享会话的行到不了客户端;`session/list` 结果行里指向不可访问会话的 `parentSessionId` 字段也会被删掉(行的其余部分照常透传)。`session/modelCatalog` 同样无参数、全局只读——它就是服务端的模型提供方目录,只有分组与模型 id、显示名,不带会话数据;服务端会把结果里的 `failures` 数组清空(宿主的逐组错误文本可能带端点或凭据细节,客户端本来也不展示它)。`sessionReferenceResolver/candidates`(@ 引用候选)的答案带**每一个**服务端会话的标题、目录与现成 mention,同样走行级输出过滤,只放行已共享会话的行。审批/提问事件经 `$zr/events` 订阅转发,逐事件按 `agentId` 判定可达性;已共享会话的运行状态事件(`api-session/status` emit)也经同一条订阅转发(T75),按 `args[0]` 里的会话 id 判定可达性——这是唯一一种被放行的 emit。
329
329
 
330
330
  `/v1/http` 那条路由是另一张按**路由名**登记的允许清单(不是方法表的一部分),纪律相同:表外路由一律 404,登记的路由只按声明的会话参数判定;子客户端一侧的对应入口是 `GET /_dsh/zen-remote/client/http/<route>`——浏览器 fetch 包装拦下的 `/api/changes.*` 虚拟 id 请求改道到这里,还原原始 id 后经中继转发,上游 Content-Type 只认 JSON,其余一律降级为 `text/plain` + `nosniff`。
331
331
 
@@ -338,7 +338,7 @@ sudo cloudflared service install # 通了再装成常驻服务
338
338
  - `dsh-session:` 会话引用也会被扫描:DSH 会在**发消息**(`session/prompt` / `subagents/prompt` 的 content 文本块)、**改写排队消息**(`session/updateQueue` 的 edit 内容)与**斜杠命令**(`commands/execute` 参数里的全部字符串——命令处理器会把原始输入拼进下一条用户消息)这三条路径上注入被引用会话的内容,且注入时不再做权限检查,所以引用指向未共享会话的调用在服务端直接 403;@ 引用候选(`sessionReferenceResolver/candidates`)的答案也只放行已共享会话的行;
339
339
  - 终端是有意开放的(桌面应用端是可信设备):开的是**服务端**的 PTY,以服务端用户身份运行、不受智能体沙箱与审批限制;关闭会话的远程时终端流一并终止;
340
340
  - `workspaceFiles/read` 等文件预览接口不限制在会话目录内(DSH 自身就不限制),服务端进程可读的文件都能读——信任前提与终端相同;
341
- - 每台设备并发流数有上限(32)、同时在途的 invoke 数也有上限(32,超出 429 `too-many-invokes`);`*/internal` 形状的错误码(`gateway/internal` 等)只回码不带消息——那类消息引用的是服务端内部细节。事件应答按「转发时的订阅 + 设备」核对归属。审批/提问的转发是**先到先得**:服务端自己的界面和子客户端谁先应答谁生效,后答的一方被网关拒绝、同步成「已处理」。中继**不代答**:未共享会话的审批/提问事件不会被转发,服务端界面也不在线时这个审批就一直等待——网关会把仍未应答的事件转交给下一个连上来的订阅,等,而不是替你拒绝(代答会把整批待审批一次性判死,砸掉「推送 → 唤醒 → 审批」链路)。未共享会话的**通知类**事件(EMIT 帧:会话列表摘要、账号到期之类的服务端全局状态)一律不转发。
341
+ - 每台设备并发流数有上限(32)、同时在途的 invoke 数也有上限(32,超出 429 `too-many-invokes`);`*/internal` 形状的错误码(`gateway/internal` 等)只回码不带消息——那类消息引用的是服务端内部细节。事件应答按「转发时的订阅 + 设备」核对归属。审批/提问的转发是**先到先得**:服务端自己的界面和子客户端谁先应答谁生效,后答的一方被网关拒绝、同步成「已处理」。中继**不代答**:未共享会话的审批/提问事件不会被转发,服务端界面也不在线时这个审批就一直等待——网关会把仍未应答的事件转交给下一个连上来的订阅,等,而不是替你拒绝(代答会把整批待审批一次性判死,砸掉「推送 → 唤醒 → 审批」链路)。未共享会话的**通知类**事件(EMIT 帧:会话列表摘要、账号到期之类的服务端全局状态)一律不转发;唯一的例外是已共享会话(含其子会话)的 `api-session/status`——它只描述单个会话的运行/空闲,逐帧按共享表判定,子客户端靠它在主机侧一轮开始或结束时同步运行状态徽标(断线期间的翻转由重连后补拉列表纠正)。
342
342
 
343
343
  ---
344
344
 
package/lib/client.js CHANGED
@@ -16395,12 +16395,26 @@ __modules["virtual-id.js"] = function (require, module, exports) {
16395
16395
  * `session-<uuid>` and workspace ids are bare uuids.
16396
16396
  */
16397
16397
  Object.defineProperty(exports, "__esModule", { value: true });
16398
- exports.VIRTUAL_ID_PREFIX = void 0;
16398
+ exports.VIRTUAL_GROUP_NAME_MARK = exports.VIRTUAL_ID_PREFIX = void 0;
16399
16399
  exports.toVirtual = toVirtual;
16400
16400
  exports.fromVirtual = fromVirtual;
16401
16401
  exports.isVirtual = isVirtual;
16402
16402
  /** The fixed prefix every virtual id starts with. */
16403
16403
  exports.VIRTUAL_ID_PREFIX = 'zr~';
16404
+ /**
16405
+ * The invisible WORD JOINER (U+2060) every virtual GROUP NAME starts with
16406
+ * (T74). DSH 0.2.0 renders the model menu's provider groups with the
16407
+ * primitives' MenuGroup, whose `aria-labelledby` carries only a useId — the
16408
+ * group id is gone from the markup — so the browser half can no longer tell
16409
+ * a virtual group from a local one by attribute. The merged catalog's group
16410
+ * NAME (merge-streams.ts mergeModelCatalogs) is the one mark that survives
16411
+ * in both 0.1.7 and 0.2.0, and effects/model-group-side.ts classifies each
16412
+ * group container by which headings start with it. Zero-width: headings
16413
+ * read exactly as before. Sidebar workspace TITLES deliberately do NOT
16414
+ * carry it — those groups are told apart by their `zr~` row ids, not by
16415
+ * text.
16416
+ */
16417
+ exports.VIRTUAL_GROUP_NAME_MARK = '\u2060';
16404
16418
  /** The server id half: exactly the 8 lowercase hex chars relay-server.ts
16405
16419
  * mints (`randomBytes(4).toString('hex')`). */
16406
16420
  const SERVER_ID_PATTERN = /^[0-9a-f]{8}$/;
@@ -17764,31 +17778,54 @@ html[data-zr-remote-session="1"] [data-sidebar-right-guide-entry="files"]:not([a
17764
17778
  display: none !important;
17765
17779
  }
17766
17780
 
17767
- /* ---------- T52: model-menu groups follow the session's side ----------
17781
+ /* ---------- T52/T74: model-menu groups follow the session's side ----------
17768
17782
  The model catalog is GLOBAL (one shared load per page), so the merged
17769
17783
  catalog shows the server's groups everywhere; but a selection is only
17770
17784
  runnable on the side the open session lives on — the interceptor refuses
17771
- the other side with a clear message. Hide what cannot run, by the one
17772
- stable mark the menu carries:
17773
- - the model menu renders one section[role="group"] per provider group
17774
- with aria-labelledby="<useId>-<group.id>" (RT dsh-client-ui-model-
17775
- selection lib/client.js:830-835), so a VIRTUAL group's section carries
17776
- the "zr~" prefix in that attribute — an attribute the component itself
17777
- writes, like data-open-target above;
17778
- - the menu is a portal under <body>, but <html> is still its ancestor,
17779
- so the html-level session attribute scopes it with no host-depth
17780
- assumption and no :has();
17781
- - the [role="menu"] scope keeps the rule inside dropdown menus (where the
17782
- model picker lives); if DSH ever drops the aria mark the rule simply
17783
- stops matching — the interceptor's refusals remain the backstop.
17784
- In a remote session only the server's groups stay; otherwise only the
17785
- local ones (the home page and dialogs read as local, which is right:
17786
- the model picker only mounts inside a session, and a blank local
17787
- session cannot run server models either). */
17788
- html[data-zr-remote-session="1"] [role="menu"] section[role="group"]:not([aria-labelledby*="zr~"]) {
17785
+ the other side with a clear message. Hide what cannot run.
17786
+
17787
+ What changed and why the mechanism is a STAMP now (T74): through 0.1.7
17788
+ each menu group rendered aria-labelledby="<useId>-<group.id>" (RT017
17789
+ dsh-client-ui-model-selection lib/client.js ~824-830) — the group id was
17790
+ IN the attribute, and rules could key on a virtual group's "zr~" prefix
17791
+ directly. 0.2.0 renders the groups with the primitives' MenuGroup
17792
+ instead (RT dsh-client-ui-primitives lib/index.js ~4283-4304): the
17793
+ section's aria-labelledby carries ONLY the useId, the heading is a child
17794
+ div[data-menu-group-heading], and the menu container is a div whose id
17795
+ ends in "-models" with role="menu" (RT dsh-client-ui-model-selection
17796
+ lib/client.js ~974-980). Two consequences killed the old rules: a group
17797
+ section no longer says anywhere in its markup which group it is, and the
17798
+ same MenuGroup renders OTHER menus' groups too — the old
17799
+ [role="menu"] section[role="group"] scope alone was too wide and would
17800
+ have hidden every unmarked group of every menu in a remote session
17801
+ (leaving just the search box), while missing the server's groups in
17802
+ local ones.
17803
+
17804
+ The new keys on what EVERY version actually renders, the heading text:
17805
+ each virtual group's name is prefixed with the invisible WORD JOINER
17806
+ (VIRTUAL_GROUP_NAME_MARK, virtual-id.ts; written by mergeModelCatalogs).
17807
+ The browser effect (effects/model-group-side.ts) reads each group's
17808
+ heading and stamps data-zr-group="remote|local" on the section — but
17809
+ only inside a CONTAINER (the sections' shared parent element) that holds
17810
+ at least one marked heading. That container rule is what scopes these
17811
+ rules to the model menu alone WITHOUT assuming menu structure: an
17812
+ unpaired client's model menu, every other menu, and the whole rest of
17813
+ the page hold no marked heading, receive no stamp, and match neither
17814
+ rule. And since the merged catalog only ever APPENDS virtual groups to
17815
+ the local list, within a decided container the unmarked groups are
17816
+ exactly the local ones — mixed containers (the norm) decide each group
17817
+ separately. The menu is a portal under <body>, but <html> is still its
17818
+ ancestor, so the html-level session attribute scopes both rules. If the
17819
+ effect is not running (uninstalled, or a host-role page that never had
17820
+ it), no stamp exists and both rules go inert — nothing stays hidden.
17821
+
17822
+ KNOWN BOUNDARY (accepted, not fixed): in a remote session, searching the
17823
+ model menu and pressing Enter can commit a HIDDEN local model — the
17824
+ interceptor refuses it with its usual message. */
17825
+ html[data-zr-remote-session="1"] section[role="group"][data-zr-group="local"] {
17789
17826
  display: none !important;
17790
17827
  }
17791
- html:not([data-zr-remote-session]) [role="menu"] section[role="group"][aria-labelledby*="zr~"] {
17828
+ html:not([data-zr-remote-session]) section[role="group"][data-zr-group="remote"] {
17792
17829
  display: none !important;
17793
17830
  }
17794
17831
 
@@ -17924,6 +17961,196 @@ function installRemoteSessionGuard(ctx) {
17924
17961
  }, 'dsh-zen-remote: remote-session attribute');
17925
17962
  }
17926
17963
  };
17964
+ __modules["client-data/model-group-side.js"] = function (require, module, exports) {
17965
+ "use strict";
17966
+ /**
17967
+ * T74: which side of the pairing a model-menu GROUP belongs to, as pure
17968
+ * functions — the readable core of the browser effect
17969
+ * (src/client/effects/model-group-side.ts).
17970
+ *
17971
+ * WHY: the merged catalog (merge-streams.ts mergeModelCatalogs) appends the
17972
+ * server's provider groups everywhere, but a selection only runs on the side
17973
+ * the open session lives on — the interceptor refuses the other side. Through
17974
+ * DSH 0.1.7 every menu group carried its id in `aria-labelledby`
17975
+ * (`<useId>-<group.id>`), so CSS keyed the hiding on the `zr~` prefix (T52).
17976
+ * DSH 0.2.0 renders the groups with the primitives' MenuGroup, whose
17977
+ * `aria-labelledby` is a bare useId — the id is gone — and the same component
17978
+ * renders OTHER menus' groups too, so attribute scoping misfires in both
17979
+ * directions. Classification therefore moved to the one mark every version
17980
+ * renders: virtual group NAMES start with VIRTUAL_GROUP_NAME_MARK
17981
+ * (virtual-id.ts), read off each group's heading text.
17982
+ *
17983
+ * The container rule is what keeps the effect inert wherever it cannot be
17984
+ * sure: a container with not ONE marked heading — the model menu of a
17985
+ * sub-client with no shared models, every other menu on the page, the whole
17986
+ * rest of the page — classifies as `undefined` for every group, which the
17987
+ * effect reads as "leave the DOM alone". Only a container holding at least
17988
+ * one marked heading is decided, and inside it the unmarked groups are
17989
+ * exactly the LOCAL ones: the merged catalog only ever APPENDS virtual
17990
+ * groups to the local list, never mixes them the other way.
17991
+ *
17992
+ * Defensive like the rest of client-data: an empty or missing heading never
17993
+ * counts as a mark, so it can never decide a container by accident.
17994
+ */
17995
+ Object.defineProperty(exports, "__esModule", { value: true });
17996
+ exports.classifyModelGroups = classifyModelGroups;
17997
+ const virtual_id_ts_1 = require("./virtual-id.js");
17998
+ function classifyModelGroups(groups) {
17999
+ // Per container: did any heading carry the mark? Containers are decided
18000
+ // independently — one mixed model menu must not turn an all-local
18001
+ // container (a second menu elsewhere on the page) into "hide everything
18002
+ // local" there.
18003
+ const marked = new Map();
18004
+ for (const group of groups) {
18005
+ const had = marked.get(group.containerKey) ?? false;
18006
+ marked.set(group.containerKey, had || group.headingText.startsWith(virtual_id_ts_1.VIRTUAL_GROUP_NAME_MARK));
18007
+ }
18008
+ return groups.map((group) => marked.get(group.containerKey)
18009
+ ? group.headingText.startsWith(virtual_id_ts_1.VIRTUAL_GROUP_NAME_MARK)
18010
+ ? 'remote'
18011
+ : 'local'
18012
+ : undefined);
18013
+ }
18014
+ };
18015
+ __modules["client/effects/model-group-side.js"] = function (require, module, exports) {
18016
+ "use strict";
18017
+ Object.defineProperty(exports, "__esModule", { value: true });
18018
+ exports.headingTextOf = headingTextOf;
18019
+ exports.installModelGroupSide = installModelGroupSide;
18020
+ const model_group_side_ts_1 = require("./client-data/model-group-side.js");
18021
+ /**
18022
+ * T74: stamp every model-menu group with the side of the pairing it belongs
18023
+ * to, so remote-session.css.ts can hide the groups the open session cannot
18024
+ * run. The stamps are `data-zr-group="remote|local"` on each
18025
+ * `section[role="group"]`; which sections get one (and which get none) is
18026
+ * the pure classifier's container rule (client-data/model-group-side.ts) —
18027
+ * only a container holding at least one marked (WORD JOINER-prefixed, see
18028
+ * virtual-id.ts) heading is decided at all, so every other menu and the
18029
+ * whole rest of the page is never touched.
18030
+ *
18031
+ * Synchronous in the observer callback, never behind rAF: the callback is a
18032
+ * microtask and runs before this frame paints, so a group that must be
18033
+ * hidden is hidden the first time it is drawn. A rAF would land a frame late
18034
+ * and show one frame of the groups the CSS is about to hide (AGENTS.md's
18035
+ * "晚一帧" rule — the same shape the turn-fold and model-sheet-extras bugs
18036
+ * shared). The cheap batch gate below keeps the full rescan off the hot
18037
+ * path: most mutations (chat streaming, composer typing) touch no group.
18038
+ */
18039
+ const GROUP_SELECTOR = 'section[role="group"]';
18040
+ /** The stamp this effect writes; remote-session.css.ts hides
18041
+ * `[data-zr-group="local"]` in a remote session and
18042
+ * `[data-zr-group="remote"]` everywhere else. */
18043
+ const STAMP = 'data-zr-group';
18044
+ /**
18045
+ * The heading text a group section renders, across the two DSH layouts:
18046
+ * 0.1.7 points `aria-labelledby` at a heading div (id `<useId>-<group.id>`);
18047
+ * 0.2.0's MenuGroup points it at its own useId heading — which is also the
18048
+ * first `[data-menu-group-heading]` child — and its first child is an
18049
+ * id-less position sentinel span. Falls through in that order, then to the
18050
+ * first id-bearing child (0.1.7's heading, should `aria-labelledby` ever be
18051
+ * dropped), and gives up with `null`.
18052
+ */
18053
+ function headingTextOf(section, getElementById) {
18054
+ const labelledby = section.getAttribute('aria-labelledby');
18055
+ if (labelledby !== null) {
18056
+ const heading = getElementById(labelledby);
18057
+ if (heading !== null)
18058
+ return heading.textContent;
18059
+ }
18060
+ const own = section.querySelector(':scope > [data-menu-group-heading]');
18061
+ if (own !== null)
18062
+ return own.textContent;
18063
+ for (const child of section.children) {
18064
+ if (child.id !== '')
18065
+ return child.textContent;
18066
+ }
18067
+ return null;
18068
+ }
18069
+ /** Does this mutation involve a group section, inside or as a node? Groups
18070
+ * are rare; everything else (streaming text, composer typing) bails here. */
18071
+ function touchesGroup(mutation) {
18072
+ if (mutation.type === 'childList') {
18073
+ for (const node of mutation.addedNodes)
18074
+ if (isGroupish(node))
18075
+ return true;
18076
+ for (const node of mutation.removedNodes)
18077
+ if (isGroupish(node))
18078
+ return true;
18079
+ }
18080
+ const target = mutation.target;
18081
+ const el = target.nodeType === 1 ? target : target.parentElement;
18082
+ return el !== null && el.closest(GROUP_SELECTOR) !== null;
18083
+ }
18084
+ function isGroupish(node) {
18085
+ if (node.nodeType !== 1)
18086
+ return false;
18087
+ const el = node;
18088
+ return el.matches(GROUP_SELECTOR) || el.querySelector(GROUP_SELECTOR) !== null;
18089
+ }
18090
+ function installModelGroupSide(ctx) {
18091
+ ctx.effect(() => {
18092
+ const applyVerdict = (section, verdict) => {
18093
+ // Write only on change — the observer does not watch attributes (so a
18094
+ // stamp cannot re-trigger it), but a removed section's container may
18095
+ // be re-decided, and an unconditional set would still churn
18096
+ // style/attribute machinery for no effect.
18097
+ if (verdict === undefined) {
18098
+ if (section.hasAttribute(STAMP))
18099
+ section.removeAttribute(STAMP);
18100
+ }
18101
+ else if (section.getAttribute(STAMP) !== verdict) {
18102
+ section.setAttribute(STAMP, verdict);
18103
+ }
18104
+ };
18105
+ const scan = () => {
18106
+ const sections = document.querySelectorAll(GROUP_SELECTOR);
18107
+ // Group by parent element, in document order: querySelectorAll walks
18108
+ // the document, and one parent's children form a contiguous run of it,
18109
+ // so a running number per distinct parent is a stable container key.
18110
+ const containerKeys = new Map();
18111
+ const rows = [];
18112
+ for (const section of sections) {
18113
+ const parent = section.parentElement;
18114
+ if (parent === null)
18115
+ continue;
18116
+ let key = containerKeys.get(parent);
18117
+ if (key === undefined) {
18118
+ key = containerKeys.size;
18119
+ containerKeys.set(parent, key);
18120
+ }
18121
+ const text = headingTextOf(section, (id) => document.getElementById(id));
18122
+ rows.push({ section, containerKey: key, headingText: text ?? '' });
18123
+ }
18124
+ const verdicts = (0, model_group_side_ts_1.classifyModelGroups)(rows);
18125
+ rows.forEach((row, i) => applyVerdict(row.section, verdicts[i]));
18126
+ };
18127
+ // childList + subtree catches mounted/unmounted/re-parented groups,
18128
+ // characterData catches heading texts changing in place. Attributes are
18129
+ // deliberately unwatched: this effect is their only writer.
18130
+ const observer = new MutationObserver((mutations) => {
18131
+ for (const mutation of mutations) {
18132
+ if (touchesGroup(mutation)) {
18133
+ scan();
18134
+ return;
18135
+ }
18136
+ }
18137
+ });
18138
+ observer.observe(document.body, { childList: true, subtree: true, characterData: true });
18139
+ // The initial paint may already hold groups (session restored under an
18140
+ // open menu): stamp them synchronously at install, like every observer
18141
+ // effect here does.
18142
+ scan();
18143
+ return () => {
18144
+ observer.disconnect();
18145
+ // Undo every stamp so the host DOM reads exactly as before the effect
18146
+ // ran — the CSS rules key on the stamp, so this un-hides everything.
18147
+ for (const section of document.querySelectorAll(`${GROUP_SELECTOR}[${STAMP}]`)) {
18148
+ section.removeAttribute(STAMP);
18149
+ }
18150
+ };
18151
+ }, 'dsh-zen-remote: model group side');
18152
+ }
18153
+ };
17927
18154
  __modules["client/index.js"] = function (require, module, exports) {
17928
18155
  "use strict";
17929
18156
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -17969,6 +18196,7 @@ const current_session_report_ts_1 = require("./client/current-session-report.js"
17969
18196
  const remote_group_expansion_ts_1 = require("./client/remote-group-expansion.js");
17970
18197
  const remote_fetch_ts_1 = require("./client/remote-fetch.js");
17971
18198
  const remote_session_ts_1 = require("./client/effects/remote-session.js");
18199
+ const model_group_side_ts_1 = require("./client/effects/model-group-side.js");
17972
18200
  /** Required services (cordis fiber inject — the loader passes all module exports as an object plugin). */
17973
18201
  exports.inject = ['slots', 'layout', 'locale', 'sessionLogDownload', 'sessions', 'workspaces'];
17974
18202
  /**
@@ -18050,6 +18278,12 @@ function apply(ctx) {
18050
18278
  // 逐字节原样放行;标记属性只在虚拟会话打开时出现,卸载时还原。
18051
18279
  ctx.effect(() => (0, remote_fetch_ts_1.installRemoteApiFetch)(window), 'dsh-zen-remote: remote api fetch');
18052
18280
  (0, remote_session_ts_1.installRemoteSessionGuard)(ctx);
18281
+ // T74 模型选单分组按会话归属显示:0.2.0 的 MenuGroup 的 aria-labelledby 只剩
18282
+ // useId(分组 id 不再出现在标记里),旧的 zr~ 前缀选择器失效——改为 effect 给
18283
+ // 分组打 data-zr-group 标(分类依据是虚拟分组名开头的不可见标记,见
18284
+ // client-data/model-group-side.ts),CSS 按标隐藏。同样必须在桌面门之前挂载:
18285
+ // 桌面端子客户端的模型选单一样要分侧,桌面无手机外壳不影响它。
18286
+ (0, model_group_side_ts_1.installModelGroupSide)(ctx);
18053
18287
  // Desktop gate (DSH 0.1.7): the official Electron shell can be dragged
18054
18288
  // down to ~520px wide, where every width-based gate would flip the phone
18055
18289
  // shell on inside the desktop app. Inside that shell this plugin is a
@@ -8,8 +8,10 @@
8
8
  * definitions, the server puts its map into the handshake, the client
9
9
  * compares group by group, and the settings page lists the differing groups.
10
10
  * Identical maps mean fully compatible — the DSH version numbers themselves
11
- * are deliberately NOT compared (docs/spike-relay.md §2.3: 0.1.7 and 0.2.0
12
- * share byte-identical remote interfaces, so a version gate would misreject).
11
+ * are deliberately NOT compared (docs/spike-relay.md §2.3: 0.1.7-rc.2 and
12
+ * 0.2.0-rc.1 share byte-identical remote interfaces, so a version gate would
13
+ * misreject; 0.2.0-rc.2 then changed the session group within one minor —
14
+ * an additive optional field — which a version gate would have missed).
13
15
  *
14
16
  * What is hashed, per group, in priority order:
15
17
  *
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAA;AAEpD,kDAAkD;AAClD,MAAM,eAAe,GAAG,IAAI,CAAA;AAE5B,8CAA8C;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAA;AAExB,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAA;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,OAAO,EAAE,yCAAyC;IAClD,SAAS,EAAE,2CAA2C;IACtD,GAAG,EAAE,qCAAqC;IAC1C,KAAK,EAAE,sCAAsC;IAC7C,QAAQ,EAAE,2BAA2B;IACrC,IAAI,EAAE,uBAAuB;CAC9B,CAAA;AAED,2EAA2E;AAC3E,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAuC5B,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,iFAAiF;AACjF,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAA;AAC5F,CAAC;AAED,yEAAyE;AACzE,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAChC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,uEAAuE;AACvE,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,CAAA;AACzE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAClE,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;YACvB,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAA;QACxG,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc,EAAE,GAAY;IACnE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,IAAI,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,EAAE,CAAA;YACtB,IAAI,YAAY,CAAC,MAAM,CAAC;gBAAE,OAAO,sBAAsB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QAC1G,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAA;IACpF,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,IAAI,QAAQ,KAAK,gBAAgB;gBAAE,SAAQ;YAC3C,GAAG,CAAC,QAAQ,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;QACrE,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAA+B;IACpE,OAAO,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3H,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,cAAc;IACrB,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;qEACqE;AACrE,SAAS,kBAAkB,CAAC,WAAmB,EAAE,OAA0B;IACzE,IAAI,SAAkB,CAAA;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,WAAW,eAAe,CAAW,CAAA;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAA;QACnB,CAAC;IACH,CAAC;IACD,MAAM,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,WAAW,oCAAoC,CAAC,CAAA;AAC9G,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,OAA2B;IACrF,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,EAAE,OAAO,IAAI,cAAc,EAAE,CAAC,CAAA;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACvC,OAAO,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC,CAAA;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAe;IACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC1F,MAAM,IAAI,GAA2C,EAAE,CAAA;IACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QACpF,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChI,OAAO,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,kEAAkE;AAClE,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAqD,CAAA;QAC7F,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAA;QAC3B,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAA;QACxB,IAAI,OAAO,IAAI,KAAK,UAAU;YAAE,OAAO,SAAS,CAAA;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,WAAmB,EAAE,WAA2C,EAAE,OAA0B;IACpH,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAC7B,CAAC,UAAU,EAAE,EAAE,CACb,aAAa,CAAC,UAAU,CAAC;gBACzB,OAAO,UAAU,CAAC,EAAE,KAAK,QAAQ;gBACjC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC,CAC9C,CAAA;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,uBAAuB,CAAA;YACrD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;QAClE,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,sBAAsB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,uBAAuB,CAAA;IAChC,CAAC;AACH,CAAC;AAED;6DAC6D;AAC7D,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IACzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAW,CAAA;YACrF,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAA8C,CAAA;YAClG,OAAO,0BAA0B,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,uBAAuB,CAAA;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAuB,EAAE,OAA4B;IAC7F,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,CAAA;IACpD,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACzC,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IAClE,CAAC;IACD,GAAG,CAAC,YAAY,CAAC,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACpD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAe,EAAE,GAAY;IAC/D,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACvF,MAAM,OAAO,GAAuB,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;IACrF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,IACE,OAAO,IAAI,KAAK,QAAQ;YACxB,OAAO,KAAK,KAAK,QAAQ;YACzB,IAAI,KAAK,uBAAuB;YAChC,KAAK,KAAK,uBAAuB,EACjC,CAAC;YACD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}