@xiaobuyu/nodesign 0.0.1

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 (372) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +140 -0
  3. package/bin/nodesign.js +176 -0
  4. package/package.json +104 -0
  5. package/server/api/README.md +45 -0
  6. package/server/api/_guard.js +75 -0
  7. package/server/api/admin.js +187 -0
  8. package/server/api/assets/docx-page.js +103 -0
  9. package/server/api/assets/helpers.js +22 -0
  10. package/server/api/assets/notes.js +144 -0
  11. package/server/api/assets.js +896 -0
  12. package/server/api/board.js +57 -0
  13. package/server/api/browse.js +138 -0
  14. package/server/api/canvas.js +444 -0
  15. package/server/api/chatai.js +324 -0
  16. package/server/api/exports/build-standalone.js +980 -0
  17. package/server/api/exports/cards.js +118 -0
  18. package/server/api/exports/docx-pdf.js +46 -0
  19. package/server/api/exports/export-page.js +142 -0
  20. package/server/api/exports/handoff.js +147 -0
  21. package/server/api/exports.js +690 -0
  22. package/server/api/instruction.js +75 -0
  23. package/server/api/local.js +115 -0
  24. package/server/api/me.js +116 -0
  25. package/server/api/memory.js +185 -0
  26. package/server/api/pending-changes.js +366 -0
  27. package/server/api/plugins.js +164 -0
  28. package/server/api/projects.js +220 -0
  29. package/server/api/publish.js +64 -0
  30. package/server/api/recent.js +73 -0
  31. package/server/api/sessions.js +589 -0
  32. package/server/api/skills.js +77 -0
  33. package/server/api/standalone-fit.js +168 -0
  34. package/server/api/turn-compose.js +180 -0
  35. package/server/api/turn-inflight.js +44 -0
  36. package/server/api/turn.js +669 -0
  37. package/server/auth/README.md +17 -0
  38. package/server/auth/middleware.js +138 -0
  39. package/server/auth/origin-guard.js +71 -0
  40. package/server/auth/session.js +108 -0
  41. package/server/auth/tier.js +113 -0
  42. package/server/auth/users-store.js +348 -0
  43. package/server/edit/README.md +29 -0
  44. package/server/engine/README.md +113 -0
  45. package/server/engine/agent/agent-shared.js +550 -0
  46. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -0
  47. package/server/engine/agent/auto-mode-rules.js +78 -0
  48. package/server/engine/agent/context.js +418 -0
  49. package/server/engine/agent/events.js +464 -0
  50. package/server/engine/agent/hooks/canvas-validate.js +199 -0
  51. package/server/engine/agent/hooks/failure.js +120 -0
  52. package/server/engine/agent/hooks/file-events.js +75 -0
  53. package/server/engine/agent/hooks/lifecycle.js +233 -0
  54. package/server/engine/agent/hooks/post-canvas-focus.js +80 -0
  55. package/server/engine/agent/hooks/post-guidance.js +206 -0
  56. package/server/engine/agent/hooks/post-subagent-report.js +104 -0
  57. package/server/engine/agent/hooks/post-trim.js +58 -0
  58. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -0
  59. package/server/engine/agent/hooks/pre-defaults.js +84 -0
  60. package/server/engine/agent/hooks/pre-injectors.js +277 -0
  61. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -0
  62. package/server/engine/agent/hooks/pre-starter-files.js +61 -0
  63. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -0
  64. package/server/engine/agent/hooks/site-validate.js +94 -0
  65. package/server/engine/agent/hooks/tool-prompts.js +31 -0
  66. package/server/engine/agent/hooks/turn-state-memory.js +56 -0
  67. package/server/engine/agent/hooks/user-prompt-submit.js +215 -0
  68. package/server/engine/agent/hooks.js +354 -0
  69. package/server/engine/agent/init-contract.js +69 -0
  70. package/server/engine/agent/isolation.js +159 -0
  71. package/server/engine/agent/model-context.js +359 -0
  72. package/server/engine/agent/model-table.js +292 -0
  73. package/server/engine/agent/plugin-loader.js +266 -0
  74. package/server/engine/agent/prompts/nodesign-prelude.md +336 -0
  75. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -0
  76. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -0
  77. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -0
  78. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -0
  79. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -0
  80. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -0
  81. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -0
  82. package/server/engine/agent/prompts/tools/site-reference.md +106 -0
  83. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -0
  84. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -0
  85. package/server/engine/agent/session-loop.js +1024 -0
  86. package/server/engine/agent/session-model.js +164 -0
  87. package/server/engine/agent/skill.js +204 -0
  88. package/server/engine/agent/system-prompts.js +86 -0
  89. package/server/engine/agent/task-events.js +78 -0
  90. package/server/engine/agents/ds-extractor.md +132 -0
  91. package/server/engine/agents/explorer.md +190 -0
  92. package/server/engine/agents/index.js +230 -0
  93. package/server/engine/agents/schemas/design-system.json +156 -0
  94. package/server/engine/agents/schemas/tweak-schema.json +113 -0
  95. package/server/engine/agents/tweak-proposer.md +127 -0
  96. package/server/engine/agents/vision-checker.md +254 -0
  97. package/server/engine/browse/capture.js +422 -0
  98. package/server/engine/browse/card.js +137 -0
  99. package/server/engine/browse/handover.js +59 -0
  100. package/server/engine/browse/page-digest.js +119 -0
  101. package/server/engine/browse/refs.js +196 -0
  102. package/server/engine/browse/registry.js +307 -0
  103. package/server/engine/browse/screencast.js +170 -0
  104. package/server/engine/browse/state.js +121 -0
  105. package/server/engine/chatai/chat-log.js +79 -0
  106. package/server/engine/chatai/index.js +193 -0
  107. package/server/engine/chatai/openai-compat.js +152 -0
  108. package/server/engine/chatai/orchestrate.js +309 -0
  109. package/server/engine/chatai/perform.js +40 -0
  110. package/server/engine/chatai/summarize.js +79 -0
  111. package/server/engine/mcp/capability-gate.js +52 -0
  112. package/server/engine/mcp/index.js +339 -0
  113. package/server/engine/mcp/param-sanitizer.js +142 -0
  114. package/server/engine/mcp/tools/arrange-on-board.js +124 -0
  115. package/server/engine/mcp/tools/artifact-session.js +278 -0
  116. package/server/engine/mcp/tools/browse-computer.js +421 -0
  117. package/server/engine/mcp/tools/browse-find-batch.js +183 -0
  118. package/server/engine/mcp/tools/browse-screenshot.js +157 -0
  119. package/server/engine/mcp/tools/browse.js +480 -0
  120. package/server/engine/mcp/tools/build-docx.js +101 -0
  121. package/server/engine/mcp/tools/clear-pending-changes.js +99 -0
  122. package/server/engine/mcp/tools/create-on-board.js +155 -0
  123. package/server/engine/mcp/tools/crystallize-skill.js +168 -0
  124. package/server/engine/mcp/tools/deliver-files.js +0 -0
  125. package/server/engine/mcp/tools/explain-style.js +237 -0
  126. package/server/engine/mcp/tools/export-handoff.js +133 -0
  127. package/server/engine/mcp/tools/expose-tweaks.js +149 -0
  128. package/server/engine/mcp/tools/generate-image.js +842 -0
  129. package/server/engine/mcp/tools/get-computed-styles.js +164 -0
  130. package/server/engine/mcp/tools/get-pending-changes.js +205 -0
  131. package/server/engine/mcp/tools/h3box-ssh.js +84 -0
  132. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -0
  133. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -0
  134. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -0
  135. package/server/engine/mcp/tools/helpers/perception-page.js +215 -0
  136. package/server/engine/mcp/tools/helpers/reference-download.js +103 -0
  137. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -0
  138. package/server/engine/mcp/tools/helpers/rembg.js +273 -0
  139. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -0
  140. package/server/engine/mcp/tools/highlight.js +68 -0
  141. package/server/engine/mcp/tools/list-pages.js +222 -0
  142. package/server/engine/mcp/tools/lookup-tags.js +59 -0
  143. package/server/engine/mcp/tools/navigate-to-page.js +60 -0
  144. package/server/engine/mcp/tools/organize-board.js +64 -0
  145. package/server/engine/mcp/tools/paint-still.js +434 -0
  146. package/server/engine/mcp/tools/pin-to-board.js +130 -0
  147. package/server/engine/mcp/tools/preview-deck.js +130 -0
  148. package/server/engine/mcp/tools/profile-scroll.js +305 -0
  149. package/server/engine/mcp/tools/publish-site.js +102 -0
  150. package/server/engine/mcp/tools/query-elements.js +195 -0
  151. package/server/engine/mcp/tools/read-board.js +103 -0
  152. package/server/engine/mcp/tools/read-document.js +93 -0
  153. package/server/engine/mcp/tools/read-page.js +264 -0
  154. package/server/engine/mcp/tools/read-tavern-json.js +143 -0
  155. package/server/engine/mcp/tools/record-decision.js +140 -0
  156. package/server/engine/mcp/tools/relate-on-board.js +110 -0
  157. package/server/engine/mcp/tools/remove-background.js +391 -0
  158. package/server/engine/mcp/tools/report-issue.js +115 -0
  159. package/server/engine/mcp/tools/roll-film.js +266 -0
  160. package/server/engine/mcp/tools/screenshot-docx.js +138 -0
  161. package/server/engine/mcp/tools/screenshot-url.js +195 -0
  162. package/server/engine/mcp/tools/screenshot.js +583 -0
  163. package/server/engine/mcp/tools/tier-gate.js +96 -0
  164. package/server/engine/mcp/tools/trace-motion.js +215 -0
  165. package/server/engine/mcp/tools/web-search.js +548 -0
  166. package/server/engine/motion/inventory.js +349 -0
  167. package/server/engine/perception/session.js +235 -0
  168. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -0
  169. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +192 -0
  170. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -0
  171. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -0
  172. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -0
  173. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -0
  174. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -0
  175. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -0
  176. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -0
  177. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +162 -0
  178. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -0
  179. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -0
  180. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +228 -0
  181. 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 -0
  182. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -0
  183. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +323 -0
  184. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -0
  185. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -0
  186. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -0
  187. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -0
  188. package/server/engine/runs/active-runs.js +698 -0
  189. package/server/engine/runs/live-turn.js +252 -0
  190. package/server/engine/runs/store.js +364 -0
  191. package/server/engine/runs/turn-relay.js +217 -0
  192. package/server/engine/runtime/workspace.js +164 -0
  193. package/server/index.js +235 -0
  194. package/server/lib/artifact-file-path.js +80 -0
  195. package/server/lib/artifact-target.js +284 -0
  196. package/server/lib/asset-refs.js +239 -0
  197. package/server/lib/async-queue.js +104 -0
  198. package/server/lib/auto-relations.js +130 -0
  199. package/server/lib/binding-types.js +60 -0
  200. package/server/lib/board-kind-sizes.js +62 -0
  201. package/server/lib/board-relations.js +133 -0
  202. package/server/lib/browse-proxy.js +180 -0
  203. package/server/lib/canvas-id.js +36 -0
  204. package/server/lib/cover.js +227 -0
  205. package/server/lib/danbooru-tags.js +291 -0
  206. package/server/lib/doc-extract.js +156 -0
  207. package/server/lib/docx/build-from-source.js +260 -0
  208. package/server/lib/docx/build.js +490 -0
  209. package/server/lib/docx/dump-styles.js +287 -0
  210. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -0
  211. package/server/lib/docx/merge-runs.js +129 -0
  212. package/server/lib/docx/numbering.js +218 -0
  213. package/server/lib/docx/order.js +152 -0
  214. package/server/lib/docx/rawzip.js +172 -0
  215. package/server/lib/docx/render.js +92 -0
  216. package/server/lib/docx/text-lint.js +225 -0
  217. package/server/lib/docx/tokens.js +335 -0
  218. package/server/lib/docx/units.js +29 -0
  219. package/server/lib/docx/xml.js +291 -0
  220. package/server/lib/docx-pages.js +187 -0
  221. package/server/lib/export-collect.js +289 -0
  222. package/server/lib/export-package.js +210 -0
  223. package/server/lib/html-srcset.js +145 -0
  224. package/server/lib/image-variant.js +460 -0
  225. package/server/lib/ingress/forward-openai-chat.js +305 -0
  226. package/server/lib/ingress/openai-chat.js +491 -0
  227. package/server/lib/ingress/session-notice.js +66 -0
  228. package/server/lib/ingress/session-routes.js +68 -0
  229. package/server/lib/ingress/slot-probe.js +130 -0
  230. package/server/lib/ingress/upstream-billing.js +52 -0
  231. package/server/lib/ingress/upstream-fail-streak.js +72 -0
  232. package/server/lib/ingress/upstream-truncation.js +48 -0
  233. package/server/lib/issues-store.js +182 -0
  234. package/server/lib/kinds/deck.js +72 -0
  235. package/server/lib/kinds/docx.js +283 -0
  236. package/server/lib/kinds/file-kinds.js +113 -0
  237. package/server/lib/kinds/index.js +202 -0
  238. package/server/lib/kinds/site.js +161 -0
  239. package/server/lib/model-ingress.js +543 -0
  240. package/server/lib/moderation.js +255 -0
  241. package/server/lib/notice-store.js +103 -0
  242. package/server/lib/plugin-install.js +104 -0
  243. package/server/lib/plugin-validator.js +721 -0
  244. package/server/lib/publish-store.js +115 -0
  245. package/server/lib/quick-summary.js +52 -0
  246. package/server/lib/quota.js +270 -0
  247. package/server/lib/rate-window.js +29 -0
  248. package/server/lib/reference-assets.js +92 -0
  249. package/server/lib/region-shot.js +135 -0
  250. package/server/lib/safe-path.js +73 -0
  251. package/server/lib/sdk-session.js +33 -0
  252. package/server/lib/showcase-store.js +92 -0
  253. package/server/lib/site-publish.js +465 -0
  254. package/server/lib/ssrf-guard.js +432 -0
  255. package/server/lib/task-scan.js +158 -0
  256. package/server/lib/tavern-json.js +154 -0
  257. package/server/lib/video-variant.js +237 -0
  258. package/server/lib/workspace-path.js +33 -0
  259. package/server/ops/fix-sdk-musl.mjs +40 -0
  260. package/server/ops/install-macos-fonts.sh +114 -0
  261. package/server/ops/macos-fonts.conf +336 -0
  262. package/server/ops/sandbox-shim/bwrap +57 -0
  263. package/server/projects/assets-summary.js +119 -0
  264. package/server/projects/auto-name.js +53 -0
  265. package/server/projects/board-store.js +640 -0
  266. package/server/projects/move-entry.js +103 -0
  267. package/server/projects/store.js +270 -0
  268. package/server/projects/ui-config.js +54 -0
  269. package/server/projects/workspace-templates.js +53 -0
  270. package/server/projects/workspace.js +1025 -0
  271. package/server/runtime/capabilities.js +153 -0
  272. package/server/runtime/local-config.js +177 -0
  273. package/server/runtime/local-env.js +88 -0
  274. package/server/runtime/platform.js +342 -0
  275. package/server/runtime/profile.js +72 -0
  276. package/server/services/rembg-launcher.js +313 -0
  277. package/server/services/rembg-service.py +334 -0
  278. package/server/shared/README.md +25 -0
  279. package/server/shared/deck.js +54 -0
  280. package/server/shared/time.js +49 -0
  281. package/server/style-pipeline/README.md +53 -0
  282. package/server/ws/broker.js +36 -0
  283. package/server/ws/browse-channel.js +177 -0
  284. package/server/ws/index.js +386 -0
  285. package/web/README.md +89 -0
  286. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +11 -0
  287. package/web/dist/assets/DeckWindow-4G0xX7P3.js +16 -0
  288. package/web/dist/assets/DocxWindow-BXQsoPkh.js +16 -0
  289. package/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/web/dist/assets/SiteWindow-D6eS-2gM.js +18 -0
  349. package/web/dist/assets/again-D8tfgKKO.webp +0 -0
  350. package/web/dist/assets/caveat-nd-CP6HlsNg.woff2 +0 -0
  351. package/web/dist/assets/clock-xJhvfYpS.webp +0 -0
  352. package/web/dist/assets/film-cut-BBKMwH7q.webp +0 -0
  353. package/web/dist/assets/film-still-BZ_DL9Tt.webp +0 -0
  354. package/web/dist/assets/index-C0KUf6Wd.css +1 -0
  355. package/web/dist/assets/index-Cbl3ATvp.js +2125 -0
  356. package/web/dist/assets/ink-desk-BRbxeDsR.webp +0 -0
  357. package/web/dist/assets/ink-night-Bz4BT3XH.webp +0 -0
  358. package/web/dist/assets/ink-portrait-C0DM4V8Q.webp +0 -0
  359. package/web/dist/assets/longcang-regular-C0uvTuKa.woff2 +0 -0
  360. package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
  361. package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
  362. package/web/dist/assets/pending-edit-apply-DTjo2geW.js +31 -0
  363. package/web/dist/assets/question-8H4HSqxh.webp +0 -0
  364. package/web/dist/assets/reject-BaPJqElj.webp +0 -0
  365. package/web/dist/assets/rotate-cw-LMT3x1Zj.js +11 -0
  366. package/web/dist/assets/rp-portrait-CbrGpew2.webp +0 -0
  367. package/web/dist/assets/rp-street-C4jVKjxx.webp +0 -0
  368. package/web/dist/assets/square-dashed-mouse-pointer-CBoAkfhi.js +11 -0
  369. package/web/dist/assets/tangle-DIxHVNuT.webp +0 -0
  370. package/web/dist/assets/thisone-BylZKglV.webp +0 -0
  371. package/web/dist/assets/thumb-DO1wfK1I.webp +0 -0
  372. package/web/dist/index.html +18 -0
@@ -0,0 +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
+ }
@@ -0,0 +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
+ }
@@ -0,0 +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
+ 负责人:你。新东西。
@@ -0,0 +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
+ }
@@ -0,0 +1,177 @@
1
+ /**
2
+ * server/ws/browse-channel.js — 浏览器画面/输入的专用 WS 通道(2026-08-18)
3
+ *
4
+ * 路径 `/ws/projects/:pid/browser`。**跟现有 `/ws/projects/:pid` 刻意分开**,
5
+ * 理由是那条通道的性质完全不同:
6
+ *
7
+ * - 现有通道是**纯下行**(服务端没有任何 `ws.on('message')`)、走 per-project
8
+ * EventBus 广播、**带 2000 条重放缓冲 + hydrate 分片**。
9
+ * 高频画面帧灌进去会**冲爆重放缓冲**、混进 hydrate 回放。
10
+ * - 而且那条通道是 JSON 文本帧 + perMessageDeflate:base64 一张 JPEG 先胖 33%,
11
+ * 再让 zlib 白压一遍(JPEG 压不动)。
12
+ *
13
+ * 这条通道:**二进制帧下行**(无 base64、`compress:false`)、per-connection 直发
14
+ * (只发给开着窗的那条 socket)、**上行**收订阅控制与人接手的输入。
15
+ *
16
+ * 低频信号(agent 求助、窗该开了)仍然走**现有** EventBus —— 它天生适合那种
17
+ * switch-case 路由。像素和输入才走这里。
18
+ */
19
+
20
+ import { WebSocketServer } from 'ws';
21
+ import { requestUser } from '../auth/session.js';
22
+ import { originAllowed } from '../auth/origin-guard.js';
23
+ import { userOwnsProject } from '../api/_guard.js';
24
+ import { getProject, validateProjectId } from '../projects/store.js';
25
+ import { peek, touchProject, _limits } from '../engine/browse/registry.js';
26
+
27
+ const { VIEWPORT } = _limits;
28
+ import { subscribe, unsubscribe, frameMeta } from '../engine/browse/screencast.js';
29
+ import { releaseHelp, pendingHelp } from '../engine/browse/handover.js';
30
+
31
+ export const BROWSE_WS_RE = /^\/ws\/projects\/([^/]+)\/browser$/;
32
+
33
+ /** 接手时人的输入 → CDP。坐标从"canvas 上的比例"换算成设备像素。 */
34
+ async function dispatchInput(page, projectId, msg) {
35
+ const cdp = await page.context().newCDPSession(page);
36
+ const meta = frameMeta(projectId);
37
+ // 前端发的是 0..1 的比例(它比谁都清楚自己那块 canvas 多大),服务端换算成
38
+ // **页面 CSS 像素** —— CDP 的 Input 坐标系是页面视口,不是 screencast 那张图。
39
+ // ⚠️ 兜底值原来写的是 CAST 的 maxWidth/maxHeight(1024×700),那是**图**的上限、
40
+ // 不是页面的尺寸 —— meta 还没到手时点击会全部偏掉(审查实测点中错元素)。
41
+ // 兜底要用真实视口(registry 的 VIEWPORT)。
42
+ const w = meta?.deviceWidth || VIEWPORT.width;
43
+ const h = meta?.deviceHeight || VIEWPORT.height;
44
+ const x = Math.round((msg.rx ?? 0) * w);
45
+ const y = Math.round((msg.ry ?? 0) * h);
46
+
47
+ if (msg.kind === 'click') {
48
+ await cdp.send('Input.dispatchMouseEvent', { type: 'mousePressed', x, y, button: 'left', clickCount: 1 });
49
+ await cdp.send('Input.dispatchMouseEvent', { type: 'mouseReleased', x, y, button: 'left', clickCount: 1 });
50
+ return;
51
+ }
52
+ if (msg.kind === 'move') {
53
+ await cdp.send('Input.dispatchMouseEvent', { type: 'mouseMoved', x, y });
54
+ return;
55
+ }
56
+ if (msg.kind === 'wheel') {
57
+ await cdp.send('Input.dispatchMouseEvent', {
58
+ type: 'mouseWheel', x, y, deltaX: msg.dx || 0, deltaY: msg.dy || 0,
59
+ });
60
+ return;
61
+ }
62
+ if (msg.kind === 'key') {
63
+ // ⚠️ Phase 1 只支持可打印字符与几个功能键。中文输入法要按 composer 那套
64
+ // isIme 判定处理(chat-composer-fixes 的教训),留 Phase 2 —— 现在人要输中文
65
+ // 请直接在自己浏览器里操作,别指望这条通道。
66
+ const text = typeof msg.text === 'string' ? msg.text : '';
67
+ if (text) {
68
+ await cdp.send('Input.insertText', { text });
69
+ return;
70
+ }
71
+ const key = msg.key;
72
+ if (!key) return;
73
+ // ⚠️ **必须给 windowsVirtualKeyCode**。原来是 `msg.code || 0`,而前端不发 code ——
74
+ // 恒等于 0 的话回车、退格、Tab 全部没反应(审查实测:登录表单提交不了、
75
+ // 删不掉字),而人接手最常要做的就是这几个键。
76
+ const VK = {
77
+ Enter: 13, Backspace: 8, Tab: 9, Escape: 27, Delete: 46,
78
+ ArrowLeft: 37, ArrowUp: 38, ArrowRight: 39, ArrowDown: 40,
79
+ Home: 36, End: 35, PageUp: 33, PageDown: 34, ' ': 32,
80
+ };
81
+ const vk = msg.code || VK[key] || 0;
82
+ const common = { key, windowsVirtualKeyCode: vk, nativeVirtualKeyCode: vk, code: key };
83
+ await cdp.send('Input.dispatchKeyEvent', { type: 'rawKeyDown', ...common });
84
+ // 回车/Tab 这些在很多表单上要 char 事件才触发默认行为
85
+ if (key === 'Enter') await cdp.send('Input.dispatchKeyEvent', { type: 'char', text: '\r', ...common });
86
+ await cdp.send('Input.dispatchKeyEvent', { type: 'keyUp', ...common });
87
+ }
88
+ }
89
+
90
+ function handleConn(ws, pid) {
91
+ const send = (obj) => { try { ws.send(JSON.stringify(obj)); } catch { /* */ } };
92
+
93
+ ws.on('message', async (raw) => {
94
+ let msg;
95
+ try { msg = JSON.parse(String(raw)); } catch { return; }
96
+ const live = peek(pid);
97
+
98
+ try {
99
+ if (msg.type === 'subscribe') {
100
+ if (!live) return send({ type: 'idle', reason: 'agent 还没开始浏览(没有常驻浏览器)' });
101
+ const r = await subscribe(pid, ws, live.page);
102
+ if (r.ok) touchProject(pid);
103
+ return send(r.ok ? { type: 'subscribed', url: live.page.url() } : { type: 'error', reason: r.reason });
104
+ }
105
+ if (msg.type === 'unsubscribe') return void unsubscribe(pid, ws);
106
+ if (msg.type === 'input') {
107
+ if (!live) return send({ type: 'idle', reason: '浏览器已经关了' });
108
+ // 人的每一次输入都算"用过" —— 空闲计时器只认 agent 的调用,不认这条通道,
109
+ // 于是安静看五分钟会被在眼前关掉
110
+ touchProject(pid);
111
+ await dispatchInput(live.page, pid, msg);
112
+ return;
113
+ }
114
+ if (msg.type === 'nav') {
115
+ // 人接手时的后退/刷新。⚠️ **不提供"输入地址"** —— 那等于给人开一条绕过
116
+ // 出网闸的入口的错觉(其实闸在网络层照样拦,但不如不提供这个入口)。
117
+ if (!live) return send({ type: 'idle', reason: '浏览器已经关了' });
118
+ touchProject(pid);
119
+ if (msg.action === 'back') await live.page.goBack({ timeout: 15000 }).catch(() => {});
120
+ if (msg.action === 'reload') await live.page.reload({ timeout: 20000 }).catch(() => {});
121
+ return send({ type: 'url', url: live.page.url() });
122
+ }
123
+ if (msg.type === 'release') {
124
+ // 人点了「好了继续」→ 把等着的 agent 放走
125
+ releaseHelp(pid, { url: live ? live.page.url() : null, by: 'human' });
126
+ return send({ type: 'released' });
127
+ }
128
+ } catch (err) {
129
+ send({ type: 'error', reason: err?.message || String(err) });
130
+ }
131
+ });
132
+
133
+ const bye = () => { unsubscribe(pid, ws).catch(() => {}); };
134
+ ws.on('close', bye);
135
+ ws.on('error', bye);
136
+ // ⭐ hello 要带上「agent 是不是正举着手」:求助 banner 原来只由一次性的
137
+ // `run.browser_help` 事件驱动,**刷新一下就失传** —— 于是 agent 在那儿等两分钟、
138
+ // 超时、告诉用户"这站过不去",而用户从头到尾没看见过它举手。
139
+ const help = pendingHelp(pid);
140
+ send({ type: 'hello', hasBrowser: !!peek(pid), help: help ? help.reason : null });
141
+ }
142
+
143
+ /**
144
+ * 挂在现有 httpServer 的 upgrade 分支上。
145
+ * ⚠️ 现有 upgrade handler 对不匹配的路径**直接 404**,所以这条分支必须排在它前面。
146
+ * @returns {{ matches: (pathname: string) => RegExpMatchArray|null, accept: Function }}
147
+ */
148
+ export function createBrowseWS() {
149
+ const wss = new WebSocketServer({ noServer: true });
150
+
151
+ return {
152
+ matches: (pathname) => pathname.match(BROWSE_WS_RE),
153
+ accept(req, socket, head, m) {
154
+ // 上游 upgrade 已经拦过一道;这里再拦是因为闸不该靠「谁先调用谁」成立
155
+ // —— 这条通道自带 WebSocketServer,将来换挂载点也不能失守
156
+ if (!originAllowed(req)) {
157
+ socket.write('HTTP/1.1 403 Forbidden\r\n\r\n');
158
+ return socket.destroy();
159
+ }
160
+ const pid = decodeURIComponent(m[1]);
161
+ try { validateProjectId(pid); } catch {
162
+ socket.write('HTTP/1.1 400 Bad Request\r\n\r\n');
163
+ return socket.destroy();
164
+ }
165
+ // 鉴权跟主通道同一套,也同一个 4401(外人不该分得清"没登录"和"不是你的项目")
166
+ const user = requestUser(req);
167
+ const project = getProject(pid);
168
+ if (!user || !userOwnsProject(user, project)) {
169
+ return wss.handleUpgrade(req, socket, head, (ws) => ws.close(4401, 'unauthorized'));
170
+ }
171
+ wss.handleUpgrade(req, socket, head, (ws) => {
172
+ ws.binaryType = 'nodebuffer';
173
+ handleConn(ws, pid);
174
+ });
175
+ },
176
+ };
177
+ }