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.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +480 -0
  3. package/agent-presets/ppt/agent.cordis.yml +308 -0
  4. package/agent-presets/ppt/preset.yml +3 -0
  5. package/cordis.patch.yml +29 -0
  6. package/docs/00-/350/256/276/350/256/241/346/272/220.md +537 -0
  7. package/docs/01-/351/234/200/346/261/202/344/270/216/347/233/256/346/240/207.md +136 -0
  8. package/docs/02-/346/212/200/346/234/257/346/212/245/345/221/212.md +483 -0
  9. package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +2898 -0
  10. 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
  11. package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +210 -0
  12. package/docs/06-/350/257/204/345/256/241/344/270/216/346/265/213/350/257/225.md +296 -0
  13. package/docs/fidelity-report.md +225 -0
  14. package/examples/fx/fx-mini/deck.yaml +39 -0
  15. package/examples/fx/fx-mini/pages/01.yaml +6 -0
  16. package/examples/fx/fx-mini/pages/02.yaml +2 -0
  17. package/examples/fx/fx-mini/pages/03.yaml +6 -0
  18. package/examples/fx/fx-pro/deck.yaml +48 -0
  19. package/examples/fx/fx-pro/pages/01_cover.yaml +40 -0
  20. package/examples/fx/fx-pro/pages/02_arch.yaml +55 -0
  21. package/examples/fx/fx-pro/pages/03_table.yaml +20 -0
  22. package/examples/fx/fx-pro/pages/04_chart.yaml +40 -0
  23. package/examples/fx/fx-pro/pages/05_timeline.yaml +71 -0
  24. package/examples/fx/fx-pro/pages/06_longtext.yaml +13 -0
  25. package/examples/fx/fx-pro/pages/07_safearea.yaml +33 -0
  26. package/examples/fx/fx-pro/pages/08_contrast.yaml +22 -0
  27. package/examples/fx/fx-pro/pages/09_custgeom.yaml +32 -0
  28. package/examples/fx/fx-pro/pages/10_numbers.yaml +25 -0
  29. package/examples/fx/fx-pro/pages/11_section.yaml +20 -0
  30. package/examples/fx/fx-pro/pages/12_summary.yaml +57 -0
  31. package/examples/fx/fx-pro/preview/01_pages_01_cover.html +1 -0
  32. package/examples/fx/fx-pro/preview/02_pages_02_arch.html +3 -0
  33. package/examples/fx/fx-pro/preview/03_pages_03_table.html +1 -0
  34. package/examples/fx/fx-pro/preview/04_pages_04_chart.html +3 -0
  35. package/examples/fx/fx-pro/preview/05_pages_05_timeline.html +2 -0
  36. package/examples/fx/fx-pro/preview/06_pages_06_longtext.html +4 -0
  37. package/examples/fx/fx-pro/preview/07_pages_07_safearea.html +2 -0
  38. package/examples/fx/fx-pro/preview/08_pages_08_contrast.html +1 -0
  39. package/examples/fx/fx-pro/preview/09_pages_09_custgeom.html +1 -0
  40. package/examples/fx/fx-pro/preview/10_pages_10_numbers.html +1 -0
  41. package/examples/fx/fx-pro/preview/11_pages_11_section.html +1 -0
  42. package/examples/fx/fx-pro/preview/12_pages_12_summary.html +1 -0
  43. package/examples/fx/fx-pro/preview/deck.html +10 -0
  44. package/examples/fx/fx-pro/preview/layout.json +2325 -0
  45. package/examples/fx/fx-pro/preview/measured.json +814 -0
  46. package/examples/fx/fx-pro.pptx +0 -0
  47. package/examples/fx/ren-single/01.png +0 -0
  48. package/examples/fx/ren-spliced/01.png +0 -0
  49. package/examples/fx/ren-spliced/03.png +0 -0
  50. package/examples/fx/seed.pptx +0 -0
  51. package/examples/fx/single.pptx +0 -0
  52. package/examples/fx/spliced.pptx +0 -0
  53. package/examples/smoke/deck.yaml +26 -0
  54. package/examples/smoke/imported/deck.yaml +30 -0
  55. package/examples/smoke/imported/import-styles.json +126 -0
  56. package/examples/smoke/imported/pages/slide_01.yaml +31 -0
  57. package/examples/smoke/imported/pages/slide_02.yaml +38 -0
  58. package/examples/smoke/imported/pages/slide_03.yaml +55 -0
  59. package/examples/smoke/imported/preview-rt/01_pages_slide_01.html +1 -0
  60. package/examples/smoke/imported/preview-rt/02_pages_slide_02.html +1 -0
  61. package/examples/smoke/imported/preview-rt/03_pages_slide_03.html +1 -0
  62. package/examples/smoke/imported/preview-rt/deck.html +1 -0
  63. package/examples/smoke/imported/preview-rt/layout.json +434 -0
  64. package/examples/smoke/imported/reference/previews/01.png +0 -0
  65. package/examples/smoke/imported/reference/previews/02.png +0 -0
  66. package/examples/smoke/imported/reference/previews/03.png +0 -0
  67. package/examples/smoke/imported/source.pptx +0 -0
  68. package/examples/smoke/media-test.png +0 -0
  69. package/examples/smoke/out-smoke.pptx +0 -0
  70. package/examples/smoke/pages/01_cover.yaml +27 -0
  71. package/examples/smoke/pages/02_content.yaml +42 -0
  72. package/examples/smoke/pages/03_chart.yaml +35 -0
  73. package/examples/smoke/preview/01_pages_01_cover.html +1 -0
  74. package/examples/smoke/preview/02_pages_02_content.html +1 -0
  75. package/examples/smoke/preview/03_pages_03_chart.html +1 -0
  76. package/examples/smoke/preview/deck.html +1 -0
  77. package/examples/smoke/preview/layout.json +378 -0
  78. package/lib/autodeclare.js +40 -0
  79. package/lib/commands.js +161 -0
  80. package/lib/crosscheck.js +300 -0
  81. package/lib/imgmeta.js +55 -0
  82. package/lib/index.js +239 -0
  83. package/lib/measurement.js +209 -0
  84. package/lib/msrender.js +123 -0
  85. package/lib/pptd/export-pptx.js +686 -0
  86. package/lib/pptd/import-pptx.js +774 -0
  87. package/lib/pptd/layout.js +209 -0
  88. package/lib/pptd/render-html.js +254 -0
  89. package/lib/pptd/schema.js +518 -0
  90. package/lib/pptd/svgCharts.js +147 -0
  91. package/lib/pptxPy.js +205 -0
  92. package/lib/preset-delivery.js +195 -0
  93. package/lib/preview-server.js +164 -0
  94. package/lib/router.js +165 -0
  95. package/lib/scaffold.js +315 -0
  96. package/lib/skill.js +174 -0
  97. package/lib/splice.js +219 -0
  98. package/lib/state.js +88 -0
  99. package/lib/surgical.js +369 -0
  100. package/lib/templates.js +400 -0
  101. package/lib/tools.js +955 -0
  102. package/lib/verify.js +828 -0
  103. package/lib/xmljs.js +112 -0
  104. package/lib/zips.js +117 -0
  105. package/package.json +81 -0
  106. package/scripts/audit-manual-facts.mjs +294 -0
  107. package/scripts/audit-template-fidelity.mjs +162 -0
  108. package/scripts/bench-m2.mjs +48 -0
  109. package/scripts/build-templates.mjs +63 -0
  110. package/scripts/build.mjs +14 -0
  111. package/scripts/build.sh +7 -0
  112. package/scripts/check-lib-freshness.mjs +70 -0
  113. package/scripts/check-preset.mjs +189 -0
  114. package/scripts/check-tracked-lf.mjs +84 -0
  115. package/scripts/dbg-import.mjs +13 -0
  116. package/scripts/dbg-media.mjs +10 -0
  117. package/scripts/dbg-tpl-inventory.mjs +23 -0
  118. package/scripts/dump-workflow-baseline.mjs +38 -0
  119. package/scripts/e2e-1.0.mjs +129 -0
  120. package/scripts/eval-skills-blind.mjs +91 -0
  121. package/scripts/eval-skills-score.mjs +129 -0
  122. package/scripts/export-orig-templates.ps1 +17 -0
  123. package/scripts/fixtures/workflow-baseline.json +300 -0
  124. package/scripts/fixtures.mjs +501 -0
  125. package/scripts/import-user-templates.mjs +60 -0
  126. package/scripts/install-desktop.mjs +312 -0
  127. package/scripts/install.mjs +209 -0
  128. package/scripts/migrate-templates-dualtrack.mjs +71 -0
  129. package/scripts/preflight-1.0.mjs +198 -0
  130. package/scripts/probe-asset-freshness.mjs +57 -0
  131. package/scripts/probe-effect-semantics.mjs +69 -0
  132. package/scripts/probe-reparse-safety.mjs +32 -0
  133. package/scripts/rebuild-templates-c11.mjs +69 -0
  134. package/scripts/regression-real.mjs +84 -0
  135. package/scripts/release-sync.mjs +425 -0
  136. package/scripts/shot-templates.mjs +49 -0
  137. package/scripts/smoke.mjs +2512 -0
  138. package/scripts/verify-bundle-install.mjs +281 -0
  139. package/scripts/verify-fresh-install.mjs +260 -0
  140. package/skills/ppt-studio-copy/SKILL.md +139 -0
  141. package/skills/ppt-studio-craft/SKILL.md +171 -0
  142. package/skills/ppt-studio-data/SKILL.md +173 -0
  143. package/skills/ppt-studio-manual/SKILL.md +104 -0
  144. package/templates/academic-white/deck.yaml +24 -0
  145. package/templates/academic-white/pages/_chart.yaml +43 -0
  146. package/templates/academic-white/pages/_compare.yaml +37 -0
  147. package/templates/academic-white/pages/_content.yaml +35 -0
  148. package/templates/academic-white/pages/_cover.yaml +28 -0
  149. package/templates/academic-white/pages/_ending.yaml +28 -0
  150. package/templates/academic-white/pages/_flow.yaml +61 -0
  151. package/templates/academic-white/preview.png +0 -0
  152. package/templates/academic-white/template.yaml +14 -0
  153. package/templates/business-blue/deck.yaml +28 -0
  154. package/templates/business-blue/pages/_chart.yaml +36 -0
  155. package/templates/business-blue/pages/_compare.yaml +45 -0
  156. package/templates/business-blue/pages/_content.yaml +80 -0
  157. package/templates/business-blue/pages/_cover.yaml +39 -0
  158. package/templates/business-blue/pages/_ending.yaml +32 -0
  159. package/templates/business-blue/pages/_flow.yaml +87 -0
  160. package/templates/business-blue/preview.png +0 -0
  161. package/templates/business-blue/template.yaml +14 -0
  162. package/templates/pitch-bold/deck.yaml +23 -0
  163. package/templates/pitch-bold/pages/_chart.yaml +32 -0
  164. package/templates/pitch-bold/pages/_compare.yaml +36 -0
  165. package/templates/pitch-bold/pages/_content.yaml +58 -0
  166. package/templates/pitch-bold/pages/_cover.yaml +31 -0
  167. package/templates/pitch-bold/pages/_ending.yaml +27 -0
  168. package/templates/pitch-bold/pages/_flow.yaml +46 -0
  169. package/templates/pitch-bold/preview.png +0 -0
  170. package/templates/pitch-bold/template.yaml +14 -0
  171. package/templates/tech-dark/deck.yaml +24 -0
  172. package/templates/tech-dark/pages/_chart.yaml +27 -0
  173. package/templates/tech-dark/pages/_compare.yaml +38 -0
  174. package/templates/tech-dark/pages/_content.yaml +51 -0
  175. package/templates/tech-dark/pages/_cover.yaml +30 -0
  176. package/templates/tech-dark/pages/_ending.yaml +25 -0
  177. package/templates/tech-dark/pages/_flow.yaml +80 -0
  178. package/templates/tech-dark/preview.png +0 -0
  179. 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` 会明确拒绝而不是静默失败。
@@ -0,0 +1,3 @@
1
+ name: PPT 工作室
2
+ description: 专业 PPT 制作工作区:四类任务(从头/补完/修改/总结)+ 设计意图声明制防元素冲突 + 数字门禁/视觉审阅/Office 真渲染三轨审核 + PPTD 中间层与内置模板库;支持在既有精美 PPT 上只改一页(splice/slice 保真交付,其余页逐字节不动)。
3
+ order: 2
@@ -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