@xiaobuyu/nodesign 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/README.md +156 -106
  2. package/bin/nodesign.js +0 -0
  3. package/package.json +1 -1
  4. package/server/api/README.md +45 -45
  5. package/server/api/_guard.js +75 -75
  6. package/server/api/admin.js +187 -187
  7. package/server/api/assets/docx-page.js +103 -103
  8. package/server/api/assets/helpers.js +22 -22
  9. package/server/api/assets/notes.js +144 -144
  10. package/server/api/assets.js +896 -896
  11. package/server/api/board.js +57 -57
  12. package/server/api/browse.js +138 -138
  13. package/server/api/canvas.js +444 -444
  14. package/server/api/chatai.js +324 -324
  15. package/server/api/exports/build-standalone.js +980 -980
  16. package/server/api/exports/cards.js +118 -118
  17. package/server/api/exports/docx-pdf.js +46 -46
  18. package/server/api/exports/export-page.js +142 -142
  19. package/server/api/exports/handoff.js +147 -147
  20. package/server/api/exports.js +690 -690
  21. package/server/api/instruction.js +75 -75
  22. package/server/api/me.js +116 -116
  23. package/server/api/memory.js +185 -185
  24. package/server/api/pending-changes.js +366 -366
  25. package/server/api/plugins.js +164 -164
  26. package/server/api/projects.js +220 -220
  27. package/server/api/publish.js +64 -64
  28. package/server/api/recent.js +73 -73
  29. package/server/api/sessions.js +589 -589
  30. package/server/api/skills.js +77 -77
  31. package/server/api/standalone-fit.js +168 -168
  32. package/server/api/turn-compose.js +180 -180
  33. package/server/api/turn-inflight.js +44 -44
  34. package/server/auth/README.md +17 -17
  35. package/server/auth/middleware.js +138 -138
  36. package/server/auth/origin-guard.js +71 -71
  37. package/server/auth/session.js +108 -108
  38. package/server/auth/tier.js +113 -113
  39. package/server/auth/users-store.js +348 -348
  40. package/server/edit/README.md +29 -29
  41. package/server/engine/README.md +113 -113
  42. package/server/engine/agent/agent-shared.js +550 -550
  43. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -4
  44. package/server/engine/agent/auto-mode-rules.js +78 -78
  45. package/server/engine/agent/context.js +418 -418
  46. package/server/engine/agent/events.js +464 -464
  47. package/server/engine/agent/hooks/canvas-validate.js +199 -199
  48. package/server/engine/agent/hooks/failure.js +120 -120
  49. package/server/engine/agent/hooks/file-events.js +75 -75
  50. package/server/engine/agent/hooks/lifecycle.js +233 -233
  51. package/server/engine/agent/hooks/post-canvas-focus.js +80 -80
  52. package/server/engine/agent/hooks/post-guidance.js +206 -206
  53. package/server/engine/agent/hooks/post-subagent-report.js +104 -104
  54. package/server/engine/agent/hooks/post-trim.js +58 -58
  55. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -34
  56. package/server/engine/agent/hooks/pre-defaults.js +84 -84
  57. package/server/engine/agent/hooks/pre-injectors.js +277 -277
  58. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -78
  59. package/server/engine/agent/hooks/pre-starter-files.js +61 -61
  60. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -78
  61. package/server/engine/agent/hooks/site-validate.js +94 -94
  62. package/server/engine/agent/hooks/tool-prompts.js +31 -31
  63. package/server/engine/agent/hooks/turn-state-memory.js +56 -56
  64. package/server/engine/agent/hooks/user-prompt-submit.js +215 -215
  65. package/server/engine/agent/hooks.js +354 -354
  66. package/server/engine/agent/init-contract.js +69 -69
  67. package/server/engine/agent/isolation.js +159 -159
  68. package/server/engine/agent/model-table.js +292 -292
  69. package/server/engine/agent/plugin-loader.js +266 -266
  70. package/server/engine/agent/prompts/nodesign-prelude.md +336 -336
  71. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -71
  72. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -98
  73. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -583
  74. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -483
  75. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -100
  76. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -270
  77. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -70
  78. package/server/engine/agent/prompts/tools/site-reference.md +106 -106
  79. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -125
  80. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -48
  81. package/server/engine/agent/session-loop.js +1024 -1024
  82. package/server/engine/agent/session-model.js +164 -164
  83. package/server/engine/agent/skill.js +204 -204
  84. package/server/engine/agent/task-events.js +78 -78
  85. package/server/engine/agents/ds-extractor.md +132 -132
  86. package/server/engine/agents/explorer.md +190 -190
  87. package/server/engine/agents/index.js +230 -230
  88. package/server/engine/agents/schemas/design-system.json +156 -156
  89. package/server/engine/agents/schemas/tweak-schema.json +113 -113
  90. package/server/engine/agents/tweak-proposer.md +127 -127
  91. package/server/engine/agents/vision-checker.md +254 -254
  92. package/server/engine/browse/capture.js +422 -422
  93. package/server/engine/browse/card.js +137 -137
  94. package/server/engine/browse/handover.js +59 -59
  95. package/server/engine/browse/page-digest.js +119 -119
  96. package/server/engine/browse/refs.js +196 -196
  97. package/server/engine/browse/registry.js +307 -307
  98. package/server/engine/browse/screencast.js +170 -170
  99. package/server/engine/browse/state.js +121 -121
  100. package/server/engine/chatai/chat-log.js +79 -79
  101. package/server/engine/chatai/index.js +193 -193
  102. package/server/engine/chatai/openai-compat.js +152 -152
  103. package/server/engine/chatai/orchestrate.js +309 -309
  104. package/server/engine/chatai/perform.js +40 -40
  105. package/server/engine/chatai/summarize.js +79 -79
  106. package/server/engine/mcp/capability-gate.js +52 -52
  107. package/server/engine/mcp/index.js +339 -339
  108. package/server/engine/mcp/param-sanitizer.js +142 -142
  109. package/server/engine/mcp/tools/arrange-on-board.js +124 -124
  110. package/server/engine/mcp/tools/artifact-session.js +278 -278
  111. package/server/engine/mcp/tools/browse-computer.js +421 -421
  112. package/server/engine/mcp/tools/browse-find-batch.js +183 -183
  113. package/server/engine/mcp/tools/browse-screenshot.js +157 -157
  114. package/server/engine/mcp/tools/browse.js +480 -480
  115. package/server/engine/mcp/tools/build-docx.js +101 -101
  116. package/server/engine/mcp/tools/clear-pending-changes.js +99 -99
  117. package/server/engine/mcp/tools/create-on-board.js +155 -155
  118. package/server/engine/mcp/tools/crystallize-skill.js +168 -168
  119. package/server/engine/mcp/tools/explain-style.js +237 -237
  120. package/server/engine/mcp/tools/export-handoff.js +133 -133
  121. package/server/engine/mcp/tools/expose-tweaks.js +149 -149
  122. package/server/engine/mcp/tools/generate-image.js +842 -842
  123. package/server/engine/mcp/tools/get-computed-styles.js +164 -164
  124. package/server/engine/mcp/tools/get-pending-changes.js +205 -205
  125. package/server/engine/mcp/tools/h3box-ssh.js +84 -84
  126. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -82
  127. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -554
  128. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -112
  129. package/server/engine/mcp/tools/helpers/perception-page.js +215 -215
  130. package/server/engine/mcp/tools/helpers/reference-download.js +103 -103
  131. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -80
  132. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -280
  133. package/server/engine/mcp/tools/highlight.js +68 -68
  134. package/server/engine/mcp/tools/list-pages.js +222 -222
  135. package/server/engine/mcp/tools/lookup-tags.js +59 -59
  136. package/server/engine/mcp/tools/navigate-to-page.js +60 -60
  137. package/server/engine/mcp/tools/organize-board.js +64 -64
  138. package/server/engine/mcp/tools/paint-still.js +434 -434
  139. package/server/engine/mcp/tools/pin-to-board.js +130 -130
  140. package/server/engine/mcp/tools/preview-deck.js +130 -130
  141. package/server/engine/mcp/tools/profile-scroll.js +305 -305
  142. package/server/engine/mcp/tools/publish-site.js +102 -102
  143. package/server/engine/mcp/tools/query-elements.js +195 -195
  144. package/server/engine/mcp/tools/read-board.js +103 -103
  145. package/server/engine/mcp/tools/read-document.js +93 -93
  146. package/server/engine/mcp/tools/read-page.js +264 -264
  147. package/server/engine/mcp/tools/read-tavern-json.js +143 -143
  148. package/server/engine/mcp/tools/record-decision.js +140 -140
  149. package/server/engine/mcp/tools/relate-on-board.js +110 -110
  150. package/server/engine/mcp/tools/report-issue.js +115 -115
  151. package/server/engine/mcp/tools/roll-film.js +266 -266
  152. package/server/engine/mcp/tools/screenshot-docx.js +138 -138
  153. package/server/engine/mcp/tools/screenshot-url.js +195 -195
  154. package/server/engine/mcp/tools/screenshot.js +583 -583
  155. package/server/engine/mcp/tools/tier-gate.js +96 -96
  156. package/server/engine/mcp/tools/trace-motion.js +215 -215
  157. package/server/engine/mcp/tools/web-search.js +548 -548
  158. package/server/engine/motion/inventory.js +349 -349
  159. package/server/engine/perception/session.js +235 -235
  160. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -5
  161. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +192 -192
  162. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -667
  163. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -22
  164. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -25
  165. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -23
  166. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -21
  167. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -23
  168. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -21
  169. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +162 -162
  170. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -407
  171. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -80
  172. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +228 -228
  173. package/server/engine/plugins/nodesign/skills/rp-craft/patterns//346/274/224/345/207/272/351/241/265-/346/234/200/345/260/217/345/256/236/347/216/260.html +78 -78
  174. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -268
  175. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +323 -323
  176. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -134
  177. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -61
  178. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -163
  179. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -86
  180. package/server/engine/runs/active-runs.js +698 -698
  181. package/server/engine/runs/live-turn.js +252 -252
  182. package/server/engine/runs/store.js +364 -364
  183. package/server/engine/runs/turn-relay.js +217 -217
  184. package/server/engine/runtime/workspace.js +164 -164
  185. package/server/lib/artifact-file-path.js +80 -80
  186. package/server/lib/artifact-target.js +284 -284
  187. package/server/lib/asset-refs.js +239 -239
  188. package/server/lib/async-queue.js +104 -104
  189. package/server/lib/auto-relations.js +130 -130
  190. package/server/lib/binding-types.js +60 -60
  191. package/server/lib/board-kind-sizes.js +62 -62
  192. package/server/lib/board-relations.js +133 -133
  193. package/server/lib/browse-proxy.js +180 -180
  194. package/server/lib/canvas-id.js +36 -36
  195. package/server/lib/cover.js +227 -227
  196. package/server/lib/danbooru-tags.js +291 -291
  197. package/server/lib/doc-extract.js +156 -156
  198. package/server/lib/docx/build-from-source.js +260 -260
  199. package/server/lib/docx/build.js +490 -490
  200. package/server/lib/docx/dump-styles.js +287 -287
  201. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -164
  202. package/server/lib/docx/merge-runs.js +129 -129
  203. package/server/lib/docx/numbering.js +218 -218
  204. package/server/lib/docx/order.js +152 -152
  205. package/server/lib/docx/rawzip.js +172 -172
  206. package/server/lib/docx/render.js +92 -92
  207. package/server/lib/docx/text-lint.js +225 -225
  208. package/server/lib/docx/tokens.js +335 -335
  209. package/server/lib/docx/units.js +29 -29
  210. package/server/lib/docx/xml.js +291 -291
  211. package/server/lib/docx-pages.js +187 -187
  212. package/server/lib/export-collect.js +289 -289
  213. package/server/lib/export-package.js +210 -210
  214. package/server/lib/html-srcset.js +145 -145
  215. package/server/lib/image-variant.js +460 -460
  216. package/server/lib/ingress/forward-openai-chat.js +305 -305
  217. package/server/lib/ingress/openai-chat.js +491 -491
  218. package/server/lib/ingress/session-notice.js +66 -66
  219. package/server/lib/ingress/session-routes.js +68 -68
  220. package/server/lib/ingress/slot-probe.js +130 -130
  221. package/server/lib/ingress/upstream-billing.js +52 -52
  222. package/server/lib/ingress/upstream-fail-streak.js +72 -72
  223. package/server/lib/ingress/upstream-truncation.js +48 -48
  224. package/server/lib/issues-store.js +182 -182
  225. package/server/lib/kinds/deck.js +72 -72
  226. package/server/lib/kinds/docx.js +283 -283
  227. package/server/lib/kinds/file-kinds.js +113 -113
  228. package/server/lib/kinds/index.js +202 -202
  229. package/server/lib/kinds/site.js +161 -161
  230. package/server/lib/model-ingress.js +543 -543
  231. package/server/lib/moderation.js +255 -255
  232. package/server/lib/notice-store.js +103 -103
  233. package/server/lib/plugin-install.js +104 -104
  234. package/server/lib/plugin-validator.js +721 -721
  235. package/server/lib/publish-store.js +115 -115
  236. package/server/lib/quick-summary.js +52 -52
  237. package/server/lib/quota.js +270 -270
  238. package/server/lib/rate-window.js +29 -29
  239. package/server/lib/reference-assets.js +92 -92
  240. package/server/lib/region-shot.js +135 -135
  241. package/server/lib/safe-path.js +73 -73
  242. package/server/lib/sdk-session.js +33 -33
  243. package/server/lib/showcase-store.js +92 -92
  244. package/server/lib/site-publish.js +465 -465
  245. package/server/lib/ssrf-guard.js +432 -432
  246. package/server/lib/task-scan.js +158 -158
  247. package/server/lib/tavern-json.js +154 -154
  248. package/server/lib/video-variant.js +237 -237
  249. package/server/lib/workspace-path.js +33 -33
  250. package/server/ops/fix-sdk-musl.mjs +40 -40
  251. package/server/ops/install-macos-fonts.sh +114 -114
  252. package/server/ops/macos-fonts.conf +336 -336
  253. package/server/ops/sandbox-shim/bwrap +57 -57
  254. package/server/projects/assets-summary.js +119 -119
  255. package/server/projects/auto-name.js +53 -53
  256. package/server/projects/board-store.js +640 -640
  257. package/server/projects/move-entry.js +103 -103
  258. package/server/projects/store.js +270 -270
  259. package/server/projects/ui-config.js +54 -54
  260. package/server/projects/workspace-templates.js +53 -53
  261. package/server/projects/workspace.js +1025 -1025
  262. package/server/runtime/local-config.js +177 -177
  263. package/server/runtime/profile.js +72 -72
  264. package/server/services/rembg-service.py +334 -334
  265. package/server/shared/README.md +25 -25
  266. package/server/shared/deck.js +54 -54
  267. package/server/shared/time.js +49 -49
  268. package/server/style-pipeline/README.md +53 -53
  269. package/server/ws/broker.js +36 -36
  270. package/server/ws/browse-channel.js +177 -177
  271. package/server/ws/index.js +386 -386
  272. package/web/README.md +89 -89
  273. package/web/dist/assets/BrowserWindow-BYCgizHw.js +11 -0
  274. package/web/dist/assets/{DeckWindow-4G0xX7P3.js → DeckWindow-pNydEM4L.js} +1 -1
  275. package/web/dist/assets/{DocxWindow-BXQsoPkh.js → DocxWindow-PPgzh3Gq.js} +1 -1
  276. package/web/dist/assets/{SiteWindow-D6eS-2gM.js → SiteWindow-DM0LQPCO.js} +1 -1
  277. package/web/dist/assets/{index-Cbl3ATvp.js → index-BHTBJlpY.js} +32 -32
  278. package/web/dist/assets/{pending-edit-apply-DTjo2geW.js → pending-edit-apply-C0I13CbD.js} +1 -1
  279. package/web/dist/assets/{rotate-cw-LMT3x1Zj.js → rotate-cw-B1UQ8Hld.js} +1 -1
  280. package/web/dist/assets/{square-dashed-mouse-pointer-CBoAkfhi.js → square-dashed-mouse-pointer-8lrgqmfv.js} +1 -1
  281. package/web/dist/index.html +17 -17
  282. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +0 -11
@@ -1,25 +1,25 @@
1
- # server/shared/
2
-
3
- 从小合([dev/server/bot/](../../../dev/server/bot/))抠出来的**真正通用、跟工单业务无关**的基建文件。
4
-
5
- ## 文件清单
6
-
7
- | 文件 | 来源 | 改动 |
8
- |---|---|---|
9
- | `anthropic-client.js` | `dev/server/bot/anthropic-client.js` | env 名 `MINIMAX_*` → `KIMI_*`;baseURL 默认值切 Moonshot;timeout 600s(长任务) |
10
- | `agent-loop.js` | `dev/server/bot/agent-loop.js` | 仅改 env 名 `BOT_TOOL_TIMEOUT_MS` → `ENGINE_TOOL_TIMEOUT_MS`,默认 30s → 60s;其余照搬 |
11
- | `concurrency.js` | `dev/server/bot/concurrency.js` | 注释从"飞书 user open_id"泛化为"key";env 名加 `ENGINE_` 前缀;`enqueueMessage` 改 `enqueueTask` |
12
- | `time.js` | `dev/server/utils/time.js` | 零改动 |
13
-
14
- ## 不该往这里加东西的判断
15
-
16
- - 业务(工单 / 钩子 / 飞书卡片)→ 不该来
17
- - 跟 dev/ 共演化的核心抽象 → 暂时直接复制;如果开始反复同步两边,就提到 monorepo `shared/` 包
18
-
19
- ## 待验证(动工前必做)
20
-
21
- - [ ] `cache_control: { type: 'ephemeral' }` 在 Kimi Anthropic 兼容端点是否生效
22
- - [ ] `anthropic-beta: interleaved-thinking-2025-05-14` header 是否被 Kimi 接受
23
- - [ ] 流式 `tool_use` + `input_json_delta` 行为一致性
24
-
25
- 写一个 `server/_probe-kimi.js`(30 行 JS)跑一遍。`npm run probe:kimi`。
1
+ # server/shared/
2
+
3
+ 从小合([dev/server/bot/](../../../dev/server/bot/))抠出来的**真正通用、跟工单业务无关**的基建文件。
4
+
5
+ ## 文件清单
6
+
7
+ | 文件 | 来源 | 改动 |
8
+ |---|---|---|
9
+ | `anthropic-client.js` | `dev/server/bot/anthropic-client.js` | env 名 `MINIMAX_*` → `KIMI_*`;baseURL 默认值切 Moonshot;timeout 600s(长任务) |
10
+ | `agent-loop.js` | `dev/server/bot/agent-loop.js` | 仅改 env 名 `BOT_TOOL_TIMEOUT_MS` → `ENGINE_TOOL_TIMEOUT_MS`,默认 30s → 60s;其余照搬 |
11
+ | `concurrency.js` | `dev/server/bot/concurrency.js` | 注释从"飞书 user open_id"泛化为"key";env 名加 `ENGINE_` 前缀;`enqueueMessage` 改 `enqueueTask` |
12
+ | `time.js` | `dev/server/utils/time.js` | 零改动 |
13
+
14
+ ## 不该往这里加东西的判断
15
+
16
+ - 业务(工单 / 钩子 / 飞书卡片)→ 不该来
17
+ - 跟 dev/ 共演化的核心抽象 → 暂时直接复制;如果开始反复同步两边,就提到 monorepo `shared/` 包
18
+
19
+ ## 待验证(动工前必做)
20
+
21
+ - [ ] `cache_control: { type: 'ephemeral' }` 在 Kimi Anthropic 兼容端点是否生效
22
+ - [ ] `anthropic-beta: interleaved-thinking-2025-05-14` header 是否被 Kimi 接受
23
+ - [ ] 流式 `tool_use` + `input_json_delta` 行为一致性
24
+
25
+ 写一个 `server/_probe-kimi.js`(30 行 JS)跑一遍。`npm run probe:kimi`。
@@ -1,54 +1,54 @@
1
- /**
2
- * server/shared/deck.js — deck 设计坐标系常量(single source of truth)
3
- *
4
- * 默认 1920×1080(16:9 PPT 标准);4 档预设 ASPECT_PRESETS 可选。所有需要
5
- * playwright headless 渲染 deck 的代码(exports / mcp tools / probe scripts)
6
- * 都从这里读,将来再调只改一处。
7
- *
8
- * deck 比例由 wrap.dataset.deckAspect 决定(agent 在 canvas.html 里声明):
9
- * "16:9" 默认横屏(1920×1080)演讲 / 文档 / scrollytelling
10
- * "16:10" 宽屏笔电 / Mac 屏(1920×1200)介于 16:9 和 4:3 之间
11
- * "9:16" 竖屏(1080×1920)手机宣发 / 短故事 / 直播 cover
12
- * "4:3" 老投影 / 经典 PPT 投影仪适配(1440×1080)
13
- *
14
- * 用户面(浏览器自适应 / iframe 预览)通过 CSS 自适应 scale 让任意视口都满铺;
15
- * Playwright 渲染按 deck 比例设 viewport,scale=1 自然渲染。
16
- */
17
-
18
- export const ASPECT_PRESETS = Object.freeze({
19
- '16:9': Object.freeze({ width: 1920, height: 1080 }),
20
- '16:10': Object.freeze({ width: 1920, height: 1200 }),
21
- '9:16': Object.freeze({ width: 1080, height: 1920 }),
22
- '4:3': Object.freeze({ width: 1440, height: 1080 }),
23
- });
24
-
25
- export const DEFAULT_ASPECT = '16:9';
26
-
27
- export const DECK = ASPECT_PRESETS[DEFAULT_ASPECT];
28
-
29
- /**
30
- * 解析 aspect 字符串到 { width, height },未知值 fallback 默认 16:9。
31
- *
32
- * @param {string|null|undefined} aspect
33
- * @returns {{ width: number, height: number, key: string }}
34
- */
35
- export function resolveDeckSize(aspect) {
36
- const key = ASPECT_PRESETS[aspect] ? aspect : DEFAULT_ASPECT;
37
- const dims = ASPECT_PRESETS[key];
38
- return { width: dims.width, height: dims.height, key };
39
- }
40
-
41
- /**
42
- * 从 canvas.html 内容里抽 wrap data-deck-aspect 值。
43
- * 找不到 / 无效值 → 返回 DEFAULT_ASPECT。仅做轻量 grep,不上 cheerio。
44
- *
45
- * @param {string} html
46
- * @returns {string} aspect key (ASPECT_PRESETS 的键)
47
- */
48
- export function extractDeckAspect(html) {
49
- if (!html || typeof html !== 'string') return DEFAULT_ASPECT;
50
- const m = html.match(/<div\b[^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"][^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"]/i)
51
- || html.match(/<div\b[^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"][^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"]/i);
52
- if (!m) return DEFAULT_ASPECT;
53
- return ASPECT_PRESETS[m[1]] ? m[1] : DEFAULT_ASPECT;
54
- }
1
+ /**
2
+ * server/shared/deck.js — deck 设计坐标系常量(single source of truth)
3
+ *
4
+ * 默认 1920×1080(16:9 PPT 标准);4 档预设 ASPECT_PRESETS 可选。所有需要
5
+ * playwright headless 渲染 deck 的代码(exports / mcp tools / probe scripts)
6
+ * 都从这里读,将来再调只改一处。
7
+ *
8
+ * deck 比例由 wrap.dataset.deckAspect 决定(agent 在 canvas.html 里声明):
9
+ * "16:9" 默认横屏(1920×1080)演讲 / 文档 / scrollytelling
10
+ * "16:10" 宽屏笔电 / Mac 屏(1920×1200)介于 16:9 和 4:3 之间
11
+ * "9:16" 竖屏(1080×1920)手机宣发 / 短故事 / 直播 cover
12
+ * "4:3" 老投影 / 经典 PPT 投影仪适配(1440×1080)
13
+ *
14
+ * 用户面(浏览器自适应 / iframe 预览)通过 CSS 自适应 scale 让任意视口都满铺;
15
+ * Playwright 渲染按 deck 比例设 viewport,scale=1 自然渲染。
16
+ */
17
+
18
+ export const ASPECT_PRESETS = Object.freeze({
19
+ '16:9': Object.freeze({ width: 1920, height: 1080 }),
20
+ '16:10': Object.freeze({ width: 1920, height: 1200 }),
21
+ '9:16': Object.freeze({ width: 1080, height: 1920 }),
22
+ '4:3': Object.freeze({ width: 1440, height: 1080 }),
23
+ });
24
+
25
+ export const DEFAULT_ASPECT = '16:9';
26
+
27
+ export const DECK = ASPECT_PRESETS[DEFAULT_ASPECT];
28
+
29
+ /**
30
+ * 解析 aspect 字符串到 { width, height },未知值 fallback 默认 16:9。
31
+ *
32
+ * @param {string|null|undefined} aspect
33
+ * @returns {{ width: number, height: number, key: string }}
34
+ */
35
+ export function resolveDeckSize(aspect) {
36
+ const key = ASPECT_PRESETS[aspect] ? aspect : DEFAULT_ASPECT;
37
+ const dims = ASPECT_PRESETS[key];
38
+ return { width: dims.width, height: dims.height, key };
39
+ }
40
+
41
+ /**
42
+ * 从 canvas.html 内容里抽 wrap data-deck-aspect 值。
43
+ * 找不到 / 无效值 → 返回 DEFAULT_ASPECT。仅做轻量 grep,不上 cheerio。
44
+ *
45
+ * @param {string} html
46
+ * @returns {string} aspect key (ASPECT_PRESETS 的键)
47
+ */
48
+ export function extractDeckAspect(html) {
49
+ if (!html || typeof html !== 'string') return DEFAULT_ASPECT;
50
+ const m = html.match(/<div\b[^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"][^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"]/i)
51
+ || html.match(/<div\b[^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"][^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"]/i);
52
+ if (!m) return DEFAULT_ASPECT;
53
+ return ASPECT_PRESETS[m[1]] ? m[1] : DEFAULT_ASPECT;
54
+ }
@@ -1,49 +1,49 @@
1
- /**
2
- * 北京时间工具
3
- *
4
- * 来源:从 dev/server/utils/time.js 复制(零改动)
5
- *
6
- * toISOString 是 UTC,直接用会在东八区凌晨误差 8 小时。
7
- * 所有注入 LLM 的"当前时间"应该走这个 util,输出北京时间 + 星期。
8
- */
9
-
10
- const WEEKDAY_CN = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
11
-
12
- /**
13
- * 返回北京时间的多种呈现,供不同 prompt 复用
14
- * @returns {{ today: string, dateTime: string, weekday: string, nowMs: number, iso: string }}
15
- * today: "2026-04-22"
16
- * dateTime: "2026-04-22 14:32:05"
17
- * weekday: "周三"
18
- * nowMs: 毫秒时间戳(给 LLM 做差值用)
19
- * iso: "2026-04-22T14:32:05+08:00"
20
- */
21
- export function formatBeijingNow() {
22
- const now = new Date();
23
- const nowMs = now.getTime();
24
-
25
- // 转北京时间(东八区偏移)
26
- const bj = new Date(nowMs + 8 * 3600 * 1000);
27
- const y = bj.getUTCFullYear();
28
- const m = String(bj.getUTCMonth() + 1).padStart(2, '0');
29
- const d = String(bj.getUTCDate()).padStart(2, '0');
30
- const hh = String(bj.getUTCHours()).padStart(2, '0');
31
- const mm = String(bj.getUTCMinutes()).padStart(2, '0');
32
- const ss = String(bj.getUTCSeconds()).padStart(2, '0');
33
- const weekday = WEEKDAY_CN[bj.getUTCDay()];
34
-
35
- const today = `${y}-${m}-${d}`;
36
- const dateTime = `${today} ${hh}:${mm}:${ss}`;
37
- const iso = `${today}T${hh}:${mm}:${ss}+08:00`;
38
-
39
- return { today, dateTime, weekday, nowMs, iso };
40
- }
41
-
42
- /**
43
- * 返回适合塞进 prompt 的一行文本
44
- * "当前时间:2026-04-22 周三 14:32:05(北京时间,毫秒时间戳 1745...)"
45
- */
46
- export function beijingNowLine() {
47
- const { today, weekday, dateTime, nowMs } = formatBeijingNow();
48
- return `当前时间:${dateTime} ${weekday}(北京时间,毫秒时间戳 ${nowMs})`;
49
- }
1
+ /**
2
+ * 北京时间工具
3
+ *
4
+ * 来源:从 dev/server/utils/time.js 复制(零改动)
5
+ *
6
+ * toISOString 是 UTC,直接用会在东八区凌晨误差 8 小时。
7
+ * 所有注入 LLM 的"当前时间"应该走这个 util,输出北京时间 + 星期。
8
+ */
9
+
10
+ const WEEKDAY_CN = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
11
+
12
+ /**
13
+ * 返回北京时间的多种呈现,供不同 prompt 复用
14
+ * @returns {{ today: string, dateTime: string, weekday: string, nowMs: number, iso: string }}
15
+ * today: "2026-04-22"
16
+ * dateTime: "2026-04-22 14:32:05"
17
+ * weekday: "周三"
18
+ * nowMs: 毫秒时间戳(给 LLM 做差值用)
19
+ * iso: "2026-04-22T14:32:05+08:00"
20
+ */
21
+ export function formatBeijingNow() {
22
+ const now = new Date();
23
+ const nowMs = now.getTime();
24
+
25
+ // 转北京时间(东八区偏移)
26
+ const bj = new Date(nowMs + 8 * 3600 * 1000);
27
+ const y = bj.getUTCFullYear();
28
+ const m = String(bj.getUTCMonth() + 1).padStart(2, '0');
29
+ const d = String(bj.getUTCDate()).padStart(2, '0');
30
+ const hh = String(bj.getUTCHours()).padStart(2, '0');
31
+ const mm = String(bj.getUTCMinutes()).padStart(2, '0');
32
+ const ss = String(bj.getUTCSeconds()).padStart(2, '0');
33
+ const weekday = WEEKDAY_CN[bj.getUTCDay()];
34
+
35
+ const today = `${y}-${m}-${d}`;
36
+ const dateTime = `${today} ${hh}:${mm}:${ss}`;
37
+ const iso = `${today}T${hh}:${mm}:${ss}+08:00`;
38
+
39
+ return { today, dateTime, weekday, nowMs, iso };
40
+ }
41
+
42
+ /**
43
+ * 返回适合塞进 prompt 的一行文本
44
+ * "当前时间:2026-04-22 周三 14:32:05(北京时间,毫秒时间戳 1745...)"
45
+ */
46
+ export function beijingNowLine() {
47
+ const { today, weekday, dateTime, nowMs } = formatBeijingNow();
48
+ return `当前时间:${dateTime} ${weekday}(北京时间,毫秒时间戳 ${nowMs})`;
49
+ }
@@ -1,53 +1,53 @@
1
- # server/style-pipeline/ — 风格提取流水线
2
-
3
- **Nodesign 第二条核心通路**:用户上传参考素材(PPT / PDF / HTML)→ 提取结构化 style tokens → 喂给 engine 下游。
4
-
5
- ## 为什么这个模块独立于 engine
6
-
7
- 组长释放的产品意图:当前 deskskill-engine 是"brief → metaphor 推导 → deck"单管道,但真实需求是"风格参考"——用户上传已有 deck,想保留其视觉语言做新内容。
8
-
9
- **这事儿是后端工程问题,不是 skill 问题**:色板抽样、字体识别、spacing 测量、layout grid 推断——按训练分布让 LLM 用 declarative 路径描述风格会丢精度(procedural / declarative 能力诊断已知)。所以做工程化提取,输出结构化 tokens 喂 skill 下游。
10
-
11
- ## 输入 / 输出契约(待设计)
12
-
13
- **输入**:
14
- - `application/pdf` — PDF 演示稿
15
- - `.pptx` — PowerPoint
16
- - `.html` — 已有 HTML deck(最干净,可能首推 MVP)
17
-
18
- **输出**:`StyleTokens` 结构化 JSON(schema 待定),大致:
19
- ```json
20
- {
21
- "palette": {
22
- "background": ["#fffaf0", "#f0e8d8"],
23
- "foreground": ["#1a1a1a", "#666"],
24
- "accent": ["#c83e3e"]
25
- },
26
- "typography": {
27
- "display": { "family": "...", "weight": 800, "tracking": "-0.02em" },
28
- "body": { "family": "...", "weight": 400, "size_clamp": "..." }
29
- },
30
- "spacing": { "rhythm": [4, 8, 16, 32, 64], "page_padding": "..." },
31
- "layout": { "grid": "12-col" | "asymmetric" | ..., "alignment": "..." },
32
- "motion_signals": [...], // 如果是 HTML,可静态扫到 transition / animation
33
- "metaphor_hints": "..." // 可选:让 LLM 看一眼后给一句话直觉总结
34
- }
35
- ```
36
-
37
- ## 技术路线候选(动工前需先做根因诊断)
38
-
39
- ⚠️ **先别选实现方式**。组长说之前用模版 skill 试过风格参考路径效果不好——根因待诊断(参 [HANDOVER.md](../../HANDOVER.md) §六)。
40
-
41
- 提取技术几条候选路线:
42
- - **PDF / PPTX**:`pdf2htmlEX` / `python-pptx` / `LibreOffice headless` 转中间格式后扫
43
- - **HTML**:DOM + computed style 直接读
44
- - **视觉路径**:截图 → vision model(Kimi K2.6 / Claude Opus)描述 + 关键元素裁切
45
- - **混合**:DOM 提骨架 + vision 提语义(推荐)
46
-
47
- ## 与 engine 的接口
48
-
49
- style-pipeline 输出的 `StyleTokens` 作为 engine `runs` 的 `inputs.style_reference` 传入,engine 在加载 deskskill-engine 时把 tokens 注入 system prompt 一段,让 metaphor 推导跟 reference 对话(不是替代 metaphor)。
50
-
51
- ## 责任划分
52
-
53
- 负责人:你。新东西。
1
+ # server/style-pipeline/ — 风格提取流水线
2
+
3
+ **Nodesign 第二条核心通路**:用户上传参考素材(PPT / PDF / HTML)→ 提取结构化 style tokens → 喂给 engine 下游。
4
+
5
+ ## 为什么这个模块独立于 engine
6
+
7
+ 组长释放的产品意图:当前 deskskill-engine 是"brief → metaphor 推导 → deck"单管道,但真实需求是"风格参考"——用户上传已有 deck,想保留其视觉语言做新内容。
8
+
9
+ **这事儿是后端工程问题,不是 skill 问题**:色板抽样、字体识别、spacing 测量、layout grid 推断——按训练分布让 LLM 用 declarative 路径描述风格会丢精度(procedural / declarative 能力诊断已知)。所以做工程化提取,输出结构化 tokens 喂 skill 下游。
10
+
11
+ ## 输入 / 输出契约(待设计)
12
+
13
+ **输入**:
14
+ - `application/pdf` — PDF 演示稿
15
+ - `.pptx` — PowerPoint
16
+ - `.html` — 已有 HTML deck(最干净,可能首推 MVP)
17
+
18
+ **输出**:`StyleTokens` 结构化 JSON(schema 待定),大致:
19
+ ```json
20
+ {
21
+ "palette": {
22
+ "background": ["#fffaf0", "#f0e8d8"],
23
+ "foreground": ["#1a1a1a", "#666"],
24
+ "accent": ["#c83e3e"]
25
+ },
26
+ "typography": {
27
+ "display": { "family": "...", "weight": 800, "tracking": "-0.02em" },
28
+ "body": { "family": "...", "weight": 400, "size_clamp": "..." }
29
+ },
30
+ "spacing": { "rhythm": [4, 8, 16, 32, 64], "page_padding": "..." },
31
+ "layout": { "grid": "12-col" | "asymmetric" | ..., "alignment": "..." },
32
+ "motion_signals": [...], // 如果是 HTML,可静态扫到 transition / animation
33
+ "metaphor_hints": "..." // 可选:让 LLM 看一眼后给一句话直觉总结
34
+ }
35
+ ```
36
+
37
+ ## 技术路线候选(动工前需先做根因诊断)
38
+
39
+ ⚠️ **先别选实现方式**。组长说之前用模版 skill 试过风格参考路径效果不好——根因待诊断(参 [HANDOVER.md](../../HANDOVER.md) §六)。
40
+
41
+ 提取技术几条候选路线:
42
+ - **PDF / PPTX**:`pdf2htmlEX` / `python-pptx` / `LibreOffice headless` 转中间格式后扫
43
+ - **HTML**:DOM + computed style 直接读
44
+ - **视觉路径**:截图 → vision model(Kimi K2.6 / Claude Opus)描述 + 关键元素裁切
45
+ - **混合**:DOM 提骨架 + vision 提语义(推荐)
46
+
47
+ ## 与 engine 的接口
48
+
49
+ style-pipeline 输出的 `StyleTokens` 作为 engine `runs` 的 `inputs.style_reference` 传入,engine 在加载 deskskill-engine 时把 tokens 注入 system prompt 一段,让 metaphor 推导跟 reference 对话(不是替代 metaphor)。
50
+
51
+ ## 责任划分
52
+
53
+ 负责人:你。新东西。
@@ -1,36 +1,36 @@
1
- /**
2
- * server/ws/broker.js — Per-project EventBus 注册表
3
- *
4
- * 每个 project 一个 EventBus 实例,agent runAgent 跑 turn 时通过 ctx.eventBus.publish
5
- * 推事件,WS 客户端订阅同一个 bus 收 stream。
6
- *
7
- * Bus 是 in-memory pub/sub,不持久化。重启 server 后所有订阅断开,新事件从零开始;
8
- * 前端要能容忍这个(重连后通过 hydrate 重新拉项目状态,丢的事件不补)。
9
- */
10
-
11
- import { EventBus } from '../engine/agent/events.js';
12
- import { attachLiveTurnTracker } from '../engine/runs/live-turn.js';
13
-
14
- /** @type {Map<string, EventBus>} */
15
- const projectBuses = new Map();
16
-
17
- /** 拿 project 的 EventBus(懒创建) */
18
- export function getProjectBus(projectId) {
19
- let bus = projectBuses.get(projectId);
20
- if (!bus) {
21
- bus = new EventBus();
22
- // live-turn 快照折叠器:进行中 turn 的事件物化成可恢复状态,
23
- // WS 重连走"hydrate + ws.live_turn 快照 + 尾随"三段协议。见 live-turn.js
24
- attachLiveTurnTracker(bus);
25
- projectBuses.set(projectId, bus);
26
- }
27
- return bus;
28
- }
29
-
30
- /**
31
- * project 删除时清理 bus(释放内存)。
32
- * 不影响已建立的 ws 连接 — 它们还能 publish 但不再有订阅者。
33
- */
34
- export function disposeProjectBus(projectId) {
35
- projectBuses.delete(projectId);
36
- }
1
+ /**
2
+ * server/ws/broker.js — Per-project EventBus 注册表
3
+ *
4
+ * 每个 project 一个 EventBus 实例,agent runAgent 跑 turn 时通过 ctx.eventBus.publish
5
+ * 推事件,WS 客户端订阅同一个 bus 收 stream。
6
+ *
7
+ * Bus 是 in-memory pub/sub,不持久化。重启 server 后所有订阅断开,新事件从零开始;
8
+ * 前端要能容忍这个(重连后通过 hydrate 重新拉项目状态,丢的事件不补)。
9
+ */
10
+
11
+ import { EventBus } from '../engine/agent/events.js';
12
+ import { attachLiveTurnTracker } from '../engine/runs/live-turn.js';
13
+
14
+ /** @type {Map<string, EventBus>} */
15
+ const projectBuses = new Map();
16
+
17
+ /** 拿 project 的 EventBus(懒创建) */
18
+ export function getProjectBus(projectId) {
19
+ let bus = projectBuses.get(projectId);
20
+ if (!bus) {
21
+ bus = new EventBus();
22
+ // live-turn 快照折叠器:进行中 turn 的事件物化成可恢复状态,
23
+ // WS 重连走"hydrate + ws.live_turn 快照 + 尾随"三段协议。见 live-turn.js
24
+ attachLiveTurnTracker(bus);
25
+ projectBuses.set(projectId, bus);
26
+ }
27
+ return bus;
28
+ }
29
+
30
+ /**
31
+ * project 删除时清理 bus(释放内存)。
32
+ * 不影响已建立的 ws 连接 — 它们还能 publish 但不再有订阅者。
33
+ */
34
+ export function disposeProjectBus(projectId) {
35
+ projectBuses.delete(projectId);
36
+ }