@xiaobuyu/nodesign 0.0.1 → 0.0.3

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 (358) 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 +42 -22
  9. package/server/api/assets/notes.js +194 -144
  10. package/server/api/assets.js +891 -896
  11. package/server/api/board.js +134 -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 +465 -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 +258 -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 +388 -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 +1035 -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 +351 -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 +152 -155
  118. package/server/engine/mcp/tools/crystallize-skill.js +168 -168
  119. package/server/engine/mcp/tools/edit-sketch.js +167 -0
  120. package/server/engine/mcp/tools/explain-style.js +237 -237
  121. package/server/engine/mcp/tools/export-handoff.js +133 -133
  122. package/server/engine/mcp/tools/expose-tweaks.js +149 -149
  123. package/server/engine/mcp/tools/generate-image.js +842 -842
  124. package/server/engine/mcp/tools/get-computed-styles.js +164 -164
  125. package/server/engine/mcp/tools/get-pending-changes.js +205 -205
  126. package/server/engine/mcp/tools/h3box-ssh.js +84 -84
  127. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -82
  128. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -554
  129. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -112
  130. package/server/engine/mcp/tools/helpers/perception-page.js +215 -215
  131. package/server/engine/mcp/tools/helpers/reference-download.js +103 -103
  132. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -80
  133. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -280
  134. package/server/engine/mcp/tools/highlight.js +68 -68
  135. package/server/engine/mcp/tools/list-pages.js +222 -222
  136. package/server/engine/mcp/tools/look-at-board.js +124 -0
  137. package/server/engine/mcp/tools/lookup-tags.js +59 -59
  138. package/server/engine/mcp/tools/navigate-to-page.js +60 -60
  139. package/server/engine/mcp/tools/organize-board.js +64 -64
  140. package/server/engine/mcp/tools/paint-still.js +434 -434
  141. package/server/engine/mcp/tools/pin-to-board.js +130 -130
  142. package/server/engine/mcp/tools/preview-deck.js +130 -130
  143. package/server/engine/mcp/tools/profile-scroll.js +305 -305
  144. package/server/engine/mcp/tools/publish-site.js +102 -102
  145. package/server/engine/mcp/tools/query-elements.js +195 -195
  146. package/server/engine/mcp/tools/read-board.js +190 -103
  147. package/server/engine/mcp/tools/read-document.js +93 -93
  148. package/server/engine/mcp/tools/read-page.js +264 -264
  149. package/server/engine/mcp/tools/read-tavern-json.js +143 -143
  150. package/server/engine/mcp/tools/read-user-view.js +59 -0
  151. package/server/engine/mcp/tools/record-decision.js +140 -140
  152. package/server/engine/mcp/tools/relate-on-board.js +112 -110
  153. package/server/engine/mcp/tools/report-issue.js +115 -115
  154. package/server/engine/mcp/tools/roll-film.js +266 -266
  155. package/server/engine/mcp/tools/screenshot-docx.js +138 -138
  156. package/server/engine/mcp/tools/screenshot-url.js +195 -195
  157. package/server/engine/mcp/tools/screenshot.js +583 -583
  158. package/server/engine/mcp/tools/sketch-on-board.js +337 -0
  159. package/server/engine/mcp/tools/tier-gate.js +96 -96
  160. package/server/engine/mcp/tools/trace-motion.js +215 -215
  161. package/server/engine/mcp/tools/web-search.js +548 -548
  162. package/server/engine/mcp/tools/write-on-board.js +130 -0
  163. package/server/engine/motion/inventory.js +349 -349
  164. package/server/engine/perception/session.js +235 -235
  165. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -5
  166. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +199 -192
  167. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -667
  168. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -22
  169. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -25
  170. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -23
  171. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -21
  172. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -23
  173. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -21
  174. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +169 -162
  175. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -407
  176. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -80
  177. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +235 -228
  178. 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
  179. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -268
  180. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +330 -323
  181. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -134
  182. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -61
  183. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -163
  184. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -86
  185. package/server/engine/runs/active-runs.js +698 -698
  186. package/server/engine/runs/board-tasklist.js +130 -0
  187. package/server/engine/runs/live-turn.js +252 -252
  188. package/server/engine/runs/store.js +364 -364
  189. package/server/engine/runs/turn-relay.js +217 -217
  190. package/server/engine/runtime/workspace.js +164 -164
  191. package/server/index.js +3 -0
  192. package/server/lib/artifact-file-path.js +80 -80
  193. package/server/lib/artifact-target.js +284 -284
  194. package/server/lib/asset-refs.js +239 -239
  195. package/server/lib/async-queue.js +104 -104
  196. package/server/lib/auto-relations.js +130 -130
  197. package/server/lib/binding-types.js +72 -60
  198. package/server/lib/board-graph-export.js +191 -0
  199. package/server/lib/board-groups.js +167 -0
  200. package/server/lib/board-hero.js +76 -0
  201. package/server/lib/board-kind-sizes.js +85 -62
  202. package/server/lib/board-relations.js +133 -133
  203. package/server/lib/browse-proxy.js +180 -180
  204. package/server/lib/canvas-id.js +36 -36
  205. package/server/lib/chalk.js +121 -0
  206. package/server/lib/cover.js +227 -227
  207. package/server/lib/danbooru-tags.js +291 -291
  208. package/server/lib/doc-extract.js +156 -156
  209. package/server/lib/docx/build-from-source.js +260 -260
  210. package/server/lib/docx/build.js +490 -490
  211. package/server/lib/docx/dump-styles.js +287 -287
  212. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -164
  213. package/server/lib/docx/merge-runs.js +129 -129
  214. package/server/lib/docx/numbering.js +218 -218
  215. package/server/lib/docx/order.js +152 -152
  216. package/server/lib/docx/rawzip.js +172 -172
  217. package/server/lib/docx/render.js +92 -92
  218. package/server/lib/docx/text-lint.js +225 -225
  219. package/server/lib/docx/tokens.js +335 -335
  220. package/server/lib/docx/units.js +29 -29
  221. package/server/lib/docx/xml.js +291 -291
  222. package/server/lib/docx-pages.js +187 -187
  223. package/server/lib/export-collect.js +289 -289
  224. package/server/lib/export-package.js +210 -210
  225. package/server/lib/html-srcset.js +145 -145
  226. package/server/lib/image-variant.js +460 -460
  227. package/server/lib/ingress/forward-openai-chat.js +305 -305
  228. package/server/lib/ingress/openai-chat.js +491 -491
  229. package/server/lib/ingress/session-notice.js +66 -66
  230. package/server/lib/ingress/session-routes.js +68 -68
  231. package/server/lib/ingress/slot-probe.js +130 -130
  232. package/server/lib/ingress/upstream-billing.js +52 -52
  233. package/server/lib/ingress/upstream-fail-streak.js +72 -72
  234. package/server/lib/ingress/upstream-truncation.js +48 -48
  235. package/server/lib/issues-store.js +182 -182
  236. package/server/lib/kinds/deck.js +72 -72
  237. package/server/lib/kinds/docx.js +283 -283
  238. package/server/lib/kinds/file-kinds.js +113 -113
  239. package/server/lib/kinds/index.js +202 -202
  240. package/server/lib/kinds/site.js +161 -161
  241. package/server/lib/model-ingress.js +543 -543
  242. package/server/lib/moderation.js +255 -255
  243. package/server/lib/notice-store.js +103 -103
  244. package/server/lib/plugin-install.js +104 -104
  245. package/server/lib/plugin-validator.js +721 -721
  246. package/server/lib/publish-store.js +115 -115
  247. package/server/lib/quick-summary.js +52 -52
  248. package/server/lib/quota.js +270 -270
  249. package/server/lib/rate-window.js +29 -29
  250. package/server/lib/reference-assets.js +92 -92
  251. package/server/lib/region-shot.js +135 -135
  252. package/server/lib/safe-path.js +73 -73
  253. package/server/lib/sdk-session.js +33 -33
  254. package/server/lib/showcase-store.js +92 -92
  255. package/server/lib/site-publish.js +465 -465
  256. package/server/lib/sketch-layout.js +277 -0
  257. package/server/lib/ssrf-guard.js +432 -432
  258. package/server/lib/task-scan.js +158 -158
  259. package/server/lib/tavern-json.js +154 -154
  260. package/server/lib/video-variant.js +237 -237
  261. package/server/lib/workspace-path.js +33 -33
  262. package/server/ops/fix-sdk-musl.mjs +40 -40
  263. package/server/ops/install-macos-fonts.sh +114 -114
  264. package/server/ops/macos-fonts.conf +336 -336
  265. package/server/ops/sandbox-shim/bwrap +57 -57
  266. package/server/projects/assets-summary.js +119 -119
  267. package/server/projects/auto-name.js +53 -53
  268. package/server/projects/board-limits.js +12 -0
  269. package/server/projects/board-sanitize.js +252 -0
  270. package/server/projects/board-store.js +507 -640
  271. package/server/projects/move-entry.js +103 -103
  272. package/server/projects/store.js +270 -270
  273. package/server/projects/ui-config.js +60 -54
  274. package/server/projects/viewpoint-store.js +78 -0
  275. package/server/projects/workspace-templates.js +53 -53
  276. package/server/projects/workspace.js +1025 -1025
  277. package/server/runtime/local-config.js +177 -177
  278. package/server/runtime/profile.js +72 -72
  279. package/server/services/rembg-service.py +334 -334
  280. package/server/shared/README.md +25 -25
  281. package/server/shared/deck.js +54 -54
  282. package/server/shared/time.js +49 -49
  283. package/server/style-pipeline/README.md +53 -53
  284. package/server/ws/broker.js +39 -36
  285. package/server/ws/browse-channel.js +177 -177
  286. package/server/ws/index.js +386 -386
  287. package/web/README.md +89 -89
  288. package/web/dist/assets/BrowserWindow-P_vIdh-G.js +11 -0
  289. package/web/dist/assets/{DeckWindow-4G0xX7P3.js → DeckWindow-BpLv5082.js} +3 -3
  290. package/web/dist/assets/{DocxWindow-BXQsoPkh.js → DocxWindow-DSAU1-tD.js} +4 -4
  291. package/web/dist/assets/MermaidBlock-DR1GikCv.js +313 -0
  292. package/web/dist/assets/SiteWindow-92uBuRRR.js +18 -0
  293. package/web/dist/assets/abnfDiagram-VCTEODGH-uA8Esix4.js +1 -0
  294. package/web/dist/assets/arc-D_khH_xN.js +1 -0
  295. package/web/dist/assets/architectureDiagram-5GKGNRK7-DydJHqOt.js +36 -0
  296. package/web/dist/assets/blockDiagram-NRAW4CY4-B7wBbKiW.js +129 -0
  297. package/web/dist/assets/c4Diagram-UCG6FXSJ-6mrH0x7Y.js +38 -0
  298. package/web/dist/assets/channel-DGkccMO1.js +1 -0
  299. package/web/dist/assets/chunk-2Q5K7J3B-Cuikho5Q.js +1 -0
  300. package/web/dist/assets/chunk-5VM5RSS4-3-KZ5AUz.js +15 -0
  301. package/web/dist/assets/chunk-F27PBJKO-Bkwq2gGU.js +1 -0
  302. package/web/dist/assets/chunk-G27WJ6UU-BLyQzdGE.js +231 -0
  303. package/web/dist/assets/chunk-JWPE2WC7-B7HxxQds.js +1 -0
  304. package/web/dist/assets/chunk-LCL6LL3I-CtXrnUwF.js +206 -0
  305. package/web/dist/assets/chunk-POPQ4Y6H-dxddZlXt.js +1 -0
  306. package/web/dist/assets/chunk-SVP7TREG-DpkmrgHn.js +88 -0
  307. package/web/dist/assets/chunk-XXDRQBXY-BwZ7RbpQ.js +1 -0
  308. package/web/dist/assets/classDiagram-DTDB5LWJ-BGscw3OD.js +1 -0
  309. package/web/dist/assets/classDiagram-v2-JRS7N3AN-BGscw3OD.js +1 -0
  310. package/web/dist/assets/cose-bilkent-JH36ORCC-DGFOsMUt.js +1 -0
  311. package/web/dist/assets/cynefin-OW5HDTMX-DUwn3ehS.js +178 -0
  312. package/web/dist/assets/cynefinDiagram-5FMLGOSQ-DlLAOZ9x.js +62 -0
  313. package/web/dist/assets/cytoscape.esm-BjAbmLdb.js +331 -0
  314. package/web/dist/assets/dagre-3AP2YEHR-CyourLfz.js +4 -0
  315. package/web/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  316. package/web/dist/assets/diagram-S7CK7UJ4-BTMbx2np.js +30 -0
  317. package/web/dist/assets/diagram-UQ7AKVKN-UK94_1-P.js +41 -0
  318. package/web/dist/assets/diagram-VSXAHHWV-C7zS-v9v.js +3 -0
  319. package/web/dist/assets/diagram-VX7I27RA-DKJRa6CK.js +24 -0
  320. package/web/dist/assets/diagram-Z3DM3KII-kUbAfGAp.js +24 -0
  321. package/web/dist/assets/ebnfDiagram-PWID7BFC-CVW16_vb.js +1 -0
  322. package/web/dist/assets/erDiagram-SSCWMZ5O-BRQMFQ5y.js +99 -0
  323. package/web/dist/assets/flowDiagram-A5DVABFB-S34LpLtK.js +168 -0
  324. package/web/dist/assets/ganttDiagram-EL5Y4UJY-BFiqk1-G.js +292 -0
  325. package/web/dist/assets/gitGraphDiagram-WWUBYQGX-LZsrdyyv.js +106 -0
  326. package/web/dist/assets/index-GAamh1p4.js +2152 -0
  327. package/web/dist/assets/infoDiagram-RXCK75RN-0DvN6KIp.js +2 -0
  328. package/web/dist/assets/init-Gi6I4Gst.js +1 -0
  329. package/web/dist/assets/ishikawaDiagram-5VMMS53U-CaY3A-Bx.js +70 -0
  330. package/web/dist/assets/journeyDiagram-EYS64GPL-BBeiaCrj.js +139 -0
  331. package/web/dist/assets/kanban-definition-3QL26DDD-ux42DRXQ.js +89 -0
  332. package/web/dist/assets/layout-CnXiF_NB.js +1 -0
  333. package/web/dist/assets/linear-BMW0u6G6.js +1 -0
  334. package/web/dist/assets/mindmap-definition-FBJOCRG2-hUxSpdKn.js +96 -0
  335. package/web/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  336. package/web/dist/assets/pegDiagram-XKGWAZYB-aCaQPH0w.js +1 -0
  337. package/web/dist/assets/{pending-edit-apply-DTjo2geW.js → pending-edit-apply-AcdOQ9Ij.js} +6 -6
  338. package/web/dist/assets/pieDiagram-E7YTZNPT-CmOEZ8zg.js +39 -0
  339. package/web/dist/assets/quadrantDiagram-AXDQQJYC-VW6fAhsV.js +7 -0
  340. package/web/dist/assets/railroadDiagram-O6MQD6OU-CKJ7Ba5K.js +1 -0
  341. package/web/dist/assets/requirementDiagram-EFPCY7ZU-pNGkq9Vw.js +84 -0
  342. package/web/dist/assets/{rotate-cw-LMT3x1Zj.js → rotate-cw-KAfChbGV.js} +1 -1
  343. package/web/dist/assets/sankeyDiagram-P5KCCOFB-BIMmDTfZ.js +40 -0
  344. package/web/dist/assets/sequenceDiagram-WJ2MYXX4-BBW7wzKY.js +162 -0
  345. package/web/dist/assets/sizeCapture-X5ZJPWSS-DdkXmLYR.js +1 -0
  346. package/web/dist/assets/{square-dashed-mouse-pointer-CBoAkfhi.js → square-dashed-mouse-pointer-CDUlhUP7.js} +1 -1
  347. package/web/dist/assets/stateDiagram-HBIQ2CUA-W313Uz16.js +1 -0
  348. package/web/dist/assets/stateDiagram-v2-4QOOHH4V-DDhJBZzf.js +1 -0
  349. package/web/dist/assets/swimlanes-XN3QIQJK-C29TL26K.js +1 -0
  350. package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BfN-Xdmu.js +8 -0
  351. package/web/dist/assets/timeline-definition-24CTP7MA-CF0JMObX.js +120 -0
  352. package/web/dist/assets/vennDiagram-4TSXK5OY-DrDFsaH3.js +34 -0
  353. package/web/dist/assets/wardleyDiagram-VM6X3IG4-CVrnRIS_.js +78 -0
  354. package/web/dist/assets/xychartDiagram-S5SC5T6Z-BvkN1zsT.js +7 -0
  355. package/web/dist/index.html +17 -17
  356. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +0 -11
  357. package/web/dist/assets/SiteWindow-D6eS-2gM.js +0 -18
  358. package/web/dist/assets/index-Cbl3ATvp.js +0 -2125
@@ -0,0 +1,252 @@
1
+ /**
2
+ * server/projects/board-sanitize.js — board.json 的校验/清洗(2026-08-23 从 board-store 拆出)
3
+ *
4
+ * 纯函数,不碰磁盘不碰锁。board-store 是唯一读写方,读进来先过这里、写出去前
5
+ * 也过这里;字段的白名单与上限全在这一份。拆出来只是因为 board-store 胖过了
6
+ * 行数棘轮,语义一个字没改。
7
+ *
8
+ * schema 见 board-store 头注释。黑板字段(2026-08-23):
9
+ * object.tag / object.staging / text.data.format
10
+ * binding.material / binding.tag / binding.staging
11
+ */
12
+
13
+ import { isBindingType, isBindingMaterial } from '../lib/binding-types.js';
14
+ import { DEFAULT_BOARD_SIZE, MAX_OBJECTS, MAX_ZONES, MAX_BINDINGS } from './board-limits.js';
15
+
16
+ export function clampNum(v, min, max, fallback) {
17
+ const n = Number(v);
18
+ if (!Number.isFinite(n)) return fallback;
19
+ return Math.min(max, Math.max(min, Math.round(n)));
20
+ }
21
+
22
+ export function sanitizeSize(raw) {
23
+ return {
24
+ w: clampNum(raw?.w, 1000, 20000, DEFAULT_BOARD_SIZE.w),
25
+ h: clampNum(raw?.h, 800, 20000, DEFAULT_BOARD_SIZE.h),
26
+ };
27
+ }
28
+
29
+ /**
30
+ * **画布原生**物件的形态白名单。
31
+ *
32
+ * 绝大多数画布物件是磁盘产物的影子:board.json 只存它摆在哪,本体是文件
33
+ * (所以 agent 读得到、能进上下文、删文件即消失)。涂鸦不一样 —— 它没有
34
+ * 有意义的文件形态,board.json 就是它的**本体**。这类物件必须显式登记,
35
+ * 否则任何人往 objects 里塞一个 kind 就能造出一个不受形态表管的东西。
36
+ *
37
+ * 2026-08-08 加进 `text`。在那之前画布上打的字一律落成 `.md` 便签,理由是
38
+ * "agent 读得到"。但用户要的是**白板**:在工程文件旁边随手写一句、画一笔,
39
+ * 那是给自己的记号,不是给 agent 的输入。想让 agent 看见的写便利贴 ——
40
+ * 那条路还在,挪到了右键菜单里。
41
+ */
42
+ const CANVAS_NATIVE_KINDS = new Set(['scribble', 'text']);
43
+
44
+ /**
45
+ * 坐标夹持上限。画布 2026-08-13 起全向无限,坐标不再由 board.size 夹住 ——
46
+ * 这个数只挡非有限值和纯属事故的数字(±100 万世界像素之外没有正常操作能到)。
47
+ */
48
+ const COORD_LIMIT = 1e6;
49
+
50
+ /** 涂鸦路径串上限。一条随手画的线约 300~800 字符,8000 够长且撑不爆 board.json */
51
+ const MAX_SCRIBBLE_PATH = 8000;
52
+ /**
53
+ * 画布文字的字数上限。
54
+ *
55
+ * 它是"写在白板上的一句话",不是文档 —— 长东西该写成 .md(那是便利贴,
56
+ * agent 读得到)。2000 字够写一段说明,也撑不爆 board.json。
57
+ */
58
+ const MAX_TEXT_LEN = 2000;
59
+ /**
60
+ * md 档文字的上限(2026-08-23 黑板)。画布上的 markdown/KaTeX/mermaid 节点比手写
61
+ * 一句话长,但它仍是"黑板上的一块"不是文档 —— 想写长的走 .md。
62
+ */
63
+ const MAX_MD_TEXT_LEN = 4000;
64
+ /** 文字的排版格式:plain = 原样手写;md = Markdown(含 KaTeX 与 mermaid 围栏) */
65
+ const TEXT_FORMATS = ['plain', 'md'];
66
+ /**
67
+ * 分组标签(2026-08-23 黑板):物件和线都可以带。它**不是几何容器**,只是一个
68
+ * 字段 —— 读侧按它过滤、渲染侧按它画包络、staging 落定按它成批。字符集收紧
69
+ * 是因为它会进 DOM 属性和 URL 查询串。
70
+ */
71
+ const TAG_RE = /^[\w\u4e00-\u9fff\u3040-\u30ff-]{1,40}$/;
72
+ /**
73
+ * 画布 id 的路径安全(2026-08-23 fable 审出 P0):id 大多是工作区相对路径,下游有人拿它拼
74
+ * 文件路径(removeByTag 删板书、chalkExcerpts 读板书)。拒掉 `..` 段、绝对路径、反斜杠、NUL;
75
+ * 带形态前缀(deck:/site:/…)的先剥前缀再查。
76
+ */
77
+ export function isSafeCanvasId(id) {
78
+ if (typeof id !== 'string' || !id || id.length > 300) return false;
79
+ if (id.includes('\0') || id.includes('\\')) return false;
80
+ const c = id.indexOf(':');
81
+ const p = (c > 0 && /^[a-z]+$/.test(id.slice(0, c))) ? id.slice(c + 1) : id;
82
+ if (p.startsWith('/')) return false;
83
+ return !p.split('/').some(seg => seg === '..');
84
+ }
85
+
86
+ export function sanitizeTag(v) {
87
+ return typeof v === 'string' && TAG_RE.test(v) ? v : null;
88
+ }
89
+
90
+ /** 画布文字可选的字体。**白名单而不是自由字符串** —— 这个值会进 CSS */
91
+ export const TEXT_FONTS = ['pen', 'kai', 'sans', 'serif', 'mono'];
92
+ const TEXT_SIZES = ['sm', 'md', 'lg', 'xl'];
93
+
94
+ /**
95
+ * 变换字段(2026-08-13,选中态控制器)。缺省不落字段 —— 没转过没缩过的物件
96
+ * 别背两个恒等值,board.json 的 diff 要能一眼看出"谁被动过"。
97
+ */
98
+ function sanitizeTransform(data) {
99
+ const out = {};
100
+ const rot = Number(data?.rotation);
101
+ if (Number.isFinite(rot) && rot !== 0) out.rotation = clampNum(rot, -360, 360, 0);
102
+ const sc = Number(data?.scale);
103
+ if (Number.isFinite(sc) && sc !== 1) out.scale = clampNum(sc, 0.2, 10, 1);
104
+ return out;
105
+ }
106
+
107
+ function sanitizeCanvasData(kind, data) {
108
+ if (kind === 'text') {
109
+ const format = TEXT_FORMATS.includes(data?.format) ? data.format : 'plain';
110
+ const max = format === 'md' ? MAX_MD_TEXT_LEN : MAX_TEXT_LEN;
111
+ const t = typeof data?.t === 'string' ? data.t.slice(0, max) : '';
112
+ if (!t.trim()) return null;
113
+ return {
114
+ t,
115
+ // plain 不落字段:存量条目全是 plain,别让 diff 里凭空多一行
116
+ ...(format === 'md' ? { format } : {}),
117
+ font: TEXT_FONTS.includes(data?.font) ? data.font : 'kai',
118
+ size: TEXT_SIZES.includes(data?.size) ? data.size : 'md',
119
+ color: ['ink', 'red', 'pencil', 'brass'].includes(data?.color) ? data.color : 'ink',
120
+ ...sanitizeTransform(data),
121
+ };
122
+ }
123
+ if (kind !== 'scribble') return null;
124
+ const d = typeof data?.d === 'string' ? data.d.slice(0, MAX_SCRIBBLE_PATH) : '';
125
+ // 只收 SVG path 里合法的那几个字符,挡住任何往 DOM 里塞东西的尝试
126
+ if (!d || !/^[\dMLQCZ ,.\-eE]+$/.test(d)) return null;
127
+ return {
128
+ d,
129
+ color: ['ink', 'red', 'pencil', 'brass'].includes(data.color) ? data.color : 'ink',
130
+ width: clampNum(data.width, 1, 24, 2),
131
+ ...sanitizeTransform(data),
132
+ };
133
+ }
134
+
135
+ export function sanitizeObject(o, size) {
136
+ if (!o || typeof o !== 'object') return null;
137
+ const kind = typeof o.kind === 'string' && CANVAS_NATIVE_KINDS.has(o.kind) ? o.kind : null;
138
+ const data = kind ? sanitizeCanvasData(kind, o.data) : null;
139
+ // 登记了 kind 却给不出合法内容 → 整条丢弃。留一个空壳会在画布上变成
140
+ // 一个看不见也删不掉的幽灵物件。
141
+ if (kind && !data) return null;
142
+ return {
143
+ // 画布 2026-08-13 起全向无限:坐标不再被桌面尺寸夹持(原来非 native 只许
144
+ // 正区间、native 也出不了 ±size)。这里只挡非有限值和纯属事故的数字 ——
145
+ // 夹得再紧一点都意味着"用户摆在那儿的东西刷新后跳走",那是静默数据损坏。
146
+ x: clampNum(o.x, -COORD_LIMIT, COORD_LIMIT, 0),
147
+ y: clampNum(o.y, -COORD_LIMIT, COORD_LIMIT, 0),
148
+ z: clampNum(o.z, 0, 1e6, 0),
149
+ ...(Number.isFinite(Number(o.w)) ? { w: clampNum(o.w, 4, COORD_LIMIT, 200) } : {}),
150
+ ...(Number.isFinite(Number(o.h)) ? { h: clampNum(o.h, 4, COORD_LIMIT, 200) } : {}),
151
+ ...(o.expanded ? { expanded: true } : {}),
152
+ // 显式归属:'' = 明确无归属(覆盖 sid 派生),非空 = 所属工作区 id
153
+ ...(typeof o.zone === 'string' && o.zone.length <= 300 ? { zone: o.zone } : {}),
154
+ // 出处(2026-08-14 agent 摆位/建元素):agent 落的座/写的字标出来,
155
+ // 用户的是默认不标 —— 跟关系线的 by 同一条纪律
156
+ ...(o.by === 'agent' ? { by: 'agent' } : {}),
157
+ // 分组标签 + 草稿位(2026-08-23 黑板)。staging = agent 这一轮还在打草稿:
158
+ // 入座不看它、read_board 默认不列它、画面上半透明;落定(commitStaging)清位。
159
+ ...(sanitizeTag(o.tag) ? { tag: sanitizeTag(o.tag) } : {}),
160
+ ...(o.staging === true ? { staging: true } : {}),
161
+ ...(kind ? { kind, data } : {}),
162
+ };
163
+ }
164
+
165
+ /**
166
+ * 关系线。**不存坐标** —— 端点是 object id 或 zone id,线跟着端点走。
167
+ *
168
+ * 词汇表在 `server/lib/binding-types.js`(前端画线那份视觉映射要跟它对齐,
169
+ * 有 parity 断言看着)。不认识的 type 一律丢弃:宁可少画一条线,也不要在
170
+ * 画布上留一条没人知道什么意思的连线。
171
+ *
172
+ * 自环(from === to)也丢:它画不出来,且多半是 agent 传错了 id。
173
+ */
174
+ export function sanitizeBinding(b) {
175
+ if (!b || typeof b !== 'object') return null;
176
+ if (!isBindingType(b.type)) return null;
177
+ const from = typeof b.from === 'string' ? b.from.slice(0, 300) : '';
178
+ const to = typeof b.to === 'string' ? b.to.slice(0, 300) : '';
179
+ if (!from || !to || from === to) return null;
180
+ return {
181
+ type: b.type,
182
+ from,
183
+ to,
184
+ // 线上的字。没写就渲染时回落到词汇表的默认词,不在这里补 —— 存了默认词
185
+ // 之后改词汇表就改不动存量了。
186
+ ...(typeof b.label === 'string' && b.label.trim()
187
+ ? { label: b.label.trim().slice(0, 60) }
188
+ : {}),
189
+ // 谁画的。用户画的线 agent 不该擅自删,反过来也一样;auto = 机器可证的
190
+ // 引用关系(auto-relations.js 对账层专属,只有它增删自家 b:auto:* 条目)。
191
+ ...(b.by === 'agent' || b.by === 'user' || b.by === 'auto' ? { by: b.by } : {}),
192
+ // 材质(2026-08-23 黑板):语义之外的第二个轴 —— 墨线/手绘/丝线。不落默认值,
193
+ // 渲染侧按语义给缺省材质;存了默认值以后改缺省就改不动存量。
194
+ ...(isBindingMaterial(b.material) && b.material !== 'ink' ? { material: b.material } : {}),
195
+ ...(sanitizeTag(b.tag) ? { tag: sanitizeTag(b.tag) } : {}),
196
+ ...(b.staging === true ? { staging: true } : {}),
197
+ };
198
+ }
199
+
200
+ /**
201
+ * zones 一行只剩坐标(2026-08-13 瘦身,#14)。
202
+ *
203
+ * 逐字段的下场:
204
+ * - `w`/`h` —— 文件夹变方卡后前端视图**强制** FOLDER_CARD 尺寸,存的数字
205
+ * 没人读,还会成为"画布上 288 宽、存档里 1340"那种自相矛盾的证据。
206
+ * - `title` —— 名字从路径读(id 就是路径),存一份就是第二个真相源,
207
+ * 改名后立刻过期(实测过)。
208
+ * - `collapsed` —— 收起/展开两态 2026-08-13 随"当前目录"模型退役。
209
+ * - `pinned` —— 纵向堆叠 2026-08-08 退役,字段没有了对立面。
210
+ * 存量数据里这些字段读进来直接丢,下次写盘自然消失。
211
+ */
212
+ export function sanitizeZone(z) {
213
+ if (!z || typeof z !== 'object') return null;
214
+ return {
215
+ // 同 sanitizeObject:无限画布,文件夹卡也能摆在任何地方(含负坐标)
216
+ x: clampNum(z.x, -COORD_LIMIT, COORD_LIMIT, 0),
217
+ y: clampNum(z.y, -COORD_LIMIT, COORD_LIMIT, 0),
218
+ };
219
+ }
220
+
221
+ export function sanitizeBoard(raw) {
222
+ const size = sanitizeSize(raw?.size);
223
+ const objects = {};
224
+ const zones = {};
225
+ const bindings = {};
226
+ let count = 0;
227
+ for (const [id, o] of Object.entries(raw?.objects && typeof raw.objects === 'object' ? raw.objects : {})) {
228
+ if (count >= MAX_OBJECTS) break;
229
+ if (!isSafeCanvasId(id)) continue;
230
+ const s = sanitizeObject(o, size);
231
+ if (s) { objects[id] = s; count += 1; }
232
+ }
233
+ let zCount = 0;
234
+ for (const [id, z] of Object.entries(raw?.zones && typeof raw.zones === 'object' ? raw.zones : {})) {
235
+ if (zCount >= MAX_ZONES) break;
236
+ if (!isSafeCanvasId(id)) continue;
237
+ const s = sanitizeZone(z);
238
+ if (s) { zones[id] = s; zCount += 1; }
239
+ }
240
+ let bCount = 0;
241
+ for (const [id, b] of Object.entries(raw?.bindings && typeof raw.bindings === 'object' ? raw.bindings : {})) {
242
+ if (bCount >= MAX_BINDINGS) break;
243
+ if (typeof id !== 'string' || id.length > 300) continue;
244
+ const s = sanitizeBinding(b);
245
+ if (s) { bindings[id] = s; bCount += 1; }
246
+ }
247
+ // 主角覆盖(2026-08-14 agent 摆位):显式立的主角压过前端 pickHero 的推断。
248
+ // 存 id 不存理由 —— 理由在会话里,画布只要知道谁站 C 位
249
+ const hero = typeof raw?.hero === 'string' && raw.hero.length <= 300 ? raw.hero : null;
250
+ return { size, zones, objects, bindings, ...(hero ? { hero } : {}) };
251
+ }
252
+