dsh-remote-bridge 2.2.3 → 2.3.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.
package/README.en.md CHANGED
@@ -9,13 +9,13 @@
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
- <img alt="Version" src="https://img.shields.io/badge/version-v2.2.1-087f8c">
12
+ <img alt="Version" src="https://img.shields.io/badge/version-v2.3.0-087f8c">
13
13
  <img alt="DSH plugin" src="https://img.shields.io/badge/DeepSeek_Harness-plugin-1f2328">
14
14
  <img alt="Platforms" src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-586069">
15
15
  <img alt="License" src="https://img.shields.io/badge/license-AGPL--3.0-2da44e">
16
16
  </p>
17
17
 
18
- `dsh-remote-bridge` is the remote-access bridge plugin for DeepSeek Harness (DSH). It translates DSH's private remote protocol into a versioned REST API so dsh-companion ([GitHub](https://github.com/westanke/dsh-companion) · [Gitee](https://gitee.com/westanke/dsh-companion)) and other trusted clients can keep using the same chat, workspace, and file capabilities while away from the machine. On the desktop it provides a **Phone settings** section inside your DSH settings, rendering six tabs inline (Roots / Remote / Devices / Trash / Audit / App download). **The desktop no longer offers a file-management UI**: the file tree and editor were deleted in 2.2.0 — manage files from the phone app, or ask the agent to use its tools in a conversation (see "No file-management UI on the desktop").
18
+ `dsh-remote-bridge` is the remote-access bridge plugin for DeepSeek Harness (DSH). It translates DSH's private remote protocol into a versioned REST API so dsh-companion ([GitHub](https://github.com/westanke/dsh-companion) · [Gitee](https://gitee.com/westanke/dsh-companion)) and other trusted clients can keep using the same chat, workspace, and file capabilities while away from the machine. On the desktop it provides a **Phone settings** section inside your DSH settings, rendering seven collapsible cards inline (Roots / Remote / Devices / Image reading / Trash / Audit / App download), each folding on its own and several may stay open at once. **The desktop no longer offers a file-management UI**: the file tree and editor were deleted in 2.2.0 — manage files from the phone app, or ask the agent to use its tools in a conversation (see "No file-management UI on the desktop").
19
19
 
20
20
  The interface is bilingual and defaults to Chinese. Prebuilt packages run on Windows, macOS, and Linux without compiling on the target server.
21
21
 
@@ -30,7 +30,7 @@ The interface is bilingual and defaults to Chinese. Prebuilt packages run on Win
30
30
 
31
31
  ## What it looks like
32
32
 
33
- The desktop entry lives **inside your DSH settings**: under **📱 Phone access** you will find **📱 Phone settings**, which renders six tabs inline — no second dialog. It is settings-only and contains **no file tree**: the standalone page `/dsh-workspace` and its file tree and CodeMirror editor were deleted in 2.2.0. The reason and the cost are covered in "No file-management UI on the desktop" below.
33
+ The desktop entry lives **inside your DSH settings**: under **📱 Phone access** you will find **📱 Phone settings**, which renders seven collapsible cards inline — no second dialog. It is settings-only and contains **no file tree**: the standalone page `/dsh-workspace` and its file tree and CodeMirror editor were deleted in 2.2.0. The reason and the cost are covered in "No file-management UI on the desktop" below.
34
34
 
35
35
  Remote access remains disabled until a local administrator chooses a bind address, port, and initial device permissions.
36
36
 
@@ -73,10 +73,10 @@ dsh plugin --profile web add dsh-remote-bridge
73
73
  dsh plugin --profile web add dsh-remote-bridge --registry https://registry.npmmirror.com
74
74
 
75
75
  # 2. tarball from the GitHub release
76
- dsh plugin --profile web add https://github.com/westanke/dsh-remote-bridge/releases/download/v2.2.1/dsh-remote-bridge-2.2.1.tgz
76
+ dsh plugin --profile web add https://github.com/westanke/dsh-remote-bridge/releases/download/v2.3.0/dsh-remote-bridge-v2.3.0.tgz
77
77
 
78
78
  # 3. tarball from the Gitee release (faster from mainland China)
79
- dsh plugin --profile web add https://gitee.com/westanke/dsh-remote-bridge/releases/download/v2.2.0/dsh-remote-bridge-2.2.0.tgz
79
+ dsh plugin --profile web add https://gitee.com/westanke/dsh-remote-bridge/releases/download/v2.3.0/dsh-remote-bridge-v2.3.0.tgz
80
80
 
81
81
  npx @deepseek-ai/dsh web
82
82
  ```
@@ -93,7 +93,7 @@ Restart DSH after installation, then open settings — **Phone settings** sits r
93
93
  To install a downloaded release archive:
94
94
 
95
95
  ```sh
96
- dsh plugin --profile web add ./dsh-remote-bridge-2.2.1.tgz
96
+ dsh plugin --profile web add ./dsh-remote-bridge-v2.3.0.tgz
97
97
  ```
98
98
 
99
99
  ## First connection
@@ -121,19 +121,32 @@ Mobile is unaffected: the app's file page still works against the same REST file
121
121
 
122
122
  ### Desktop settings panel
123
123
 
124
- The entry lives in DSH settings under the title **Phone settings**. It renders its rail and content **inline** — no pop-up — with a horizontal rail, landing on **Roots**:
124
+ The entry lives in DSH settings under the title **Phone settings**. It renders seven cards stacked inline — no pop-up, no navigation rail — landing on **Roots** expanded:
125
125
 
126
126
  | Section | Purpose |
127
127
  | --- | --- |
128
- | Roots | Add or remove authorized directories and set display labels |
128
+ | Roots | Add or remove authorized directories and set display labels. The current DSH workspace is registered automatically as a **default root** — it cannot be removed, but it stays fully accessible |
129
129
  | Remote | Set bind IP/port, enable remote access, and create pairing codes |
130
130
  | Devices | Inspect and revoke device scopes and per-root grants |
131
+ | Image reading | Set the handoff directory (the image-reading path); shows the read-only factory default `.dsh-images` and the fallback directory |
131
132
  | Trash | View and restore deleted entries (only deletions made from the phone app appear here) |
132
133
  | Audit | Operation type and target audit records |
133
134
  | App download | Scan to install the Android client; the codes point at both hosts' Releases list pages |
134
135
 
135
136
  The sidebar gear button was **removed**: having the entry in both the sidebar and the settings page gave one thing two starting points. The in-conversation **Files** tab is gone too, so the desktop now has exactly one entry point.
136
137
 
138
+ ### Image handoff: a picture sent from the phone, visible on the desktop
139
+
140
+ When the active model cannot see images (a text-only model), this plugin saves the picture as a workspace file **before the message is sent**, and the message keeps exactly two things: one plain-language line (where the file went, and what to do to view it) plus one absolute path for an image-reading tool.
141
+
142
+ **The DSH WebUI now renders that picture at the end of the turn** — click for the full image, `Escape` or click anywhere to close — while the path stays underneath it. The phone app could already show it; the desktop previously showed only text. Both now agree.
143
+
144
+ - **Where it lands**: `<session working directory>/<image path>/<sha256>.<ext>`. The file name is a content hash, so sending the same picture twice never piles up copies (directory `0700`, file `0600`).
145
+ - **Image path** defaults to `.dsh-images` and is editable under the **Image reading** section of the settings panel; changes take effect immediately, with no restart. The **Current default** field is **read-only** — past handoff messages and image-reading tools wrote their paths against it, so it does not follow your edit. The section also shows the fallback directory used when a session working directory cannot be resolved.
146
+ - **Only the handoff sentence is parsed**, and only in **your own message**: `.dsh-images/…` references inside assistant prose, context injections, or tool output are never turned into pictures (they are everywhere, and rendering them just shreds other people's words).
147
+
148
+ > If you previously installed `dsh-image-paths`, **disable** that row: both plugins attach their gallery to the same seat, so one picture would be drawn twice. This plugin already carries the capability.
149
+
137
150
  ### Stable client API
138
151
 
139
152
  The companion Android client is [dsh-companion](https://github.com/westanke/dsh-companion)
@@ -253,6 +266,10 @@ Errors use one envelope:
253
266
 
254
267
  A device also needs an explicit grant for every `rootId`. Local administrators may change or revoke both scopes and root grants at any time.
255
268
 
269
+ **New scopes are picked before pairing, in Remote access**: whatever you tick is what the generated pairing code carries, and those scopes take effect once the app enters the code. For a device that is already paired, open **Devices** and use its **Permissions** button.
270
+
271
+ **Revoking a device deletes it from the database** rather than leaving a marker row behind. Its grants go with it, while the audit trail (who revoked which device, and when) is kept.
272
+
256
273
  ## Upgrade and uninstall
257
274
 
258
275
  Stop DSH WebUI before upgrading, install the new package, then restart it. To uninstall:
@@ -310,11 +327,11 @@ pnpm pack
310
327
 
311
328
  `npm pack` produces roughly a **0.25 MB** archive: 2.2.0 dropped the standalone page and its editor dependencies and turned source maps off, down from 1.72 MB.
312
329
 
313
- v2.2.1 was developed against DSH `master@47f943859bef60e4160492346772ded9b24f765a`. CI covers Windows, Ubuntu, and macOS.
330
+ v2.3.0 was developed against DSH `master@47f943859bef60e4160492346772ded9b24f765a`. CI covers Windows, Ubuntu, and macOS.
314
331
 
315
332
  ## Project
316
333
 
317
- - Version: `v2.2.1`
334
+ - Version: `v2.3.0`
318
335
  - Author: upstream [Hakunm](https://github.com/Hakunm); this fork maintained by [westanke](https://github.com/westanke)
319
336
  - Repository: [GitHub](https://github.com/westanke/dsh-remote-bridge) · [Gitee](https://gitee.com/westanke/dsh-remote-bridge)
320
337
  - npm: [`dsh-remote-bridge`](https://www.npmjs.com/package/dsh-remote-bridge) ([mainland-China mirror](https://registry.npmmirror.com/dsh-remote-bridge))
package/README.md CHANGED
@@ -9,13 +9,13 @@
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
- <img alt="Version" src="https://img.shields.io/badge/version-v2.2.1-087f8c">
12
+ <img alt="Version" src="https://img.shields.io/badge/version-v2.3.0-087f8c">
13
13
  <img alt="DSH plugin" src="https://img.shields.io/badge/DeepSeek_Harness-plugin-1f2328">
14
14
  <img alt="Platforms" src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-586069">
15
15
  <img alt="License" src="https://img.shields.io/badge/license-AGPL--3.0-2da44e">
16
16
  </p>
17
17
 
18
- `dsh-remote-bridge` 是 DeepSeek Harness(DSH)的远程访问桥接插件:它把 DSH 内核的私有 remote 协议翻译成版本化的 REST 接口,让 dsh-companion([GitHub](https://github.com/westanke/dsh-companion) · [Gitee](https://gitee.com/westanke/dsh-companion))等受信任客户端在离开电脑后仍能使用同一套聊天、工作区与文件能力;桌面端在你的 DSH 设置里提供一个「手机设置」,内联六个分区(根目录 / 远程访问 / 设备 / 回收站 / 审计 / App 下载)。**桌面端不再提供文件管理界面**:文件树与编辑器已于 2.2.0 删除,电脑上管理文件请走手机 App,或在会话里让 agent 用工具完成(见「桌面端不再有文件管理界面」)。
18
+ `dsh-remote-bridge` 是 DeepSeek Harness(DSH)的远程访问桥接插件:它把 DSH 内核的私有 remote 协议翻译成版本化的 REST 接口,让 dsh-companion([GitHub](https://github.com/westanke/dsh-companion) · [Gitee](https://gitee.com/westanke/dsh-companion))等受信任客户端在离开电脑后仍能使用同一套聊天、工作区与文件能力;桌面端在你的 DSH 设置里提供一个「手机设置」,内联七张设置卡片(根目录 / 远程访问 / 设备 / 识图 / 回收站 / 审计 / App 下载),每张卡片各自折叠、可多张同时展开。**桌面端不再提供文件管理界面**:文件树与编辑器已于 2.2.0 删除,电脑上管理文件请走手机 App,或在会话里让 agent 用工具完成(见「桌面端不再有文件管理界面」)。
19
19
 
20
20
  界面默认中文,可随时切换 English。插件支持 Windows、macOS 和 Linux,安装包已经包含编译产物,不要求用户在服务器上重新构建。
21
21
 
@@ -29,7 +29,7 @@
29
29
 
30
30
  ## 实际效果
31
31
 
32
- 桌面端的入口**就在你的 DSH 设置里**:打开设置,在「📱 手机访问」下面就是「📱 手机设置」,点进去直接内联渲染六个分区,不再另开弹窗。它只做设置,**不含文件树**——独立页 `/dsh-workspace` 以及其中的文件树、CodeMirror 编辑器已于 2.2.0 一并删除,理由与代价见下文「桌面端不再有文件管理界面」。
32
+ 桌面端的入口**就在你的 DSH 设置里**:打开设置,在「通用设置」下面就是「📱 手机设置」,点进去直接内联渲染七张折叠卡片,不再另开弹窗。它只做设置,**不含文件树**——独立页 `/dsh-workspace` 以及其中的文件树、CodeMirror 编辑器已于 2.2.0 一并删除,理由与代价见下文「桌面端不再有文件管理界面」。
33
33
 
34
34
  远程访问默认关闭。管理员可在本机 WebUI 中设置绑定 IP、端口和新设备的初始权限。
35
35
 
@@ -72,10 +72,10 @@ dsh plugin --profile web add dsh-remote-bridge
72
72
  dsh plugin --profile web add dsh-remote-bridge --registry https://registry.npmmirror.com
73
73
 
74
74
  # ② GitHub Release 的 tarball
75
- dsh plugin --profile web add https://github.com/westanke/dsh-remote-bridge/releases/download/v2.2.1/dsh-remote-bridge-2.2.1.tgz
75
+ dsh plugin --profile web add https://github.com/westanke/dsh-remote-bridge/releases/download/v2.3.0/dsh-remote-bridge-v2.3.0.tgz
76
76
 
77
77
  # ③ Gitee Release 的 tarball(国内访问更快)
78
- dsh plugin --profile web add https://gitee.com/westanke/dsh-remote-bridge/releases/download/v2.2.0/dsh-remote-bridge-2.2.0.tgz
78
+ dsh plugin --profile web add https://gitee.com/westanke/dsh-remote-bridge/releases/download/v2.3.0/dsh-remote-bridge-v2.3.0.tgz
79
79
 
80
80
  npx @deepseek-ai/dsh web
81
81
  ```
@@ -86,18 +86,18 @@ npx @deepseek-ai/dsh web
86
86
  > 都会把两站都列出来 —— 相对链接可以跟着站点走,但 `/releases/download/...` 没有相对形式。
87
87
  > npm 包名与 GitHub 上的仓库同名,两站看到的都一样。
88
88
 
89
- 重启 DSH 后,打开设置就能看到「手机设置」(在「手机访问」下面)。它是**纯设置**,不含文件树;会话视图中工具轨迹旁的「文件」标签页已在 2.0.4 移除。**桌面端不再有浏览或编辑文件的界面**:独立页 `/dsh-workspace` 已在 2.2.0 删除,文件操作请走手机 App,或在会话里让 agent 用工具完成。
89
+ 重启 DSH 后,打开设置就能看到「手机设置」。它是**纯设置**,不含文件树;会话视图中工具轨迹旁的「文件」标签页已在 2.0.4 移除。**桌面端不再有浏览或编辑文件的界面**:独立页 `/dsh-workspace` 已在 2.2.0 删除,文件操作请走手机 App,或在会话里让 agent 用工具完成。
90
90
 
91
91
  从 GitHub Release 下载离线安装包时,可直接安装 tarball:
92
92
 
93
93
  ```sh
94
- dsh plugin --profile web add ./dsh-remote-bridge-2.2.1.tgz
94
+ dsh plugin --profile web add ./dsh-remote-bridge-v2.3.0.tgz
95
95
  ```
96
96
 
97
97
  ## 第一次使用
98
98
 
99
- 1. 打开 DSH 设置,进入「手机设置」(在「手机访问」下面;默认落在「根目录」页)。
100
- 2. 在「根目录」页添加允许管理的本机目录,并为它起一个容易识别的名字。
99
+ 1. 打开 DSH 设置,进入「手机设置」;默认落在「根目录」页)。
100
+ 2. 在「根目录」页默认添加允许管理的DSH当前目录。
101
101
  3. 需要连接手机时,进入「远程访问」,填写绑定 IP 和端口并保存。
102
102
  4. 点击“启用并创建配对”,再将十分钟内有效的一次性配对码填入 App。
103
103
  5. 在手机 App 的文件页里选择授权根,即可浏览和编辑文件。
@@ -119,18 +119,30 @@ dsh plugin --profile web add ./dsh-remote-bridge-2.2.1.tgz
119
119
 
120
120
  ### 桌面端设置面板
121
121
 
122
- 入口在 DSH 设置里,标题为「手机设置」。设置区**内联渲染**导航与内容,不另开弹窗;导航横排,默认落在「根目录」:
122
+ 入口在 DSH 设置里,标题为「手机设置」。设置区**内联渲染**,不另开弹窗;七张折叠卡片平铺,可多张同时展开,默认展开「根目录」:
123
123
 
124
124
  | 分区 | 用途 |
125
125
  | --- | --- |
126
- | 根目录 | 添加、移除授权目录并设置显示名称 |
126
+ | 根目录 | 添加、移除授权目录并设置显示名称;DSH 当前的工作区会作为**默认根**自动登记(不可删除,但可正常访问) |
127
127
  | 远程访问 | 设置绑定 IP / 端口,启用远程访问并创建配对码 |
128
128
  | 设备 | 查看设备权限与根目录授权,随时撤销 |
129
+ | 识图 | 设置图片交接目录(识图路径),并只读展示出厂默认 `.dsh-images` 与兜底目录 |
129
130
  | 回收站 | 查看与恢复被删除的条目(只列出来自手机 App 的删除记录) |
130
131
  | 审计 | 查看操作类型与对象的审计记录 |
131
132
  | App 下载 | 扫码下载 Android 客户端,二维码指向两个站点的 Releases 列表页 |
132
133
 
133
- 侧栏那个齿轮按钮**已移除**:入口分散在侧栏图标和设置页两处,会让同一件事有两个起点。会话视图中工具轨迹旁的「文件」标签页也早已移除,桌面端现在只有这一个入口。
134
+
135
+ ### 图片交接:手机发的图,桌面也看得见
136
+
137
+ 模型看不到图时(纯文本模型),本插件会在**发消息之前**把图存成工作区文件,消息里只留两样东西:一句人话(图存在哪、要看图怎么办)+ 一行给识图工具读的绝对路径。
138
+
139
+ 现在 **DSH WebUI 也会在该轮末尾把这张图画出来** —— 点击看原图、`Escape` 或点任意处关闭,图下面仍然保留那条路径。手机 App 那边一直可以显示,桌面这边此前只有一段文字;两边现在一致了。
140
+
141
+ - **落点**:`<会话工作目录>/<识图路径>/<sha256>.<ext>`,文件名是内容哈希,所以同一张图反复发不会堆副本(目录 0700、文件 0600)。
142
+ - **识图路径**默认 `.dsh-images`,在设置页「识图」里可以改,改完立即生效、不需要重启;**「当前默认」那一栏是只读的** —— 历史交接消息和识图工具都按它写过路径,它不跟着你的修改走。旁边还列出解析不出会话工作目录时用的兜底目录。
143
+ - **只认交接句式**,而且只认**你自己发的那条消息**:助手正文、上下文注入、工具输出里出现的 `.dsh-images/…` 不会被渲染成图(对话里到处都是这种引用,读它们只会把别人的话切成碎图)。
144
+
145
+ > 如果你此前装过 `dsh-image-paths`,请把它那一行**停用**:两个插件的图集会挂在同一个位置,同一张图会被画两遍。本插件已自带这套能力。
134
146
 
135
147
  ### 连接 Android App 或其他客户端
136
148
 
@@ -144,9 +156,7 @@ dsh plugin --profile web add ./dsh-remote-bridge-2.2.1.tgz
144
156
  | <https://github.com/westanke/dsh-companion/releases> | <https://gitee.com/westanke/dsh-companion/releases> |
145
157
 
146
158
  > 二维码里写的是 Releases **列表页**,不是某个具体的 APK 文件名 ——
147
- > 这样每次发新版都不必重新出图,扫码的人总能拿到最新版。
148
- > 两张图由 `pnpm qr:app` 生成(`scripts/generate-app-qr.mjs`),
149
- > 生成时用独立的解码器回读校验,测试也会把提交进仓库的图解回来核对。
159
+
150
160
 
151
161
  装好 App 后,在「手机设置 → 远程访问」里生成配置文本或配对码即可连上本机。
152
162
  公开 API 不依赖 DSH 私有协议,也可用于其他客户端:
@@ -248,7 +258,11 @@ Authorization: Bearer DEVICE_TOKEN
248
258
  | `settings.read` | 查看供应商有效配置和凭据是否已配置 |
249
259
  | `settings.write` | 修改供应商、写入凭据和创建自定义供应商 |
250
260
 
251
- 设备还必须获得相应 `rootId` 的授权。权限和根目录授权都可以在本机 WebUI 的“设备”页随时修改或撤销。
261
+ 设备还必须获得相应 `rootId` 的授权。权限和根目录授权都可以在本机 WebUI 的“设备”页随时修改。
262
+
263
+ **新增的权限是配对前在「远程访问」里勾选的**:勾什么,生成的配对码就带什么;APP 输入配对码后这些权限随设备一起生效。已在用的设备则到「设备」里点它的「权限」修改。
264
+
265
+ **撤销一台设备会直接把它从数据库里删除**,不是打个标记留着;它的授权随之清除,但审计记录(谁在什么时候撤了谁)会保留。
252
266
 
253
267
  ## 升级与卸载
254
268
 
@@ -307,11 +321,11 @@ pnpm pack
307
321
 
308
322
  `npm pack` 的产物约 **0.25 MB**:2.2.0 删除独立页及其编辑器依赖、并关闭 source map 之后,从 1.72 MB 降下来。
309
323
 
310
- v2.2.1 基于 DSH `master@47f943859bef60e4160492346772ded9b24f765a` 开发,CI 覆盖 Windows、Ubuntu 和 macOS。
324
+ v2.3.0 基于 DSH `master@47f943859bef60e4160492346772ded9b24f765a` 开发,CI 覆盖 Windows、Ubuntu 和 macOS。
311
325
 
312
326
  ## 项目信息
313
327
 
314
- - 当前版本:`v2.2.1`
328
+ - 当前版本:`v2.3.0`
315
329
  - 作者:上游 [Hakunm](https://github.com/Hakunm),本 fork 维护 [westanke](https://github.com/westanke)
316
330
  - 仓库:[GitHub](https://github.com/westanke/dsh-remote-bridge) · [Gitee](https://gitee.com/westanke/dsh-remote-bridge)
317
331
  - npm:[`dsh-remote-bridge`](https://www.npmjs.com/package/dsh-remote-bridge)([国内镜像](https://registry.npmmirror.com/dsh-remote-bridge))
@@ -1,7 +1,7 @@
1
1
  asyncapi: 3.0.0
2
2
  info:
3
3
  title: DeepSeek Harness Mobile Events
4
- version: 2.2.3
4
+ version: 2.3.0
5
5
  description: |
6
6
  Live file and authorized DSH chat events. Reconnect clients must refresh
7
7
  REST state; unbounded replay is not provided.
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: DeepSeek Harness Mobile API
4
- version: 2.2.3
4
+ version: 2.3.0
5
5
  description: Versioned file and chat BFF for mobile and third-party DSH clients. HTTP and HTTPS are both supported.
6
6
  servers:
7
7
  - url: http://127.0.0.1:3090/api/v1
@@ -24,7 +24,7 @@ paths:
24
24
  properties:
25
25
  ok: { type: boolean, const: true }
26
26
  version: { type: string, const: v1 }
27
- pluginVersion: { type: string, const: 2.2.1 }
27
+ pluginVersion: { type: string, const: 2.3.0 }
28
28
  /pairings/exchange:
29
29
  post:
30
30
  security: []
@@ -4,7 +4,7 @@ plugins {
4
4
  }
5
5
 
6
6
  group = "ai.deepseek.dsh"
7
- version = "2.2.1"
7
+ version = "2.3.0"
8
8
 
9
9
  repositories { mavenCentral() }
10
10