dsh-codinput 0.3.2 → 0.3.6
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 +75 -0
- package/README.en.md +9 -0
- package/README.md +13 -0
- package/TESTING.md +3 -0
- package/lib/client.js +47 -41
- package/package.json +1 -1
- package/src/client/components/CodinputBar.tsx +6 -0
- package/src/client/components/CodinputSurface.tsx +7 -1
- package/src/client/components/InputLeftSlot.tsx +26 -0
- package/src/client/components/InputRightSlot.tsx +26 -0
- package/src/client/components/InputSlotSeat.tsx +49 -0
- package/src/client/components/MenuSurface.tsx +53 -23
- package/src/client/components/ModelSlot.tsx +83 -0
- package/src/client/components/PopupSelectView.tsx +3 -2
- package/src/client/components/Toolbar.tsx +32 -5
- package/src/client/components/slotEntry.tsx +249 -5
- package/src/client/host-types.ts +8 -0
- package/src/client/sidebar.tsx +5 -0
- package/src/client/styles.ts +17 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,81 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
4
4
|
|
|
5
|
+
## [0.3.6] — 2026-10-28
|
|
6
|
+
|
|
7
|
+
模型座让位(issue #4):`conversation.input.model` 单值座上的第三方遮蔽者恢复显示;出厂 ModelSelect 不镜像,继续由自绘模型芯片代表。
|
|
8
|
+
|
|
9
|
+
### 新增
|
|
10
|
+
|
|
11
|
+
- **`conversation.input.model` 单值座让位镜像**(`ModelSlot`):以 priority 遮蔽宿主模型座的插件(reasoning-slider / dsh-effort-dial 一类)注册会成功、条目确实是单值座赢家,但官方 InputBar 被遮蔽后该座唯一的 `renderSlot` 调用点随之消失——「不报错、永不上屏」(issue #4)。接管工具行现于官方同位(`.dci-standard-controls` 内、`input.right` 之后)镜像该座赢家,并把官方 `InputControlOwnerProps` 的 owner prop `locked` 原样下发。有第三方遮蔽者时让位并隐藏自绘模型芯片(同座只留一个控件,与官方单值座语义一致);无遮蔽者时保持既有自绘芯片(普通/悬浮/侧栏三形态同享)。
|
|
12
|
+
- **单值座「第三方遮蔽者」判据**(`isShadowingOccupant`):宿主动态包守卫对非 chain 槽位的 register **强制**分配页内遮蔽秩(`options.priority` 为唯一负数)、fiber 名取 `dyn/<pluginId>`;出厂占用者(client-ui-model-selection 的 ModelSelect)不带 priority(≡0)。只镜像前者——镜像出厂条目会与自绘芯片重复成两个模型选择器。
|
|
13
|
+
- **让位失败降级**:条目 `inject(sessionId)` 是宿主 fiber 上下文里的闭包,插件侧调用会丢 ctx 绑定,依赖宿主服务面的 inject 会抛错(实测 dsh-model-accordion 0.2.1 的 `directoryFor` 抛 `cannot get property "remote.session" without inject`)。`entryInjectFailed` 预检 + 条目边界 `fallback` 让单值座在「inject 不可复现 / 组件崩溃」时回退自绘芯片,而不是留空或连坐输入面。
|
|
14
|
+
|
|
15
|
+
### 说明
|
|
16
|
+
|
|
17
|
+
- **已实测**(真实 web 宿主 `0.2.0-rc.2`,本地 link 安装本仓库构建产物,Chromium 自动化探针):reasoning-slider 0.0.7 与 dsh-effort-dial 0.1.0 均在官方模型座原位显示(`.dci-standard-controls` 内 `input.right` 座位之后)、自绘芯片隐藏、弹层可打开并读出真实模型/推理档位;卸载插件后自绘芯片原样恢复;同屏右座(dsh-prompt-enhancer)无回归;`__dshCodinputErrs` 为空、无控制台报错。
|
|
18
|
+
- **降级实测**:dsh-model-accordion 0.2.1(带 inject 面)在模型座降级回自绘芯片——座位不空、无控制台报错,仅 `__dshCodinputErrs` 记一条 `slot.inject` 诊断(其 inject 依赖宿主 ctx,插件侧不可复现)。
|
|
19
|
+
- **机制覆盖未逐一实测**:悬浮 / 侧栏两形态与普通形态共用同一 Toolbar(座位自动同享);`locked` 置灰只在会话拒绝交互时可见(官方语义 `removed || inert || !live`,Codinput 下发自身 `inert`,含 blocked,口径略严一档)。
|
|
20
|
+
- **边界**:第三方若自行给该座补声明 children 会与宿主已声明冲突(宿主 `already declared`),镜像层不做;多个插件同时遮蔽同一单值座属槽位竞争,由宿主 fail-loud。
|
|
21
|
+
|
|
22
|
+
[0.3.6]: https://github.com/Witherwithwinter/DSH-Codinput/compare/v0.3.5...v0.3.6
|
|
23
|
+
|
|
24
|
+
## [0.3.5] — 2026-10-23
|
|
25
|
+
|
|
26
|
+
第三方输入座位补齐(issue #1 之左座):`conversation.input.left` 条目恢复显示;v0.3.4 的右座实现泛化为「座位镜像」层。
|
|
27
|
+
|
|
28
|
+
### 新增
|
|
29
|
+
|
|
30
|
+
- **左座 `conversation.input.left` 槽位转发渲染**:该子槽位位于官方工具行左区 `.tools` 内 modes(权限→计划)之后——issue 截图里的底栏按钮(如「上传视频」)、dsh-qoder-plugin 的额度读数等第三方条目注册在这里;遮蔽官方输入框后渲染点随条目一起消失。接管卡片工具行现于同位置(`.dci-tools` 内、权限触发器之后)复刻官方 renderer 的 list 合成,三形态(普通/悬浮/侧栏标签)同享。已在真实 web 宿主(`0.2.0-rc.2`)实测:座位条目渲染进左区几何正确位置、三形态一致、无横向溢出,卸载条目后零残留。
|
|
31
|
+
- **座位镜像通用引擎**:v0.3.4 的右座实现抽成 `InputSlotSeat`(座位名 + standard props 面参数化),左右两座共用同一套 list 合成(id 首占位去重 + order 升序)、条目 inject/`use<Name>` 钩子、条目 locale 的 `t`、standard props 原样通道与逐条目崩溃隔离;后续座位接入只需再加一片薄壳。
|
|
32
|
+
|
|
33
|
+
### 说明
|
|
34
|
+
|
|
35
|
+
- 检测即兼容:槽位无条目或宿主过旧(无该子槽位)时座位不渲染,零样式零行为残留;单个条目崩溃被边界隔离,不连坐输入面。
|
|
36
|
+
- 左右两座的 standard props 面同源:宿主下发给 bar/侧栏 body 条目的 kit 减去 owner props(侧栏再剔除注入的 `useTabInfo`)。
|
|
37
|
+
- **已知限制(本版边界)**:`conversation.input.model` 单座(如 dsh-model-accordion 类替换模型选择器的插件)与自绘模型芯片 UX 冲突,本版不镜像;`conversation.input.attachments` / `overlay` / `dock` 生态暂无租客,留扩展位。
|
|
38
|
+
- **覆盖边界(措辞分界)**:左座转发在真实 web 宿主(`0.2.0-rc.2`)上以确定性探针条目实测通过(渲染位置/三形态/卸载零残留);dsh-qoder-plugin 的左额度读数与右探针双座条目实测注册成功、无报错,但其组件按官方契约在未选中 Qoder provider 时返回 `null`,可见读数属机制推断、未实测;左座席位的「上传视频」类插件真身未在本环境出现,同属机制覆盖(其注册形态与已实测样本同轴)。右座既有租客(dsh-prompt-enhancer)端到端回归实测不受影响。
|
|
39
|
+
|
|
40
|
+
[0.3.5]: https://github.com/Witherwithwinter/DSH-Codinput/compare/v0.3.4...v0.3.5
|
|
41
|
+
|
|
42
|
+
## [0.3.3] — 2026-10-23
|
|
43
|
+
|
|
44
|
+
主题/皮肤插件兼容:错误色与预览链接逐值对齐官方;README 增补皮肤作者指南。
|
|
45
|
+
|
|
46
|
+
### 变更
|
|
47
|
+
|
|
48
|
+
- **错误色回退值逐值对齐官方**:`.dci-error` 与完全权限确认警示图标的错误色回退值由 `#ff6b6b` 改为官方同款 `#d54941`(token 仍走 `--dsw-alias-state-error-primary`,仅无该令牌的宿主回退时可见差异)。
|
|
49
|
+
- **预览链接走官方 alias-link token**:markdown 预览的链接色由写死 `#4c8dff` 改为 `var(--dsw-alias-link, #4c8dff)`,换肤下与官方 markdown 链接同进退。
|
|
50
|
+
|
|
51
|
+
### 新增
|
|
52
|
+
|
|
53
|
+
- **README 皮肤作者指南(中英)**:新增「主题 / 皮肤插件兼容」章节——覆写宿主 `--dsw-*` token 即全盘生效(含 token 定义在 body 层、覆写需写同层的注意点);官方写死的值清单(发送钮图标前景白等,属预期不跟 token);稳定的 `dci-` 前缀类名契约与注入顺序(皮肤后注入按常规 CSS 权重覆盖)。
|
|
54
|
+
|
|
55
|
+
## [0.3.4] — 2026-10-23
|
|
56
|
+
|
|
57
|
+
第三方输入条目兼容(issue #1 之右座):接管后 `conversation.input.right` 座条目恢复显示(已实测 dsh-prompt-enhancer 的 ✨/🎤);模型/推理强度弹层恢复官方形态。
|
|
58
|
+
|
|
59
|
+
### 新增
|
|
60
|
+
|
|
61
|
+
- **`conversation.input.right` 槽位转发渲染**:该子槽位由官方 InputBar(`conversation.composer.bar` 缺省条目)声明并在其工具行内渲染;Codinput 以 priority -1 遮蔽官方条目后,槽位渲染点随官方输入框一起消失,注册在此槽位的第三方按钮(如 dsh-prompt-enhancer 的 ✨ 提示词优化 / 🎤 语音识别)无处挂载。接管卡片的工具行现于官方同座位(右侧标准控件区、模型选择之前)复刻官方 renderer 的 list 条目合成(id 首占位去重 + order 升序 + priority 遮蔽序、条目 inject/`use<Name>` 钩子、条目 locale 的 `t`、standard props 原样通道、逐条目崩溃隔离),三形态(普通/悬浮/侧栏标签)同享。
|
|
62
|
+
- **检测即兼容**:槽位无条目或宿主过旧(无该子槽位)时座位不渲染,零样式零行为残留;单个条目崩溃被边界隔离,不连坐输入面。
|
|
63
|
+
|
|
64
|
+
### 修复
|
|
65
|
+
|
|
66
|
+
- **菜单钻入子页后向下弹出**:`MenuSurface` 旧实现只在打开瞬间定位一次(尺寸变化不重算),从根菜单点进更长的「模型 / 推理强度」列表时,卡片保持小菜单算好的顶边向下生长、盖住触发器,视觉上变成「向下弹出」。现复刻官方 ModelSelect 的 `place()` 三路监听(ResizeObserver 挂卡片 + 页面 scroll/resize),内容尺寸每次变化即重算上方锚位并夹进视口。
|
|
67
|
+
- **模型选择框无滚动条**:旧 `.dci-menu` 把 `max-height: 100vh - 24px` 与 `overflow-y: auto` 压在卡片本体且未注入官方卡片的 `--dsh-scrollbar-thumb`(l2)变量;叠加上一条后卡片伸出视口被浏览器裁切,列表项既够不着也不出条。现按官方两级结构复刻——卡片 `overflow: hidden` + `max-height: min(360px, 100vh - 96px)`,列表在 `.dci-viewport` 内滚、细滚动条按官方 l2 变量着色;`popupSelect` 壳(命令选项弹层)同步内滚结构。
|
|
68
|
+
|
|
69
|
+
### 说明
|
|
70
|
+
|
|
71
|
+
- 官方渲染门槛同款复刻:`input === undefined || sessionId === undefined` 时整个座位不渲染。
|
|
72
|
+
- 条目声明 store 的 `useStore`/`actions` 面依赖宿主私有记账,插件侧不可复现;现网此类条目未出现。
|
|
73
|
+
- **覆盖边界**:本版转发的是 `conversation.input.right`(右座);`conversation.input.left`(左座,如部分插件的「上传视频」按钮与 qoder-plugin 的额度读数)暂未转发,后续版本补齐。
|
|
74
|
+
- **右座覆盖面**:同座其他条目(如各 Qoder 渠道插件的积分/余额读数)按同一合成机制恢复显示——推断自各包源码的槽位注册(五家 Qoder 桥接包均注册于 right 座),未逐一实测。
|
|
75
|
+
|
|
76
|
+
[0.3.4]: https://github.com/Witherwithwinter/DSH-Codinput/compare/v0.3.3...v0.3.4
|
|
77
|
+
|
|
78
|
+
[0.3.3]: https://github.com/Witherwithwinter/DSH-Codinput/compare/v0.3.2...v0.3.3
|
|
79
|
+
|
|
5
80
|
## [0.3.2] — 2026-10-18
|
|
6
81
|
|
|
7
82
|
桌面版 0.2.1 模型区同步(官方 1017 发布徽章);侧栏标签与指南页条目上品牌标。
|
package/README.en.md
CHANGED
|
@@ -122,6 +122,15 @@ For `0.1.7-rc.2`, on top of the real-instance run, the official CSS for the cand
|
|
|
122
122
|
|
|
123
123
|
The plugin leans on host internals (slot shadowing, `useTabInfo`, `sidebarRight`, `--dsw-*` tokens). Every call site guards with `typeof` checks and degrades gracefully, but a major host upgrade can still break it. **After upgrading the host, walk through [TESTING.md](./TESTING.md).**
|
|
124
124
|
|
|
125
|
+
### Theme / skin plugin compatibility (for skin authors)
|
|
126
|
+
|
|
127
|
+
Codinput ships no colors of its own: every color comes from the host's `--dsw-*` design tokens (light/dark follows the host). How theme/skin plugins for the host get along with Codinput:
|
|
128
|
+
|
|
129
|
+
- **Overriding host tokens restyles everything at once** — once you override `--dsw-*` variables, Codinput's card, menus, buttons and badges follow along with the official UI; no per-plugin adaptation needed. Note the host defines its tokens on `body` (`body[data-ds-dark-theme]`), so overrides must live on that same level: ones written on `:root` are shadowed by the `body` definitions.
|
|
130
|
+
- **Values the official UI hardcodes, Codinput hardcodes too** (the white foreground of the send-button icon, the purple of the context meter's tools segment, etc.) — value-for-value parity with how the official UI behaves under a reskin. These do not follow tokens; that is expected.
|
|
131
|
+
- **To target Codinput precisely**: every element uses the stable `dci-` class prefix (card `.dci-card`, send button `.dci-send`, menus `.dci-menu` / `.dci-slash-menu`, stats row `.dci-stat-root`, recall ball `.dci-ball`, …) — use them directly as skin selectors. The plugin injects its styles once as `<style id="dsh-codinput-styles">`; skin styles injected later win by normal CSS specificity.
|
|
132
|
+
- The editor (CodeMirror) font is a user preference (monospace stack by default) and does not follow skin fonts; its colors do follow the tokens.
|
|
133
|
+
|
|
125
134
|
## Known limitations
|
|
126
135
|
|
|
127
136
|
- `/` `@` candidates come from host directories (skills / commands / files / sessions); when the host provides none, the menu is empty — the plugin cannot fill that in.
|
package/README.md
CHANGED
|
@@ -120,11 +120,21 @@ dsh plugin --profile web add link:/abs/path/to/DSH-Codinput
|
|
|
120
120
|
|
|
121
121
|
对 `0.1.7-rc.2` 除实机验证外,还从该版本的客户端包(`dsh-client-ui-theme` / `dsh-client-ui-input-trigger` / `dsh-client-ui-conversation` / `dsh-client-ui-chat`)逐值提取了候选菜单、上下文小圈与 stats dock 的官方 CSS 核对。插件依赖的契约按版本核对过:用到的 3 个槽位(`conversation.composer.bar`、`sidebar.right.pane.tab`、`settings.section`)、`sidebarRight` / `sidebarRightTabs` / `locale` 服务与 `openTabIn`、侧栏展开规划(dockkit `planSetExpanded`)、文件拾取与 tab 关闭契约(`shell.bindFilePicker` / `tab.actions.close`)、以及复刻所依据的官方原语(`fileSizeText` / `fileExtension` 与附件 glyph 路径,逐字一致)。插件对宿主内部结构的依赖较多(槽位遮蔽、`useTabInfo`、`sidebarRight`、`--dsw-*` 令牌),代码里处处用 `typeof` 守卫 + `try/catch` 降级,但宿主大版本升级仍可能失效。**升级宿主后请按 [TESTING.md](./TESTING.md) 走一遍冒烟清单。**
|
|
122
122
|
|
|
123
|
+
### 主题 / 皮肤插件兼容(皮肤作者必读)
|
|
124
|
+
|
|
125
|
+
Codinput 不自带配色:全部颜色取自宿主的 `--dsw-*` 设计 token(亮暗主题随宿主切换)。给宿主做主题/皮肤的插件与 Codinput 的相处方式:
|
|
126
|
+
|
|
127
|
+
- **改宿主 token 即全盘生效**——覆写 `--dsw-*` 变量后,Codinput 的卡片、菜单、按钮、徽章与官方 UI 一同跟随,无需单独适配。注意宿主把 token 定义在 `body`(`body[data-ds-dark-theme]`)上,覆写要写在同一层:写在 `:root` 会被 `body` 上的定义盖掉。
|
|
128
|
+
- **官方写死的值 Codinput 同样写死**(发送钮图标的前景白、上下文仪表 tools 分段的紫等),与官方在换肤下的表现保持逐值一致——这些不跟 token 变,属预期行为。
|
|
129
|
+
- **要精确点妆 Codinput**:所有元素类名都是稳定的 `dci-` 前缀(卡片 `.dci-card`、发送钮 `.dci-send`、菜单 `.dci-menu` / `.dci-slash-menu`、数据行 `.dci-stat-root`、唤回小球 `.dci-ball` 等),可直接作皮肤选择器;插件样式一次性注入 `<style id="dsh-codinput-styles">`,皮肤在其后注入即可按常规 CSS 权重覆盖。
|
|
130
|
+
- 编辑器(CodeMirror)的字体是用户偏好(默认等宽栈),不跟随皮肤字体;其颜色同样走 token。
|
|
131
|
+
|
|
123
132
|
## 已知限制
|
|
124
133
|
|
|
125
134
|
- `/` `@` 的候选内容来自宿主目录(技能 / 命令 / 文件 / 会话);宿主不提供时为空,插件侧无法补。
|
|
126
135
|
- **没有语法高亮**、**没有 Esc 功能**——产品决策(输入面板不是代码阅读器)。
|
|
127
136
|
- **Codinput 标签存在期间主输入整体隐藏**(唯一输入入口约定,浏览同栏其他标签也不恢复);官方 stats dock 与上下文小圈都渲染在官方输入框内部,因此随之消失、由本插件的复刻数据行接管。
|
|
137
|
+
- **第三方子座位的镜像边界**:左右座(list)与模型座(single)已镜像;`input.attachments` / `overlay` / `dock` 生态暂无租客,留扩展位。模型座上**带 `inject` 面且依赖宿主 ctx 服务**的插件(如 dsh-model-accordion)在插件侧无法复现其 inject 绑定,会降级回自绘模型芯片(不空、不崩,`__dshCodinputErrs` 记一条 `slot.inject` 诊断);纯 UI 替换类(reasoning-slider、dsh-effort-dial)已实测可正常显示与交互。
|
|
128
138
|
- 同一 pane 复制出第二个「Codinput」标签时,第二个面板只出提示、不渲染第二个编辑面(输入入口唯一)。
|
|
129
139
|
- 悬浮模式的手势只保留「拖回底部输入区 = 普通」;「拖入右侧栏 = 侧栏模式」已按产品决策舍弃。
|
|
130
140
|
- 页面重载后,若侧栏布局恢复了 Codinput 标签但尚未被点开过,主输入会先出现——dockkit 对重载恢复的标签是惰性挂载,点一次标签即恢复侧栏承载。
|
|
@@ -147,6 +157,9 @@ npm run typecheck
|
|
|
147
157
|
### 改代码前值得先知道的宿主事实
|
|
148
158
|
|
|
149
159
|
- **接管点**:`conversation.composer.bar`(single 槽位,`priority:-1` 遮蔽官方条目)。卸载条目即官方输入框原样恢复。
|
|
160
|
+
- **遮蔽 ≠ 渲染**:官方 InputBar 条目在自己的条身体内声明并渲染 `conversation.input.*` 子座位(`left` / `right` / `model` / `activity` / `permission` / `plan` / …)。Codinput 遮蔽 bar 条目后,这些座位**声明还在、第三方注册照常成功、条目还是赢家**,但没有任何 `renderSlot` 会读它们——表现是「插件装了、不报错、永不上屏」。解法是在自绘工具行的**对应位置**按官方语义复刻合成(`InputLeftSlot` / `InputRightSlot` 走 list 座,`ModelSlot` 走 single 座)。
|
|
161
|
+
- **单值座让位判据**:宿主动态包守卫对非 chain 槽位的第三方 register **强制**分配页内遮蔽秩(`options.priority` 为唯一负数)并给 fiber 名打 `dyn/` 前缀;出厂占用者(如 client-ui-model-selection 的 ModelSelect)不带 priority(≡0)。`ModelSlot` 只镜像「第三方遮蔽者」,出厂占位继续由自绘模型芯片代表。
|
|
162
|
+
- **第三方 inject 的 ctx 边界**:条目的 `inject(sessionId)` 必须在宿主 fiber 上下文里调用;插件侧直接调会丢条目所属插件的 ctx 绑定,依赖 `ctx.*` 服务面的 inject 会抛 `without inject`(实测 dsh-model-accordion 的 `directoryFor`)。单值座据此走 `entryInjectFailed` 预检,失败即降级回自绘芯片。
|
|
150
163
|
- **唯一输入入口**:侧栏标签 body **挂载即承载**(不是按可见性——收起侧栏是 CSS 隐藏 + translate,body 仍挂载),主条目据此渲染 `null`;形态由 `承载 ? 'side' : prefs.mode` 派生,构造上不可能并存。承载声明挂在 body 生命周期上,因此标签定义必须 `keepMounted: true`:dockkit 默认会把非激活标签的 body 卸载,一旦切到同栏其他标签声明就消失、主输入回来(官方浏览器标签同款开关;注意重载后恢复的标签要**激活过一次** body 才挂载)。
|
|
151
164
|
- **撤销历史**:三态切换会重挂载编辑器,故按会话暂存 `EditorState`(`take/putEditorSnapshot`);扩展回调走模块级 hooks 槽,避免复用旧 state 时调到已卸载实例的 props。
|
|
152
165
|
- **官方侧灌入**(pick/claim/提交清空)用 `externalAnnotation` + `Transaction.addToHistory.of(false)`:不进撤销栈,撤销只记用户自己敲的内容。
|
package/TESTING.md
CHANGED
|
@@ -53,6 +53,9 @@
|
|
|
53
53
|
## 4. 工具行控件
|
|
54
54
|
|
|
55
55
|
- [ ] 模型下拉:显示当前模型与推理等级,切换后宿主 `/model` 一致
|
|
56
|
+
- [ ] **第三方模型座插件让位**:`dsh plugin --profile web add reasoning-slider`(或 dsh-effort-dial)后重载 → 模型座原位显示该插件的「模型 + 推理档位」触发器、**自绘模型芯片消失**;点开弹层能列出模型分组/档位;卸载插件重载 → 自绘芯片原样回来(issue #4 的修复路径)
|
|
57
|
+
- [ ] **模型座让位失败降级**:装 dsh-model-accordion(其 inject 依赖宿主 ctx,插件侧不可复现)→ 座位**降级回自绘芯片**(不留空、不崩输入面),`__dshCodinputErrs` 有且仅有一条 `slot.inject` 诊断,`__dshCodinputShell` 无 failed 项
|
|
58
|
+
- [ ] **模型座 locked**:会话不可交互(审批等待 / 权限拒绝等 `inert` 态)时,第三方模型座控件按自身 `locked` 语义置灰(不消费 `locked` 的插件不置灰属其契约)
|
|
56
59
|
- [ ] 权限下拉:三预设 + glyph;选「完全权限」弹确认模态(勾选后才能启用)
|
|
57
60
|
- [ ] 附件:slash「添加 · 文件」(接管期间**照常可用**——接管面绑定 shell filePicker)、**粘贴图片** / **拖文件进卡片**(拖入时有描边提示)都能入草稿并出现芯片;移除附件正常;工具行**无**附件按钮
|
|
58
61
|
- [ ] **图片预览**:点图片缩略图 → 原图预览层(全屏遮罩+大图+右上关闭钮),Esc/背板按下/关闭钮三种方式可关,关闭后焦点还原到缩略图
|