dsh-plugin-wukong-cli 0.22.1 → 0.23.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 +24 -0
- package/README.en.md +34 -2
- package/README.md +34 -2
- 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.23.0] - 2026-10
|
|
10
|
+
|
|
11
|
+
### 新增 · Added
|
|
12
|
+
- **生图:`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「🖼️ 生图」。
|
|
13
|
+
**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".
|
|
14
|
+
- **生图在对话里的展示**:用 `tool.call.toolview` 按工具名 `generate_image` 注册自己的视图,替换宿主默认的工具卡片。进行中显示与成图同比例的骨架占位(点阵加一道很淡的扫光,浅色 / 深色主题都可见,开了「减少动态效果」时不动);成功后收成一行「Generated … at <路径>」,图由助手在回复里用 Markdown 嵌入(工具说明里要求了),避免同一张图在工具卡片与回复里各出现一次;失败显示一行错误文字。
|
|
15
|
+
**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.
|
|
16
|
+
|
|
17
|
+
### 修复 · Fixed
|
|
18
|
+
- **`generate_image` 调用时传的 `size` / `quality` 之前不会发给 API**:工具算出了覆盖后的值并写进返回结果,但请求体用的仍是面板里的默认值,返回的尺寸与实际出图参数对不上。现在覆盖值真正进入请求,并补了断言请求体的测试。
|
|
19
|
+
**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.
|
|
20
|
+
|
|
21
|
+
## [0.22.2] - 2026-10
|
|
22
|
+
|
|
23
|
+
### 新增 · Added
|
|
24
|
+
- **会话「编辑重发」与「分叉」**:把鼠标移到某条用户消息上,「时间 + 复制」那一行(整行只在悬停时显示)多出「编辑」「分叉」两个图标。「编辑」把这条消息就地换成与底部输入框同款的编辑框(带圆形发送按钮),发送后跳转到新会话,原会话移入回收站,可恢复:编辑**第一条**消息等同新建对话(同一工作区新建会话,标题由宿主按新对话生成);编辑**后面**的消息从该消息所在轮次之前分叉,并沿用原标题。「分叉」只从该消息之前分叉并跳转,不发送。入口通过 Portal 落到宿主的用户消息节点上(依赖 `data-chat-flow-kind="user"` 与 `data-clock="start"`),宿主没有给用户消息开扩展座位。
|
|
25
|
+
**Edit & resend and Fork on a user message**: hover a user message and its "time + copy" row (shown only on hover) gains two icons, Edit and Fork. Edit swaps the message in place for an editor styled like the composer below (with a round send button); sending switches to the new session and moves the original to the recycle bin, where it can be restored. Editing the **first** message is a brand-new conversation (a fresh session in the same workspace, titled by the host like any new one); editing a **later** message forks from just before its turn and keeps the original title. Fork only forks from just before the message and switches, sending nothing. The entry points are portalled onto the host's user-message node (relying on `data-chat-flow-kind="user"` and `data-clock="start"`); the host exposes no extension seat for user messages.
|
|
26
|
+
- **归档管理(设置 → 归档管理)**:已归档 / 未归档 / 回收站三个页签,按工作区分组;支持单条与工作区/全部的归档、取消归档、移入回收站、恢复,永久删除与清空回收站先确认范围与数量。宿主日志只追加、没有删除接口,所以「移入回收站」是把会话目录 `rename` 到 `$DSH_HOME/wukong/trash/`、写入 `trash.json` 并清理工作区注册表;宿主里一直驻留内存的已归档会话会先按宿主自己的销毁顺序卸载再移动;永久删除先持久化意图再删数据,中断后启动时自动续作或修复。设计参考 [Ultronen/dsh-archived-chats](https://github.com/Ultronen/dsh-archived-chats)(MIT),为本插件独立实现,本版不含预览、搜索、备份、保留策略与来源树。新增路由 `GET /api/wukong/archive/state`,`POST /api/wukong/archive/{archive,unarchive,trash,restore,purge,discard,fork-point}`。设置导航里「归档管理」使用宿主自带的归档盒图标,「Wukong」换成自己的图标。
|
|
27
|
+
**Archive management (Settings → Archive Management)**: Archived / Active / Recycle bin tabs grouped by workspace, with archive, unarchive, move to the bin and restore for one session, a workspace or everything; permanent delete and emptying the bin confirm the scope and count first. The host log is append-only and has no delete API, so "move to the bin" `rename`s the session directory into `$DSH_HOME/wukong/trash/`, records it in `trash.json` and cleans the workspace registry; an archived session the host keeps resident is first unloaded with the host's own teardown sequence; a permanent delete persists its intent before deleting bytes, and an interrupted one is finished or repaired at startup. The design follows [Ultronen/dsh-archived-chats](https://github.com/Ultronen/dsh-archived-chats) (MIT) but is an independent implementation; this version has no preview, search, backup, retention policy or lineage tree. New routes: `GET /api/wukong/archive/state` and `POST /api/wukong/archive/{archive,unarchive,trash,restore,purge,discard,fork-point}`. In the settings navigation, Archive Management uses the host's own archive-box icon and Wukong gets its own glyph.
|
|
28
|
+
|
|
29
|
+
### 修复 · Fixed
|
|
30
|
+
- **编辑重发不再留下空的「已完成」轮次**:宿主日志里用户消息位于 `turn/start` 之后,原先在「消息 seq − 1」处分叉会切在未结束的轮次中间,宿主补出空轮次,每次编辑多一个。现在由宿主按日志算出干净的分叉点(上一轮的 `turn/end`,跳过排队用的 `agent/inbox/spliced`)。
|
|
31
|
+
**Edit & resend no longer leaves empty "completed" turns**: in the host log a user message sits after its `turn/start`, so forking at "message seq − 1" cut inside an open turn and the host closed it with an empty one — one more per edit. The host now computes a clean fork point from the log (the previous turn's `turn/end`, skipping the `agent/inbox/spliced` that queued the message).
|
|
32
|
+
|
|
9
33
|
## [0.22.1] - 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
|

|
|
@@ -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,42 @@ 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 / output directory if you like, and save; then just ask the assistant for "an image of …". **No model name is built in**: calling it before both are chosen 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
|
+
| `output_path` | where to save, relative to the session working directory or absolute; defaults to `<output dir>/<prompt slug>-<timestamp>.<ext>`, the output dir defaulting to `output/imagegen` |
|
|
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
|
+
**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).
|
|
183
|
+
|
|
184
|
+
> A missing or invalid preference (`size`, `quality`, …) falls back to its default; only the Provider and model must be chosen by you. The tool is registered when dsh starts, so **restart dsh after updating the plugin**; a pure styling change to the panel view only needs a page refresh.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
157
188
|
## 🗄️ State and data
|
|
158
189
|
|
|
159
190
|
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
191
|
|
|
161
192
|
| Path | Contents |
|
|
162
193
|
|---|---|
|
|
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) |
|
|
194
|
+
| `$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
195
|
| `$DSH_HOME/wukong/wallpapers/` | uploaded wallpaper / video bytes |
|
|
165
196
|
| `$DSH_HOME/skills/` | skills installed from a zip or a directory (the official filesystem skill provider scans and watches this root) |
|
|
166
197
|
| `$DSH_HOME/wukong/exports/` | conversation export zips |
|
|
@@ -283,6 +314,7 @@ DSH runtime (0.2.0-rc.2)
|
|
|
283
314
|
|
|
284
315
|
- **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
316
|
- **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`.
|
|
286
318
|
- **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
319
|
- **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
320
|
- **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,42 @@ 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 与模型(目录与提示词增强、输入框模型选择器是同一份),按需调默认尺寸 / 质量 / 格式 / 输出目录,保存;然后直接对助手说「生成一张……」。**不预置任何模型名**:没选全就调用会明确报错(`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
|
+
| `output_path` | 保存路径,相对会话工作目录或绝对路径;缺省为 `<输出目录>/<提示词slug>-<时间戳>.<扩展名>`,输出目录默认 `output/imagegen` |
|
|
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
|
+
**错误码**(`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` 下载失败)。
|
|
183
|
+
|
|
184
|
+
> 设置里的 `size` / `quality` 等偏好缺失或非法时回落到默认值;只有 Provider 与模型必须由你选。工具注册发生在 dsh 启动时,**更新插件后需要重启 dsh**;只改面板视图的样式时刷新页面即可。
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
157
188
|
## 🗄️ 状态与数据
|
|
158
189
|
|
|
159
190
|
0.12.0 起,Wukong 不再使用 harness 的 settings 命名空间:全部托管状态放在插件自己的文档与目录里。
|
|
160
191
|
|
|
161
192
|
| 路径 | 内容 |
|
|
162
193
|
|---|---|
|
|
163
|
-
| `$DSH_HOME/wukong/state.json`(默认 `~/.dsh/wukong/state.json`) | 提示词、托管技能、自定义命令、MCP 服务器、壁纸/特效设置(壁纸只存 id
|
|
194
|
+
| `$DSH_HOME/wukong/state.json`(默认 `~/.dsh/wukong/state.json`) | 提示词、托管技能、自定义命令、MCP 服务器、壁纸/特效设置(壁纸只存 id)、生图设置(Provider / 模型 / 默认尺寸等;端点与密钥不存这里) |
|
|
164
195
|
| `$DSH_HOME/wukong/wallpapers/` | 上传的壁纸 / 视频字节 |
|
|
165
196
|
| `$DSH_HOME/skills/` | zip / 目录方式安装的技能(官方 filesystem 技能 provider 扫描并监听该根目录) |
|
|
166
197
|
| `$DSH_HOME/wukong/exports/` | 对话导出 zip |
|
|
@@ -283,6 +314,7 @@ DSH 运行时(0.2.0-rc.2)
|
|
|
283
314
|
|
|
284
315
|
- **插件包一个包,两个面**:`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
316
|
- **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`),设置、Provider 路由与附件服务都按次读取;对话展示视图由面板侧在 `tool.call.toolview` 按工具名注册。
|
|
286
318
|
- **面板侧**通过插件自有的同源路由读写状态文档,技能目录走插件自己的 `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
319
|
- **可选 peer**:`@deepseek-ai/*` 运行时包与 `react` 全部在 `peerDependenciesMeta` 里标为 `optional`,运行时 `dependencies` 为空。原因是这些运行时包不在公共 npm 源上,写成必选 peer 会让 `pnpm add` 直接 `ERR_PNPM_FETCH_404` 失败;标成可选后 pnpm 能顺利安装,模块仍由宿主在运行时提供。
|
|
288
320
|
- **安装器**(`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 Th=n;(function(h,s){const Tq=n,r=h();while(!![]){try{const e=-parseInt(Tq(0x18d))/0x1*(-parseInt(Tq(0x183))/0x2)+parseInt(Tq(0x14b))/0x3+parseInt(Tq(0x125))/0x4*(-parseInt(Tq(0x133))/0x5)+parseInt(Tq(0x129))/0x6*(parseInt(Tq(0x15b))/0x7)+-parseInt(Tq(0x13f))/0x8*(parseInt(Tq(0x197))/0x9)+parseInt(Tq(0x19d))/0xa+-parseInt(Tq(0x118))/0xb*(parseInt(Tq(0x145))/0xc);if(e===s)break;else r['push'](r['shift']());}catch(t){r['push'](r['shift']());}}}(o,0xa2eb9));var W=Object[Th(0x12f)],l=(h,s)=>W(h,Th(0x182),{'value':s,'configurable':!0x0});const {existsSync:f,mkdirSync:O,readFileSync:k,readdirSync:q,realpathSync:B,rmSync:y,writeFileSync:$}=require(Th(0x180)),{homedir:D}=require(Th(0xfe)),{basename:g,dirname:_,join:c}=require(Th(0x18a)),{execFileSync:F,spawnSync:w}=require(Th(0x193)),E=__dirname,d=Th(0xff),Y=Th(0x189),P=[Th(0x142),Th(0x106)],L=[Th(0x106),Th(0x161)],A=Th(0x143),U=Th(0x113),V=[Th(0x175),Th(0x114),Th(0x11c)],m=process.env.DSH_HOME??c(D(),Th(0x170)),b=c(m,Th(0x16a)),J=c(m,Th(0x174)),z=0x4*0x400*0x400;function S(...h){const Tb=Th;return process[Tb(0x181)][Tb(0x17e)](0x2)[Tb(0x1a3)](s=>h[Tb(0x17b)](s));}function n(T,Q){T=T-0xf8;const H=o();let q=H[T];if(n['MsMzHc']===undefined){var h=function(s){const j='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let K='',L='';for(let V=0x0,Z,r,c=0x0;r=s['charAt'](c++);~r&&(Z=V%0x4?Z*0x40+r:r,V++%0x4)?K+=String['fromCharCode'](0xff&Z>>(-0x2*V&0x6)):0x0){r=j['indexOf'](r);}for(let S=0x0,I=K['length'];S<I;S++){L+='%'+('00'+K['charCodeAt'](S)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(L);};n['mBKxin']=h,n['escNUp']={},n['MsMzHc']=!![];}const b=H[0x0];n['OaHqwf']!==b&&(n['escNUp']={},n['OaHqwf']=b);const W=n['escNUp'][T];return W===undefined?(q=n['mBKxin'](q),n['escNUp'][T]=q):q=W,q;}l(S,Th(0xf8));function K(h){const TW=Th,r=process[TW(0x181)][TW(0x17e)](0x2);for(let v=0x0;v<r[TW(0x158)];v+=0x1){const a=r[v];if(a==='--'+h){const x=r[v+0x1];return x!==void 0x0&&!x[TW(0x1a2)]('-')?x:void 0x0;}if(a[TW(0x1a2)]('--'+h+'='))return a[TW(0x17e)](h[TW(0x158)]+0x3);}}l(K,Th(0x11b));function C(){const Ts=Th,h=[],r=process[Ts(0x181)][Ts(0x17e)](0x2);for(let v=0x0;v<r[Ts(0x158)];v+=0x1){const a=r[v];if(a===Ts(0x186)||a==='-p'){const x=r[v+0x1];x!==void 0x0&&!x[Ts(0x1a2)]('-')&&(h[Ts(0x14e)](...x[Ts(0x165)](',')),v+=0x1);continue;}a[Ts(0x1a2)](Ts(0x154))&&h[Ts(0x14e)](...a[Ts(0x17e)](0xa)[Ts(0x165)](','));}return h[Ts(0xfd)](u=>u[Ts(0x196)]())[Ts(0x1a7)](u=>u!=='');}l(C,Th(0x103));function Q(){const Tj=Th;if(!f(J))return;const h=k(J,Tj(0x192))[Tj(0x158)];h>z&&(console[Tj(0x10f)](Tj(0x1a8)+(h/0x400/0x400)[Tj(0x11a)](0x1)+Tj(0x188)),console[Tj(0x10f)](Tj(0x13b)));}l(Q,Th(0xfc));const j=[0x0,0x2,0x0];function X(){const TK=Th;try{const h=process[TK(0x119)]===TK(0x16f)?TK(0x151):TK(0x11f),v=F(h,[TK(0x137)],{'encoding':TK(0x192)})[TK(0x165)]('\x0a')[0x0][TK(0x196)]();if(v==='')return;let a=_(B(v));for(let x=0x0;x<0x8;x+=0x1){const u=c(a,TK(0x147));if(f(u)){const T0=JSON[TK(0x163)](k(u,TK(0x192)));if(T0[TK(0x182)]===TK(0x131))return T0[TK(0x19c)];}const p=_(a);if(p===a)break;a=p;}}catch{}}l(X,Th(0x18b));function Z(){const TL=Th,h=X();if(h===void 0x0)return;console[TL(0x105)](TL(0x101)+h);const s=h[TL(0x126)](/^[^0-9]*/,'')[TL(0x165)]('.')[TL(0xfd)](r=>Number[TL(0x177)](r,0xa)||0x0);(s[0x0]<j[0x0]||s[0x0]===j[0x0]&&s[0x1]<j[0x1])&&(console[TL(0x10f)](TL(0x199)+j[TL(0x1a6)]('.')+TL(0x160)),console[TL(0x10f)](TL(0x115)));}l(Z,Th(0x10c));function H(){const TV=Th;for(const h of[process.env.DSH_PNPM,TV(0x153)][TV(0x1a7)](s=>typeof s==TV(0x172)&&s!==''))if(w(h,[TV(0x12d)],{'encoding':TV(0x192)})[TV(0x134)]===0x0)return h;}l(H,Th(0x19f));function M(){const TZ=Th;if(!f(b))return[];const h=[];for(const s of q(b)){const r=c(b,s);f(c(r,TZ(0x147)))&&f(c(r,TZ(0x1a9)))&&h[TZ(0x14e)](r);}return h;}l(M,Th(0x195));function ee(h=[]){const Tr=Th;f(b)||O(b,{'recursive':!0x0});const v=[{'name':Tr(0x15c),'bundles':[Tr(0x1a1),Tr(0x156)]},{'name':Tr(0x11e),'bundles':[Tr(0x1a1),Tr(0x156)]}],a=h[Tr(0x1a7)](T0=>!v[Tr(0x1a3)](T1=>T1[Tr(0x182)]===T0));for(const T0 of a)v[Tr(0x14e)]({'name':T0,'bundles':[Tr(0x1a1),Tr(0x156)]});const x=h[Tr(0x158)]===0x0?v:v[Tr(0x1a7)](T1=>h[Tr(0x17b)](T1[Tr(0x182)])),p=[];for(const T1 of x){const T2=c(b,T1[Tr(0x182)]);O(c(T2,Tr(0x1a9)),{'recursive':!0x0});const T3=c(T2,Tr(0x147));f(T3)||($(T3,JSON[Tr(0x162)]({'name':Tr(0x146)+T1[Tr(0x182)],'private':!0x0,'dependencies':{},'dsh':{'profile':{'bundles':T1[Tr(0x130)]}}},null,0x2)),console[Tr(0x105)](Tr(0x140)+T2)),p[Tr(0x14e)](T2);}return p;}l(ee,Th(0x108));function G(h,r){const Tc=Th;if(r[Tc(0x158)]===0x0)return h;const v=h[Tc(0x1a7)](u=>r[Tc(0x17b)](g(u))),a=new Set(v[Tc(0xfd)](u=>g(u))),x=r[Tc(0x1a7)](u=>!a[Tc(0x164)](u));if(x[Tc(0x158)]>0x0){console[Tc(0x10f)](Tc(0x107)+x[Tc(0x1a6)](',\x20'));const u=h[Tc(0xfd)](p=>g(p));console[Tc(0x10f)](Tc(0x19e)+(u[Tc(0x158)]>0x0?u[Tc(0x1a6)](',\x20'):Tc(0x112)));}if(v[Tc(0x158)]!==0x0)return v;}l(G,Th(0x117));function N(h){const TS=Th,s=c(h,TS(0x147));if(f(s))try{return JSON[TS(0x163)](k(s,TS(0x192)));}catch{console[TS(0x10f)](TS(0x10b)+s+TS(0x102));return;}}l(N,Th(0x128));function ne(h){const TI=Th,s=N(h);if(s===void 0x0)return;const r=s[TI(0x137)]?.[TI(0x18e)]?.[TI(0x130)]??[];if(r[TI(0x17b)](d)){console[TI(0x105)](TI(0x11d)+d+TI(0x150)+g(h)+TI(0x178));return;}r[TI(0x14e)](d),s[TI(0x137)]={...s[TI(0x137)]??{},'profile':{...s[TI(0x137)]?.[TI(0x18e)]??{},'bundles':r}},$(c(h,TI(0x147)),JSON[TI(0x162)](s,null,0x2)+'\x0a'),console[TI(0x105)](TI(0x19a)+d+TI(0x14f)+g(h)+TI(0x178));}l(ne,Th(0x12b));function oe(h){const Te=Th,s=N(h);if(s===void 0x0)return;const r=s[Te(0x137)]?.[Te(0x18e)]?.[Te(0x130)]??[];if(!r[Te(0x17b)](d)){console[Te(0x105)](Te(0x11d)+d+Te(0x12e)+g(h)+Te(0x178));return;}const v=r[Te(0x1a7)](a=>a!==d);s[Te(0x137)]={...s[Te(0x137)]??{},'profile':{...s[Te(0x137)]?.[Te(0x18e)]??{},'bundles':v}},$(c(h,Te(0x147)),JSON[Te(0x162)](s,null,0x2)+'\x0a'),console[Te(0x105)](Te(0x18c)+d+Te(0x14f)+g(h)+Te(0x178));}l(oe,Th(0x141));function se(h,s,r){const TA=Th;console[TA(0x105)](TA(0x194)+s+TA(0x138)+h+')');const v=w(r,[TA(0x132),s],{'cwd':h,'stdio':TA(0x16e)});return v[TA(0x134)]!==0x0?(console[TA(0x10f)](TA(0x1aa)+(v[TA(0x134)]??TA(0x14d)+String(v[TA(0x17c)]))+')'),!0x1):!0x0;}l(se,Th(0xfa));function te(h,s){const Tt=Th,r=N(h);return(r?.[Tt(0x16c)]?.[d]??r?.[Tt(0x17d)]?.[d])===void 0x0?(console[Tt(0x105)](Tt(0x11d)+d+Tt(0x15f)+g(h)),!0x1):(console[Tt(0x105)](Tt(0x14a)+d+Tt(0x138)+h+')'),w(s,[Tt(0x166),d],{'cwd':h,'stdio':Tt(0x16e)})[Tt(0x134)]!==0x0?(console[Tt(0x10f)](Tt(0x155)),!0x1):!0x0);}l(te,Th(0x10a));function R(h,r){const TE=Th,v=N(h);if(v!==void 0x0){const a=v[TE(0x137)]?.[TE(0x18e)]?.[TE(0x130)]??[],x=a[TE(0x1a7)](u=>!P[TE(0x17b)](u));if(x[TE(0x158)]!==a[TE(0x158)]&&(v[TE(0x137)]={...v[TE(0x137)]??{},'profile':{...v[TE(0x137)]?.[TE(0x18e)]??{},'bundles':x}},$(c(h,TE(0x147)),JSON[TE(0x162)](v,null,0x2)+'\x0a'),console[TE(0x105)](TE(0x121)+a[TE(0x1a7)](u=>P[TE(0x17b)](u))[TE(0x1a6)](',\x20'))),r!==void 0x0){for(const u of[...P,...L])v[TE(0x16c)]?.[u]===void 0x0&&v[TE(0x17d)]?.[u]===void 0x0||w(r,[TE(0x166),u],{'cwd':h,'stdio':TE(0x16e)});}}for(const p of L){const T0=p[TE(0x17e)](0xd),T1=c(h,TE(0x1a9),TE(0x144),T0);f(T1)&&(y(T1,{'recursive':!0x0,'force':!0x0}),console[TE(0x105)](TE(0x13c)+p));}ie(h);}l(R,Th(0x171));function T(){const Tv=Th;for(const h of V){const s=c(m,h);f(s)&&(y(s,{'recursive':!0x0,'force':!0x0}),console[Tv(0x105)](Tv(0x13d)+s));}}l(T,Th(0x15a));function ie(T0){const Ta=Th,T1=c(T0,Ta(0x124));if(!f(T1))return;const T2=k(T1,Ta(0x192)),T3=Ta(0xfb);if(!T2[Ta(0x17b)](T3)&&!new RegExp(Ta(0x176)+A+Ta(0x152),'m')[Ta(0x120)](T2))return;const T4=T2[Ta(0x165)]('\x0a')[Ta(0xfd)](T9=>T9[Ta(0x126)](/\r$/,'')),T5=T4[Ta(0x15d)](T9=>T9[Ta(0x196)]()===Ta(0x176)+A);let T6=T5,T7=T5+0x1;if(T5===-0x1)T6=T4[Ta(0x15d)](T9=>T9[Ta(0x196)]()===T3),T7=T6+0x1;else{const T9=l(TQ=>TQ[Ta(0x158)]-TQ[Ta(0x149)]()[Ta(0x158)],Ta(0x157)),TT=T9(T4[T5]);for(let TQ=T5-0x1;TQ>=0x0;TQ-=0x1){const TH=T4[TQ][Ta(0x196)]();if(TH!==''){if(TH===Ta(0xf9)&&T9(T4[TQ])<TT){T6=TQ;break;}if(T9(T4[TQ])<TT)break;}}for(let To=T5+0x1;To<T4[Ta(0x158)];To+=0x1){const Tn=T4[To][Ta(0x196)]();if(Tn!==''){if(T9(T4[To])>TT){T7=To+0x1;continue;}if(Tn===Ta(0xf9)||T9(T4[To])>T9(T4[T6])){T7=To+0x1;continue;}break;}}T6>0x0&&T4[T6-0x1][Ta(0x196)]()===T3&&(T6-=0x1);}if(T6===-0x1)return;const T8=[...T4[Ta(0x17e)](0x0,T6),...T4[Ta(0x17e)](T7)];for(;T8[Ta(0x158)]>0x0&&T8[T8[Ta(0x158)]-0x1][Ta(0x196)]()==='';)T8[Ta(0x179)]();T8[Ta(0x158)]===0x0?(y(T1,{'force':!0x0}),console[Ta(0x105)](Ta(0x191))):($(T1,T8[Ta(0x1a6)]('\x0a')+'\x0a'),console[Ta(0x105)](Ta(0x187)+T1));}l(ie,Th(0x12a));function re(h){const Tf=Th,s=c(h,Tf(0x1a9),d,Tf(0x147));if(f(s))try{return JSON[Tf(0x163)](k(s,Tf(0x192)))[Tf(0x19c)];}catch{return;}}l(re,Th(0x116));function I(){const TO=Th;for(const h of[E,c(E,'..')])try{return JSON[TO(0x163)](k(c(h,TO(0x147)),TO(0x192)))[TO(0x19c)];}catch{}return TO(0x1a4);}l(I,Th(0x190));function le(){const Tx=Th,v=K(Tx(0x111))??d+'@'+I(),a=H();a===void 0x0&&(console[Tx(0x10f)](Tx(0x12c)),process[Tx(0x135)](0x1));let x=M();const p=C(),T0=ee(p);for(const T3 of T0)x[Tx(0x17b)](T3)||x[Tx(0x14e)](T3);const T1=G(x,p);T1===void 0x0&&process[Tx(0x135)](0x1),x=T1,x[Tx(0x158)]===0x0&&(console[Tx(0x10f)](Tx(0x104)),process[Tx(0x135)](0x1)),p[Tx(0x158)]>0x0&&console[Tx(0x105)](Tx(0x167)+p[Tx(0x1a6)](','));let T2=0x0;for(const T4 of x){if(console[Tx(0x105)](Tx(0x17f)+T4),R(T4,a),!se(T4,v,a)){T2+=0x1;continue;}ne(T4);const T5=re(T4);console[Tx(0x105)](Tx(0x110)+d+(T5===void 0x0?'':'\x20'+T5)+Tx(0x168));}T2===0x0&&T(),console[Tx(0x105)](''),T2>0x0&&(console[Tx(0x10f)](Tx(0x10b)+T2+Tx(0x139)),process[Tx(0x135)](0x1)),console[Tx(0x105)](Tx(0x169)),console[Tx(0x105)](Tx(0x10e)),console[Tx(0x105)](''),console[Tx(0x105)](Tx(0x198)),console[Tx(0x105)](Tx(0x184)),console[Tx(0x105)](Tx(0x15e));}l(le,Th(0x10d));function ce(){const Tu=Th;console[Tu(0x105)](Tu(0x1a0)),console[Tu(0x105)](Tu(0x127)+m);const h=H(),r=C(),v=G(M(),r);if(v===void 0x0&&process[Tu(0x135)](0x1),v[Tu(0x158)]===0x0)console[Tu(0x105)](Tu(0x14c));else{for(const x of v)console[Tu(0x105)](Tu(0x17f)+x),h===void 0x0?console[Tu(0x10f)](Tu(0x159)):te(x,h),oe(x),R(x,h);}const a=c(m,U);f(a)&&(y(a,{'recursive':!0x0,'force':!0x0}),console[Tu(0x105)](Tu(0x13e)+a)),T(),console[Tu(0x105)](''),console[Tu(0x105)](Tu(0x16d)),console[Tu(0x105)](Tu(0x109)+c(m,Tu(0x18f))+Tu(0x1a5));}l(ce,Th(0x16b));function ae(){const TU=Th;console[TU(0x105)](TU(0x173));}function o(){const Tp=['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'];o=function(){return Tp;};return o();}l(ae,Th(0x123));function de(){const TB=Th;if(S('-h',TB(0x185),TB(0x19b))){ae();return;}if(S('-v',TB(0x12d))){console[TB(0x105)](Y+'\x20'+I()+TB(0x122)+d+'@'+I()+')');return;}if(console[TB(0x105)](TB(0x100)),console[TB(0x105)](TB(0x127)+m),S(TB(0x17a))){console[TB(0x105)](TB(0x148));return;}if(S(TB(0x16b),TB(0x13a))){ce();return;}Q(),Z(),le();}l(de,Th(0x136)),de();
|
|
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();
|
package/package.json
CHANGED