dsh-prompt-customizer 0.4.0 → 0.4.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.
@@ -1,49 +1,49 @@
1
- /** 提示词定制面板各组件共享的内联样式(颜色走半透明灰,随宿主主题自然适配)。 */
2
- export const s = (() => {
3
- const flex = { display: 'flex', alignItems: 'center' }
4
- return {
5
- root: { fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5 },
6
- bar: { ...flex, gap: 6, marginBottom: 8, flexWrap: 'wrap' },
7
- tab: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },
8
- tabActive: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.7)', borderRadius: 6, background: 'rgba(128,128,128,.18)', cursor: 'pointer', color: 'inherit' },
9
- refresh: { marginLeft: 'auto', padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },
10
- list: { display: 'flex', flexDirection: 'column', gap: 6 },
11
- row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },
12
- switchWrap: { ...flex, gap: 6, minWidth: 90 },
13
- rowBody: { flex: 1, minWidth: 0 },
14
- rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },
15
- code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },
16
- orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },
17
- preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
18
- previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', maxHeight: 480, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },
19
- toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },
20
- toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },
21
- badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },
22
- badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },
23
- badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },
24
- badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },
25
- badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },
26
- mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },
27
- arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },
28
- arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },
29
- rowDragging: { opacity: 0.4 },
30
- rowDropAbove: { boxShadow: '0 -2px 0 0 #58a6ff' },
31
- rowDropBelow: { boxShadow: '0 2px 0 0 #58a6ff' },
32
- dragHandle: { cursor: 'grab', color: 'rgba(128,128,128,.7)', fontSize: 13, padding: '0 2px', userSelect: 'none' },
33
- injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },
34
- injectRow: { ...flex, gap: 6 },
35
- editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },
36
- editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },
37
- input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },
38
- // 原生下拉的弹出列表不吃继承色(浅色底 + 继承的浅色字会看不见):
39
- // 用系统色对(Canvas/CanvasText)跟随宿主 color-scheme,深浅主题下都可读。
40
- option: { backgroundColor: 'Canvas', color: 'CanvasText' },
41
- muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },
42
- error: { color: '#f85149', fontSize: 12, marginBottom: 6 },
43
- noticeOk: { color: '#3fb950', fontSize: 12, marginBottom: 6 },
44
- noticeWarn: { color: '#d29922', fontSize: 12, marginBottom: 6 },
45
- groupTitle: { display: 'flex', gap: 8, alignItems: 'baseline', marginTop: 8, marginBottom: 2, color: 'rgba(128,128,128,.9)', fontSize: 12 },
46
- saveBtn: { padding: '4px 12px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },
47
- saveBtnDirty: { padding: '4px 12px', border: '1px solid #d29922', borderRadius: 6, background: 'rgba(210,153,34,.15)', cursor: 'pointer', color: 'inherit' },
48
- }
49
- })()
1
+ /** 提示词定制面板各组件共享的内联样式(颜色走半透明灰,随宿主主题自然适配)。 */
2
+ export const s = (() => {
3
+ const flex = { display: 'flex', alignItems: 'center' }
4
+ return {
5
+ root: { fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5 },
6
+ bar: { ...flex, gap: 6, marginBottom: 8, flexWrap: 'wrap' },
7
+ tab: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },
8
+ tabActive: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.7)', borderRadius: 6, background: 'rgba(128,128,128,.18)', cursor: 'pointer', color: 'inherit' },
9
+ refresh: { marginLeft: 'auto', padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },
10
+ list: { display: 'flex', flexDirection: 'column', gap: 6 },
11
+ row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },
12
+ switchWrap: { ...flex, gap: 6, minWidth: 90 },
13
+ rowBody: { flex: 1, minWidth: 0 },
14
+ rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },
15
+ code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },
16
+ orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },
17
+ preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
18
+ previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', maxHeight: 480, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },
19
+ toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },
20
+ toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },
21
+ badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },
22
+ badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },
23
+ badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },
24
+ badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },
25
+ badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },
26
+ mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },
27
+ arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },
28
+ arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },
29
+ rowDragging: { opacity: 0.4 },
30
+ rowDropAbove: { boxShadow: '0 -2px 0 0 #58a6ff' },
31
+ rowDropBelow: { boxShadow: '0 2px 0 0 #58a6ff' },
32
+ dragHandle: { cursor: 'grab', color: 'rgba(128,128,128,.7)', fontSize: 13, padding: '0 2px', userSelect: 'none' },
33
+ injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },
34
+ injectRow: { ...flex, gap: 6 },
35
+ editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },
36
+ editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },
37
+ input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },
38
+ // 原生下拉的弹出列表不吃继承色(浅色底 + 继承的浅色字会看不见):
39
+ // 用系统色对(Canvas/CanvasText)跟随宿主 color-scheme,深浅主题下都可读。
40
+ option: { backgroundColor: 'Canvas', color: 'CanvasText' },
41
+ muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },
42
+ error: { color: '#f85149', fontSize: 12, marginBottom: 6 },
43
+ noticeOk: { color: '#3fb950', fontSize: 12, marginBottom: 6 },
44
+ noticeWarn: { color: '#d29922', fontSize: 12, marginBottom: 6 },
45
+ groupTitle: { display: 'flex', gap: 8, alignItems: 'baseline', marginTop: 8, marginBottom: 2, color: 'rgba(128,128,128,.9)', fontSize: 12 },
46
+ saveBtn: { padding: '4px 12px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },
47
+ saveBtnDirty: { padding: '4px 12px', border: '1px solid #d29922', borderRadius: 6, background: 'rgba(210,153,34,.15)', cursor: 'pointer', color: 'inherit' },
48
+ }
49
+ })()
@@ -1,128 +1,128 @@
1
- /** 提示词定制面板(客户端)的共享类型定义。 */
2
-
3
- /** 宿主路由返回的清单载荷:当前生效的提示词段与工具目录。 */
4
- export interface Inventory {
5
- sections: Array<{ name: string; order: number; text?: string; active: boolean; replaced: boolean }>
6
- tools: Array<{ name: string; description?: string; hidden: boolean }>
7
- /** false = 预设 scope 未能挂载,清单回退到了全局层。 */
8
- scopeResolved?: boolean
9
- /** 当前已注册的提示词变量名(内置 + 黑名单过滤后的 env),供引用参考。 */
10
- variables?: string[]
11
- }
12
-
13
- /** `/api/prompt-customizer/agent-presets` 返回的一个已安装 agent 预设。 */
14
- export interface AgentPresetInfo {
15
- id: string
16
- name: string
17
- description?: string
18
- /** 非空表示该预设损坏、无法挂载(只读展示)。 */
19
- broken?: string
20
- }
21
-
22
- /** 注入段生效阶段:`always` 恒定;`bootstrap` 仅未晋级;`compaction` 仅压缩后未晋级;`active` 仅晋级后。 */
23
- export type Phase = 'always' | 'bootstrap' | 'active' | 'compaction'
24
-
25
- /** 三阶段名义视图键(预览装配的锚定阅读顺序:引导 → 常驻 → 压缩受控)。
26
- * 三个阶段恒定全部显示 —— 预设没有某个阶段时,该部分就是空的。 */
27
- export type PhaseViewKey = 'bootstrap' | 'compaction' | 'active'
28
-
29
- /**
30
- * 工具过滤配置:三份 exclude 黑名单,一一对应三个阶段,各管各的、互不继承 ——
31
- * 静态 `exclude` 管常驻期(已晋级),`bootstrap` 管引导期(未晋级),
32
- * `compaction` 管压缩受控期(压缩后仍未晋级);空名单 = 该阶段不隐藏任何工具。
33
- * 没有白名单语义:过滤只能收窄装配已经给出的目录,要限制某阶段就逐项 exclude。
34
- */
35
- export interface ToolsConfig {
36
- exclude?: string[]
37
- /** 该阶段要加回来的工具(被裁掉、但注册表里仍有的)。 */
38
- add?: string[]
39
- bootstrap?: { exclude?: string[]; add?: string[] }
40
- compaction?: { exclude?: string[]; add?: string[] }
41
- }
42
-
43
- /** 一份覆盖配置:与全局字段同构。作用于某个 agent 预设 id 时,
44
- * 非空字段整体接管全局默认,空缺 / 空列表回落全局。 */
45
- export interface OverrideData {
46
- sections?: string[]
47
- sectionsBootstrap?: string[]
48
- sectionsCompaction?: string[]
49
- replace?: Record<string, string>
50
- inject?: Array<{ name: string; order: number; text: string; phase?: Phase; custom?: boolean }>
51
- tools?: ToolsConfig
52
- }
53
-
54
- /** 宿主路由返回的最终装配预览载荷。 */
55
- export interface Preview {
56
- ok: boolean
57
- scope?: unknown
58
- /** false = 预设 scope 未能挂载,预览回退到了全局层装配。 */
59
- scopeResolved?: boolean
60
- /** true = 伪会话让某个预设插件抛错,本次预览降级为无会话装配。 */
61
- degraded?: boolean
62
- /** 非空 = 该 scope 有一以 `complete: true` 注册的段(值为段名)整段接管
63
- * 最终提示词:宿主在装配瀑布流**之后**把 sections 还原成那一条段,本插件
64
- * 的段级屏蔽 / 替换 / 注入 / 排序都不会进入模型看到的提示词(工具过滤不受影响)。 */
65
- takenOverBy?: string
66
- /** 非空 = 本插件在该阶段产出的段有若干被下游装配规则丢弃(模型看不到):
67
- * emitted = 我们产出的段数,survived = 最终装配存活的段数。 */
68
- lostSections?: { emitted: number; survived: number; dropped: number }
69
- /** 注册表原始目录总数:与 tools(模型可见目录)形成 presentation 层对照。 */
70
- registryTotal?: number
71
- /** 该 scope 注册表的工具名清单:区分「在本预设里、只是被该阶段裁掉」与
72
- * 「根本不属于本预设(无法加回)」。 */
73
- registryTools?: string[]
74
- sections: Array<{ name: string; text: string }>
75
- text: string
76
- /** 元素可能是对象,也可能是纯字符串工具名(宿主端两种形态都可能出现)。 */
77
- tools: Array<{ name: string; description: string } | string>
78
- /** 预过滤段视图:进入本插件过滤前的段原文 + 该阶段独立屏蔽 / 替换标记
79
- * (提示词 / 工具 / 预览三个 Tab 的统一数据源;被屏蔽项仍在此可反选)。 */
80
- baseSections?: Array<{ name: string; text: string; blocked: boolean; replaced: boolean }>
81
- /** 预过滤工具视图:进入本插件过滤前的工具原文 + 该阶段隐藏标记。 */
82
- baseTools?: Array<{ name: string; description: string; hidden: boolean }>
83
- }
84
-
85
- /** 解析后的命名空间配置对象(即作用域中的 value)。 */
86
- export interface Config {
87
- sections?: string[]
88
- /** 每阶段独立段屏蔽:引导期 / 压缩受控期的额外屏蔽名单(空 = 回落全局)。 */
89
- sectionsBootstrap?: string[]
90
- sectionsCompaction?: string[]
91
- replace?: Record<string, string>
92
- /** custom 为隐藏标记:true 表示本插件注入(可删除),不依赖名字碰撞识别。 */
93
- inject?: Array<{ name: string; order: number; text: string; phase?: Phase; custom?: boolean }>
94
- tools?: ToolsConfig
95
- /** 强制覆盖(默认 true):装配入口重建提示词段,所有预设一律以本插件为准。
96
- * 为 false 时退回瀑布流内过滤(complete 接管 / 预设裁段可能压过定制)。 */
97
- forceSections?: boolean
98
- /** 环境变量黑名单(全局字段):命中的 process.env 键不注册为提示词变量。
99
- * 条目支持 `*` 通配、大小写不敏感;缺省 = 预填的常见密钥类名单。 */
100
- envBlocklist?: string[]
101
- presets?: Preset[]
102
- activePreset?: string
103
- /** 按 agent 预设 id 的字段级覆盖。 */
104
- overrides?: Record<string, OverrideData>
105
- }
106
-
107
- /** 一份完整的定制快照,可保存 / 应用 / 导出导入。 */
108
- export interface Preset {
109
- id: string
110
- name: string
111
- data: PresetData
112
- }
113
-
114
- /** 预设捕获的定制字段(完整快照,含每阶段独立设定)。
115
- * 可选字段一律「缺省 = 旧快照」:应用时旧快照没有的字段保留当前配置不抹掉。 */
116
- export interface PresetData {
117
- sections?: string[]
118
- /** 引导期 / 压缩受控期的额外屏蔽名单(空 = 回落全局)。 */
119
- sectionsBootstrap?: string[]
120
- sectionsCompaction?: string[]
121
- replace?: Record<string, string>
122
- /** 相对顺序:每段记录它应跟随的前一段(after)与所属阶段(phase)。
123
- * 同名而 phase 不同的多条 = 该段在多个阶段各有自己的位置;phase 缺省
124
- * always = 旧快照的单一全局序。 */
125
- order?: Array<{ name: string; after?: string; text: string; custom?: boolean; phase?: Phase }>
126
- /** 除静态 exclude 外,还可带 bootstrap / compaction 阶段目录。 */
127
- tools?: ToolsConfig
128
- }
1
+ /** 提示词定制面板(客户端)的共享类型定义。 */
2
+
3
+ /** 宿主路由返回的清单载荷:当前生效的提示词段与工具目录。 */
4
+ export interface Inventory {
5
+ sections: Array<{ name: string; order: number; text?: string; active: boolean; replaced: boolean }>
6
+ tools: Array<{ name: string; description?: string; hidden: boolean }>
7
+ /** false = 预设 scope 未能挂载,清单回退到了全局层。 */
8
+ scopeResolved?: boolean
9
+ /** 当前已注册的提示词变量名(内置 + 黑名单过滤后的 env),供引用参考。 */
10
+ variables?: string[]
11
+ }
12
+
13
+ /** `/api/prompt-customizer/agent-presets` 返回的一个已安装 agent 预设。 */
14
+ export interface AgentPresetInfo {
15
+ id: string
16
+ name: string
17
+ description?: string
18
+ /** 非空表示该预设损坏、无法挂载(只读展示)。 */
19
+ broken?: string
20
+ }
21
+
22
+ /** 注入段生效阶段:`always` 恒定;`bootstrap` 仅未晋级;`compaction` 仅压缩后未晋级;`active` 仅晋级后。 */
23
+ export type Phase = 'always' | 'bootstrap' | 'active' | 'compaction'
24
+
25
+ /** 三阶段名义视图键(预览装配的锚定阅读顺序:引导 → 常驻 → 压缩受控)。
26
+ * 三个阶段恒定全部显示 —— 预设没有某个阶段时,该部分就是空的。 */
27
+ export type PhaseViewKey = 'bootstrap' | 'compaction' | 'active'
28
+
29
+ /**
30
+ * 工具过滤配置:三份 exclude 黑名单,一一对应三个阶段,各管各的、互不继承 ——
31
+ * 静态 `exclude` 管常驻期(已晋级),`bootstrap` 管引导期(未晋级),
32
+ * `compaction` 管压缩受控期(压缩后仍未晋级);空名单 = 该阶段不隐藏任何工具。
33
+ * 没有白名单语义:过滤只能收窄装配已经给出的目录,要限制某阶段就逐项 exclude。
34
+ */
35
+ export interface ToolsConfig {
36
+ exclude?: string[]
37
+ /** 该阶段要加回来的工具(被裁掉、但注册表里仍有的)。 */
38
+ add?: string[]
39
+ bootstrap?: { exclude?: string[]; add?: string[] }
40
+ compaction?: { exclude?: string[]; add?: string[] }
41
+ }
42
+
43
+ /** 一份覆盖配置:与全局字段同构。作用于某个 agent 预设 id 时,
44
+ * 非空字段整体接管全局默认,空缺 / 空列表回落全局。 */
45
+ export interface OverrideData {
46
+ sections?: string[]
47
+ sectionsBootstrap?: string[]
48
+ sectionsCompaction?: string[]
49
+ replace?: Record<string, string>
50
+ inject?: Array<{ name: string; order: number; text: string; phase?: Phase; custom?: boolean }>
51
+ tools?: ToolsConfig
52
+ }
53
+
54
+ /** 宿主路由返回的最终装配预览载荷。 */
55
+ export interface Preview {
56
+ ok: boolean
57
+ scope?: unknown
58
+ /** false = 预设 scope 未能挂载,预览回退到了全局层装配。 */
59
+ scopeResolved?: boolean
60
+ /** true = 伪会话让某个预设插件抛错,本次预览降级为无会话装配。 */
61
+ degraded?: boolean
62
+ /** 非空 = 该 scope 有一以 `complete: true` 注册的段(值为段名)整段接管
63
+ * 最终提示词:宿主在装配瀑布流**之后**把 sections 还原成那一条段,本插件
64
+ * 的段级屏蔽 / 替换 / 注入 / 排序都不会进入模型看到的提示词(工具过滤不受影响)。 */
65
+ takenOverBy?: string
66
+ /** 非空 = 本插件在该阶段产出的段有若干被下游装配规则丢弃(模型看不到):
67
+ * emitted = 我们产出的段数,survived = 最终装配存活的段数。 */
68
+ lostSections?: { emitted: number; survived: number; dropped: number }
69
+ /** 注册表原始目录总数:与 tools(模型可见目录)形成 presentation 层对照。 */
70
+ registryTotal?: number
71
+ /** 该 scope 注册表的工具名清单:区分「在本预设里、只是被该阶段裁掉」与
72
+ * 「根本不属于本预设(无法加回)」。 */
73
+ registryTools?: string[]
74
+ sections: Array<{ name: string; text: string }>
75
+ text: string
76
+ /** 元素可能是对象,也可能是纯字符串工具名(宿主端两种形态都可能出现)。 */
77
+ tools: Array<{ name: string; description: string } | string>
78
+ /** 预过滤段视图:进入本插件过滤前的段原文 + 该阶段独立屏蔽 / 替换标记
79
+ * (提示词 / 工具 / 预览三个 Tab 的统一数据源;被屏蔽项仍在此可反选)。 */
80
+ baseSections?: Array<{ name: string; text: string; blocked: boolean; replaced: boolean }>
81
+ /** 预过滤工具视图:进入本插件过滤前的工具原文 + 该阶段隐藏标记。 */
82
+ baseTools?: Array<{ name: string; description: string; hidden: boolean }>
83
+ }
84
+
85
+ /** 解析后的命名空间配置对象(即作用域中的 value)。 */
86
+ export interface Config {
87
+ sections?: string[]
88
+ /** 每阶段独立段屏蔽:引导期 / 压缩受控期各自的屏蔽名单(与常驻期互不影响)。 */
89
+ sectionsBootstrap?: string[]
90
+ sectionsCompaction?: string[]
91
+ replace?: Record<string, string>
92
+ /** custom 为隐藏标记:true 表示本插件注入(可删除),不依赖名字碰撞识别。 */
93
+ inject?: Array<{ name: string; order: number; text: string; phase?: Phase; custom?: boolean }>
94
+ tools?: ToolsConfig
95
+ /** 强制覆盖(默认 true):装配入口重建提示词段,所有预设一律以本插件为准。
96
+ * 为 false 时退回瀑布流内过滤(complete 接管 / 预设裁段可能压过定制)。 */
97
+ forceSections?: boolean
98
+ /** 环境变量黑名单(全局字段):命中的 process.env 键不注册为提示词变量。
99
+ * 条目支持 `*` 通配、大小写不敏感;缺省 = 预填的常见密钥类名单。 */
100
+ envBlocklist?: string[]
101
+ presets?: Preset[]
102
+ activePreset?: string
103
+ /** 按 agent 预设 id 的字段级覆盖。 */
104
+ overrides?: Record<string, OverrideData>
105
+ }
106
+
107
+ /** 一份完整的定制快照,可保存 / 应用 / 导出导入。 */
108
+ export interface Preset {
109
+ id: string
110
+ name: string
111
+ data: PresetData
112
+ }
113
+
114
+ /** 预设捕获的定制字段(完整快照,含每阶段独立设定)。
115
+ * 可选字段一律「缺省 = 旧快照」:应用时旧快照没有的字段保留当前配置不抹掉。 */
116
+ export interface PresetData {
117
+ sections?: string[]
118
+ /** 引导期 / 压缩受控期各自的屏蔽名单(与常驻期互不影响)。 */
119
+ sectionsBootstrap?: string[]
120
+ sectionsCompaction?: string[]
121
+ replace?: Record<string, string>
122
+ /** 相对顺序:每段记录它应跟随的前一段(after)与所属阶段(phase)。
123
+ * 同名而 phase 不同的多条 = 该段在多个阶段各有自己的位置;phase 缺省
124
+ * always = 旧快照的单一全局序。 */
125
+ order?: Array<{ name: string; after?: string; text: string; custom?: boolean; phase?: Phase }>
126
+ /** 除静态 exclude 外,还可带 bootstrap / compaction 阶段目录。 */
127
+ tools?: ToolsConfig
128
+ }