dsh-plugin-prompt-tool 0.1.0 → 0.1.1
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 +3 -2
- package/lib/client.js +24 -0
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +3 -0
- package/lib/index.mjs +12 -3
- package/lib/preset-core.d.mts +2 -0
- package/lib/preset-core.mjs +12 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,7 +52,7 @@ pnpm build # 重建插件
|
|
|
52
52
|
|
|
53
53
|
在 Settings → 插件 → **插件配置**分区注册「提示词工具」可折叠卡片(`settings.plugin.item`,与其他插件卡片同款式),展开后提供:
|
|
54
54
|
|
|
55
|
-
-
|
|
55
|
+
- **注入开关**:注入 prompt.md(`injectPrompt`)、首轮独立锚定轮(`anchorFirstTurn`)、锚定句文本(`anchorText`,可自定义)、写入 `~/.dsh/AGENTS.md`(`writeAgents`)、生成锚定注入 preset(`writePreset`)
|
|
56
56
|
- **保存 / 还原**:把编辑框内容与全部开关写入 `prompt-tool` settings 命名空间(未保存时头部显示"未保存"标记,可一键还原草稿);Host 监听后写回 `prompt.md`、按开关刷新 `~/.dsh/AGENTS.md` 与 preset,下一次请求即生效
|
|
57
57
|
- **打开编辑**:用系统编辑器打开 `prompt.md`
|
|
58
58
|
- **在线编辑框**:直接编辑 `prompt.md` 文本
|
|
@@ -158,11 +158,12 @@ dsh --profile prompt-tool --patch <cordis.yml>
|
|
|
158
158
|
text: '' # 可选:覆盖 prompt.md 文本(默认读文件)
|
|
159
159
|
writeAgents: true # 是否写 ~/.dsh/AGENTS.md(默认 true)
|
|
160
160
|
writePreset: true # 是否生成锚定注入 preset(默认 true)
|
|
161
|
+
injectPrompt: true # 锚定确认后是否注入 prompt.md(默认 true;关闭只保留工具引导)
|
|
161
162
|
anchorFirstTurn: false # 首轮独立锚定轮开关(默认关闭)
|
|
162
163
|
anchorText: "You are a helpful software assistant.\n\nBegin every reasoning block with 'We need'." # 锚定句文本
|
|
163
164
|
```
|
|
164
165
|
|
|
165
|
-
config 字段:`text`(覆盖 `prompt.md` 文本,默认读文件)、`writeAgents`(是否写 `~/.dsh/AGENTS.md`,默认 true)、`writePreset`(是否生成 `~/.dsh/.agent-presets/prompt-tool/`,默认 true
|
|
166
|
+
config 字段:`text`(覆盖 `prompt.md` 文本,默认读文件)、`writeAgents`(是否写 `~/.dsh/AGENTS.md`,默认 true)、`writePreset`(是否生成 `~/.dsh/.agent-presets/prompt-tool/`,默认 true)、`injectPrompt`(锚定确认后是否注入 `prompt.md`,默认 true)。三个写入/注入开关相互独立:关闭 `injectPrompt` 后首轮工具引导与 resident 目录照常,但不会注册 `prompt-injector` 行、不会向会话注入 `prompt.md`。
|
|
166
167
|
|
|
167
168
|
`anchorFirstTurn`(默认 false)开启后,preset 额外挂载 `turn-anchor.mjs`:会话首个真实用户消息先原样入 `agent.inbox` 的 `next-step`,首步只把 `anchorText` 作为独立输入发给模型;模型回应锚定句后,driver 在同一轮内自动消费任务继续执行。任务绝不丢失:inbox 入队失败时回退为原样直发。
|
|
168
169
|
|
package/lib/client.js
CHANGED
|
@@ -68,6 +68,7 @@ window.__ModuleLoader__.load({
|
|
|
68
68
|
promptPath: "",
|
|
69
69
|
anchorFirstTurn: false,
|
|
70
70
|
anchorText: "",
|
|
71
|
+
injectPrompt: true,
|
|
71
72
|
writeAgents: true,
|
|
72
73
|
writePreset: true
|
|
73
74
|
};
|
|
@@ -104,6 +105,7 @@ window.__ModuleLoader__.load({
|
|
|
104
105
|
promptPath: ns.value?.promptPath ?? "",
|
|
105
106
|
anchorFirstTurn: ns.value?.anchorFirstTurn ?? false,
|
|
106
107
|
anchorText: ns.value?.anchorText ?? "",
|
|
108
|
+
injectPrompt: ns.value?.injectPrompt ?? true,
|
|
107
109
|
writeAgents: ns.value?.writeAgents ?? true,
|
|
108
110
|
writePreset: ns.value?.writePreset ?? true
|
|
109
111
|
};
|
|
@@ -176,6 +178,11 @@ window.__ModuleLoader__.load({
|
|
|
176
178
|
path: ["anchorText"],
|
|
177
179
|
value: fields.anchorText
|
|
178
180
|
},
|
|
181
|
+
{
|
|
182
|
+
op: "set",
|
|
183
|
+
path: ["injectPrompt"],
|
|
184
|
+
value: fields.injectPrompt
|
|
185
|
+
},
|
|
179
186
|
{
|
|
180
187
|
op: "set",
|
|
181
188
|
path: ["writeAgents"],
|
|
@@ -244,6 +251,23 @@ window.__ModuleLoader__.load({
|
|
|
244
251
|
className: PromptEditor_module_css_default.groupTitle,
|
|
245
252
|
children: "注入开关"
|
|
246
253
|
}),
|
|
254
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
255
|
+
className: PromptEditor_module_css_default.row,
|
|
256
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
257
|
+
type: "checkbox",
|
|
258
|
+
checked: fields.injectPrompt,
|
|
259
|
+
onChange: () => toggle("injectPrompt")
|
|
260
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
261
|
+
className: PromptEditor_module_css_default.rowText,
|
|
262
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
263
|
+
className: PromptEditor_module_css_default.rowName,
|
|
264
|
+
children: "注入 prompt.md 提示词"
|
|
265
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
266
|
+
className: PromptEditor_module_css_default.rowDesc,
|
|
267
|
+
children: "关闭后保留首轮工具引导,但不向会话注入 prompt.md"
|
|
268
|
+
})]
|
|
269
|
+
})]
|
|
270
|
+
}),
|
|
247
271
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
248
272
|
className: PromptEditor_module_css_default.row,
|
|
249
273
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["useState","useCallback","styles","IconChevronDownOutline14"],"sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/PromptEditor.tsx","../src/client/index.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { useCallback, useState } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptEditor.module.css'\n\nconst NS = 'prompt-tool'\n\nexport interface PromptEditorInjected {\n api: any\n}\n\ninterface Fields {\n promptText: string\n promptPath: string\n anchorFirstTurn: boolean\n anchorText: string\n writeAgents: boolean\n writePreset: boolean\n}\n\nconst EMPTY: Fields = {\n promptText: '',\n promptPath: '',\n anchorFirstTurn: false,\n anchorText: '',\n writeAgents: true,\n writePreset: true,\n}\n\nexport function PromptEditor(props: PromptEditorInjected): any {\n const { api } = props\n const [open, setOpen] = useState(false)\n const [loaded, setLoaded] = useState(false)\n const [fields, setFields] = useState<Fields>(EMPTY)\n const [saved, setSaved] = useState<string | undefined>(undefined)\n const [revision, setRevision] = useState<number | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n const [saving, setSaving] = useState(false)\n const [notice, setNotice] = useState('')\n const [noticeKind, setNoticeKind] = useState<'ok' | 'error'>('ok')\n\n const showNotice = useCallback((kind: 'ok' | 'error', message: string) => {\n setNotice(message)\n setNoticeKind(kind)\n }, [])\n\n const load = useCallback(async () => {\n setLoading(true)\n try {\n const res = await api.settings.describe({})\n if (!res.result.ok) { showNotice('error', '读取配置失败'); return }\n const ns = res.result.value.namespaces.find((n: any) => n.ns === NS)\n if (!ns) { showNotice('error', '未找到提示词工具配置'); return }\n const next: Fields = {\n promptText: ns.value?.promptText ?? '',\n promptPath: ns.value?.promptPath ?? '',\n anchorFirstTurn: ns.value?.anchorFirstTurn ?? false,\n anchorText: ns.value?.anchorText ?? '',\n writeAgents: ns.value?.writeAgents ?? true,\n writePreset: ns.value?.writePreset ?? true,\n }\n setFields(next)\n setSaved(JSON.stringify(next))\n setRevision(ns.revision)\n setNotice('')\n } catch (e: any) {\n showNotice('error', '读取失败:' + (e?.message ?? e))\n } finally {\n setLoading(false)\n }\n }, [api, showNotice])\n\n const refreshRevision = useCallback(async () => {\n try {\n const res = await api.settings.describe({})\n if (!res.result.ok) return\n const ns = res.result.value.namespaces.find((n: any) => n.ns === NS)\n if (ns) setRevision(ns.revision)\n } catch {\n // 刷新失败保持原 revision,用户可重试。\n }\n }, [api])\n\n const patch = (partial: Partial<Fields>) => setFields((prev) => ({ ...prev, ...partial }))\n\n const toggleOpen = () => {\n const next = !open\n setOpen(next)\n if (!next) return\n if (!loaded) {\n setLoaded(true)\n void load()\n } else if (!dirty) {\n // 无未保存草稿时,每次展开同步最新 settings(其他客户端可能已修改)。\n void load()\n }\n }\n\n const discard = () => {\n void load()\n }\n\n const openEdit = async () => {\n if (!fields.promptPath) { showNotice('error', '路径未知,请先保存一次或在下方直接编辑'); return }\n try {\n const res = await api.host.openPath({ path: fields.promptPath })\n if (res.result.ok) showNotice('ok', '已用系统编辑器打开 prompt.md')\n else showNotice('error', '打开失败:' + (res.result.error?.message ?? '') + ';可直接在下方编辑框保存')\n } catch (e: any) {\n showNotice('error', '打开失败:' + (e?.message ?? e) + ';可直接在下方编辑框保存')\n }\n }\n\n const save = async () => {\n if (saving) return\n setSaving(true)\n try {\n const res = await api.settings.mutate({\n ns: NS,\n ops: [\n { op: 'set', path: ['promptText'], value: fields.promptText },\n { op: 'set', path: ['anchorFirstTurn'], value: fields.anchorFirstTurn },\n { op: 'set', path: ['anchorText'], value: fields.anchorText },\n { op: 'set', path: ['writeAgents'], value: fields.writeAgents },\n { op: 'set', path: ['writePreset'], value: fields.writePreset },\n ],\n expectedRevision: revision,\n })\n if (res.result.ok) {\n setRevision(res.result.value.revision)\n setSaved(JSON.stringify(fields))\n showNotice('ok', '已保存并生效')\n } else {\n await refreshRevision()\n showNotice('error', '保存失败:' + (res.result.error?.message ?? '') + '(已刷新配置版本,可重试)')\n }\n } catch (e: any) {\n await refreshRevision()\n showNotice('error', '保存失败:' + (e?.message ?? e) + '(已刷新配置版本,可重试)')\n } finally {\n setSaving(false)\n }\n }\n\n const toggle = (key: 'anchorFirstTurn' | 'writeAgents' | 'writePreset') =>\n patch({ [key]: !fields[key] })\n\n const dirty = saved !== undefined && JSON.stringify(fields) !== saved\n\n return (\n <li className={clsx(styles.card, open && styles.cardOpen)}>\n <button type=\"button\" className={styles.header} aria-expanded={open} onClick={toggleOpen}>\n <span className={styles.headText}>\n <span className={styles.name}>提示词工具</span>\n <span className={styles.description}>编辑模型行为规范 prompt.md 与注入开关,保存后自动生效</span>\n </span>\n {dirty && <span className={styles.pending}>未保存</span>}\n <IconChevronDownOutline14 className={clsx(styles.chevron, open && styles.chevronOpen)} />\n </button>\n {open && (\n <div className={styles.body}>\n {loading && <span className={styles.loading}>正在读取配置…</span>}\n\n <div className={styles.group}>\n <span className={styles.groupTitle}>注入开关</span>\n <label className={styles.row}>\n <input\n type=\"checkbox\"\n checked={fields.anchorFirstTurn}\n onChange={() => toggle('anchorFirstTurn')}\n />\n <span className={styles.rowText}>\n <span className={styles.rowName}>首轮独立锚定轮</span>\n <span className={styles.rowDesc}>首个用户消息先入 next-step,首步只发锚定句</span>\n </span>\n </label>\n <label className={clsx(styles.rowStack, !fields.anchorFirstTurn && styles.rowDisabled)}>\n <span className={styles.rowText}>\n <span className={styles.rowName}>锚定句文本(可自定义)</span>\n <span className={styles.rowDesc}>独立锚定轮发给模型的输入内容</span>\n </span>\n <textarea\n className={styles.anchorInput}\n value={fields.anchorText}\n disabled={!fields.anchorFirstTurn}\n onChange={(e) => patch({ anchorText: e.target.value })}\n spellCheck={false}\n />\n </label>\n <label className={styles.row}>\n <input\n type=\"checkbox\"\n checked={fields.writeAgents}\n onChange={() => toggle('writeAgents')}\n />\n <span className={styles.rowText}>\n <span className={styles.rowName}>写入 ~/.dsh/AGENTS.md</span>\n <span className={styles.rowDesc}>常驻层规则(默认开启)</span>\n </span>\n </label>\n <label className={styles.row}>\n <input\n type=\"checkbox\"\n checked={fields.writePreset}\n onChange={() => toggle('writePreset')}\n />\n <span className={styles.rowText}>\n <span className={styles.rowName}>生成锚定注入 preset</span>\n <span className={styles.rowDesc}>prompt.md 注入与首轮工具引导(默认开启)</span>\n </span>\n </label>\n </div>\n\n <div className={styles.group}>\n <span className={styles.groupTitle}>prompt.md 内容</span>\n <textarea\n className={styles.textarea}\n aria-label=\"prompt.md 内容\"\n value={fields.promptText}\n onChange={(e) => patch({ promptText: e.target.value })}\n spellCheck={false}\n />\n </div>\n\n <div className={styles.actions}>\n <button type=\"button\" className={styles.primary} disabled={saving || !dirty} onClick={save}>{saving ? '保存中…' : '保存'}</button>\n <button type=\"button\" className={styles.secondary} disabled={!dirty} onClick={discard}>还原</button>\n <button type=\"button\" className={styles.secondary} onClick={openEdit}>打开编辑</button>\n {notice && <span className={clsx(styles.notice, noticeKind === 'error' && styles.noticeError)}>{notice}</span>}\n </div>\n </div>\n )}\n </li>\n )\n}\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport { PromptEditor, type PromptEditorInjected } from './PromptEditor.tsx'\n\nexport const inject = ['slots', 'connection']\n\nexport function apply(ctx: ClientContext): void {\n const connection = ctx.get('connection') as ConnectionHandle\n\n const injected = (): PromptEditorInjected => ({\n api: connection.api,\n })\n\n ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({\n name: 'settings.plugin.item',\n id: 'prompt-tool',\n order: 30,\n inject: injected,\n }, PromptEditor as any))\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["useState","useCallback","styles","IconChevronDownOutline14"],"sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/PromptEditor.tsx","../src/client/index.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { useCallback, useState } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptEditor.module.css'\n\nconst NS = 'prompt-tool'\n\nexport interface PromptEditorInjected {\n api: any\n}\n\ninterface Fields {\n promptText: string\n promptPath: string\n anchorFirstTurn: boolean\n anchorText: string\n injectPrompt: boolean\n writeAgents: boolean\n writePreset: boolean\n}\n\nconst EMPTY: Fields = {\n promptText: '',\n promptPath: '',\n anchorFirstTurn: false,\n anchorText: '',\n injectPrompt: true,\n writeAgents: true,\n writePreset: true,\n}\n\nexport function PromptEditor(props: PromptEditorInjected): any {\n const { api } = props\n const [open, setOpen] = useState(false)\n const [loaded, setLoaded] = useState(false)\n const [fields, setFields] = useState<Fields>(EMPTY)\n const [saved, setSaved] = useState<string | undefined>(undefined)\n const [revision, setRevision] = useState<number | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n const [saving, setSaving] = useState(false)\n const [notice, setNotice] = useState('')\n const [noticeKind, setNoticeKind] = useState<'ok' | 'error'>('ok')\n\n const showNotice = useCallback((kind: 'ok' | 'error', message: string) => {\n setNotice(message)\n setNoticeKind(kind)\n }, [])\n\n const load = useCallback(async () => {\n setLoading(true)\n try {\n const res = await api.settings.describe({})\n if (!res.result.ok) { showNotice('error', '读取配置失败'); return }\n const ns = res.result.value.namespaces.find((n: any) => n.ns === NS)\n if (!ns) { showNotice('error', '未找到提示词工具配置'); return }\n const next: Fields = {\n promptText: ns.value?.promptText ?? '',\n promptPath: ns.value?.promptPath ?? '',\n anchorFirstTurn: ns.value?.anchorFirstTurn ?? false,\n anchorText: ns.value?.anchorText ?? '',\n injectPrompt: ns.value?.injectPrompt ?? true,\n writeAgents: ns.value?.writeAgents ?? true,\n writePreset: ns.value?.writePreset ?? true,\n }\n setFields(next)\n setSaved(JSON.stringify(next))\n setRevision(ns.revision)\n setNotice('')\n } catch (e: any) {\n showNotice('error', '读取失败:' + (e?.message ?? e))\n } finally {\n setLoading(false)\n }\n }, [api, showNotice])\n\n const refreshRevision = useCallback(async () => {\n try {\n const res = await api.settings.describe({})\n if (!res.result.ok) return\n const ns = res.result.value.namespaces.find((n: any) => n.ns === NS)\n if (ns) setRevision(ns.revision)\n } catch {\n // 刷新失败保持原 revision,用户可重试。\n }\n }, [api])\n\n const patch = (partial: Partial<Fields>) => setFields((prev) => ({ ...prev, ...partial }))\n\n const toggleOpen = () => {\n const next = !open\n setOpen(next)\n if (!next) return\n if (!loaded) {\n setLoaded(true)\n void load()\n } else if (!dirty) {\n // 无未保存草稿时,每次展开同步最新 settings(其他客户端可能已修改)。\n void load()\n }\n }\n\n const discard = () => {\n void load()\n }\n\n const openEdit = async () => {\n if (!fields.promptPath) { showNotice('error', '路径未知,请先保存一次或在下方直接编辑'); return }\n try {\n const res = await api.host.openPath({ path: fields.promptPath })\n if (res.result.ok) showNotice('ok', '已用系统编辑器打开 prompt.md')\n else showNotice('error', '打开失败:' + (res.result.error?.message ?? '') + ';可直接在下方编辑框保存')\n } catch (e: any) {\n showNotice('error', '打开失败:' + (e?.message ?? e) + ';可直接在下方编辑框保存')\n }\n }\n\n const save = async () => {\n if (saving) return\n setSaving(true)\n try {\n const res = await api.settings.mutate({\n ns: NS,\n ops: [\n { op: 'set', path: ['promptText'], value: fields.promptText },\n { op: 'set', path: ['anchorFirstTurn'], value: fields.anchorFirstTurn },\n { op: 'set', path: ['anchorText'], value: fields.anchorText },\n { op: 'set', path: ['injectPrompt'], value: fields.injectPrompt },\n { op: 'set', path: ['writeAgents'], value: fields.writeAgents },\n { op: 'set', path: ['writePreset'], value: fields.writePreset },\n ],\n expectedRevision: revision,\n })\n if (res.result.ok) {\n setRevision(res.result.value.revision)\n setSaved(JSON.stringify(fields))\n showNotice('ok', '已保存并生效')\n } else {\n await refreshRevision()\n showNotice('error', '保存失败:' + (res.result.error?.message ?? '') + '(已刷新配置版本,可重试)')\n }\n } catch (e: any) {\n await refreshRevision()\n showNotice('error', '保存失败:' + (e?.message ?? e) + '(已刷新配置版本,可重试)')\n } finally {\n setSaving(false)\n }\n }\n\n const toggle = (key: 'anchorFirstTurn' | 'injectPrompt' | 'writeAgents' | 'writePreset') =>\n patch({ [key]: !fields[key] })\n\n const dirty = saved !== undefined && JSON.stringify(fields) !== saved\n\n return (\n <li className={clsx(styles.card, open && styles.cardOpen)}>\n <button type=\"button\" className={styles.header} aria-expanded={open} onClick={toggleOpen}>\n <span className={styles.headText}>\n <span className={styles.name}>提示词工具</span>\n <span className={styles.description}>编辑模型行为规范 prompt.md 与注入开关,保存后自动生效</span>\n </span>\n {dirty && <span className={styles.pending}>未保存</span>}\n <IconChevronDownOutline14 className={clsx(styles.chevron, open && styles.chevronOpen)} />\n </button>\n {open && (\n <div className={styles.body}>\n {loading && <span className={styles.loading}>正在读取配置…</span>}\n\n <div className={styles.group}>\n <span className={styles.groupTitle}>注入开关</span>\n <label className={styles.row}>\n <input\n type=\"checkbox\"\n checked={fields.injectPrompt}\n onChange={() => toggle('injectPrompt')}\n />\n <span className={styles.rowText}>\n <span className={styles.rowName}>注入 prompt.md 提示词</span>\n <span className={styles.rowDesc}>关闭后保留首轮工具引导,但不向会话注入 prompt.md</span>\n </span>\n </label>\n <label className={styles.row}>\n <input\n type=\"checkbox\"\n checked={fields.anchorFirstTurn}\n onChange={() => toggle('anchorFirstTurn')}\n />\n <span className={styles.rowText}>\n <span className={styles.rowName}>首轮独立锚定轮</span>\n <span className={styles.rowDesc}>首个用户消息先入 next-step,首步只发锚定句</span>\n </span>\n </label>\n <label className={clsx(styles.rowStack, !fields.anchorFirstTurn && styles.rowDisabled)}>\n <span className={styles.rowText}>\n <span className={styles.rowName}>锚定句文本(可自定义)</span>\n <span className={styles.rowDesc}>独立锚定轮发给模型的输入内容</span>\n </span>\n <textarea\n className={styles.anchorInput}\n value={fields.anchorText}\n disabled={!fields.anchorFirstTurn}\n onChange={(e) => patch({ anchorText: e.target.value })}\n spellCheck={false}\n />\n </label>\n <label className={styles.row}>\n <input\n type=\"checkbox\"\n checked={fields.writeAgents}\n onChange={() => toggle('writeAgents')}\n />\n <span className={styles.rowText}>\n <span className={styles.rowName}>写入 ~/.dsh/AGENTS.md</span>\n <span className={styles.rowDesc}>常驻层规则(默认开启)</span>\n </span>\n </label>\n <label className={styles.row}>\n <input\n type=\"checkbox\"\n checked={fields.writePreset}\n onChange={() => toggle('writePreset')}\n />\n <span className={styles.rowText}>\n <span className={styles.rowName}>生成锚定注入 preset</span>\n <span className={styles.rowDesc}>prompt.md 注入与首轮工具引导(默认开启)</span>\n </span>\n </label>\n </div>\n\n <div className={styles.group}>\n <span className={styles.groupTitle}>prompt.md 内容</span>\n <textarea\n className={styles.textarea}\n aria-label=\"prompt.md 内容\"\n value={fields.promptText}\n onChange={(e) => patch({ promptText: e.target.value })}\n spellCheck={false}\n />\n </div>\n\n <div className={styles.actions}>\n <button type=\"button\" className={styles.primary} disabled={saving || !dirty} onClick={save}>{saving ? '保存中…' : '保存'}</button>\n <button type=\"button\" className={styles.secondary} disabled={!dirty} onClick={discard}>还原</button>\n <button type=\"button\" className={styles.secondary} onClick={openEdit}>打开编辑</button>\n {notice && <span className={clsx(styles.notice, noticeKind === 'error' && styles.noticeError)}>{notice}</span>}\n </div>\n </div>\n )}\n </li>\n )\n}\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport { PromptEditor, type PromptEditorInjected } from './PromptEditor.tsx'\n\nexport const inject = ['slots', 'connection']\n\nexport function apply(ctx: ClientContext): void {\n const connection = ctx.get('connection') as ConnectionHandle\n\n const injected = (): PromptEditorInjected => ({\n api: connection.api,\n })\n\n ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({\n name: 'settings.plugin.item',\n id: 'prompt-tool',\n order: 30,\n inject: injected,\n }, PromptEditor as any))\n}\n"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;EAAA,SAAS,EAAE,GAAE;GAAC,IAAI,GAAE,GAAE,IAAE;GAAG,IAAG,YAAU,OAAO,KAAG,YAAU,OAAO,GAAE,KAAG;QAAO,IAAG,YAAU,OAAO,GAAE,IAAG,MAAM,QAAQ,CAAC,GAAE;IAAC,IAAI,IAAE,EAAE;IAAO,KAAI,IAAE,GAAE,IAAE,GAAE,KAAI,EAAE,OAAK,IAAE,EAAE,EAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;GAAE,OAAM,KAAI,KAAK,GAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;GAAG,OAAO;EAAC;EAAC,SAAgB,OAAM;GAAC,KAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,KAAI,CAAC,IAAE,UAAU,QAAM,IAAE,EAAE,CAAC,OAAK,MAAI,KAAG,MAAK,KAAG;GAAG,OAAO;EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECK/W,MAAM,KAAK;EAgBX,MAAM,QAAgB;GACpB,YAAY;GACZ,YAAY;GACZ,iBAAiB;GACjB,YAAY;GACZ,cAAc;GACd,aAAa;GACb,aAAa;EACf;EAEA,SAAgB,aAAa,OAAkC;GAC7D,MAAM,EAAE,QAAQ;GAChB,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAiB,KAAK;GAClD,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAChE,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GACtE,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,KAAK;GAC5C,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,EAAE;GACvC,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAyB,IAAI;GAEjE,MAAM,cAAA,GAAaC,MAAAA,YAAAA,EAAa,MAAsB,YAAoB;IACxE,UAAU,OAAO;IACjB,cAAc,IAAI;GACpB,GAAG,CAAC,CAAC;GAEL,MAAM,QAAA,GAAOA,MAAAA,YAAAA,CAAY,YAAY;IACnC,WAAW,IAAI;IACf,IAAI;KACF,MAAM,MAAM,MAAM,IAAI,SAAS,SAAS,CAAC,CAAC;KAC1C,IAAI,CAAC,IAAI,OAAO,IAAI;MAAE,WAAW,SAAS,QAAQ;MAAG;KAAO;KAC5D,MAAM,KAAK,IAAI,OAAO,MAAM,WAAW,MAAM,MAAW,EAAE,OAAO,EAAE;KACnE,IAAI,CAAC,IAAI;MAAE,WAAW,SAAS,YAAY;MAAG;KAAO;KACrD,MAAM,OAAe;MACnB,YAAY,GAAG,OAAO,cAAc;MACpC,YAAY,GAAG,OAAO,cAAc;MACpC,iBAAiB,GAAG,OAAO,mBAAmB;MAC9C,YAAY,GAAG,OAAO,cAAc;MACpC,cAAc,GAAG,OAAO,gBAAgB;MACxC,aAAa,GAAG,OAAO,eAAe;MACtC,aAAa,GAAG,OAAO,eAAe;KACxC;KACA,UAAU,IAAI;KACd,SAAS,KAAK,UAAU,IAAI,CAAC;KAC7B,YAAY,GAAG,QAAQ;KACvB,UAAU,EAAE;IACd,SAAS,GAAQ;KACf,WAAW,SAAS,WAAW,GAAG,WAAW,EAAE;IACjD,UAAU;KACR,WAAW,KAAK;IAClB;GACF,GAAG,CAAC,KAAK,UAAU,CAAC;GAEpB,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,CAAY,YAAY;IAC9C,IAAI;KACF,MAAM,MAAM,MAAM,IAAI,SAAS,SAAS,CAAC,CAAC;KAC1C,IAAI,CAAC,IAAI,OAAO,IAAI;KACpB,MAAM,KAAK,IAAI,OAAO,MAAM,WAAW,MAAM,MAAW,EAAE,OAAO,EAAE;KACnE,IAAI,IAAI,YAAY,GAAG,QAAQ;IACjC,QAAQ,CAER;GACF,GAAG,CAAC,GAAG,CAAC;GAER,MAAM,SAAS,YAA6B,WAAW,UAAU;IAAE,GAAG;IAAM,GAAG;GAAQ,EAAE;GAEzF,MAAM,mBAAmB;IACvB,MAAM,OAAO,CAAC;IACd,QAAQ,IAAI;IACZ,IAAI,CAAC,MAAM;IACX,IAAI,CAAC,QAAQ;KACX,UAAU,IAAI;KACd,KAAU;IACZ,OAAO,IAAI,CAAC,OAEV,KAAU;GAEd;GAEA,MAAM,gBAAgB;IACpB,KAAU;GACZ;GAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,YAAY;KAAE,WAAW,SAAS,qBAAqB;KAAG;IAAO;IAC7E,IAAI;KACF,MAAM,MAAM,MAAM,IAAI,KAAK,SAAS,EAAE,MAAM,OAAO,WAAW,CAAC;KAC/D,IAAI,IAAI,OAAO,IAAI,WAAW,MAAM,qBAAqB;UACpD,WAAW,SAAS,WAAW,IAAI,OAAO,OAAO,WAAW,MAAM,cAAc;IACvF,SAAS,GAAQ;KACf,WAAW,SAAS,WAAW,GAAG,WAAW,KAAK,cAAc;IAClE;GACF;GAEA,MAAM,OAAO,YAAY;IACvB,IAAI,QAAQ;IACZ,UAAU,IAAI;IACd,IAAI;KACF,MAAM,MAAM,MAAM,IAAI,SAAS,OAAO;MACpC,IAAI;MACJ,KAAK;OACH;QAAE,IAAI;QAAO,MAAM,CAAC,YAAY;QAAG,OAAO,OAAO;OAAW;OAC5D;QAAE,IAAI;QAAO,MAAM,CAAC,iBAAiB;QAAG,OAAO,OAAO;OAAgB;OACtE;QAAE,IAAI;QAAO,MAAM,CAAC,YAAY;QAAG,OAAO,OAAO;OAAW;OAC5D;QAAE,IAAI;QAAO,MAAM,CAAC,cAAc;QAAG,OAAO,OAAO;OAAa;OAChE;QAAE,IAAI;QAAO,MAAM,CAAC,aAAa;QAAG,OAAO,OAAO;OAAY;OAC9D;QAAE,IAAI;QAAO,MAAM,CAAC,aAAa;QAAG,OAAO,OAAO;OAAY;MAChE;MACA,kBAAkB;KACpB,CAAC;KACD,IAAI,IAAI,OAAO,IAAI;MACjB,YAAY,IAAI,OAAO,MAAM,QAAQ;MACrC,SAAS,KAAK,UAAU,MAAM,CAAC;MAC/B,WAAW,MAAM,QAAQ;KAC3B,OAAO;MACL,MAAM,gBAAgB;MACtB,WAAW,SAAS,WAAW,IAAI,OAAO,OAAO,WAAW,MAAM,eAAe;KACnF;IACF,SAAS,GAAQ;KACf,MAAM,gBAAgB;KACtB,WAAW,SAAS,WAAW,GAAG,WAAW,KAAK,eAAe;IACnE,UAAU;KACR,UAAU,KAAK;IACjB;GACF;GAEA,MAAM,UAAU,QACd,MAAM,GAAG,MAAM,CAAC,OAAO,KAAK,CAAC;GAE/B,MAAM,QAAQ,UAAU,KAAA,KAAa,KAAK,UAAU,MAAM,MAAM;GAEhE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;IAAI,WAAW,KAAKC,gCAAO,MAAM,QAAQA,gCAAO,QAAQ;IAAxD,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWA,gCAAO;KAAQ,iBAAe;KAAM,SAAS;KAA9E,UAAA;MACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,gCAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,gCAAO;QAAM,UAAA;OAAW,CAAA,GACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,gCAAO;QAAa,UAAA;OAAsC,CAAA,CACvE;;MACL,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,gCAAO;OAAS,UAAA;MAAS,CAAA;MACpD,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,0BAAD,EAA0B,WAAW,KAAKD,gCAAO,SAAS,QAAQA,gCAAO,WAAW,EAAI,CAAA;KAClF;IACP,CAAA,GAAA,QACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,gCAAO;KAAvB,UAAA;MACG,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,gCAAO;OAAS,UAAA;MAAa,CAAA;MAE1D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,gCAAO;OAAvB,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,gCAAO;SAAY,UAAA;QAAU,CAAA;QAC9C,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWA,gCAAO;SAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UACE,MAAK;UACL,SAAS,OAAO;UAChB,gBAAgB,OAAO,cAAc;SACtC,CAAA,GACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,gCAAO;UAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAsB,CAAA,GACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAmC,CAAA,CAChE;SACD,CAAA,CAAA;;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWA,gCAAO;SAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UACE,MAAK;UACL,SAAS,OAAO;UAChB,gBAAgB,OAAO,iBAAiB;SACzC,CAAA,GACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,gCAAO;UAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAa,CAAA,GAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAgC,CAAA,CAC7D;SACD,CAAA,CAAA;;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAW,KAAKA,gCAAO,UAAU,CAAC,OAAO,mBAAmBA,gCAAO,WAAW;SAArF,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,gCAAO;UAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAiB,CAAA,GAClD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAoB,CAAA,CACjD;SACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UACE,WAAWA,gCAAO;UAClB,OAAO,OAAO;UACd,UAAU,CAAC,OAAO;UAClB,WAAW,MAAM,MAAM,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC;UACrD,YAAY;SACb,CAAA,CACI;;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWA,gCAAO;SAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UACE,MAAK;UACL,SAAS,OAAO;UAChB,gBAAgB,OAAO,aAAa;SACrC,CAAA,GACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,gCAAO;UAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAyB,CAAA,GAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAiB,CAAA,CAC9C;SACD,CAAA,CAAA;;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWA,gCAAO;SAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UACE,MAAK;UACL,SAAS,OAAO;UAChB,gBAAgB,OAAO,aAAa;SACrC,CAAA,GACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,gCAAO;UAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAAmB,CAAA,GACpD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,gCAAO;WAAS,UAAA;UAA+B,CAAA,CAC5D;SACD,CAAA,CAAA;;OACJ;;MAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,gCAAO;OAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,gCAAO;QAAY,UAAA;OAAkB,CAAA,GACtD,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,gCAAO;QAClB,cAAW;QACX,OAAO,OAAO;QACd,WAAW,MAAM,MAAM,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC;QACrD,YAAY;OACb,CAAA,CACE;;MAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,gCAAO;OAAvB,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,gCAAO;SAAS,UAAU,UAAU,CAAC;SAAO,SAAS;SAAO,UAAA,SAAS,SAAS;QAAa,CAAA;QAC5H,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,gCAAO;SAAW,UAAU,CAAC;SAAO,SAAS;SAAS,UAAA;QAAU,CAAA;QACjG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,gCAAO;SAAW,SAAS;SAAU,UAAA;QAAY,CAAA;QACjF,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAW,KAAKA,gCAAO,QAAQ,eAAe,WAAWA,gCAAO,WAAW;SAAI,UAAA;QAAa,CAAA;OAC1G;;KACF;IAEL,CAAA,CAAA;;EAER;;;ECnPA,MAAa,SAAS,CAAC,SAAS,YAAY;EAE5C,SAAgB,MAAM,KAA0B;GAC9C,MAAM,aAAa,IAAI,IAAI,YAAY;GAEvC,MAAM,kBAAwC,EAC5C,KAAK,WAAW,IAClB;GAEA,IAAI,MAAM,OAAO,8BAA8B,IAAI,MAAM,SAAS;IAChE,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;GACV,GAAG,YAAmB,CAAC;EACzB"}
|
package/lib/index.d.mts
CHANGED
|
@@ -8,12 +8,14 @@ declare const Config: z<Schemastery.ObjectS<{
|
|
|
8
8
|
text: z<string, string>;
|
|
9
9
|
writeAgents: z<boolean, boolean>;
|
|
10
10
|
writePreset: z<boolean, boolean>;
|
|
11
|
+
injectPrompt: z<boolean, boolean>;
|
|
11
12
|
anchorFirstTurn: z<boolean, boolean>;
|
|
12
13
|
anchorText: z<string, string>;
|
|
13
14
|
}>, Schemastery.ObjectT<{
|
|
14
15
|
text: z<string, string>;
|
|
15
16
|
writeAgents: z<boolean, boolean>;
|
|
16
17
|
writePreset: z<boolean, boolean>;
|
|
18
|
+
injectPrompt: z<boolean, boolean>;
|
|
17
19
|
anchorFirstTurn: z<boolean, boolean>;
|
|
18
20
|
anchorText: z<string, string>;
|
|
19
21
|
}>>;
|
|
@@ -21,6 +23,7 @@ interface ApplyConfig {
|
|
|
21
23
|
text: string;
|
|
22
24
|
writeAgents: boolean;
|
|
23
25
|
writePreset: boolean;
|
|
26
|
+
injectPrompt: boolean;
|
|
24
27
|
anchorFirstTurn: boolean;
|
|
25
28
|
anchorText: string;
|
|
26
29
|
}
|
package/lib/index.mjs
CHANGED
|
@@ -89,7 +89,8 @@ function writePreset(prompt, options) {
|
|
|
89
89
|
if (!file.endsWith(".mjs")) continue;
|
|
90
90
|
writeFileSync(join(PRESET_DIR, file), readFileSync(join(VENDOR_PRESET_DIR, file), "utf8"), "utf8");
|
|
91
91
|
}
|
|
92
|
-
writeFileSync(PRESET_INJECTOR, readFileSync(PRESET_TEMPLATE_INJECTOR, "utf8"), "utf8");
|
|
92
|
+
if (options.injectPrompt) writeFileSync(PRESET_INJECTOR, readFileSync(PRESET_TEMPLATE_INJECTOR, "utf8"), "utf8");
|
|
93
|
+
else rmSync(PRESET_INJECTOR, { force: true });
|
|
93
94
|
if (options.anchorFirstTurn) writeFileSync(PRESET_ANCHOR, readFileSync(PRESET_TEMPLATE_ANCHOR, "utf8"), "utf8");
|
|
94
95
|
else rmSync(PRESET_ANCHOR, { force: true });
|
|
95
96
|
}
|
|
@@ -97,6 +98,7 @@ const Config = z.object({
|
|
|
97
98
|
text: z.string().default(""),
|
|
98
99
|
writeAgents: z.boolean().default(true),
|
|
99
100
|
writePreset: z.boolean().default(true),
|
|
101
|
+
injectPrompt: z.boolean().default(true),
|
|
100
102
|
anchorFirstTurn: z.boolean().default(false),
|
|
101
103
|
anchorText: z.string().default("You are a helpful software assistant.\n\nBegin every reasoning block with 'We need'.")
|
|
102
104
|
});
|
|
@@ -105,6 +107,7 @@ const PromptSettingsSchema = z.object({
|
|
|
105
107
|
promptPath: z.string().default(""),
|
|
106
108
|
anchorFirstTurn: z.boolean().default(false),
|
|
107
109
|
anchorText: z.string().default("You are a helpful software assistant.\n\nBegin every reasoning block with 'We need'."),
|
|
110
|
+
injectPrompt: z.boolean().default(true),
|
|
108
111
|
writeAgents: z.boolean().default(true),
|
|
109
112
|
writePreset: z.boolean().default(true)
|
|
110
113
|
});
|
|
@@ -154,6 +157,7 @@ function apply(ctx, config) {
|
|
|
154
157
|
const runtime = {
|
|
155
158
|
writeAgents: config.writeAgents,
|
|
156
159
|
writePreset: config.writePreset,
|
|
160
|
+
injectPrompt: config.injectPrompt,
|
|
157
161
|
anchorFirstTurn: config.anchorFirstTurn,
|
|
158
162
|
anchorText: config.anchorText
|
|
159
163
|
};
|
|
@@ -162,6 +166,7 @@ function apply(ctx, config) {
|
|
|
162
166
|
promptPath: PROMPT_FILE_PATH,
|
|
163
167
|
anchorFirstTurn: runtime.anchorFirstTurn,
|
|
164
168
|
anchorText: runtime.anchorText,
|
|
169
|
+
injectPrompt: runtime.injectPrompt,
|
|
165
170
|
writeAgents: runtime.writeAgents,
|
|
166
171
|
writePreset: runtime.writePreset
|
|
167
172
|
});
|
|
@@ -171,11 +176,12 @@ function apply(ctx, config) {
|
|
|
171
176
|
const nextRuntime = {
|
|
172
177
|
writeAgents: typeof next.writeAgents === "boolean" ? next.writeAgents : config.writeAgents,
|
|
173
178
|
writePreset: typeof next.writePreset === "boolean" ? next.writePreset : config.writePreset,
|
|
179
|
+
injectPrompt: typeof next.injectPrompt === "boolean" ? next.injectPrompt : config.injectPrompt,
|
|
174
180
|
anchorFirstTurn: typeof next.anchorFirstTurn === "boolean" ? next.anchorFirstTurn : config.anchorFirstTurn,
|
|
175
181
|
anchorText: typeof next.anchorText === "string" && next.anchorText.length > 0 ? next.anchorText : config.anchorText
|
|
176
182
|
};
|
|
177
183
|
const promptChanged = typeof next.promptText === "string" && next.promptText !== current;
|
|
178
|
-
const settingsChanged = runtime.writeAgents !== nextRuntime.writeAgents || runtime.writePreset !== nextRuntime.writePreset || runtime.anchorFirstTurn !== nextRuntime.anchorFirstTurn || runtime.anchorText !== nextRuntime.anchorText;
|
|
184
|
+
const settingsChanged = runtime.writeAgents !== nextRuntime.writeAgents || runtime.writePreset !== nextRuntime.writePreset || runtime.injectPrompt !== nextRuntime.injectPrompt || runtime.anchorFirstTurn !== nextRuntime.anchorFirstTurn || runtime.anchorText !== nextRuntime.anchorText;
|
|
179
185
|
if (!needsInitialApply && !promptChanged && !settingsChanged) return;
|
|
180
186
|
needsInitialApply = false;
|
|
181
187
|
if (promptChanged) {
|
|
@@ -188,12 +194,14 @@ function apply(ctx, config) {
|
|
|
188
194
|
}
|
|
189
195
|
runtime.writeAgents = nextRuntime.writeAgents;
|
|
190
196
|
runtime.writePreset = nextRuntime.writePreset;
|
|
197
|
+
runtime.injectPrompt = nextRuntime.injectPrompt;
|
|
191
198
|
runtime.anchorFirstTurn = nextRuntime.anchorFirstTurn;
|
|
192
199
|
runtime.anchorText = nextRuntime.anchorText;
|
|
193
200
|
if (runtime.writeAgents && !writeAgents(readAgents())) warn(ctx, `prompt-tool: failed to write resident rules to ${AGENTS_PATH}`);
|
|
194
201
|
if (runtime.writePreset) writePreset(current, {
|
|
195
202
|
anchorFirstTurn: runtime.anchorFirstTurn,
|
|
196
|
-
anchorText: runtime.anchorText
|
|
203
|
+
anchorText: runtime.anchorText,
|
|
204
|
+
injectPrompt: runtime.injectPrompt
|
|
197
205
|
});
|
|
198
206
|
};
|
|
199
207
|
installSettingsSection(ctx, NS, PromptSettingsSchema, {
|
|
@@ -201,6 +209,7 @@ function apply(ctx, config) {
|
|
|
201
209
|
promptPath: PROMPT_FILE_PATH,
|
|
202
210
|
anchorFirstTurn: config.anchorFirstTurn,
|
|
203
211
|
anchorText: config.anchorText,
|
|
212
|
+
injectPrompt: config.injectPrompt,
|
|
204
213
|
writeAgents: config.writeAgents,
|
|
205
214
|
writePreset: config.writePreset
|
|
206
215
|
}, {
|
package/lib/preset-core.d.mts
CHANGED
|
@@ -13,6 +13,8 @@ interface BuildCordisOptions {
|
|
|
13
13
|
/** 首轮独立锚定轮:首个用户消息先入 next-step inbox,首步只发 anchorText。 */
|
|
14
14
|
anchorFirstTurn?: boolean;
|
|
15
15
|
anchorText?: string;
|
|
16
|
+
/** 锚定确认后注入 prompt.md;关闭时仍保留工具引导,但不注册 prompt-injector 行。 */
|
|
17
|
+
injectPrompt?: boolean;
|
|
16
18
|
}
|
|
17
19
|
declare function buildCordis(prompt: string, options?: BuildCordisOptions): string;
|
|
18
20
|
//#endregion
|
package/lib/preset-core.mjs
CHANGED
|
@@ -47,6 +47,7 @@ function parseFrontmatter(text) {
|
|
|
47
47
|
}
|
|
48
48
|
function buildCordis(prompt, options = {}) {
|
|
49
49
|
const anchorFirstTurn = options.anchorFirstTurn === true;
|
|
50
|
+
const injectPrompt = options.injectPrompt !== false;
|
|
50
51
|
const anchorText = typeof options.anchorText === "string" && options.anchorText.length > 0 ? options.anchorText : "You are a helpful software assistant.\n\nBegin every reasoning block with 'We need'.";
|
|
51
52
|
const indent = (s) => s.split(/\r?\n/).map((l) => l.length === 0 ? "" : " " + l).join("\n");
|
|
52
53
|
const up = readFileSync(VENDOR_CORDIS, "utf8").replace(/\r\n/g, "\n");
|
|
@@ -70,17 +71,20 @@ function buildCordis(prompt, options = {}) {
|
|
|
70
71
|
const head = up.slice(0, insertAt);
|
|
71
72
|
const tail = up.slice(insertAt);
|
|
72
73
|
const separator = head.endsWith("\n\n") ? "" : head.endsWith("\n") ? "\n" : "\n\n";
|
|
73
|
-
const
|
|
74
|
-
if (!LOCAL_INJECTOR_BLOCK.includes(promptMarker)) throw new Error("internal error: prompt-injector template lost its promptText placeholder");
|
|
75
|
-
const injector = LOCAL_INJECTOR_BLOCK.replace(promptMarker, " promptText: |-\n" + indent(prompt));
|
|
76
|
-
let extra = injector;
|
|
74
|
+
const parts = [];
|
|
77
75
|
if (anchorFirstTurn) {
|
|
78
76
|
const anchorMarker = " anchorText: |-\n __ANCHOR_TEXT__";
|
|
79
77
|
if (!TURN_ANCHOR_BLOCK.includes(anchorMarker)) throw new Error("internal error: turn-anchor template lost its anchorText placeholder");
|
|
80
|
-
|
|
78
|
+
parts.push(TURN_ANCHOR_BLOCK.replace(anchorMarker, " anchorText: |-\n" + indent(anchorText)));
|
|
81
79
|
}
|
|
80
|
+
if (injectPrompt) {
|
|
81
|
+
const promptMarker = " promptText: |-\n __PROMPT_TOOL_TEXT__";
|
|
82
|
+
if (!LOCAL_INJECTOR_BLOCK.includes(promptMarker)) throw new Error("internal error: prompt-injector template lost its promptText placeholder");
|
|
83
|
+
parts.push(LOCAL_INJECTOR_BLOCK.replace(promptMarker, " promptText: |-\n" + indent(prompt)));
|
|
84
|
+
}
|
|
85
|
+
const extra = parts.join("\n");
|
|
82
86
|
const out = head + separator + extra + "\n" + tail;
|
|
83
|
-
if (out.includes("__PROMPT_TOOL_TEXT__") || anchorFirstTurn && out.includes("__ANCHOR_TEXT__")) throw new Error("internal error: preset template placeholder was not replaced");
|
|
87
|
+
if (injectPrompt && out.includes("__PROMPT_TOOL_TEXT__") || anchorFirstTurn && out.includes("__ANCHOR_TEXT__")) throw new Error("internal error: preset template placeholder was not replaced");
|
|
84
88
|
let parsed;
|
|
85
89
|
try {
|
|
86
90
|
parsed = parse(out, { logLevel: "silent" });
|
|
@@ -89,7 +93,8 @@ function buildCordis(prompt, options = {}) {
|
|
|
89
93
|
}
|
|
90
94
|
if (!Array.isArray(parsed)) throw new Error("generated agent.cordis.yml is not a YAML array");
|
|
91
95
|
const ids = new Set(parsed.map((row) => row?.id));
|
|
92
|
-
if (!ids.has("prompt-injector")) throw new Error("generated agent.cordis.yml is missing the prompt-injector row");
|
|
96
|
+
if (injectPrompt && !ids.has("prompt-injector")) throw new Error("generated agent.cordis.yml is missing the prompt-injector row");
|
|
97
|
+
if (!injectPrompt && ids.has("prompt-injector")) throw new Error("generated agent.cordis.yml still contains the prompt-injector row");
|
|
93
98
|
if (anchorFirstTurn && !ids.has("turn-anchor")) throw new Error("generated agent.cordis.yml is missing the turn-anchor row");
|
|
94
99
|
return out;
|
|
95
100
|
}
|