dsh-ppt-studio 1.1.0
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 -0
- package/README.md +480 -0
- package/agent-presets/ppt/agent.cordis.yml +308 -0
- package/agent-presets/ppt/preset.yml +3 -0
- package/cordis.patch.yml +29 -0
- package/docs/00-/350/256/276/350/256/241/346/272/220.md +537 -0
- package/docs/01-/351/234/200/346/261/202/344/270/216/347/233/256/346/240/207.md +136 -0
- package/docs/02-/346/212/200/346/234/257/346/212/245/345/221/212.md +483 -0
- package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +2898 -0
- package/docs/04-/350/267/257/347/272/277/345/233/276/344/270/216/351/207/214/347/250/213/347/242/221.md +113 -0
- package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +210 -0
- package/docs/06-/350/257/204/345/256/241/344/270/216/346/265/213/350/257/225.md +296 -0
- package/docs/fidelity-report.md +225 -0
- package/examples/fx/fx-mini/deck.yaml +39 -0
- package/examples/fx/fx-mini/pages/01.yaml +6 -0
- package/examples/fx/fx-mini/pages/02.yaml +2 -0
- package/examples/fx/fx-mini/pages/03.yaml +6 -0
- package/examples/fx/fx-pro/deck.yaml +48 -0
- package/examples/fx/fx-pro/pages/01_cover.yaml +40 -0
- package/examples/fx/fx-pro/pages/02_arch.yaml +55 -0
- package/examples/fx/fx-pro/pages/03_table.yaml +20 -0
- package/examples/fx/fx-pro/pages/04_chart.yaml +40 -0
- package/examples/fx/fx-pro/pages/05_timeline.yaml +71 -0
- package/examples/fx/fx-pro/pages/06_longtext.yaml +13 -0
- package/examples/fx/fx-pro/pages/07_safearea.yaml +33 -0
- package/examples/fx/fx-pro/pages/08_contrast.yaml +22 -0
- package/examples/fx/fx-pro/pages/09_custgeom.yaml +32 -0
- package/examples/fx/fx-pro/pages/10_numbers.yaml +25 -0
- package/examples/fx/fx-pro/pages/11_section.yaml +20 -0
- package/examples/fx/fx-pro/pages/12_summary.yaml +57 -0
- package/examples/fx/fx-pro/preview/01_pages_01_cover.html +1 -0
- package/examples/fx/fx-pro/preview/02_pages_02_arch.html +3 -0
- package/examples/fx/fx-pro/preview/03_pages_03_table.html +1 -0
- package/examples/fx/fx-pro/preview/04_pages_04_chart.html +3 -0
- package/examples/fx/fx-pro/preview/05_pages_05_timeline.html +2 -0
- package/examples/fx/fx-pro/preview/06_pages_06_longtext.html +4 -0
- package/examples/fx/fx-pro/preview/07_pages_07_safearea.html +2 -0
- package/examples/fx/fx-pro/preview/08_pages_08_contrast.html +1 -0
- package/examples/fx/fx-pro/preview/09_pages_09_custgeom.html +1 -0
- package/examples/fx/fx-pro/preview/10_pages_10_numbers.html +1 -0
- package/examples/fx/fx-pro/preview/11_pages_11_section.html +1 -0
- package/examples/fx/fx-pro/preview/12_pages_12_summary.html +1 -0
- package/examples/fx/fx-pro/preview/deck.html +10 -0
- package/examples/fx/fx-pro/preview/layout.json +2325 -0
- package/examples/fx/fx-pro/preview/measured.json +814 -0
- package/examples/fx/fx-pro.pptx +0 -0
- package/examples/fx/ren-single/01.png +0 -0
- package/examples/fx/ren-spliced/01.png +0 -0
- package/examples/fx/ren-spliced/03.png +0 -0
- package/examples/fx/seed.pptx +0 -0
- package/examples/fx/single.pptx +0 -0
- package/examples/fx/spliced.pptx +0 -0
- package/examples/smoke/deck.yaml +26 -0
- package/examples/smoke/imported/deck.yaml +30 -0
- package/examples/smoke/imported/import-styles.json +126 -0
- package/examples/smoke/imported/pages/slide_01.yaml +31 -0
- package/examples/smoke/imported/pages/slide_02.yaml +38 -0
- package/examples/smoke/imported/pages/slide_03.yaml +55 -0
- package/examples/smoke/imported/preview-rt/01_pages_slide_01.html +1 -0
- package/examples/smoke/imported/preview-rt/02_pages_slide_02.html +1 -0
- package/examples/smoke/imported/preview-rt/03_pages_slide_03.html +1 -0
- package/examples/smoke/imported/preview-rt/deck.html +1 -0
- package/examples/smoke/imported/preview-rt/layout.json +434 -0
- package/examples/smoke/imported/reference/previews/01.png +0 -0
- package/examples/smoke/imported/reference/previews/02.png +0 -0
- package/examples/smoke/imported/reference/previews/03.png +0 -0
- package/examples/smoke/imported/source.pptx +0 -0
- package/examples/smoke/media-test.png +0 -0
- package/examples/smoke/out-smoke.pptx +0 -0
- package/examples/smoke/pages/01_cover.yaml +27 -0
- package/examples/smoke/pages/02_content.yaml +42 -0
- package/examples/smoke/pages/03_chart.yaml +35 -0
- package/examples/smoke/preview/01_pages_01_cover.html +1 -0
- package/examples/smoke/preview/02_pages_02_content.html +1 -0
- package/examples/smoke/preview/03_pages_03_chart.html +1 -0
- package/examples/smoke/preview/deck.html +1 -0
- package/examples/smoke/preview/layout.json +378 -0
- package/lib/autodeclare.js +40 -0
- package/lib/commands.js +161 -0
- package/lib/crosscheck.js +300 -0
- package/lib/imgmeta.js +55 -0
- package/lib/index.js +239 -0
- package/lib/measurement.js +209 -0
- package/lib/msrender.js +123 -0
- package/lib/pptd/export-pptx.js +686 -0
- package/lib/pptd/import-pptx.js +774 -0
- package/lib/pptd/layout.js +209 -0
- package/lib/pptd/render-html.js +254 -0
- package/lib/pptd/schema.js +518 -0
- package/lib/pptd/svgCharts.js +147 -0
- package/lib/pptxPy.js +205 -0
- package/lib/preset-delivery.js +195 -0
- package/lib/preview-server.js +164 -0
- package/lib/router.js +165 -0
- package/lib/scaffold.js +315 -0
- package/lib/skill.js +174 -0
- package/lib/splice.js +219 -0
- package/lib/state.js +88 -0
- package/lib/surgical.js +369 -0
- package/lib/templates.js +400 -0
- package/lib/tools.js +955 -0
- package/lib/verify.js +828 -0
- package/lib/xmljs.js +112 -0
- package/lib/zips.js +117 -0
- package/package.json +81 -0
- package/scripts/audit-manual-facts.mjs +294 -0
- package/scripts/audit-template-fidelity.mjs +162 -0
- package/scripts/bench-m2.mjs +48 -0
- package/scripts/build-templates.mjs +63 -0
- package/scripts/build.mjs +14 -0
- package/scripts/build.sh +7 -0
- package/scripts/check-lib-freshness.mjs +70 -0
- package/scripts/check-preset.mjs +189 -0
- package/scripts/check-tracked-lf.mjs +84 -0
- package/scripts/dbg-import.mjs +13 -0
- package/scripts/dbg-media.mjs +10 -0
- package/scripts/dbg-tpl-inventory.mjs +23 -0
- package/scripts/dump-workflow-baseline.mjs +38 -0
- package/scripts/e2e-1.0.mjs +129 -0
- package/scripts/eval-skills-blind.mjs +91 -0
- package/scripts/eval-skills-score.mjs +129 -0
- package/scripts/export-orig-templates.ps1 +17 -0
- package/scripts/fixtures/workflow-baseline.json +300 -0
- package/scripts/fixtures.mjs +501 -0
- package/scripts/import-user-templates.mjs +60 -0
- package/scripts/install-desktop.mjs +312 -0
- package/scripts/install.mjs +209 -0
- package/scripts/migrate-templates-dualtrack.mjs +71 -0
- package/scripts/preflight-1.0.mjs +198 -0
- package/scripts/probe-asset-freshness.mjs +57 -0
- package/scripts/probe-effect-semantics.mjs +69 -0
- package/scripts/probe-reparse-safety.mjs +32 -0
- package/scripts/rebuild-templates-c11.mjs +69 -0
- package/scripts/regression-real.mjs +84 -0
- package/scripts/release-sync.mjs +425 -0
- package/scripts/shot-templates.mjs +49 -0
- package/scripts/smoke.mjs +2512 -0
- package/scripts/verify-bundle-install.mjs +281 -0
- package/scripts/verify-fresh-install.mjs +260 -0
- package/skills/ppt-studio-copy/SKILL.md +139 -0
- package/skills/ppt-studio-craft/SKILL.md +171 -0
- package/skills/ppt-studio-data/SKILL.md +173 -0
- package/skills/ppt-studio-manual/SKILL.md +104 -0
- package/templates/academic-white/deck.yaml +24 -0
- package/templates/academic-white/pages/_chart.yaml +43 -0
- package/templates/academic-white/pages/_compare.yaml +37 -0
- package/templates/academic-white/pages/_content.yaml +35 -0
- package/templates/academic-white/pages/_cover.yaml +28 -0
- package/templates/academic-white/pages/_ending.yaml +28 -0
- package/templates/academic-white/pages/_flow.yaml +61 -0
- package/templates/academic-white/preview.png +0 -0
- package/templates/academic-white/template.yaml +14 -0
- package/templates/business-blue/deck.yaml +28 -0
- package/templates/business-blue/pages/_chart.yaml +36 -0
- package/templates/business-blue/pages/_compare.yaml +45 -0
- package/templates/business-blue/pages/_content.yaml +80 -0
- package/templates/business-blue/pages/_cover.yaml +39 -0
- package/templates/business-blue/pages/_ending.yaml +32 -0
- package/templates/business-blue/pages/_flow.yaml +87 -0
- package/templates/business-blue/preview.png +0 -0
- package/templates/business-blue/template.yaml +14 -0
- package/templates/pitch-bold/deck.yaml +23 -0
- package/templates/pitch-bold/pages/_chart.yaml +32 -0
- package/templates/pitch-bold/pages/_compare.yaml +36 -0
- package/templates/pitch-bold/pages/_content.yaml +58 -0
- package/templates/pitch-bold/pages/_cover.yaml +31 -0
- package/templates/pitch-bold/pages/_ending.yaml +27 -0
- package/templates/pitch-bold/pages/_flow.yaml +46 -0
- package/templates/pitch-bold/preview.png +0 -0
- package/templates/pitch-bold/template.yaml +14 -0
- package/templates/tech-dark/deck.yaml +24 -0
- package/templates/tech-dark/pages/_chart.yaml +27 -0
- package/templates/tech-dark/pages/_compare.yaml +38 -0
- package/templates/tech-dark/pages/_content.yaml +51 -0
- package/templates/tech-dark/pages/_cover.yaml +30 -0
- package/templates/tech-dark/pages/_ending.yaml +25 -0
- package/templates/tech-dark/pages/_flow.yaml +80 -0
- package/templates/tech-dark/preview.png +0 -0
- package/templates/tech-dark/template.yaml +14 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# The `standard` agent preset: the full coding agent, mounted once per process.
|
|
2
|
+
#
|
|
3
|
+
# This file is an AGENT-PLANE composition. The roster mounts it ONCE under a
|
|
4
|
+
# standing scope; every session naming it joins by scope parentage, so the
|
|
5
|
+
# tools and prompt sections registered here cover each joined agent while a
|
|
6
|
+
# session's own state stays keyed per Session/Agent inside the plugins. The
|
|
7
|
+
# host composition (`base.cordis.yml` + `web.cordis.yml`) keeps everything a
|
|
8
|
+
# preset must not own: the registries themselves, the sandbox and approval
|
|
9
|
+
# stack, persistence, and the model route.
|
|
10
|
+
#
|
|
11
|
+
# A service row here MUST sit inside a group carrying an `isolate` realm.
|
|
12
|
+
# Without one it publishes into the root realm, where it is process-global —
|
|
13
|
+
# another preset publishing the same name collides, and a host reader would
|
|
14
|
+
# resolve one preset's instance for every session; the agent-preset registry
|
|
15
|
+
# rejects that at mount. `true` means an entry-local realm: this standing
|
|
16
|
+
# mount's own private instance, apart from every other preset's. (A shared
|
|
17
|
+
# label does NOT pool instances — `provide()` throws on the second registration
|
|
18
|
+
# under the same realm symbol; labels join REALMS, and are not what this file
|
|
19
|
+
# needs.)
|
|
20
|
+
#
|
|
21
|
+
# 【本文件在 DSH 0.1.7 上怎么被用(2026-09-24 适配)】
|
|
22
|
+
# 它是一份 **Loader 方言的条目数组**,由 `lib/preset-delivery.js` 读出来、作为
|
|
23
|
+
# `plugins` 交给 `ctx.agentPresets.register({id:'ppt', name, description, order, plugins})`。
|
|
24
|
+
# 0.1.6 及以前是靠把本文件**写到 `<dshHome>/.agent-presets/ppt/`** 让宿主扫到——那条路
|
|
25
|
+
# 在 0.1.7 已被上游删除(原文:"the harness discovers no preset on disk"),所以现在是**声明**。
|
|
26
|
+
# 两个必须守住的细节(都在 preset-delivery.js 里有源码级依据):
|
|
27
|
+
# · `!!js` 会被 Loader 求值(`{__jsExpr}`),自己读 YAML 时必须**保真**,否则平台开关会失真;
|
|
28
|
+
# · 相对模块名会被解析到**注册表所在层**(= dsh-web-app 包目录),不是本目录——本文件里没有相对名。
|
|
29
|
+
|
|
30
|
+
# ── identity ────────────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
# The preset's own persona, shadowing the deployment default for this agent.
|
|
33
|
+
# `{{model}}` and `{{cwd}}` resolve from the agent's own route and workspace.
|
|
34
|
+
#
|
|
35
|
+
# 【本预设唯一的**有意差异**(相对随包 standard)】2026-09-18:
|
|
36
|
+
# 这行原来与 standard 逐字相同(通用编码人格),于是本预设只是"改了名字的 standard"——
|
|
37
|
+
# 用户提问"我们的预设和标准模式有啥区别?"时,diff 给出的答案是"0 行差异"。
|
|
38
|
+
# 工具/技能按预设隔离在这版 DSH 上做不到(切换预设时 agent 已存在 ⇒ `agent/created` 钩子不触发;
|
|
39
|
+
# 技能注册表在父层读 ⇒ 子层注册看不见;见 docs/03 最新条目),所以**预设能可靠交付的只有人格**。
|
|
40
|
+
# 改这行必须同步更新 scripts/check-preset.mjs 顶部的 INTENTIONAL 白名单(否则门禁会报配置漂移)。
|
|
41
|
+
- id: persona
|
|
42
|
+
name: '@deepseek-ai/dsh-persona'
|
|
43
|
+
config:
|
|
44
|
+
suffix: Your working directory is {{cwd}}.
|
|
45
|
+
prefix: >-
|
|
46
|
+
You are the presentation engineer of PPT Studio, powered by the {{model}} model.
|
|
47
|
+
You treat a deck as an engineered deliverable, not a pile of slides: settle the outline and the
|
|
48
|
+
one claim each page makes before choosing any layout; put a conclusion in the title and evidence
|
|
49
|
+
in the body; give every number and chart a stated source and keep the same metric consistent
|
|
50
|
+
across pages; and run the deck through the gates (render, numeric verify, visual spot-check)
|
|
51
|
+
before showing it. The ppt_* tools, the /ppt commands and the PPT Studio skill manuals are your
|
|
52
|
+
working set — reach for them instead of hand-rolling artifacts.
|
|
53
|
+
If the human's request is clearly unrelated to decks, answer it normally without forcing this workflow.
|
|
54
|
+
|
|
55
|
+
- id: agent-instructions
|
|
56
|
+
name: '@deepseek-ai/dsh-agent-instructions'
|
|
57
|
+
config:
|
|
58
|
+
maxBytes: 65536
|
|
59
|
+
|
|
60
|
+
# ── shell ───────────────────────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
# `shell-env` stays in the HOST composition: `apps/cli/src/web.ts` injects it to
|
|
63
|
+
# publish `DSH_WEB_URL`/`DSH_WEB_MODE`, and a host row that injects a service is
|
|
64
|
+
# the criterion for host-plane ownership — injection resolves before any session
|
|
65
|
+
# exists, so there is no agent to key by. Behind a preset realm those variables
|
|
66
|
+
# never reached the model's shell at all. Both shell tools consume the host
|
|
67
|
+
# registry from here; their executors (`bash-sandbox`/`pwsh-sandbox`) are
|
|
68
|
+
# host-plane too.
|
|
69
|
+
- id: tool-bash
|
|
70
|
+
name: '@deepseek-ai/dsh-tool-bash'
|
|
71
|
+
disabled: !!js process.platform === 'win32'
|
|
72
|
+
|
|
73
|
+
- id: tool-pwsh
|
|
74
|
+
name: '@deepseek-ai/dsh-tool-pwsh'
|
|
75
|
+
disabled: !!js process.platform !== 'win32'
|
|
76
|
+
|
|
77
|
+
# ── filesystem ──────────────────────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
# Both register into the host `tools` registry and provide nothing, so
|
|
80
|
+
# they need no realm. The `fs` service and its policy stay in the host.
|
|
81
|
+
- id: tool-fs
|
|
82
|
+
name: '@deepseek-ai/dsh-tool-fs'
|
|
83
|
+
|
|
84
|
+
- id: tool-fs-search
|
|
85
|
+
name: '@deepseek-ai/dsh-tool-fs-search'
|
|
86
|
+
config:
|
|
87
|
+
sampleOverCapGlobResults: false
|
|
88
|
+
|
|
89
|
+
# ── background jobs ────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
# Only the model-facing controls. The task REGISTRY stays on the host plane:
|
|
92
|
+
# its producers sit outside any realm this file could put it in — `tool-bash`
|
|
93
|
+
# above resolves it with `ctx.get`, and an entry-local realm here is invisible
|
|
94
|
+
# to every sibling row, so `run_in_background` would answer "background jobs
|
|
95
|
+
# unavailable" while these controls sat in the catalog. The registry is keyed by
|
|
96
|
+
# owning agent anyway, so one host instance serves every session. What a preset
|
|
97
|
+
# chooses is whether its agent can collect and stop background work at all.
|
|
98
|
+
- id: tool-jobs
|
|
99
|
+
name: '@deepseek-ai/dsh-tool-jobs'
|
|
100
|
+
|
|
101
|
+
# ── skills ──────────────────────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
# The skill REGISTRY lives in the host composition and is layered per scope:
|
|
104
|
+
# these rows register into THIS preset's layer of it, so they need no realm.
|
|
105
|
+
# `skill-filesystem` contributes local-root discovery for agents on this preset, and
|
|
106
|
+
# `tool-skill` gives them the catalog and loader; the merged catalog also
|
|
107
|
+
# carries whatever the deployment registered globally (repository plugins).
|
|
108
|
+
- id: skill-filesystem
|
|
109
|
+
name: '@deepseek-ai/dsh-skill-filesystem'
|
|
110
|
+
|
|
111
|
+
- id: tool-skill
|
|
112
|
+
name: '@deepseek-ai/dsh-tool-skill'
|
|
113
|
+
|
|
114
|
+
# ── goals ───────────────────────────────────────────────────────────────────
|
|
115
|
+
|
|
116
|
+
# The goal service and session driver stay on the host plane, where the Gateway
|
|
117
|
+
# can resolve them. The human command and model-facing tool register into this
|
|
118
|
+
# preset's scoped layers.
|
|
119
|
+
- id: command-goal
|
|
120
|
+
name: '@deepseek-ai/dsh-command-goal'
|
|
121
|
+
|
|
122
|
+
- id: tool-goal
|
|
123
|
+
name: '@deepseek-ai/dsh-tool-goal'
|
|
124
|
+
|
|
125
|
+
# ── plan mode ───────────────────────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
# Plan state is per-agent by nature, so an entry-local realm is not a
|
|
128
|
+
# workaround here — it is the correct lifetime.
|
|
129
|
+
- id: planning
|
|
130
|
+
name: cordis:group
|
|
131
|
+
group: true
|
|
132
|
+
isolate:
|
|
133
|
+
planMode: true
|
|
134
|
+
config:
|
|
135
|
+
- id: plan-mode
|
|
136
|
+
name: '@deepseek-ai/dsh-plan-mode'
|
|
137
|
+
config:
|
|
138
|
+
section: |
|
|
139
|
+
You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
|
|
140
|
+
|
|
141
|
+
Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
|
|
142
|
+
|
|
143
|
+
The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
|
|
144
|
+
|
|
145
|
+
Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
|
|
146
|
+
|
|
147
|
+
Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
|
|
148
|
+
|
|
149
|
+
When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
|
|
150
|
+
|
|
151
|
+
# ── compaction ──────────────────────────────────────────────────────────────
|
|
152
|
+
|
|
153
|
+
# `compaction-basic` reads `toolResultPrune` through `ctx.get`, so the pruner must
|
|
154
|
+
# share this realm rather than sit outside it.
|
|
155
|
+
#
|
|
156
|
+
# `tokenMeter` is deliberately NOT in this realm: the meter stays on the HOST
|
|
157
|
+
# plane, and the rows here resolve that one instance. It takes no configuration,
|
|
158
|
+
# keys every fold by Session, and owns the context-meter projection units the
|
|
159
|
+
# browser reads for every session — behind a realm those units would come and go
|
|
160
|
+
# with whichever presets happen to be mounted. What a preset chooses is whether
|
|
161
|
+
# its agent compacts at all, which is `compaction-basic` below.
|
|
162
|
+
- id: compaction
|
|
163
|
+
name: cordis:group
|
|
164
|
+
group: true
|
|
165
|
+
isolate:
|
|
166
|
+
compaction: true
|
|
167
|
+
toolResultPruner: true
|
|
168
|
+
config:
|
|
169
|
+
- id: compaction-basic
|
|
170
|
+
name: '@deepseek-ai/dsh-compaction-basic'
|
|
171
|
+
|
|
172
|
+
- id: command-compact
|
|
173
|
+
name: '@deepseek-ai/dsh-command-compact'
|
|
174
|
+
|
|
175
|
+
- id: tool-result-pruner
|
|
176
|
+
name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
|
|
177
|
+
config:
|
|
178
|
+
thresholdChars: 8192
|
|
179
|
+
headChars: 4096
|
|
180
|
+
tailChars: 1024
|
|
181
|
+
|
|
182
|
+
# ── delegation and workflows ────────────────────────────────────────────────
|
|
183
|
+
|
|
184
|
+
# The `subagents` registry and its spawn/fork backends live in the HOST
|
|
185
|
+
# composition: the registry is a process singleton whose cross-session queries
|
|
186
|
+
# the api-proxy serves to the browser, and a provider name may only be
|
|
187
|
+
# registered once. This preset contributes the delegation TOOLS, which resolve
|
|
188
|
+
# that host registry.
|
|
189
|
+
#
|
|
190
|
+
# `workflows` is different — nothing outside an agent reads it — so every row
|
|
191
|
+
# that reaches it shares one entry-local realm here, and a consumer left
|
|
192
|
+
# outside would resolve a host registry this preset does not populate.
|
|
193
|
+
- id: delegation
|
|
194
|
+
name: cordis:group
|
|
195
|
+
group: true
|
|
196
|
+
isolate:
|
|
197
|
+
workflowEngine: true
|
|
198
|
+
config:
|
|
199
|
+
- id: tool-subagent-control
|
|
200
|
+
name: '@deepseek-ai/dsh-tool-subagent-control'
|
|
201
|
+
|
|
202
|
+
- id: tool-subagent-list-agents
|
|
203
|
+
name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
|
|
204
|
+
|
|
205
|
+
- id: tool-subagent
|
|
206
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
207
|
+
config:
|
|
208
|
+
provider: spawn
|
|
209
|
+
toolName: subagent
|
|
210
|
+
modelSelectionSettings: true
|
|
211
|
+
backgroundMode: continuable
|
|
212
|
+
|
|
213
|
+
# Fork omits model selection so provider/model stay equal to the parent and
|
|
214
|
+
# the inherited history remains eligible for KV Cache reuse. This preset
|
|
215
|
+
# keeps fork continuable; parent and child inherit the same messaging tool,
|
|
216
|
+
# while the parent id and return guidance follow the inherited history.
|
|
217
|
+
- id: tool-subagent-fork
|
|
218
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
219
|
+
config:
|
|
220
|
+
provider: fork
|
|
221
|
+
toolName: subagent_fork
|
|
222
|
+
backgroundMode: continuable
|
|
223
|
+
|
|
224
|
+
# Production dsh does not install these optional providers. Install the
|
|
225
|
+
# matching Bundle in this Profile and restart the Host, then copy this
|
|
226
|
+
# preset and remove `disabled` from the matching tool row. Host availability
|
|
227
|
+
# alone grants no tool.
|
|
228
|
+
- id: tool-subagent-codex
|
|
229
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
230
|
+
disabled: true
|
|
231
|
+
config:
|
|
232
|
+
provider: codex
|
|
233
|
+
toolName: subagent_codex
|
|
234
|
+
backgroundMode: one-shot
|
|
235
|
+
maxDepth: provider-managed
|
|
236
|
+
|
|
237
|
+
- id: tool-subagent-claude-code
|
|
238
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
239
|
+
disabled: true
|
|
240
|
+
config:
|
|
241
|
+
provider: claude-code
|
|
242
|
+
toolName: subagent_claude_code
|
|
243
|
+
backgroundMode: one-shot
|
|
244
|
+
maxDepth: provider-managed
|
|
245
|
+
|
|
246
|
+
- id: workflow-ptc
|
|
247
|
+
name: '@deepseek-ai/dsh-workflow-ptc'
|
|
248
|
+
config:
|
|
249
|
+
provider: spawn
|
|
250
|
+
|
|
251
|
+
- id: tool-workflow
|
|
252
|
+
name: '@deepseek-ai/dsh-tool-workflow'
|
|
253
|
+
|
|
254
|
+
# Off by default with the base row it mirrors: the tool description
|
|
255
|
+
# restricts `ralph` to runs the human explicitly asked for, and completion
|
|
256
|
+
# is a worker self-report, not an independent evaluation. Preset files take
|
|
257
|
+
# no patches, so a session that wants it duplicates this preset under a new
|
|
258
|
+
# id and drops `disabled`; the shipped root shadows a copy that reuses this
|
|
259
|
+
# id.
|
|
260
|
+
- id: tool-ralph
|
|
261
|
+
name: '@deepseek-ai/dsh-tool-ralph'
|
|
262
|
+
disabled: true
|
|
263
|
+
config:
|
|
264
|
+
subagentProvider: spawn
|
|
265
|
+
maxRounds: 64
|
|
266
|
+
|
|
267
|
+
# ── remaining model-facing rows ─────────────────────────────────────────────
|
|
268
|
+
|
|
269
|
+
- id: tool-ask-user
|
|
270
|
+
name: '@deepseek-ai/dsh-tool-ask-user'
|
|
271
|
+
|
|
272
|
+
- id: tool-todo
|
|
273
|
+
name: '@deepseek-ai/dsh-tool-todo'
|
|
274
|
+
config:
|
|
275
|
+
allowParallelInProgress: true
|
|
276
|
+
|
|
277
|
+
# The `web` service and its search provider stay in the host composition; only
|
|
278
|
+
# the model-facing tool is per-session.
|
|
279
|
+
- id: tool-web
|
|
280
|
+
name: '@deepseek-ai/dsh-tool-web'
|
|
281
|
+
config:
|
|
282
|
+
fetch: true
|
|
283
|
+
searchTimeoutMs: 60000
|
|
284
|
+
|
|
285
|
+
- id: present
|
|
286
|
+
name: '@deepseek-ai/dsh-tool-present'
|
|
287
|
+
|
|
288
|
+
- id: tool-plugin-manager
|
|
289
|
+
name: '@deepseek-ai/dsh-plugin-manager/tools'
|
|
290
|
+
disabled: true
|
|
291
|
+
|
|
292
|
+
# ── 为什么这里**没有**本插件的插件行(2026-09-24 按 DSH 0.1.7 重写说明)──────────────
|
|
293
|
+
# 本文件是「PPT 工作室」预设的组合真相:装配时由 lib/preset-delivery.js 声明给 agentPresets 注册表。
|
|
294
|
+
# **里面不放本插件的插件行**——插件已经由 profile bundle(cordis.patch.yml)挂载过;这里再来一行
|
|
295
|
+
# 会在同一进程把它挂第二次(预设组合里那一次注册进**预设作用域**,与 profile 那一次重复)。
|
|
296
|
+
# 插件自身有装配防重,但纪律是"一处挂载",所以随包预设恒为"干净组合"。
|
|
297
|
+
#
|
|
298
|
+
# 曾经验证过两条**都走不通**的路(留档,别再试):
|
|
299
|
+
# ① 用**裸包名** `dsh-ppt-studio` 写一行(0.1.6 实测事故):预设的行由注册表在**它自己 ctx 的
|
|
300
|
+
# baseUrl** 下 mount(源码 `mountPreset(scope.ctx.extend({ baseUrl: record.context.baseUrl }), …)`,
|
|
301
|
+
# 而 `register()` 里 `context = this.ctx`)——那是 `dsh-web-app` 的包目录,**不是** profile、
|
|
302
|
+
# 也不是预设目录 ⇒ 解析不到 ⇒ 预设被判 `broken` ⇒ 前端选择器只渲染健康预设
|
|
303
|
+
# (`presetOptions() = presets.filter(p => p.broken === void 0)`)⇒ 用户根本选不到;
|
|
304
|
+
# ② 把插件行写成**相对路径**(0.1.6 的 `--isolate` 就是这么做,靠预设目录内的 junction 解析):
|
|
305
|
+
# 0.1.7 上预设目录**不再被扫描**、"组合文件所在目录"这个概念随之消失 ⇒ 同样解析不到。
|
|
306
|
+
# 结论:**默认(全局)装法**是本版本唯一受支持的装配路径(`scripts/install.mjs` 的默认分支,
|
|
307
|
+
# 也是 `dsh plugin add` 那一条)。真要"只在「PPT 工作室」里生效",得把插件行放进**预设声明本身**
|
|
308
|
+
# 并给它一个安装期算出的**绝对 `file://` 名字**——这块尚未实现,`--isolate` 会明确拒绝而不是静默失败。
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# DSH profile bundle patch —— 「PPT 工作室」插件行(package.json 的 dsh.bundle.patch 指向本文件)
|
|
2
|
+
#
|
|
3
|
+
# 安装(一条命令,不需要 npm 账号):
|
|
4
|
+
# dsh plugin --profile web add dsh-ppt-studio # npm(2026-09-18 起,推荐:短、可升级)
|
|
5
|
+
# dsh plugin --profile web add https://github.com/zbsph/dsh-ppt-studio/releases/download/<tag>/<资产名>.tgz # 离线/归档通道
|
|
6
|
+
# `dsh plugin` 会在 profile 目录里跑 pnpm,然后核对 package.json 的 dsh.profile.bundles:
|
|
7
|
+
# **声明了 dsh.bundle.patch 的依赖自动入栈**(本文件即由 package.json 的 dsh.bundle.patch 指向)。
|
|
8
|
+
#
|
|
9
|
+
# 装配模型(2026-09-18 最终态 = **装上即可用**,见 docs/02 §2.1 与 docs/03 当日记录):
|
|
10
|
+
# · 本行 = 把插件挂进 **profile 层**;插件在 `apply()` 里向**拿到手的那个 ctx** 注册全部能力面
|
|
11
|
+
# (22 个 ppt_* 工具 / `/ppt` 命令面 / `ppt_state` / 4 本内嵌技能 / 工作流提示段)⇒ 该 profile 的
|
|
12
|
+
# **每个会话**都能用(含官方 standard)。
|
|
13
|
+
# · 想要"只在「PPT 工作室」预设里生效"的用户:本版本**不支持**(`install.mjs --isolate` 会明确拒绝)。
|
|
14
|
+
# 0.1.6 时代靠"预设目录内的 junction + 相对路径行"实现,而 0.1.7 删掉了目录发现、
|
|
15
|
+
# 预设行改为在**注册表所在层**的 baseUrl 下解析 ⇒ 相对行与裸包名都解析不到 ⇒ 预设被判 broken。
|
|
16
|
+
# 详见 agent-presets/ppt/agent.cordis.yml 末尾与 scripts/install.mjs 顶部。
|
|
17
|
+
# · 曾经的"按 agent 预设门控"设计(`agent/created` 钩子 + 预设层注册)已**证伪并撤除**:空白会话切预设时
|
|
18
|
+
# agent 已存在、钩子不会为它触发(先建会话再切 = 永远没工具),且技能注册表按层读、子层注册父层看不见。
|
|
19
|
+
# 细节与实测见 docs/03(2026-09-18 三条撤回记录)与 src/index.js 顶部注释。
|
|
20
|
+
# · 预设本身由插件**声明**(2026-09-24 适配 0.1.7):apply 时把包内 `agent-presets/ppt/` 的组合交给
|
|
21
|
+
# `ctx.agentPresets.register({id:'ppt', …})`,随插件同生共死(卸载即注销;`autoPreset: false` 可关闭)。
|
|
22
|
+
# 0.1.6 及以前是"写到 `<dshHome>/.agent-presets/ppt/`"——那条发现路径在 0.1.7 已被上游整个删除。
|
|
23
|
+
- insert:
|
|
24
|
+
- id: ppt-studio
|
|
25
|
+
name: 'dsh-ppt-studio'
|
|
26
|
+
config:
|
|
27
|
+
# 仅诊断用(插件日志打印 presetIds),**不再门控任何东西**——历史字段,保留以免改动既有装配行的形状
|
|
28
|
+
presetIds: ['ppt']
|
|
29
|
+
autoPreset: true
|