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.
- package/LICENSE +21 -21
- package/README.en.md +278 -227
- package/README.i18n.yaml +2 -2
- package/README.md +278 -227
- package/client/client.js +82 -80
- package/client/client.js.map +1 -1
- package/cordis.patch.yml +8 -8
- package/lib/catalog.js +131 -131
- package/lib/effective.js +161 -158
- package/lib/index.js +943 -943
- package/lib/promotion.js +80 -80
- package/lib/schema.js +124 -124
- package/lib/sectionOps.d.mts +32 -32
- package/lib/sectionOps.mjs +128 -133
- package/lib/store.js +124 -124
- package/lib/vars.js +147 -147
- package/package.json +84 -64
- package/src/client/PresetsTab.tsx +281 -281
- package/src/client/PreviewTab.tsx +91 -91
- package/src/client/PreviewTools.tsx +33 -33
- package/src/client/SectionsTab.tsx +539 -556
- package/src/client/ToolsTab.tsx +293 -266
- package/src/client/index.ts +433 -422
- package/src/client/locales.ts +263 -259
- package/src/client/preset-io.ts +226 -226
- package/src/client/presets.ts +413 -408
- package/src/client/styles.ts +49 -49
- package/src/client/types.ts +128 -128
package/lib/vars.js
CHANGED
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 提示词变量注册 —— 让段文本里的 `{{name}}` 拿到宿主三件套之外的值。
|
|
3
|
-
*
|
|
4
|
-
* 宿主 system-prompt 只由 agent-loop 注册 provider / model / cwd 三个变量,
|
|
5
|
-
* 渲染又是严格模式:引用未注册的名字直接抛错。本模块通过官方扩展点
|
|
6
|
-
* `ctx.systemPrompt.variable(name, provider)` 追加两类变量:
|
|
7
|
-
*
|
|
8
|
-
* 1. 内置系统事实(date / time / hostname / …)——每次装配现算,天然动态;
|
|
9
|
-
* 2. process.env 全量 —— 键名规范化为 `env_<小写>` 后注册,命中黑名单的
|
|
10
|
-
* 键不注册(env 里常有密钥,进了提示词就会随请求发给模型)。
|
|
11
|
-
*
|
|
12
|
-
* 约束来自宿主:变量名必须匹配 /^[a-z][a-z0-9_]*$/;provider 返回 undefined
|
|
13
|
-
* 会让渲染抛错,所以所有 provider 都保证返回字符串;与宿主重名会抛错,
|
|
14
|
-
* 保留字直接跳过(同名注册逐个 try 兜底,别家插件先注册了也只是跳过那一个)。
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import os from 'node:os'
|
|
18
|
-
|
|
19
|
-
/** 与宿主 system-prompt 的 VARIABLE_NAME 完全一致(不满足就不可能注册成功)。 */
|
|
20
|
-
const VARIABLE_NAME = /^[a-z][a-z0-9_]*$/
|
|
21
|
-
|
|
22
|
-
/** agent-loop 已注册的三个名字:重复注册会抛错,永远避开。 */
|
|
23
|
-
const RESERVED = new Set(['provider', 'model', 'cwd'])
|
|
24
|
-
|
|
25
|
-
/** 预填黑名单:常见密钥 / 凭据类环境变量。条目支持 `*` 通配,大小写不敏感。 */
|
|
26
|
-
export const DEFAULT_ENV_BLOCKLIST = [
|
|
27
|
-
'*SECRET*',
|
|
28
|
-
'*TOKEN*',
|
|
29
|
-
'*PASSWORD*',
|
|
30
|
-
'*PASSWD*',
|
|
31
|
-
'*CREDENTIAL*',
|
|
32
|
-
'*API_KEY*',
|
|
33
|
-
'*APIKEY*',
|
|
34
|
-
'*ACCESS_KEY*',
|
|
35
|
-
'*PRIVATE_KEY*',
|
|
36
|
-
'*AUTH*',
|
|
37
|
-
'*_DSN',
|
|
38
|
-
'*CONNECTION_STRING*',
|
|
39
|
-
'DATABASE_URL',
|
|
40
|
-
]
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* 黑名单条目编译成匹配函数:含 `*` 按通配(`*` 匹配任意串),否则整串
|
|
44
|
-
* 精确比较;统一大小写不敏感(env 键多为大写,用户多写小写)。
|
|
45
|
-
*/
|
|
46
|
-
function compileEntries(blocklist) {
|
|
47
|
-
const matchers = []
|
|
48
|
-
for (const entry of Array.isArray(blocklist) ? blocklist : []) {
|
|
49
|
-
if (typeof entry !== 'string') continue
|
|
50
|
-
const text = entry.trim()
|
|
51
|
-
if (text === '') continue
|
|
52
|
-
if (text.includes('*')) {
|
|
53
|
-
const pattern = '^' + text.split('*').map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('.*') + '$'
|
|
54
|
-
let re
|
|
55
|
-
try { re = new RegExp(pattern, 'i') } catch { continue }
|
|
56
|
-
matchers.push((key) => re.test(key))
|
|
57
|
-
} else {
|
|
58
|
-
const lower = text.toLowerCase()
|
|
59
|
-
matchers.push((key) => key.toLowerCase() === lower)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return matchers
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** env 键是否被黑名单挡下(不注册 = 提示词里引用它会得到宿主的「未注册」报错)。 */
|
|
66
|
-
export function isBlockedEnvKey(key, blocklist) {
|
|
67
|
-
return compileEntries(blocklist).some((match) => match(key))
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 把任意 env 键映射为合法变量名:`env_` 前缀 + 小写 + 非法字符归并为 `_`。
|
|
72
|
-
* 例:`PATH` → `env_path`,`USER.NAME` → `env_user_name`。映射结果必然
|
|
73
|
-
* 匹配宿主命名规则;空键返回 undefined。
|
|
74
|
-
*/
|
|
75
|
-
export function envVarName(key) {
|
|
76
|
-
const core = String(key).toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '')
|
|
77
|
-
if (core === '') return undefined
|
|
78
|
-
const name = `env_${core}`
|
|
79
|
-
return VARIABLE_NAME.test(name) ? name : undefined
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** 内置系统事实变量:名字 → 无参提供器(注册时包一层保证返回字符串)。 */
|
|
83
|
-
function builtinProviders() {
|
|
84
|
-
const pad = (n) => String(n).padStart(2, '0')
|
|
85
|
-
const isoDate = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
|
|
86
|
-
const time = (d) => `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
|
|
87
|
-
const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
|
|
88
|
-
return {
|
|
89
|
-
date: () => isoDate(new Date()),
|
|
90
|
-
time: () => time(new Date()),
|
|
91
|
-
datetime: () => { const d = new Date(); return `${isoDate(d)} ${time(d)}` },
|
|
92
|
-
weekday: () => weekdays[new Date().getDay()],
|
|
93
|
-
hostname: () => { try { return os.hostname() } catch { return '' } },
|
|
94
|
-
platform: () => process.platform,
|
|
95
|
-
arch: () => process.arch,
|
|
96
|
-
username: () => { try { return os.userInfo().username } catch { return '' } },
|
|
97
|
-
home: () => { try { return os.homedir() } catch { return '' } },
|
|
98
|
-
shell: () => process.env.SHELL ?? process.env.COMSPEC ?? '',
|
|
99
|
-
locale: () => { try { return Intl.DateTimeFormat().resolvedOptions().locale ?? '' } catch { return '' } },
|
|
100
|
-
node_version: () => process.version,
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** 当前会注册的变量名清单(内置 + 未被黑名单挡下的 env):供清单路由展示。 */
|
|
105
|
-
export function listVariableNames(blocklist) {
|
|
106
|
-
const names = new Set(Object.keys(builtinProviders()))
|
|
107
|
-
const matchers = compileEntries(blocklist)
|
|
108
|
-
const seen = new Set()
|
|
109
|
-
for (const key of Object.keys(process.env)) {
|
|
110
|
-
if (matchers.some((match) => match(key))) continue
|
|
111
|
-
const name = envVarName(key)
|
|
112
|
-
if (name === undefined || seen.has(name)) continue
|
|
113
|
-
seen.add(name)
|
|
114
|
-
names.add(name)
|
|
115
|
-
}
|
|
116
|
-
return [...names].sort()
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* 向宿主注册全部变量,返回注销函数。黑名单变化时由调用方先注销再重注册
|
|
121
|
-
* (见 lib/index.js 的懒同步:装配入口比对签名,配置外改也在下次装配生效)。
|
|
122
|
-
*/
|
|
123
|
-
export function registerVariables(systemPrompt, blocklist) {
|
|
124
|
-
const disposes = []
|
|
125
|
-
const reg = (name, provider) => {
|
|
126
|
-
if (RESERVED.has(name)) return
|
|
127
|
-
try { disposes.push(systemPrompt.variable(name, provider)) } catch { /* 同名已被别处注册:跳过 */ }
|
|
128
|
-
}
|
|
129
|
-
for (const [name, provider] of Object.entries(builtinProviders())) {
|
|
130
|
-
// provider 必须返回字符串:严格渲染把 undefined 当错误。
|
|
131
|
-
reg(name, () => { const value = provider(); return typeof value === 'string' ? value : '' })
|
|
132
|
-
}
|
|
133
|
-
const matchers = compileEntries(blocklist)
|
|
134
|
-
const seen = new Set()
|
|
135
|
-
for (const key of Object.keys(process.env)) {
|
|
136
|
-
if (matchers.some((match) => match(key))) continue
|
|
137
|
-
const name = envVarName(key)
|
|
138
|
-
if (name === undefined || seen.has(name)) continue
|
|
139
|
-
seen.add(name)
|
|
140
|
-
reg(name, () => process.env[key] ?? '')
|
|
141
|
-
}
|
|
142
|
-
return () => {
|
|
143
|
-
for (const dispose of disposes) {
|
|
144
|
-
try { dispose() } catch { /* 注销失败不阻塞其余注销 */ }
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 提示词变量注册 —— 让段文本里的 `{{name}}` 拿到宿主三件套之外的值。
|
|
3
|
+
*
|
|
4
|
+
* 宿主 system-prompt 只由 agent-loop 注册 provider / model / cwd 三个变量,
|
|
5
|
+
* 渲染又是严格模式:引用未注册的名字直接抛错。本模块通过官方扩展点
|
|
6
|
+
* `ctx.systemPrompt.variable(name, provider)` 追加两类变量:
|
|
7
|
+
*
|
|
8
|
+
* 1. 内置系统事实(date / time / hostname / …)——每次装配现算,天然动态;
|
|
9
|
+
* 2. process.env 全量 —— 键名规范化为 `env_<小写>` 后注册,命中黑名单的
|
|
10
|
+
* 键不注册(env 里常有密钥,进了提示词就会随请求发给模型)。
|
|
11
|
+
*
|
|
12
|
+
* 约束来自宿主:变量名必须匹配 /^[a-z][a-z0-9_]*$/;provider 返回 undefined
|
|
13
|
+
* 会让渲染抛错,所以所有 provider 都保证返回字符串;与宿主重名会抛错,
|
|
14
|
+
* 保留字直接跳过(同名注册逐个 try 兜底,别家插件先注册了也只是跳过那一个)。
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import os from 'node:os'
|
|
18
|
+
|
|
19
|
+
/** 与宿主 system-prompt 的 VARIABLE_NAME 完全一致(不满足就不可能注册成功)。 */
|
|
20
|
+
const VARIABLE_NAME = /^[a-z][a-z0-9_]*$/
|
|
21
|
+
|
|
22
|
+
/** agent-loop 已注册的三个名字:重复注册会抛错,永远避开。 */
|
|
23
|
+
const RESERVED = new Set(['provider', 'model', 'cwd'])
|
|
24
|
+
|
|
25
|
+
/** 预填黑名单:常见密钥 / 凭据类环境变量。条目支持 `*` 通配,大小写不敏感。 */
|
|
26
|
+
export const DEFAULT_ENV_BLOCKLIST = [
|
|
27
|
+
'*SECRET*',
|
|
28
|
+
'*TOKEN*',
|
|
29
|
+
'*PASSWORD*',
|
|
30
|
+
'*PASSWD*',
|
|
31
|
+
'*CREDENTIAL*',
|
|
32
|
+
'*API_KEY*',
|
|
33
|
+
'*APIKEY*',
|
|
34
|
+
'*ACCESS_KEY*',
|
|
35
|
+
'*PRIVATE_KEY*',
|
|
36
|
+
'*AUTH*',
|
|
37
|
+
'*_DSN',
|
|
38
|
+
'*CONNECTION_STRING*',
|
|
39
|
+
'DATABASE_URL',
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 黑名单条目编译成匹配函数:含 `*` 按通配(`*` 匹配任意串),否则整串
|
|
44
|
+
* 精确比较;统一大小写不敏感(env 键多为大写,用户多写小写)。
|
|
45
|
+
*/
|
|
46
|
+
function compileEntries(blocklist) {
|
|
47
|
+
const matchers = []
|
|
48
|
+
for (const entry of Array.isArray(blocklist) ? blocklist : []) {
|
|
49
|
+
if (typeof entry !== 'string') continue
|
|
50
|
+
const text = entry.trim()
|
|
51
|
+
if (text === '') continue
|
|
52
|
+
if (text.includes('*')) {
|
|
53
|
+
const pattern = '^' + text.split('*').map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('.*') + '$'
|
|
54
|
+
let re
|
|
55
|
+
try { re = new RegExp(pattern, 'i') } catch { continue }
|
|
56
|
+
matchers.push((key) => re.test(key))
|
|
57
|
+
} else {
|
|
58
|
+
const lower = text.toLowerCase()
|
|
59
|
+
matchers.push((key) => key.toLowerCase() === lower)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return matchers
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** env 键是否被黑名单挡下(不注册 = 提示词里引用它会得到宿主的「未注册」报错)。 */
|
|
66
|
+
export function isBlockedEnvKey(key, blocklist) {
|
|
67
|
+
return compileEntries(blocklist).some((match) => match(key))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 把任意 env 键映射为合法变量名:`env_` 前缀 + 小写 + 非法字符归并为 `_`。
|
|
72
|
+
* 例:`PATH` → `env_path`,`USER.NAME` → `env_user_name`。映射结果必然
|
|
73
|
+
* 匹配宿主命名规则;空键返回 undefined。
|
|
74
|
+
*/
|
|
75
|
+
export function envVarName(key) {
|
|
76
|
+
const core = String(key).toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '')
|
|
77
|
+
if (core === '') return undefined
|
|
78
|
+
const name = `env_${core}`
|
|
79
|
+
return VARIABLE_NAME.test(name) ? name : undefined
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** 内置系统事实变量:名字 → 无参提供器(注册时包一层保证返回字符串)。 */
|
|
83
|
+
function builtinProviders() {
|
|
84
|
+
const pad = (n) => String(n).padStart(2, '0')
|
|
85
|
+
const isoDate = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
|
|
86
|
+
const time = (d) => `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
|
|
87
|
+
const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
|
|
88
|
+
return {
|
|
89
|
+
date: () => isoDate(new Date()),
|
|
90
|
+
time: () => time(new Date()),
|
|
91
|
+
datetime: () => { const d = new Date(); return `${isoDate(d)} ${time(d)}` },
|
|
92
|
+
weekday: () => weekdays[new Date().getDay()],
|
|
93
|
+
hostname: () => { try { return os.hostname() } catch { return '' } },
|
|
94
|
+
platform: () => process.platform,
|
|
95
|
+
arch: () => process.arch,
|
|
96
|
+
username: () => { try { return os.userInfo().username } catch { return '' } },
|
|
97
|
+
home: () => { try { return os.homedir() } catch { return '' } },
|
|
98
|
+
shell: () => process.env.SHELL ?? process.env.COMSPEC ?? '',
|
|
99
|
+
locale: () => { try { return Intl.DateTimeFormat().resolvedOptions().locale ?? '' } catch { return '' } },
|
|
100
|
+
node_version: () => process.version,
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** 当前会注册的变量名清单(内置 + 未被黑名单挡下的 env):供清单路由展示。 */
|
|
105
|
+
export function listVariableNames(blocklist) {
|
|
106
|
+
const names = new Set(Object.keys(builtinProviders()))
|
|
107
|
+
const matchers = compileEntries(blocklist)
|
|
108
|
+
const seen = new Set()
|
|
109
|
+
for (const key of Object.keys(process.env)) {
|
|
110
|
+
if (matchers.some((match) => match(key))) continue
|
|
111
|
+
const name = envVarName(key)
|
|
112
|
+
if (name === undefined || seen.has(name)) continue
|
|
113
|
+
seen.add(name)
|
|
114
|
+
names.add(name)
|
|
115
|
+
}
|
|
116
|
+
return [...names].sort()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 向宿主注册全部变量,返回注销函数。黑名单变化时由调用方先注销再重注册
|
|
121
|
+
* (见 lib/index.js 的懒同步:装配入口比对签名,配置外改也在下次装配生效)。
|
|
122
|
+
*/
|
|
123
|
+
export function registerVariables(systemPrompt, blocklist) {
|
|
124
|
+
const disposes = []
|
|
125
|
+
const reg = (name, provider) => {
|
|
126
|
+
if (RESERVED.has(name)) return
|
|
127
|
+
try { disposes.push(systemPrompt.variable(name, provider)) } catch { /* 同名已被别处注册:跳过 */ }
|
|
128
|
+
}
|
|
129
|
+
for (const [name, provider] of Object.entries(builtinProviders())) {
|
|
130
|
+
// provider 必须返回字符串:严格渲染把 undefined 当错误。
|
|
131
|
+
reg(name, () => { const value = provider(); return typeof value === 'string' ? value : '' })
|
|
132
|
+
}
|
|
133
|
+
const matchers = compileEntries(blocklist)
|
|
134
|
+
const seen = new Set()
|
|
135
|
+
for (const key of Object.keys(process.env)) {
|
|
136
|
+
if (matchers.some((match) => match(key))) continue
|
|
137
|
+
const name = envVarName(key)
|
|
138
|
+
if (name === undefined || seen.has(name)) continue
|
|
139
|
+
seen.add(name)
|
|
140
|
+
reg(name, () => process.env[key] ?? '')
|
|
141
|
+
}
|
|
142
|
+
return () => {
|
|
143
|
+
for (const dispose of disposes) {
|
|
144
|
+
try { dispose() } catch { /* 注销失败不阻塞其余注销 */ }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
package/package.json
CHANGED
|
@@ -1,64 +1,84 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-prompt-customizer",
|
|
3
|
-
"description": "System-prompt & tool customizer for DeepSeek Harness with a settings-panel UI: block / replace / inject prompt sections by name, and hide tools from the model catalog by exclude/include. Config lives in the plugin's own ~/.dsh/prompt-customizer/config.yaml (auto-migrated once from the legacy settings.yaml section).",
|
|
4
|
-
"version": "0.4.
|
|
5
|
-
"type": "module",
|
|
6
|
-
"private": false,
|
|
7
|
-
"main": "lib/index.js",
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
},
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-prompt-customizer",
|
|
3
|
+
"description": "System-prompt & tool customizer for DeepSeek Harness with a settings-panel UI: block / replace / inject prompt sections by name, and hide tools from the model catalog by exclude/include. Config lives in the plugin's own ~/.dsh/prompt-customizer/config.yaml (auto-migrated once from the legacy settings.yaml section).",
|
|
4
|
+
"version": "0.4.2",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"private": false,
|
|
7
|
+
"main": "lib/index.js",
|
|
8
|
+
"author": "DreamsTOF",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"homepage": "https://github.com/DreamsTOF/dsh-prompt-customizer#readme",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/DreamsTOF/dsh-prompt-customizer.git"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/DreamsTOF/dsh-prompt-customizer/issues"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"deepseek",
|
|
20
|
+
"harness",
|
|
21
|
+
"dsh",
|
|
22
|
+
"system-prompt",
|
|
23
|
+
"prompt-engineering",
|
|
24
|
+
"tool-filter",
|
|
25
|
+
"cordis",
|
|
26
|
+
"plugin",
|
|
27
|
+
"agent"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"typecheck": "tsc -p tsconfig.client.json --noEmit",
|
|
31
|
+
"build": "tsdown",
|
|
32
|
+
"test": "node --test",
|
|
33
|
+
"check": "npm run typecheck && npm run build && npm run test",
|
|
34
|
+
"prepack": "npm run build"
|
|
35
|
+
},
|
|
36
|
+
"exports": {
|
|
37
|
+
".": "./lib/index.js",
|
|
38
|
+
"./client": "./client/client.js",
|
|
39
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
40
|
+
"./package.json": "./package.json"
|
|
41
|
+
},
|
|
42
|
+
"dsh": {
|
|
43
|
+
"bundle": {
|
|
44
|
+
"patch": "./cordis.patch.yml"
|
|
45
|
+
},
|
|
46
|
+
"client": {
|
|
47
|
+
"inject": [
|
|
48
|
+
"@deepseek-ai/dsh-client-connection",
|
|
49
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
50
|
+
"@deepseek-ai/dsh-client-locale",
|
|
51
|
+
"@deepseek-ai/dsh-client-ui-settings"
|
|
52
|
+
],
|
|
53
|
+
"platform": "web"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
58
|
+
"@deepseek-ai/dsh-settings": "^0.1.1-rc.2",
|
|
59
|
+
"react": "^18.2.0",
|
|
60
|
+
"react-dom": "^18.2.0"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@deepseek-ai/schemastery": "^3.18.0",
|
|
64
|
+
"yaml": "^2.9.0"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@deepseek-ai/cordis": "4.0.1",
|
|
68
|
+
"@types/react": "~18.3.1",
|
|
69
|
+
"@types/react-dom": "~18.3.1",
|
|
70
|
+
"react": "^18.3.1",
|
|
71
|
+
"react-dom": "~18.3.1",
|
|
72
|
+
"tsdown": "^0.22.14",
|
|
73
|
+
"typescript": "^5.6.0"
|
|
74
|
+
},
|
|
75
|
+
"files": [
|
|
76
|
+
"lib",
|
|
77
|
+
"client",
|
|
78
|
+
"src",
|
|
79
|
+
"cordis.patch.yml"
|
|
80
|
+
],
|
|
81
|
+
"publishConfig": {
|
|
82
|
+
"access": "public"
|
|
83
|
+
}
|
|
84
|
+
}
|