dsh-plugin-wukong-cli 0.23.0 → 0.24.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.
- package/CHANGELOG.md +24 -0
- package/README.en.md +23 -6
- package/README.md +23 -6
- package/dist/cli.cjs +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,30 @@
|
|
|
6
6
|
|
|
7
7
|
格式基于 [Keep a Changelog](https://keepachangelog.com/),版本遵循 [Semantic Versioning](https://semver.org/)。
|
|
8
8
|
|
|
9
|
+
## [0.24.1] - 2026-10
|
|
10
|
+
|
|
11
|
+
### 修复 · Fixed
|
|
12
|
+
- **生图页的说明不再重复**:页面顶部和「图像生成」卡片里各显示了一遍同一段说明,现在只保留页面顶部那一条。
|
|
13
|
+
**The Images page no longer says the same thing twice**: the same blurb showed both at the top of the page and inside the "Image generation" card; only the one at the top is kept.
|
|
14
|
+
- **技能页不再列出插件自己注入的 `wukong-imagegen`**:它是只给模型用的内置技能,出现在「本地扫描技能」里会让人误以为要「托管」。面板的技能目录现在把它过滤掉;技能本身照常随生图工具注册,`/wukong` 命令的目录不受影响。
|
|
15
|
+
**The Skills page no longer lists the plugin's own `wukong-imagegen`**: it is a built-in skill for the model only, and showing it under "Scanned skills" made people think it needed to be "managed". The panel's skill catalog now filters it out; the skill itself is still registered with the image tools, and the `/wukong` command's catalog is unchanged.
|
|
16
|
+
|
|
17
|
+
## [0.24.0] - 2026-10
|
|
18
|
+
|
|
19
|
+
### 新增 · Added
|
|
20
|
+
- **改图与图片查看器**:新增 `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}`。
|
|
21
|
+
**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}`.
|
|
22
|
+
- **随工具注入的 `wukong-imagegen` 技能**:只给模型用,写明图片提示词怎么写、编辑时「只改 X、保留 Y」、收到标注图怎么处理、透明背景怎么做;改写自 Codex 的 `imagegen` 技能(Apache-2.0)。与两个生图工具同生共死:没选好模型时不注入,不占上下文。
|
|
23
|
+
**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.
|
|
24
|
+
|
|
25
|
+
### 变更 · Changed
|
|
26
|
+
- **`generate_image` 的保存目录只由面板「保存目录」决定,工具改收 `file_name`**:模型原来可以传 `output_path`(比如 `summer.png`),一传就绕开用户配置的目录、把图丢进项目根目录。现在工具只接受文件名,传目录或 `../` 都会被收成最后一段名字;保存目录(默认 `output/imagegen`,相对当前会话项目,也可填绝对路径)只由面板设置决定;同名文件不覆盖,自动加 `-2`、`-3`。
|
|
27
|
+
**`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).
|
|
28
|
+
- **没选好 Provider 与模型时不再注册生图工具**:以前工具在启动时无条件注册,没配模型时模型也看得到它,调用后才被拒绝。现在只有保存了 Provider 与模型才注册 `generate_image`、`edit_image` 和 `wukong-imagegen` 技能,保存后立即出现,清除后立即卸载,无需重启。
|
|
29
|
+
**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.
|
|
30
|
+
- **工具结果那一行多了缩略图和「编辑图片」按钮**:成功后的一行文字旁边有一张小缩略图和按钮,点开是图片查看器;`edit_image` 的结果也用同一个视图。
|
|
31
|
+
**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.
|
|
32
|
+
|
|
9
33
|
## [0.23.0] - 2026-10
|
|
10
34
|
|
|
11
35
|
### 新增 · 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
|

|
|
@@ -160,7 +160,7 @@ Open **Settings → Wukong** (book icon).
|
|
|
160
160
|
|
|
161
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
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
|
|
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
164
|
|
|
165
165
|
**Tool parameters** (all but `prompt` are optional and default to the panel's values):
|
|
166
166
|
|
|
@@ -170,7 +170,7 @@ The plugin registers a **`generate_image`** tool in the session: the model calls
|
|
|
170
170
|
| `size` | `auto` / `1024x1024` / `1024x1536` / `1536x1024` / `2048x2048` / `2048x1152` / `3840x2160` / `2160x3840` |
|
|
171
171
|
| `quality` | `low` / `medium` / `high` / `auto` |
|
|
172
172
|
| `output_format` | `png` / `jpeg` / `webp`; also decides the extension (`jpeg` is saved as `.jpg`) |
|
|
173
|
-
| `
|
|
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
174
|
|
|
175
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
176
|
|
|
@@ -179,9 +179,25 @@ The plugin registers a **`generate_image`** tool in the session: the model calls
|
|
|
179
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
180
|
- On failure: one quiet line of error text.
|
|
181
181
|
|
|
182
|
-
**
|
|
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
183
|
|
|
184
|
-
|
|
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.
|
|
185
201
|
|
|
186
202
|
---
|
|
187
203
|
|
|
@@ -203,6 +219,7 @@ The panel talks to the Host only through the plugin's own **same-origin HTTP rou
|
|
|
203
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` |
|
|
204
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 |
|
|
205
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 |
|
|
206
223
|
| `POST /api/wukong/mcp/test` | one-shot MCP connect test |
|
|
207
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` |
|
|
208
225
|
| `POST /api/wukong/skills/zip` | upload a zip skill bundle and extract it into `$DSH_HOME/skills` |
|
|
@@ -314,7 +331,7 @@ DSH runtime (0.2.0-rc.2)
|
|
|
314
331
|
|
|
315
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).
|
|
316
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).
|
|
317
|
-
- **Image tool**: the Host registers `generate_image` (`ctx.tools.register`) in its own `ctx.inject(['tools'])` fiber, 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`.
|
|
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`.
|
|
318
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']`.
|
|
319
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.
|
|
320
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
|

|
|
@@ -160,7 +160,7 @@ dsh web # 或直接重启 DSH Desktop 客户端
|
|
|
160
160
|
|
|
161
161
|
插件会给会话注册一个 **`generate_image`** 工具:模型按文字提示词调用一次 OpenAI 兼容的 Images API,图片存进会话工作区。工具挂在 harness 的 `tools` 服务上而不是 web 路由上,所以 headless profile 也能用;对话里的占位动效只在 web 面板里有。
|
|
162
162
|
|
|
163
|
-
**使用**:设置 → Wukong → **生图**,选好 Provider 与模型(目录与提示词增强、输入框模型选择器是同一份),按需调默认尺寸 / 质量 /
|
|
163
|
+
**使用**:设置 → Wukong → **生图**,选好 Provider 与模型(目录与提示词增强、输入框模型选择器是同一份),按需调默认尺寸 / 质量 / 格式与保存目录,保存;然后直接对助手说「生成一张……」。**不预置任何模型名**:Provider 与模型没选全时,**助手的工具列表里根本没有 `generate_image`**(保存后立即出现,清除后立即消失,不用重启);万一仍被调用也会明确报错(`imagegen-unset`),不会替你猜一个模型发出去。设置按次读取,面板里换了模型下一次调用就生效。
|
|
164
164
|
|
|
165
165
|
**工具参数**(除 `prompt` 外都可省略,省略时用面板里的默认值):
|
|
166
166
|
|
|
@@ -170,7 +170,7 @@ dsh web # 或直接重启 DSH Desktop 客户端
|
|
|
170
170
|
| `size` | `auto` / `1024x1024` / `1024x1536` / `1536x1024` / `2048x2048` / `2048x1152` / `3840x2160` / `2160x3840` |
|
|
171
171
|
| `quality` | `low` / `medium` / `high` / `auto` |
|
|
172
172
|
| `output_format` | `png` / `jpeg` / `webp`,同时决定落盘扩展名(`jpeg` 写成 `.jpg`) |
|
|
173
|
-
| `
|
|
173
|
+
| `file_name` | 文件名(只要名字,不要目录;扩展名跟着输出格式)。保存目录**只由面板里的「保存目录」决定**(默认 `output/imagegen`,相对当前会话项目,也可填绝对路径),模型改不了;传了目录或 `../` 只会取最后一段名字。同名文件不会被覆盖,自动加 `-2`、`-3`。缺省为 `<提示词slug>-<时间戳>` |
|
|
174
174
|
|
|
175
175
|
**端点与凭据**:不存进插件状态,跟着 Provider 走、调用时按次解析——从宿主 settings 里该 Provider 配置的 `baseURL` 与 `apiKeyEnv` 取,密钥经宿主 `credentials` 服务解析(`apiKeyEnv` 为空表示端点不要密钥)。请求是 `POST {baseURL}/images/generations`,body 为 `model` / `prompt` / `size` / `quality` / `output_format`;响应认 `b64_json`,或 `url`(会再下载一次)。一次调用出一张图;单次超时默认 5 分钟。
|
|
176
176
|
|
|
@@ -179,9 +179,25 @@ dsh web # 或直接重启 DSH Desktop 客户端
|
|
|
179
179
|
- 成功后:占位收成一行「Generated … at <路径>」。**图本身由助手在回复里用 Markdown 嵌入**——工具说明里要求了这一点,所以同一张图不会在工具卡片和回复里各出现一次。这依赖模型照做;模型没嵌图时,图仍在磁盘上,路径就在那一行文字里。
|
|
180
180
|
- 失败时:一行安静的错误文字。
|
|
181
181
|
|
|
182
|
-
|
|
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
183
|
|
|
184
|
-
|
|
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 服务上,随设置变化自动进行);只改面板视图的样式时刷新页面即可。
|
|
185
201
|
|
|
186
202
|
---
|
|
187
203
|
|
|
@@ -203,6 +219,7 @@ dsh web # 或直接重启 DSH Desktop 客户端
|
|
|
203
219
|
| `GET` / `POST /api/wukong/state` | 读写状态文档(面板的增删改查都走这里):读返回 `{ok, revision, state}`;写收 `{state, ifRevision}`,每次写入都会归一化文档并让 `revision` 加一 |
|
|
204
220
|
| `GET /api/wukong/skills` | 面板要的技能 + 托管命令目录:`{ok, revision, skills, commands}`,不必再从整份状态文档里重建 |
|
|
205
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,结果一律不覆盖旧文件 |
|
|
206
223
|
| `POST /api/wukong/mcp/test` | 一次性 MCP 连接测试 |
|
|
207
224
|
| `GET /api/wukong/market` · `POST /api/wukong/market/install` | 扩展市场:按 `kind=mcp\|skill` 与 `q` 搜索聚合目录(官方 MCP Registry、DSH MCP Market、ClawHub、SkillsMP + 随包精选),安装时只接受显式条目 id;MCP 需要环境变量时以禁用状态装好并返回 `needsEnv` |
|
|
208
225
|
| `POST /api/wukong/skills/zip` | 上传 zip 技能包并解压到 `$DSH_HOME/skills` |
|
|
@@ -314,7 +331,7 @@ DSH 运行时(0.2.0-rc.2)
|
|
|
314
331
|
|
|
315
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)。
|
|
316
333
|
- **Host 侧**持有提示词/技能/命令/MCP/壁纸的 CRUD 与持久化(`$DSH_HOME/wukong/state.json`),通过 `ctx.systemPrompt.section` 按作用域注入提示词(关闭插值)、`ctx.skills.register` 注册技能;并注册 `/api/wukong/*` 与 `/api/wukong-wallpaper/*` 路由(状态读写、技能目录、MCP 测试、zip 技能、对话导入导出、会话删除、使用统计、版本检查、一键更新)。
|
|
317
|
-
- **生图工具**由 Host 在 `ctx.inject(['tools'])` 的独立 fiber 里注册 `generate_image`(`ctx.tools.register
|
|
334
|
+
- **生图工具**由 Host 在 `ctx.inject(['tools'])` 的独立 fiber 里注册 `generate_image`(`ctx.tools.register`)——只有选好 Provider 与模型才注册,保存 / 清除设置时立即注册或卸载;设置、Provider 路由与附件服务都按次读取;对话展示视图由面板侧在 `tool.call.toolview` 按工具名注册。
|
|
318
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']`。
|
|
319
336
|
- **可选 peer**:`@deepseek-ai/*` 运行时包与 `react` 全部在 `peerDependenciesMeta` 里标为 `optional`,运行时 `dependencies` 为空。原因是这些运行时包不在公共 npm 源上,写成必选 peer 会让 `pnpm add` 直接 `ERR_PNPM_FETCH_404` 失败;标成可选后 pnpm 能顺利安装,模块仍由宿主在运行时提供。
|
|
320
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 Jo=e;(function(o,s){const JD=e,p=o();while(!![]){try{const v=-parseInt(JD(0x18d))/0x1*(-parseInt(JD(0x183))/0x2)+parseInt(JD(0x14b))/0x3+parseInt(JD(0x125))/0x4*(-parseInt(JD(0x133))/0x5)+parseInt(JD(0x129))/0x6*(parseInt(JD(0x15b))/0x7)+-parseInt(JD(0x13f))/0x8*(parseInt(JD(0x197))/0x9)+parseInt(JD(0x19d))/0xa+-parseInt(JD(0x118))/0xb*(parseInt(JD(0x145))/0xc);if(v===s)break;else p['push'](p['shift']());}catch(h){p['push'](p['shift']());}}}(u,0xa2eb9));var W=Object[Jo(0x12f)],l=(o,s)=>W(o,Jo(0x182),{'value':s,'configurable':!0x0});const {existsSync:f,mkdirSync:O,readFileSync:k,readdirSync:q,realpathSync:B,rmSync:y,writeFileSync:$}=require(Jo(0x180)),{homedir:D}=require(Jo(0xfe)),{basename:g,dirname:_,join:c}=require(Jo(0x18a)),{execFileSync:F,spawnSync:w}=require(Jo(0x193)),E=__dirname,d=Jo(0xff),Y=Jo(0x189),P=[Jo(0x142),Jo(0x106)],L=[Jo(0x106),Jo(0x161)],A=Jo(0x143),U=Jo(0x113),V=[Jo(0x175),Jo(0x114),Jo(0x11c)],m=process.env.DSH_HOME??c(D(),Jo(0x170)),b=c(m,Jo(0x16a)),J=c(m,Jo(0x174)),z=0x4*0x400*0x400;function S(...o){const JT=Jo;return process[JT(0x181)][JT(0x17e)](0x2)[JT(0x1a3)](s=>o[JT(0x17b)](s));}function e(J,f){J=J-0xf8;const R=u();let D=R[J];if(e['MsMzHc']===undefined){var o=function(q){const z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let U='',M='';for(let s=0x0,H,y,j=0x0;y=q['charAt'](j++);~y&&(H=s%0x4?H*0x40+y:y,s++%0x4)?U+=String['fromCharCode'](0xff&H>>(-0x2*s&0x6)):0x0){y=z['indexOf'](y);}for(let p=0x0,K=U['length'];p<K;p++){M+='%'+('00'+U['charCodeAt'](p)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(M);};e['mBKxin']=o,e['escNUp']={},e['MsMzHc']=!![];}const T=R[0x0];e['OaHqwf']!==T&&(e['escNUp']={},e['OaHqwf']=T);const k=e['escNUp'][J];return k===undefined?(D=e['mBKxin'](D),e['escNUp'][J]=D):D=k,D;}l(S,Jo(0xf8));function K(p){const Jk=Jo,v=process[Jk(0x181)][Jk(0x17e)](0x2);for(let h=0x0;h<v[Jk(0x158)];h+=0x1){const i=v[h];if(i==='--'+p){const r=v[h+0x1];return r!==void 0x0&&!r[Jk(0x1a2)]('-')?r:void 0x0;}if(i[Jk(0x1a2)]('--'+p+'='))return i[Jk(0x17e)](p[Jk(0x158)]+0x3);}}l(K,Jo(0x11b));function C(){const Jq=Jo,p=[],v=process[Jq(0x181)][Jq(0x17e)](0x2);for(let h=0x0;h<v[Jq(0x158)];h+=0x1){const i=v[h];if(i===Jq(0x186)||i==='-p'){const r=v[h+0x1];r!==void 0x0&&!r[Jq(0x1a2)]('-')&&(p[Jq(0x14e)](...r[Jq(0x165)](',')),h+=0x1);continue;}i[Jq(0x1a2)](Jq(0x154))&&p[Jq(0x14e)](...i[Jq(0x17e)](0xa)[Jq(0x165)](','));}return p[Jq(0xfd)](x=>x[Jq(0x196)]())[Jq(0x1a7)](x=>x!=='');}l(C,Jo(0x103));function Q(){const Jz=Jo;if(!f(J))return;const o=k(J,Jz(0x192))[Jz(0x158)];o>z&&(console[Jz(0x10f)](Jz(0x1a8)+(o/0x400/0x400)[Jz(0x11a)](0x1)+Jz(0x188)),console[Jz(0x10f)](Jz(0x13b)));}l(Q,Jo(0xfc));const j=[0x0,0x2,0x0];function X(){const JU=Jo;try{const p=process[JU(0x119)]===JU(0x16f)?JU(0x151):JU(0x11f),v=F(p,[JU(0x137)],{'encoding':JU(0x192)})[JU(0x165)]('\x0a')[0x0][JU(0x196)]();if(v==='')return;let h=_(B(v));for(let x=0x0;x<0x8;x+=0x1){const a=c(h,JU(0x147));if(f(a)){const J1=JSON[JU(0x163)](k(a,JU(0x192)));if(J1[JU(0x182)]===JU(0x131))return J1[JU(0x19c)];}const J0=_(h);if(J0===h)break;h=J0;}}catch{}}l(X,Jo(0x18b));function Z(){const JM=Jo,o=X();if(o===void 0x0)return;console[JM(0x105)](JM(0x101)+o);const s=o[JM(0x126)](/^[^0-9]*/,'')[JM(0x165)]('.')[JM(0xfd)](p=>Number[JM(0x177)](p,0xa)||0x0);(s[0x0]<j[0x0]||s[0x0]===j[0x0]&&s[0x1]<j[0x1])&&(console[JM(0x10f)](JM(0x199)+j[JM(0x1a6)]('.')+JM(0x160)),console[JM(0x10f)](JM(0x115)));}l(Z,Jo(0x10c));function H(){const Js=Jo;for(const o of[process.env.DSH_PNPM,Js(0x153)][Js(0x1a7)](s=>typeof s==Js(0x172)&&s!==''))if(w(o,[Js(0x12d)],{'encoding':Js(0x192)})[Js(0x134)]===0x0)return o;}l(H,Jo(0x19f));function M(){const JH=Jo;if(!f(b))return[];const s=[];for(const p of q(b)){const v=c(b,p);f(c(v,JH(0x147)))&&f(c(v,JH(0x1a9)))&&s[JH(0x14e)](v);}return s;}l(M,Jo(0x195));function ee(p=[]){const Jy=Jo;f(b)||O(b,{'recursive':!0x0});const v=[{'name':Jy(0x15c),'bundles':[Jy(0x1a1),Jy(0x156)]},{'name':Jy(0x11e),'bundles':[Jy(0x1a1),Jy(0x156)]}],h=p[Jy(0x1a7)](J0=>!v[Jy(0x1a3)](J1=>J1[Jy(0x182)]===J0));for(const J0 of h)v[Jy(0x14e)]({'name':J0,'bundles':[Jy(0x1a1),Jy(0x156)]});const x=p[Jy(0x158)]===0x0?v:v[Jy(0x1a7)](J1=>p[Jy(0x17b)](J1[Jy(0x182)])),a=[];for(const J1 of x){const J2=c(b,J1[Jy(0x182)]);O(c(J2,Jy(0x1a9)),{'recursive':!0x0});const J3=c(J2,Jy(0x147));f(J3)||($(J3,JSON[Jy(0x162)]({'name':Jy(0x146)+J1[Jy(0x182)],'private':!0x0,'dependencies':{},'dsh':{'profile':{'bundles':J1[Jy(0x130)]}}},null,0x2)),console[Jy(0x105)](Jy(0x140)+J2)),a[Jy(0x14e)](J2);}return a;}l(ee,Jo(0x108));function G(p,v){const Jj=Jo;if(v[Jj(0x158)]===0x0)return p;const h=p[Jj(0x1a7)](a=>v[Jj(0x17b)](g(a))),r=new Set(h[Jj(0xfd)](a=>g(a))),x=v[Jj(0x1a7)](a=>!r[Jj(0x164)](a));if(x[Jj(0x158)]>0x0){console[Jj(0x10f)](Jj(0x107)+x[Jj(0x1a6)](',\x20'));const a=p[Jj(0xfd)](J0=>g(J0));console[Jj(0x10f)](Jj(0x19e)+(a[Jj(0x158)]>0x0?a[Jj(0x1a6)](',\x20'):Jj(0x112)));}if(h[Jj(0x158)]!==0x0)return h;}l(G,Jo(0x117));function N(o){const Jp=Jo,s=c(o,Jp(0x147));if(f(s))try{return JSON[Jp(0x163)](k(s,Jp(0x192)));}catch{console[Jp(0x10f)](Jp(0x10b)+s+Jp(0x102));return;}}l(N,Jo(0x128));function ne(s){const JK=Jo,p=N(s);if(p===void 0x0)return;const v=p[JK(0x137)]?.[JK(0x18e)]?.[JK(0x130)]??[];if(v[JK(0x17b)](d)){console[JK(0x105)](JK(0x11d)+d+JK(0x150)+g(s)+JK(0x178));return;}v[JK(0x14e)](d),p[JK(0x137)]={...p[JK(0x137)]??{},'profile':{...p[JK(0x137)]?.[JK(0x18e)]??{},'bundles':v}},$(c(s,JK(0x147)),JSON[JK(0x162)](p,null,0x2)+'\x0a'),console[JK(0x105)](JK(0x19a)+d+JK(0x14f)+g(s)+JK(0x178));}l(ne,Jo(0x12b));function oe(s){const JW=Jo,p=N(s);if(p===void 0x0)return;const v=p[JW(0x137)]?.[JW(0x18e)]?.[JW(0x130)]??[];if(!v[JW(0x17b)](d)){console[JW(0x105)](JW(0x11d)+d+JW(0x12e)+g(s)+JW(0x178));return;}const h=v[JW(0x1a7)](i=>i!==d);p[JW(0x137)]={...p[JW(0x137)]??{},'profile':{...p[JW(0x137)]?.[JW(0x18e)]??{},'bundles':h}},$(c(s,JW(0x147)),JSON[JW(0x162)](p,null,0x2)+'\x0a'),console[JW(0x105)](JW(0x18c)+d+JW(0x14f)+g(s)+JW(0x178));}l(oe,Jo(0x141));function se(s,p,v){const Jc=Jo;console[Jc(0x105)](Jc(0x194)+p+Jc(0x138)+s+')');const h=w(v,[Jc(0x132),p],{'cwd':s,'stdio':Jc(0x16e)});return h[Jc(0x134)]!==0x0?(console[Jc(0x10f)](Jc(0x1aa)+(h[Jc(0x134)]??Jc(0x14d)+String(h[Jc(0x17c)]))+')'),!0x1):!0x0;}l(se,Jo(0xfa));function te(s,p){const Jv=Jo,v=N(s);return(v?.[Jv(0x16c)]?.[d]??v?.[Jv(0x17d)]?.[d])===void 0x0?(console[Jv(0x105)](Jv(0x11d)+d+Jv(0x15f)+g(s)),!0x1):(console[Jv(0x105)](Jv(0x14a)+d+Jv(0x138)+s+')'),w(p,[Jv(0x166),d],{'cwd':s,'stdio':Jv(0x16e)})[Jv(0x134)]!==0x0?(console[Jv(0x10f)](Jv(0x155)),!0x1):!0x0);}l(te,Jo(0x10a));function R(p,v){const JQ=Jo,h=N(p);if(h!==void 0x0){const r=h[JQ(0x137)]?.[JQ(0x18e)]?.[JQ(0x130)]??[],x=r[JQ(0x1a7)](a=>!P[JQ(0x17b)](a));if(x[JQ(0x158)]!==r[JQ(0x158)]&&(h[JQ(0x137)]={...h[JQ(0x137)]??{},'profile':{...h[JQ(0x137)]?.[JQ(0x18e)]??{},'bundles':x}},$(c(p,JQ(0x147)),JSON[JQ(0x162)](h,null,0x2)+'\x0a'),console[JQ(0x105)](JQ(0x121)+r[JQ(0x1a7)](a=>P[JQ(0x17b)](a))[JQ(0x1a6)](',\x20'))),v!==void 0x0){for(const a of[...P,...L])h[JQ(0x16c)]?.[a]===void 0x0&&h[JQ(0x17d)]?.[a]===void 0x0||w(v,[JQ(0x166),a],{'cwd':p,'stdio':JQ(0x16e)});}}for(const J0 of L){const J1=J0[JQ(0x17e)](0xd),J2=c(p,JQ(0x1a9),JQ(0x144),J1);f(J2)&&(y(J2,{'recursive':!0x0,'force':!0x0}),console[JQ(0x105)](JQ(0x13c)+J0));}ie(p);}l(R,Jo(0x171));function T(){const JA=Jo;for(const o of V){const s=c(m,o);f(s)&&(y(s,{'recursive':!0x0,'force':!0x0}),console[JA(0x105)](JA(0x13d)+s));}}l(T,Jo(0x15a));function ie(J0){const Jh=Jo,J1=c(J0,Jh(0x124));if(!f(J1))return;const J2=k(J1,Jh(0x192)),J3=Jh(0xfb);if(!J2[Jh(0x17b)](J3)&&!new RegExp(Jh(0x176)+A+Jh(0x152),'m')[Jh(0x120)](J2))return;const J4=J2[Jh(0x165)]('\x0a')[Jh(0xfd)](J9=>J9[Jh(0x126)](/\r$/,'')),J5=J4[Jh(0x15d)](J9=>J9[Jh(0x196)]()===Jh(0x176)+A);let J6=J5,J7=J5+0x1;if(J5===-0x1)J6=J4[Jh(0x15d)](J9=>J9[Jh(0x196)]()===J3),J7=J6+0x1;else{const J9=l(Ju=>Ju[Jh(0x158)]-Ju[Jh(0x149)]()[Jh(0x158)],Jh(0x157)),JJ=J9(J4[J5]);for(let Ju=J5-0x1;Ju>=0x0;Ju-=0x1){const Jf=J4[Ju][Jh(0x196)]();if(Jf!==''){if(Jf===Jh(0xf9)&&J9(J4[Ju])<JJ){J6=Ju;break;}if(J9(J4[Ju])<JJ)break;}}for(let JR=J5+0x1;JR<J4[Jh(0x158)];JR+=0x1){const Je=J4[JR][Jh(0x196)]();if(Je!==''){if(J9(J4[JR])>JJ){J7=JR+0x1;continue;}if(Je===Jh(0xf9)||J9(J4[JR])>J9(J4[J6])){J7=JR+0x1;continue;}break;}}J6>0x0&&J4[J6-0x1][Jh(0x196)]()===J3&&(J6-=0x1);}if(J6===-0x1)return;const J8=[...J4[Jh(0x17e)](0x0,J6),...J4[Jh(0x17e)](J7)];for(;J8[Jh(0x158)]>0x0&&J8[J8[Jh(0x158)]-0x1][Jh(0x196)]()==='';)J8[Jh(0x179)]();J8[Jh(0x158)]===0x0?(y(J1,{'force':!0x0}),console[Jh(0x105)](Jh(0x191))):($(J1,J8[Jh(0x1a6)]('\x0a')+'\x0a'),console[Jh(0x105)](Jh(0x187)+J1));}l(ie,Jo(0x12a));function re(o){const JG=Jo,s=c(o,JG(0x1a9),d,JG(0x147));if(f(s))try{return JSON[JG(0x163)](k(s,JG(0x192)))[JG(0x19c)];}catch{return;}}l(re,Jo(0x116));function I(){const Ji=Jo;for(const o of[E,c(E,'..')])try{return JSON[Ji(0x163)](k(c(o,Ji(0x147)),Ji(0x192)))[Ji(0x19c)];}catch{}return Ji(0x1a4);}l(I,Jo(0x190));function le(){const JE=Jo,p=K(JE(0x111))??d+'@'+I(),v=H();v===void 0x0&&(console[JE(0x10f)](JE(0x12c)),process[JE(0x135)](0x1));let x=M();const a=C(),J0=ee(a);for(const J3 of J0)x[JE(0x17b)](J3)||x[JE(0x14e)](J3);const J1=G(x,a);J1===void 0x0&&process[JE(0x135)](0x1),x=J1,x[JE(0x158)]===0x0&&(console[JE(0x10f)](JE(0x104)),process[JE(0x135)](0x1)),a[JE(0x158)]>0x0&&console[JE(0x105)](JE(0x167)+a[JE(0x1a6)](','));let J2=0x0;for(const J4 of x){if(console[JE(0x105)](JE(0x17f)+J4),R(J4,v),!se(J4,p,v)){J2+=0x1;continue;}ne(J4);const J5=re(J4);console[JE(0x105)](JE(0x110)+d+(J5===void 0x0?'':'\x20'+J5)+JE(0x168));}J2===0x0&&T(),console[JE(0x105)](''),J2>0x0&&(console[JE(0x10f)](JE(0x10b)+J2+JE(0x139)),process[JE(0x135)](0x1)),console[JE(0x105)](JE(0x169)),console[JE(0x105)](JE(0x10e)),console[JE(0x105)](''),console[JE(0x105)](JE(0x198)),console[JE(0x105)](JE(0x184)),console[JE(0x105)](JE(0x15e));}l(le,Jo(0x10d));function ce(){const JL=Jo;console[JL(0x105)](JL(0x1a0)),console[JL(0x105)](JL(0x127)+m);const p=H(),v=C(),h=G(M(),v);if(h===void 0x0&&process[JL(0x135)](0x1),h[JL(0x158)]===0x0)console[JL(0x105)](JL(0x14c));else{for(const r of h)console[JL(0x105)](JL(0x17f)+r),p===void 0x0?console[JL(0x10f)](JL(0x159)):te(r,p),oe(r),R(r,p);}const i=c(m,U);f(i)&&(y(i,{'recursive':!0x0,'force':!0x0}),console[JL(0x105)](JL(0x13e)+i)),T(),console[JL(0x105)](''),console[JL(0x105)](JL(0x16d)),console[JL(0x105)](JL(0x109)+c(m,JL(0x18f))+JL(0x1a5));}l(ce,Jo(0x16b));function ae(){const JV=Jo;console[JV(0x105)](JV(0x173));}function u(){const JS=['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 JS;};return u();}l(ae,Jo(0x123));function de(){const Jg=Jo;if(S('-h',Jg(0x185),Jg(0x19b))){ae();return;}if(S('-v',Jg(0x12d))){console[Jg(0x105)](Y+'\x20'+I()+Jg(0x122)+d+'@'+I()+')');return;}if(console[Jg(0x105)](Jg(0x100)),console[Jg(0x105)](Jg(0x127)+m),S(Jg(0x17a))){console[Jg(0x105)](Jg(0x148));return;}if(S(Jg(0x16b),Jg(0x13a))){ce();return;}Q(),Z(),le();}l(de,Jo(0x136)),de();
|
|
2
|
+
'use strict';const Bb=a;(function(p,t){const Ba=a,h=p();while(!![]){try{const v=-parseInt(Ba(0x18d))/0x1*(-parseInt(Ba(0x183))/0x2)+parseInt(Ba(0x14b))/0x3+parseInt(Ba(0x125))/0x4*(-parseInt(Ba(0x133))/0x5)+parseInt(Ba(0x129))/0x6*(parseInt(Ba(0x15b))/0x7)+-parseInt(Ba(0x13f))/0x8*(parseInt(Ba(0x197))/0x9)+parseInt(Ba(0x19d))/0xa+-parseInt(Ba(0x118))/0xb*(parseInt(Ba(0x145))/0xc);if(v===t)break;else h['push'](h['shift']());}catch(u){h['push'](h['shift']());}}}(n,0xa2eb9));var W=Object[Bb(0x12f)],l=(p,t)=>W(p,Bb(0x182),{'value':t,'configurable':!0x0});const {existsSync:f,mkdirSync:O,readFileSync:k,readdirSync:q,realpathSync:B,rmSync:y,writeFileSync:$}=require(Bb(0x180)),{homedir:D}=require(Bb(0xfe)),{basename:g,dirname:_,join:c}=require(Bb(0x18a)),{execFileSync:F,spawnSync:w}=require(Bb(0x193)),E=__dirname,d=Bb(0xff),Y=Bb(0x189),P=[Bb(0x142),Bb(0x106)],L=[Bb(0x106),Bb(0x161)],A=Bb(0x143),U=Bb(0x113),V=[Bb(0x175),Bb(0x114),Bb(0x11c)],m=process.env.DSH_HOME??c(D(),Bb(0x170)),b=c(m,Bb(0x16a)),J=c(m,Bb(0x174)),z=0x4*0x400*0x400;function S(...p){const Bz=Bb;return process[Bz(0x181)][Bz(0x17e)](0x2)[Bz(0x1a3)](t=>p[Bz(0x17b)](t));}function a(B,N){B=B-0xf8;const d=n();let W=d[B];if(a['MsMzHc']===undefined){var b=function(j){const p='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let H='',D='';for(let P=0x0,t,Q,h=0x0;Q=j['charAt'](h++);~Q&&(t=P%0x4?t*0x40+Q:Q,P++%0x4)?H+=String['fromCharCode'](0xff&t>>(-0x2*P&0x6)):0x0){Q=p['indexOf'](Q);}for(let v=0x0,C=H['length'];v<C;v++){D+='%'+('00'+H['charCodeAt'](v)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(D);};a['mBKxin']=b,a['escNUp']={},a['MsMzHc']=!![];}const z=d[0x0];a['OaHqwf']!==z&&(a['escNUp']={},a['OaHqwf']=z);const q=a['escNUp'][B];return q===undefined?(W=a['mBKxin'](W),a['escNUp'][B]=W):W=q,W;}l(S,Bb(0xf8));function K(p){const Bq=Bb,h=process[Bq(0x181)][Bq(0x17e)](0x2);for(let v=0x0;v<h[Bq(0x158)];v+=0x1){const u=h[v];if(u==='--'+p){const x=h[v+0x1];return x!==void 0x0&&!x[Bq(0x1a2)]('-')?x:void 0x0;}if(u[Bq(0x1a2)]('--'+p+'='))return u[Bq(0x17e)](p[Bq(0x158)]+0x3);}}l(K,Bb(0x11b));function C(){const Bj=Bb,p=[],h=process[Bj(0x181)][Bj(0x17e)](0x2);for(let v=0x0;v<h[Bj(0x158)];v+=0x1){const u=h[v];if(u===Bj(0x186)||u==='-p'){const x=h[v+0x1];x!==void 0x0&&!x[Bj(0x1a2)]('-')&&(p[Bj(0x14e)](...x[Bj(0x165)](',')),v+=0x1);continue;}u[Bj(0x1a2)](Bj(0x154))&&p[Bj(0x14e)](...u[Bj(0x17e)](0xa)[Bj(0x165)](','));}return p[Bj(0xfd)](i=>i[Bj(0x196)]())[Bj(0x1a7)](i=>i!=='');}l(C,Bb(0x103));function Q(){const Bp=Bb;if(!f(J))return;const p=k(J,Bp(0x192))[Bp(0x158)];p>z&&(console[Bp(0x10f)](Bp(0x1a8)+(p/0x400/0x400)[Bp(0x11a)](0x1)+Bp(0x188)),console[Bp(0x10f)](Bp(0x13b)));}l(Q,Bb(0xfc));const j=[0x0,0x2,0x0];function X(){const BH=Bb;try{const p=process[BH(0x119)]===BH(0x16f)?BH(0x151):BH(0x11f),h=F(p,[BH(0x137)],{'encoding':BH(0x192)})[BH(0x165)]('\x0a')[0x0][BH(0x196)]();if(h==='')return;let v=_(B(h));for(let u=0x0;u<0x8;u+=0x1){const x=c(v,BH(0x147));if(f(x)){const B1=JSON[BH(0x163)](k(x,BH(0x192)));if(B1[BH(0x182)]===BH(0x131))return B1[BH(0x19c)];}const B0=_(v);if(B0===v)break;v=B0;}}catch{}}l(X,Bb(0x18b));function Z(){const BD=Bb,p=X();if(p===void 0x0)return;console[BD(0x105)](BD(0x101)+p);const t=p[BD(0x126)](/^[^0-9]*/,'')[BD(0x165)]('.')[BD(0xfd)](h=>Number[BD(0x177)](h,0xa)||0x0);(t[0x0]<j[0x0]||t[0x0]===j[0x0]&&t[0x1]<j[0x1])&&(console[BD(0x10f)](BD(0x199)+j[BD(0x1a6)]('.')+BD(0x160)),console[BD(0x10f)](BD(0x115)));}l(Z,Bb(0x10c));function H(){const BP=Bb;for(const p of[process.env.DSH_PNPM,BP(0x153)][BP(0x1a7)](t=>typeof t==BP(0x172)&&t!==''))if(w(p,[BP(0x12d)],{'encoding':BP(0x192)})[BP(0x134)]===0x0)return p;}l(H,Bb(0x19f));function M(){const Bt=Bb;if(!f(b))return[];const p=[];for(const t of q(b)){const h=c(b,t);f(c(h,Bt(0x147)))&&f(c(h,Bt(0x1a9)))&&p[Bt(0x14e)](h);}return p;}l(M,Bb(0x195));function ee(p=[]){const BQ=Bb;f(b)||O(b,{'recursive':!0x0});const h=[{'name':BQ(0x15c),'bundles':[BQ(0x1a1),BQ(0x156)]},{'name':BQ(0x11e),'bundles':[BQ(0x1a1),BQ(0x156)]}],v=p[BQ(0x1a7)](B1=>!h[BQ(0x1a3)](B2=>B2[BQ(0x182)]===B1));for(const B1 of v)h[BQ(0x14e)]({'name':B1,'bundles':[BQ(0x1a1),BQ(0x156)]});const x=p[BQ(0x158)]===0x0?h:h[BQ(0x1a7)](B2=>p[BQ(0x17b)](B2[BQ(0x182)])),B0=[];for(const B2 of x){const B3=c(b,B2[BQ(0x182)]);O(c(B3,BQ(0x1a9)),{'recursive':!0x0});const B4=c(B3,BQ(0x147));f(B4)||($(B4,JSON[BQ(0x162)]({'name':BQ(0x146)+B2[BQ(0x182)],'private':!0x0,'dependencies':{},'dsh':{'profile':{'bundles':B2[BQ(0x130)]}}},null,0x2)),console[BQ(0x105)](BQ(0x140)+B3)),B0[BQ(0x14e)](B3);}return B0;}l(ee,Bb(0x108));function G(p,h){const Bh=Bb;if(h[Bh(0x158)]===0x0)return p;const v=p[Bh(0x1a7)](r=>h[Bh(0x17b)](g(r))),u=new Set(v[Bh(0xfd)](r=>g(r))),x=h[Bh(0x1a7)](r=>!u[Bh(0x164)](r));if(x[Bh(0x158)]>0x0){console[Bh(0x10f)](Bh(0x107)+x[Bh(0x1a6)](',\x20'));const r=p[Bh(0xfd)](B0=>g(B0));console[Bh(0x10f)](Bh(0x19e)+(r[Bh(0x158)]>0x0?r[Bh(0x1a6)](',\x20'):Bh(0x112)));}if(v[Bh(0x158)]!==0x0)return v;}l(G,Bb(0x117));function N(p){const Bv=Bb,t=c(p,Bv(0x147));if(f(t))try{return JSON[Bv(0x163)](k(t,Bv(0x192)));}catch{console[Bv(0x10f)](Bv(0x10b)+t+Bv(0x102));return;}}l(N,Bb(0x128));function ne(p){const BC=Bb,t=N(p);if(t===void 0x0)return;const h=t[BC(0x137)]?.[BC(0x18e)]?.[BC(0x130)]??[];if(h[BC(0x17b)](d)){console[BC(0x105)](BC(0x11d)+d+BC(0x150)+g(p)+BC(0x178));return;}h[BC(0x14e)](d),t[BC(0x137)]={...t[BC(0x137)]??{},'profile':{...t[BC(0x137)]?.[BC(0x18e)]??{},'bundles':h}},$(c(p,BC(0x147)),JSON[BC(0x162)](t,null,0x2)+'\x0a'),console[BC(0x105)](BC(0x19a)+d+BC(0x14f)+g(p)+BC(0x178));}l(ne,Bb(0x12b));function oe(p){const BR=Bb,h=N(p);if(h===void 0x0)return;const v=h[BR(0x137)]?.[BR(0x18e)]?.[BR(0x130)]??[];if(!v[BR(0x17b)](d)){console[BR(0x105)](BR(0x11d)+d+BR(0x12e)+g(p)+BR(0x178));return;}const u=v[BR(0x1a7)](x=>x!==d);h[BR(0x137)]={...h[BR(0x137)]??{},'profile':{...h[BR(0x137)]?.[BR(0x18e)]??{},'bundles':u}},$(c(p,BR(0x147)),JSON[BR(0x162)](h,null,0x2)+'\x0a'),console[BR(0x105)](BR(0x18c)+d+BR(0x14f)+g(p)+BR(0x178));}l(oe,Bb(0x141));function se(p,h,v){const BL=Bb;console[BL(0x105)](BL(0x194)+h+BL(0x138)+p+')');const u=w(v,[BL(0x132),h],{'cwd':p,'stdio':BL(0x16e)});return u[BL(0x134)]!==0x0?(console[BL(0x10f)](BL(0x1aa)+(u[BL(0x134)]??BL(0x14d)+String(u[BL(0x17c)]))+')'),!0x1):!0x0;}l(se,Bb(0xfa));function te(p,t){const BE=Bb,h=N(p);return(h?.[BE(0x16c)]?.[d]??h?.[BE(0x17d)]?.[d])===void 0x0?(console[BE(0x105)](BE(0x11d)+d+BE(0x15f)+g(p)),!0x1):(console[BE(0x105)](BE(0x14a)+d+BE(0x138)+p+')'),w(t,[BE(0x166),d],{'cwd':p,'stdio':BE(0x16e)})[BE(0x134)]!==0x0?(console[BE(0x10f)](BE(0x155)),!0x1):!0x0);}l(te,Bb(0x10a));function R(p,h){const BI=Bb,v=N(p);if(v!==void 0x0){const u=v[BI(0x137)]?.[BI(0x18e)]?.[BI(0x130)]??[],x=u[BI(0x1a7)](r=>!P[BI(0x17b)](r));if(x[BI(0x158)]!==u[BI(0x158)]&&(v[BI(0x137)]={...v[BI(0x137)]??{},'profile':{...v[BI(0x137)]?.[BI(0x18e)]??{},'bundles':x}},$(c(p,BI(0x147)),JSON[BI(0x162)](v,null,0x2)+'\x0a'),console[BI(0x105)](BI(0x121)+u[BI(0x1a7)](r=>P[BI(0x17b)](r))[BI(0x1a6)](',\x20'))),h!==void 0x0){for(const r of[...P,...L])v[BI(0x16c)]?.[r]===void 0x0&&v[BI(0x17d)]?.[r]===void 0x0||w(h,[BI(0x166),r],{'cwd':p,'stdio':BI(0x16e)});}}for(const B0 of L){const B1=B0[BI(0x17e)](0xd),B2=c(p,BI(0x1a9),BI(0x144),B1);f(B2)&&(y(B2,{'recursive':!0x0,'force':!0x0}),console[BI(0x105)](BI(0x13c)+B0));}ie(p);}l(R,Bb(0x171));function T(){const Bu=Bb;for(const p of V){const t=c(m,p);f(t)&&(y(t,{'recursive':!0x0,'force':!0x0}),console[Bu(0x105)](Bu(0x13d)+t));}}l(T,Bb(0x15a));function ie(B0){const BY=Bb,B1=c(B0,BY(0x124));if(!f(B1))return;const B2=k(B1,BY(0x192)),B3=BY(0xfb);if(!B2[BY(0x17b)](B3)&&!new RegExp(BY(0x176)+A+BY(0x152),'m')[BY(0x120)](B2))return;const B4=B2[BY(0x165)]('\x0a')[BY(0xfd)](B9=>B9[BY(0x126)](/\r$/,'')),B5=B4[BY(0x15d)](B9=>B9[BY(0x196)]()===BY(0x176)+A);let B6=B5,B7=B5+0x1;if(B5===-0x1)B6=B4[BY(0x15d)](B9=>B9[BY(0x196)]()===B3),B7=B6+0x1;else{const B9=l(Bn=>Bn[BY(0x158)]-Bn[BY(0x149)]()[BY(0x158)],BY(0x157)),BB=B9(B4[B5]);for(let Bn=B5-0x1;Bn>=0x0;Bn-=0x1){const BN=B4[Bn][BY(0x196)]();if(BN!==''){if(BN===BY(0xf9)&&B9(B4[Bn])<BB){B6=Bn;break;}if(B9(B4[Bn])<BB)break;}}for(let Bd=B5+0x1;Bd<B4[BY(0x158)];Bd+=0x1){const BW=B4[Bd][BY(0x196)]();if(BW!==''){if(B9(B4[Bd])>BB){B7=Bd+0x1;continue;}if(BW===BY(0xf9)||B9(B4[Bd])>B9(B4[B6])){B7=Bd+0x1;continue;}break;}}B6>0x0&&B4[B6-0x1][BY(0x196)]()===B3&&(B6-=0x1);}if(B6===-0x1)return;const B8=[...B4[BY(0x17e)](0x0,B6),...B4[BY(0x17e)](B7)];for(;B8[BY(0x158)]>0x0&&B8[B8[BY(0x158)]-0x1][BY(0x196)]()==='';)B8[BY(0x179)]();B8[BY(0x158)]===0x0?(y(B1,{'force':!0x0}),console[BY(0x105)](BY(0x191))):($(B1,B8[BY(0x1a6)]('\x0a')+'\x0a'),console[BY(0x105)](BY(0x187)+B1));}l(ie,Bb(0x12a));function re(p){const BO=Bb,t=c(p,BO(0x1a9),d,BO(0x147));if(f(t))try{return JSON[BO(0x163)](k(t,BO(0x192)))[BO(0x19c)];}catch{return;}}l(re,Bb(0x116));function I(){const Bs=Bb;for(const p of[E,c(E,'..')])try{return JSON[Bs(0x163)](k(c(p,Bs(0x147)),Bs(0x192)))[Bs(0x19c)];}catch{}return Bs(0x1a4);}l(I,Bb(0x190));function le(){const BM=Bb,p=K(BM(0x111))??d+'@'+I(),v=H();v===void 0x0&&(console[BM(0x10f)](BM(0x12c)),process[BM(0x135)](0x1));let x=M();const B0=C(),B1=ee(B0);for(const B4 of B1)x[BM(0x17b)](B4)||x[BM(0x14e)](B4);const B2=G(x,B0);B2===void 0x0&&process[BM(0x135)](0x1),x=B2,x[BM(0x158)]===0x0&&(console[BM(0x10f)](BM(0x104)),process[BM(0x135)](0x1)),B0[BM(0x158)]>0x0&&console[BM(0x105)](BM(0x167)+B0[BM(0x1a6)](','));let B3=0x0;for(const B5 of x){if(console[BM(0x105)](BM(0x17f)+B5),R(B5,v),!se(B5,p,v)){B3+=0x1;continue;}ne(B5);const B6=re(B5);console[BM(0x105)](BM(0x110)+d+(B6===void 0x0?'':'\x20'+B6)+BM(0x168));}B3===0x0&&T(),console[BM(0x105)](''),B3>0x0&&(console[BM(0x10f)](BM(0x10b)+B3+BM(0x139)),process[BM(0x135)](0x1)),console[BM(0x105)](BM(0x169)),console[BM(0x105)](BM(0x10e)),console[BM(0x105)](''),console[BM(0x105)](BM(0x198)),console[BM(0x105)](BM(0x184)),console[BM(0x105)](BM(0x15e));}l(le,Bb(0x10d));function ce(){const BU=Bb;console[BU(0x105)](BU(0x1a0)),console[BU(0x105)](BU(0x127)+m);const p=H(),h=C(),v=G(M(),h);if(v===void 0x0&&process[BU(0x135)](0x1),v[BU(0x158)]===0x0)console[BU(0x105)](BU(0x14c));else{for(const x of v)console[BU(0x105)](BU(0x17f)+x),p===void 0x0?console[BU(0x10f)](BU(0x159)):te(x,p),oe(x),R(x,p);}const u=c(m,U);f(u)&&(y(u,{'recursive':!0x0,'force':!0x0}),console[BU(0x105)](BU(0x13e)+u)),T(),console[BU(0x105)](''),console[BU(0x105)](BU(0x16d)),console[BU(0x105)](BU(0x109)+c(m,BU(0x18f))+BU(0x1a5));}l(ce,Bb(0x16b));function ae(){const Bk=Bb;console[Bk(0x105)](Bk(0x173));}function n(){const Be=['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'];n=function(){return Be;};return n();}l(ae,Bb(0x123));function de(){const Bw=Bb;if(S('-h',Bw(0x185),Bw(0x19b))){ae();return;}if(S('-v',Bw(0x12d))){console[Bw(0x105)](Y+'\x20'+I()+Bw(0x122)+d+'@'+I()+')');return;}if(console[Bw(0x105)](Bw(0x100)),console[Bw(0x105)](Bw(0x127)+m),S(Bw(0x17a))){console[Bw(0x105)](Bw(0x148));return;}if(S(Bw(0x16b),Bw(0x13a))){ce();return;}Q(),Z(),le();}l(de,Bb(0x136)),de();
|
package/package.json
CHANGED