@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,277 @@
1
+ /**
2
+ * server/lib/sketch-layout.js —— 黑板草图的排布与笔迹(2026-08-23)
3
+ *
4
+ * sketch_on_board 一次落一整张图:agent 说的是**结构**(节点、形状、线、模板、
5
+ * 局部网格坐标),这里把它翻译成世界像素和 SVG 路径。两层拆开是这件事的核心:
6
+ * - 宏观落位(图落在无限画布哪里)归服务端:锚点旁 / 内容底下
7
+ * - 微观排布(图里面怎么摆)归 agent:模板 + 离散网格(1 格 = UNIT px)
8
+ * 模型对连续坐标的空间推理弱、对小网格和"谁在谁右边"强,所以给的是网格不是像素。
9
+ *
10
+ * 形状(rect/ellipse/line/arrow/underline/circle/path)落成普通 scribble 对象:
11
+ * 路径在这里生成,带确定性的手绘抖动(种子 = 形状 id),前端一个字不用改。
12
+ * 路径只用 M/L/Q(board-sanitize 的字符白名单),数字保留一位小数。
13
+ *
14
+ * 全是纯函数;尺寸估算与 create-on-board 同一套公式。
15
+ */
16
+
17
+ export const UNIT = 24; // 1 网格 = 24 世界像素
18
+ /**
19
+ * 可读性规范(2026-08-23,用户定):黑板上的字要在 80%~100% 缩放下清晰可读。
20
+ * 手写/md 正文 16px 世界像素在 0.8 倍下是 12.8 屏幕像素 —— 这是底线,所以节点
21
+ * 字号不低于 md;一张图的尺寸要能在 0.8 倍下整张进一个普通视口(1400×900 屏
22
+ * ≈ 1750×1125 世界像素)。超过 SKETCH_MAX 直接拒:一张图说一件事,大了就拆。
23
+ */
24
+ export const SKETCH_FIT = { w: 1700, h: 1100 }; // 推荐上限(0.8 倍一屏)
25
+ export const SKETCH_MAX = { w: 2600, h: 1700 }; // 硬上限(再大就拆成两张)
26
+ export const GAP = 16; // 模板排布的节点间距
27
+ const SIZE_PX = { sm: 13, md: 16, lg: 22, xl: 30 };
28
+
29
+ /** 手写字身位估算(抄 create-on-board / 前端 handleCreateText 同款) */
30
+ export function textBox(t, sizeKey, { md = false, wUnits = null } = {}) {
31
+ const px = SIZE_PX[sizeKey] || 16;
32
+ if (md) {
33
+ const raw = String(t);
34
+ const lines = raw.split('\n');
35
+ // 字宽按 em 估:CJK/全角 1em,其余 0.62em("12 个汉字 200px 装不下"就是这么来的)
36
+ const em = (l) => [...l].reduce((n, c) => n + (/[\u3000-\u9fff\uff00-\uffef]/.test(c) ? 1 : 0.62), 0);
37
+ const longest = Math.max(8, ...lines.map(em));
38
+ const w = wUnits ? wUnits * UNIT : Math.min(440, Math.max(200, Math.round(longest * px) + 24));
39
+ const colsEm = Math.max(8, (w - 12) / px);
40
+ // 渲染侧(MdInk)单换行 = 真换行,所以按源码行数估;空行 = 段落间距(GAP.sm≈8);
41
+ // 行高 1.6、上下 padding 4+4。前端还会把真实高度回写(useMeasuredSize),这里只求落位时别差太多
42
+ let n = 0; let paras = 0;
43
+ for (const l of lines) {
44
+ if (!l.trim()) { paras += 1; continue; }
45
+ n += Math.max(1, Math.ceil(em(l.replace(/[*_`#>]/g, '')) / colsEm));
46
+ }
47
+ // mermaid 盒子:横向(LR/RL)矮、纵向按语句数长;都只是估,真高度由渲染定
48
+ const mm = raw.match(/```mermaid\n([\s\S]*?)```/);
49
+ if (mm) {
50
+ const body = mm[1].split('\n').filter(l => l.trim()).length;
51
+ n += /\b(LR|RL)\b/.test(mm[1]) ? 3 : Math.max(4, body * 1.6);
52
+ }
53
+ return { w, h: Math.round(n * px * 1.6) + 8 + paras * 8 };
54
+ }
55
+ const cols = wUnits ? Math.max(4, Math.floor((wUnits * UNIT) / (px * 1.05))) : Math.min(26, Math.max(6, t.length));
56
+ const lines = Math.ceil(t.length / cols) + (t.match(/\n/g)?.length || 0);
57
+ return { w: wUnits ? wUnits * UNIT : Math.round(cols * px * 1.05) + 12, h: Math.round(lines * px * 1.6) + 10 };
58
+ }
59
+
60
+ /* ── 确定性随机(与前端 board-bindings 同款 FNV + mulberry32)── */
61
+ function hashSeed(s) {
62
+ let h = 0x811c9dc5;
63
+ for (let i = 0; i < s.length; i += 1) { h ^= s.charCodeAt(i); h = Math.imul(h, 0x01000193) >>> 0; }
64
+ return h >>> 0;
65
+ }
66
+ function rng(seed) {
67
+ let a = seed >>> 0;
68
+ return () => {
69
+ a = (a + 0x6D2B79F5) >>> 0;
70
+ let t = a;
71
+ t = Math.imul(t ^ (t >>> 15), t | 1);
72
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
73
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
74
+ };
75
+ }
76
+ const f1 = (n) => (Math.round(n * 10) / 10).toString();
77
+
78
+ /** 手绘一段:两点之间微抖的折线(带一点弧),返回 "L x y ..." 片段(不含起点 M) */
79
+ function wobblySeg(rand, a, b, amp = 1.2) {
80
+ const dx = b.x - a.x; const dy = b.y - a.y;
81
+ const len = Math.hypot(dx, dy) || 1;
82
+ const nx = -dy / len; const ny = dx / len;
83
+ const segs = Math.max(2, Math.min(12, Math.round(len / 26)));
84
+ const bow = (rand() * 2 - 1) * Math.min(len * 0.03, 3);
85
+ let out = '';
86
+ for (let i = 1; i <= segs; i += 1) {
87
+ const t = i / segs;
88
+ const w = i === segs ? 0 : amp * (rand() * 2 - 1) + Math.sin(Math.PI * t) * bow;
89
+ out += ` L ${f1(a.x + dx * t + nx * w)} ${f1(a.y + dy * t + ny * w)}`;
90
+ }
91
+ return out;
92
+ }
93
+
94
+ /**
95
+ * 形状 → { d, w, h }(路径相对形状包围盒左上角,pad 留 6px 给抖动和线宽)。
96
+ * 输入尺寸是像素(调用方已把网格换成像素)。
97
+ */
98
+ export function shapePath(kind, { w = 0, h = 0, to = null, d = null } = {}, seed = 'shape') {
99
+ const rand = rng(hashSeed(seed));
100
+ const P = 6;
101
+ if (kind === 'path') {
102
+ // 自由路径:agent 给的局部像素坐标,只做字符白名单与平移(调用方算 bbox)
103
+ return { d: String(d || ''), w, h };
104
+ }
105
+ if (kind === 'line' || kind === 'arrow' || kind === 'underline') {
106
+ // 从 (0,0) 到 (to.x,to.y) 的一笔;underline 是水平的 line 别名
107
+ const tx = to?.x ?? w; const ty = kind === 'underline' ? 0 : (to?.y ?? 0);
108
+ const minX = Math.min(0, tx); const minY = Math.min(0, ty);
109
+ const a = { x: P - minX, y: P - minY }; const b = { x: tx + P - minX, y: ty + P - minY };
110
+ let path = `M ${f1(a.x)} ${f1(a.y)}${wobblySeg(rand, a, b)}`;
111
+ if (kind === 'arrow') {
112
+ const len = Math.hypot(b.x - a.x, b.y - a.y) || 1;
113
+ const ux = (b.x - a.x) / len; const uy = (b.y - a.y) / len;
114
+ const L = Math.min(14, Math.max(8, len * 0.12));
115
+ const wing = (s) => ({ x: b.x - ux * L + (-uy) * s * L * 0.55, y: b.y - uy * L + ux * s * L * 0.55 });
116
+ const w1 = wing(1); const w2 = wing(-1);
117
+ path += ` M ${f1(w1.x)} ${f1(w1.y)}${wobblySeg(rand, w1, b, 0.6)} M ${f1(w2.x)} ${f1(w2.y)}${wobblySeg(rand, w2, b, 0.6)}`;
118
+ }
119
+ return { d: path, w: Math.abs(tx) + P * 2, h: Math.abs(ty) + P * 2 };
120
+ }
121
+ if (kind === 'rect') {
122
+ const x0 = P; const y0 = P; const x1 = P + w; const y1 = P + h;
123
+ const c = [{ x: x0, y: y0 }, { x: x1, y: y0 }, { x: x1, y: y1 }, { x: x0, y: y1 }];
124
+ // 角上微微出头(手画的框角会交叉),起笔点随机落在四角之一
125
+ let path = `M ${f1(c[0].x - 1)} ${f1(c[0].y)}`;
126
+ for (let i = 0; i < 4; i += 1) path += wobblySeg(rand, c[i], c[(i + 1) % 4]);
127
+ path += ` L ${f1(c[0].x + 3)} ${f1(c[0].y + 0.5)}`;
128
+ return { d: path, w: w + P * 2, h: h + P * 2 };
129
+ }
130
+ if (kind === 'ellipse' || kind === 'circle') {
131
+ const rx = w / 2; const ry = (kind === 'circle' ? w : h) / 2;
132
+ const cx = P + rx; const cy = P + ry;
133
+ const n = Math.max(16, Math.min(48, Math.round((rx + ry) / 6)));
134
+ const amp = Math.min(1.6, 0.5 + (rx + ry) / 300);
135
+ let path = '';
136
+ // 多画 1/8 圈让起止重叠,像手画的圈
137
+ for (let i = 0; i <= n + n / 8; i += 1) {
138
+ const t = (i / n) * Math.PI * 2 - Math.PI / 3;
139
+ const jitter = 1 + (rand() * 2 - 1) * amp / Math.max(rx, ry);
140
+ const x = cx + Math.cos(t) * rx * jitter; const y = cy + Math.sin(t) * ry * jitter;
141
+ path += (i === 0 ? 'M ' : ' L ') + `${f1(x)} ${f1(y)}`;
142
+ }
143
+ return { d: path, w: rx * 2 + P * 2, h: ry * 2 + P * 2 };
144
+ }
145
+ return null;
146
+ }
147
+
148
+ /**
149
+ * 模板排布。nodes: [{ key, w, h, at?: {x,y}(网格) }] → Map key → {x,y}(局部像素)
150
+ * - free:有 at 的按网格落,没 at 的排在 free 区域下面一列
151
+ * - column / row / grid(cols) / mindmap(第一个是中心,其余环绕)
152
+ */
153
+ export function layoutNodes(nodes, { template = 'auto', cols = null } = {}) {
154
+ const pos = new Map();
155
+ if (!nodes.length) return pos;
156
+ let tpl = template;
157
+ if (tpl === 'auto') tpl = nodes.some(n => n.at) ? 'free' : (nodes.length <= 4 ? 'column' : 'grid');
158
+
159
+ if (tpl === 'free') {
160
+ let bottom = 0;
161
+ const rest = [];
162
+ for (const n of nodes) {
163
+ if (n.at && Number.isFinite(n.at.x) && Number.isFinite(n.at.y)) {
164
+ const p = { x: Math.round(n.at.x * UNIT), y: Math.round(n.at.y * UNIT) };
165
+ pos.set(n.key, p); bottom = Math.max(bottom, p.y + n.h);
166
+ } else rest.push(n);
167
+ }
168
+ let y = bottom ? bottom + GAP : 0;
169
+ for (const n of rest) { pos.set(n.key, { x: 0, y }); y += n.h + GAP; }
170
+ return pos;
171
+ }
172
+ if (tpl === 'column') {
173
+ let y = 0;
174
+ for (const n of nodes) { pos.set(n.key, { x: 0, y }); y += n.h + GAP; }
175
+ return pos;
176
+ }
177
+ if (tpl === 'row') {
178
+ let x = 0;
179
+ for (const n of nodes) { pos.set(n.key, { x, y: 0 }); x += n.w + GAP + 4; }
180
+ return pos;
181
+ }
182
+ if (tpl === 'mindmap') {
183
+ const [center, ...rest] = nodes;
184
+ const cx = 0; const cy = 0;
185
+ pos.set(center.key, { x: cx - center.w / 2, y: cy - center.h / 2 });
186
+ if (!rest.length) return pos;
187
+ // 半径:中心节点(含可能套在外面的圈)之外留 70,且环的周长要摆得下所有节点
188
+ const need = rest.reduce((sum, n) => sum + Math.max(n.w, 120) + GAP * 2, 0);
189
+ const r = Math.max(center.w / 2 + 70, center.h / 2 + 70, need / (Math.PI * 2) + 40);
190
+ rest.forEach((n, i) => {
191
+ const t = (i / rest.length) * Math.PI * 2 - Math.PI / 2;
192
+ const c = Math.cos(t); const sn = Math.sin(t);
193
+ // 节点**靠内的那条边**落在环上(不是节点中心):宽节点才不会压进中心
194
+ pos.set(n.key, {
195
+ x: Math.round(cx + c * r - n.w * (1 - c) / 2),
196
+ y: Math.round(cy + sn * r * 0.72 - n.h * (1 - sn) / 2),
197
+ });
198
+ });
199
+ return pos;
200
+ }
201
+ // grid
202
+ const c = Math.max(1, cols || Math.ceil(Math.sqrt(nodes.length)));
203
+ const colW = Array(c).fill(0);
204
+ nodes.forEach((n, i) => { colW[i % c] = Math.max(colW[i % c], n.w); });
205
+ let y = 0; let rowH = 0;
206
+ nodes.forEach((n, i) => {
207
+ const col = i % c;
208
+ if (col === 0 && i > 0) { y += rowH + GAP; rowH = 0; }
209
+ let x = 0; for (let k = 0; k < col; k += 1) x += colW[k] + GAP + 4;
210
+ pos.set(n.key, { x, y }); rowH = Math.max(rowH, n.h);
211
+ });
212
+ return pos;
213
+ }
214
+
215
+ /** 一组矩形的包围盒 */
216
+ export function bboxOf(rects) {
217
+ let x0 = Infinity; let y0 = Infinity; let x1 = -Infinity; let y1 = -Infinity;
218
+ for (const r of rects) {
219
+ x0 = Math.min(x0, r.x); y0 = Math.min(y0, r.y); x1 = Math.max(x1, r.x + r.w); y1 = Math.max(y1, r.y + r.h);
220
+ }
221
+ return Number.isFinite(x0) ? { x: x0, y: y0, w: x1 - x0, h: y1 - y0 } : { x: 0, y: 0, w: 0, h: 0 };
222
+ }
223
+
224
+ /**
225
+ * 宏观落位:在 obstacles(同层已摆的矩形)中给一块 w×h 找地方。
226
+ * - near:锚右侧(撞了往下让),让不开就锚下方
227
+ * - 否则:内容最低边下面(与入座"新东西排底下"同一条起排线精神)
228
+ */
229
+ export function findSpot({ w, h, near = null, obstacles = [], contentBottom = 0, viewport = null }) {
230
+ const hits = (x, y) => obstacles.some(o => !(x + w <= o.x || o.x + o.w <= x || y + h <= o.y || o.y + o.h <= y));
231
+ // 用户视口里有空地就落在视口里(黑板是主窗口时,画在他眼前而不是让他去找)。
232
+ // 阅读顺序纪律(08-23 真踩:第二张图落到第一张的**左边**):先挑不在已有内容左侧/
233
+ // 上方的位置(顺着先左后右、先上后下长),实在没有才退而求其次。
234
+ if (!near && viewport && viewport.w >= w + 24 && viewport.h >= h + 24) {
235
+ const content = obstacles.length ? {
236
+ x: Math.min(...obstacles.map(o => o.x)), y: Math.min(...obstacles.map(o => o.y)),
237
+ } : null;
238
+ const sx = Math.max(24, Math.round(viewport.w / 8)); const sy = Math.max(24, Math.round(viewport.h / 8));
239
+ for (const strict of [true, false]) {
240
+ for (let y = viewport.y + 12; y + h <= viewport.y + viewport.h - 12; y += sy) {
241
+ for (let x = viewport.x + 12; x + w <= viewport.x + viewport.w - 12; x += sx) {
242
+ if (strict && content && (x < content.x - 24 || y < content.y - 24)) continue;
243
+ if (!hits(x, y)) return { x: Math.round(x), y: Math.round(y), side: 'viewport' };
244
+ }
245
+ }
246
+ }
247
+ }
248
+ if (near) {
249
+ let x = near.x + near.w + 32; let y = near.y;
250
+ for (let g = 0; g < 30; g += 1) {
251
+ if (!hits(x, y)) return { x: Math.round(x), y: Math.round(y), side: 'right' };
252
+ const blocker = obstacles.find(o => !(x + w <= o.x || o.x + o.w <= x || y + h <= o.y || o.y + o.h <= y));
253
+ y = blocker.y + blocker.h + GAP;
254
+ }
255
+ x = near.x; y = near.y + near.h + 32;
256
+ for (let g = 0; g < 30; g += 1) {
257
+ if (!hits(x, y)) return { x: Math.round(x), y: Math.round(y), side: 'below' };
258
+ const blocker = obstacles.find(o => !(x + w <= o.x || o.x + o.w <= x || y + h <= o.y || o.y + o.h <= y));
259
+ y = blocker.y + blocker.h + GAP;
260
+ }
261
+ }
262
+ // 排在内容底下:左边缘对齐已有内容(不是写死的 10),读起来像续在同一栏
263
+ const left = obstacles.length ? Math.min(...obstacles.map(o => o.x)) : 10;
264
+ return { x: Math.round(left), y: Math.round(contentBottom) + 40, side: 'bottom' };
265
+ }
266
+
267
+ /**
268
+ * 按用户屏幕算「一屏」:视点里有相机矩形和缩放 → 屏幕像素 = 世界 × 缩放;
269
+ * 0.8 倍可读 → 一屏世界像素 = 屏幕 / 0.8。没视点就用 SKETCH_FIT 的缺省。
270
+ */
271
+ export function fitFor(vp) {
272
+ if (vp?.camera?.w && vp?.zoom) {
273
+ const sw = vp.camera.w * vp.zoom; const sh = vp.camera.h * vp.zoom;
274
+ return { w: Math.round(sw / 0.8), h: Math.round(sh / 0.8), screen: { w: Math.round(sw), h: Math.round(sh) } };
275
+ }
276
+ return { ...SKETCH_FIT, screen: null };
277
+ }