dsh-plugin-wukong-cli 0.22.2 → 0.24.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/CHANGELOG.md +28 -0
- package/README.en.md +51 -2
- package/README.md +51 -2
- package/dist/cli.cjs +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,34 @@
|
|
|
6
6
|
|
|
7
7
|
格式基于 [Keep a Changelog](https://keepachangelog.com/),版本遵循 [Semantic Versioning](https://semver.org/)。
|
|
8
8
|
|
|
9
|
+
## [0.24.0] - 2026-10
|
|
10
|
+
|
|
11
|
+
### 新增 · Added
|
|
12
|
+
- **改图与图片查看器**:新增 `edit_image` 工具(`POST {baseURL}/images/edits`,原图 + 提示词 + 可选蒙版;只能改项目或保存目录里的图,结果存成 `<原名>-edited` 且不覆盖;不发 `input_fidelity` 与 `background`,照 Codex `imagegen` 技能记的 `gpt-image-2` 约束)。工具结果那一行加了缩略图与「编辑图片」,点开是全屏查看器(交互照 Codex):**标注**(点开后工具栏换成选择 / 画笔 / 文字 / 形状(直线、箭头、矩形、椭圆、三角形、菱形、五角星、爱心)/ 颜色(13 个预设 + 自定义取色面板)/ 橡皮(像素橡皮,一点点擦掉自己画的)/ 撤销重做 / 退出,左边竖向滑块调粗细;标注是可选中、移动、局部擦除的矢量对象)、**添加评论**(框区域写意见,带编号,同时生成蒙版)、**擦除**(画笔涂抹,面板直接带蒙版让 Host 改图)、**移除背景**(点击后先确认;先请模型直接给透明背景,返回的图已带透明区域就原样采用,否则让模型出纯绿底图、浏览器里按 Codex `remove_chroma_key.py` 的软抠像把绿色抠成透明)、**调整大小**(浏览器里缩放另存);结果都存在原图旁边,可「上一版」退回。标注与评论通过「发送给助手」在当前会话发一条带标注图的新消息。新增路由 `GET /api/wukong/imagegen/file`、`POST /api/wukong/imagegen/{edit,save}`。
|
|
13
|
+
**Editing and an image viewer**: a new `edit_image` tool (`POST {baseURL}/images/edits`, the original plus a prompt and an optional mask; it can only edit images inside the project or the save folder, saves the result as `<name>-edited` and never overwrites; it sends neither `input_fidelity` nor `background`, following the `gpt-image-2` notes in Codex's `imagegen` skill). The result row gains a thumbnail and an "Edit image" button that opens a full-screen viewer (the interaction follows Codex): **Annotate** (the bar turns into select / pen / text / shape (line, arrow, rectangle, ellipse, triangle, diamond, star, heart) / colour (13 presets plus a custom picker) / eraser (a pixel eraser that rubs out parts of what you drew) / undo-redo / exit, with a vertical thickness slider; marks are vector objects that can be selected, moved and partly rubbed out), **Comment** (box a region and write what to change, numbered, which also yields a mask), **Erase** (paint, and the panel has the Host edit with the mask directly), **Remove background** (asks for confirmation first; the model is first asked for a transparent background and a result that already has transparent areas is used as it is, otherwise the model draws the subject on pure green and the browser turns it transparent with a soft matte ported from Codex's `remove_chroma_key.py`), **Resize** (scaled in the browser and saved); every result is saved beside the original and "Previous version" steps back. Annotations and comments go through "Send to assistant", a new message with the annotated image in the current session. New routes: `GET /api/wukong/imagegen/file` and `POST /api/wukong/imagegen/{edit,save}`.
|
|
14
|
+
- **随工具注入的 `wukong-imagegen` 技能**:只给模型用,写明图片提示词怎么写、编辑时「只改 X、保留 Y」、收到标注图怎么处理、透明背景怎么做;改写自 Codex 的 `imagegen` 技能(Apache-2.0)。与两个生图工具同生共死:没选好模型时不注入,不占上下文。
|
|
15
|
+
**A `wukong-imagegen` skill injected with the tools**: for the model only, covering how to write image prompts, "change only X; keep Y unchanged" for edits, what to do with an annotated image and how to get a transparent background; adapted from Codex's `imagegen` skill (Apache-2.0). It lives and dies with the two image tools: not injected until a model is chosen, so it takes no context for nothing.
|
|
16
|
+
|
|
17
|
+
### 变更 · Changed
|
|
18
|
+
- **`generate_image` 的保存目录只由面板「保存目录」决定,工具改收 `file_name`**:模型原来可以传 `output_path`(比如 `summer.png`),一传就绕开用户配置的目录、把图丢进项目根目录。现在工具只接受文件名,传目录或 `../` 都会被收成最后一段名字;保存目录(默认 `output/imagegen`,相对当前会话项目,也可填绝对路径)只由面板设置决定;同名文件不覆盖,自动加 `-2`、`-3`。
|
|
19
|
+
**`generate_image` saves only into the panel's save folder, and the tool now takes `file_name`**: the model used to be able to pass `output_path` (say `summer.png`), which bypassed the folder the user had configured and dropped the image into the project root. The tool now accepts a file name only — a directory or `../` is cut down to its last segment — and the save folder (default `output/imagegen`, relative to the current session project, or an absolute path) is decided by the panel setting alone; an existing file is never overwritten (`-2`, `-3` is appended).
|
|
20
|
+
- **没选好 Provider 与模型时不再注册生图工具**:以前工具在启动时无条件注册,没配模型时模型也看得到它,调用后才被拒绝。现在只有保存了 Provider 与模型才注册 `generate_image`、`edit_image` 和 `wukong-imagegen` 技能,保存后立即出现,清除后立即卸载,无需重启。
|
|
21
|
+
**The image tools are no longer registered until a Provider and a model are chosen**: they used to be registered unconditionally at startup, so the model saw the tool and was refused only after calling it. `generate_image`, `edit_image` and the `wukong-imagegen` skill are now registered only once a Provider and a model are saved, appearing the moment they are saved and disappearing the moment they are cleared, with no restart.
|
|
22
|
+
- **工具结果那一行多了缩略图和「编辑图片」按钮**:成功后的一行文字旁边有一张小缩略图和按钮,点开是图片查看器;`edit_image` 的结果也用同一个视图。
|
|
23
|
+
**The result row gains a thumbnail and an "Edit image" button**: next to the one-line text there is a small thumbnail and a button that opens the image viewer; `edit_image` results use the same view.
|
|
24
|
+
|
|
25
|
+
## [0.23.0] - 2026-10
|
|
26
|
+
|
|
27
|
+
### 新增 · Added
|
|
28
|
+
- **生图:`generate_image` 工具与面板「生图」页**:给会话注册一个生图工具,模型按文字提示词调用 OpenAI 兼容的 Images API(`POST {baseURL}/images/generations`,认 `b64_json` 或 `url`),图片存进会话工作区(默认 `output/imagegen/<slug>-<时间戳>.<ext>`,可用 `output_path` 指定),有附件服务时同时登记为会话附件。参数:`prompt`(必填)、`size`、`quality`、`output_format`、`output_path`,缺省用面板默认值。设置 → Wukong → 生图页从宿主模型目录(与提示词增强、模型选择器同一份)选 Provider 与模型,并设默认尺寸 / 质量 / 格式 / 输出目录;**不预置任何模型名**,没选全就调用报 `imagegen-unset`。端点与密钥不存进插件状态:按次从宿主 settings 里该 Provider 的 `baseURL` / `apiKeyEnv` 与 `credentials` 服务解析。状态文档新增 `imagegen` 一段(写入 `null` 清回默认值,非法偏好回落默认、Provider / 模型原样保留)。工具注册在 `tools` 服务上(独立 fiber),headless profile 也能用。详见 README「🖼️ 生图」。
|
|
29
|
+
**Image generation: the `generate_image` tool and an Images page in the panel**: registers an image tool in the session; the model calls an OpenAI-compatible Images API with a text prompt (`POST {baseURL}/images/generations`, reading `b64_json` or `url`) and the image is saved into the session workspace (by default `output/imagegen/<slug>-<timestamp>.<ext>`, or wherever `output_path` says), also registered as a session attachment when the attachment service exists. Parameters: `prompt` (required), `size`, `quality`, `output_format`, `output_path`, defaulting to the panel's values. Settings → Wukong → Images picks the Provider and model from the host's model catalog (the same one as Prompt enhancement and the model picker) and sets the default size / quality / format / output directory; **no model name is built in**, and calling it before both are chosen fails with `imagegen-unset`. The endpoint and key are not stored in the plugin's state: they are resolved per call from that Provider's `baseURL` / `apiKeyEnv` in the host's settings and the `credentials` service. The state document gains an `imagegen` section (writing `null` clears it to the defaults; an invalid preference falls back to its default while Provider / model are kept as-is). The tool is registered on the `tools` service in its own fiber, so a headless profile can use it. See the README's "🖼️ Image generation".
|
|
30
|
+
- **生图在对话里的展示**:用 `tool.call.toolview` 按工具名 `generate_image` 注册自己的视图,替换宿主默认的工具卡片。进行中显示与成图同比例的骨架占位(点阵加一道很淡的扫光,浅色 / 深色主题都可见,开了「减少动态效果」时不动);成功后收成一行「Generated … at <路径>」,图由助手在回复里用 Markdown 嵌入(工具说明里要求了),避免同一张图在工具卡片与回复里各出现一次;失败显示一行错误文字。
|
|
31
|
+
**How an image shows in the chat**: registers its own view for the tool name `generate_image` in `tool.call.toolview`, replacing the host's default tool card. While running it shows a skeleton placeholder in the image's aspect ratio (a dot grid with one faint sweep, visible in light and dark themes and still under reduced motion); on success it collapses to one "Generated … at <path>" line, and the image is embedded by the assistant in its reply with Markdown (the tool description asks for it) so the same image does not appear in both the tool card and the reply; a failure shows one line of error text.
|
|
32
|
+
|
|
33
|
+
### 修复 · Fixed
|
|
34
|
+
- **`generate_image` 调用时传的 `size` / `quality` 之前不会发给 API**:工具算出了覆盖后的值并写进返回结果,但请求体用的仍是面板里的默认值,返回的尺寸与实际出图参数对不上。现在覆盖值真正进入请求,并补了断言请求体的测试。
|
|
35
|
+
**The `size` / `quality` passed in a `generate_image` call were not sent to the API**: the tool worked out the overridden values and put them in its result, but the request body still used the panel's defaults, so the reported size did not match what was actually requested. The overrides now reach the request, with a test that asserts the request body.
|
|
36
|
+
|
|
9
37
|
## [0.22.2] - 2026-10
|
|
10
38
|
|
|
11
39
|
### 新增 · Added
|
package/README.en.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|--|--|--|--|--|
|
|
13
13
|
| Light theme | Prompts | Skills | MCP | Wallpaper |
|
|
14
14
|
|
|
15
|
-

|
|
16
16
|

|
|
17
17
|

|
|
18
18
|

|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
- [🚀 Quick start](#-quick-start)
|
|
34
34
|
- [🎯 Supported upstreams](#-supported-upstreams)
|
|
35
35
|
- [✨ Features](#-features)
|
|
36
|
+
- [🖼️ Image generation (`generate_image`)](#️-image-generation-generate_image)
|
|
36
37
|
- [🗄️ State and data](#️-state-and-data)
|
|
37
38
|
- [⌨️ Slash commands](#️-slash-commands)
|
|
38
39
|
- [🖥️ Platform support](#️-platform-support)
|
|
@@ -143,6 +144,7 @@ Open **Settings → Wukong** (book icon).
|
|
|
143
144
|
- panel `.zip` bundle import (uploaded into `$DSH_HOME/skills`)
|
|
144
145
|
- in-chat command `/wukong-skill-dir <dir>` (directory — a browser cannot read a host directory, so this one is chat-only)
|
|
145
146
|
- **MCP tool servers** — add/edit/remove stdio or HTTP(S) servers; enabling auto-connects them with per-server status, a live tool list, and a one-click connect test.
|
|
147
|
+
- **Image generation (`generate_image`)** — registers an image tool in the session: the model calls an OpenAI-compatible Images API with a prompt and the image is saved into the workspace; the Provider and model are picked on the panel's Images page from the host's model catalog, with the endpoint and key following the Provider; the chat shows a placeholder animation while it runs. See the next section, [🖼️ Image generation](#️-image-generation-generate_image).
|
|
146
148
|
- **Wallpaper (global background & effects)** — five **original landscapes bundled** with the plugin (one click applies it), a local image/video upload, or an image URL; the wallpaper's theme tokens are one layer composed through the official `ctx.theme.overrideTokens`, so a light/dark switch just follows; tune opacity/scrim/glass/blur/fit live; **set separately on web vs desktop**. Uploaded bytes go to disk and only an id lives in the state document, so binaries never enter your config.
|
|
147
149
|
- **Composer hint-line style** — enable/color/size/gradient presets for the below-input hint and stats line.
|
|
148
150
|
- **Conversation import / export** — export selected sessions as a zip (attachments + workspace included) and restore them on another machine; the list shows title, project, time and size; **real delete** (removes the session directory + index entry, and refuses a session that is still live); import streams through the session-persistence service. Exported zips live in `$DSH_HOME/wukong/exports/` and are pruned on every export: the 10 newest are kept and anything older than 7 days is removed.
|
|
@@ -154,13 +156,58 @@ Open **Settings → Wukong** (book icon).
|
|
|
154
156
|
|
|
155
157
|
---
|
|
156
158
|
|
|
159
|
+
## 🖼️ Image generation (`generate_image`)
|
|
160
|
+
|
|
161
|
+
The plugin registers a **`generate_image`** tool in the session: the model calls an OpenAI-compatible Images API once with a text prompt, and the image is saved into the session workspace. The tool sits on the harness `tools` service rather than on a web route, so a headless profile can use it too; the in-chat placeholder animation exists only in the web panel.
|
|
162
|
+
|
|
163
|
+
**Using it**: Settings → Wukong → **Images**, pick a Provider and a model (the same catalog as Prompt enhancement and the composer's model picker), adjust the default size / quality / format and the save folder if you like, and save; then just ask the assistant for "an image of …". **No model name is built in**: until a Provider and a model are both chosen, **`generate_image` is not in the assistant's tool list at all** (it appears as soon as you save and disappears as soon as you clear, no restart); if it is somehow called anyway it fails clearly (`imagegen-unset`) rather than guessing a model for you. Settings are read per call, so a model changed in the panel applies to the next call.
|
|
164
|
+
|
|
165
|
+
**Tool parameters** (all but `prompt` are optional and default to the panel's values):
|
|
166
|
+
|
|
167
|
+
| Parameter | Meaning |
|
|
168
|
+
|---|---|
|
|
169
|
+
| `prompt` | required, the text describing the image |
|
|
170
|
+
| `size` | `auto` / `1024x1024` / `1024x1536` / `1536x1024` / `2048x2048` / `2048x1152` / `3840x2160` / `2160x3840` |
|
|
171
|
+
| `quality` | `low` / `medium` / `high` / `auto` |
|
|
172
|
+
| `output_format` | `png` / `jpeg` / `webp`; also decides the extension (`jpeg` is saved as `.jpg`) |
|
|
173
|
+
| `file_name` | the file name (a name only, never a directory; the extension follows the output format). The save folder is decided **only by the panel's "Save folder"** (default `output/imagegen`, relative to the current session project, or an absolute path) and the model cannot change it; a directory or `../` in the value is cut down to its last segment. An existing file is never overwritten — `-2`, `-3` is appended. Defaults to `<prompt slug>-<timestamp>` |
|
|
174
|
+
|
|
175
|
+
**Endpoint and credentials**: neither is stored in the plugin's state. They follow the Provider and are resolved per call — the `baseURL` and `apiKeyEnv` configured for that Provider in the host's settings, with the key resolved through the host's `credentials` service (an empty `apiKeyEnv` means the endpoint needs no key). The request is `POST {baseURL}/images/generations` with `model` / `prompt` / `size` / `quality` / `output_format`; the response is read as `b64_json`, or `url` (downloaded once more). One call produces one image; the per-call timeout defaults to 5 minutes.
|
|
176
|
+
|
|
177
|
+
**How it shows in the chat**: the plugin registers its own view for the tool name `generate_image` in `tool.call.toolview`, replacing the host's default tool card.
|
|
178
|
+
- While the call runs (the model writing arguments, waiting on the API): a skeleton placeholder in the image's aspect ratio, a dot grid with one faint sweep (visible in light and dark themes; still when the system asks for reduced motion).
|
|
179
|
+
- On success: the placeholder collapses to one "Generated … at <path>" line. **The image itself is embedded by the assistant in its reply with Markdown** — the tool description asks for that, so the same image does not appear once in the tool card and again in the reply. This relies on the model complying; if it does not embed the image, the file is still on disk and its path is in that line.
|
|
180
|
+
- On failure: one quiet line of error text.
|
|
181
|
+
|
|
182
|
+
**Editing (`edit_image`)**: once a Provider and a model are chosen, the model gets `edit_image` next to `generate_image`: it sends an image already in the project (`image`, which must be inside the project or the save folder) with a prompt and an optional mask (`mask`, a PNG whose transparent pixels may change) to `POST {baseURL}/images/edits`, and the result is saved into the save folder named after the original plus `-edited`, **never overwriting** the original. The constraints follow the Image API notes in the Codex `imagegen` skill: no `input_fidelity` and no `background` (`gpt-image-2` accepts neither), masks are guidance rather than pixel-exact, and the image and the mask are each under 50MB.
|
|
183
|
+
|
|
184
|
+
**The image viewer**: the result row has a thumbnail and an "Edit image" button; it opens a full-screen viewer with a drawing canvas over the image and a row of tools at the bottom (the interaction follows Codex):
|
|
185
|
+
|
|
186
|
+
| Tool | What it does | How it becomes an edit |
|
|
187
|
+
|---|---|---|
|
|
188
|
+
| Annotate | the bottom bar becomes: select (click / drag / Delete), pen, text, shape (line, arrow, rectangle, ellipse, triangle, diamond, star, heart), colour (13 presets, and the rainbow cell opens a custom picker: saturation/brightness square, hue bar, an eyedropper where the browser has one, and RGB / HEX / HSL fields), eraser (a pixel eraser: rub out parts of what you drew, with a ring showing its size that follows the thickness slider; delete a whole mark with Select + Delete), undo / redo, exit, and the handle on the left drags the bar elsewhere; a vertical slider on the left sets thickness and font size. Marks are vector objects, not pixels painted on a bitmap | the marked-up image, the typed text and a note go to the assistant, which calls `edit_image` |
|
|
189
|
+
| Comment | drag a region and write what to change, numbered | same, and the boxed regions become a mask so the model changes only what is inside |
|
|
190
|
+
| Erase | paint over what to remove | the panel has the Host edit with the mask directly, no model in between |
|
|
191
|
+
| Remove background | asks for confirmation first (it calls the image model and costs one call) | the model is first asked for a transparent background and a result that already has transparent areas is used as it is; otherwise the model puts the subject on a flat pure green `#00ff00` background and the browser turns that green transparent (`gpt-image-2` returns no real alpha; same approach as Codex's `remove_chroma_key.py`), saved as `-cutout.png` |
|
|
192
|
+
| Resize | width and height (ratio can be locked) | scaled in the browser, saved as `-<w>x<h>.png`, no model call |
|
|
193
|
+
|
|
194
|
+
Every result is saved beside the original and never overwrites a file, and "Previous version" steps back. "Send to assistant" posts a new message in the **current session**: the annotated image (shrunk to at most 1536px on its long edge) as an image part, and the original's path, the mask's path and each comment as text; the model follows the `wukong-imagegen` skill (original as `image`, red marks not kept). Limits: for a picture with no clear subject (a whole room, say) the model often does not turn the background green; the viewer then reports the failure and the colour it actually found along the edge. The chroma-key cut-out does not suit a subject with large green areas (leaves and grass are partly cut away), and a `gpt-image-2` mask is not pixel-exact.
|
|
195
|
+
|
|
196
|
+
**The skill (`wukong-imagegen`)**: while the two tools are registered the plugin injects a skill for the model only, covering how to write image prompts, "change only X; keep Y unchanged" for edits, what to do with an annotated image, how to get a transparent background, and how to pick size and quality. It is adapted from OpenAI's Codex `imagegen` skill (Apache-2.0). It is not injected when the tools are not (no model chosen), so it never takes up context for nothing.
|
|
197
|
+
|
|
198
|
+
**Error codes** (`code` is a stable machine key the panel and the tool pick copy from): `imagegen-unset` (no Provider / model chosen) · `imagegen-route` (the Provider has no resolvable endpoint or credential in this deployment) · `imagegen-prompt` (empty prompt) · `imagegen-http` (non-2xx) · `imagegen-network` · `imagegen-timeout` · `imagegen-aborted` · `imagegen-format` (response is not JSON) · `imagegen-empty` (no image in the response) · `imagegen-download` (downloading a `url` failed) · `imagegen-image` (the image to edit cannot be read / is too large / is not PNG, JPEG or WebP) · `imagegen-path` (the image is outside the project and the save folder).
|
|
199
|
+
|
|
200
|
+
> A missing or invalid preference (`size`, `quality`, …) falls back to its default; only the Provider and model must be chosen by you. **Restart dsh after updating the plugin** (the tool's registration sits on the tools service and follows the settings by itself); a pure styling change to the panel view only needs a page refresh.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
157
204
|
## 🗄️ State and data
|
|
158
205
|
|
|
159
206
|
Since 0.12.0 Wukong no longer uses a harness settings namespace: all managed state lives in the plugin's own document and directories.
|
|
160
207
|
|
|
161
208
|
| Path | Contents |
|
|
162
209
|
|---|---|
|
|
163
|
-
| `$DSH_HOME/wukong/state.json` (default `~/.dsh/wukong/state.json`) | prompts, managed skills, custom commands, MCP servers, wallpaper/effect settings (wallpapers store ids only) |
|
|
210
|
+
| `$DSH_HOME/wukong/state.json` (default `~/.dsh/wukong/state.json`) | prompts, managed skills, custom commands, MCP servers, wallpaper/effect settings (wallpapers store ids only), image-generation settings (Provider / model / default size, …; the endpoint and key are not stored here) |
|
|
164
211
|
| `$DSH_HOME/wukong/wallpapers/` | uploaded wallpaper / video bytes |
|
|
165
212
|
| `$DSH_HOME/skills/` | skills installed from a zip or a directory (the official filesystem skill provider scans and watches this root) |
|
|
166
213
|
| `$DSH_HOME/wukong/exports/` | conversation export zips |
|
|
@@ -172,6 +219,7 @@ The panel talks to the Host only through the plugin's own **same-origin HTTP rou
|
|
|
172
219
|
| `GET` / `POST /api/wukong/state` | read / write the state document (all panel CRUD goes here): `GET` answers `{ok, revision, state}`; `POST` takes `{state, ifRevision}` and normalizes the document on every accepted write, incrementing `revision` |
|
|
173
220
|
| `GET /api/wukong/skills` | the skill + managed-command catalog the panel needs: `{ok, revision, skills, commands}`, so the browser no longer reconstructs it from the whole state document |
|
|
174
221
|
| `GET /api/wukong/models` | the models a Prompt-enhancement route can be pinned to: the same catalog the host's model picker uses (`sessionController.modelCatalog()`), grouped by provider; answers 503 when the host has no such service, and the panel falls back to typing them in |
|
|
222
|
+
| `GET /api/wukong/imagegen/file?path=` · `POST /api/wukong/imagegen/edit` · `POST /api/wukong/imagegen/save` | for the image viewer: read an image for `<img>` / edit directly without the model (erase, remove background; nothing is written with `persist:false`) / save an image the panel computed (resize, cut-out, mask) beside the original. Absolute paths only, PNG / JPEG / WebP judged by magic bytes, and a result never overwrites an existing file |
|
|
175
223
|
| `POST /api/wukong/mcp/test` | one-shot MCP connect test |
|
|
176
224
|
| `GET /api/wukong/market` · `POST /api/wukong/market/install` | marketplace: search the aggregated catalogs (`kind=mcp\|skill` plus `q`) — official MCP Registry, DSH MCP Market, ClawHub, SkillsMP and the bundled set — and install one explicit item id; an MCP server that needs env vars is installed disabled and the answer lists `needsEnv` |
|
|
177
225
|
| `POST /api/wukong/skills/zip` | upload a zip skill bundle and extract it into `$DSH_HOME/skills` |
|
|
@@ -283,6 +331,7 @@ DSH runtime (0.2.0-rc.2)
|
|
|
283
331
|
|
|
284
332
|
- **One plugin package, two faces**: `dsh-plugin-wukong`'s `package.json` points `dsh.bundle.patch` at its own `cordis.patch.yml` (the single host row, `id: wukong`) and declares `dsh.client` (`platform: web` + `inject`) pointing at `exports["./client"]` → `client/client.js`. The panel is discovered from the **same entry's** `dsh.client` field, so **no second plugin package and no second loader row** are needed; the installer is a separate package (`dsh-plugin-wukong-cli`, not a bundle).
|
|
285
333
|
- **Host side** owns prompt/skill/command/MCP/wallpaper CRUD and persistence (`$DSH_HOME/wukong/state.json`), injects prompts through `ctx.systemPrompt.section` (scope-matched, interpolation off) and registers skills via `ctx.skills.register`; it also serves the `/api/wukong/*` and `/api/wukong-wallpaper/*` routes (state read/write, skill catalog, MCP test, zip skills, conversation import/export, session delete, usage stats, version check, one-click update).
|
|
334
|
+
- **Image tool**: the Host registers `generate_image` (`ctx.tools.register`) in its own `ctx.inject(['tools'])` fiber — only once a Provider and a model are chosen, registering or unregistering the moment the settings are saved or cleared — reading the settings, the Provider route and the attachment service per call; the panel side registers the chat view for it by tool name in `tool.call.toolview`.
|
|
286
335
|
- **Panel side** reads and writes the state document over the plugin's own same-origin routes and reads the skill catalog from the plugin's own `GET /api/wukong/skills` — it **never touches a settings namespace**, never talks to DSH internals directly, and does not depend on remote APIs such as `api-remotes` or `sessions`. Its load-time declarations list only packages that exist: `dsh.client.inject` is `@deepseek-ai/dsh-client-locale`, `@deepseek-ai/dsh-client-ui-settings`; its cordis service inject is `['slots','locale']`.
|
|
287
336
|
- **Optional peers**: every `@deepseek-ai/*` runtime package plus `react` is `optional` in `peerDependenciesMeta`, and there are no runtime `dependencies`. The reason is that those runtime packages are not on the public npm registry, so declaring them as required peers made `pnpm add` fail with `ERR_PNPM_FETCH_404`; optional peers let pnpm install the plugin while the host still provides the modules at runtime.
|
|
288
337
|
- **Installer** (`dsh-plugin-wukong-cli`) does exactly three standard things — `pnpm add`, select the bundle, clean up the old copy-style install — and web and desktop share the mechanism.
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|--|--|--|--|--|
|
|
13
13
|
| 浅色主题 | 提示词 | 技能 | MCP | 壁纸 |
|
|
14
14
|
|
|
15
|
-

|
|
16
16
|

|
|
17
17
|

|
|
18
18
|

|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
- [🚀 快速开始](#-快速开始)
|
|
34
34
|
- [🎯 适配目标 · Supported upstreams](#-适配目标--supported-upstreams)
|
|
35
35
|
- [✨ 功能](#-功能)
|
|
36
|
+
- [🖼️ 生图(generate_image)](#️-生图generate_image)
|
|
36
37
|
- [🗄️ 状态与数据](#️-状态与数据)
|
|
37
38
|
- [⌨️ 斜杠命令](#️-斜杠命令)
|
|
38
39
|
- [🖥️ 平台支持](#️-平台支持)
|
|
@@ -144,6 +145,7 @@ dsh web # 或直接重启 DSH Desktop 客户端
|
|
|
144
145
|
- 会话内命令:`/wukong-skill-dir <dir>`(目录式,浏览器读不到主机目录,只能在这里装)
|
|
145
146
|
- **MCP 工具服务器** — 添加/编辑/移除 stdio 或 HTTP 的 MCP 服务器,启用即自动连接,每台展示运行状态与工具列表,支持「测试」连接。
|
|
146
147
|
- **Wallpaper(全局壁纸与特效)** — 五张随包附带的**原创内置风景**(点一下即应用)、本地上传图片/视频或填图片 URL;壁纸的主题 token 通过官方 `ctx.theme.overrideTokens` 合成一层覆盖,切换亮/暗主题自动跟随;透明度/遮罩/玻璃/模糊/铺法实时可调;**web 与桌面客户端分别设置**。上传的字节存盘,状态文档里只留 id,永远不会把二进制写进配置。
|
|
148
|
+
- **生图(`generate_image`)** — 给会话注册一个生图工具:模型按提示词调用 OpenAI 兼容的 Images API,图存进工作区;Provider 与模型在面板「生图」页从宿主模型目录里选,端点与密钥跟着 Provider 走;对话里生成时显示占位动效。详见下一节 [🖼️ 生图](#️-生图generate_image)。
|
|
147
149
|
- **输入栏提示行样式** — 为 composer 下方提示与统计行单独设启用/颜色/字号/渐变色。
|
|
148
150
|
- **对话导入 / 导出** — 勾选多个会话导出为 zip(含附件与工作区),另一台机器导入即可还原;列表显示对话标题、项目、时间与占用大小;支持**真实删除**(删目录 + 清索引;仍在运行的会话会被拒绝),导入经会话持久化服务流式写盘。导出的 zip 存在 `$DSH_HOME/wukong/exports/`,且每次导出后自动清理:保留最新 10 个,并删除超过 7 天的归档。
|
|
149
151
|
- **使用统计(cc-switch 风格)** — 时间范围筛选(全部/30天/7天/今天);输入/输出/缓存读/缓存写 Token、缓存命中率、成本估算;请求日志(时间/项目/输入输出/缓存/成本/用时/首字/状态);Provider(项目)统计与模型统计;SVG 双轴趋势图(今天按 24 小时分段)。统计与会话列表都通过 harness 的 session-query 服务读取(项目目录编码与持久化后端保持一致),缓存命中率与首字时间取自真实用量数据。
|
|
@@ -154,13 +156,58 @@ dsh web # 或直接重启 DSH Desktop 客户端
|
|
|
154
156
|
|
|
155
157
|
---
|
|
156
158
|
|
|
159
|
+
## 🖼️ 生图(generate_image)
|
|
160
|
+
|
|
161
|
+
插件会给会话注册一个 **`generate_image`** 工具:模型按文字提示词调用一次 OpenAI 兼容的 Images API,图片存进会话工作区。工具挂在 harness 的 `tools` 服务上而不是 web 路由上,所以 headless profile 也能用;对话里的占位动效只在 web 面板里有。
|
|
162
|
+
|
|
163
|
+
**使用**:设置 → Wukong → **生图**,选好 Provider 与模型(目录与提示词增强、输入框模型选择器是同一份),按需调默认尺寸 / 质量 / 格式与保存目录,保存;然后直接对助手说「生成一张……」。**不预置任何模型名**:Provider 与模型没选全时,**助手的工具列表里根本没有 `generate_image`**(保存后立即出现,清除后立即消失,不用重启);万一仍被调用也会明确报错(`imagegen-unset`),不会替你猜一个模型发出去。设置按次读取,面板里换了模型下一次调用就生效。
|
|
164
|
+
|
|
165
|
+
**工具参数**(除 `prompt` 外都可省略,省略时用面板里的默认值):
|
|
166
|
+
|
|
167
|
+
| 参数 | 含义 |
|
|
168
|
+
|---|---|
|
|
169
|
+
| `prompt` | 必填,描述图片的文字 |
|
|
170
|
+
| `size` | `auto` / `1024x1024` / `1024x1536` / `1536x1024` / `2048x2048` / `2048x1152` / `3840x2160` / `2160x3840` |
|
|
171
|
+
| `quality` | `low` / `medium` / `high` / `auto` |
|
|
172
|
+
| `output_format` | `png` / `jpeg` / `webp`,同时决定落盘扩展名(`jpeg` 写成 `.jpg`) |
|
|
173
|
+
| `file_name` | 文件名(只要名字,不要目录;扩展名跟着输出格式)。保存目录**只由面板里的「保存目录」决定**(默认 `output/imagegen`,相对当前会话项目,也可填绝对路径),模型改不了;传了目录或 `../` 只会取最后一段名字。同名文件不会被覆盖,自动加 `-2`、`-3`。缺省为 `<提示词slug>-<时间戳>` |
|
|
174
|
+
|
|
175
|
+
**端点与凭据**:不存进插件状态,跟着 Provider 走、调用时按次解析——从宿主 settings 里该 Provider 配置的 `baseURL` 与 `apiKeyEnv` 取,密钥经宿主 `credentials` 服务解析(`apiKeyEnv` 为空表示端点不要密钥)。请求是 `POST {baseURL}/images/generations`,body 为 `model` / `prompt` / `size` / `quality` / `output_format`;响应认 `b64_json`,或 `url`(会再下载一次)。一次调用出一张图;单次超时默认 5 分钟。
|
|
176
|
+
|
|
177
|
+
**对话里怎么显示**:插件在 `tool.call.toolview` 里按工具名 `generate_image` 注册了自己的视图,替换宿主默认的工具卡片。
|
|
178
|
+
- 调用进行中(模型写参数时、等 API 时):一块与成图同比例的骨架占位,点阵加一道很淡的扫光(浅色 / 深色主题都可见;系统开了「减少动态效果」时不动)。
|
|
179
|
+
- 成功后:占位收成一行「Generated … at <路径>」。**图本身由助手在回复里用 Markdown 嵌入**——工具说明里要求了这一点,所以同一张图不会在工具卡片和回复里各出现一次。这依赖模型照做;模型没嵌图时,图仍在磁盘上,路径就在那一行文字里。
|
|
180
|
+
- 失败时:一行安静的错误文字。
|
|
181
|
+
|
|
182
|
+
**改图(`edit_image`)**:选好 Provider 与模型后,除了 `generate_image`,模型还会多一个 `edit_image`:把项目里已有的一张图(`image`,必须在项目或保存目录之内)连同提示词、可选蒙版(`mask`,PNG,透明处是允许改的地方)发给 `POST {baseURL}/images/edits`,结果存进保存目录,名字是原图名加 `-edited`,**不覆盖**原图。几条约束照 Codex `imagegen` 技能里记的 Image API:不发 `input_fidelity`、不发 `background`(`gpt-image-2` 都不接受),蒙版只是提示性的、不保证精确形状,输入图与蒙版各小于 50MB。
|
|
183
|
+
|
|
184
|
+
**图片查看器**:工具结果那一行有缩略图和「编辑图片」,点开是全屏查看器,图上叠一层画布,底部一排工具(交互照 Codex):
|
|
185
|
+
|
|
186
|
+
| 工具 | 做什么 | 怎么落到改图 |
|
|
187
|
+
|---|---|---|
|
|
188
|
+
| 标注 | 点开后底部工具栏换成:选择(点选 / 拖动 / Delete 删除)、画笔、文字、形状(直线、箭头、矩形、椭圆、三角形、菱形、五角星、爱心)、颜色(13 个预设色,第一格彩虹点开是自定义取色:明暗方块、色相条、浏览器支持时有取色器、RGB / HEX / HSL 数值框)、橡皮(像素橡皮:一点一点擦掉自己画的,鼠标处有范围圈,大小跟粗细滑块;整条删除用「选择」+ Delete)、撤销 / 重做、退出,最左边的手柄可以把工具栏拖到别处;左边一根竖向滑块调粗细和字号。标注是矢量对象,不是画在位图上的像素 | 带标记的图 + 文字标注的内容 + 说明发给助手,由它调用 `edit_image` |
|
|
189
|
+
| 添加评论 | 拖出一个区域写意见,带编号 | 同上,并把框出的区域做成蒙版,让模型只改框里 |
|
|
190
|
+
| 擦除 | 用画笔涂出要擦的内容 | 面板直接带蒙版让 Host 改图,不经过模型 |
|
|
191
|
+
| 移除背景 | 点击后先确认(它会调用图片模型、产生一次费用) | 先请模型直接输出透明背景,返回的图本身已带透明区域就原样采用;否则让模型把主体放到纯绿 `#00ff00` 底上,再在浏览器里把绿色抠成透明(`gpt-image-2` 不返回真 alpha,做法同 Codex 的 `remove_chroma_key.py`),存成 `-cutout.png` |
|
|
192
|
+
| 调整大小 | 输入宽高(可锁定比例) | 浏览器里直接缩放,存成 `-<宽>x<高>.png`,不调用模型 |
|
|
193
|
+
|
|
194
|
+
所有结果都存在原图旁边、不覆盖旧文件,可以用「上一版」退回。「发送给助手」会在**当前会话**里发一条新消息:缩小到长边 1536 以内的标注图作为图片、原图与蒙版的路径和每条意见作为文字;模型按 `wukong-imagegen` 技能的说明处理(原图当 `image`、不保留红色标记)。限制:没有明确主体的图(比如整个房间)模型常常不会换成绿底,这时会提示失败并告诉你边缘实际的颜色;抠色对「主体里有大片绿色」的图不友好(叶子、草会被部分抠掉);`gpt-image-2` 的蒙版不保证像素级精确。
|
|
195
|
+
|
|
196
|
+
**技能(`wukong-imagegen`)**:两个工具注册的同时,插件会注入一个只给模型用的技能,写明怎么写图片提示词、编辑时「只改 X、保留 Y」、收到标注图怎么办、透明背景怎么做、尺寸与质量怎么选。内容改写自 OpenAI Codex 的 `imagegen` 技能(Apache-2.0)。工具没注册(没选好模型)时它也不注入,不占上下文。
|
|
197
|
+
|
|
198
|
+
**错误码**(`code` 是稳定的机器键,面板与工具据此选文案):`imagegen-unset`(没选 Provider / 模型)· `imagegen-route`(Provider 在当前部署里解析不出端点或凭据)· `imagegen-prompt`(提示词为空)· `imagegen-http`(非 2xx)· `imagegen-network` · `imagegen-timeout` · `imagegen-aborted` · `imagegen-format`(响应不是 JSON)· `imagegen-empty`(响应里没有图)· `imagegen-download`(`url` 下载失败)· `imagegen-image`(要改的图读不到 / 太大 / 不是 PNG、JPEG、WebP)· `imagegen-path`(图在项目与保存目录之外)。
|
|
199
|
+
|
|
200
|
+
> 设置里的 `size` / `quality` 等偏好缺失或非法时回落到默认值;只有 Provider 与模型必须由你选。**更新插件后需要重启 dsh**(工具的注册 / 卸载挂在 tools 服务上,随设置变化自动进行);只改面板视图的样式时刷新页面即可。
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
157
204
|
## 🗄️ 状态与数据
|
|
158
205
|
|
|
159
206
|
0.12.0 起,Wukong 不再使用 harness 的 settings 命名空间:全部托管状态放在插件自己的文档与目录里。
|
|
160
207
|
|
|
161
208
|
| 路径 | 内容 |
|
|
162
209
|
|---|---|
|
|
163
|
-
| `$DSH_HOME/wukong/state.json`(默认 `~/.dsh/wukong/state.json`) | 提示词、托管技能、自定义命令、MCP 服务器、壁纸/特效设置(壁纸只存 id
|
|
210
|
+
| `$DSH_HOME/wukong/state.json`(默认 `~/.dsh/wukong/state.json`) | 提示词、托管技能、自定义命令、MCP 服务器、壁纸/特效设置(壁纸只存 id)、生图设置(Provider / 模型 / 默认尺寸等;端点与密钥不存这里) |
|
|
164
211
|
| `$DSH_HOME/wukong/wallpapers/` | 上传的壁纸 / 视频字节 |
|
|
165
212
|
| `$DSH_HOME/skills/` | zip / 目录方式安装的技能(官方 filesystem 技能 provider 扫描并监听该根目录) |
|
|
166
213
|
| `$DSH_HOME/wukong/exports/` | 对话导出 zip |
|
|
@@ -172,6 +219,7 @@ dsh web # 或直接重启 DSH Desktop 客户端
|
|
|
172
219
|
| `GET` / `POST /api/wukong/state` | 读写状态文档(面板的增删改查都走这里):读返回 `{ok, revision, state}`;写收 `{state, ifRevision}`,每次写入都会归一化文档并让 `revision` 加一 |
|
|
173
220
|
| `GET /api/wukong/skills` | 面板要的技能 + 托管命令目录:`{ok, revision, skills, commands}`,不必再从整份状态文档里重建 |
|
|
174
221
|
| `GET /api/wukong/models` | 提示词增强可固定的模型列表:宿主模型选择器用的同一份目录(`sessionController.modelCatalog()`),按提供商分组;宿主没有该服务时回 503,面板退回手填 |
|
|
222
|
+
| `GET /api/wukong/imagegen/file?path=` · `POST /api/wukong/imagegen/edit` · `POST /api/wukong/imagegen/save` | 图片查看器用:读一张图给 `<img>` 显示 / 不经过模型直接改图(擦除、移除背景,`persist:false` 时不落盘)/ 把面板算出的图(缩放、抠色、蒙版)另存在原图旁边。只认绝对路径下按魔数判定的 PNG / JPEG / WebP,结果一律不覆盖旧文件 |
|
|
175
223
|
| `POST /api/wukong/mcp/test` | 一次性 MCP 连接测试 |
|
|
176
224
|
| `GET /api/wukong/market` · `POST /api/wukong/market/install` | 扩展市场:按 `kind=mcp\|skill` 与 `q` 搜索聚合目录(官方 MCP Registry、DSH MCP Market、ClawHub、SkillsMP + 随包精选),安装时只接受显式条目 id;MCP 需要环境变量时以禁用状态装好并返回 `needsEnv` |
|
|
177
225
|
| `POST /api/wukong/skills/zip` | 上传 zip 技能包并解压到 `$DSH_HOME/skills` |
|
|
@@ -283,6 +331,7 @@ DSH 运行时(0.2.0-rc.2)
|
|
|
283
331
|
|
|
284
332
|
- **插件包一个包,两个面**:`dsh-plugin-wukong` 的 `package.json` 里 `dsh.bundle.patch` 指向自己的 `cordis.patch.yml`(唯一的 Host 行 `id: wukong`),同时 `dsh.client`(`platform: web` + `inject`)指向 `exports["./client"]` 的 `client/client.js`。面板由**同一个条目**的 `dsh.client` 字段发现,所以**不需要第二个插件包、也不需要第二条 loader 行**;安装器是另一个包(`dsh-plugin-wukong-cli`,不是 bundle)。
|
|
285
333
|
- **Host 侧**持有提示词/技能/命令/MCP/壁纸的 CRUD 与持久化(`$DSH_HOME/wukong/state.json`),通过 `ctx.systemPrompt.section` 按作用域注入提示词(关闭插值)、`ctx.skills.register` 注册技能;并注册 `/api/wukong/*` 与 `/api/wukong-wallpaper/*` 路由(状态读写、技能目录、MCP 测试、zip 技能、对话导入导出、会话删除、使用统计、版本检查、一键更新)。
|
|
334
|
+
- **生图工具**由 Host 在 `ctx.inject(['tools'])` 的独立 fiber 里注册 `generate_image`(`ctx.tools.register`)——只有选好 Provider 与模型才注册,保存 / 清除设置时立即注册或卸载;设置、Provider 路由与附件服务都按次读取;对话展示视图由面板侧在 `tool.call.toolview` 按工具名注册。
|
|
286
335
|
- **面板侧**通过插件自有的同源路由读写状态文档,技能目录走插件自己的 `GET /api/wukong/skills`——**不碰 settings 命名空间**,也不直接调 DSH 内部,更不依赖 `api-remotes` / `sessions` 这类远程 API。面板的装载声明只列真实存在的包:`dsh.client.inject` 为 `@deepseek-ai/dsh-client-locale`、`@deepseek-ai/dsh-client-ui-settings`;其 cordis service inject 为 `['slots','locale']`。
|
|
287
336
|
- **可选 peer**:`@deepseek-ai/*` 运行时包与 `react` 全部在 `peerDependenciesMeta` 里标为 `optional`,运行时 `dependencies` 为空。原因是这些运行时包不在公共 npm 源上,写成必选 peer 会让 `pnpm add` 直接 `ERR_PNPM_FETCH_404` 失败;标成可选后 pnpm 能顺利安装,模块仍由宿主在运行时提供。
|
|
288
337
|
- **安装器**(`dsh-plugin-wukong-cli`)只做标准三件事:`pnpm add`、选 bundle、清理旧拷贝式安装——web 与 desktop profile 共用同一套机制。
|
package/dist/cli.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';const Ru=x;(function(s,i){const RD=x,h=s();while(!![]){try{const o=-parseInt(RD(0x18d))/0x1*(-parseInt(RD(0x183))/0x2)+parseInt(RD(0x14b))/0x3+parseInt(RD(0x125))/0x4*(-parseInt(RD(0x133))/0x5)+parseInt(RD(0x129))/0x6*(parseInt(RD(0x15b))/0x7)+-parseInt(RD(0x13f))/0x8*(parseInt(RD(0x197))/0x9)+parseInt(RD(0x19d))/0xa+-parseInt(RD(0x118))/0xb*(parseInt(RD(0x145))/0xc);if(o===i)break;else h['push'](h['shift']());}catch(a){h['push'](h['shift']());}}}(u,0xa2eb9));var W=Object[Ru(0x12f)],l=(s,i)=>W(s,Ru(0x182),{'value':i,'configurable':!0x0});const {existsSync:f,mkdirSync:O,readFileSync:k,readdirSync:q,realpathSync:B,rmSync:y,writeFileSync:$}=require(Ru(0x180)),{homedir:D}=require(Ru(0xfe)),{basename:g,dirname:_,join:c}=require(Ru(0x18a)),{execFileSync:F,spawnSync:w}=require(Ru(0x193)),E=__dirname,d=Ru(0xff),Y=Ru(0x189),P=[Ru(0x142),Ru(0x106)],L=[Ru(0x106),Ru(0x161)],A=Ru(0x143),U=Ru(0x113),V=[Ru(0x175),Ru(0x114),Ru(0x11c)],m=process.env.DSH_HOME??c(D(),Ru(0x170)),b=c(m,Ru(0x16a)),J=c(m,Ru(0x174)),z=0x4*0x400*0x400;function S(...s){const RL=Ru;return process[RL(0x181)][RL(0x17e)](0x2)[RL(0x1a3)](i=>s[RL(0x17b)](i));}function x(R,Y){R=R-0xf8;const C=u();let Z=C[R];if(x['MsMzHc']===undefined){var Q=function(P){const F='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let s='',z='';for(let y=0x0,O,M,i=0x0;M=P['charAt'](i++);~M&&(O=y%0x4?O*0x40+M:M,y++%0x4)?s+=String['fromCharCode'](0xff&O>>(-0x2*y&0x6)):0x0){M=F['indexOf'](M);}for(let h=0x0,S=s['length'];h<S;h++){z+='%'+('00'+s['charCodeAt'](h)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(z);};x['mBKxin']=Q,x['escNUp']={},x['MsMzHc']=!![];}const D=C[0x0];x['OaHqwf']!==D&&(x['escNUp']={},x['OaHqwf']=D);const L=x['escNUp'][R];return L===undefined?(Z=x['mBKxin'](Z),x['escNUp'][R]=Z):Z=L,Z;}l(S,Ru(0xf8));function K(i){const Rx=Ru,h=process[Rx(0x181)][Rx(0x17e)](0x2);for(let a=0x0;a<h[Rx(0x158)];a+=0x1){const p=h[a];if(p==='--'+i){const v=h[a+0x1];return v!==void 0x0&&!v[Rx(0x1a2)]('-')?v:void 0x0;}if(p[Rx(0x1a2)]('--'+i+'='))return p[Rx(0x17e)](i[Rx(0x158)]+0x3);}}l(K,Ru(0x11b));function C(){const RP=Ru,i=[],h=process[RP(0x181)][RP(0x17e)](0x2);for(let a=0x0;a<h[RP(0x158)];a+=0x1){const p=h[a];if(p===RP(0x186)||p==='-p'){const v=h[a+0x1];v!==void 0x0&&!v[RP(0x1a2)]('-')&&(i[RP(0x14e)](...v[RP(0x165)](',')),a+=0x1);continue;}p[RP(0x1a2)](RP(0x154))&&i[RP(0x14e)](...p[RP(0x17e)](0xa)[RP(0x165)](','));}return i[RP(0xfd)](r=>r[RP(0x196)]())[RP(0x1a7)](r=>r!=='');}l(C,Ru(0x103));function Q(){const RF=Ru;if(!f(J))return;const s=k(J,RF(0x192))[RF(0x158)];s>z&&(console[RF(0x10f)](RF(0x1a8)+(s/0x400/0x400)[RF(0x11a)](0x1)+RF(0x188)),console[RF(0x10f)](RF(0x13b)));}l(Q,Ru(0xfc));const j=[0x0,0x2,0x0];function X(){const Rs=Ru;try{const h=process[Rs(0x119)]===Rs(0x16f)?Rs(0x151):Rs(0x11f),a=F(h,[Rs(0x137)],{'encoding':Rs(0x192)})[Rs(0x165)]('\x0a')[0x0][Rs(0x196)]();if(a==='')return;let p=_(B(a));for(let v=0x0;v<0x8;v+=0x1){const R0=c(p,Rs(0x147));if(f(R0)){const R2=JSON[Rs(0x163)](k(R0,Rs(0x192)));if(R2[Rs(0x182)]===Rs(0x131))return R2[Rs(0x19c)];}const R1=_(p);if(R1===p)break;p=R1;}}catch{}}l(X,Ru(0x18b));function Z(){const Rz=Ru,s=X();if(s===void 0x0)return;console[Rz(0x105)](Rz(0x101)+s);const i=s[Rz(0x126)](/^[^0-9]*/,'')[Rz(0x165)]('.')[Rz(0xfd)](h=>Number[Rz(0x177)](h,0xa)||0x0);(i[0x0]<j[0x0]||i[0x0]===j[0x0]&&i[0x1]<j[0x1])&&(console[Rz(0x10f)](Rz(0x199)+j[Rz(0x1a6)]('.')+Rz(0x160)),console[Rz(0x10f)](Rz(0x115)));}l(Z,Ru(0x10c));function H(){const Ry=Ru;for(const s of[process.env.DSH_PNPM,Ry(0x153)][Ry(0x1a7)](i=>typeof i==Ry(0x172)&&i!==''))if(w(s,[Ry(0x12d)],{'encoding':Ry(0x192)})[Ry(0x134)]===0x0)return s;}l(H,Ru(0x19f));function M(){const RO=Ru;if(!f(b))return[];const s=[];for(const i of q(b)){const h=c(b,i);f(c(h,RO(0x147)))&&f(c(h,RO(0x1a9)))&&s[RO(0x14e)](h);}return s;}l(M,Ru(0x195));function ee(h=[]){const RM=Ru;f(b)||O(b,{'recursive':!0x0});const a=[{'name':RM(0x15c),'bundles':[RM(0x1a1),RM(0x156)]},{'name':RM(0x11e),'bundles':[RM(0x1a1),RM(0x156)]}],p=h[RM(0x1a7)](R1=>!a[RM(0x1a3)](R2=>R2[RM(0x182)]===R1));for(const R1 of p)a[RM(0x14e)]({'name':R1,'bundles':[RM(0x1a1),RM(0x156)]});const v=h[RM(0x158)]===0x0?a:a[RM(0x1a7)](R2=>h[RM(0x17b)](R2[RM(0x182)])),R0=[];for(const R2 of v){const R3=c(b,R2[RM(0x182)]);O(c(R3,RM(0x1a9)),{'recursive':!0x0});const R4=c(R3,RM(0x147));f(R4)||($(R4,JSON[RM(0x162)]({'name':RM(0x146)+R2[RM(0x182)],'private':!0x0,'dependencies':{},'dsh':{'profile':{'bundles':R2[RM(0x130)]}}},null,0x2)),console[RM(0x105)](RM(0x140)+R3)),R0[RM(0x14e)](R3);}return R0;}l(ee,Ru(0x108));function G(h,a){const Ri=Ru;if(a[Ri(0x158)]===0x0)return h;const p=h[Ri(0x1a7)](R0=>a[Ri(0x17b)](g(R0))),v=new Set(p[Ri(0xfd)](R0=>g(R0))),r=a[Ri(0x1a7)](R0=>!v[Ri(0x164)](R0));if(r[Ri(0x158)]>0x0){console[Ri(0x10f)](Ri(0x107)+r[Ri(0x1a6)](',\x20'));const R0=h[Ri(0xfd)](R1=>g(R1));console[Ri(0x10f)](Ri(0x19e)+(R0[Ri(0x158)]>0x0?R0[Ri(0x1a6)](',\x20'):Ri(0x112)));}if(p[Ri(0x158)]!==0x0)return p;}l(G,Ru(0x117));function N(s){const Rh=Ru,i=c(s,Rh(0x147));if(f(i))try{return JSON[Rh(0x163)](k(i,Rh(0x192)));}catch{console[Rh(0x10f)](Rh(0x10b)+i+Rh(0x102));return;}}l(N,Ru(0x128));function ne(s){const RS=Ru,i=N(s);if(i===void 0x0)return;const h=i[RS(0x137)]?.[RS(0x18e)]?.[RS(0x130)]??[];if(h[RS(0x17b)](d)){console[RS(0x105)](RS(0x11d)+d+RS(0x150)+g(s)+RS(0x178));return;}h[RS(0x14e)](d),i[RS(0x137)]={...i[RS(0x137)]??{},'profile':{...i[RS(0x137)]?.[RS(0x18e)]??{},'bundles':h}},$(c(s,RS(0x147)),JSON[RS(0x162)](i,null,0x2)+'\x0a'),console[RS(0x105)](RS(0x19a)+d+RS(0x14f)+g(s)+RS(0x178));}l(ne,Ru(0x12b));function oe(s){const RJ=Ru,i=N(s);if(i===void 0x0)return;const h=i[RJ(0x137)]?.[RJ(0x18e)]?.[RJ(0x130)]??[];if(!h[RJ(0x17b)](d)){console[RJ(0x105)](RJ(0x11d)+d+RJ(0x12e)+g(s)+RJ(0x178));return;}const a=h[RJ(0x1a7)](p=>p!==d);i[RJ(0x137)]={...i[RJ(0x137)]??{},'profile':{...i[RJ(0x137)]?.[RJ(0x18e)]??{},'bundles':a}},$(c(s,RJ(0x147)),JSON[RJ(0x162)](i,null,0x2)+'\x0a'),console[RJ(0x105)](RJ(0x18c)+d+RJ(0x14f)+g(s)+RJ(0x178));}l(oe,Ru(0x141));function se(s,i,h){const RN=Ru;console[RN(0x105)](RN(0x194)+i+RN(0x138)+s+')');const a=w(h,[RN(0x132),i],{'cwd':s,'stdio':RN(0x16e)});return a[RN(0x134)]!==0x0?(console[RN(0x10f)](RN(0x1aa)+(a[RN(0x134)]??RN(0x14d)+String(a[RN(0x17c)]))+')'),!0x1):!0x0;}l(se,Ru(0xfa));function te(s,i){const RA=Ru,h=N(s);return(h?.[RA(0x16c)]?.[d]??h?.[RA(0x17d)]?.[d])===void 0x0?(console[RA(0x105)](RA(0x11d)+d+RA(0x15f)+g(s)),!0x1):(console[RA(0x105)](RA(0x14a)+d+RA(0x138)+s+')'),w(i,[RA(0x166),d],{'cwd':s,'stdio':RA(0x16e)})[RA(0x134)]!==0x0?(console[RA(0x10f)](RA(0x155)),!0x1):!0x0);}l(te,Ru(0x10a));function R(h,a){const Rq=Ru,p=N(h);if(p!==void 0x0){const v=p[Rq(0x137)]?.[Rq(0x18e)]?.[Rq(0x130)]??[],r=v[Rq(0x1a7)](R0=>!P[Rq(0x17b)](R0));if(r[Rq(0x158)]!==v[Rq(0x158)]&&(p[Rq(0x137)]={...p[Rq(0x137)]??{},'profile':{...p[Rq(0x137)]?.[Rq(0x18e)]??{},'bundles':r}},$(c(h,Rq(0x147)),JSON[Rq(0x162)](p,null,0x2)+'\x0a'),console[Rq(0x105)](Rq(0x121)+v[Rq(0x1a7)](R0=>P[Rq(0x17b)](R0))[Rq(0x1a6)](',\x20'))),a!==void 0x0){for(const R0 of[...P,...L])p[Rq(0x16c)]?.[R0]===void 0x0&&p[Rq(0x17d)]?.[R0]===void 0x0||w(a,[Rq(0x166),R0],{'cwd':h,'stdio':Rq(0x16e)});}}for(const R1 of L){const R2=R1[Rq(0x17e)](0xd),R3=c(h,Rq(0x1a9),Rq(0x144),R2);f(R3)&&(y(R3,{'recursive':!0x0,'force':!0x0}),console[Rq(0x105)](Rq(0x13c)+R1));}ie(h);}l(R,Ru(0x171));function T(){const Rm=Ru;for(const s of V){const i=c(m,s);f(i)&&(y(i,{'recursive':!0x0,'force':!0x0}),console[Rm(0x105)](Rm(0x13d)+i));}}l(T,Ru(0x15a));function ie(R0){const Ro=Ru,R1=c(R0,Ro(0x124));if(!f(R1))return;const R2=k(R1,Ro(0x192)),R3=Ro(0xfb);if(!R2[Ro(0x17b)](R3)&&!new RegExp(Ro(0x176)+A+Ro(0x152),'m')[Ro(0x120)](R2))return;const R4=R2[Ro(0x165)]('\x0a')[Ro(0xfd)](R9=>R9[Ro(0x126)](/\r$/,'')),R5=R4[Ro(0x15d)](R9=>R9[Ro(0x196)]()===Ro(0x176)+A);let R6=R5,R7=R5+0x1;if(R5===-0x1)R6=R4[Ro(0x15d)](R9=>R9[Ro(0x196)]()===R3),R7=R6+0x1;else{const R9=l(RY=>RY[Ro(0x158)]-RY[Ro(0x149)]()[Ro(0x158)],Ro(0x157)),RR=R9(R4[R5]);for(let RY=R5-0x1;RY>=0x0;RY-=0x1){const RC=R4[RY][Ro(0x196)]();if(RC!==''){if(RC===Ro(0xf9)&&R9(R4[RY])<RR){R6=RY;break;}if(R9(R4[RY])<RR)break;}}for(let RZ=R5+0x1;RZ<R4[Ro(0x158)];RZ+=0x1){const RQ=R4[RZ][Ro(0x196)]();if(RQ!==''){if(R9(R4[RZ])>RR){R7=RZ+0x1;continue;}if(RQ===Ro(0xf9)||R9(R4[RZ])>R9(R4[R6])){R7=RZ+0x1;continue;}break;}}R6>0x0&&R4[R6-0x1][Ro(0x196)]()===R3&&(R6-=0x1);}if(R6===-0x1)return;const R8=[...R4[Ro(0x17e)](0x0,R6),...R4[Ro(0x17e)](R7)];for(;R8[Ro(0x158)]>0x0&&R8[R8[Ro(0x158)]-0x1][Ro(0x196)]()==='';)R8[Ro(0x179)]();R8[Ro(0x158)]===0x0?(y(R1,{'force':!0x0}),console[Ro(0x105)](Ro(0x191))):($(R1,R8[Ro(0x1a6)]('\x0a')+'\x0a'),console[Ro(0x105)](Ro(0x187)+R1));}l(ie,Ru(0x12a));function re(s){const Rc=Ru,i=c(s,Rc(0x1a9),d,Rc(0x147));if(f(i))try{return JSON[Rc(0x163)](k(i,Rc(0x192)))[Rc(0x19c)];}catch{return;}}l(re,Ru(0x116));function I(){const RW=Ru;for(const s of[E,c(E,'..')])try{return JSON[RW(0x163)](k(c(s,RW(0x147)),RW(0x192)))[RW(0x19c)];}catch{}return RW(0x1a4);}l(I,Ru(0x190));function le(){const RE=Ru,a=K(RE(0x111))??d+'@'+I(),p=H();p===void 0x0&&(console[RE(0x10f)](RE(0x12c)),process[RE(0x135)](0x1));let v=M();const R0=C(),R1=ee(R0);for(const R4 of R1)v[RE(0x17b)](R4)||v[RE(0x14e)](R4);const R2=G(v,R0);R2===void 0x0&&process[RE(0x135)](0x1),v=R2,v[RE(0x158)]===0x0&&(console[RE(0x10f)](RE(0x104)),process[RE(0x135)](0x1)),R0[RE(0x158)]>0x0&&console[RE(0x105)](RE(0x167)+R0[RE(0x1a6)](','));let R3=0x0;for(const R5 of v){if(console[RE(0x105)](RE(0x17f)+R5),R(R5,p),!se(R5,a,p)){R3+=0x1;continue;}ne(R5);const R6=re(R5);console[RE(0x105)](RE(0x110)+d+(R6===void 0x0?'':'\x20'+R6)+RE(0x168));}R3===0x0&&T(),console[RE(0x105)](''),R3>0x0&&(console[RE(0x10f)](RE(0x10b)+R3+RE(0x139)),process[RE(0x135)](0x1)),console[RE(0x105)](RE(0x169)),console[RE(0x105)](RE(0x10e)),console[RE(0x105)](''),console[RE(0x105)](RE(0x198)),console[RE(0x105)](RE(0x184)),console[RE(0x105)](RE(0x15e));}l(le,Ru(0x10d));function ce(){const RV=Ru;console[RV(0x105)](RV(0x1a0)),console[RV(0x105)](RV(0x127)+m);const i=H(),h=C(),a=G(M(),h);if(a===void 0x0&&process[RV(0x135)](0x1),a[RV(0x158)]===0x0)console[RV(0x105)](RV(0x14c));else{for(const v of a)console[RV(0x105)](RV(0x17f)+v),i===void 0x0?console[RV(0x10f)](RV(0x159)):te(v,i),oe(v),R(v,i);}const p=c(m,U);f(p)&&(y(p,{'recursive':!0x0,'force':!0x0}),console[RV(0x105)](RV(0x13e)+p)),T(),console[RV(0x105)](''),console[RV(0x105)](RV(0x16d)),console[RV(0x105)](RV(0x109)+c(m,RV(0x18f))+RV(0x1a5));}l(ce,Ru(0x16b));function ae(){const RK=Ru;console[RK(0x105)](RK(0x173));}function u(){const Ra=['icdINjmG','C3bLyW','kg5VBMuP','D3vRB25N','D2fSBhbHCgvYCW','icaGie9Uig9SzgvYihj1BNrPBwvZihrOzsbWBhvNAw4Gy2fUBM90ig1VDw50oIb0AguGCgfUzwWGC3rHExmGAgLKzgvUigfUzcb0AguGCM91DgvZidqWnc4','Aw5ZDgfSBgvKvMvYC2LVBG','C2vSzwn0uhjVzMLSzxm','mtiZnJqYotDQsg54ywy','CgXHDgzVCM0','Dg9gAxHLza','B3b0Aw9U','yxjTB3j5lwv4Cg9YDhm','icdcTYa','zgvZA3rVCa','D2HPy2G','DgvZDa','icdINjmGzhjVChbLzcbSzwDHy3KGyNvUzgXLig5HBwuOCYKG','icHPBNn0ywXSCYa','DxnHz2u','y29YzgLZlNbHDgnOlNLTBa','mtK4nJHqyxr6DwK','CMvWBgfJzq','icbOyxjUzxnZigHVBwu6ia','CMvHze1HBMLMzxn0','otqYvuvmzvnQ','CMvTB3zLtgvNywn5ugf0y2HsB3C','ywrKqNvUzgXL','icdINjyGCg5WBsbUB3qGzM91BMqG4OcuigeGChjVzMLSzsbPBNn0ywXSieLtigeGCg5WBsbKzxbLBMrLBMn5lcbZBYbWBNbTigLZihjLCxvPCMvK','ls12zxjZAw9U','ig5VDcbZzwXLy3rLzcbPBIa','zgvMAw5LuhjVCgvYDhK','yNvUzgXLCW','qgrLzxbZzwvRlwfPl2rZAa','ywrK','nJCWvKnPvNLX','C3rHDhvZ','zxHPDa','BwfPBG','zhnO','icaOAw4G','ihbYB2zPBguOCYKGzMfPBgvKiokaLcbZzwuGDgHLihbUCg0GB3v0Chv0igfIB3zL','ls11BMLUC3rHBgW','icaGie1VDMuGBgfYz2uGyMXVyNmGB3v0ig9MihrOzsbZzxr0Aw5NCYbKB2n1BwvUDcbVCIb0AguGy2XPzw50ig1HEsbLBNrLCIbYzwnVDMvYEsbTB2rLlG','icdINjmGCMvTB3zLzcbSzwDHy3KG','icdINjmGCMvTB3zLzcbSzwDHy3KGzgf0ysa','icdINjmGCMvTB3zLzca','ogjAvvPKzW','icdINjmGy3jLyxrLzcbWCM9MAwXLia','CMvTB3zLqNvUzgXL','zhnOlxn3AxrJAgjSywrL','DwKTC3DPDgnOyMXHzgu','qgrLzxbZzwvRlwfP','mtjNA1roANC','zhnOlxbYB2zPBguT','CgfJA2fNzs5QC29U','icaOCg9ZDgLUC3rHBgWGAg9VAYdIGjqGBM8GChjVzMLSzsbPBNn0ywXSigHLCMuP','DhjPBvn0yxj0','icbWBNbTihjLBw92zsa','mJC5oda4mM5pyvzmvG','icdcTYbUBYbWCM9MAwXLCYbMB3vUzcdIGjqGBM90AgLUzYb0BYb1BMLUC3rHBgW','C2LNBMfSia','ChvZAa','igLUia','igfSCMvHzhKGC2vSzwn0zwqGAw4G','D2HLCMu','xhmQja','Cg5WBq','ls1WCM9MAwXLpq','icdINjyGCg5WBsbYzw1VDMuGzMfPBgvKiokaLcbYzw1VDMLUzYb0AguGzgLYzwn0B3j5igrPCMvJDgX5','qgrLzxbZzwvRlwfPl2rZAc13zwiTyxbW','Aw5Kzw50t2y','BgvUz3rO','icdIMQaGCg5WBsbUB3qGzM91BMqG4OcuigrYB3bWAw5NihrOzsbIDw5KBguGC2vSzwn0Aw9UlcbSzwf2Aw5NihrOzsbKzxbLBMrLBMn5','y2XLyw5mzwDHy3LeyxrH','mtm4odfmrLnprwq','D2vI','zMLUzeLUzgv4','icbtzxr0Aw5NCYdIHPiG5O+s5lU2lcb3AgvYzsb0AguGAgfYBMvZCYbWBhvNAw4GBwfUywDLCIbJyw4GDg9Nz2XLigL0lG','igLZig5VDcbHigrLy2XHCMvKigrLCgvUzgvUy3KGB2yG','icHPBNrLCM5HBcbbueKGz2vUzxjHDgLVBIaWlJiPlG','qgrLzxbZzwvRlwfPl2rZAc1JBgLLBNqTDwKTC3DPDgnOyMXHzgu','C3rYAw5NAwz5','CgfYC2u','AgfZ','C3bSAxq','CMvTB3zL','icbZy29WztOGls1WCM9MAwXLia','ihjLywr5icHOB3n0igj1BMrSzsaRihDLyIbWyw5LBcK','icbozxH0ihn0zxbZoG','ChjVzMLSzxm','Dw5PBNn0ywXS','zgvWzw5Kzw5JAwvZ','icbeB25LlIbuAguGCgX1z2LUigfUzcbPDhmGzgf0ysbHCMuGCMvTB3zLzdSGCMvSyxvUy2GGrfniierLC2T0B3aGDg8GCMvMCMvZAc4','Aw5OzxjPDa','D2LUmZi','lMrZAa','y2XLyw5mzwDHy3LjBNn0ywXS','C3rYAw5N','vxnHz2u6ihD1A29UzYbBB3b0Aw9UC10Gw3vUAw5ZDgfSBf0kcKLUC3rHBgXZihrOzsbKC2GTCgX1z2LUlxD1A29UzYbWBhvNAw4GyNvUzgXLigLUDg8GzxzLCNKGAgfYBMvZCYbWCM9MAwXLicHVCIb0AguGB25LcM5HBwvKigj5ic0TChjVzMLSzsK6ihbUCg0GywrKicSGyNvUzgXLihjLz2LZDhjHDgLVBI4GtM90AgLUzYbPCYbJAgfUz2vKihvUDgLScNrOzsbPBNn0ywXSigfJDhvHBgX5ihn0yxj0CYWGC28Gls1OzwXWlY0TDMvYC2LVBIbHCMuGywX3yxLZihnHzMuGDg8GCNvUlGOkt3b0Aw9UCZOkicaTlxbYB2zPBguGpg5HBwu+icaGAw5ZDgfSBcbPBNrVig9UzsbWCM9MAwXLig9UBhKGkgrLzMf1Bhq6igfSBcbWCM9MAwXLCYKkicaTlxnWzwmGphnWzwm+icaGicaGAw5ZDgfSBcbHBIbLEhbSAwnPDcbZCgvJoIbUCg0GBMfTzsWGBg9JywWGCgf0AcWGDgfYyMfSBcbVCIbNAxqkicaGicaGicaGicaGicaGicaGicaGywrKCMvZCYaOzgvMyxvSDdOGzhnOlxbSDwDPBI13DwTVBMDapgLUC3rHBgXLCIb2zxjZAw9UpIKkicaTlxbVC3rPBNn0ywXSicaGicaGDgHLig5WBsbWB3n0Aw5ZDgfSBcbOB29RicHKB2vZig5VDgHPBMCGyNKGAxrZzwXMkqOGic1OlcaTlwHLBhaGicaGicaGicbZAg93ihrOAxmGAgvSCaOGic12lcaTlxzLCNnPB24GicaGicbZAg93ihrOzsbPBNn0ywXSzxiGDMvYC2LVBGOkq29TBwfUzhm6cIaGDw5PBNn0ywXSicaGicaGicaGihjLBw92zsb0AguGCgX1z2LUlcbPDhmGyNvUzgXLihjVDYbHBMqGAxrZigrHDgek','C2v0DgLUz3mUEwfTBa','C3DPDgnOyMXHzgu','lsbPzdOG','CgfYC2vjBNq','l3bHy2THz2uUANnVBG','Cg9W','ls1WB3n0Aw5ZDgfSBa','Aw5JBhvKzxm','C2LNBMfS','zgv2rgvWzw5Kzw5JAwvZ','C2XPy2u','icbWCM9MAwXLoIa','BM9KztPMCW','yxjNDG','BMfTzq','mtHjuLLoExa','icbuAguGCgX1z2LUigLZigfSC28GBgLZDgvKigfZicjKC2GTCgX1z2LUlxD1A29UzYiGB24GDgHLihnPzgvIyxiG5O+s5lU2ihbHz2uGlW','ls1OzwXW','ls1WCM9MAwXL','icdINjmGCMvTB3zLzcbSzwDHy3KGCgfUzwWGCM93igzYB20G','tuiG4Ocuig92zxiGDgHLidrnqIbJBgLLBNqGBgLTAxqU','zhnOlxbSDwDPBI13DwTVBMCTy2XP','BM9KztPWyxrO','zgv0zwn0sgfYBMvZC1zLCNnPB24','icdINjmGDw5ZzwXLy3rLzcbIDw5KBguG','ody5mdzTywrJrNO','ChjVzMLSzq','C2TPBgXZ','CgfJA2fNzvzLCNnPB24','icdINjmGCMvTB3zLzcbSzwDHy3KGCgfUzwWGCM93icHWyxrJAcbMAwXLigLZigvTChr5lcbKzwXLDgvKkq','DxrMoa','BM9KztPJAgLSzf9WCM9JzxnZ','icbWBNbTigfKzca','zMLUzfbYB2zPBgvZ','DhjPBq','odaYmti1oufhuwPMvG','icbuAguGCgfUzwWGAxmGyxqGu2v0DgLUz3mG4OAsifD1A29UzYaOyM9VAYbPy29Uks4','icdIMQaGDgHPCYbWBhvNAw4GyNvPBgqGDgfYz2v0CYbazgvLChnLzwSTywKVzhnOid49ia','icdINjmGC2vSzwn0zwqGyNvUzgXLia','AgvSCa','DMvYC2LVBG','mtmYmtK5odb4uwPLzu8','icaGigf2ywLSywjSzsbWCM9MAwXLCZOG','zMLUzfbUCg0','zhnOlxbSDwDPBI13DwTVBMCGDw5PBNn0ywXSzxi','qgrLzxbZzwvRlwfPl2rZAc1IyxnL','C3rHCNrZv2L0Aa','C29Tzq','mc4WlJa','igfYzsbRzxb0ig9Uihb1CNbVC2uUkq','AM9PBG','zMLSDgvY','icdIMQaGC2v0DgLUz3mUEwfTBcbPCYa','BM9Kzv9TB2r1BgvZ','icdINjyGCg5WBsbHzgqGzMfPBgvKicHLEgL0ia','zMXHzW','lsbPBNnLCNq6','ywrKrgvWzw5Kzw5JEq','iYbqCM9TChqTu2TPBgXbCM1VCNKGy2XPzw50ihbHBMvSlG','AgvHBhrOq2HLy2S','BwfW','BM9KztPVCW','zhnOlxbSDwDPBI13DwTVBMC','zhnOlxbSDwDPBI13DwTVBMCGAw5ZDgfSBgvY','icbOyxjUzxnZoIbazgvLChnLzwSTywKVzhnOia','igLZig5VDcb2ywXPzcbku09oiokaLcbMAxGGAxqGzMLYC3q','CMvXDwvZDgvKuhjVzMLSzxm','icdINjyGBM8GChjVzMLSzxmGyxzHAwXHyMXL','Bg9N','qgrLzxbZzwvRlwfPl2rZAc1ZD2L0y2HIBgfKzq','icdINjyGBM8GC3vJAcbWCM9MAwXLoIa','zw5ZDxjLuhjVzMLSzxm','icaOu2TPBgXZigv4DhjHy3rLzcb1BMrLCIa','CMvTB3zLrgvWzw5Kzw5JEq','icdINjyG','AgfYBMvZC0nOzwnR','Aw5ZDgfSBa','icaGigrZAcb3zwiGicaGicaGicaGicaOB3iGCMvSyxvUy2GGDgHLiertscbezxnRDg9WignSAwvUDcK','zxjYB3i'];u=function(){return Ra;};return u();}l(ae,Ru(0x123));function de(){const RX=Ru;if(S('-h',RX(0x185),RX(0x19b))){ae();return;}if(S('-v',RX(0x12d))){console[RX(0x105)](Y+'\x20'+I()+RX(0x122)+d+'@'+I()+')');return;}if(console[RX(0x105)](RX(0x100)),console[RX(0x105)](RX(0x127)+m),S(RX(0x17a))){console[RX(0x105)](RX(0x148));return;}if(S(RX(0x16b),RX(0x13a))){ce();return;}Q(),Z(),le();}l(de,Ru(0x136)),de();
|
|
2
|
+
'use strict';const Om=h;(function(s,o){const OQ=h,a=s();while(!![]){try{const e=-parseInt(OQ(0x18d))/0x1*(-parseInt(OQ(0x183))/0x2)+parseInt(OQ(0x14b))/0x3+parseInt(OQ(0x125))/0x4*(-parseInt(OQ(0x133))/0x5)+parseInt(OQ(0x129))/0x6*(parseInt(OQ(0x15b))/0x7)+-parseInt(OQ(0x13f))/0x8*(parseInt(OQ(0x197))/0x9)+parseInt(OQ(0x19d))/0xa+-parseInt(OQ(0x118))/0xb*(parseInt(OQ(0x145))/0xc);if(e===o)break;else a['push'](a['shift']());}catch(x){a['push'](a['shift']());}}}(t,0xa2eb9));var W=Object[Om(0x12f)],l=(s,o)=>W(s,Om(0x182),{'value':o,'configurable':!0x0});const {existsSync:f,mkdirSync:O,readFileSync:k,readdirSync:q,realpathSync:B,rmSync:y,writeFileSync:$}=require(Om(0x180)),{homedir:D}=require(Om(0xfe)),{basename:g,dirname:_,join:c}=require(Om(0x18a)),{execFileSync:F,spawnSync:w}=require(Om(0x193)),E=__dirname,d=Om(0xff),Y=Om(0x189),P=[Om(0x142),Om(0x106)],L=[Om(0x106),Om(0x161)],A=Om(0x143),U=Om(0x113),V=[Om(0x175),Om(0x114),Om(0x11c)],m=process.env.DSH_HOME??c(D(),Om(0x170)),b=c(m,Om(0x16a)),J=c(m,Om(0x174)),z=0x4*0x400*0x400;function S(...s){const Os=Om;return process[Os(0x181)][Os(0x17e)](0x2)[Os(0x1a3)](o=>s[Os(0x17b)](o));}function h(O,g){O=O-0xf8;const W=t();let Q=W[O];if(h['MsMzHc']===undefined){var m=function(a){const d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let l='',f='';for(let M=0x0,e,I,G=0x0;I=a['charAt'](G++);~I&&(e=M%0x4?e*0x40+I:I,M++%0x4)?l+=String['fromCharCode'](0xff&e>>(-0x2*M&0x6)):0x0){I=d['indexOf'](I);}for(let X=0x0,S=l['length'];X<S;X++){f+='%'+('00'+l['charCodeAt'](X)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(f);};h['mBKxin']=m,h['escNUp']={},h['MsMzHc']=!![];}const s=W[0x0];h['OaHqwf']!==s&&(h['escNUp']={},h['OaHqwf']=s);const o=h['escNUp'][O];return o===undefined?(Q=h['mBKxin'](Q),h['escNUp'][O]=Q):Q=o,Q;}l(S,Om(0xf8));function K(a){const Oo=Om,x=process[Oo(0x181)][Oo(0x17e)](0x2);for(let i=0x0;i<x[Oo(0x158)];i+=0x1){const r=x[i];if(r==='--'+a){const u=x[i+0x1];return u!==void 0x0&&!u[Oo(0x1a2)]('-')?u:void 0x0;}if(r[Oo(0x1a2)]('--'+a+'='))return r[Oo(0x17e)](a[Oo(0x158)]+0x3);}}l(K,Om(0x11b));function C(){const Oa=Om,a=[],x=process[Oa(0x181)][Oa(0x17e)](0x2);for(let i=0x0;i<x[Oa(0x158)];i+=0x1){const r=x[i];if(r===Oa(0x186)||r==='-p'){const u=x[i+0x1];u!==void 0x0&&!u[Oa(0x1a2)]('-')&&(a[Oa(0x14e)](...u[Oa(0x165)](',')),i+=0x1);continue;}r[Oa(0x1a2)](Oa(0x154))&&a[Oa(0x14e)](...r[Oa(0x17e)](0xa)[Oa(0x165)](','));}return a[Oa(0xfd)](v=>v[Oa(0x196)]())[Oa(0x1a7)](v=>v!=='');}l(C,Om(0x103));function Q(){const Od=Om;if(!f(J))return;const s=k(J,Od(0x192))[Od(0x158)];s>z&&(console[Od(0x10f)](Od(0x1a8)+(s/0x400/0x400)[Od(0x11a)](0x1)+Od(0x188)),console[Od(0x10f)](Od(0x13b)));}l(Q,Om(0xfc));const j=[0x0,0x2,0x0];function X(){const Ol=Om;try{const a=process[Ol(0x119)]===Ol(0x16f)?Ol(0x151):Ol(0x11f),x=F(a,[Ol(0x137)],{'encoding':Ol(0x192)})[Ol(0x165)]('\x0a')[0x0][Ol(0x196)]();if(x==='')return;let u=_(B(x));for(let v=0x0;v<0x8;v+=0x1){const p=c(u,Ol(0x147));if(f(p)){const O1=JSON[Ol(0x163)](k(p,Ol(0x192)));if(O1[Ol(0x182)]===Ol(0x131))return O1[Ol(0x19c)];}const O0=_(u);if(O0===u)break;u=O0;}}catch{}}l(X,Om(0x18b));function Z(){const Of=Om,s=X();if(s===void 0x0)return;console[Of(0x105)](Of(0x101)+s);const o=s[Of(0x126)](/^[^0-9]*/,'')[Of(0x165)]('.')[Of(0xfd)](a=>Number[Of(0x177)](a,0xa)||0x0);(o[0x0]<j[0x0]||o[0x0]===j[0x0]&&o[0x1]<j[0x1])&&(console[Of(0x10f)](Of(0x199)+j[Of(0x1a6)]('.')+Of(0x160)),console[Of(0x10f)](Of(0x115)));}l(Z,Om(0x10c));function H(){const OM=Om;for(const s of[process.env.DSH_PNPM,OM(0x153)][OM(0x1a7)](o=>typeof o==OM(0x172)&&o!==''))if(w(s,[OM(0x12d)],{'encoding':OM(0x192)})[OM(0x134)]===0x0)return s;}l(H,Om(0x19f));function M(){const Oe=Om;if(!f(b))return[];const s=[];for(const a of q(b)){const x=c(b,a);f(c(x,Oe(0x147)))&&f(c(x,Oe(0x1a9)))&&s[Oe(0x14e)](x);}return s;}l(M,Om(0x195));function ee(a=[]){const OI=Om;f(b)||O(b,{'recursive':!0x0});const x=[{'name':OI(0x15c),'bundles':[OI(0x1a1),OI(0x156)]},{'name':OI(0x11e),'bundles':[OI(0x1a1),OI(0x156)]}],v=a[OI(0x1a7)](O1=>!x[OI(0x1a3)](O2=>O2[OI(0x182)]===O1));for(const O1 of v)x[OI(0x14e)]({'name':O1,'bundles':[OI(0x1a1),OI(0x156)]});const p=a[OI(0x158)]===0x0?x:x[OI(0x1a7)](O2=>a[OI(0x17b)](O2[OI(0x182)])),O0=[];for(const O2 of p){const O3=c(b,O2[OI(0x182)]);O(c(O3,OI(0x1a9)),{'recursive':!0x0});const O4=c(O3,OI(0x147));f(O4)||($(O4,JSON[OI(0x162)]({'name':OI(0x146)+O2[OI(0x182)],'private':!0x0,'dependencies':{},'dsh':{'profile':{'bundles':O2[OI(0x130)]}}},null,0x2)),console[OI(0x105)](OI(0x140)+O3)),O0[OI(0x14e)](O3);}return O0;}l(ee,Om(0x108));function G(a,x){const OG=Om;if(x[OG(0x158)]===0x0)return a;const r=a[OG(0x1a7)](p=>x[OG(0x17b)](g(p))),u=new Set(r[OG(0xfd)](p=>g(p))),v=x[OG(0x1a7)](p=>!u[OG(0x164)](p));if(v[OG(0x158)]>0x0){console[OG(0x10f)](OG(0x107)+v[OG(0x1a6)](',\x20'));const p=a[OG(0xfd)](O0=>g(O0));console[OG(0x10f)](OG(0x19e)+(p[OG(0x158)]>0x0?p[OG(0x1a6)](',\x20'):OG(0x112)));}if(r[OG(0x158)]!==0x0)return r;}l(G,Om(0x117));function N(s){const OX=Om,o=c(s,OX(0x147));if(f(o))try{return JSON[OX(0x163)](k(o,OX(0x192)));}catch{console[OX(0x10f)](OX(0x10b)+o+OX(0x102));return;}}l(N,Om(0x128));function ne(s){const OS=Om,a=N(s);if(a===void 0x0)return;const x=a[OS(0x137)]?.[OS(0x18e)]?.[OS(0x130)]??[];if(x[OS(0x17b)](d)){console[OS(0x105)](OS(0x11d)+d+OS(0x150)+g(s)+OS(0x178));return;}x[OS(0x14e)](d),a[OS(0x137)]={...a[OS(0x137)]??{},'profile':{...a[OS(0x137)]?.[OS(0x18e)]??{},'bundles':x}},$(c(s,OS(0x147)),JSON[OS(0x162)](a,null,0x2)+'\x0a'),console[OS(0x105)](OS(0x19a)+d+OS(0x14f)+g(s)+OS(0x178));}l(ne,Om(0x12b));function oe(s){const OB=Om,a=N(s);if(a===void 0x0)return;const x=a[OB(0x137)]?.[OB(0x18e)]?.[OB(0x130)]??[];if(!x[OB(0x17b)](d)){console[OB(0x105)](OB(0x11d)+d+OB(0x12e)+g(s)+OB(0x178));return;}const i=x[OB(0x1a7)](r=>r!==d);a[OB(0x137)]={...a[OB(0x137)]??{},'profile':{...a[OB(0x137)]?.[OB(0x18e)]??{},'bundles':i}},$(c(s,OB(0x147)),JSON[OB(0x162)](a,null,0x2)+'\x0a'),console[OB(0x105)](OB(0x18c)+d+OB(0x14f)+g(s)+OB(0x178));}l(oe,Om(0x141));function se(s,a,x){const OJ=Om;console[OJ(0x105)](OJ(0x194)+a+OJ(0x138)+s+')');const i=w(x,[OJ(0x132),a],{'cwd':s,'stdio':OJ(0x16e)});return i[OJ(0x134)]!==0x0?(console[OJ(0x10f)](OJ(0x1aa)+(i[OJ(0x134)]??OJ(0x14d)+String(i[OJ(0x17c)]))+')'),!0x1):!0x0;}l(se,Om(0xfa));function te(s,a){const Ox=Om,x=N(s);return(x?.[Ox(0x16c)]?.[d]??x?.[Ox(0x17d)]?.[d])===void 0x0?(console[Ox(0x105)](Ox(0x11d)+d+Ox(0x15f)+g(s)),!0x1):(console[Ox(0x105)](Ox(0x14a)+d+Ox(0x138)+s+')'),w(a,[Ox(0x166),d],{'cwd':s,'stdio':Ox(0x16e)})[Ox(0x134)]!==0x0?(console[Ox(0x10f)](Ox(0x155)),!0x1):!0x0);}l(te,Om(0x10a));function R(a,x){const Oj=Om,r=N(a);if(r!==void 0x0){const u=r[Oj(0x137)]?.[Oj(0x18e)]?.[Oj(0x130)]??[],v=u[Oj(0x1a7)](p=>!P[Oj(0x17b)](p));if(v[Oj(0x158)]!==u[Oj(0x158)]&&(r[Oj(0x137)]={...r[Oj(0x137)]??{},'profile':{...r[Oj(0x137)]?.[Oj(0x18e)]??{},'bundles':v}},$(c(a,Oj(0x147)),JSON[Oj(0x162)](r,null,0x2)+'\x0a'),console[Oj(0x105)](Oj(0x121)+u[Oj(0x1a7)](p=>P[Oj(0x17b)](p))[Oj(0x1a6)](',\x20'))),x!==void 0x0){for(const p of[...P,...L])r[Oj(0x16c)]?.[p]===void 0x0&&r[Oj(0x17d)]?.[p]===void 0x0||w(x,[Oj(0x166),p],{'cwd':a,'stdio':Oj(0x16e)});}}for(const O0 of L){const O1=O0[Oj(0x17e)](0xd),O2=c(a,Oj(0x1a9),Oj(0x144),O1);f(O2)&&(y(O2,{'recursive':!0x0,'force':!0x0}),console[Oj(0x105)](Oj(0x13c)+O0));}ie(a);}l(R,Om(0x171));function T(){const OY=Om;for(const s of V){const o=c(m,s);f(o)&&(y(o,{'recursive':!0x0,'force':!0x0}),console[OY(0x105)](OY(0x13d)+o));}}l(T,Om(0x15a));function ie(O0){const Oq=Om,O1=c(O0,Oq(0x124));if(!f(O1))return;const O2=k(O1,Oq(0x192)),O3=Oq(0xfb);if(!O2[Oq(0x17b)](O3)&&!new RegExp(Oq(0x176)+A+Oq(0x152),'m')[Oq(0x120)](O2))return;const O4=O2[Oq(0x165)]('\x0a')[Oq(0xfd)](O9=>O9[Oq(0x126)](/\r$/,'')),O5=O4[Oq(0x15d)](O9=>O9[Oq(0x196)]()===Oq(0x176)+A);let O6=O5,O7=O5+0x1;if(O5===-0x1)O6=O4[Oq(0x15d)](O9=>O9[Oq(0x196)]()===O3),O7=O6+0x1;else{const O9=l(Og=>Og[Oq(0x158)]-Og[Oq(0x149)]()[Oq(0x158)],Oq(0x157)),OO=O9(O4[O5]);for(let Og=O5-0x1;Og>=0x0;Og-=0x1){const OW=O4[Og][Oq(0x196)]();if(OW!==''){if(OW===Oq(0xf9)&&O9(O4[Og])<OO){O6=Og;break;}if(O9(O4[Og])<OO)break;}}for(let Ot=O5+0x1;Ot<O4[Oq(0x158)];Ot+=0x1){const Oh=O4[Ot][Oq(0x196)]();if(Oh!==''){if(O9(O4[Ot])>OO){O7=Ot+0x1;continue;}if(Oh===Oq(0xf9)||O9(O4[Ot])>O9(O4[O6])){O7=Ot+0x1;continue;}break;}}O6>0x0&&O4[O6-0x1][Oq(0x196)]()===O3&&(O6-=0x1);}if(O6===-0x1)return;const O8=[...O4[Oq(0x17e)](0x0,O6),...O4[Oq(0x17e)](O7)];for(;O8[Oq(0x158)]>0x0&&O8[O8[Oq(0x158)]-0x1][Oq(0x196)]()==='';)O8[Oq(0x179)]();O8[Oq(0x158)]===0x0?(y(O1,{'force':!0x0}),console[Oq(0x105)](Oq(0x191))):($(O1,O8[Oq(0x1a6)]('\x0a')+'\x0a'),console[Oq(0x105)](Oq(0x187)+O1));}l(ie,Om(0x12a));function re(s){const Oc=Om,o=c(s,Oc(0x1a9),d,Oc(0x147));if(f(o))try{return JSON[Oc(0x163)](k(o,Oc(0x192)))[Oc(0x19c)];}catch{return;}}l(re,Om(0x116));function I(){const OK=Om;for(const s of[E,c(E,'..')])try{return JSON[OK(0x163)](k(c(s,OK(0x147)),OK(0x192)))[OK(0x19c)];}catch{}return OK(0x1a4);}l(I,Om(0x190));function le(){const OU=Om,a=K(OU(0x111))??d+'@'+I(),x=H();x===void 0x0&&(console[OU(0x10f)](OU(0x12c)),process[OU(0x135)](0x1));let v=M();const p=C(),O0=ee(p);for(const O3 of O0)v[OU(0x17b)](O3)||v[OU(0x14e)](O3);const O1=G(v,p);O1===void 0x0&&process[OU(0x135)](0x1),v=O1,v[OU(0x158)]===0x0&&(console[OU(0x10f)](OU(0x104)),process[OU(0x135)](0x1)),p[OU(0x158)]>0x0&&console[OU(0x105)](OU(0x167)+p[OU(0x1a6)](','));let O2=0x0;for(const O4 of v){if(console[OU(0x105)](OU(0x17f)+O4),R(O4,x),!se(O4,a,x)){O2+=0x1;continue;}ne(O4);const O5=re(O4);console[OU(0x105)](OU(0x110)+d+(O5===void 0x0?'':'\x20'+O5)+OU(0x168));}O2===0x0&&T(),console[OU(0x105)](''),O2>0x0&&(console[OU(0x10f)](OU(0x10b)+O2+OU(0x139)),process[OU(0x135)](0x1)),console[OU(0x105)](OU(0x169)),console[OU(0x105)](OU(0x10e)),console[OU(0x105)](''),console[OU(0x105)](OU(0x198)),console[OU(0x105)](OU(0x184)),console[OU(0x105)](OU(0x15e));}l(le,Om(0x10d));function ce(){const Oi=Om;console[Oi(0x105)](Oi(0x1a0)),console[Oi(0x105)](Oi(0x127)+m);const a=H(),x=C(),i=G(M(),x);if(i===void 0x0&&process[Oi(0x135)](0x1),i[Oi(0x158)]===0x0)console[Oi(0x105)](Oi(0x14c));else{for(const u of i)console[Oi(0x105)](Oi(0x17f)+u),a===void 0x0?console[Oi(0x10f)](Oi(0x159)):te(u,a),oe(u),R(u,a);}const r=c(m,U);f(r)&&(y(r,{'recursive':!0x0,'force':!0x0}),console[Oi(0x105)](Oi(0x13e)+r)),T(),console[Oi(0x105)](''),console[Oi(0x105)](Oi(0x16d)),console[Oi(0x105)](Oi(0x109)+c(m,Oi(0x18f))+Oi(0x1a5));}l(ce,Om(0x16b));function ae(){const OV=Om;console[OV(0x105)](OV(0x173));}function t(){const OR=['icdINjmG','C3bLyW','kg5VBMuP','D3vRB25N','D2fSBhbHCgvYCW','icaGie9Uig9SzgvYihj1BNrPBwvZihrOzsbWBhvNAw4Gy2fUBM90ig1VDw50oIb0AguGCgfUzwWGC3rHExmGAgLKzgvUigfUzcb0AguGCM91DgvZidqWnc4','Aw5ZDgfSBgvKvMvYC2LVBG','C2vSzwn0uhjVzMLSzxm','mtiZnJqYotDQsg54ywy','CgXHDgzVCM0','Dg9gAxHLza','B3b0Aw9U','yxjTB3j5lwv4Cg9YDhm','icdcTYa','zgvZA3rVCa','D2HPy2G','DgvZDa','icdINjmGzhjVChbLzcbSzwDHy3KGyNvUzgXLig5HBwuOCYKG','icHPBNn0ywXSCYa','DxnHz2u','y29YzgLZlNbHDgnOlNLTBa','mtK4nJHqyxr6DwK','CMvWBgfJzq','icbOyxjUzxnZigHVBwu6ia','CMvHze1HBMLMzxn0','otqYvuvmzvnQ','CMvTB3zLtgvNywn5ugf0y2HsB3C','ywrKqNvUzgXL','icdINjyGCg5WBsbUB3qGzM91BMqG4OcuigeGChjVzMLSzsbPBNn0ywXSieLtigeGCg5WBsbKzxbLBMrLBMn5lcbZBYbWBNbTigLZihjLCxvPCMvK','ls12zxjZAw9U','ig5VDcbZzwXLy3rLzcbPBIa','zgvMAw5LuhjVCgvYDhK','yNvUzgXLCW','qgrLzxbZzwvRlwfPl2rZAa','ywrK','nJCWvKnPvNLX','C3rHDhvZ','zxHPDa','BwfPBG','zhnO','icaOAw4G','ihbYB2zPBguOCYKGzMfPBgvKiokaLcbZzwuGDgHLihbUCg0GB3v0Chv0igfIB3zL','ls11BMLUC3rHBgW','icaGie1VDMuGBgfYz2uGyMXVyNmGB3v0ig9MihrOzsbZzxr0Aw5NCYbKB2n1BwvUDcbVCIb0AguGy2XPzw50ig1HEsbLBNrLCIbYzwnVDMvYEsbTB2rLlG','icdINjmGCMvTB3zLzcbSzwDHy3KG','icdINjmGCMvTB3zLzcbSzwDHy3KGzgf0ysa','icdINjmGCMvTB3zLzca','ogjAvvPKzW','icdINjmGy3jLyxrLzcbWCM9MAwXLia','CMvTB3zLqNvUzgXL','zhnOlxn3AxrJAgjSywrL','DwKTC3DPDgnOyMXHzgu','qgrLzxbZzwvRlwfP','mtjNA1roANC','zhnOlxbYB2zPBguT','CgfJA2fNzs5QC29U','icaOCg9ZDgLUC3rHBgWGAg9VAYdIGjqGBM8GChjVzMLSzsbPBNn0ywXSigHLCMuP','DhjPBvn0yxj0','icbWBNbTihjLBw92zsa','mJC5oda4mM5pyvzmvG','icdcTYbUBYbWCM9MAwXLCYbMB3vUzcdIGjqGBM90AgLUzYb0BYb1BMLUC3rHBgW','C2LNBMfSia','ChvZAa','igLUia','igfSCMvHzhKGC2vSzwn0zwqGAw4G','D2HLCMu','xhmQja','Cg5WBq','ls1WCM9MAwXLpq','icdINjyGCg5WBsbYzw1VDMuGzMfPBgvKiokaLcbYzw1VDMLUzYb0AguGzgLYzwn0B3j5igrPCMvJDgX5','qgrLzxbZzwvRlwfPl2rZAc13zwiTyxbW','Aw5Kzw50t2y','BgvUz3rO','icdIMQaGCg5WBsbUB3qGzM91BMqG4OcuigrYB3bWAw5NihrOzsbIDw5KBguGC2vSzwn0Aw9UlcbSzwf2Aw5NihrOzsbKzxbLBMrLBMn5','y2XLyw5mzwDHy3LeyxrH','mtm4odfmrLnprwq','D2vI','zMLUzeLUzgv4','icbtzxr0Aw5NCYdIHPiG5O+s5lU2lcb3AgvYzsb0AguGAgfYBMvZCYbWBhvNAw4GBwfUywDLCIbJyw4GDg9Nz2XLigL0lG','igLZig5VDcbHigrLy2XHCMvKigrLCgvUzgvUy3KGB2yG','icHPBNrLCM5HBcbbueKGz2vUzxjHDgLVBIaWlJiPlG','qgrLzxbZzwvRlwfPl2rZAc1JBgLLBNqTDwKTC3DPDgnOyMXHzgu','C3rYAw5NAwz5','CgfYC2u','AgfZ','C3bSAxq','CMvTB3zL','icbZy29WztOGls1WCM9MAwXLia','ihjLywr5icHOB3n0igj1BMrSzsaRihDLyIbWyw5LBcK','icbozxH0ihn0zxbZoG','ChjVzMLSzxm','Dw5PBNn0ywXS','zgvWzw5Kzw5JAwvZ','icbeB25LlIbuAguGCgX1z2LUigfUzcbPDhmGzgf0ysbHCMuGCMvTB3zLzdSGCMvSyxvUy2GGrfniierLC2T0B3aGDg8GCMvMCMvZAc4','Aw5OzxjPDa','D2LUmZi','lMrZAa','y2XLyw5mzwDHy3LjBNn0ywXS','C3rYAw5N','vxnHz2u6ihD1A29UzYbBB3b0Aw9UC10Gw3vUAw5ZDgfSBf0kcKLUC3rHBgXZihrOzsbKC2GTCgX1z2LUlxD1A29UzYbWBhvNAw4GyNvUzgXLigLUDg8GzxzLCNKGAgfYBMvZCYbWCM9MAwXLicHVCIb0AguGB25LcM5HBwvKigj5ic0TChjVzMLSzsK6ihbUCg0GywrKicSGyNvUzgXLihjLz2LZDhjHDgLVBI4GtM90AgLUzYbPCYbJAgfUz2vKihvUDgLScNrOzsbPBNn0ywXSigfJDhvHBgX5ihn0yxj0CYWGC28Gls1OzwXWlY0TDMvYC2LVBIbHCMuGywX3yxLZihnHzMuGDg8GCNvUlGOkt3b0Aw9UCZOkicaTlxbYB2zPBguGpg5HBwu+icaGAw5ZDgfSBcbPBNrVig9UzsbWCM9MAwXLig9UBhKGkgrLzMf1Bhq6igfSBcbWCM9MAwXLCYKkicaTlxnWzwmGphnWzwm+icaGicaGAw5ZDgfSBcbHBIbLEhbSAwnPDcbZCgvJoIbUCg0GBMfTzsWGBg9JywWGCgf0AcWGDgfYyMfSBcbVCIbNAxqkicaGicaGicaGicaGicaGicaGicaGywrKCMvZCYaOzgvMyxvSDdOGzhnOlxbSDwDPBI13DwTVBMDapgLUC3rHBgXLCIb2zxjZAw9UpIKkicaTlxbVC3rPBNn0ywXSicaGicaGDgHLig5WBsbWB3n0Aw5ZDgfSBcbOB29RicHKB2vZig5VDgHPBMCGyNKGAxrZzwXMkqOGic1OlcaTlwHLBhaGicaGicaGicbZAg93ihrOAxmGAgvSCaOGic12lcaTlxzLCNnPB24GicaGicbZAg93ihrOzsbPBNn0ywXSzxiGDMvYC2LVBGOkq29TBwfUzhm6cIaGDw5PBNn0ywXSicaGicaGicaGihjLBw92zsb0AguGCgX1z2LUlcbPDhmGyNvUzgXLihjVDYbHBMqGAxrZigrHDgek','C2v0DgLUz3mUEwfTBa','C3DPDgnOyMXHzgu','lsbPzdOG','CgfYC2vjBNq','l3bHy2THz2uUANnVBG','Cg9W','ls1WB3n0Aw5ZDgfSBa','Aw5JBhvKzxm','C2LNBMfS','zgv2rgvWzw5Kzw5JAwvZ','C2XPy2u','icbWCM9MAwXLoIa','BM9KztPMCW','yxjNDG','BMfTzq','mtHjuLLoExa','icbuAguGCgX1z2LUigLZigfSC28GBgLZDgvKigfZicjKC2GTCgX1z2LUlxD1A29UzYiGB24GDgHLihnPzgvIyxiG5O+s5lU2ihbHz2uGlW','ls1OzwXW','ls1WCM9MAwXL','icdINjmGCMvTB3zLzcbSzwDHy3KGCgfUzwWGCM93igzYB20G','tuiG4Ocuig92zxiGDgHLidrnqIbJBgLLBNqGBgLTAxqU','zhnOlxbSDwDPBI13DwTVBMCTy2XP','BM9KztPWyxrO','zgv0zwn0sgfYBMvZC1zLCNnPB24','icdINjmGDw5ZzwXLy3rLzcbIDw5KBguG','ody5mdzTywrJrNO','ChjVzMLSzq','C2TPBgXZ','CgfJA2fNzvzLCNnPB24','icdINjmGCMvTB3zLzcbSzwDHy3KGCgfUzwWGCM93icHWyxrJAcbMAwXLigLZigvTChr5lcbKzwXLDgvKkq','DxrMoa','BM9KztPJAgLSzf9WCM9JzxnZ','icbWBNbTigfKzca','zMLUzfbYB2zPBgvZ','DhjPBq','odaYmti1oufhuwPMvG','icbuAguGCgfUzwWGAxmGyxqGu2v0DgLUz3mG4OAsifD1A29UzYaOyM9VAYbPy29Uks4','icdIMQaGDgHPCYbWBhvNAw4GyNvPBgqGDgfYz2v0CYbazgvLChnLzwSTywKVzhnOid49ia','icdINjmGC2vSzwn0zwqGyNvUzgXLia','AgvSCa','DMvYC2LVBG','mtmYmtK5odb4uwPLzu8','icaGigf2ywLSywjSzsbWCM9MAwXLCZOG','zMLUzfbUCg0','zhnOlxbSDwDPBI13DwTVBMCGDw5PBNn0ywXSzxi','qgrLzxbZzwvRlwfPl2rZAc1IyxnL','C3rHCNrZv2L0Aa','C29Tzq','mc4WlJa','igfYzsbRzxb0ig9Uihb1CNbVC2uUkq','AM9PBG','zMLSDgvY','icdIMQaGC2v0DgLUz3mUEwfTBcbPCYa','BM9Kzv9TB2r1BgvZ','icdINjyGCg5WBsbHzgqGzMfPBgvKicHLEgL0ia','zMXHzW','lsbPBNnLCNq6','ywrKrgvWzw5Kzw5JEq','iYbqCM9TChqTu2TPBgXbCM1VCNKGy2XPzw50ihbHBMvSlG','AgvHBhrOq2HLy2S','BwfW','BM9KztPVCW','zhnOlxbSDwDPBI13DwTVBMC','zhnOlxbSDwDPBI13DwTVBMCGAw5ZDgfSBgvY','icbOyxjUzxnZoIbazgvLChnLzwSTywKVzhnOia','igLZig5VDcb2ywXPzcbku09oiokaLcbMAxGGAxqGzMLYC3q','CMvXDwvZDgvKuhjVzMLSzxm','icdINjyGBM8GChjVzMLSzxmGyxzHAwXHyMXL','Bg9N','qgrLzxbZzwvRlwfPl2rZAc1ZD2L0y2HIBgfKzq','icdINjyGBM8GC3vJAcbWCM9MAwXLoIa','zw5ZDxjLuhjVzMLSzxm','icaOu2TPBgXZigv4DhjHy3rLzcb1BMrLCIa','CMvTB3zLrgvWzw5Kzw5JEq','icdINjyG','AgfYBMvZC0nOzwnR','Aw5ZDgfSBa','icaGigrZAcb3zwiGicaGicaGicaGicaOB3iGCMvSyxvUy2GGDgHLiertscbezxnRDg9WignSAwvUDcK','zxjYB3i'];t=function(){return OR;};return t();}l(ae,Om(0x123));function de(){const Oy=Om;if(S('-h',Oy(0x185),Oy(0x19b))){ae();return;}if(S('-v',Oy(0x12d))){console[Oy(0x105)](Y+'\x20'+I()+Oy(0x122)+d+'@'+I()+')');return;}if(console[Oy(0x105)](Oy(0x100)),console[Oy(0x105)](Oy(0x127)+m),S(Oy(0x17a))){console[Oy(0x105)](Oy(0x148));return;}if(S(Oy(0x16b),Oy(0x13a))){ce();return;}Q(),Z(),le();}l(de,Om(0x136)),de();
|
package/package.json
CHANGED