dsh-prompt 0.1.0 → 0.1.2
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 +48 -32
- package/lib/client.js +189 -158
- package/lib/client.js.map +1 -1
- package/package.json +7 -4
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**🌐 [中文](README.md) · [English](docs/README.en.md)**
|
|
4
4
|
|
|
5
|
-
**DeepSeek Harness 的 Prompt
|
|
5
|
+
**DeepSeek Harness 的 Prompt 工具箱:24 条深度模板、自定义管理、/prompt 触发源、智能推荐悬浮卡——点一下,插入当前对话。**
|
|
6
6
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://www.npmjs.com/package/dsh-prompt)
|
|
@@ -11,11 +11,28 @@
|
|
|
11
11
|
|
|
12
12
|

|
|
13
13
|
|
|
14
|
-
##
|
|
14
|
+
## 快速导航
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
[](#一条命令安装)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
[](#三种方式叫出模板)
|
|
19
|
+
|
|
20
|
+
[](#模板长这样)
|
|
21
|
+
|
|
22
|
+
[](#自定义与管理)
|
|
23
|
+
|
|
24
|
+
[](#常见问题)
|
|
25
|
+
|
|
26
|
+
[](https://www.npmjs.com/package/dsh-prompt)
|
|
27
|
+
|
|
28
|
+
[](https://github.com/FeatherHunter/dsh-prompt/issues/new)
|
|
29
|
+
|
|
30
|
+
[](https://github.com/FeatherHunter/dsh-prompt/releases)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
## 这是给你的吗
|
|
34
|
+
|
|
35
|
+

|
|
19
36
|
|
|
20
37
|
## 一条命令安装
|
|
21
38
|
|
|
@@ -33,45 +50,37 @@ dsh plugin --profile web add dsh-prompt
|
|
|
33
50
|
|
|
34
51
|
**零配置**:DSH 官方 bundle 机制,包内自带 `cordis.patch.yml`,`dsh plugin add` 自动加入 `dsh.profile.bundles` 装配层;`dsh plugin remove` 干净卸载。重启 DSH(或刷新页面)即生效。
|
|
35
52
|
|
|
36
|
-
##
|
|
53
|
+
## 三种方式叫出模板
|
|
54
|
+
|
|
55
|
+
装好后,模板可以从三个入口出来——选顺手的:
|
|
37
56
|
|
|
38
|
-
|
|
39
|
-
- **自定义模板**:+新增、编辑、删除(仅限自建 + 二次确认)、预制一键「复制为自定义」。
|
|
40
|
-
- **/prompt 触发源**:输入框直接输 `/prompt`,继续输入即按 名称/正文/领域/阶段/动作/标签 过滤,回车或点选即插入。
|
|
41
|
-
- **智能悬浮卡**:全局一个低调圆点(可拖动、位置记忆);输入命中模板时从圆点向右上展开推荐卡,点整行即填入;**不捕获键盘**,Enter 发送不受影响。
|
|
42
|
-
- **场景标签**:每模板带 领域×阶段×动作 三维标签,面板按阶段分组 + 领域筛选 + 搜索。
|
|
43
|
-
- **跟随 DSH**:字体、字号、颜色跟随主题;界面双语(中文/English);数据本地持久化。
|
|
57
|
+
### 1 · ⚡Prompt 按钮
|
|
44
58
|
|
|
45
|
-
|
|
59
|
+

|
|
46
60
|
|
|
47
|
-
|
|
61
|
+
### 2 · /prompt 触发源
|
|
48
62
|
|
|
49
|
-
|
|
63
|
+

|
|
50
64
|
|
|
51
|
-
|
|
65
|
+
### 3 · 智能悬浮卡
|
|
52
66
|
|
|
53
|
-
|
|
67
|
+

|
|
54
68
|
|
|
55
|
-
##
|
|
69
|
+
## 模板长这样
|
|
56
70
|
|
|
57
|
-
|
|
71
|
+

|
|
58
72
|
|
|
59
|
-
|
|
60
|
-
- 领域行:全领域 / 思考框架 / 学习 / 工程 / 执行
|
|
61
|
-
- 搜索:按名称 / 正文 / 标签
|
|
62
|
-
- 📌 置顶(≤5)、+新增、编辑/删除(仅自定义)、复制为自定义
|
|
73
|
+
## 自定义与管理
|
|
63
74
|
|
|
64
|
-
|
|
75
|
+

|
|
65
76
|
|
|
66
|
-
|
|
77
|
+
## 隐私
|
|
67
78
|
|
|
68
|
-
|
|
79
|
+

|
|
69
80
|
|
|
70
|
-
|
|
81
|
+
## 常见问题
|
|
71
82
|
|
|
72
|
-
-
|
|
73
|
-
- **智能模式悬浮卡**开关
|
|
74
|
-
- **模板管理**:完整 CRUD
|
|
83
|
+

|
|
75
84
|
|
|
76
85
|
## 开发
|
|
77
86
|
|
|
@@ -82,10 +91,17 @@ npm run build # 完整构建
|
|
|
82
91
|
|
|
83
92
|
源码 `src/client/*`(面板/触发源/智能匹配/词表/设置页);匹配引擎与 /prompt 共用数据与排序基础;决策记录见 [issue #1(wayfinding map)](https://github.com/FeatherHunter/dsh-prompt/issues/1)。
|
|
84
93
|
|
|
85
|
-
##
|
|
94
|
+
## 同作者
|
|
95
|
+
|
|
96
|
+
还写了两款 DSH 插件:
|
|
97
|
+
|
|
98
|
+
- [**dsh-opencode-palette**](https://github.com/FeatherHunter/dsh-opencode-palette) —— 34 款 opencode 官方主题,DSH 界面一键换肤。
|
|
99
|
+
- [**dsh-mattpocock-skills-deck**](https://github.com/FeatherHunter/dsh-mattpocock-skills-deck) —— 25 个工程技能包,粘贴一段安装 Prompt 即用。
|
|
100
|
+
|
|
101
|
+
## 作者的话
|
|
86
102
|
|
|
87
|
-
|
|
103
|
+

|
|
88
104
|
|
|
89
105
|
## 许可
|
|
90
106
|
|
|
91
|
-
|
|
107
|
+

|
package/lib/client.js
CHANGED
|
@@ -856,6 +856,163 @@ window.__ModuleLoader__.load({
|
|
|
856
856
|
setPanelOpen(false);
|
|
857
857
|
}
|
|
858
858
|
/** 模板浏览(面板 / 设置页共用) */
|
|
859
|
+
const modalMaskStyle = {
|
|
860
|
+
position: "fixed",
|
|
861
|
+
inset: 0,
|
|
862
|
+
background: "rgba(0,0,0,0.55)",
|
|
863
|
+
display: "flex",
|
|
864
|
+
alignItems: "center",
|
|
865
|
+
justifyContent: "center",
|
|
866
|
+
zIndex: 400
|
|
867
|
+
};
|
|
868
|
+
const modalCardStyle = {
|
|
869
|
+
width: 460,
|
|
870
|
+
background: "var(--dsw-specific-menu)",
|
|
871
|
+
border: "1px solid var(--dsw-alias-border-inverted)",
|
|
872
|
+
borderRadius: 12,
|
|
873
|
+
padding: 16,
|
|
874
|
+
display: "flex",
|
|
875
|
+
flexDirection: "column",
|
|
876
|
+
gap: 10,
|
|
877
|
+
fontFamily: "var(--dsw-font-family)",
|
|
878
|
+
color: "var(--dsw-alias-label-primary)"
|
|
879
|
+
};
|
|
880
|
+
const modalFieldStyle = {
|
|
881
|
+
width: "100%",
|
|
882
|
+
background: "var(--dsw-alias-bg-layer-3)",
|
|
883
|
+
border: "1px solid var(--dsw-alias-border-l1)",
|
|
884
|
+
color: "var(--dsw-alias-label-primary)",
|
|
885
|
+
borderRadius: 8,
|
|
886
|
+
padding: "8px 10px",
|
|
887
|
+
fontFamily: "var(--dsw-font-family)",
|
|
888
|
+
fontSize: "0.96em",
|
|
889
|
+
outline: "none",
|
|
890
|
+
boxSizing: "border-box"
|
|
891
|
+
};
|
|
892
|
+
const modalBtnsStyle = {
|
|
893
|
+
display: "flex",
|
|
894
|
+
justifyContent: "flex-end",
|
|
895
|
+
gap: 8
|
|
896
|
+
};
|
|
897
|
+
const modalBtn = (primary, danger) => ({
|
|
898
|
+
padding: "6px 14px",
|
|
899
|
+
borderRadius: 8,
|
|
900
|
+
border: primary ? 0 : "1px solid var(--dsw-alias-border-l1)",
|
|
901
|
+
background: primary ? "var(--dsw-specific-accent,#f0a45c)" : "var(--dsw-alias-bg-layer-3)",
|
|
902
|
+
color: primary ? "#1a1a1e" : danger ? "var(--dsw-specific-danger,#e06c75)" : "var(--dsw-alias-label-primary)",
|
|
903
|
+
cursor: "pointer",
|
|
904
|
+
fontFamily: "var(--dsw-font-family)",
|
|
905
|
+
fontSize: "0.96em"
|
|
906
|
+
});
|
|
907
|
+
/** 新建/编辑弹窗(模块级稳定组件,避免父级重渲染时被卸载重置) */
|
|
908
|
+
function TemplateModal(props) {
|
|
909
|
+
const react = getReact();
|
|
910
|
+
if (!react) return null;
|
|
911
|
+
const h = react.createElement;
|
|
912
|
+
const editing = props.kind === "edit" && !!props.tpl;
|
|
913
|
+
const s1 = react.useState(editing ? props.tpl.name : "");
|
|
914
|
+
const name = s1[0];
|
|
915
|
+
const setName = s1[1];
|
|
916
|
+
const s2 = react.useState(editing ? props.tpl.tag || CUSTOM_TAG : CUSTOM_TAG);
|
|
917
|
+
const tag = s2[0];
|
|
918
|
+
const setTag = s2[1];
|
|
919
|
+
const s3 = react.useState(editing ? props.tpl.body : "");
|
|
920
|
+
const body = s3[0];
|
|
921
|
+
const setBody = s3[1];
|
|
922
|
+
const errState = react.useState(null);
|
|
923
|
+
const err = errState[0];
|
|
924
|
+
const setErr = errState[1];
|
|
925
|
+
const doOk = () => {
|
|
926
|
+
const nm = name.trim(), bd = body.trim();
|
|
927
|
+
if (!nm) {
|
|
928
|
+
setErr("nameRequired");
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
931
|
+
if (bd.length > 1e3) {
|
|
932
|
+
setErr("bodyTooLong");
|
|
933
|
+
return;
|
|
934
|
+
}
|
|
935
|
+
props.onOk && props.onOk({
|
|
936
|
+
name: nm,
|
|
937
|
+
tag: tag || CUSTOM_TAG,
|
|
938
|
+
body: bd
|
|
939
|
+
});
|
|
940
|
+
};
|
|
941
|
+
return h("div", {
|
|
942
|
+
style: modalMaskStyle,
|
|
943
|
+
"data-dsh-prompt-modal": "",
|
|
944
|
+
onClick: (e) => {
|
|
945
|
+
if (e.target === e.currentTarget) props.onCancel();
|
|
946
|
+
}
|
|
947
|
+
}, [h("div", { style: modalCardStyle }, [
|
|
948
|
+
h("h3", { style: {
|
|
949
|
+
fontSize: "1.08em",
|
|
950
|
+
margin: 0
|
|
951
|
+
} }, editing ? props.t("editTitle") : props.t("addTitle")),
|
|
952
|
+
h("input", {
|
|
953
|
+
style: modalFieldStyle,
|
|
954
|
+
placeholder: props.t("namePh"),
|
|
955
|
+
value: name,
|
|
956
|
+
onChange: (e) => setName(e.target.value)
|
|
957
|
+
}),
|
|
958
|
+
h("input", {
|
|
959
|
+
style: modalFieldStyle,
|
|
960
|
+
placeholder: props.t("tagPh"),
|
|
961
|
+
value: tag,
|
|
962
|
+
onChange: (e) => setTag(e.target.value)
|
|
963
|
+
}),
|
|
964
|
+
h("textarea", {
|
|
965
|
+
style: {
|
|
966
|
+
...modalFieldStyle,
|
|
967
|
+
height: 110,
|
|
968
|
+
resize: "vertical"
|
|
969
|
+
},
|
|
970
|
+
placeholder: props.t("bodyPh"),
|
|
971
|
+
value: body,
|
|
972
|
+
onChange: (e) => setBody(e.target.value)
|
|
973
|
+
}),
|
|
974
|
+
err ? h("div", { style: {
|
|
975
|
+
fontSize: "0.92em",
|
|
976
|
+
color: "var(--dsw-specific-danger,#e06c75)"
|
|
977
|
+
} }, props.t(err)) : null,
|
|
978
|
+
h("div", { style: modalBtnsStyle }, [h("button", {
|
|
979
|
+
style: modalBtn(),
|
|
980
|
+
onClick: props.onCancel
|
|
981
|
+
}, props.t("cancel")), h("button", {
|
|
982
|
+
style: modalBtn(true),
|
|
983
|
+
onClick: doOk
|
|
984
|
+
}, editing ? props.t("save") : props.t("addOk"))])
|
|
985
|
+
])]);
|
|
986
|
+
}
|
|
987
|
+
/** 删除确认弹窗(同样模块级稳定组件) */
|
|
988
|
+
function ConfirmDelete(props) {
|
|
989
|
+
const react = getReact();
|
|
990
|
+
if (!react) return null;
|
|
991
|
+
const h = react.createElement;
|
|
992
|
+
return h("div", {
|
|
993
|
+
style: modalMaskStyle,
|
|
994
|
+
"data-dsh-prompt-modal": "",
|
|
995
|
+
onClick: (e) => {
|
|
996
|
+
if (e.target === e.currentTarget) props.onCancel();
|
|
997
|
+
}
|
|
998
|
+
}, [h("div", { style: modalCardStyle }, [
|
|
999
|
+
h("h3", { style: {
|
|
1000
|
+
fontSize: "1.08em",
|
|
1001
|
+
margin: 0
|
|
1002
|
+
} }, props.t("delTitle")),
|
|
1003
|
+
h("div", { style: {
|
|
1004
|
+
fontSize: "0.96em",
|
|
1005
|
+
color: "var(--dsw-alias-label-tertiary)"
|
|
1006
|
+
} }, props.t("delMsg") + "「" + props.tpl.name + "」" + props.t("delUnrecover")),
|
|
1007
|
+
h("div", { style: modalBtnsStyle }, [h("button", {
|
|
1008
|
+
style: modalBtn(),
|
|
1009
|
+
onClick: props.onCancel
|
|
1010
|
+
}, props.t("cancel")), h("button", {
|
|
1011
|
+
style: modalBtn(false, true),
|
|
1012
|
+
onClick: props.onOk
|
|
1013
|
+
}, props.t("delOk"))])
|
|
1014
|
+
])]);
|
|
1015
|
+
}
|
|
859
1016
|
function TemplateBrowser(props) {
|
|
860
1017
|
const react = getReact();
|
|
861
1018
|
if (!react) return null;
|
|
@@ -1104,54 +1261,6 @@ window.__ModuleLoader__.load({
|
|
|
1104
1261
|
fontFamily: "var(--dsw-font-family)",
|
|
1105
1262
|
fontSize: "0.85em"
|
|
1106
1263
|
};
|
|
1107
|
-
const maskStyle = {
|
|
1108
|
-
position: "fixed",
|
|
1109
|
-
inset: 0,
|
|
1110
|
-
background: "rgba(0,0,0,0.55)",
|
|
1111
|
-
display: "flex",
|
|
1112
|
-
alignItems: "center",
|
|
1113
|
-
justifyContent: "center",
|
|
1114
|
-
zIndex: 400
|
|
1115
|
-
};
|
|
1116
|
-
const modalStyle = {
|
|
1117
|
-
width: 460,
|
|
1118
|
-
background: "var(--dsw-specific-menu)",
|
|
1119
|
-
border: "1px solid var(--dsw-alias-border-inverted)",
|
|
1120
|
-
borderRadius: 12,
|
|
1121
|
-
padding: 16,
|
|
1122
|
-
display: "flex",
|
|
1123
|
-
flexDirection: "column",
|
|
1124
|
-
gap: 10,
|
|
1125
|
-
fontFamily: "var(--dsw-font-family)",
|
|
1126
|
-
color: base
|
|
1127
|
-
};
|
|
1128
|
-
const fieldStyle = {
|
|
1129
|
-
width: "100%",
|
|
1130
|
-
background: "var(--dsw-alias-bg-layer-3)",
|
|
1131
|
-
border: line,
|
|
1132
|
-
color: base,
|
|
1133
|
-
borderRadius: 8,
|
|
1134
|
-
padding: "8px 10px",
|
|
1135
|
-
fontFamily: "var(--dsw-font-family)",
|
|
1136
|
-
fontSize: "0.96em",
|
|
1137
|
-
outline: "none",
|
|
1138
|
-
boxSizing: "border-box"
|
|
1139
|
-
};
|
|
1140
|
-
const mbtnsStyle = {
|
|
1141
|
-
display: "flex",
|
|
1142
|
-
justifyContent: "flex-end",
|
|
1143
|
-
gap: 8
|
|
1144
|
-
};
|
|
1145
|
-
const mbtn = (primary, danger) => ({
|
|
1146
|
-
padding: "6px 14px",
|
|
1147
|
-
borderRadius: 8,
|
|
1148
|
-
border: primary ? 0 : line,
|
|
1149
|
-
background: primary ? "var(--dsw-specific-accent,#f0a45c)" : "var(--dsw-alias-bg-layer-3)",
|
|
1150
|
-
color: primary ? "#1a1a1e" : danger ? "var(--dsw-specific-danger,#e06c75)" : base,
|
|
1151
|
-
cursor: "pointer",
|
|
1152
|
-
fontFamily: "var(--dsw-font-family)",
|
|
1153
|
-
fontSize: "0.96em"
|
|
1154
|
-
});
|
|
1155
1264
|
const handlePick = (x) => {
|
|
1156
1265
|
onPick(x, useInput, inputActions);
|
|
1157
1266
|
};
|
|
@@ -1192,116 +1301,28 @@ window.__ModuleLoader__.load({
|
|
|
1192
1301
|
};
|
|
1193
1302
|
let modalNode = null;
|
|
1194
1303
|
if (modal) {
|
|
1195
|
-
if (modal.kind === "add" || modal.kind === "edit") {
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
name
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
const nm = name.trim(), bd = body.trim();
|
|
1213
|
-
if (!nm) {
|
|
1214
|
-
err[1]("nameRequired");
|
|
1215
|
-
return;
|
|
1216
|
-
}
|
|
1217
|
-
if (bd.length > 1e3) {
|
|
1218
|
-
err[1]("bodyTooLong");
|
|
1219
|
-
return;
|
|
1220
|
-
}
|
|
1221
|
-
if (editing) updateCustom(modal.t.id, {
|
|
1222
|
-
name: nm,
|
|
1223
|
-
tag,
|
|
1224
|
-
body: bd
|
|
1225
|
-
});
|
|
1226
|
-
else addCustom(nm, tag || CUSTOM_TAG, bd);
|
|
1227
|
-
modalState[1](null);
|
|
1228
|
-
refresh();
|
|
1229
|
-
};
|
|
1230
|
-
return h("div", {
|
|
1231
|
-
style: maskStyle,
|
|
1232
|
-
onClick: (e) => {
|
|
1233
|
-
if (e.target === e.currentTarget) modalState[1](null);
|
|
1234
|
-
}
|
|
1235
|
-
}, [h("div", { style: modalStyle }, [
|
|
1236
|
-
h("h3", { style: {
|
|
1237
|
-
fontSize: "1.08em",
|
|
1238
|
-
margin: 0
|
|
1239
|
-
} }, editing ? t("editTitle") : t("addTitle")),
|
|
1240
|
-
h("input", {
|
|
1241
|
-
style: fieldStyle,
|
|
1242
|
-
placeholder: t("namePh"),
|
|
1243
|
-
value: name,
|
|
1244
|
-
onChange: (e) => setName(e.target.value)
|
|
1245
|
-
}),
|
|
1246
|
-
h("input", {
|
|
1247
|
-
style: fieldStyle,
|
|
1248
|
-
placeholder: t("tagPh"),
|
|
1249
|
-
value: tag,
|
|
1250
|
-
onChange: (e) => setTag(e.target.value)
|
|
1251
|
-
}),
|
|
1252
|
-
h("textarea", {
|
|
1253
|
-
style: {
|
|
1254
|
-
...fieldStyle,
|
|
1255
|
-
height: 110,
|
|
1256
|
-
resize: "vertical"
|
|
1257
|
-
},
|
|
1258
|
-
placeholder: t("bodyPh"),
|
|
1259
|
-
value: body,
|
|
1260
|
-
onChange: (e) => setBody(e.target.value)
|
|
1261
|
-
}),
|
|
1262
|
-
err[0] ? h("div", { style: {
|
|
1263
|
-
fontSize: "0.92em",
|
|
1264
|
-
color: "var(--dsw-specific-danger,#e06c75)"
|
|
1265
|
-
} }, t(err[0])) : null,
|
|
1266
|
-
h("div", { style: mbtnsStyle }, [h("button", {
|
|
1267
|
-
style: mbtn(),
|
|
1268
|
-
onClick: () => modalState[1](null)
|
|
1269
|
-
}, t("cancel")), h("button", {
|
|
1270
|
-
style: mbtn(true),
|
|
1271
|
-
onClick: doOk
|
|
1272
|
-
}, editing ? t("save") : t("addOk"))])
|
|
1273
|
-
])]);
|
|
1274
|
-
};
|
|
1275
|
-
modalNode = h(ModalInner);
|
|
1276
|
-
} else if (modal.kind === "del" && modal.t) {
|
|
1277
|
-
const doDel = () => {
|
|
1304
|
+
if (modal.kind === "add" || modal.kind === "edit") modalNode = h("div", { key: "tplmodal-" + modal.kind + (modal.t ? "-" + modal.t.id : "") }, [h(TemplateModal, {
|
|
1305
|
+
kind: modal.kind,
|
|
1306
|
+
tpl: modal.t,
|
|
1307
|
+
t,
|
|
1308
|
+
onCancel: () => modalState[1](null),
|
|
1309
|
+
onOk: (f) => {
|
|
1310
|
+
if (modal.kind === "edit" && modal.t) updateCustom(modal.t.id, f);
|
|
1311
|
+
else addCustom(f.name, f.tag, f.body);
|
|
1312
|
+
modalState[1](null);
|
|
1313
|
+
refresh();
|
|
1314
|
+
}
|
|
1315
|
+
})]);
|
|
1316
|
+
else if (modal.kind === "del" && modal.t) modalNode = h("div", { key: "del-" + modal.t.id }, [h(ConfirmDelete, {
|
|
1317
|
+
tpl: modal.t,
|
|
1318
|
+
t,
|
|
1319
|
+
onCancel: () => modalState[1](null),
|
|
1320
|
+
onOk: () => {
|
|
1278
1321
|
removeCustom(modal.t.id);
|
|
1279
1322
|
modalState[1](null);
|
|
1280
1323
|
refresh();
|
|
1281
|
-
}
|
|
1282
|
-
|
|
1283
|
-
style: maskStyle,
|
|
1284
|
-
onClick: (e) => {
|
|
1285
|
-
if (e.target === e.currentTarget) modalState[1](null);
|
|
1286
|
-
}
|
|
1287
|
-
}, [h("div", { style: modalStyle }, [
|
|
1288
|
-
h("h3", { style: {
|
|
1289
|
-
fontSize: "1.08em",
|
|
1290
|
-
margin: 0
|
|
1291
|
-
} }, t("delTitle")),
|
|
1292
|
-
h("div", { style: {
|
|
1293
|
-
fontSize: "0.96em",
|
|
1294
|
-
color: dim
|
|
1295
|
-
} }, t("delMsg") + "「" + modal.t.name + "」" + t("delUnrecover")),
|
|
1296
|
-
h("div", { style: mbtnsStyle }, [h("button", {
|
|
1297
|
-
style: mbtn(),
|
|
1298
|
-
onClick: () => modalState[1](null)
|
|
1299
|
-
}, t("cancel")), h("button", {
|
|
1300
|
-
style: mbtn(false, true),
|
|
1301
|
-
onClick: doDel
|
|
1302
|
-
}, t("delOk"))])
|
|
1303
|
-
])]);
|
|
1304
|
-
}
|
|
1324
|
+
}
|
|
1325
|
+
})]);
|
|
1305
1326
|
}
|
|
1306
1327
|
const tabs = [
|
|
1307
1328
|
{
|
|
@@ -2189,11 +2210,21 @@ window.__ModuleLoader__.load({
|
|
|
2189
2210
|
try {
|
|
2190
2211
|
if (typeof document === "undefined") return "";
|
|
2191
2212
|
const ae = document.activeElement;
|
|
2192
|
-
if (ae && ae.tagName === "TEXTAREA")
|
|
2213
|
+
if (ae && ae.tagName === "TEXTAREA") {
|
|
2214
|
+
try {
|
|
2215
|
+
if (ae.closest && ae.closest("[data-dsh-prompt-modal]")) return "";
|
|
2216
|
+
} catch (e) {}
|
|
2217
|
+
return ae.value || "";
|
|
2218
|
+
}
|
|
2193
2219
|
const tas = document.querySelectorAll("textarea");
|
|
2194
2220
|
for (let i = 0; i < tas.length; i++) {
|
|
2195
2221
|
const ta = tas[i];
|
|
2196
|
-
if (ta.offsetParent !== null)
|
|
2222
|
+
if (ta.offsetParent !== null) {
|
|
2223
|
+
try {
|
|
2224
|
+
if (ta.closest && ta.closest("[data-dsh-prompt-modal]")) continue;
|
|
2225
|
+
} catch (e) {}
|
|
2226
|
+
return ta.value || "";
|
|
2227
|
+
}
|
|
2197
2228
|
}
|
|
2198
2229
|
} catch (e) {}
|
|
2199
2230
|
return "";
|
|
@@ -2611,7 +2642,7 @@ window.__ModuleLoader__.load({
|
|
|
2611
2642
|
}, PanelHost)), "dsh-prompt: panel");
|
|
2612
2643
|
ctx.effect(() => ctx.slots.inject("settings.section", () => ctx.slots.register({
|
|
2613
2644
|
name: "settings.section",
|
|
2614
|
-
id: "dsh-prompt-
|
|
2645
|
+
id: "dsh-prompt-toolbox",
|
|
2615
2646
|
priority: 10,
|
|
2616
2647
|
order: 50,
|
|
2617
2648
|
label: () => getLang() === "zh" ? "提示词模板" : "Prompt Templates"
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["listeners"],"sources":["../src/client/templates.ts","../src/client/store.ts","../src/client/state.ts","../src/client/i18n.ts","../src/client/panel.ts","../src/client/button.ts","../src/client/smartstore.ts","../src/client/settings.ts","../src/client/trigger.ts","../src/client/words.ts","../src/client/match.ts","../src/client/smart.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-prompt — 模板数据层\n * 24 条预制模板(#6 final.md 定稿,冒号表单式)+ 类型定义。\n */\n\nexport type Domain = '思考框架' | '学习' | '工程' | '执行'\nexport type Stage = '执行前' | '执行中' | '执行后' | '任意'\n\nexport interface PromptTemplate {\n id: string\n name: string\n nameEn: string\n domain: Domain\n stage: Stage\n action: string[]\n body: string\n builtin: boolean\n}\n\nexport const PRESET_TEMPLATES: PromptTemplate[] = [\n { id: 'fp', name: '第一性原理拆解', nameEn: 'First Principles', domain: '思考框架', stage: '执行前', action: ['拆解'], body: [\n '请用第一性原理分析以下主题,按编号结构化输出,结论先行:',\n '1. 这个问题的基本组成单元是什么?',\n '2. 哪些是真正不可改变的真理(而非假设)?',\n '3. 如果去掉所有既有假设,问题本身还剩下什么?',\n '4. 有哪些被大多数人默认为常识、但其实可以颠覆的?',\n '5. 基于以上推演给出你的原创见解,并说明它与主流看法的差异。',\n '主题:',\n ].join('\\n') },\n { id: 'socratic', name: '苏格拉底式追问', nameEn: 'Socratic Questioning', domain: '思考框架', stage: '执行前', action: ['检验'], body: [\n '请用苏格拉底式追问帮助我思考,按编号结构化输出:',\n '1. 先复述我当前的观点或核心假设;',\n '2. 提出 3 个最有力的质疑;',\n '3. 找出一个我尚未考虑到的视角;',\n '4. 如果你是深思熟虑的对话者,你会问我哪几个我没想到的问题?',\n '5. 追问结束后,把整个过程浓缩成一个更精准的问题。',\n '主题:',\n ].join('\\n') },\n { id: 'deep', name: '深度多维分析', nameEn: 'Deep Analysis', domain: '思考框架', stage: '执行前', action: ['归因'], body: [\n '请从多个维度深度分析以下主题,按编号结构化输出,结论先行:',\n '1. 本质是什么?',\n '2. 有哪些常见的误解?',\n '3. 支持和反对的证据分别是什么?',\n '4. 这个问题的边界在哪里(什么情况下它不再成立)?',\n '5. 如果你必须做出一个判断,会是什么?',\n '6. 你最强的那个结论,弱点在哪里?',\n '主题:',\n ].join('\\n') },\n { id: 'adversarial', name: '对抗式审查', nameEn: 'Adversarial Review', domain: '思考框架', stage: '执行前', action: ['检验'], body: [\n '请对以下方案/结论做对抗式审查(红队角色),先给一段结论摘要,再按编号展开:',\n '1. 找出其中最强的 5 个假设,逐一论证它们可能如何失效;',\n '2. 构造最可能推翻它的 3 个反例或失败场景;',\n '3. 指出其中隐藏的认知偏差与利益相关方视角的盲区;',\n '4. 给出「如果这个方案失败,最可能的原因是什么」的排序清单;',\n '5. 最后给出:在何种条件下你才会认为它是错的——以及何种证据能让你改变立场。',\n '方案 / 结论:',\n ].join('\\n') },\n { id: 'decision', name: '决策博弈分析', nameEn: 'Decision Analysis', domain: '思考框架', stage: '执行前', action: ['决策'], body: [\n '你是一位冷静的决策分析师。请分析我的处境,按编号结构化输出(你的选择仅作参考,重点是分析过程):',\n '1. 列出每个选项最坏的结果是什么;',\n '2. 每个选项最好的结果是什么;',\n '3. 最可能的结果是什么;',\n '4. 如果 10 年后回头看,我可能会后悔什么;',\n '5. 有没有哪条路是「没有回头路」的;',\n '6. 给出你本人的选择并说明理由;再指出我可能忽略的第三个选项。',\n '我的处境(选项与背景):',\n ].join('\\n') },\n { id: 'premortem', name: '事前验尸', nameEn: 'Pre-mortem', domain: '思考框架', stage: '执行前', action: ['决策'], body: [\n '假设以下方案/项目已经在一年后彻底失败。请以「事后回溯」的方式写失败分析,按编号结构化输出:',\n '1. 按可能性从高到低列出 8 个失败原因;',\n '2. 对前 3 个原因,给出现在就能做的预防措施;',\n '3. 指出哪些早期信号现在就该监控;',\n '4. 最后说明:这个方案是否从一开始就有致命缺陷。',\n '方案描述:',\n ].join('\\n') },\n { id: 'feynman', name: '费曼技巧', nameEn: 'Feynman Technique', domain: '思考框架', stage: '执行后', action: ['理解'], body: [\n '请用费曼技巧确认我是否真正理解了以下概念,按编号结构化输出:',\n '1. 用最简单的语言、面向完全不懂的人解释这个概念(禁止术语);',\n '2. 给出 2 个生动类比和 2 个反例;',\n '3. 指出我理解中的错误或不准确之处;',\n '4. 设计 3 个判断题检验我是否真的懂了。',\n '概念:',\n '我的理解(可选):',\n ].join('\\n') },\n { id: 'fivewhys', name: '五个为什么', nameEn: 'Five Whys', domain: '思考框架', stage: '执行中', action: ['归因'], body: [\n '针对以下问题,请连续追问五个「为什么」,每层基于上一层的事实回答,最后区分根本原因与表层触发因素并给出解决方向:',\n '问题描述:',\n ].join('\\n') },\n { id: 'mece', name: 'MECE 拆解', nameEn: 'MECE Decomposition', domain: '思考框架', stage: '执行前', action: ['拆解'], body: [\n '请用 MECE 原则拆解以下问题,按编号结构化输出:',\n '1. 给出 3~6 个相互独立(Mutually Exclusive)的分类维度;',\n '2. 每个维度下列出所有子项,确保完全穷尽(Collectively Exhaustive);',\n '3. 指出拆解中可能的遗漏与重叠;',\n '4. 给出按重要性排序后的关键子问题清单。',\n '问题:',\n ].join('\\n') },\n { id: 'bias', name: '认知偏差检查', nameEn: 'Cognitive Bias Check', domain: '思考框架', stage: '执行前', action: ['检验'], body: [\n '请审查以下推理/计划/结论中的认知偏差,按编号结构化输出:',\n '1. 列出可能影响它的偏差(确认偏误、沉没成本、可得性、锚定、乐观/悲观偏差、群体思维等),并指出具体证据;',\n '2. 对每条偏差,给出「如何检验是否真的受影响」的方法;',\n '3. 给出一个反事实检验:如果结论被证明是错的,最可能因为哪条偏差?',\n '推理 / 计划 / 结论:',\n ].join('\\n') },\n { id: 'learnpath', name: '学习路线设计', nameEn: 'Learning Path', domain: '学习', stage: '执行前', action: ['路线'], body: [\n '请为以下领域/技能设计一条从零到可实战的学习路线,按编号结构化输出:',\n '1. 按阶段拆分(入门→进阶→实战),每个阶段给出学习目标;',\n '2. 每个阶段推荐 2~3 个核心主题和练习方式;',\n '3. 指出常见的「伪学习陷阱」(只收藏不练习等);',\n '4. 给出一个 30 天内可完成的最小闭环,以及检验掌握程度的基准。',\n '领域 / 技能:',\n '当前水平(可选):',\n '目标(可选):',\n ].join('\\n') },\n { id: 'concept', name: '概念澄清', nameEn: 'Concept Clarification', domain: '学习', stage: '执行前', action: ['概念'], body: [\n '请帮我彻底理解以下概念,按编号结构化输出:',\n '1. 一句话定义 + 一个最小例子;',\n '2. 它与常见相近概念的本质区别(各给一个对比场景);',\n '3. 这个概念在什么情况下不适用(边界);',\n '4. 给出 3 个由浅入深的练习场景让我检验理解。',\n '概念:',\n '相近概念(可选,不知道可留空,AI 自行选常见相近概念对比):',\n ].join('\\n') },\n { id: 'quiz', name: 'AI 反向考验', nameEn: 'AI Quiz', domain: '学习', stage: '执行后', action: ['考验'], body: [\n '请通过出题检验我是否真正理解了以下主题/交付内容:',\n '1. 设计选择题/判断题/简答题/案例题(由浅入深);',\n '2. 我作答后指出错误与盲区;',\n '3. 直到回答正确、知识点无盲区后再确认交付。',\n '主题 / 交付内容:',\n ].join('\\n') },\n { id: 'codereview', name: '代码审查', nameEn: 'Code Review', domain: '工程', stage: '执行前', action: ['审查'], body: [\n '请审查以下代码,先给总体结论,再按严重程度排序输出,每个问题附具体修改建议(含示例代码):',\n '1. 正确性:潜在 bug、边界条件、并发/异步问题;',\n '2. 安全:注入、鉴权、敏感信息、依赖风险;',\n '3. 可维护性:命名、结构、重复、可读性;',\n '4. 性能:明显的低效点。',\n '代码过长时可分段审查,但最终汇总为一页结论。',\n '代码 / 文件 / 技术栈:',\n ].join('\\n') },\n { id: 'testdesign', name: '测试用例设计', nameEn: 'Test Design', domain: '工程', stage: '执行中', action: ['测试'], body: [\n '请为以下功能设计测试用例,按编号结构化输出:',\n '1. 正常路径用例(含输入/预期输出);',\n '2. 边界与极端值用例;',\n '3. 异常与错误处理用例;',\n '4. 并发/重复/幂等场景(如适用);',\n '5. 指出哪些用例最容易漏、以及对应的风险。',\n '功能描述:',\n ].join('\\n') },\n { id: 'refactor', name: '重构方案', nameEn: 'Refactoring Plan', domain: '工程', stage: '执行中', action: ['重构'], body: [\n '请为以下代码提出重构方案,按编号结构化输出:',\n '1. 指出当前结构的主要问题(职责、耦合、可测试性);',\n '2. 给出目标结构(抽象与拆分建议,含示例);',\n '3. 按「小步重构」顺序列出步骤,每一步可独立提交且行为不变;',\n '4. 指出哪些重构有风险、需要测试保护。',\n '代码 / 模块:',\n ].join('\\n') },\n { id: 'explain', name: '解释代码', nameEn: 'Explain Code', domain: '工程', stage: '执行中', action: ['解读'], body: [\n '请解释以下代码,按编号结构化输出:',\n '1. 这段代码做什么(一句话);',\n '2. 逐段讲解执行流程与关键数据结构;',\n '3. 指出其中「为什么这样写」的设计取舍;',\n '4. 指出潜在问题与改进点;',\n '5. 用一句话概括它在我更大的系统里扮演的角色。',\n '代码:',\n ].join('\\n') },\n { id: 'blindspot', name: '盲区检查', nameEn: 'Blind Spot Pass', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '在我开始以下任务之前,请帮我做一次盲区检查,按编号结构化输出:',\n '1. 我可能遗漏的关键变量有哪些?',\n '2. 潜在的风险与最容易忽略的影响因素?',\n '3. 哪些点需要提前决策、哪些可以后置?',\n '4. 给我一个 3 分钟内可完成的快速检查清单。',\n '我的计划(目标 / 约束):',\n ].join('\\n') },\n { id: 'snapshot', name: '零丢失快照', nameEn: 'Zero-loss Snapshot', domain: '执行', stage: '执行中', action: ['固化'], body: [\n '请执行一次「零丢失快照」:',\n '1. 把我们从会话开始至今的关键信息,按「目的地 / 约束与偏好 / 已确认的决定 / 待决问题 / 雾区(隐约可见但还不清晰)」五类逐条列出——不压缩、不合并,宁可啰嗦不可省略;',\n '2. 每条标注出处(引用我原话);',\n '3. 单独列一节「可疑遗漏」:凡是我提过但你觉得与主线无关、太模糊或像执行细节而没纳入的,全部摆出并写明理由;',\n '4. 列完后停下等我逐条核对,确认后再落盘。',\n ].join('\\n') },\n { id: 'kickoff', name: '任务启动', nameEn: 'Task Kickoff', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '在开始以下任务之前,请先确认起点并澄清细节,按编号结构化输出:',\n '1. 最终目标(要做什么);',\n '2. 当前进度(目前想到哪一步);',\n '3. 经验水平(新手 / 有经验 / 专家);',\n '4. 不熟悉的地方;',\n '5. 成功的标准;',\n '6. 通过提问澄清细节(成功标准之外还有哪些约束、有哪些风险现在就该知道)。',\n '最终目标:',\n '当前进度(可选):',\n '经验水平(新手 / 有经验 / 专家):',\n '不熟悉的地方(可选):',\n ].join('\\n') },\n { id: 'prototype', name: '原型验证', nameEn: 'Prototype Validate', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '请为以下主题/想法做原型验证,每轮输出保持克制(方向概要即可,不要太长):',\n '1. 给出 2~4 个方向差距很大的候选方案;',\n '2. 每个方向给出最小的验证方式(怎么快速试错);',\n '3. 由我选择和反馈,几轮后逐步收敛到满意的方向;',\n '4. 收敛后给出下一步的执行计划要点。',\n '主题 / 想法:',\n ].join('\\n') },\n { id: 'plan', name: '执行计划', nameEn: 'Execution Plan', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '请为以下目标制定执行计划,按编号结构化输出(时间安排是可调整的草案):',\n '1. 明确步骤(含顺序与依赖);',\n '2. 时间安排(每步预计时长/里程碑);',\n '3. 所需资源和工具;',\n '4. 交付物和验收标准;',\n '5. 风险和应对方案。',\n '目标:',\n '约束(可选):',\n ].join('\\n') },\n { id: 'deviation', name: '记录偏离', nameEn: 'Deviation Log', domain: '执行', stage: '执行中', action: ['记录'], body: [\n '请担任我的过程记录员(多轮持续角色):从现在起,在每次交互后更新一份简洁的偏离记录,按编号结构化:',\n '1. 遇到了什么新的情况?',\n '2. 为什么改变了方案?',\n '3. 做了哪些关键决定?',\n '4. 对结果有什么影响?',\n '每次只输出「新增/变更」条目,不要重复已记录内容。',\n ].join('\\n') },\n { id: 'retro', name: '过程复盘', nameEn: 'Retrospective', domain: '执行', stage: '执行后', action: ['复盘'], body: [\n '请帮我复盘刚刚完成的以下任务/项目,按编号结构化输出:',\n '1. 整体步骤回顾(实际 vs 计划的差异);',\n '2. 使用的资料和工具;',\n '3. 遇到的困难;',\n '4. 解决思路与可复用经验;',\n '5. 如果重来一次,哪些地方会做得不同?',\n '任务 / 项目:',\n ].join('\\n') },\n]\n\n// 统一补 builtin 标志(预制只读;自定义由 store 管理)\nPRESET_TEMPLATES.forEach((t) => { t.builtin = true })\n\nexport function getPresetById(id: string): PromptTemplate | undefined {\n return PRESET_TEMPLATES.find((t) => t.id === id)\n}\n","/**\n * dsh-prompt — 持久化与列表逻辑\n * localStorage 键空间:dsh.prompt.customs / dsh.prompt.usage / dsh.prompt.pinned\n * 用量计数仅排序不显示(#4/#5 决策);置顶 ≤5。\n */\nimport type { PromptTemplate } from './templates'\nimport { PRESET_TEMPLATES, getPresetById } from './templates'\n\nconst CUSTOMS_KEY = 'dsh.prompt.customs'\nconst USAGE_KEY = 'dsh.prompt.usage'\nconst PINNED_KEY = 'dsh.prompt.pinned'\nconst LAST_USED_KEY = 'dsh.prompt.lastUsed'\nconst MAX_PIN = 5\nconst MAX_BODY = 1000\n\nfunction ls(): Storage | null {\n try { return typeof globalThis !== 'undefined' && globalThis.localStorage ? globalThis.localStorage : null } catch (e) { return null }\n}\nfunction loadJSON<T>(key: string, fallback: T): T {\n try {\n const s = ls()\n if (!s) return fallback\n const raw = s.getItem(key)\n return raw ? JSON.parse(raw) as T : fallback\n } catch (e) { return fallback }\n}\nfunction saveJSON(key: string, value: unknown): void {\n try { const s = ls(); if (s) s.setItem(key, JSON.stringify(value)) } catch (e) { /* ignore */ }\n}\n\n/** 自定义模板:builtin=false;tag 为自定义标签(默认「自定义」);domain/stage/action 走预制标签体系 */\nexport interface CustomTemplate extends PromptTemplate {\n tag: string\n createdAt: number\n}\n\nexport function loadCustoms(): CustomTemplate[] {\n return loadJSON<CustomTemplate[]>(CUSTOMS_KEY, [])\n}\nexport function saveCustoms(list: CustomTemplate[]): void {\n saveJSON(CUSTOMS_KEY, list)\n}\n\nexport function loadUsage(): Record<string, number> {\n return loadJSON<Record<string, number>>(USAGE_KEY, {})\n}\nexport function bumpUsage(id: string): void {\n const u = loadUsage()\n u[id] = (u[id] || 0) + 1\n saveJSON(USAGE_KEY, u)\n saveJSON(LAST_USED_KEY, id) // 最近使用(智能卡「1 条最近」槽)\n}\n\n/** 最近一次使用的模板 id(智能模式「最近使用」候选;无 → null) */\nexport function loadLastUsed(): string | null {\n try {\n const s = ls()\n if (!s) return null\n const raw = s.getItem(LAST_USED_KEY)\n return raw ? JSON.parse(raw) as string : null\n } catch (e) { return null }\n}\n\nexport function loadPinned(): string[] {\n return loadJSON<string[]>(PINNED_KEY, [])\n}\nexport function savePinned(ids: string[]): void {\n saveJSON(PINNED_KEY, ids)\n}\n\n/** 全部模板(预制 + 自定义) */\nexport function allTemplates(): PromptTemplate[] {\n return [...PRESET_TEMPLATES, ...loadCustoms()]\n}\n\nexport function getTemplate(id: string): PromptTemplate | undefined {\n return allTemplates().find((t) => t.id === id)\n}\n\n/** 展示标签:预制 = 领域;自定义 = tag(默认「自定义」) */\nexport function displayTag(t: PromptTemplate): string {\n if (!t.builtin) return (t as CustomTemplate).tag || '自定义'\n return t.domain\n}\n\n/** 检索串(面板搜索与 /prompt 触发源共用):名称/英文名/正文/领域/阶段/动作/标签 */\nexport function templateHaystack(t: PromptTemplate): string {\n const tag = !t.builtin ? ((t as CustomTemplate).tag || '自定义') : ''\n return (t.name + ' ' + (t.nameEn || '') + ' ' + (t.body || '') + ' ' + t.domain + ' ' + t.stage + ' ' + (t.action || []).join(' ') + ' ' + tag).toLowerCase()\n}\n\n/** 排序:置顶(pin 在前)→ 用量计数降序。用量仅供排序,不显示数字。 */\nexport function sortedTemplates(list: PromptTemplate[]): PromptTemplate[] {\n const usage = loadUsage()\n const pinned = loadPinned()\n const pinIdx = (id: string) => { const i = pinned.indexOf(id); return i < 0 ? MAX_PIN : i }\n return [...list].sort((a, b) => {\n const pa = pinIdx(a.id), pb = pinIdx(b.id)\n if (pa !== pb) return pa - pb\n return (usage[b.id] || 0) - (usage[a.id] || 0)\n })\n}\n\n/** 置顶切换(置顶数 ≤5);返回是否成功(超限返回 false) */\nexport function togglePin(id: string): { pinned: string[]; ok: boolean } {\n const pinned = loadPinned()\n const i = pinned.indexOf(id)\n if (i >= 0) { pinned.splice(i, 1) }\n else if (pinned.length >= MAX_PIN) { return { pinned, ok: false } }\n else { pinned.push(id) }\n savePinned(pinned)\n return { pinned, ok: true }\n}\n\nexport function isPinned(id: string): boolean {\n return loadPinned().indexOf(id) >= 0\n}\n\nexport function canPinMore(): boolean {\n return loadPinned().length < MAX_PIN\n}\n\n/** 新增自定义模板 */\nexport function addCustom(name: string, tag: string, body: string): CustomTemplate {\n const t: CustomTemplate = {\n id: 'c' + Date.now().toString(36) + Math.floor(Math.random() * 1e4).toString(36),\n name, nameEn: '', domain: '执行', stage: '执行前', action: [],\n body, builtin: false, tag, createdAt: Date.now(),\n }\n const list = loadCustoms()\n list.push(t)\n saveCustoms(list)\n return t\n}\n\n/** 更新自定义模板 */\nexport function updateCustom(id: string, patch: { name?: string; tag?: string; body?: string }): void {\n const list = loadCustoms().map((t) => {\n if (t.id !== id) return t\n if (patch.name !== undefined) t.name = patch.name\n if (patch.tag !== undefined) t.tag = patch.tag\n if (patch.body !== undefined) t.body = patch.body\n return t\n })\n saveCustoms(list)\n}\n\n/** 删除自定义模板(仅限 builtin=false);返回是否成功 */\nexport function removeCustom(id: string): boolean {\n const list = loadCustoms()\n const next = list.filter((t) => t.id !== id)\n if (next.length === list.length) return false\n saveCustoms(next)\n savePinned(loadPinned().filter((p) => p !== id))\n return true\n}\n\n/** 复制预制为自定义 */\nexport function copyPresetToCustom(id: string): CustomTemplate | null {\n const src = getPresetById(id)\n if (!src) return null\n return addCustom(src.name + '(副本)', src.domain, src.body)\n}\n\nexport { MAX_BODY }\n","/**\n * dsh-prompt — 面板开合状态(入口按钮 ↔ 面板共享,模块级 + 订阅)\n */\nlet panelOpen = false\nconst listeners = new Set<(v: boolean) => void>()\n\nexport function isPanelOpen(): boolean { return panelOpen }\nexport function setPanelOpen(v: boolean): void {\n if (panelOpen !== v) {\n panelOpen = v\n listeners.forEach((fn) => { try { fn(v) } catch (e) { /* ignore */ } })\n }\n}\nexport function onPanelOpen(fn: (v: boolean) => void): () => void {\n listeners.add(fn)\n return () => { listeners.delete(fn) }\n}\n","/**\n * dsh-prompt — 双语(中文为主,html[lang] 跟随)\n */\nexport type Lang = 'zh' | 'en'\n\nexport function getLang(): Lang {\n try {\n const l = (document.documentElement && document.documentElement.lang) || (navigator.language || 'en')\n return /^zh/i.test(l) ? 'zh' : 'en'\n } catch (e) { return 'zh' }\n}\n\nexport interface I18NMap { zh: string; en: string }\n\nexport function tr(lang: Lang, m: I18NMap): string {\n return lang === 'zh' ? m.zh : m.en\n}\n\nexport const STR = {\n panelTitle: { zh: 'Prompt', en: 'Prompt' },\n entryBtn: { zh: 'Prompt', en: 'Prompt' },\n add: { zh: '新增自定义模板', en: 'Add custom template' },\n addShort: { zh: '新增', en: 'Add' },\n searchPh: { zh: '搜索模板…', en: 'Search templates…' },\n tabAll: { zh: '全部', en: 'All' },\n tabBefore: { zh: '执行前', en: 'Before' },\n tabDuring: { zh: '执行中', en: 'During' },\n tabAfter: { zh: '执行后', en: 'After' },\n tabCustom: { zh: '自定义', en: 'Custom' },\n domainAll: { zh: '全领域', en: 'All domains' },\n presetCount: { zh: '预制', en: 'Preset' },\n customCount: { zh: '自定义', en: 'Custom' },\n goSettings: { zh: '设置 → 模板管理', en: 'Settings → Templates' },\n edit: { zh: '编辑', en: 'Edit' },\n del: { zh: '删除', en: 'Delete' },\n copy: { zh: '复制为自定义', en: 'Copy to custom' },\n pin: { zh: '置顶/取消置顶', en: 'Pin/Unpin' },\n noMatch: { zh: '无匹配模板', en: 'No matching templates' },\n addTitle: { zh: '新增自定义模板', en: 'Add custom template' },\n editTitle: { zh: '编辑自定义模板', en: 'Edit custom template' },\n namePh: { zh: '模板名称', en: 'Template name' },\n tagPh: { zh: '标签', en: 'Tag' },\n bodyPh: { zh: 'Prompt 正文(≤1000 字)', en: 'Prompt body (≤1000 chars)' },\n cancel: { zh: '取消', en: 'Cancel' },\n save: { zh: '保存', en: 'Save' },\n addOk: { zh: '添加', en: 'Add' },\n nameRequired: { zh: '名称必填', en: 'Name is required' },\n bodyTooLong: { zh: '正文超过 1000 字上限', en: 'Body exceeds 1000 chars' },\n delTitle: { zh: '删除确认', en: 'Confirm delete' },\n delMsg: { zh: '确定删除自定义模板', en: 'Delete custom template' },\n delUnrecover: { zh: '此操作不可撤销。', en: 'This cannot be undone.' },\n delOk: { zh: '删除', en: 'Delete' },\n pinFull: { zh: '置顶已达上限(5 个)', en: 'Pin limit reached (5)' },\n insertHint: { zh: '点击即插入', en: 'Click to insert' },\n close: { zh: '关闭', en: 'Close' },\n smartToggle: { zh: '智能模式悬浮卡(输入匹配时推荐模板;默认开)', en: 'Smart card (recommends templates while typing; on by default)' },\n smartToggleHint: { zh: '默认开;关闭后仅保留 ⚡Prompt 面板与 /prompt 触发源', en: 'On by default; when off, only the panel and /prompt remain' },\n smartDot: { zh: '智能模式 · 拖动调整位置;输入匹配时出卡', en: 'Smart mode · drag to move; card appears on match' },\n smartTitle: { zh: '智能推荐', en: 'Smart suggest' },\n smartHint: { zh: '点击即填入', en: 'Click to insert' },\n smartFill: { zh: '点击填入', en: 'Insert' },\n smartDismiss: { zh: '收起(继续输入可再次出现)', en: 'Dismiss (reappears as you type)' },\n smartRecent: { zh: '最近使用', en: 'Recently used' },\n smartCommon: { zh: '常用模板', en: 'Common templates' },\n gitHubRepo: { zh: 'GitHub 仓库', en: 'GitHub repo' },\n feedback: { zh: '反馈故障', en: 'Report issue' },\n}\n","/**\n * dsh-prompt — 模板浏览组件(面板 popover 与设置页共用)\n * #4 交互定稿:tabs(阶段)+ 领域筛选 + 搜索;排序=置顶≤5 → 用量;单击插入(光标处/末尾、不覆盖、自动聚焦);\n * 插入后自动关闭;编辑/删除/新增时保持打开;hover 快捷操作;+弹窗新增;删除二次确认;预制可复制为自定义。\n */\nimport type { PromptTemplate } from './templates'\nimport { PRESET_TEMPLATES, getPresetById } from './templates'\nimport {\n allTemplates, sortedTemplates, displayTag, isPinned, togglePin, canPinMore,\n addCustom, updateCustom, removeCustom, copyPresetToCustom, bumpUsage, templateHaystack, MAX_BODY,\n} from './store'\nimport { setPanelOpen } from './state'\nimport { getLang, tr, STR, type Lang } from './i18n'\nimport { setSmartInput } from './smartstore'\n\nexport function getReact(): any {\n if (typeof require === 'function') { try { return require('react') } catch (e) { /* ignore */ } }\n if (typeof globalThis !== 'undefined' && (globalThis as any).React) return (globalThis as any).React\n return null\n}\n\nconst STAGE_TABS = ['all', '执行前', '执行中', '执行后'] as const\nconst DOMAIN_FILTERS = ['all', '思考框架', '学习', '工程', '执行'] as const\nconst CUSTOM_TAG = '自定义'\n\nexport interface BrowserProps {\n compact: boolean\n inputActions?: any\n useInput?: any\n}\n\ninterface ModalState {\n kind: 'add' | 'edit' | 'del'\n t?: PromptTemplate\n}\n\n/** 插入正文到当前草稿(光标处优先,否则末尾;不覆盖;自动聚焦) */\nexport function insertBody(useInput: any, inputActions: any, body: string): void {\n let draft = ''\n try { const st = useInput ? useInput((s: any) => s) : null; draft = (st && st.draft) || '' } catch (e) { /* ignore */ }\n let pos = draft.length\n try {\n if (typeof document !== 'undefined') {\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === draft) { pos = typeof ta.selectionStart === 'number' ? ta.selectionStart : draft.length; break }\n }\n }\n } catch (e) { /* ignore */ }\n const newDraft = draft.slice(0, pos) + body + draft.slice(pos)\n if (inputActions && typeof inputActions.setDraft === 'function') inputActions.setDraft(newDraft)\n setTimeout(() => {\n try {\n if (typeof document !== 'undefined') {\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === newDraft) { ta.focus(); ta.setSelectionRange(pos + body.length, pos + body.length); break }\n }\n }\n } catch (e) { /* ignore */ }\n }, 0)\n}\n\n/** 点击模板:插入 + 用量 +1 + 面板关闭 */\nexport function onPick(t: PromptTemplate, useInput: any, inputActions: any): void {\n insertBody(useInput, inputActions, t.body)\n bumpUsage(t.id)\n setPanelOpen(false)\n}\n\n/** 模板浏览(面板 / 设置页共用) */\nexport function TemplateBrowser(props: BrowserProps): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const { compact, inputActions, useInput } = props\n\n const langState = react.useState<Lang>(getLang())\n const lang = langState[0]\n const tickState = react.useState(0)\n const setTick = tickState[1]\n const tabState = react.useState<string>('all')\n const tab = tabState[0]\n const domainState = react.useState<string>('all')\n const domain = domainState[0]\n const qState = react.useState('')\n const q = qState[0]\n const modalState = react.useState<ModalState | null>(null)\n const modal = modalState[0]\n const offsetState = react.useState(0)\n const offsetLeft = offsetState[0]\n const rootRef = react.useRef<any>(null)\n const highlightState = react.useState<string | null>(null)\n const highlightId = highlightState[0]\n\n // 横向对齐 ⚡Prompt 按钮(仅紧凑面板):测按钮在锚点内的水平偏移\n react.useEffect(() => {\n if (!compact) return\n try {\n const btn = typeof document !== 'undefined' ? document.querySelector('[data-dsh-prompt-entry]') : null\n if (btn && rootRef.current && rootRef.current.offsetParent) {\n const br = (btn as HTMLElement).getBoundingClientRect()\n const ar = (rootRef.current.offsetParent as HTMLElement).getBoundingClientRect()\n offsetState[1](Math.max(0, br.left - ar.left))\n }\n } catch (e) { /* ignore */ }\n }, [])\n\n // 语言跟随 html[lang]\n react.useEffect(() => {\n if (typeof document === 'undefined') return\n const onLang = () => { langState[1](getLang()) }\n const obs = new MutationObserver(onLang)\n obs.observe(document.documentElement, { attributes: true, attributeFilter: ['lang'] })\n return () => { obs.disconnect() }\n }, [])\n\n const refresh = () => setTick((n) => n + 1)\n const t = (k: keyof typeof STR) => tr(lang, STR[k])\n\n // 列表组装:tab=自定义 → 仅自定义;否则 预制+自定义,按 阶段 → 领域 → 搜索过滤,排序\n const customs = allTemplates().filter((x) => !x.builtin)\n const list = allTemplates().filter((x) => {\n if (tab === CUSTOM_TAG) return !x.builtin\n if (tab !== 'all' && x.stage !== tab) return false\n if (domain !== 'all' && displayTag(x) !== domain) return false\n return true\n })\n const ql = q.trim().toLowerCase()\n // 搜索与 /prompt 触发源共用检索底座(名称/正文/领域/阶段/动作/标签)\n const filtered = ql\n ? list.filter((x) => templateHaystack(x).indexOf(ql) >= 0)\n : list\n const sorted = sortedTemplates(filtered)\n\n const presetCount = PRESET_TEMPLATES.length\n const customCount = customs.length\n\n // ── 样式(DSH 主题变量)──\n const base = 'var(--dsw-alias-label-primary)'\n const muted = 'var(--dsw-alias-label-secondary)'\n const dim = 'var(--dsw-alias-label-tertiary)'\n const line = '1px solid var(--dsw-alias-border-l1)'\n const panelStyle: any = compact\n ? {\n position: 'absolute', left: offsetLeft, bottom: 'calc(100% + 8px)',\n zIndex: 300, width: 430,\n display: 'flex', flexDirection: 'column',\n background: 'var(--dsw-specific-menu)', border: '1px solid var(--dsw-alias-border-inverted)',\n borderRadius: 12, boxShadow: 'var(--dsw-shadow-lv3)', overflow: 'hidden',\n fontFamily: 'var(--dsw-font-family)', fontSize: 'var(--dsw-font-markdown-base-font-size)', color: base,\n }\n : {\n display: 'flex', flexDirection: 'column', gap: 6, padding: '6px 8px',\n fontFamily: 'var(--dsw-font-family)', fontSize: 'var(--dsw-font-markdown-base-font-size)', color: base,\n }\n const headStyle: any = { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '6px 8px', borderBottom: line }\n const titleStyle: any = { fontWeight: 700, fontSize: '1em' }\n const addBtn: any = { width: 26, height: 26, borderRadius: 7, border: line, background: 'var(--dsw-alias-bg-layer-3)', color: 'var(--dsw-specific-accent,#f0a45c)', fontSize: '1.2em', lineHeight: 1, cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 0 }\n const closeBtn: any = { width: 26, height: 26, borderRadius: 7, border: 0, background: 'transparent', color: dim, fontSize: '1.2em', lineHeight: 1, cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 0 }\n const headBtns: any = { display: 'flex', gap: 4, alignItems: 'center' }\n const tabsStyle: any = { display: 'flex', gap: 4, padding: '4px 8px 0', flexWrap: 'wrap' }\n const tabBtn = (on: boolean): any => ({\n padding: '2px 8px', borderRadius: 999, border: line, background: on ? 'var(--dsw-alias-bg-layer-3)' : 'transparent',\n color: on ? base : muted, cursor: 'pointer', fontFamily: 'var(--dsw-font-family)', fontSize: '0.85em',\n })\n const domainRowStyle: any = { display: 'flex', gap: 4, padding: '3px 8px 0', flexWrap: 'wrap' }\n const searchStyle: any = { margin: '5px 8px 4px', padding: '5px 9px', borderRadius: 8, border: line, background: 'var(--dsw-alias-bg-layer-3)', color: base, fontFamily: 'var(--dsw-font-family)', fontSize: '0.96em', outline: 'none' }\n const listStyle: any = compact\n ? { overflow: 'auto', padding: '2px 2px 8px', maxHeight: 170 } // 面板:恒定约 5 行,内部滚动\n : { padding: '2px 2px 8px' } // 设置页:自然高度,由宿主设置面板整页滚动\n const itemStyle: any = { display: 'flex', alignItems: 'flex-start', gap: 6, padding: '4px 2px', borderRadius: 8, cursor: 'pointer' }\n const pinStyle = (on: boolean): any => ({ flex: 'none', width: 20, height: 20, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', border: 0, background: 'transparent', borderRadius: 6 })\n const nmStyle: any = { flex: 'none', minWidth: 0, fontSize: '0.98em', color: base, fontWeight: 500, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\n const subStyle: any = { display: 'block', fontSize: '0.85em', color: dim, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\n // 勋章式标签:填充底色 + 精致胶囊\n const tagStyle: any = { flex: 'none', fontSize: '0.7em', fontWeight: 500, color: muted, background: 'var(--dsw-alias-bg-layer-3)', border: '1px solid var(--dsw-alias-border-l2)', padding: '0 7px', borderRadius: 999, lineHeight: '15px', letterSpacing: '0.02em', whiteSpace: 'nowrap' }\n const actStyle: any = { display: 'flex', gap: 4, flex: 'none' }\n const actBtn = (danger?: boolean): any => ({ border: line, background: 'transparent', color: danger ? 'var(--dsw-specific-danger,#e06c75)' : dim, cursor: 'pointer', fontSize: '0.85em', padding: '1px 8px', borderRadius: 999, fontFamily: 'var(--dsw-font-family)', whiteSpace: 'nowrap' })\n const footStyle: any = { padding: '8px 12px', borderTop: line, display: 'flex', justifyContent: 'space-between', fontSize: '0.85em', color: dim }\n const footLink: any = { color: 'var(--dsw-specific-accent,#f0a45c)', cursor: 'pointer', textDecoration: 'none', background: 'transparent', border: 0, fontFamily: 'var(--dsw-font-family)', fontSize: '0.85em' }\n const maskStyle: any = { position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.55)', display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 400 }\n const modalStyle: any = { width: 460, background: 'var(--dsw-specific-menu)', border: '1px solid var(--dsw-alias-border-inverted)', borderRadius: 12, padding: 16, display: 'flex', flexDirection: 'column', gap: 10, fontFamily: 'var(--dsw-font-family)', color: base }\n const fieldStyle: any = { width: '100%', background: 'var(--dsw-alias-bg-layer-3)', border: line, color: base, borderRadius: 8, padding: '8px 10px', fontFamily: 'var(--dsw-font-family)', fontSize: '0.96em', outline: 'none', boxSizing: 'border-box' }\n const mbtnsStyle: any = { display: 'flex', justifyContent: 'flex-end', gap: 8 }\n const mbtn = (primary?: boolean, danger?: boolean): any => ({ padding: '6px 14px', borderRadius: 8, border: primary ? 0 : line, background: primary ? 'var(--dsw-specific-accent,#f0a45c)' : 'var(--dsw-alias-bg-layer-3)', color: primary ? '#1a1a1e' : (danger ? 'var(--dsw-specific-danger,#e06c75)' : base), cursor: 'pointer', fontFamily: 'var(--dsw-font-family)', fontSize: '0.96em' })\n\n // ── 操作 ──\n const handlePick = (x: PromptTemplate) => { onPick(x, useInput, inputActions) }\n\n const handlePin = (e: any, x: PromptTemplate) => {\n e.stopPropagation()\n const r = togglePin(x.id)\n if (!r.ok) { alert(t('pinFull')) }\n refresh()\n }\n\n const handleCopy = (e: any, id: string) => {\n e.stopPropagation()\n const c = copyPresetToCustom(id)\n if (!c) return\n // 创建反馈:自动置顶(容量允许)→ 切「自定义」tab → 高亮新项 → 滚入视野\n const r = togglePin(c.id)\n tabState[1](CUSTOM_TAG)\n highlightState[1](c.id)\n refresh()\n setTimeout(() => {\n highlightState[1](null)\n try {\n const el = typeof document !== 'undefined' ? document.querySelector('[data-dsh-prompt-id=\"' + c.id + '\"]') : null\n if (el) (el as HTMLElement).scrollIntoView({ block: 'nearest' })\n } catch (err) { /* ignore */ }\n }, 1600)\n }\n\n const handleDel = (e: any, x: PromptTemplate) => {\n e.stopPropagation()\n modalState[1]({ kind: 'del', t: x })\n }\n\n const handleEdit = (e: any, x: PromptTemplate) => {\n e.stopPropagation()\n modalState[1]({ kind: 'edit', t: x })\n }\n\n // ── 弹窗(新增/编辑/删除确认)──\n let modalNode: any = null\n if (modal) {\n if (modal.kind === 'add' || modal.kind === 'edit') {\n const editing = modal.kind === 'edit' && modal.t\n let name = editing ? modal.t!.name : ''\n let tag = editing ? (modal.t as any).tag || CUSTOM_TAG : CUSTOM_TAG\n let body = editing ? modal.t!.body : ''\n const ModalInner = () => {\n const s1 = react.useState(name); name = s1[0]; const setName = s1[1]\n const s2 = react.useState(tag); tag = s2[0]; const setTag = s2[1]\n const s3 = react.useState(body); body = s3[0]; const setBody = s3[1]\n const err = react.useState<string | null>(null)\n const doOk = () => {\n const nm = name.trim(), bd = body.trim()\n if (!nm) { err[1]('nameRequired'); return }\n if (bd.length > MAX_BODY) { err[1]('bodyTooLong'); return }\n if (editing) { updateCustom(modal.t!.id, { name: nm, tag, body: bd }) }\n else { addCustom(nm, tag || CUSTOM_TAG, bd) }\n modalState[1](null)\n refresh()\n }\n return h('div', { style: maskStyle, onClick: (e: any) => { if (e.target === e.currentTarget) modalState[1](null) } }, [\n h('div', { style: modalStyle }, [\n h('h3', { style: { fontSize: '1.08em', margin: 0 } }, editing ? t('editTitle') : t('addTitle')),\n h('input', { style: fieldStyle, placeholder: t('namePh'), value: name, onChange: (e: any) => setName(e.target.value) }),\n h('input', { style: fieldStyle, placeholder: t('tagPh'), value: tag, onChange: (e: any) => setTag(e.target.value) }),\n h('textarea', { style: { ...fieldStyle, height: 110, resize: 'vertical' }, placeholder: t('bodyPh'), value: body, onChange: (e: any) => setBody(e.target.value) }),\n err[0] ? h('div', { style: { fontSize: '0.92em', color: 'var(--dsw-specific-danger,#e06c75)' } }, t(err[0] as keyof typeof STR)) : null,\n h('div', { style: mbtnsStyle }, [\n h('button', { style: mbtn(), onClick: () => modalState[1](null) }, t('cancel')),\n h('button', { style: mbtn(true), onClick: doOk }, editing ? t('save') : t('addOk')),\n ]),\n ]),\n ])\n }\n modalNode = h(ModalInner)\n } else if (modal.kind === 'del' && modal.t) {\n const doDel = () => { removeCustom(modal.t!.id); modalState[1](null); refresh() }\n modalNode = h('div', { style: maskStyle, onClick: (e: any) => { if (e.target === e.currentTarget) modalState[1](null) } }, [\n h('div', { style: modalStyle }, [\n h('h3', { style: { fontSize: '1.08em', margin: 0 } }, t('delTitle')),\n h('div', { style: { fontSize: '0.96em', color: dim } }, t('delMsg') + '「' + modal.t.name + '」' + t('delUnrecover')),\n h('div', { style: mbtnsStyle }, [\n h('button', { style: mbtn(), onClick: () => modalState[1](null) }, t('cancel')),\n h('button', { style: mbtn(false, true), onClick: doDel }, t('delOk')),\n ]),\n ]),\n ])\n }\n }\n\n // ── 组装 ──\n const tabs = [\n { id: 'all', label: t('tabAll') },\n { id: '执行前', label: t('tabBefore') },\n { id: '执行中', label: t('tabDuring') },\n { id: '执行后', label: t('tabAfter') },\n { id: CUSTOM_TAG, label: t('tabCustom') },\n ]\n const tabNodes = h('div', { style: tabsStyle }, tabs.map((tb) =>\n h('button', { key: tb.id, style: tabBtn(tab === tb.id), onClick: () => { tabState[1](tb.id); refresh() } }, tb.label),\n ))\n const domainNodes = h('div', { style: domainRowStyle }, DOMAIN_FILTERS.map((d) =>\n h('button', { key: d, style: tabBtn(domain === d), onClick: () => { domainState[1](d); refresh() } }, d === 'all' ? t('domainAll') : d),\n ))\n const rows = sorted.map((x) => {\n const pinned = isPinned(x.id)\n const custom = !x.builtin\n const acts = custom\n ? h('span', { style: actStyle }, [\n h('button', { style: actBtn(), onClick: (e: any) => handleEdit(e, x) }, t('edit')),\n h('button', { style: actBtn(true), onClick: (e: any) => handleDel(e, x) }, t('del')),\n ])\n : h('span', { style: actStyle }, [\n h('button', { style: actBtn(), onClick: (e: any) => handleCopy(e, x.id) }, t('copy')),\n ])\n const itemBg = highlightId === x.id ? 'var(--dsw-alias-interactive-bg-hover)' : undefined\n return h('div', { key: x.id, style: { ...itemStyle, background: itemBg }, 'data-dsh-prompt-id': x.id, onClick: () => handlePick(x), title: t('insertHint') }, [\n h('div', { style: { flex: 'none', paddingTop: 2 } }, [\n h('button', { style: pinStyle(pinned), title: t('pin'), onClick: (e: any) => handlePin(e, x) }, [\n // 图钉(置顶语义):置顶=橙色实心,未置顶=描边\n h('svg', { width: 14, height: 14, viewBox: '0 0 24 24', fill: pinned ? 'var(--dsw-specific-accent,#f0a45c)' : 'none', stroke: pinned ? 'var(--dsw-specific-accent,#f0a45c)' : dim, strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', style: { display: 'block' } }, [\n h('path', { d: 'M12 17v5' }),\n h('path', { d: 'M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1z' }),\n ]),\n ]),\n ]),\n h('div', { style: { flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 1 } }, [\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 } }, [\n h('span', { style: nmStyle }, x.name),\n h('span', { style: tagStyle }, displayTag(x)),\n ]),\n h('span', { style: subStyle }, (x.body || '').slice(0, 44) + '…'),\n ]),\n h('div', { style: { flex: 'none', display: 'flex', alignItems: 'center', gap: 4, paddingTop: 2 } }, [acts]),\n ])\n })\n const listNode = rows.length > 0\n ? h('div', { style: listStyle }, rows)\n : h('div', { style: { padding: 14, color: dim, fontSize: '0.92em' } }, t('noMatch'))\n\n const footer = null\n\n return h('div', { ref: rootRef, style: panelStyle }, [\n compact ? h('div', { style: headStyle }, [\n h('svg', { width: 15, height: 15, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--dsw-specific-accent,#f0a45c)', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', style: { flex: 'none' } }, [\n h('path', { d: 'M15 14c.2-1 .7-1.7 1.5-2.5C17.5 10.6 18 9.3 18 8a6 6 0 1 0-12 0c0 1.3.5 2.6 1.5 3.5.8.8 1.3 1.5 1.5 2.5' }),\n h('path', { d: 'M9 18h6' }),\n h('path', { d: 'M10 22h4' }),\n h('path', { d: 'M18.5 2.5l.8 1.7 1.7.8-1.7.8-.8 1.7-.8-1.7-1.7-.8 1.7-.8z' }),\n ]),\n h('span', { style: titleStyle }, t('panelTitle')),\n h('span', { style: { fontSize: '0.85em', color: dim, marginLeft: 6 } }, t('presetCount') + ' ' + presetCount + ' · ' + t('customCount') + ' ' + customCount),\n h('div', { style: { flex: 1 } }),\n h('button', { style: footLink, onClick: () => { setPanelOpen(false); emitGoSettings() } }, t('goSettings')),\n h('div', { style: headBtns }, [\n h('button', { style: addBtn, title: t('add'), onClick: () => modalState[1]({ kind: 'add' }) }, '+'),\n h('button', { style: closeBtn, title: t('close'), onClick: () => setPanelOpen(false) }, '×'),\n ]),\n ]) : h('div', { style: headStyle }, [\n h('svg', { width: 15, height: 15, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--dsw-specific-accent,#f0a45c)', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', style: { flex: 'none' } }, [\n h('path', { d: 'M15 14c.2-1 .7-1.7 1.5-2.5C17.5 10.6 18 9.3 18 8a6 6 0 1 0-12 0c0 1.3.5 2.6 1.5 3.5.8.8 1.3 1.5 1.5 2.5' }),\n h('path', { d: 'M9 18h6' }),\n h('path', { d: 'M10 22h4' }),\n h('path', { d: 'M18.5 2.5l.8 1.7 1.7.8-1.7.8-.8 1.7-.8-1.7-1.7-.8 1.7-.8z' }),\n ]),\n h('span', { style: titleStyle }, t('panelTitle')),\n h('div', { style: { flex: 1 } }),\n h('button', { style: { ...addBtn, width: 'auto', padding: '0 12px', fontSize: '0.92em' }, title: t('add'), onClick: () => modalState[1]({ kind: 'add' }) }, '+ ' + t('addShort')),\n ]),\n tabNodes,\n domainNodes,\n h('input', { style: searchStyle, placeholder: t('searchPh'), value: q, onChange: (e: any) => qState[1](e.target.value) }),\n listNode,\n footer,\n modalNode,\n ])\n}\n\n/** 面板 → 设置页跳转(宿主 settings 路由:由 index.ts 注册) */\nlet goSettingsHandler: (() => void) | null = null\nexport function setGoSettingsHandler(fn: (() => void) | null): void { goSettingsHandler = fn }\nfunction emitGoSettings(): void { if (goSettingsHandler) goSettingsHandler() }\n\nexport function getPresetList(): PromptTemplate[] { return PRESET_TEMPLATES }\nexport function getPreset(id: string): PromptTemplate | undefined { return getPresetById(id) }\n","/**\n * dsh-prompt — 入口按钮(conversation.input.left)\n */\nimport { getReact } from './panel'\nimport { isPanelOpen, setPanelOpen } from './state'\nimport { getLang, tr, STR } from './i18n'\n\nexport function EntryButton(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const open = props.open ?? false\n const lang = getLang()\n\n const style: any = {\n display: 'inline-flex', alignItems: 'center', gap: 6,\n padding: '5px 10px', borderRadius: 8,\n background: 'var(--dsw-alias-bg-layer-3)',\n border: '1px solid var(--dsw-alias-border-l1)',\n color: open ? 'var(--dsw-specific-accent,#f0a45c)' : 'var(--dsw-alias-label-primary)',\n cursor: 'pointer', fontSize: 12, fontWeight: 500,\n fontFamily: 'var(--dsw-font-family)', whiteSpace: 'nowrap',\n flex: 'none',\n }\n return h('button', {\n style, title: tr(lang, STR.entryBtn),\n 'data-dsh-prompt-entry': '1',\n onClick: () => setPanelOpen(!isPanelOpen()),\n }, [\n // 图标:灯泡(提醒/点子语义)+ 小星芒(智能建议)—— 方案 C\n h('svg', { width: 14, height: 14, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--dsw-specific-accent,#f0a45c)', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', style: { flex: 'none' } }, [\n h('path', { d: 'M15 14c.2-1 .7-1.7 1.5-2.5C17.5 10.6 18 9.3 18 8a6 6 0 1 0-12 0c0 1.3.5 2.6 1.5 3.5.8.8 1.3 1.5 1.5 2.5' }),\n h('path', { d: 'M9 18h6' }),\n h('path', { d: 'M10 22h4' }),\n h('path', { d: 'M18.5 2.5l.8 1.7 1.7.8-1.7.8-.8 1.7-.8-1.7-1.7-.8 1.7-.8z' }),\n ]),\n h('span', null, tr(lang, STR.entryBtn)),\n ])\n}\n","/**\n * dsh-prompt — 智能模式桥接存储\n * 会话作用域 overlay 把当前输入(draft/useInput/actions)发布到这里;root 悬浮卡订阅。\n * 开关(默认开)、位置持久化、插入抑制(防「插入后卡片重现」)也在此。\n */\nexport interface SmartInput {\n sessionId?: string\n draft: string\n useInput?: any\n actions?: any\n}\n\nlet current: SmartInput = { draft: '' }\nconst listeners = new Set<() => void>()\n\nexport function setSmartInput(next: SmartInput): void {\n if (next.draft === current.draft && next.sessionId === current.sessionId && next.actions === current.actions && next.useInput === current.useInput) return\n current = next\n listeners.forEach((fn) => { try { fn() } catch (e) { /* ignore */ } })\n}\nexport function getSmartInput(): SmartInput { return current }\nexport function onSmartInput(fn: () => void): () => void {\n listeners.add(fn)\n return () => { listeners.delete(fn) }\n}\n\nconst SMART_KEY = 'dsh.prompt.smart'\nconst POS_KEY = 'dsh.prompt.smartPos'\n\n/** 智能模式开关:默认开(localStorage 缺省 true);变更广播(设置页 ↔ 悬浮卡实时同步) */\nconst enabledListeners = new Set<(on: boolean) => void>()\nexport function isSmartEnabled(): boolean {\n try {\n const s = globalThis.localStorage\n if (!s) return true\n const v = s.getItem(SMART_KEY)\n return v === null ? true : v !== '0'\n } catch (e) { return true }\n}\nexport function setSmartEnabled(on: boolean): void {\n try { globalThis.localStorage?.setItem(SMART_KEY, on ? '1' : '0') } catch (e) { /* ignore */ }\n enabledListeners.forEach((fn) => { try { fn(on) } catch (e) { /* ignore */ } })\n}\nexport function onSmartEnabled(fn: (on: boolean) => void): () => void {\n enabledListeners.add(fn)\n return () => { enabledListeners.delete(fn) }\n}\n\nexport interface SmartPos { x: number; y: number }\n\nexport function loadSmartPos(): SmartPos | null {\n try {\n const s = globalThis.localStorage\n if (!s) return null\n const raw = s.getItem(POS_KEY)\n if (!raw) return null\n const p = JSON.parse(raw) as SmartPos\n return typeof p.x === 'number' && typeof p.y === 'number' ? p : null\n } catch (e) { return null }\n}\nexport function saveSmartPos(p: SmartPos): void {\n try { globalThis.localStorage?.setItem(POS_KEY, JSON.stringify(p)) } catch (e) { /* ignore */ }\n}\n\n/** 插入抑制:插入后 draft 变为新值 → 卡片不重现;用户改动草稿后自动解除 */\nlet suppressDraft: string | null = null\nexport function suppressCard(draft: string): void { suppressDraft = draft }\nexport function isSuppressed(draft: string): boolean { return suppressDraft !== null && suppressDraft === draft }\nexport function clearSuppression(draft: string): void { if (suppressDraft !== null && suppressDraft !== draft) suppressDraft = null }\n","/**\n * dsh-prompt — 设置页模板管理(settings.plugins.tab)+ 智能模式开关\n */\nimport { getReact, TemplateBrowser } from './panel'\nimport { isSmartEnabled, setSmartEnabled } from './smartstore'\nimport { getLang, tr, STR } from './i18n'\n\nexport function SettingsPage(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const smartState = react.useState(isSmartEnabled())\n const smartOn = smartState[0]\n const lang = getLang()\n const t = (k: keyof typeof STR) => tr(lang, STR[k])\n const row: any = {\n display: 'flex', alignItems: 'center', gap: 8, padding: '10px 4px',\n fontFamily: 'var(--dsw-font-family)', fontSize: 12.5, color: 'var(--dsw-alias-label-primary)',\n }\n const linkRow: any = {\n display: 'flex', gap: 18, padding: '12px 4px 2px', borderTop: '1px solid var(--dsw-alias-border-l1)',\n fontSize: '0.88em', fontFamily: 'var(--dsw-font-family)',\n }\n const linkStyle: any = {\n color: 'var(--dsw-specific-accent,#f0a45c)', cursor: 'pointer', textDecoration: 'none',\n display: 'inline-flex', alignItems: 'center', gap: 5,\n }\n return h('div', { style: { padding: 4, display: 'flex', flexDirection: 'column' } }, [\n h('div', { style: linkRow }, [\n h('a', { style: linkStyle, href: 'https://github.com/FeatherHunter/dsh-prompt', target: '_blank', rel: 'noreferrer' }, '⛭ ' + t('gitHubRepo')),\n h('a', { style: linkStyle, href: 'https://github.com/FeatherHunter/dsh-prompt/issues/new', target: '_blank', rel: 'noreferrer' }, '⚠ ' + t('feedback')),\n ]),\n h('label', { style: row, title: t('smartToggleHint') }, [\n h('input', {\n type: 'checkbox', checked: smartOn,\n onChange: (e: any) => { const on = e.target.checked; smartState[1](on); setSmartEnabled(on) },\n }),\n h('span', null, t('smartToggle')),\n ]),\n h(TemplateBrowser, { compact: false }),\n ])\n}\n","/**\n * dsh-prompt — /prompt 触发源(inputTriggers registerSource)\n * #9:trigger=/ name=prompt;列出预制+自定义模板,支持过滤(标签/搜索);选中即插入(span 替换,与面板插入一致)。\n * v1 只做「列出+过滤」,不做评分匹配(评分/强弱词留给 v1.1 智能卡 #10);排序与面板共用(置顶→用量,sortedTemplates)。\n */\nimport type { PromptTemplate } from './templates'\nimport {\n allTemplates, sortedTemplates, templateHaystack, displayTag, getTemplate, bumpUsage,\n} from './store'\n\nconst SOURCE_NAME = 'prompt'\nconst MAX_ITEMS = 30\n\nexport interface PromptTriggerSource {\n trigger: string\n name: string\n order: number\n candidates(projection: unknown, req: { query: string; position: string; signal?: AbortSignal }): Promise<Array<{ name: string; description: string; templateId: string }>>\n onPick(pick: { candidate: { templateId: string } }): { text: string } | undefined\n}\n\n/**\n * /prompt 过滤:先剥离源名前缀(/prompt 本身 → 全量列出;/prompt <词> → 按词过滤),\n * 剩余词匹配 名称/英文名/正文/领域/阶段/动作/标签(场景标签手动筛选的检索底座)。\n */\nexport function filterPromptTemplates(query: string): PromptTemplate[] {\n let q = (query || '').trim()\n const ql = q.toLowerCase()\n const src = SOURCE_NAME.toLowerCase()\n if (ql === src || ql.startsWith(src + ' ') || ql.startsWith(src + '\\t') || ql.startsWith(src + '\\n')) {\n q = q.slice(src.length).trim()\n }\n if (!q) return sortedTemplates(allTemplates())\n const needle = q.toLowerCase()\n return sortedTemplates(allTemplates().filter((x) => templateHaystack(x).indexOf(needle) >= 0))\n}\n\n/** /prompt 触发源(inputTriggers source 契约:candidates → onPick → {text} span 替换) */\nexport function buildPromptSource(): PromptTriggerSource {\n return {\n trigger: '/',\n name: SOURCE_NAME,\n order: 5, // '/' 分组内排在 command(0)、skill(2) 之后\n candidates: async (_projection, req) =>\n filterPromptTemplates(req.query).slice(0, MAX_ITEMS).map((t) => ({\n name: t.name,\n description: displayTag(t) + ' · ' + t.stage + ' — ' + (t.body || '').replace(/\\s+/g, ' ').slice(0, 42),\n templateId: t.id,\n })),\n onPick: (pick) => {\n const tpl = getTemplate(pick.candidate.templateId)\n if (!tpl) return undefined\n bumpUsage(tpl.id) // 与面板插入一致:用量仅排序不显示\n return { text: tpl.body }\n },\n }\n}\n","/**\n * dsh-prompt — 智能模式强/弱词表(v1.1)\n * 从 final.md 的场景标签(领域×阶段×动作)+ 适用场景提炼,覆盖 24 条预制模板。\n * 专属词(强词,命中×2)=模板特有概念/动作术语;通用词(弱词,命中×1)=跨模板常见词。\n * 自定义模板无词表(不做评分),仅经「最近使用」槽位进入候选。\n */\nexport interface WordSet {\n strong: string[]\n weak: string[]\n}\n\nexport const SMART_WORDS: Record<string, WordSet> = {\n fp: { strong: ['第一性原理', '基本组成单元', '不可改变的真理', '颠覆', '去掉假设'], weak: ['分析', '本质', '假设', '拆解', '主题'] },\n socratic: { strong: ['苏格拉底', '追问', '质疑', '复述观点', '没想到的问题'], weak: ['思考', '问题', '假设', '观点'] },\n deep: { strong: ['深度分析', '多维', '常见误解', '边界', '证据'], weak: ['分析', '本质', '判断', '主题'] },\n adversarial: { strong: ['对抗式', '红队', '反例', '推翻', '失败场景', '认知偏差'], weak: ['审查', '方案', '结论', '假设'] },\n decision: { strong: ['决策', '选项', '纠结', '后悔', '最坏', '沉没成本', '没有回头路'], weak: ['选择', '权衡', '处境', '分析'] },\n premortem: { strong: ['事前验尸', 'premortem', '失败原因', '回溯', '预防', '致命缺陷', '早期信号'], weak: ['方案', '项目', '风险', '失败'] },\n feynman: { strong: ['费曼', '类比', '反例', '禁止术语', '判断题'], weak: ['理解', '概念', '解释'] },\n fivewhys: { strong: ['五个为什么', '5why', '根本原因', '根因', '连续追问'], weak: ['为什么', '问题', '原因'] },\n mece: { strong: ['mece', '相互独立', '完全穷尽', '不重不漏', '分类维度'], weak: ['拆解', '分类', '问题'] },\n bias: { strong: ['认知偏差', '确认偏误', '锚定', '群体思维', '反事实', '可得性'], weak: ['偏差', '检查', '推理', '结论'] },\n learnpath: { strong: ['学习路线', '从零到实战', '伪学习', '最小闭环', '掌握程度'], weak: ['学习', '路线', '技能', '入门', '进阶'] },\n concept: { strong: ['概念澄清', '本质区别', '一句话定义', '对比场景', '不适用'], weak: ['概念', '理解', '定义'] },\n codereview: { strong: ['代码审查', 'code review', 'review', 'pr', '正确性', '并发', '注入', '可维护性', '性能'], weak: ['安全', '技术栈'] },\n testdesign: { strong: ['测试用例', '正常路径', '边界值', '异常', '幂等', '并发'], weak: ['测试', '用例', '功能'] },\n refactor: { strong: ['重构', 'refactor', '小步', '可测试性', '耦合'], weak: ['代码', '方案', '结构', '职责'] },\n explain: { strong: ['解释代码', '执行流程', '为什么这样写', '设计取舍', '扮演的角色'], weak: ['代码', '解释', '讲解'] },\n blindspot: { strong: ['盲区', '遗漏', '检查清单', '关键变量'], weak: ['计划', '开始', '任务', '启动', '风险'] },\n snapshot: { strong: ['零丢失', '快照', '出处', '逐条核对', '可疑遗漏'], weak: ['记录', '固化', '里程碑', '会话'] },\n kickoff: { strong: ['任务启动', 'kickoff', '成功标准', '澄清', '经验水平'], weak: ['任务', '开始', '目标', '启动'] },\n prototype: { strong: ['原型', '试错', '候选方案', '快速验证'], weak: ['想法', '验证', '方案', '方向'] },\n plan: { strong: ['执行计划', '里程碑', '验收标准', '依赖'], weak: ['计划', '目标', '安排', '步骤'] },\n deviation: { strong: ['偏离', '记录偏离', '关键决定', '变更'], weak: ['记录', '过程', '复盘'] },\n retro: { strong: ['复盘', 'retro', '重来一次', '可复用经验', '实际 vs 计划'], weak: ['回顾', '总结', '任务', '项目'] },\n quiz: { strong: ['反向考验', '出题', '选择题', '判断题', '盲区'], weak: ['考验', '检验', '主题', '理解'] },\n}\n","/**\n * dsh-prompt — 智能匹配引擎(v1.1)\n * 评分 = 专属词×2 + 通用词×1;门限 ≥2 出卡(专属×1 或 通用×2,宁缺毋滥);\n * 候选 ≤3 = top-2 评分 + 1 最近使用(去重,不足不凑);\n * 排序 = 评分(专属优先)→ 用量计数;代码块内关键词降权;\n * 与 /prompt 共用模板数据/排序基础(架构:allTemplates/bumpUsage/loadLastUsed)。\n */\nimport type { PromptTemplate } from './templates'\nimport { allTemplates, getTemplate, loadUsage, loadLastUsed } from './store'\nimport { SMART_WORDS } from './words'\n\nexport const SMART_THRESHOLD = 2\n\nexport interface ScoreResult {\n score: number\n strong: string[]\n weak: string[]\n}\n\nexport interface ScoredTemplate {\n tpl: PromptTemplate\n score: number\n strongHits: string[]\n weakHits: string[]\n}\n\n/** 命中统计:专属词×2 + 通用词×1(子串匹配,忽略大小写) */\nexport function scoreDraft(draft: string, tpl: PromptTemplate): ScoreResult {\n const words = SMART_WORDS[tpl.id]\n if (!words) return { score: 0, strong: [], weak: [] }\n const text = draft.toLowerCase()\n const strong = words.strong.filter((w) => text.includes(w.toLowerCase()))\n const weak = words.weak.filter((w) => text.includes(w.toLowerCase()))\n return { score: strong.length * 2 + weak.length, strong, weak }\n}\n\n/** 代码块降权:draft 中 ``` 出现奇数次 → 视为处于代码块内 → 抑制出卡 */\nexport function insideCodeBlock(draft: string): boolean {\n let n = 0\n let i = 0\n for (;;) {\n i = draft.indexOf('```', i)\n if (i < 0) break\n n++\n i += 3\n }\n return n % 2 === 1\n}\n\n/** 智能候选:draft → ≤3 条(top-2 评分 + 1 最近使用),不足不凑;自定义无词表,仅经最近使用槽进入 */\nexport function smartCandidates(draft: string): ScoredTemplate[] {\n const text = draft.trim().toLowerCase()\n if (!text || text.length < 2) return []\n if (insideCodeBlock(draft)) return []\n const usage = loadUsage()\n const scored: ScoredTemplate[] = []\n for (const tpl of allTemplates()) {\n if (!tpl.builtin) continue\n const r = scoreDraft(text, tpl)\n if (r.score >= SMART_THRESHOLD) scored.push({ tpl, score: r.score, strongHits: r.strong, weakHits: r.weak })\n }\n scored.sort((a, b) => b.score - a.score || (usage[b.tpl.id] || 0) - (usage[a.tpl.id] || 0))\n const top = scored.slice(0, 2)\n const used = new Set(top.map((s) => s.tpl.id))\n const recentId = loadLastUsed()\n if (recentId && !used.has(recentId)) {\n const tpl = getTemplate(recentId)\n if (tpl) top.push({ tpl, score: 0, strongHits: [], weakHits: [] })\n }\n return top\n}\n\n/** DEC11 修订:插入后光标定位到第一个字段的冒号后(冒号表单式正文);无字段 → 正文末尾 */\nexport function firstFieldCaret(body: string): number {\n const i = body.indexOf(':')\n return i < 0 ? body.length : i + 1\n}\n","/**\n * dsh-prompt — 智能模式悬浮卡(v1.1,shell.overlay root 作用域)\n * #5 定稿:全局单手柄点(点=缩小的卡,卡显示时点消失,互斥)/ 卡从点向右展开 /\n * 自由拖动 + 位置记忆(localStorage)+ 视口 clamp / 仅命中出现 / ≤3 候选(top-2 评分 + 最近使用,不足不凑)/\n * 评分=专属词×2+通用词×1(≥2 出卡)/ 排序=评分→用量 / 点击即填入 + 光标定位首字段冒号后(DEC11 修订)/\n * 默认开可配置关闭 / 与面板各管各的;键盘可达(↑↓/Enter/Esc)。\n */\nimport { getReact } from './panel'\nimport { smartCandidates, firstFieldCaret, type ScoredTemplate } from './match'\nimport { allTemplates, bumpUsage } from './store'\nimport {\n getSmartInput, onSmartInput, isSmartEnabled, setSmartEnabled,\n onSmartEnabled, loadSmartPos, saveSmartPos, suppressCard, isSuppressed, clearSuppression,\n type SmartPos,\n} from './smartstore'\nimport { getLang, tr, STR } from './i18n'\n\nconst DOT_SIZE = 12 // 还原原设计:12px 次级色低调圆点(原型 GlobalDot 样式)\nconst CARD_W = 280 // 内容宽度收窄\nconst CARD_H_EST = 150 // 卡片高度估算(首次渲染未测量时用;测量后精确锚定)\nconst CARD_H = 300\n\nfunction clampPos(p: SmartPos, w: number, h: number): SmartPos {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800\n return {\n x: Math.max(8, Math.min(p.x, vw - w - 8)),\n y: Math.max(8, Math.min(p.y, vh - h - 8)),\n }\n}\n\n/** 读取当前输入框草稿:优先焦点 textarea,其次可见 textarea;无 → 空串 */\nfunction readActiveDraft(): string {\n try {\n if (typeof document === 'undefined') return ''\n const ae = document.activeElement as HTMLTextAreaElement | null\n if (ae && ae.tagName === 'TEXTAREA') return ae.value || ''\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.offsetParent !== null) return ta.value || ''\n }\n } catch (e) { /* ignore */ }\n return ''\n}\n\n/** 光标位置:焦点 textarea(value===draft)的 selectionStart,找不到 → 末尾 */\nfunction caretInDraft(draft: string): number {\n try {\n if (typeof document === 'undefined') return draft.length\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === draft && typeof ta.selectionStart === 'number') return ta.selectionStart\n }\n } catch (e) { /* ignore */ }\n return draft.length\n}\n\n/** 智能插入:光标处插入模板正文(不覆盖),光标定位到首字段冒号后;用量+1;抑制卡片重现 */\nexport function smartInsert(body: string, id: string): void {\n const { actions } = getSmartInput()\n if (!actions || typeof actions.setDraft !== 'function') return\n const draft = readActiveDraft()\n const caret = caretInDraft(draft)\n const newDraft = draft.slice(0, caret) + body + draft.slice(caret)\n actions.setDraft(newDraft)\n const fieldCaret = caret + firstFieldCaret(body)\n setTimeout(() => {\n try {\n if (typeof document === 'undefined') return\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === newDraft) { ta.focus(); ta.setSelectionRange(fieldCaret, fieldCaret); break }\n }\n } catch (e) { /* ignore */ }\n }, 0)\n bumpUsage(id)\n suppressCard(newDraft)\n}\n\nexport function SmartCardHost(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n\n const [enabled, setEnabled] = react.useState(isSmartEnabled())\n const [input, setInput] = react.useState(getSmartInput())\n const [draft, setDraft] = react.useState(readActiveDraft())\n const [pos, setPos] = react.useState<SmartPos | null>(null)\n const [dismissed, setDismissed] = react.useState(false)\n const [manualOpen, setManualOpen] = react.useState(false)\n const [cardH, setCardH] = react.useState(0)\n const posRef = react.useRef<SmartPos | null>(null)\n const cardRef = react.useRef<any>(null)\n const rowsRef = react.useRef<ScoredTemplate[]>([])\n const dragMovedRef = react.useRef(false)\n\n // 订阅输入桥(仅用于 actions/插入)+ 开关变更(设置页实时同步)\n react.useEffect(() => {\n const off1 = onSmartInput(() => setInput(getSmartInput()))\n const off2 = onSmartEnabled((on) => setEnabled(on))\n return () => { off1(); off2() }\n }, [])\n\n // 草稿来源 = 输入框 textarea 真实值(轮询 + focus 事件;与面板插入同源,不依赖 overlay 重渲染)\n react.useEffect(() => {\n const timer = setInterval(() => {\n const d = readActiveDraft()\n setDraft((prev) => (prev === d ? prev : d))\n }, 350)\n const onFocus = () => { setDraft(readActiveDraft()) }\n if (typeof document !== 'undefined') document.addEventListener('focusin', onFocus, true)\n return () => { clearInterval(timer); if (typeof document !== 'undefined') document.removeEventListener('focusin', onFocus, true) }\n }, [])\n\n // 位置:载入记忆(无 → 右下角、输入区上方默认),按圆点尺寸 clamp(圆点可贴近角落)\n react.useEffect(() => {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800\n const saved = loadSmartPos() || { x: 32, y: Math.round(vh * 0.72) }\n const p = clampPos(saved, DOT_SIZE, DOT_SIZE)\n posRef.current = p\n setPos(p)\n }, [])\n const applyPos = (p: SmartPos) => { const c = clampPos(p, DOT_SIZE, DOT_SIZE); posRef.current = c; setPos(c) }\n\n // 用户改动草稿 → 解除「插入后抑制」「Esc 收起」「手动展开」(回到自动出卡行为)\n react.useEffect(() => { clearSuppression(draft); if (dismissed) setDismissed(false); if (manualOpen) setManualOpen(false) }, [draft])\n\n const lang = getLang()\n const t = (k: keyof typeof STR) => tr(lang, STR[k])\n\n const suppressed = isSuppressed(draft)\n const candidates: ScoredTemplate[] = !enabled || suppressed ? [] : smartCandidates(draft)\n // 手动展开且无匹配时:中性常用兜底(预设顺序 ≤3,不按用量——避免\"用过一次就一直冒\")\n const fallbackRows: ScoredTemplate[] = allTemplates().slice(0, 3).map((tpl) => ({ tpl, score: 0, strongHits: [], weakHits: [] }))\n const rows: ScoredTemplate[] = candidates.length > 0 ? candidates : (manualOpen ? fallbackRows : [])\n rowsRef.current = rows\n const showCard = rows.length > 0 && !dismissed\n\n // 测量卡片真实高度(布局后回调):保证卡与圆点贴合,不因估算偏差悬空(hooks 顺序:在 early return 之前)\n react.useEffect(() => {\n if (!showCard) return\n const el = cardRef.current\n if (!el) return\n const h = (el as HTMLElement).offsetHeight || 0\n if (h > 0 && h !== cardH) setCardH(h)\n }, [showCard, rows.length])\n\n // 不捕获键盘:Enter/↑↓ 保持输入框原生语义(用户要求),仅手动点击「点击填入」按钮录入\n\n const doPick = (c: ScoredTemplate) => {\n smartInsert(c.tpl.body, c.tpl.id)\n setDismissed(true); setManualOpen(false)\n }\n\n // 拖动(点/卡头均可):pointer 事件 + 位置记忆;移动过则不算点击\n const startDrag = (e: any) => {\n e.preventDefault(); e.stopPropagation()\n dragMovedRef.current = false\n const base = posRef.current || { x: 0, y: 0 }\n const sx = e.clientX, sy = e.clientY\n const move = (ev: PointerEvent) => { dragMovedRef.current = true; applyPos({ x: base.x + (ev.clientX - sx), y: base.y + (ev.clientY - sy) }) }\n const up = (ev: PointerEvent) => {\n document.removeEventListener('pointermove', move)\n document.removeEventListener('pointerup', up)\n const p = clampPos({ x: base.x + (ev.clientX - sx), y: base.y + (ev.clientY - sy) }, DOT_SIZE, DOT_SIZE)\n posRef.current = p; setPos(p); saveSmartPos(p)\n }\n document.addEventListener('pointermove', move)\n document.addEventListener('pointerup', up)\n }\n\n // 首帧必渲染:pos 尚未从 localStorage 载入时先用默认值(右下角),effect 载入后精确定位\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800\n const effectivePos = pos !== null ? pos : { x: 32, y: Math.round(vh * 0.72) }\n if (!enabled) return null\n\n const base = 'var(--dsw-alias-label-primary)'\n const muted = 'var(--dsw-alias-label-secondary)'\n const dim = 'var(--dsw-alias-label-tertiary)'\n const accent = 'var(--dsw-specific-accent,#f0a45c)'\n const line = '1px solid var(--dsw-alias-border-l1)'\n\n // ── 点(idle 手柄;卡显示时互斥消失)── 还原原设计:12px 次级色低调圆点,点击展开\n const dot = h('div', {\n key: 'dot',\n style: {\n position: 'fixed', left: effectivePos.x, top: effectivePos.y,\n width: DOT_SIZE, height: DOT_SIZE, borderRadius: '50%',\n background: 'var(--dsw-alias-label-tertiary)', opacity: 0.45,\n boxShadow: 'var(--dsw-shadow-lv1)', cursor: 'grab', zIndex: 400, pointerEvents: 'auto',\n userSelect: 'none',\n },\n title: t('smartDot'),\n onPointerDown: startDrag,\n onClick: () => { if (dragMovedRef.current) return; setManualOpen(true); setDismissed(false) },\n })\n\n // ── 卡:从圆点右侧展开(卡左缘 = 圆点右缘,垂直以圆点为中心);用真实高度锚定,贴边自动折返 ──\n const dotX = effectivePos.x, dotY = effectivePos.y\n const cardHeight = cardH > 0 ? cardH : CARD_H_EST\n // 圆点圆心 = 卡片左下角:卡左缘=圆点中心 x、卡底边=圆点中心 y,向 右上 展开\n const dotCx = dotX + DOT_SIZE / 2, dotCy = dotY + DOT_SIZE / 2\n let cardX = dotCx\n if (cardX + CARD_W > vw - 8) cardX = Math.max(8, dotCx - CARD_W) // 右侧放不下 → 向左展开(卡右缘贴圆点中心)\n cardX = Math.max(8, Math.min(cardX, vw - CARD_W - 8))\n let cardY = dotCy - cardHeight\n if (cardY < 8) cardY = 8 // 顶部放不下 → 贴顶(圆点保持在原位)\n cardY = Math.max(8, Math.min(cardY, vh - cardHeight - 8))\n const cardPos = { x: cardX, y: cardY }\n const cardStyle: any = {\n position: 'fixed', left: cardPos.x, top: cardPos.y,\n width: CARD_W, zIndex: 400, pointerEvents: 'auto',\n background: 'var(--dsw-specific-menu)', border: '1px solid var(--dsw-alias-border-inverted)',\n borderRadius: 12, boxShadow: 'var(--dsw-shadow-lv3)',\n display: 'flex', flexDirection: 'column', gap: 6, padding: '8px 10px',\n fontFamily: 'var(--dsw-font-family)', fontSize: 'var(--dsw-font-markdown-base-font-size)', color: base,\n }\n const headStyle: any = { display: 'flex', alignItems: 'center', gap: 4, padding: '4px 10px', borderBottom: line, cursor: 'grab', minWidth: 0 }\n // 行 = 圆角子卡片(原型样式):编号 + 名称 + 标签(·分N/·最近) + 命中词 + 「点击填入」按钮\n // 行 = 精简:编号 + 名称 + 标签 + 命中词 + 小按钮(点整行即填入,控件小而克制)\n const rowStyle: any = {\n display: 'flex', alignItems: 'center', gap: 6, padding: '3px 7px', minWidth: 0,\n background: 'var(--dsw-alias-bg-layer-2)', border: '1px solid var(--dsw-alias-border-l1)',\n borderRadius: 8, cursor: 'pointer', overflow: 'hidden',\n }\n const rowNum: any = { color: dim, fontSize: '0.77em', flex: 'none' }\n const rowName: any = { fontWeight: 500, fontSize: '0.88em', flex: 'none', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 90 }\n const rowTag: any = { color: muted, flex: 'none', fontSize: '0.77em' }\n const rowHint: any = { color: dim, flex: '1 1 auto', minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontSize: '0.77em' }\n const fillBtn: any = {\n flex: 'none', border: '1px solid var(--dsw-alias-border-l2)',\n background: 'var(--dsw-alias-bg-layer-3)', color: base,\n borderRadius: 5, padding: '1px 7px', cursor: 'pointer',\n fontFamily: 'var(--dsw-font-family)', fontSize: '0.8em', fontWeight: 500, whiteSpace: 'nowrap',\n }\n const rowNodes = rows.map((c, i) => {\n const common = c.score === 0\n const domain = (c.tpl as any).domain || (c.tpl as any).tag || ''\n const tagText = (domain ? domain + ' ' : '') + (common ? '·常用' : '·分' + c.score)\n const hits = common ? t('smartCommon') : (c.strongHits.join(' / ') + (c.weakHits.length ? ' · ' + c.weakHits.join(' / ') : ''))\n return h('div', { key: c.tpl.id, style: rowStyle, onClick: () => doPick(c), title: t('smartFill') }, [\n h('span', { style: rowNum }, String(i + 1)),\n h('span', { style: rowName }, c.tpl.name),\n h('span', { style: rowTag }, tagText),\n h('span', { style: rowHint }, hits),\n h('button', { style: fillBtn, title: t('smartFill'), onClick: (e: any) => { e.stopPropagation(); doPick(c) } }, t('smartFill')),\n ])\n })\n const card = h('div', { key: 'card', ref: cardRef, style: cardStyle }, [\n h('div', { style: headStyle, onPointerDown: startDrag }, [\n h('span', { style: { fontWeight: 600, fontSize: '0.85em' } }, t('smartTitle')),\n h('span', { style: { color: dim, fontSize: '0.77em' } }, t('smartHint')),\n h('div', { style: { flex: 1 } }),\n h('button', {\n style: { border: 0, background: 'transparent', color: dim, cursor: 'pointer', fontSize: '0.92em', lineHeight: 1, padding: '0 2px', flex: 'none' },\n title: t('smartDismiss'),\n onPointerDown: (e: any) => e.stopPropagation(),\n onClick: (e: any) => { e.stopPropagation(); setDismissed(true); setManualOpen(false) },\n }, '×'),\n ]),\n h('div', { style: { maxHeight: 220, overflowY: 'auto', overflowX: 'hidden' } }, rowNodes),\n ])\n\n return showCard ? card : dot\n}\n","/**\n * dsh-prompt — client 入口(v1 常规模式 + v1.1 智能模式)\n * 装配:input.left 入口按钮 / input.overlay 面板浮层 / settings.section 配置页(直属设置面板)/ inputTriggers /prompt 触发源(#9)/ shell.overlay 智能悬浮卡(#10)\n */\nimport { getReact, TemplateBrowser, setGoSettingsHandler } from './panel'\nimport { EntryButton } from './button'\nimport { SettingsPage } from './settings'\nimport { buildPromptSource } from './trigger'\nimport { SmartCardHost } from './smart'\nimport { setSmartInput } from './smartstore'\nimport { getLang } from './i18n'\nimport { isPanelOpen, onPanelOpen } from './state'\n\ntype ClientContext = {\n slots: any\n inputTriggers: any\n effect: (fn: () => unknown, key?: string) => unknown\n}\n\nexport const inject = ['slots', 'inputTriggers']\n\n/** 面板浮层(conversation.input.overlay,session 作用域 → 有 useInput/inputActions) */\nfunction PanelHost(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const openState = react.useState(isPanelOpen())\n const open = openState[0]\n react.useEffect(() => { onPanelOpen((v) => openState[1](v)); console.log('[dsh-prompt] PanelHost props:', Object.keys(props), '| useInput?', !!props.useInput, '| inputActions?', !!props.inputActions) }, [])\n // 智能模式桥接:把当前会话输入发布给 shell.overlay 悬浮卡(每次渲染同步,无变化由 setSmartInput 去重)\n react.useEffect(() => {\n let st: any = null\n try { st = props.useInput ? props.useInput((s: any) => s) : null } catch (e) { /* ignore */ }\n setSmartInput({ sessionId: props.sessionId, draft: (st && st.draft) || '', useInput: props.useInput, actions: props.inputActions })\n })\n // 会话卸载 → 清空输入桥(悬浮卡回到纯点状态)\n react.useEffect(() => {\n const sid = props.sessionId\n return () => { if (sid !== undefined) setSmartInput({ draft: '' }) }\n }, [props.sessionId])\n if (!open) return null\n return h(TemplateBrowser, { compact: true, useInput: props.useInput, inputActions: props.inputActions })\n}\n\nexport function apply(ctx: ClientContext): void {\n // 入口按钮(input.left;开合状态跟随面板)\n ctx.effect(() => ctx.slots.inject('conversation.input.left', () =>\n ctx.slots.register({ name: 'conversation.input.left', id: 'dsh-prompt-entry', order: 10, label: () => 'dsh-prompt' },\n (props: any) => {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const openState = react.useState(isPanelOpen())\n react.useEffect(() => onPanelOpen((v) => openState[1](v)), [])\n return h(EntryButton, { open: openState[0] })\n }),\n ), 'dsh-prompt: entry')\n\n // 面板浮层\n ctx.effect(() => ctx.slots.inject('conversation.input.overlay', () =>\n ctx.slots.register({ name: 'conversation.input.overlay', id: 'dsh-prompt-panel', order: 2, label: () => 'dsh-prompt panel' }, PanelHost),\n ), 'dsh-prompt: panel')\n\n // 设置页(直属设置面板的配置页,非插件子类):智能开关 + 模板管理\n ctx.effect(() => ctx.slots.inject('settings.section', () =>\n ctx.slots.register({ name: 'settings.section', id: 'dsh-prompt-palette', priority: 10, order: 50, label: () => (getLang() === 'zh' ? '提示词模板' : 'Prompt Templates') }, SettingsPage),\n ), 'dsh-prompt: settings')\n\n // 面板「设置 → 模板管理」:当前 v1 关闭面板即可(设置页经 ⚙ → 插件 → dsh-prompt 到达)\n // 面板「设置 → 模板管理」:打开设置面板并选中本插件配置页(宿主无全局 open API → DOM 触发侧栏设置按钮 + 导航项)\n setGoSettingsHandler(() => {\n try {\n if (typeof document === 'undefined') return\n const btns = Array.prototype.slice.call(document.querySelectorAll('button[aria-haspopup=\"dialog\"]')) as HTMLElement[]\n const trig = btns.find((b) => /设置|Settings/.test((b.textContent || '').trim())) || btns[0]\n if (trig) trig.click()\n setTimeout(() => {\n const label = getLang() === 'zh' ? '提示词模板' : 'Prompt Templates'\n const cells = Array.prototype.slice.call(document.querySelectorAll('button')) as HTMLElement[]\n const cell = cells.find((b) => (b.textContent || '').trim() === label)\n if (cell) cell.click()\n }, 150)\n } catch (e) { /* ignore */ }\n })\n\n // /prompt 触发源(#9):列出预制+自定义模板,支持过滤(标签/搜索),选中即插入\n if (ctx.inputTriggers && typeof ctx.inputTriggers.registerSource === 'function') {\n ctx.effect(() => ctx.inputTriggers.registerSource(buildPromptSource()), 'dsh-prompt: /prompt source')\n }\n\n // 智能模式悬浮卡(#10):shell.overlay root 作用域 — 全局单点/自由拖动/仅命中出现\n ctx.effect(() => ctx.slots.inject('shell.overlay', () =>\n ctx.slots.register({ name: 'shell.overlay', id: 'dsh-prompt-smart', order: 200, label: () => 'dsh-prompt smart' }, SmartCardHost),\n ), 'dsh-prompt: smart card')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["listeners"],"sources":["../src/client/templates.ts","../src/client/store.ts","../src/client/state.ts","../src/client/i18n.ts","../src/client/panel.ts","../src/client/button.ts","../src/client/smartstore.ts","../src/client/settings.ts","../src/client/trigger.ts","../src/client/words.ts","../src/client/match.ts","../src/client/smart.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-prompt — 模板数据层\n * 24 条预制模板(#6 final.md 定稿,冒号表单式)+ 类型定义。\n */\n\nexport type Domain = '思考框架' | '学习' | '工程' | '执行'\nexport type Stage = '执行前' | '执行中' | '执行后' | '任意'\n\nexport interface PromptTemplate {\n id: string\n name: string\n nameEn: string\n domain: Domain\n stage: Stage\n action: string[]\n body: string\n builtin: boolean\n}\n\nexport const PRESET_TEMPLATES: PromptTemplate[] = [\n { id: 'fp', name: '第一性原理拆解', nameEn: 'First Principles', domain: '思考框架', stage: '执行前', action: ['拆解'], body: [\n '请用第一性原理分析以下主题,按编号结构化输出,结论先行:',\n '1. 这个问题的基本组成单元是什么?',\n '2. 哪些是真正不可改变的真理(而非假设)?',\n '3. 如果去掉所有既有假设,问题本身还剩下什么?',\n '4. 有哪些被大多数人默认为常识、但其实可以颠覆的?',\n '5. 基于以上推演给出你的原创见解,并说明它与主流看法的差异。',\n '主题:',\n ].join('\\n') },\n { id: 'socratic', name: '苏格拉底式追问', nameEn: 'Socratic Questioning', domain: '思考框架', stage: '执行前', action: ['检验'], body: [\n '请用苏格拉底式追问帮助我思考,按编号结构化输出:',\n '1. 先复述我当前的观点或核心假设;',\n '2. 提出 3 个最有力的质疑;',\n '3. 找出一个我尚未考虑到的视角;',\n '4. 如果你是深思熟虑的对话者,你会问我哪几个我没想到的问题?',\n '5. 追问结束后,把整个过程浓缩成一个更精准的问题。',\n '主题:',\n ].join('\\n') },\n { id: 'deep', name: '深度多维分析', nameEn: 'Deep Analysis', domain: '思考框架', stage: '执行前', action: ['归因'], body: [\n '请从多个维度深度分析以下主题,按编号结构化输出,结论先行:',\n '1. 本质是什么?',\n '2. 有哪些常见的误解?',\n '3. 支持和反对的证据分别是什么?',\n '4. 这个问题的边界在哪里(什么情况下它不再成立)?',\n '5. 如果你必须做出一个判断,会是什么?',\n '6. 你最强的那个结论,弱点在哪里?',\n '主题:',\n ].join('\\n') },\n { id: 'adversarial', name: '对抗式审查', nameEn: 'Adversarial Review', domain: '思考框架', stage: '执行前', action: ['检验'], body: [\n '请对以下方案/结论做对抗式审查(红队角色),先给一段结论摘要,再按编号展开:',\n '1. 找出其中最强的 5 个假设,逐一论证它们可能如何失效;',\n '2. 构造最可能推翻它的 3 个反例或失败场景;',\n '3. 指出其中隐藏的认知偏差与利益相关方视角的盲区;',\n '4. 给出「如果这个方案失败,最可能的原因是什么」的排序清单;',\n '5. 最后给出:在何种条件下你才会认为它是错的——以及何种证据能让你改变立场。',\n '方案 / 结论:',\n ].join('\\n') },\n { id: 'decision', name: '决策博弈分析', nameEn: 'Decision Analysis', domain: '思考框架', stage: '执行前', action: ['决策'], body: [\n '你是一位冷静的决策分析师。请分析我的处境,按编号结构化输出(你的选择仅作参考,重点是分析过程):',\n '1. 列出每个选项最坏的结果是什么;',\n '2. 每个选项最好的结果是什么;',\n '3. 最可能的结果是什么;',\n '4. 如果 10 年后回头看,我可能会后悔什么;',\n '5. 有没有哪条路是「没有回头路」的;',\n '6. 给出你本人的选择并说明理由;再指出我可能忽略的第三个选项。',\n '我的处境(选项与背景):',\n ].join('\\n') },\n { id: 'premortem', name: '事前验尸', nameEn: 'Pre-mortem', domain: '思考框架', stage: '执行前', action: ['决策'], body: [\n '假设以下方案/项目已经在一年后彻底失败。请以「事后回溯」的方式写失败分析,按编号结构化输出:',\n '1. 按可能性从高到低列出 8 个失败原因;',\n '2. 对前 3 个原因,给出现在就能做的预防措施;',\n '3. 指出哪些早期信号现在就该监控;',\n '4. 最后说明:这个方案是否从一开始就有致命缺陷。',\n '方案描述:',\n ].join('\\n') },\n { id: 'feynman', name: '费曼技巧', nameEn: 'Feynman Technique', domain: '思考框架', stage: '执行后', action: ['理解'], body: [\n '请用费曼技巧确认我是否真正理解了以下概念,按编号结构化输出:',\n '1. 用最简单的语言、面向完全不懂的人解释这个概念(禁止术语);',\n '2. 给出 2 个生动类比和 2 个反例;',\n '3. 指出我理解中的错误或不准确之处;',\n '4. 设计 3 个判断题检验我是否真的懂了。',\n '概念:',\n '我的理解(可选):',\n ].join('\\n') },\n { id: 'fivewhys', name: '五个为什么', nameEn: 'Five Whys', domain: '思考框架', stage: '执行中', action: ['归因'], body: [\n '针对以下问题,请连续追问五个「为什么」,每层基于上一层的事实回答,最后区分根本原因与表层触发因素并给出解决方向:',\n '问题描述:',\n ].join('\\n') },\n { id: 'mece', name: 'MECE 拆解', nameEn: 'MECE Decomposition', domain: '思考框架', stage: '执行前', action: ['拆解'], body: [\n '请用 MECE 原则拆解以下问题,按编号结构化输出:',\n '1. 给出 3~6 个相互独立(Mutually Exclusive)的分类维度;',\n '2. 每个维度下列出所有子项,确保完全穷尽(Collectively Exhaustive);',\n '3. 指出拆解中可能的遗漏与重叠;',\n '4. 给出按重要性排序后的关键子问题清单。',\n '问题:',\n ].join('\\n') },\n { id: 'bias', name: '认知偏差检查', nameEn: 'Cognitive Bias Check', domain: '思考框架', stage: '执行前', action: ['检验'], body: [\n '请审查以下推理/计划/结论中的认知偏差,按编号结构化输出:',\n '1. 列出可能影响它的偏差(确认偏误、沉没成本、可得性、锚定、乐观/悲观偏差、群体思维等),并指出具体证据;',\n '2. 对每条偏差,给出「如何检验是否真的受影响」的方法;',\n '3. 给出一个反事实检验:如果结论被证明是错的,最可能因为哪条偏差?',\n '推理 / 计划 / 结论:',\n ].join('\\n') },\n { id: 'learnpath', name: '学习路线设计', nameEn: 'Learning Path', domain: '学习', stage: '执行前', action: ['路线'], body: [\n '请为以下领域/技能设计一条从零到可实战的学习路线,按编号结构化输出:',\n '1. 按阶段拆分(入门→进阶→实战),每个阶段给出学习目标;',\n '2. 每个阶段推荐 2~3 个核心主题和练习方式;',\n '3. 指出常见的「伪学习陷阱」(只收藏不练习等);',\n '4. 给出一个 30 天内可完成的最小闭环,以及检验掌握程度的基准。',\n '领域 / 技能:',\n '当前水平(可选):',\n '目标(可选):',\n ].join('\\n') },\n { id: 'concept', name: '概念澄清', nameEn: 'Concept Clarification', domain: '学习', stage: '执行前', action: ['概念'], body: [\n '请帮我彻底理解以下概念,按编号结构化输出:',\n '1. 一句话定义 + 一个最小例子;',\n '2. 它与常见相近概念的本质区别(各给一个对比场景);',\n '3. 这个概念在什么情况下不适用(边界);',\n '4. 给出 3 个由浅入深的练习场景让我检验理解。',\n '概念:',\n '相近概念(可选,不知道可留空,AI 自行选常见相近概念对比):',\n ].join('\\n') },\n { id: 'quiz', name: 'AI 反向考验', nameEn: 'AI Quiz', domain: '学习', stage: '执行后', action: ['考验'], body: [\n '请通过出题检验我是否真正理解了以下主题/交付内容:',\n '1. 设计选择题/判断题/简答题/案例题(由浅入深);',\n '2. 我作答后指出错误与盲区;',\n '3. 直到回答正确、知识点无盲区后再确认交付。',\n '主题 / 交付内容:',\n ].join('\\n') },\n { id: 'codereview', name: '代码审查', nameEn: 'Code Review', domain: '工程', stage: '执行前', action: ['审查'], body: [\n '请审查以下代码,先给总体结论,再按严重程度排序输出,每个问题附具体修改建议(含示例代码):',\n '1. 正确性:潜在 bug、边界条件、并发/异步问题;',\n '2. 安全:注入、鉴权、敏感信息、依赖风险;',\n '3. 可维护性:命名、结构、重复、可读性;',\n '4. 性能:明显的低效点。',\n '代码过长时可分段审查,但最终汇总为一页结论。',\n '代码 / 文件 / 技术栈:',\n ].join('\\n') },\n { id: 'testdesign', name: '测试用例设计', nameEn: 'Test Design', domain: '工程', stage: '执行中', action: ['测试'], body: [\n '请为以下功能设计测试用例,按编号结构化输出:',\n '1. 正常路径用例(含输入/预期输出);',\n '2. 边界与极端值用例;',\n '3. 异常与错误处理用例;',\n '4. 并发/重复/幂等场景(如适用);',\n '5. 指出哪些用例最容易漏、以及对应的风险。',\n '功能描述:',\n ].join('\\n') },\n { id: 'refactor', name: '重构方案', nameEn: 'Refactoring Plan', domain: '工程', stage: '执行中', action: ['重构'], body: [\n '请为以下代码提出重构方案,按编号结构化输出:',\n '1. 指出当前结构的主要问题(职责、耦合、可测试性);',\n '2. 给出目标结构(抽象与拆分建议,含示例);',\n '3. 按「小步重构」顺序列出步骤,每一步可独立提交且行为不变;',\n '4. 指出哪些重构有风险、需要测试保护。',\n '代码 / 模块:',\n ].join('\\n') },\n { id: 'explain', name: '解释代码', nameEn: 'Explain Code', domain: '工程', stage: '执行中', action: ['解读'], body: [\n '请解释以下代码,按编号结构化输出:',\n '1. 这段代码做什么(一句话);',\n '2. 逐段讲解执行流程与关键数据结构;',\n '3. 指出其中「为什么这样写」的设计取舍;',\n '4. 指出潜在问题与改进点;',\n '5. 用一句话概括它在我更大的系统里扮演的角色。',\n '代码:',\n ].join('\\n') },\n { id: 'blindspot', name: '盲区检查', nameEn: 'Blind Spot Pass', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '在我开始以下任务之前,请帮我做一次盲区检查,按编号结构化输出:',\n '1. 我可能遗漏的关键变量有哪些?',\n '2. 潜在的风险与最容易忽略的影响因素?',\n '3. 哪些点需要提前决策、哪些可以后置?',\n '4. 给我一个 3 分钟内可完成的快速检查清单。',\n '我的计划(目标 / 约束):',\n ].join('\\n') },\n { id: 'snapshot', name: '零丢失快照', nameEn: 'Zero-loss Snapshot', domain: '执行', stage: '执行中', action: ['固化'], body: [\n '请执行一次「零丢失快照」:',\n '1. 把我们从会话开始至今的关键信息,按「目的地 / 约束与偏好 / 已确认的决定 / 待决问题 / 雾区(隐约可见但还不清晰)」五类逐条列出——不压缩、不合并,宁可啰嗦不可省略;',\n '2. 每条标注出处(引用我原话);',\n '3. 单独列一节「可疑遗漏」:凡是我提过但你觉得与主线无关、太模糊或像执行细节而没纳入的,全部摆出并写明理由;',\n '4. 列完后停下等我逐条核对,确认后再落盘。',\n ].join('\\n') },\n { id: 'kickoff', name: '任务启动', nameEn: 'Task Kickoff', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '在开始以下任务之前,请先确认起点并澄清细节,按编号结构化输出:',\n '1. 最终目标(要做什么);',\n '2. 当前进度(目前想到哪一步);',\n '3. 经验水平(新手 / 有经验 / 专家);',\n '4. 不熟悉的地方;',\n '5. 成功的标准;',\n '6. 通过提问澄清细节(成功标准之外还有哪些约束、有哪些风险现在就该知道)。',\n '最终目标:',\n '当前进度(可选):',\n '经验水平(新手 / 有经验 / 专家):',\n '不熟悉的地方(可选):',\n ].join('\\n') },\n { id: 'prototype', name: '原型验证', nameEn: 'Prototype Validate', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '请为以下主题/想法做原型验证,每轮输出保持克制(方向概要即可,不要太长):',\n '1. 给出 2~4 个方向差距很大的候选方案;',\n '2. 每个方向给出最小的验证方式(怎么快速试错);',\n '3. 由我选择和反馈,几轮后逐步收敛到满意的方向;',\n '4. 收敛后给出下一步的执行计划要点。',\n '主题 / 想法:',\n ].join('\\n') },\n { id: 'plan', name: '执行计划', nameEn: 'Execution Plan', domain: '执行', stage: '执行前', action: ['启动'], body: [\n '请为以下目标制定执行计划,按编号结构化输出(时间安排是可调整的草案):',\n '1. 明确步骤(含顺序与依赖);',\n '2. 时间安排(每步预计时长/里程碑);',\n '3. 所需资源和工具;',\n '4. 交付物和验收标准;',\n '5. 风险和应对方案。',\n '目标:',\n '约束(可选):',\n ].join('\\n') },\n { id: 'deviation', name: '记录偏离', nameEn: 'Deviation Log', domain: '执行', stage: '执行中', action: ['记录'], body: [\n '请担任我的过程记录员(多轮持续角色):从现在起,在每次交互后更新一份简洁的偏离记录,按编号结构化:',\n '1. 遇到了什么新的情况?',\n '2. 为什么改变了方案?',\n '3. 做了哪些关键决定?',\n '4. 对结果有什么影响?',\n '每次只输出「新增/变更」条目,不要重复已记录内容。',\n ].join('\\n') },\n { id: 'retro', name: '过程复盘', nameEn: 'Retrospective', domain: '执行', stage: '执行后', action: ['复盘'], body: [\n '请帮我复盘刚刚完成的以下任务/项目,按编号结构化输出:',\n '1. 整体步骤回顾(实际 vs 计划的差异);',\n '2. 使用的资料和工具;',\n '3. 遇到的困难;',\n '4. 解决思路与可复用经验;',\n '5. 如果重来一次,哪些地方会做得不同?',\n '任务 / 项目:',\n ].join('\\n') },\n]\n\n// 统一补 builtin 标志(预制只读;自定义由 store 管理)\nPRESET_TEMPLATES.forEach((t) => { t.builtin = true })\n\nexport function getPresetById(id: string): PromptTemplate | undefined {\n return PRESET_TEMPLATES.find((t) => t.id === id)\n}\n","/**\n * dsh-prompt — 持久化与列表逻辑\n * localStorage 键空间:dsh.prompt.customs / dsh.prompt.usage / dsh.prompt.pinned\n * 用量计数仅排序不显示(#4/#5 决策);置顶 ≤5。\n */\nimport type { PromptTemplate } from './templates'\nimport { PRESET_TEMPLATES, getPresetById } from './templates'\n\nconst CUSTOMS_KEY = 'dsh.prompt.customs'\nconst USAGE_KEY = 'dsh.prompt.usage'\nconst PINNED_KEY = 'dsh.prompt.pinned'\nconst LAST_USED_KEY = 'dsh.prompt.lastUsed'\nconst MAX_PIN = 5\nconst MAX_BODY = 1000\n\nfunction ls(): Storage | null {\n try { return typeof globalThis !== 'undefined' && globalThis.localStorage ? globalThis.localStorage : null } catch (e) { return null }\n}\nfunction loadJSON<T>(key: string, fallback: T): T {\n try {\n const s = ls()\n if (!s) return fallback\n const raw = s.getItem(key)\n return raw ? JSON.parse(raw) as T : fallback\n } catch (e) { return fallback }\n}\nfunction saveJSON(key: string, value: unknown): void {\n try { const s = ls(); if (s) s.setItem(key, JSON.stringify(value)) } catch (e) { /* ignore */ }\n}\n\n/** 自定义模板:builtin=false;tag 为自定义标签(默认「自定义」);domain/stage/action 走预制标签体系 */\nexport interface CustomTemplate extends PromptTemplate {\n tag: string\n createdAt: number\n}\n\nexport function loadCustoms(): CustomTemplate[] {\n return loadJSON<CustomTemplate[]>(CUSTOMS_KEY, [])\n}\nexport function saveCustoms(list: CustomTemplate[]): void {\n saveJSON(CUSTOMS_KEY, list)\n}\n\nexport function loadUsage(): Record<string, number> {\n return loadJSON<Record<string, number>>(USAGE_KEY, {})\n}\nexport function bumpUsage(id: string): void {\n const u = loadUsage()\n u[id] = (u[id] || 0) + 1\n saveJSON(USAGE_KEY, u)\n saveJSON(LAST_USED_KEY, id) // 最近使用(智能卡「1 条最近」槽)\n}\n\n/** 最近一次使用的模板 id(智能模式「最近使用」候选;无 → null) */\nexport function loadLastUsed(): string | null {\n try {\n const s = ls()\n if (!s) return null\n const raw = s.getItem(LAST_USED_KEY)\n return raw ? JSON.parse(raw) as string : null\n } catch (e) { return null }\n}\n\nexport function loadPinned(): string[] {\n return loadJSON<string[]>(PINNED_KEY, [])\n}\nexport function savePinned(ids: string[]): void {\n saveJSON(PINNED_KEY, ids)\n}\n\n/** 全部模板(预制 + 自定义) */\nexport function allTemplates(): PromptTemplate[] {\n return [...PRESET_TEMPLATES, ...loadCustoms()]\n}\n\nexport function getTemplate(id: string): PromptTemplate | undefined {\n return allTemplates().find((t) => t.id === id)\n}\n\n/** 展示标签:预制 = 领域;自定义 = tag(默认「自定义」) */\nexport function displayTag(t: PromptTemplate): string {\n if (!t.builtin) return (t as CustomTemplate).tag || '自定义'\n return t.domain\n}\n\n/** 检索串(面板搜索与 /prompt 触发源共用):名称/英文名/正文/领域/阶段/动作/标签 */\nexport function templateHaystack(t: PromptTemplate): string {\n const tag = !t.builtin ? ((t as CustomTemplate).tag || '自定义') : ''\n return (t.name + ' ' + (t.nameEn || '') + ' ' + (t.body || '') + ' ' + t.domain + ' ' + t.stage + ' ' + (t.action || []).join(' ') + ' ' + tag).toLowerCase()\n}\n\n/** 排序:置顶(pin 在前)→ 用量计数降序。用量仅供排序,不显示数字。 */\nexport function sortedTemplates(list: PromptTemplate[]): PromptTemplate[] {\n const usage = loadUsage()\n const pinned = loadPinned()\n const pinIdx = (id: string) => { const i = pinned.indexOf(id); return i < 0 ? MAX_PIN : i }\n return [...list].sort((a, b) => {\n const pa = pinIdx(a.id), pb = pinIdx(b.id)\n if (pa !== pb) return pa - pb\n return (usage[b.id] || 0) - (usage[a.id] || 0)\n })\n}\n\n/** 置顶切换(置顶数 ≤5);返回是否成功(超限返回 false) */\nexport function togglePin(id: string): { pinned: string[]; ok: boolean } {\n const pinned = loadPinned()\n const i = pinned.indexOf(id)\n if (i >= 0) { pinned.splice(i, 1) }\n else if (pinned.length >= MAX_PIN) { return { pinned, ok: false } }\n else { pinned.push(id) }\n savePinned(pinned)\n return { pinned, ok: true }\n}\n\nexport function isPinned(id: string): boolean {\n return loadPinned().indexOf(id) >= 0\n}\n\nexport function canPinMore(): boolean {\n return loadPinned().length < MAX_PIN\n}\n\n/** 新增自定义模板 */\nexport function addCustom(name: string, tag: string, body: string): CustomTemplate {\n const t: CustomTemplate = {\n id: 'c' + Date.now().toString(36) + Math.floor(Math.random() * 1e4).toString(36),\n name, nameEn: '', domain: '执行', stage: '执行前', action: [],\n body, builtin: false, tag, createdAt: Date.now(),\n }\n const list = loadCustoms()\n list.push(t)\n saveCustoms(list)\n return t\n}\n\n/** 更新自定义模板 */\nexport function updateCustom(id: string, patch: { name?: string; tag?: string; body?: string }): void {\n const list = loadCustoms().map((t) => {\n if (t.id !== id) return t\n if (patch.name !== undefined) t.name = patch.name\n if (patch.tag !== undefined) t.tag = patch.tag\n if (patch.body !== undefined) t.body = patch.body\n return t\n })\n saveCustoms(list)\n}\n\n/** 删除自定义模板(仅限 builtin=false);返回是否成功 */\nexport function removeCustom(id: string): boolean {\n const list = loadCustoms()\n const next = list.filter((t) => t.id !== id)\n if (next.length === list.length) return false\n saveCustoms(next)\n savePinned(loadPinned().filter((p) => p !== id))\n return true\n}\n\n/** 复制预制为自定义 */\nexport function copyPresetToCustom(id: string): CustomTemplate | null {\n const src = getPresetById(id)\n if (!src) return null\n return addCustom(src.name + '(副本)', src.domain, src.body)\n}\n\nexport { MAX_BODY }\n","/**\n * dsh-prompt — 面板开合状态(入口按钮 ↔ 面板共享,模块级 + 订阅)\n */\nlet panelOpen = false\nconst listeners = new Set<(v: boolean) => void>()\n\nexport function isPanelOpen(): boolean { return panelOpen }\nexport function setPanelOpen(v: boolean): void {\n if (panelOpen !== v) {\n panelOpen = v\n listeners.forEach((fn) => { try { fn(v) } catch (e) { /* ignore */ } })\n }\n}\nexport function onPanelOpen(fn: (v: boolean) => void): () => void {\n listeners.add(fn)\n return () => { listeners.delete(fn) }\n}\n","/**\n * dsh-prompt — 双语(中文为主,html[lang] 跟随)\n */\nexport type Lang = 'zh' | 'en'\n\nexport function getLang(): Lang {\n try {\n const l = (document.documentElement && document.documentElement.lang) || (navigator.language || 'en')\n return /^zh/i.test(l) ? 'zh' : 'en'\n } catch (e) { return 'zh' }\n}\n\nexport interface I18NMap { zh: string; en: string }\n\nexport function tr(lang: Lang, m: I18NMap): string {\n return lang === 'zh' ? m.zh : m.en\n}\n\nexport const STR = {\n panelTitle: { zh: 'Prompt', en: 'Prompt' },\n entryBtn: { zh: 'Prompt', en: 'Prompt' },\n add: { zh: '新增自定义模板', en: 'Add custom template' },\n addShort: { zh: '新增', en: 'Add' },\n searchPh: { zh: '搜索模板…', en: 'Search templates…' },\n tabAll: { zh: '全部', en: 'All' },\n tabBefore: { zh: '执行前', en: 'Before' },\n tabDuring: { zh: '执行中', en: 'During' },\n tabAfter: { zh: '执行后', en: 'After' },\n tabCustom: { zh: '自定义', en: 'Custom' },\n domainAll: { zh: '全领域', en: 'All domains' },\n presetCount: { zh: '预制', en: 'Preset' },\n customCount: { zh: '自定义', en: 'Custom' },\n goSettings: { zh: '设置 → 模板管理', en: 'Settings → Templates' },\n edit: { zh: '编辑', en: 'Edit' },\n del: { zh: '删除', en: 'Delete' },\n copy: { zh: '复制为自定义', en: 'Copy to custom' },\n pin: { zh: '置顶/取消置顶', en: 'Pin/Unpin' },\n noMatch: { zh: '无匹配模板', en: 'No matching templates' },\n addTitle: { zh: '新增自定义模板', en: 'Add custom template' },\n editTitle: { zh: '编辑自定义模板', en: 'Edit custom template' },\n namePh: { zh: '模板名称', en: 'Template name' },\n tagPh: { zh: '标签', en: 'Tag' },\n bodyPh: { zh: 'Prompt 正文(≤1000 字)', en: 'Prompt body (≤1000 chars)' },\n cancel: { zh: '取消', en: 'Cancel' },\n save: { zh: '保存', en: 'Save' },\n addOk: { zh: '添加', en: 'Add' },\n nameRequired: { zh: '名称必填', en: 'Name is required' },\n bodyTooLong: { zh: '正文超过 1000 字上限', en: 'Body exceeds 1000 chars' },\n delTitle: { zh: '删除确认', en: 'Confirm delete' },\n delMsg: { zh: '确定删除自定义模板', en: 'Delete custom template' },\n delUnrecover: { zh: '此操作不可撤销。', en: 'This cannot be undone.' },\n delOk: { zh: '删除', en: 'Delete' },\n pinFull: { zh: '置顶已达上限(5 个)', en: 'Pin limit reached (5)' },\n insertHint: { zh: '点击即插入', en: 'Click to insert' },\n close: { zh: '关闭', en: 'Close' },\n smartToggle: { zh: '智能模式悬浮卡(输入匹配时推荐模板;默认开)', en: 'Smart card (recommends templates while typing; on by default)' },\n smartToggleHint: { zh: '默认开;关闭后仅保留 ⚡Prompt 面板与 /prompt 触发源', en: 'On by default; when off, only the panel and /prompt remain' },\n smartDot: { zh: '智能模式 · 拖动调整位置;输入匹配时出卡', en: 'Smart mode · drag to move; card appears on match' },\n smartTitle: { zh: '智能推荐', en: 'Smart suggest' },\n smartHint: { zh: '点击即填入', en: 'Click to insert' },\n smartFill: { zh: '点击填入', en: 'Insert' },\n smartDismiss: { zh: '收起(继续输入可再次出现)', en: 'Dismiss (reappears as you type)' },\n smartRecent: { zh: '最近使用', en: 'Recently used' },\n smartCommon: { zh: '常用模板', en: 'Common templates' },\n gitHubRepo: { zh: 'GitHub 仓库', en: 'GitHub repo' },\n feedback: { zh: '反馈故障', en: 'Report issue' },\n}\n","/**\n * dsh-prompt — 模板浏览组件(面板 popover 与设置页共用)\n * #4 交互定稿:tabs(阶段)+ 领域筛选 + 搜索;排序=置顶≤5 → 用量;单击插入(光标处/末尾、不覆盖、自动聚焦);\n * 插入后自动关闭;编辑/删除/新增时保持打开;hover 快捷操作;+弹窗新增;删除二次确认;预制可复制为自定义。\n */\nimport type { PromptTemplate } from './templates'\nimport { PRESET_TEMPLATES, getPresetById } from './templates'\nimport {\n allTemplates, sortedTemplates, displayTag, isPinned, togglePin, canPinMore,\n addCustom, updateCustom, removeCustom, copyPresetToCustom, bumpUsage, templateHaystack, MAX_BODY,\n} from './store'\nimport { setPanelOpen } from './state'\nimport { getLang, tr, STR, type Lang } from './i18n'\nimport { setSmartInput } from './smartstore'\n\nexport function getReact(): any {\n if (typeof require === 'function') { try { return require('react') } catch (e) { /* ignore */ } }\n if (typeof globalThis !== 'undefined' && (globalThis as any).React) return (globalThis as any).React\n return null\n}\n\nconst STAGE_TABS = ['all', '执行前', '执行中', '执行后'] as const\nconst DOMAIN_FILTERS = ['all', '思考框架', '学习', '工程', '执行'] as const\nconst CUSTOM_TAG = '自定义'\n\nexport interface BrowserProps {\n compact: boolean\n inputActions?: any\n useInput?: any\n}\n\ninterface ModalState {\n kind: 'add' | 'edit' | 'del'\n t?: PromptTemplate\n}\n\n/** 插入正文到当前草稿(光标处优先,否则末尾;不覆盖;自动聚焦) */\nexport function insertBody(useInput: any, inputActions: any, body: string): void {\n let draft = ''\n try { const st = useInput ? useInput((s: any) => s) : null; draft = (st && st.draft) || '' } catch (e) { /* ignore */ }\n let pos = draft.length\n try {\n if (typeof document !== 'undefined') {\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === draft) { pos = typeof ta.selectionStart === 'number' ? ta.selectionStart : draft.length; break }\n }\n }\n } catch (e) { /* ignore */ }\n const newDraft = draft.slice(0, pos) + body + draft.slice(pos)\n if (inputActions && typeof inputActions.setDraft === 'function') inputActions.setDraft(newDraft)\n setTimeout(() => {\n try {\n if (typeof document !== 'undefined') {\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === newDraft) { ta.focus(); ta.setSelectionRange(pos + body.length, pos + body.length); break }\n }\n }\n } catch (e) { /* ignore */ }\n }, 0)\n}\n\n/** 点击模板:插入 + 用量 +1 + 面板关闭 */\nexport function onPick(t: PromptTemplate, useInput: any, inputActions: any): void {\n insertBody(useInput, inputActions, t.body)\n bumpUsage(t.id)\n setPanelOpen(false)\n}\n\n/** 模板浏览(面板 / 设置页共用) */\n// ── 弹窗组件(模块级稳定类型:内联函数组件会在父组件每次重渲染时被整体卸载重建 → 输入内容丢失)──\nconst modalMaskStyle: any = { position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.55)', display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 400 }\nconst modalCardStyle: any = { width: 460, background: 'var(--dsw-specific-menu)', border: '1px solid var(--dsw-alias-border-inverted)', borderRadius: 12, padding: 16, display: 'flex', flexDirection: 'column', gap: 10, fontFamily: 'var(--dsw-font-family)', color: 'var(--dsw-alias-label-primary)' }\nconst modalFieldStyle: any = { width: '100%', background: 'var(--dsw-alias-bg-layer-3)', border: '1px solid var(--dsw-alias-border-l1)', color: 'var(--dsw-alias-label-primary)', borderRadius: 8, padding: '8px 10px', fontFamily: 'var(--dsw-font-family)', fontSize: '0.96em', outline: 'none', boxSizing: 'border-box' }\nconst modalBtnsStyle: any = { display: 'flex', justifyContent: 'flex-end', gap: 8 }\nconst modalBtn = (primary?: boolean, danger?: boolean): any => ({ padding: '6px 14px', borderRadius: 8, border: primary ? 0 : '1px solid var(--dsw-alias-border-l1)', background: primary ? 'var(--dsw-specific-accent,#f0a45c)' : 'var(--dsw-alias-bg-layer-3)', color: primary ? '#1a1a1e' : (danger ? 'var(--dsw-specific-danger,#e06c75)' : 'var(--dsw-alias-label-primary)'), cursor: 'pointer', fontFamily: 'var(--dsw-font-family)', fontSize: '0.96em' })\n\n/** 新建/编辑弹窗(模块级稳定组件,避免父级重渲染时被卸载重置) */\nfunction TemplateModal(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const editing = props.kind === 'edit' && !!props.tpl\n const s1 = react.useState(editing ? props.tpl.name : '')\n const name = s1[0]; const setName = s1[1]\n const s2 = react.useState(editing ? (props.tpl as any).tag || CUSTOM_TAG : CUSTOM_TAG)\n const tag = s2[0]; const setTag = s2[1]\n const s3 = react.useState(editing ? props.tpl.body : '')\n const body = s3[0]; const setBody = s3[1]\n const errState = react.useState<string | null>(null)\n const err = errState[0]; const setErr = errState[1]\n const doOk = () => {\n const nm = name.trim(), bd = body.trim()\n if (!nm) { setErr('nameRequired'); return }\n if (bd.length > MAX_BODY) { setErr('bodyTooLong'); return }\n props.onOk && props.onOk({ name: nm, tag: tag || CUSTOM_TAG, body: bd })\n }\n return h('div', { style: modalMaskStyle, 'data-dsh-prompt-modal': '', onClick: (e: any) => { if (e.target === e.currentTarget) props.onCancel() } }, [\n h('div', { style: modalCardStyle }, [\n h('h3', { style: { fontSize: '1.08em', margin: 0 } }, editing ? props.t('editTitle') : props.t('addTitle')),\n h('input', { style: modalFieldStyle, placeholder: props.t('namePh'), value: name, onChange: (e: any) => setName(e.target.value) }),\n h('input', { style: modalFieldStyle, placeholder: props.t('tagPh'), value: tag, onChange: (e: any) => setTag(e.target.value) }),\n h('textarea', { style: { ...modalFieldStyle, height: 110, resize: 'vertical' }, placeholder: props.t('bodyPh'), value: body, onChange: (e: any) => setBody(e.target.value) }),\n err ? h('div', { style: { fontSize: '0.92em', color: 'var(--dsw-specific-danger,#e06c75)' } }, props.t(err as keyof typeof STR)) : null,\n h('div', { style: modalBtnsStyle }, [\n h('button', { style: modalBtn(), onClick: props.onCancel }, props.t('cancel')),\n h('button', { style: modalBtn(true), onClick: doOk }, editing ? props.t('save') : props.t('addOk')),\n ]),\n ]),\n ])\n}\n\n/** 删除确认弹窗(同样模块级稳定组件) */\nfunction ConfirmDelete(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n return h('div', { style: modalMaskStyle, 'data-dsh-prompt-modal': '', onClick: (e: any) => { if (e.target === e.currentTarget) props.onCancel() } }, [\n h('div', { style: modalCardStyle }, [\n h('h3', { style: { fontSize: '1.08em', margin: 0 } }, props.t('delTitle')),\n h('div', { style: { fontSize: '0.96em', color: 'var(--dsw-alias-label-tertiary)' } }, props.t('delMsg') + '「' + props.tpl.name + '」' + props.t('delUnrecover')),\n h('div', { style: modalBtnsStyle }, [\n h('button', { style: modalBtn(), onClick: props.onCancel }, props.t('cancel')),\n h('button', { style: modalBtn(false, true), onClick: props.onOk }, props.t('delOk')),\n ]),\n ]),\n ])\n}\n\nexport function TemplateBrowser(props: BrowserProps): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const { compact, inputActions, useInput } = props\n\n const langState = react.useState<Lang>(getLang())\n const lang = langState[0]\n const tickState = react.useState(0)\n const setTick = tickState[1]\n const tabState = react.useState<string>('all')\n const tab = tabState[0]\n const domainState = react.useState<string>('all')\n const domain = domainState[0]\n const qState = react.useState('')\n const q = qState[0]\n const modalState = react.useState<ModalState | null>(null)\n const modal = modalState[0]\n const offsetState = react.useState(0)\n const offsetLeft = offsetState[0]\n const rootRef = react.useRef<any>(null)\n const highlightState = react.useState<string | null>(null)\n const highlightId = highlightState[0]\n\n // 横向对齐 ⚡Prompt 按钮(仅紧凑面板):测按钮在锚点内的水平偏移\n react.useEffect(() => {\n if (!compact) return\n try {\n const btn = typeof document !== 'undefined' ? document.querySelector('[data-dsh-prompt-entry]') : null\n if (btn && rootRef.current && rootRef.current.offsetParent) {\n const br = (btn as HTMLElement).getBoundingClientRect()\n const ar = (rootRef.current.offsetParent as HTMLElement).getBoundingClientRect()\n offsetState[1](Math.max(0, br.left - ar.left))\n }\n } catch (e) { /* ignore */ }\n }, [])\n\n // 语言跟随 html[lang]\n react.useEffect(() => {\n if (typeof document === 'undefined') return\n const onLang = () => { langState[1](getLang()) }\n const obs = new MutationObserver(onLang)\n obs.observe(document.documentElement, { attributes: true, attributeFilter: ['lang'] })\n return () => { obs.disconnect() }\n }, [])\n\n const refresh = () => setTick((n) => n + 1)\n const t = (k: keyof typeof STR) => tr(lang, STR[k])\n\n // 列表组装:tab=自定义 → 仅自定义;否则 预制+自定义,按 阶段 → 领域 → 搜索过滤,排序\n const customs = allTemplates().filter((x) => !x.builtin)\n const list = allTemplates().filter((x) => {\n if (tab === CUSTOM_TAG) return !x.builtin\n if (tab !== 'all' && x.stage !== tab) return false\n if (domain !== 'all' && displayTag(x) !== domain) return false\n return true\n })\n const ql = q.trim().toLowerCase()\n // 搜索与 /prompt 触发源共用检索底座(名称/正文/领域/阶段/动作/标签)\n const filtered = ql\n ? list.filter((x) => templateHaystack(x).indexOf(ql) >= 0)\n : list\n const sorted = sortedTemplates(filtered)\n\n const presetCount = PRESET_TEMPLATES.length\n const customCount = customs.length\n\n // ── 样式(DSH 主题变量)──\n const base = 'var(--dsw-alias-label-primary)'\n const muted = 'var(--dsw-alias-label-secondary)'\n const dim = 'var(--dsw-alias-label-tertiary)'\n const line = '1px solid var(--dsw-alias-border-l1)'\n const panelStyle: any = compact\n ? {\n position: 'absolute', left: offsetLeft, bottom: 'calc(100% + 8px)',\n zIndex: 300, width: 430,\n display: 'flex', flexDirection: 'column',\n background: 'var(--dsw-specific-menu)', border: '1px solid var(--dsw-alias-border-inverted)',\n borderRadius: 12, boxShadow: 'var(--dsw-shadow-lv3)', overflow: 'hidden',\n fontFamily: 'var(--dsw-font-family)', fontSize: 'var(--dsw-font-markdown-base-font-size)', color: base,\n }\n : {\n display: 'flex', flexDirection: 'column', gap: 6, padding: '6px 8px',\n fontFamily: 'var(--dsw-font-family)', fontSize: 'var(--dsw-font-markdown-base-font-size)', color: base,\n }\n const headStyle: any = { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '6px 8px', borderBottom: line }\n const titleStyle: any = { fontWeight: 700, fontSize: '1em' }\n const addBtn: any = { width: 26, height: 26, borderRadius: 7, border: line, background: 'var(--dsw-alias-bg-layer-3)', color: 'var(--dsw-specific-accent,#f0a45c)', fontSize: '1.2em', lineHeight: 1, cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 0 }\n const closeBtn: any = { width: 26, height: 26, borderRadius: 7, border: 0, background: 'transparent', color: dim, fontSize: '1.2em', lineHeight: 1, cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 0 }\n const headBtns: any = { display: 'flex', gap: 4, alignItems: 'center' }\n const tabsStyle: any = { display: 'flex', gap: 4, padding: '4px 8px 0', flexWrap: 'wrap' }\n const tabBtn = (on: boolean): any => ({\n padding: '2px 8px', borderRadius: 999, border: line, background: on ? 'var(--dsw-alias-bg-layer-3)' : 'transparent',\n color: on ? base : muted, cursor: 'pointer', fontFamily: 'var(--dsw-font-family)', fontSize: '0.85em',\n })\n const domainRowStyle: any = { display: 'flex', gap: 4, padding: '3px 8px 0', flexWrap: 'wrap' }\n const searchStyle: any = { margin: '5px 8px 4px', padding: '5px 9px', borderRadius: 8, border: line, background: 'var(--dsw-alias-bg-layer-3)', color: base, fontFamily: 'var(--dsw-font-family)', fontSize: '0.96em', outline: 'none' }\n const listStyle: any = compact\n ? { overflow: 'auto', padding: '2px 2px 8px', maxHeight: 170 } // 面板:恒定约 5 行,内部滚动\n : { padding: '2px 2px 8px' } // 设置页:自然高度,由宿主设置面板整页滚动\n const itemStyle: any = { display: 'flex', alignItems: 'flex-start', gap: 6, padding: '4px 2px', borderRadius: 8, cursor: 'pointer' }\n const pinStyle = (on: boolean): any => ({ flex: 'none', width: 20, height: 20, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', border: 0, background: 'transparent', borderRadius: 6 })\n const nmStyle: any = { flex: 'none', minWidth: 0, fontSize: '0.98em', color: base, fontWeight: 500, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\n const subStyle: any = { display: 'block', fontSize: '0.85em', color: dim, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\n // 勋章式标签:填充底色 + 精致胶囊\n const tagStyle: any = { flex: 'none', fontSize: '0.7em', fontWeight: 500, color: muted, background: 'var(--dsw-alias-bg-layer-3)', border: '1px solid var(--dsw-alias-border-l2)', padding: '0 7px', borderRadius: 999, lineHeight: '15px', letterSpacing: '0.02em', whiteSpace: 'nowrap' }\n const actStyle: any = { display: 'flex', gap: 4, flex: 'none' }\n const actBtn = (danger?: boolean): any => ({ border: line, background: 'transparent', color: danger ? 'var(--dsw-specific-danger,#e06c75)' : dim, cursor: 'pointer', fontSize: '0.85em', padding: '1px 8px', borderRadius: 999, fontFamily: 'var(--dsw-font-family)', whiteSpace: 'nowrap' })\n const footStyle: any = { padding: '8px 12px', borderTop: line, display: 'flex', justifyContent: 'space-between', fontSize: '0.85em', color: dim }\n const footLink: any = { color: 'var(--dsw-specific-accent,#f0a45c)', cursor: 'pointer', textDecoration: 'none', background: 'transparent', border: 0, fontFamily: 'var(--dsw-font-family)', fontSize: '0.85em' }\n\n // ── 操作 ──\n const handlePick = (x: PromptTemplate) => { onPick(x, useInput, inputActions) }\n\n const handlePin = (e: any, x: PromptTemplate) => {\n e.stopPropagation()\n const r = togglePin(x.id)\n if (!r.ok) { alert(t('pinFull')) }\n refresh()\n }\n\n const handleCopy = (e: any, id: string) => {\n e.stopPropagation()\n const c = copyPresetToCustom(id)\n if (!c) return\n // 创建反馈:自动置顶(容量允许)→ 切「自定义」tab → 高亮新项 → 滚入视野\n const r = togglePin(c.id)\n tabState[1](CUSTOM_TAG)\n highlightState[1](c.id)\n refresh()\n setTimeout(() => {\n highlightState[1](null)\n try {\n const el = typeof document !== 'undefined' ? document.querySelector('[data-dsh-prompt-id=\"' + c.id + '\"]') : null\n if (el) (el as HTMLElement).scrollIntoView({ block: 'nearest' })\n } catch (err) { /* ignore */ }\n }, 1600)\n }\n\n const handleDel = (e: any, x: PromptTemplate) => {\n e.stopPropagation()\n modalState[1]({ kind: 'del', t: x })\n }\n\n const handleEdit = (e: any, x: PromptTemplate) => {\n e.stopPropagation()\n modalState[1]({ kind: 'edit', t: x })\n }\n\n // ── 弹窗(新增/编辑/删除确认)── 模块级稳定组件:内联函数组件会在父级每次重渲染时被卸载重建 → 输入内容丢失\n let modalNode: any = null\n if (modal) {\n if (modal.kind === 'add' || modal.kind === 'edit') {\n modalNode = h('div', { key: 'tplmodal-' + modal.kind + (modal.t ? '-' + modal.t.id : '') }, [\n h(TemplateModal, {\n kind: modal.kind, tpl: modal.t, t,\n onCancel: () => modalState[1](null),\n onOk: (f: { name: string; tag: string; body: string }) => {\n if (modal.kind === 'edit' && modal.t) { updateCustom(modal.t.id, f) }\n else { addCustom(f.name, f.tag, f.body) }\n modalState[1](null)\n refresh()\n },\n }),\n ])\n } else if (modal.kind === 'del' && modal.t) {\n modalNode = h('div', { key: 'del-' + modal.t.id }, [\n h(ConfirmDelete, {\n tpl: modal.t, t,\n onCancel: () => modalState[1](null),\n onOk: () => { removeCustom(modal.t!.id); modalState[1](null); refresh() },\n }),\n ])\n }\n }\n\n // ── 组装 ──\n const tabs = [\n { id: 'all', label: t('tabAll') },\n { id: '执行前', label: t('tabBefore') },\n { id: '执行中', label: t('tabDuring') },\n { id: '执行后', label: t('tabAfter') },\n { id: CUSTOM_TAG, label: t('tabCustom') },\n ]\n const tabNodes = h('div', { style: tabsStyle }, tabs.map((tb) =>\n h('button', { key: tb.id, style: tabBtn(tab === tb.id), onClick: () => { tabState[1](tb.id); refresh() } }, tb.label),\n ))\n const domainNodes = h('div', { style: domainRowStyle }, DOMAIN_FILTERS.map((d) =>\n h('button', { key: d, style: tabBtn(domain === d), onClick: () => { domainState[1](d); refresh() } }, d === 'all' ? t('domainAll') : d),\n ))\n const rows = sorted.map((x) => {\n const pinned = isPinned(x.id)\n const custom = !x.builtin\n const acts = custom\n ? h('span', { style: actStyle }, [\n h('button', { style: actBtn(), onClick: (e: any) => handleEdit(e, x) }, t('edit')),\n h('button', { style: actBtn(true), onClick: (e: any) => handleDel(e, x) }, t('del')),\n ])\n : h('span', { style: actStyle }, [\n h('button', { style: actBtn(), onClick: (e: any) => handleCopy(e, x.id) }, t('copy')),\n ])\n const itemBg = highlightId === x.id ? 'var(--dsw-alias-interactive-bg-hover)' : undefined\n return h('div', { key: x.id, style: { ...itemStyle, background: itemBg }, 'data-dsh-prompt-id': x.id, onClick: () => handlePick(x), title: t('insertHint') }, [\n h('div', { style: { flex: 'none', paddingTop: 2 } }, [\n h('button', { style: pinStyle(pinned), title: t('pin'), onClick: (e: any) => handlePin(e, x) }, [\n // 图钉(置顶语义):置顶=橙色实心,未置顶=描边\n h('svg', { width: 14, height: 14, viewBox: '0 0 24 24', fill: pinned ? 'var(--dsw-specific-accent,#f0a45c)' : 'none', stroke: pinned ? 'var(--dsw-specific-accent,#f0a45c)' : dim, strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', style: { display: 'block' } }, [\n h('path', { d: 'M12 17v5' }),\n h('path', { d: 'M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1z' }),\n ]),\n ]),\n ]),\n h('div', { style: { flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 1 } }, [\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 } }, [\n h('span', { style: nmStyle }, x.name),\n h('span', { style: tagStyle }, displayTag(x)),\n ]),\n h('span', { style: subStyle }, (x.body || '').slice(0, 44) + '…'),\n ]),\n h('div', { style: { flex: 'none', display: 'flex', alignItems: 'center', gap: 4, paddingTop: 2 } }, [acts]),\n ])\n })\n const listNode = rows.length > 0\n ? h('div', { style: listStyle }, rows)\n : h('div', { style: { padding: 14, color: dim, fontSize: '0.92em' } }, t('noMatch'))\n\n const footer = null\n\n return h('div', { ref: rootRef, style: panelStyle }, [\n compact ? h('div', { style: headStyle }, [\n h('svg', { width: 15, height: 15, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--dsw-specific-accent,#f0a45c)', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', style: { flex: 'none' } }, [\n h('path', { d: 'M15 14c.2-1 .7-1.7 1.5-2.5C17.5 10.6 18 9.3 18 8a6 6 0 1 0-12 0c0 1.3.5 2.6 1.5 3.5.8.8 1.3 1.5 1.5 2.5' }),\n h('path', { d: 'M9 18h6' }),\n h('path', { d: 'M10 22h4' }),\n h('path', { d: 'M18.5 2.5l.8 1.7 1.7.8-1.7.8-.8 1.7-.8-1.7-1.7-.8 1.7-.8z' }),\n ]),\n h('span', { style: titleStyle }, t('panelTitle')),\n h('span', { style: { fontSize: '0.85em', color: dim, marginLeft: 6 } }, t('presetCount') + ' ' + presetCount + ' · ' + t('customCount') + ' ' + customCount),\n h('div', { style: { flex: 1 } }),\n h('button', { style: footLink, onClick: () => { setPanelOpen(false); emitGoSettings() } }, t('goSettings')),\n h('div', { style: headBtns }, [\n h('button', { style: addBtn, title: t('add'), onClick: () => modalState[1]({ kind: 'add' }) }, '+'),\n h('button', { style: closeBtn, title: t('close'), onClick: () => setPanelOpen(false) }, '×'),\n ]),\n ]) : h('div', { style: headStyle }, [\n h('svg', { width: 15, height: 15, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--dsw-specific-accent,#f0a45c)', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', style: { flex: 'none' } }, [\n h('path', { d: 'M15 14c.2-1 .7-1.7 1.5-2.5C17.5 10.6 18 9.3 18 8a6 6 0 1 0-12 0c0 1.3.5 2.6 1.5 3.5.8.8 1.3 1.5 1.5 2.5' }),\n h('path', { d: 'M9 18h6' }),\n h('path', { d: 'M10 22h4' }),\n h('path', { d: 'M18.5 2.5l.8 1.7 1.7.8-1.7.8-.8 1.7-.8-1.7-1.7-.8 1.7-.8z' }),\n ]),\n h('span', { style: titleStyle }, t('panelTitle')),\n h('div', { style: { flex: 1 } }),\n h('button', { style: { ...addBtn, width: 'auto', padding: '0 12px', fontSize: '0.92em' }, title: t('add'), onClick: () => modalState[1]({ kind: 'add' }) }, '+ ' + t('addShort')),\n ]),\n tabNodes,\n domainNodes,\n h('input', { style: searchStyle, placeholder: t('searchPh'), value: q, onChange: (e: any) => qState[1](e.target.value) }),\n listNode,\n footer,\n modalNode,\n ])\n}\n\n/** 面板 → 设置页跳转(宿主 settings 路由:由 index.ts 注册) */\nlet goSettingsHandler: (() => void) | null = null\nexport function setGoSettingsHandler(fn: (() => void) | null): void { goSettingsHandler = fn }\nfunction emitGoSettings(): void { if (goSettingsHandler) goSettingsHandler() }\n\nexport function getPresetList(): PromptTemplate[] { return PRESET_TEMPLATES }\nexport function getPreset(id: string): PromptTemplate | undefined { return getPresetById(id) }\n","/**\n * dsh-prompt — 入口按钮(conversation.input.left)\n */\nimport { getReact } from './panel'\nimport { isPanelOpen, setPanelOpen } from './state'\nimport { getLang, tr, STR } from './i18n'\n\nexport function EntryButton(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const open = props.open ?? false\n const lang = getLang()\n\n const style: any = {\n display: 'inline-flex', alignItems: 'center', gap: 6,\n padding: '5px 10px', borderRadius: 8,\n background: 'var(--dsw-alias-bg-layer-3)',\n border: '1px solid var(--dsw-alias-border-l1)',\n color: open ? 'var(--dsw-specific-accent,#f0a45c)' : 'var(--dsw-alias-label-primary)',\n cursor: 'pointer', fontSize: 12, fontWeight: 500,\n fontFamily: 'var(--dsw-font-family)', whiteSpace: 'nowrap',\n flex: 'none',\n }\n return h('button', {\n style, title: tr(lang, STR.entryBtn),\n 'data-dsh-prompt-entry': '1',\n onClick: () => setPanelOpen(!isPanelOpen()),\n }, [\n // 图标:灯泡(提醒/点子语义)+ 小星芒(智能建议)—— 方案 C\n h('svg', { width: 14, height: 14, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--dsw-specific-accent,#f0a45c)', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', style: { flex: 'none' } }, [\n h('path', { d: 'M15 14c.2-1 .7-1.7 1.5-2.5C17.5 10.6 18 9.3 18 8a6 6 0 1 0-12 0c0 1.3.5 2.6 1.5 3.5.8.8 1.3 1.5 1.5 2.5' }),\n h('path', { d: 'M9 18h6' }),\n h('path', { d: 'M10 22h4' }),\n h('path', { d: 'M18.5 2.5l.8 1.7 1.7.8-1.7.8-.8 1.7-.8-1.7-1.7-.8 1.7-.8z' }),\n ]),\n h('span', null, tr(lang, STR.entryBtn)),\n ])\n}\n","/**\n * dsh-prompt — 智能模式桥接存储\n * 会话作用域 overlay 把当前输入(draft/useInput/actions)发布到这里;root 悬浮卡订阅。\n * 开关(默认开)、位置持久化、插入抑制(防「插入后卡片重现」)也在此。\n */\nexport interface SmartInput {\n sessionId?: string\n draft: string\n useInput?: any\n actions?: any\n}\n\nlet current: SmartInput = { draft: '' }\nconst listeners = new Set<() => void>()\n\nexport function setSmartInput(next: SmartInput): void {\n if (next.draft === current.draft && next.sessionId === current.sessionId && next.actions === current.actions && next.useInput === current.useInput) return\n current = next\n listeners.forEach((fn) => { try { fn() } catch (e) { /* ignore */ } })\n}\nexport function getSmartInput(): SmartInput { return current }\nexport function onSmartInput(fn: () => void): () => void {\n listeners.add(fn)\n return () => { listeners.delete(fn) }\n}\n\nconst SMART_KEY = 'dsh.prompt.smart'\nconst POS_KEY = 'dsh.prompt.smartPos'\n\n/** 智能模式开关:默认开(localStorage 缺省 true);变更广播(设置页 ↔ 悬浮卡实时同步) */\nconst enabledListeners = new Set<(on: boolean) => void>()\nexport function isSmartEnabled(): boolean {\n try {\n const s = globalThis.localStorage\n if (!s) return true\n const v = s.getItem(SMART_KEY)\n return v === null ? true : v !== '0'\n } catch (e) { return true }\n}\nexport function setSmartEnabled(on: boolean): void {\n try { globalThis.localStorage?.setItem(SMART_KEY, on ? '1' : '0') } catch (e) { /* ignore */ }\n enabledListeners.forEach((fn) => { try { fn(on) } catch (e) { /* ignore */ } })\n}\nexport function onSmartEnabled(fn: (on: boolean) => void): () => void {\n enabledListeners.add(fn)\n return () => { enabledListeners.delete(fn) }\n}\n\nexport interface SmartPos { x: number; y: number }\n\nexport function loadSmartPos(): SmartPos | null {\n try {\n const s = globalThis.localStorage\n if (!s) return null\n const raw = s.getItem(POS_KEY)\n if (!raw) return null\n const p = JSON.parse(raw) as SmartPos\n return typeof p.x === 'number' && typeof p.y === 'number' ? p : null\n } catch (e) { return null }\n}\nexport function saveSmartPos(p: SmartPos): void {\n try { globalThis.localStorage?.setItem(POS_KEY, JSON.stringify(p)) } catch (e) { /* ignore */ }\n}\n\n/** 插入抑制:插入后 draft 变为新值 → 卡片不重现;用户改动草稿后自动解除 */\nlet suppressDraft: string | null = null\nexport function suppressCard(draft: string): void { suppressDraft = draft }\nexport function isSuppressed(draft: string): boolean { return suppressDraft !== null && suppressDraft === draft }\nexport function clearSuppression(draft: string): void { if (suppressDraft !== null && suppressDraft !== draft) suppressDraft = null }\n","/**\n * dsh-prompt — 设置页模板管理(settings.plugins.tab)+ 智能模式开关\n */\nimport { getReact, TemplateBrowser } from './panel'\nimport { isSmartEnabled, setSmartEnabled } from './smartstore'\nimport { getLang, tr, STR } from './i18n'\n\nexport function SettingsPage(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const smartState = react.useState(isSmartEnabled())\n const smartOn = smartState[0]\n const lang = getLang()\n const t = (k: keyof typeof STR) => tr(lang, STR[k])\n const row: any = {\n display: 'flex', alignItems: 'center', gap: 8, padding: '10px 4px',\n fontFamily: 'var(--dsw-font-family)', fontSize: 12.5, color: 'var(--dsw-alias-label-primary)',\n }\n const linkRow: any = {\n display: 'flex', gap: 18, padding: '12px 4px 2px', borderTop: '1px solid var(--dsw-alias-border-l1)',\n fontSize: '0.88em', fontFamily: 'var(--dsw-font-family)',\n }\n const linkStyle: any = {\n color: 'var(--dsw-specific-accent,#f0a45c)', cursor: 'pointer', textDecoration: 'none',\n display: 'inline-flex', alignItems: 'center', gap: 5,\n }\n return h('div', { style: { padding: 4, display: 'flex', flexDirection: 'column' } }, [\n h('div', { style: linkRow }, [\n h('a', { style: linkStyle, href: 'https://github.com/FeatherHunter/dsh-prompt', target: '_blank', rel: 'noreferrer' }, '⛭ ' + t('gitHubRepo')),\n h('a', { style: linkStyle, href: 'https://github.com/FeatherHunter/dsh-prompt/issues/new', target: '_blank', rel: 'noreferrer' }, '⚠ ' + t('feedback')),\n ]),\n h('label', { style: row, title: t('smartToggleHint') }, [\n h('input', {\n type: 'checkbox', checked: smartOn,\n onChange: (e: any) => { const on = e.target.checked; smartState[1](on); setSmartEnabled(on) },\n }),\n h('span', null, t('smartToggle')),\n ]),\n h(TemplateBrowser, { compact: false }),\n ])\n}\n","/**\n * dsh-prompt — /prompt 触发源(inputTriggers registerSource)\n * #9:trigger=/ name=prompt;列出预制+自定义模板,支持过滤(标签/搜索);选中即插入(span 替换,与面板插入一致)。\n * v1 只做「列出+过滤」,不做评分匹配(评分/强弱词留给 v1.1 智能卡 #10);排序与面板共用(置顶→用量,sortedTemplates)。\n */\nimport type { PromptTemplate } from './templates'\nimport {\n allTemplates, sortedTemplates, templateHaystack, displayTag, getTemplate, bumpUsage,\n} from './store'\n\nconst SOURCE_NAME = 'prompt'\nconst MAX_ITEMS = 30\n\nexport interface PromptTriggerSource {\n trigger: string\n name: string\n order: number\n candidates(projection: unknown, req: { query: string; position: string; signal?: AbortSignal }): Promise<Array<{ name: string; description: string; templateId: string }>>\n onPick(pick: { candidate: { templateId: string } }): { text: string } | undefined\n}\n\n/**\n * /prompt 过滤:先剥离源名前缀(/prompt 本身 → 全量列出;/prompt <词> → 按词过滤),\n * 剩余词匹配 名称/英文名/正文/领域/阶段/动作/标签(场景标签手动筛选的检索底座)。\n */\nexport function filterPromptTemplates(query: string): PromptTemplate[] {\n let q = (query || '').trim()\n const ql = q.toLowerCase()\n const src = SOURCE_NAME.toLowerCase()\n if (ql === src || ql.startsWith(src + ' ') || ql.startsWith(src + '\\t') || ql.startsWith(src + '\\n')) {\n q = q.slice(src.length).trim()\n }\n if (!q) return sortedTemplates(allTemplates())\n const needle = q.toLowerCase()\n return sortedTemplates(allTemplates().filter((x) => templateHaystack(x).indexOf(needle) >= 0))\n}\n\n/** /prompt 触发源(inputTriggers source 契约:candidates → onPick → {text} span 替换) */\nexport function buildPromptSource(): PromptTriggerSource {\n return {\n trigger: '/',\n name: SOURCE_NAME,\n order: 5, // '/' 分组内排在 command(0)、skill(2) 之后\n candidates: async (_projection, req) =>\n filterPromptTemplates(req.query).slice(0, MAX_ITEMS).map((t) => ({\n name: t.name,\n description: displayTag(t) + ' · ' + t.stage + ' — ' + (t.body || '').replace(/\\s+/g, ' ').slice(0, 42),\n templateId: t.id,\n })),\n onPick: (pick) => {\n const tpl = getTemplate(pick.candidate.templateId)\n if (!tpl) return undefined\n bumpUsage(tpl.id) // 与面板插入一致:用量仅排序不显示\n return { text: tpl.body }\n },\n }\n}\n","/**\n * dsh-prompt — 智能模式强/弱词表(v1.1)\n * 从 final.md 的场景标签(领域×阶段×动作)+ 适用场景提炼,覆盖 24 条预制模板。\n * 专属词(强词,命中×2)=模板特有概念/动作术语;通用词(弱词,命中×1)=跨模板常见词。\n * 自定义模板无词表(不做评分),仅经「最近使用」槽位进入候选。\n */\nexport interface WordSet {\n strong: string[]\n weak: string[]\n}\n\nexport const SMART_WORDS: Record<string, WordSet> = {\n fp: { strong: ['第一性原理', '基本组成单元', '不可改变的真理', '颠覆', '去掉假设'], weak: ['分析', '本质', '假设', '拆解', '主题'] },\n socratic: { strong: ['苏格拉底', '追问', '质疑', '复述观点', '没想到的问题'], weak: ['思考', '问题', '假设', '观点'] },\n deep: { strong: ['深度分析', '多维', '常见误解', '边界', '证据'], weak: ['分析', '本质', '判断', '主题'] },\n adversarial: { strong: ['对抗式', '红队', '反例', '推翻', '失败场景', '认知偏差'], weak: ['审查', '方案', '结论', '假设'] },\n decision: { strong: ['决策', '选项', '纠结', '后悔', '最坏', '沉没成本', '没有回头路'], weak: ['选择', '权衡', '处境', '分析'] },\n premortem: { strong: ['事前验尸', 'premortem', '失败原因', '回溯', '预防', '致命缺陷', '早期信号'], weak: ['方案', '项目', '风险', '失败'] },\n feynman: { strong: ['费曼', '类比', '反例', '禁止术语', '判断题'], weak: ['理解', '概念', '解释'] },\n fivewhys: { strong: ['五个为什么', '5why', '根本原因', '根因', '连续追问'], weak: ['为什么', '问题', '原因'] },\n mece: { strong: ['mece', '相互独立', '完全穷尽', '不重不漏', '分类维度'], weak: ['拆解', '分类', '问题'] },\n bias: { strong: ['认知偏差', '确认偏误', '锚定', '群体思维', '反事实', '可得性'], weak: ['偏差', '检查', '推理', '结论'] },\n learnpath: { strong: ['学习路线', '从零到实战', '伪学习', '最小闭环', '掌握程度'], weak: ['学习', '路线', '技能', '入门', '进阶'] },\n concept: { strong: ['概念澄清', '本质区别', '一句话定义', '对比场景', '不适用'], weak: ['概念', '理解', '定义'] },\n codereview: { strong: ['代码审查', 'code review', 'review', 'pr', '正确性', '并发', '注入', '可维护性', '性能'], weak: ['安全', '技术栈'] },\n testdesign: { strong: ['测试用例', '正常路径', '边界值', '异常', '幂等', '并发'], weak: ['测试', '用例', '功能'] },\n refactor: { strong: ['重构', 'refactor', '小步', '可测试性', '耦合'], weak: ['代码', '方案', '结构', '职责'] },\n explain: { strong: ['解释代码', '执行流程', '为什么这样写', '设计取舍', '扮演的角色'], weak: ['代码', '解释', '讲解'] },\n blindspot: { strong: ['盲区', '遗漏', '检查清单', '关键变量'], weak: ['计划', '开始', '任务', '启动', '风险'] },\n snapshot: { strong: ['零丢失', '快照', '出处', '逐条核对', '可疑遗漏'], weak: ['记录', '固化', '里程碑', '会话'] },\n kickoff: { strong: ['任务启动', 'kickoff', '成功标准', '澄清', '经验水平'], weak: ['任务', '开始', '目标', '启动'] },\n prototype: { strong: ['原型', '试错', '候选方案', '快速验证'], weak: ['想法', '验证', '方案', '方向'] },\n plan: { strong: ['执行计划', '里程碑', '验收标准', '依赖'], weak: ['计划', '目标', '安排', '步骤'] },\n deviation: { strong: ['偏离', '记录偏离', '关键决定', '变更'], weak: ['记录', '过程', '复盘'] },\n retro: { strong: ['复盘', 'retro', '重来一次', '可复用经验', '实际 vs 计划'], weak: ['回顾', '总结', '任务', '项目'] },\n quiz: { strong: ['反向考验', '出题', '选择题', '判断题', '盲区'], weak: ['考验', '检验', '主题', '理解'] },\n}\n","/**\n * dsh-prompt — 智能匹配引擎(v1.1)\n * 评分 = 专属词×2 + 通用词×1;门限 ≥2 出卡(专属×1 或 通用×2,宁缺毋滥);\n * 候选 ≤3 = top-2 评分 + 1 最近使用(去重,不足不凑);\n * 排序 = 评分(专属优先)→ 用量计数;代码块内关键词降权;\n * 与 /prompt 共用模板数据/排序基础(架构:allTemplates/bumpUsage/loadLastUsed)。\n */\nimport type { PromptTemplate } from './templates'\nimport { allTemplates, getTemplate, loadUsage, loadLastUsed } from './store'\nimport { SMART_WORDS } from './words'\n\nexport const SMART_THRESHOLD = 2\n\nexport interface ScoreResult {\n score: number\n strong: string[]\n weak: string[]\n}\n\nexport interface ScoredTemplate {\n tpl: PromptTemplate\n score: number\n strongHits: string[]\n weakHits: string[]\n}\n\n/** 命中统计:专属词×2 + 通用词×1(子串匹配,忽略大小写) */\nexport function scoreDraft(draft: string, tpl: PromptTemplate): ScoreResult {\n const words = SMART_WORDS[tpl.id]\n if (!words) return { score: 0, strong: [], weak: [] }\n const text = draft.toLowerCase()\n const strong = words.strong.filter((w) => text.includes(w.toLowerCase()))\n const weak = words.weak.filter((w) => text.includes(w.toLowerCase()))\n return { score: strong.length * 2 + weak.length, strong, weak }\n}\n\n/** 代码块降权:draft 中 ``` 出现奇数次 → 视为处于代码块内 → 抑制出卡 */\nexport function insideCodeBlock(draft: string): boolean {\n let n = 0\n let i = 0\n for (;;) {\n i = draft.indexOf('```', i)\n if (i < 0) break\n n++\n i += 3\n }\n return n % 2 === 1\n}\n\n/** 智能候选:draft → ≤3 条(top-2 评分 + 1 最近使用),不足不凑;自定义无词表,仅经最近使用槽进入 */\nexport function smartCandidates(draft: string): ScoredTemplate[] {\n const text = draft.trim().toLowerCase()\n if (!text || text.length < 2) return []\n if (insideCodeBlock(draft)) return []\n const usage = loadUsage()\n const scored: ScoredTemplate[] = []\n for (const tpl of allTemplates()) {\n if (!tpl.builtin) continue\n const r = scoreDraft(text, tpl)\n if (r.score >= SMART_THRESHOLD) scored.push({ tpl, score: r.score, strongHits: r.strong, weakHits: r.weak })\n }\n scored.sort((a, b) => b.score - a.score || (usage[b.tpl.id] || 0) - (usage[a.tpl.id] || 0))\n const top = scored.slice(0, 2)\n const used = new Set(top.map((s) => s.tpl.id))\n const recentId = loadLastUsed()\n if (recentId && !used.has(recentId)) {\n const tpl = getTemplate(recentId)\n if (tpl) top.push({ tpl, score: 0, strongHits: [], weakHits: [] })\n }\n return top\n}\n\n/** DEC11 修订:插入后光标定位到第一个字段的冒号后(冒号表单式正文);无字段 → 正文末尾 */\nexport function firstFieldCaret(body: string): number {\n const i = body.indexOf(':')\n return i < 0 ? body.length : i + 1\n}\n","/**\n * dsh-prompt — 智能模式悬浮卡(v1.1,shell.overlay root 作用域)\n * #5 定稿:全局单手柄点(点=缩小的卡,卡显示时点消失,互斥)/ 卡从点向右展开 /\n * 自由拖动 + 位置记忆(localStorage)+ 视口 clamp / 仅命中出现 / ≤3 候选(top-2 评分 + 最近使用,不足不凑)/\n * 评分=专属词×2+通用词×1(≥2 出卡)/ 排序=评分→用量 / 点击即填入 + 光标定位首字段冒号后(DEC11 修订)/\n * 默认开可配置关闭 / 与面板各管各的;键盘可达(↑↓/Enter/Esc)。\n */\nimport { getReact } from './panel'\nimport { smartCandidates, firstFieldCaret, type ScoredTemplate } from './match'\nimport { allTemplates, bumpUsage } from './store'\nimport {\n getSmartInput, onSmartInput, isSmartEnabled, setSmartEnabled,\n onSmartEnabled, loadSmartPos, saveSmartPos, suppressCard, isSuppressed, clearSuppression,\n type SmartPos,\n} from './smartstore'\nimport { getLang, tr, STR } from './i18n'\n\nconst DOT_SIZE = 12 // 还原原设计:12px 次级色低调圆点(原型 GlobalDot 样式)\nconst CARD_W = 280 // 内容宽度收窄\nconst CARD_H_EST = 150 // 卡片高度估算(首次渲染未测量时用;测量后精确锚定)\nconst CARD_H = 300\n\nfunction clampPos(p: SmartPos, w: number, h: number): SmartPos {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800\n return {\n x: Math.max(8, Math.min(p.x, vw - w - 8)),\n y: Math.max(8, Math.min(p.y, vh - h - 8)),\n }\n}\n\n/** 读取当前输入框草稿:优先焦点 textarea,其次可见 textarea;无 → 空串 */\nfunction readActiveDraft(): string {\n try {\n if (typeof document === 'undefined') return ''\n const ae = document.activeElement as HTMLTextAreaElement | null\n if (ae && ae.tagName === 'TEXTAREA') {\n // 弹窗/表单输入 ≠ 会话草稿:面板新增/编辑弹窗内打字不应触发智能卡\n try { if (ae.closest && ae.closest('[data-dsh-prompt-modal]')) return '' } catch (e) { /* ignore */ }\n return ae.value || ''\n }\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.offsetParent !== null) {\n try { if (ta.closest && ta.closest('[data-dsh-prompt-modal]')) continue } catch (e) { /* ignore */ }\n return ta.value || ''\n }\n }\n } catch (e) { /* ignore */ }\n return ''\n}\n\n/** 光标位置:焦点 textarea(value===draft)的 selectionStart,找不到 → 末尾 */\nfunction caretInDraft(draft: string): number {\n try {\n if (typeof document === 'undefined') return draft.length\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === draft && typeof ta.selectionStart === 'number') return ta.selectionStart\n }\n } catch (e) { /* ignore */ }\n return draft.length\n}\n\n/** 智能插入:光标处插入模板正文(不覆盖),光标定位到首字段冒号后;用量+1;抑制卡片重现 */\nexport function smartInsert(body: string, id: string): void {\n const { actions } = getSmartInput()\n if (!actions || typeof actions.setDraft !== 'function') return\n const draft = readActiveDraft()\n const caret = caretInDraft(draft)\n const newDraft = draft.slice(0, caret) + body + draft.slice(caret)\n actions.setDraft(newDraft)\n const fieldCaret = caret + firstFieldCaret(body)\n setTimeout(() => {\n try {\n if (typeof document === 'undefined') return\n const tas = document.querySelectorAll('textarea')\n for (let i = 0; i < tas.length; i++) {\n const ta = tas[i] as HTMLTextAreaElement\n if (ta.value === newDraft) { ta.focus(); ta.setSelectionRange(fieldCaret, fieldCaret); break }\n }\n } catch (e) { /* ignore */ }\n }, 0)\n bumpUsage(id)\n suppressCard(newDraft)\n}\n\nexport function SmartCardHost(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n\n const [enabled, setEnabled] = react.useState(isSmartEnabled())\n const [input, setInput] = react.useState(getSmartInput())\n const [draft, setDraft] = react.useState(readActiveDraft())\n const [pos, setPos] = react.useState<SmartPos | null>(null)\n const [dismissed, setDismissed] = react.useState(false)\n const [manualOpen, setManualOpen] = react.useState(false)\n const [cardH, setCardH] = react.useState(0)\n const posRef = react.useRef<SmartPos | null>(null)\n const cardRef = react.useRef<any>(null)\n const rowsRef = react.useRef<ScoredTemplate[]>([])\n const dragMovedRef = react.useRef(false)\n\n // 订阅输入桥(仅用于 actions/插入)+ 开关变更(设置页实时同步)\n react.useEffect(() => {\n const off1 = onSmartInput(() => setInput(getSmartInput()))\n const off2 = onSmartEnabled((on) => setEnabled(on))\n return () => { off1(); off2() }\n }, [])\n\n // 草稿来源 = 输入框 textarea 真实值(轮询 + focus 事件;与面板插入同源,不依赖 overlay 重渲染)\n react.useEffect(() => {\n const timer = setInterval(() => {\n const d = readActiveDraft()\n setDraft((prev) => (prev === d ? prev : d))\n }, 350)\n const onFocus = () => { setDraft(readActiveDraft()) }\n if (typeof document !== 'undefined') document.addEventListener('focusin', onFocus, true)\n return () => { clearInterval(timer); if (typeof document !== 'undefined') document.removeEventListener('focusin', onFocus, true) }\n }, [])\n\n // 位置:载入记忆(无 → 右下角、输入区上方默认),按圆点尺寸 clamp(圆点可贴近角落)\n react.useEffect(() => {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800\n const saved = loadSmartPos() || { x: 32, y: Math.round(vh * 0.72) }\n const p = clampPos(saved, DOT_SIZE, DOT_SIZE)\n posRef.current = p\n setPos(p)\n }, [])\n const applyPos = (p: SmartPos) => { const c = clampPos(p, DOT_SIZE, DOT_SIZE); posRef.current = c; setPos(c) }\n\n // 用户改动草稿 → 解除「插入后抑制」「Esc 收起」「手动展开」(回到自动出卡行为)\n react.useEffect(() => { clearSuppression(draft); if (dismissed) setDismissed(false); if (manualOpen) setManualOpen(false) }, [draft])\n\n const lang = getLang()\n const t = (k: keyof typeof STR) => tr(lang, STR[k])\n\n const suppressed = isSuppressed(draft)\n const candidates: ScoredTemplate[] = !enabled || suppressed ? [] : smartCandidates(draft)\n // 手动展开且无匹配时:中性常用兜底(预设顺序 ≤3,不按用量——避免\"用过一次就一直冒\")\n const fallbackRows: ScoredTemplate[] = allTemplates().slice(0, 3).map((tpl) => ({ tpl, score: 0, strongHits: [], weakHits: [] }))\n const rows: ScoredTemplate[] = candidates.length > 0 ? candidates : (manualOpen ? fallbackRows : [])\n rowsRef.current = rows\n const showCard = rows.length > 0 && !dismissed\n\n // 测量卡片真实高度(布局后回调):保证卡与圆点贴合,不因估算偏差悬空(hooks 顺序:在 early return 之前)\n react.useEffect(() => {\n if (!showCard) return\n const el = cardRef.current\n if (!el) return\n const h = (el as HTMLElement).offsetHeight || 0\n if (h > 0 && h !== cardH) setCardH(h)\n }, [showCard, rows.length])\n\n // 不捕获键盘:Enter/↑↓ 保持输入框原生语义(用户要求),仅手动点击「点击填入」按钮录入\n\n const doPick = (c: ScoredTemplate) => {\n smartInsert(c.tpl.body, c.tpl.id)\n setDismissed(true); setManualOpen(false)\n }\n\n // 拖动(点/卡头均可):pointer 事件 + 位置记忆;移动过则不算点击\n const startDrag = (e: any) => {\n e.preventDefault(); e.stopPropagation()\n dragMovedRef.current = false\n const base = posRef.current || { x: 0, y: 0 }\n const sx = e.clientX, sy = e.clientY\n const move = (ev: PointerEvent) => { dragMovedRef.current = true; applyPos({ x: base.x + (ev.clientX - sx), y: base.y + (ev.clientY - sy) }) }\n const up = (ev: PointerEvent) => {\n document.removeEventListener('pointermove', move)\n document.removeEventListener('pointerup', up)\n const p = clampPos({ x: base.x + (ev.clientX - sx), y: base.y + (ev.clientY - sy) }, DOT_SIZE, DOT_SIZE)\n posRef.current = p; setPos(p); saveSmartPos(p)\n }\n document.addEventListener('pointermove', move)\n document.addEventListener('pointerup', up)\n }\n\n // 首帧必渲染:pos 尚未从 localStorage 载入时先用默认值(右下角),effect 载入后精确定位\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800\n const effectivePos = pos !== null ? pos : { x: 32, y: Math.round(vh * 0.72) }\n if (!enabled) return null\n\n const base = 'var(--dsw-alias-label-primary)'\n const muted = 'var(--dsw-alias-label-secondary)'\n const dim = 'var(--dsw-alias-label-tertiary)'\n const accent = 'var(--dsw-specific-accent,#f0a45c)'\n const line = '1px solid var(--dsw-alias-border-l1)'\n\n // ── 点(idle 手柄;卡显示时互斥消失)── 还原原设计:12px 次级色低调圆点,点击展开\n const dot = h('div', {\n key: 'dot',\n style: {\n position: 'fixed', left: effectivePos.x, top: effectivePos.y,\n width: DOT_SIZE, height: DOT_SIZE, borderRadius: '50%',\n background: 'var(--dsw-alias-label-tertiary)', opacity: 0.45,\n boxShadow: 'var(--dsw-shadow-lv1)', cursor: 'grab', zIndex: 400, pointerEvents: 'auto',\n userSelect: 'none',\n },\n title: t('smartDot'),\n onPointerDown: startDrag,\n onClick: () => { if (dragMovedRef.current) return; setManualOpen(true); setDismissed(false) },\n })\n\n // ── 卡:从圆点右侧展开(卡左缘 = 圆点右缘,垂直以圆点为中心);用真实高度锚定,贴边自动折返 ──\n const dotX = effectivePos.x, dotY = effectivePos.y\n const cardHeight = cardH > 0 ? cardH : CARD_H_EST\n // 圆点圆心 = 卡片左下角:卡左缘=圆点中心 x、卡底边=圆点中心 y,向 右上 展开\n const dotCx = dotX + DOT_SIZE / 2, dotCy = dotY + DOT_SIZE / 2\n let cardX = dotCx\n if (cardX + CARD_W > vw - 8) cardX = Math.max(8, dotCx - CARD_W) // 右侧放不下 → 向左展开(卡右缘贴圆点中心)\n cardX = Math.max(8, Math.min(cardX, vw - CARD_W - 8))\n let cardY = dotCy - cardHeight\n if (cardY < 8) cardY = 8 // 顶部放不下 → 贴顶(圆点保持在原位)\n cardY = Math.max(8, Math.min(cardY, vh - cardHeight - 8))\n const cardPos = { x: cardX, y: cardY }\n const cardStyle: any = {\n position: 'fixed', left: cardPos.x, top: cardPos.y,\n width: CARD_W, zIndex: 400, pointerEvents: 'auto',\n background: 'var(--dsw-specific-menu)', border: '1px solid var(--dsw-alias-border-inverted)',\n borderRadius: 12, boxShadow: 'var(--dsw-shadow-lv3)',\n display: 'flex', flexDirection: 'column', gap: 6, padding: '8px 10px',\n fontFamily: 'var(--dsw-font-family)', fontSize: 'var(--dsw-font-markdown-base-font-size)', color: base,\n }\n const headStyle: any = { display: 'flex', alignItems: 'center', gap: 4, padding: '4px 10px', borderBottom: line, cursor: 'grab', minWidth: 0 }\n // 行 = 圆角子卡片(原型样式):编号 + 名称 + 标签(·分N/·最近) + 命中词 + 「点击填入」按钮\n // 行 = 精简:编号 + 名称 + 标签 + 命中词 + 小按钮(点整行即填入,控件小而克制)\n const rowStyle: any = {\n display: 'flex', alignItems: 'center', gap: 6, padding: '3px 7px', minWidth: 0,\n background: 'var(--dsw-alias-bg-layer-2)', border: '1px solid var(--dsw-alias-border-l1)',\n borderRadius: 8, cursor: 'pointer', overflow: 'hidden',\n }\n const rowNum: any = { color: dim, fontSize: '0.77em', flex: 'none' }\n const rowName: any = { fontWeight: 500, fontSize: '0.88em', flex: 'none', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 90 }\n const rowTag: any = { color: muted, flex: 'none', fontSize: '0.77em' }\n const rowHint: any = { color: dim, flex: '1 1 auto', minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontSize: '0.77em' }\n const fillBtn: any = {\n flex: 'none', border: '1px solid var(--dsw-alias-border-l2)',\n background: 'var(--dsw-alias-bg-layer-3)', color: base,\n borderRadius: 5, padding: '1px 7px', cursor: 'pointer',\n fontFamily: 'var(--dsw-font-family)', fontSize: '0.8em', fontWeight: 500, whiteSpace: 'nowrap',\n }\n const rowNodes = rows.map((c, i) => {\n const common = c.score === 0\n const domain = (c.tpl as any).domain || (c.tpl as any).tag || ''\n const tagText = (domain ? domain + ' ' : '') + (common ? '·常用' : '·分' + c.score)\n const hits = common ? t('smartCommon') : (c.strongHits.join(' / ') + (c.weakHits.length ? ' · ' + c.weakHits.join(' / ') : ''))\n return h('div', { key: c.tpl.id, style: rowStyle, onClick: () => doPick(c), title: t('smartFill') }, [\n h('span', { style: rowNum }, String(i + 1)),\n h('span', { style: rowName }, c.tpl.name),\n h('span', { style: rowTag }, tagText),\n h('span', { style: rowHint }, hits),\n h('button', { style: fillBtn, title: t('smartFill'), onClick: (e: any) => { e.stopPropagation(); doPick(c) } }, t('smartFill')),\n ])\n })\n const card = h('div', { key: 'card', ref: cardRef, style: cardStyle }, [\n h('div', { style: headStyle, onPointerDown: startDrag }, [\n h('span', { style: { fontWeight: 600, fontSize: '0.85em' } }, t('smartTitle')),\n h('span', { style: { color: dim, fontSize: '0.77em' } }, t('smartHint')),\n h('div', { style: { flex: 1 } }),\n h('button', {\n style: { border: 0, background: 'transparent', color: dim, cursor: 'pointer', fontSize: '0.92em', lineHeight: 1, padding: '0 2px', flex: 'none' },\n title: t('smartDismiss'),\n onPointerDown: (e: any) => e.stopPropagation(),\n onClick: (e: any) => { e.stopPropagation(); setDismissed(true); setManualOpen(false) },\n }, '×'),\n ]),\n h('div', { style: { maxHeight: 220, overflowY: 'auto', overflowX: 'hidden' } }, rowNodes),\n ])\n\n return showCard ? card : dot\n}\n","/**\n * dsh-prompt — client 入口(v1 常规模式 + v1.1 智能模式)\n * 装配:input.left 入口按钮 / input.overlay 面板浮层 / settings.section 配置页(直属设置面板)/ inputTriggers /prompt 触发源(#9)/ shell.overlay 智能悬浮卡(#10)\n */\nimport { getReact, TemplateBrowser, setGoSettingsHandler } from './panel'\nimport { EntryButton } from './button'\nimport { SettingsPage } from './settings'\nimport { buildPromptSource } from './trigger'\nimport { SmartCardHost } from './smart'\nimport { setSmartInput } from './smartstore'\nimport { getLang } from './i18n'\nimport { isPanelOpen, onPanelOpen } from './state'\n\ntype ClientContext = {\n slots: any\n inputTriggers: any\n effect: (fn: () => unknown, key?: string) => unknown\n}\n\nexport const inject = ['slots', 'inputTriggers']\n\n/** 面板浮层(conversation.input.overlay,session 作用域 → 有 useInput/inputActions) */\nfunction PanelHost(props: any): any {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const openState = react.useState(isPanelOpen())\n const open = openState[0]\n react.useEffect(() => { onPanelOpen((v) => openState[1](v)); console.log('[dsh-prompt] PanelHost props:', Object.keys(props), '| useInput?', !!props.useInput, '| inputActions?', !!props.inputActions) }, [])\n // 智能模式桥接:把当前会话输入发布给 shell.overlay 悬浮卡(每次渲染同步,无变化由 setSmartInput 去重)\n react.useEffect(() => {\n let st: any = null\n try { st = props.useInput ? props.useInput((s: any) => s) : null } catch (e) { /* ignore */ }\n setSmartInput({ sessionId: props.sessionId, draft: (st && st.draft) || '', useInput: props.useInput, actions: props.inputActions })\n })\n // 会话卸载 → 清空输入桥(悬浮卡回到纯点状态)\n react.useEffect(() => {\n const sid = props.sessionId\n return () => { if (sid !== undefined) setSmartInput({ draft: '' }) }\n }, [props.sessionId])\n if (!open) return null\n return h(TemplateBrowser, { compact: true, useInput: props.useInput, inputActions: props.inputActions })\n}\n\nexport function apply(ctx: ClientContext): void {\n // 入口按钮(input.left;开合状态跟随面板)\n ctx.effect(() => ctx.slots.inject('conversation.input.left', () =>\n ctx.slots.register({ name: 'conversation.input.left', id: 'dsh-prompt-entry', order: 10, label: () => 'dsh-prompt' },\n (props: any) => {\n const react = getReact()\n if (!react) return null\n const h = react.createElement\n const openState = react.useState(isPanelOpen())\n react.useEffect(() => onPanelOpen((v) => openState[1](v)), [])\n return h(EntryButton, { open: openState[0] })\n }),\n ), 'dsh-prompt: entry')\n\n // 面板浮层\n ctx.effect(() => ctx.slots.inject('conversation.input.overlay', () =>\n ctx.slots.register({ name: 'conversation.input.overlay', id: 'dsh-prompt-panel', order: 2, label: () => 'dsh-prompt panel' }, PanelHost),\n ), 'dsh-prompt: panel')\n\n // 设置页(直属设置面板的配置页,非插件子类):智能开关 + 模板管理\n ctx.effect(() => ctx.slots.inject('settings.section', () =>\n ctx.slots.register({ name: 'settings.section', id: 'dsh-prompt-toolbox', priority: 10, order: 50, label: () => (getLang() === 'zh' ? '提示词模板' : 'Prompt Templates') }, SettingsPage),\n ), 'dsh-prompt: settings')\n\n // 面板「设置 → 模板管理」:当前 v1 关闭面板即可(设置页经 ⚙ → 插件 → dsh-prompt 到达)\n // 面板「设置 → 模板管理」:打开设置面板并选中本插件配置页(宿主无全局 open API → DOM 触发侧栏设置按钮 + 导航项)\n setGoSettingsHandler(() => {\n try {\n if (typeof document === 'undefined') return\n const btns = Array.prototype.slice.call(document.querySelectorAll('button[aria-haspopup=\"dialog\"]')) as HTMLElement[]\n const trig = btns.find((b) => /设置|Settings/.test((b.textContent || '').trim())) || btns[0]\n if (trig) trig.click()\n setTimeout(() => {\n const label = getLang() === 'zh' ? '提示词模板' : 'Prompt Templates'\n const cells = Array.prototype.slice.call(document.querySelectorAll('button')) as HTMLElement[]\n const cell = cells.find((b) => (b.textContent || '').trim() === label)\n if (cell) cell.click()\n }, 150)\n } catch (e) { /* ignore */ }\n })\n\n // /prompt 触发源(#9):列出预制+自定义模板,支持过滤(标签/搜索),选中即插入\n if (ctx.inputTriggers && typeof ctx.inputTriggers.registerSource === 'function') {\n ctx.effect(() => ctx.inputTriggers.registerSource(buildPromptSource()), 'dsh-prompt: /prompt source')\n }\n\n // 智能模式悬浮卡(#10):shell.overlay root 作用域 — 全局单点/自由拖动/仅命中出现\n ctx.effect(() => ctx.slots.inject('shell.overlay', () =>\n ctx.slots.register({ name: 'shell.overlay', id: 'dsh-prompt-smart', order: 200, label: () => 'dsh-prompt smart' }, SmartCardHost),\n ), 'dsh-prompt: smart card')\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-prompt",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "DSH prompt
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "DSH prompt 工具箱:预制 + 自定义 prompt 模板,点击即插入当前对话输入框(v1 常规模式 + v1.1 智能模式悬浮卡) | Prompt toolbox for DeepSeek Harness: preset + custom prompt templates, one-click insert into the conversation.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
7
7
|
"dsh-plugin",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"preset-prompts",
|
|
15
15
|
"ai",
|
|
16
16
|
"llm",
|
|
17
|
-
"
|
|
17
|
+
"toolbox"
|
|
18
18
|
],
|
|
19
19
|
"type": "module",
|
|
20
20
|
"main": "lib/index.js",
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "bash scripts/build.sh",
|
|
33
33
|
"build:client": "tsdown",
|
|
34
|
-
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
34
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
35
|
+
"test:modal": "node scripts/test-modal-remount.cjs"
|
|
35
36
|
},
|
|
36
37
|
"dsh": {
|
|
37
38
|
"bundle": {
|
|
@@ -47,6 +48,8 @@
|
|
|
47
48
|
}
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|
|
51
|
+
"react": "^18.3.1",
|
|
52
|
+
"react-test-renderer": "^18.3.1",
|
|
50
53
|
"tsdown": "^0.22.14",
|
|
51
54
|
"typescript": "^5.9.3",
|
|
52
55
|
"unrun": "^0.3.1"
|