dsh-code-ui 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -2
- package/lib/client.js +19 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
- 🌐 翻译(创建翻译引用,交给 AI 翻译)
|
|
17
17
|
- 🔗 引用给 AI
|
|
18
18
|
- **引用 chip**:引用后输入框上方显示 `文件名(起行-止行)` + ✕,删除引用
|
|
19
|
-
- **内嵌 AI 输入框**:直接输入、`Ctrl+Enter`
|
|
19
|
+
- **内嵌 AI 输入框**:直接输入、`Ctrl+Enter` 发送;发送时不粘贴引用正文,只附一行引用指针,内容由 AI 调用 `get_referenced_snippets` 工具读取
|
|
20
20
|
- **主题跟随**:使用 DSH 的 `--dsw-alias-*` 语义变量,浅色/深色自动切换
|
|
21
21
|
- **窗口化/全屏**:可拖拽、可缩放、可全屏/还原
|
|
22
22
|
- **以此文件夹为根**:文件浏览器里可选任意目录作为工作区根
|
|
@@ -52,7 +52,7 @@ npm install dsh-code-ui
|
|
|
52
52
|
1. 点顶部 `Code UI` 进入编辑器
|
|
53
53
|
2. 在文件树/浏览器里打开文件
|
|
54
54
|
3. 选中代码右键 → 引用 / 翻译 / 备注 / 复制
|
|
55
|
-
4. 底部输入框直接发消息(`Ctrl+Enter`
|
|
55
|
+
4. 底部输入框直接发消息(`Ctrl+Enter` 发送);引用只以标签显示,正文由 AI 工具读取
|
|
56
56
|
5. 也可对 AI 说「读取我引用的代码」,AI 会调用 `get_referenced_snippets` 工具
|
|
57
57
|
|
|
58
58
|
## 目录结构
|
|
@@ -89,6 +89,21 @@ npm publish
|
|
|
89
89
|
|
|
90
90
|
发布前确认 `name` 未被占用,必要时改为 scope 如 `@yourname/dsh-code-ui`。
|
|
91
91
|
|
|
92
|
+
## 更新日志
|
|
93
|
+
|
|
94
|
+
> 约定:每次版本升级在本节顶部追加一行(时间 | 版本 | 修复/新增内容)。
|
|
95
|
+
|
|
96
|
+
| 时间 | 版本 | 修复 / 新增 |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| 2026-08-31 | v1.1.5 | 新增:无会话时输入框给出明确提示(常驻警告行 + 置灰按钮点击弹原因 + Ctrl+Enter 兜底提示) |
|
|
99
|
+
| 2026-08-28 | v1.1.4 | 新增:卡片内编辑器启用/禁用开关,切换即时挂载/卸载(无需重启/刷新),状态持久化 |
|
|
100
|
+
| 2026-08-28 | v1.1.3 | 改进:引用/翻译统一标签制--翻译引用加 🌐 标签,引用不再把代码正文粘贴进消息,AI 经工具读取 |
|
|
101
|
+
| 2026-08-28 | v1.1.2 | 改进:插件配置卡片样式与宿主卡片(PluginCard/fields)逐条统一 |
|
|
102
|
+
| 2026-08-28 | v1.1.1 | 修复:插件配置卡片不显示--补 host 端 settings 命名空间注册 + client inject 边 |
|
|
103
|
+
| 2026-08-27 | v1.1.0 | 新增:检查更新 / 一键更新 / 本地包安装(pnpm 流式进度、失败诊断、防降级) |
|
|
104
|
+
| 2026-08-27 | v1.0.1 | 改进:标准化 npm 插件包结构(dsh.bundle 声明、可 `dsh plugin add` 安装) |
|
|
105
|
+
| 2026-08-26 | v1.0.0 | 初版:Cursor 风格工作区(文件树、多标签、语法高亮、引用/备注/翻译、内嵌 AI 输入框) |
|
|
106
|
+
|
|
92
107
|
## License
|
|
93
108
|
|
|
94
109
|
MIT
|
package/lib/client.js
CHANGED
|
@@ -146,6 +146,8 @@ window.__ModuleLoader__.load({
|
|
|
146
146
|
.cdex-aiinput-ta::placeholder{color:var(--dsw-alias-label-secondary,#8a8a8a);}
|
|
147
147
|
.cdex-aiinput-ta:disabled{opacity:.55;}
|
|
148
148
|
.cdex-aiinput-send{flex:0 0 auto;height:36px;min-width:76px;border:none;background:var(--dsw-alias-brand-primary,#0e639c);color:#ffffff;border-radius:999px;padding:0 18px;cursor:pointer;font-size:13px;font-weight:600;transition:filter .15s ease, opacity .15s ease;}
|
|
149
|
+
.cdex-aiinput-send.ghosted{opacity:.4;cursor:not-allowed;}
|
|
150
|
+
.cdex-aiinput-warn{margin:10px 12px 0;padding:6px 10px;border-radius:8px;background:rgba(230,162,60,.12);border:1px solid rgba(230,162,60,.4);color:#e6a23c;font-size:12px;line-height:1.5;}
|
|
149
151
|
.cdex-aiinput-send:hover:not(:disabled){filter:brightness(1.12);}
|
|
150
152
|
.cdex-aiinput-send:disabled{opacity:.4;cursor:not-allowed;}
|
|
151
153
|
.cdex-aiinput-foot{display:flex;align-items:center;gap:12px;padding:8px 14px 12px;color:var(--dsw-alias-label-secondary,#8a8a8a);font-size:12px;border-top:1px solid transparent;}
|
|
@@ -746,7 +748,11 @@ window.__ModuleLoader__.load({
|
|
|
746
748
|
const citeCount = refs.filter((r) => r.kind === 'cite').length
|
|
747
749
|
const trCount = refs.length - citeCount
|
|
748
750
|
const submit = () => {
|
|
749
|
-
if (!st.inputActions || !taEl)
|
|
751
|
+
if (!st.inputActions || !taEl) {
|
|
752
|
+
// 无会话时明确告知原因,而不是无声无息
|
|
753
|
+
if (!st.inputActions) showToast('请先打开一个会话再发送:在主界面新建或选择会话后,这里即可发送')
|
|
754
|
+
return
|
|
755
|
+
}
|
|
750
756
|
const text = taEl.value
|
|
751
757
|
if (!text.trim() && refs.length === 0) return
|
|
752
758
|
const payload = buildSendPayload(text)
|
|
@@ -756,6 +762,7 @@ window.__ModuleLoader__.load({
|
|
|
756
762
|
}
|
|
757
763
|
return h('div', { className: 'cdex-aiinput-wrap' },
|
|
758
764
|
h('div', { className: 'cdex-aiinput-card' },
|
|
765
|
+
disabled ? h('div', { className: 'cdex-aiinput-warn' }, '⚠ 未打开会话:请先在主界面新建或选择一个会话,之后即可在此发送(引用标签会保留)') : null,
|
|
759
766
|
refs.length > 0 ? h('div', { className: 'cdex-aiinput-tags' },
|
|
760
767
|
refs.map((r) => h('span', { className: 'cdex-aiinput-tag' + (r.kind === 'translate' ? ' cdex-aiinput-tag-tr' : ''), key: r.id },
|
|
761
768
|
h('span', { className: 'cdex-aiinput-tag-label' }, (r.kind === 'translate' ? '🌐 翻译 ' : '🔗 ') + tagLabel(r)),
|
|
@@ -766,7 +773,7 @@ window.__ModuleLoader__.load({
|
|
|
766
773
|
h('textarea', {
|
|
767
774
|
className: 'cdex-aiinput-ta',
|
|
768
775
|
ref: (el) => { taEl = el },
|
|
769
|
-
placeholder: disabled ? '
|
|
776
|
+
placeholder: disabled ? '请先打开一个会话(在主界面新建或选择会话后即可发送)' : '给 AI 发消息…(Ctrl+Enter 发送)',
|
|
770
777
|
disabled: disabled,
|
|
771
778
|
onKeyDown: (e) => {
|
|
772
779
|
if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {
|
|
@@ -775,7 +782,16 @@ window.__ModuleLoader__.load({
|
|
|
775
782
|
}
|
|
776
783
|
},
|
|
777
784
|
}),
|
|
778
|
-
|
|
785
|
+
// 不用 HTML disabled(收不到点击):置灰样式 + 点击弹原因,点了就有反馈
|
|
786
|
+
h('button', {
|
|
787
|
+
className: 'cdex-aiinput-send' + (disabled ? ' ghosted' : ''),
|
|
788
|
+
'aria-disabled': disabled,
|
|
789
|
+
title: disabled ? '请先打开一个会话' : '发送(Ctrl+Enter)',
|
|
790
|
+
onClick: () => {
|
|
791
|
+
if (disabled) { showToast('请先打开一个会话再发送:在主界面新建或选择会话后,这里即可发送'); return }
|
|
792
|
+
submit()
|
|
793
|
+
},
|
|
794
|
+
}, '发送'),
|
|
779
795
|
),
|
|
780
796
|
h('div', { className: 'cdex-aiinput-foot' },
|
|
781
797
|
h('span', null, 'Ctrl+Enter 发送'),
|