@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
@@ -1,25 +1,25 @@
1
- # server/shared/
2
-
3
- 从小合([dev/server/bot/](../../../dev/server/bot/))抠出来的**真正通用、跟工单业务无关**的基建文件。
4
-
5
- ## 文件清单
6
-
7
- | 文件 | 来源 | 改动 |
8
- |---|---|---|
9
- | `anthropic-client.js` | `dev/server/bot/anthropic-client.js` | env 名 `MINIMAX_*` → `KIMI_*`;baseURL 默认值切 Moonshot;timeout 600s(长任务) |
10
- | `agent-loop.js` | `dev/server/bot/agent-loop.js` | 仅改 env 名 `BOT_TOOL_TIMEOUT_MS` → `ENGINE_TOOL_TIMEOUT_MS`,默认 30s → 60s;其余照搬 |
11
- | `concurrency.js` | `dev/server/bot/concurrency.js` | 注释从"飞书 user open_id"泛化为"key";env 名加 `ENGINE_` 前缀;`enqueueMessage` 改 `enqueueTask` |
12
- | `time.js` | `dev/server/utils/time.js` | 零改动 |
13
-
14
- ## 不该往这里加东西的判断
15
-
16
- - 业务(工单 / 钩子 / 飞书卡片)→ 不该来
17
- - 跟 dev/ 共演化的核心抽象 → 暂时直接复制;如果开始反复同步两边,就提到 monorepo `shared/` 包
18
-
19
- ## 待验证(动工前必做)
20
-
21
- - [ ] `cache_control: { type: 'ephemeral' }` 在 Kimi Anthropic 兼容端点是否生效
22
- - [ ] `anthropic-beta: interleaved-thinking-2025-05-14` header 是否被 Kimi 接受
23
- - [ ] 流式 `tool_use` + `input_json_delta` 行为一致性
24
-
25
- 写一个 `server/_probe-kimi.js`(30 行 JS)跑一遍。`npm run probe:kimi`。
1
+ # server/shared/
2
+
3
+ 从小合([dev/server/bot/](../../../dev/server/bot/))抠出来的**真正通用、跟工单业务无关**的基建文件。
4
+
5
+ ## 文件清单
6
+
7
+ | 文件 | 来源 | 改动 |
8
+ |---|---|---|
9
+ | `anthropic-client.js` | `dev/server/bot/anthropic-client.js` | env 名 `MINIMAX_*` → `KIMI_*`;baseURL 默认值切 Moonshot;timeout 600s(长任务) |
10
+ | `agent-loop.js` | `dev/server/bot/agent-loop.js` | 仅改 env 名 `BOT_TOOL_TIMEOUT_MS` → `ENGINE_TOOL_TIMEOUT_MS`,默认 30s → 60s;其余照搬 |
11
+ | `concurrency.js` | `dev/server/bot/concurrency.js` | 注释从"飞书 user open_id"泛化为"key";env 名加 `ENGINE_` 前缀;`enqueueMessage` 改 `enqueueTask` |
12
+ | `time.js` | `dev/server/utils/time.js` | 零改动 |
13
+
14
+ ## 不该往这里加东西的判断
15
+
16
+ - 业务(工单 / 钩子 / 飞书卡片)→ 不该来
17
+ - 跟 dev/ 共演化的核心抽象 → 暂时直接复制;如果开始反复同步两边,就提到 monorepo `shared/` 包
18
+
19
+ ## 待验证(动工前必做)
20
+
21
+ - [ ] `cache_control: { type: 'ephemeral' }` 在 Kimi Anthropic 兼容端点是否生效
22
+ - [ ] `anthropic-beta: interleaved-thinking-2025-05-14` header 是否被 Kimi 接受
23
+ - [ ] 流式 `tool_use` + `input_json_delta` 行为一致性
24
+
25
+ 写一个 `server/_probe-kimi.js`(30 行 JS)跑一遍。`npm run probe:kimi`。
@@ -1,54 +1,54 @@
1
- /**
2
- * server/shared/deck.js — deck 设计坐标系常量(single source of truth)
3
- *
4
- * 默认 1920×1080(16:9 PPT 标准);4 档预设 ASPECT_PRESETS 可选。所有需要
5
- * playwright headless 渲染 deck 的代码(exports / mcp tools / probe scripts)
6
- * 都从这里读,将来再调只改一处。
7
- *
8
- * deck 比例由 wrap.dataset.deckAspect 决定(agent 在 canvas.html 里声明):
9
- * "16:9" 默认横屏(1920×1080)演讲 / 文档 / scrollytelling
10
- * "16:10" 宽屏笔电 / Mac 屏(1920×1200)介于 16:9 和 4:3 之间
11
- * "9:16" 竖屏(1080×1920)手机宣发 / 短故事 / 直播 cover
12
- * "4:3" 老投影 / 经典 PPT 投影仪适配(1440×1080)
13
- *
14
- * 用户面(浏览器自适应 / iframe 预览)通过 CSS 自适应 scale 让任意视口都满铺;
15
- * Playwright 渲染按 deck 比例设 viewport,scale=1 自然渲染。
16
- */
17
-
18
- export const ASPECT_PRESETS = Object.freeze({
19
- '16:9': Object.freeze({ width: 1920, height: 1080 }),
20
- '16:10': Object.freeze({ width: 1920, height: 1200 }),
21
- '9:16': Object.freeze({ width: 1080, height: 1920 }),
22
- '4:3': Object.freeze({ width: 1440, height: 1080 }),
23
- });
24
-
25
- export const DEFAULT_ASPECT = '16:9';
26
-
27
- export const DECK = ASPECT_PRESETS[DEFAULT_ASPECT];
28
-
29
- /**
30
- * 解析 aspect 字符串到 { width, height },未知值 fallback 默认 16:9。
31
- *
32
- * @param {string|null|undefined} aspect
33
- * @returns {{ width: number, height: number, key: string }}
34
- */
35
- export function resolveDeckSize(aspect) {
36
- const key = ASPECT_PRESETS[aspect] ? aspect : DEFAULT_ASPECT;
37
- const dims = ASPECT_PRESETS[key];
38
- return { width: dims.width, height: dims.height, key };
39
- }
40
-
41
- /**
42
- * 从 canvas.html 内容里抽 wrap data-deck-aspect 值。
43
- * 找不到 / 无效值 → 返回 DEFAULT_ASPECT。仅做轻量 grep,不上 cheerio。
44
- *
45
- * @param {string} html
46
- * @returns {string} aspect key (ASPECT_PRESETS 的键)
47
- */
48
- export function extractDeckAspect(html) {
49
- if (!html || typeof html !== 'string') return DEFAULT_ASPECT;
50
- const m = html.match(/<div\b[^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"][^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"]/i)
51
- || html.match(/<div\b[^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"][^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"]/i);
52
- if (!m) return DEFAULT_ASPECT;
53
- return ASPECT_PRESETS[m[1]] ? m[1] : DEFAULT_ASPECT;
54
- }
1
+ /**
2
+ * server/shared/deck.js — deck 设计坐标系常量(single source of truth)
3
+ *
4
+ * 默认 1920×1080(16:9 PPT 标准);4 档预设 ASPECT_PRESETS 可选。所有需要
5
+ * playwright headless 渲染 deck 的代码(exports / mcp tools / probe scripts)
6
+ * 都从这里读,将来再调只改一处。
7
+ *
8
+ * deck 比例由 wrap.dataset.deckAspect 决定(agent 在 canvas.html 里声明):
9
+ * "16:9" 默认横屏(1920×1080)演讲 / 文档 / scrollytelling
10
+ * "16:10" 宽屏笔电 / Mac 屏(1920×1200)介于 16:9 和 4:3 之间
11
+ * "9:16" 竖屏(1080×1920)手机宣发 / 短故事 / 直播 cover
12
+ * "4:3" 老投影 / 经典 PPT 投影仪适配(1440×1080)
13
+ *
14
+ * 用户面(浏览器自适应 / iframe 预览)通过 CSS 自适应 scale 让任意视口都满铺;
15
+ * Playwright 渲染按 deck 比例设 viewport,scale=1 自然渲染。
16
+ */
17
+
18
+ export const ASPECT_PRESETS = Object.freeze({
19
+ '16:9': Object.freeze({ width: 1920, height: 1080 }),
20
+ '16:10': Object.freeze({ width: 1920, height: 1200 }),
21
+ '9:16': Object.freeze({ width: 1080, height: 1920 }),
22
+ '4:3': Object.freeze({ width: 1440, height: 1080 }),
23
+ });
24
+
25
+ export const DEFAULT_ASPECT = '16:9';
26
+
27
+ export const DECK = ASPECT_PRESETS[DEFAULT_ASPECT];
28
+
29
+ /**
30
+ * 解析 aspect 字符串到 { width, height },未知值 fallback 默认 16:9。
31
+ *
32
+ * @param {string|null|undefined} aspect
33
+ * @returns {{ width: number, height: number, key: string }}
34
+ */
35
+ export function resolveDeckSize(aspect) {
36
+ const key = ASPECT_PRESETS[aspect] ? aspect : DEFAULT_ASPECT;
37
+ const dims = ASPECT_PRESETS[key];
38
+ return { width: dims.width, height: dims.height, key };
39
+ }
40
+
41
+ /**
42
+ * 从 canvas.html 内容里抽 wrap data-deck-aspect 值。
43
+ * 找不到 / 无效值 → 返回 DEFAULT_ASPECT。仅做轻量 grep,不上 cheerio。
44
+ *
45
+ * @param {string} html
46
+ * @returns {string} aspect key (ASPECT_PRESETS 的键)
47
+ */
48
+ export function extractDeckAspect(html) {
49
+ if (!html || typeof html !== 'string') return DEFAULT_ASPECT;
50
+ const m = html.match(/<div\b[^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"][^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"]/i)
51
+ || html.match(/<div\b[^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"][^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"]/i);
52
+ if (!m) return DEFAULT_ASPECT;
53
+ return ASPECT_PRESETS[m[1]] ? m[1] : DEFAULT_ASPECT;
54
+ }
@@ -1,49 +1,49 @@
1
- /**
2
- * 北京时间工具
3
- *
4
- * 来源:从 dev/server/utils/time.js 复制(零改动)
5
- *
6
- * toISOString 是 UTC,直接用会在东八区凌晨误差 8 小时。
7
- * 所有注入 LLM 的"当前时间"应该走这个 util,输出北京时间 + 星期。
8
- */
9
-
10
- const WEEKDAY_CN = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
11
-
12
- /**
13
- * 返回北京时间的多种呈现,供不同 prompt 复用
14
- * @returns {{ today: string, dateTime: string, weekday: string, nowMs: number, iso: string }}
15
- * today: "2026-04-22"
16
- * dateTime: "2026-04-22 14:32:05"
17
- * weekday: "周三"
18
- * nowMs: 毫秒时间戳(给 LLM 做差值用)
19
- * iso: "2026-04-22T14:32:05+08:00"
20
- */
21
- export function formatBeijingNow() {
22
- const now = new Date();
23
- const nowMs = now.getTime();
24
-
25
- // 转北京时间(东八区偏移)
26
- const bj = new Date(nowMs + 8 * 3600 * 1000);
27
- const y = bj.getUTCFullYear();
28
- const m = String(bj.getUTCMonth() + 1).padStart(2, '0');
29
- const d = String(bj.getUTCDate()).padStart(2, '0');
30
- const hh = String(bj.getUTCHours()).padStart(2, '0');
31
- const mm = String(bj.getUTCMinutes()).padStart(2, '0');
32
- const ss = String(bj.getUTCSeconds()).padStart(2, '0');
33
- const weekday = WEEKDAY_CN[bj.getUTCDay()];
34
-
35
- const today = `${y}-${m}-${d}`;
36
- const dateTime = `${today} ${hh}:${mm}:${ss}`;
37
- const iso = `${today}T${hh}:${mm}:${ss}+08:00`;
38
-
39
- return { today, dateTime, weekday, nowMs, iso };
40
- }
41
-
42
- /**
43
- * 返回适合塞进 prompt 的一行文本
44
- * "当前时间:2026-04-22 周三 14:32:05(北京时间,毫秒时间戳 1745...)"
45
- */
46
- export function beijingNowLine() {
47
- const { today, weekday, dateTime, nowMs } = formatBeijingNow();
48
- return `当前时间:${dateTime} ${weekday}(北京时间,毫秒时间戳 ${nowMs})`;
49
- }
1
+ /**
2
+ * 北京时间工具
3
+ *
4
+ * 来源:从 dev/server/utils/time.js 复制(零改动)
5
+ *
6
+ * toISOString 是 UTC,直接用会在东八区凌晨误差 8 小时。
7
+ * 所有注入 LLM 的"当前时间"应该走这个 util,输出北京时间 + 星期。
8
+ */
9
+
10
+ const WEEKDAY_CN = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
11
+
12
+ /**
13
+ * 返回北京时间的多种呈现,供不同 prompt 复用
14
+ * @returns {{ today: string, dateTime: string, weekday: string, nowMs: number, iso: string }}
15
+ * today: "2026-04-22"
16
+ * dateTime: "2026-04-22 14:32:05"
17
+ * weekday: "周三"
18
+ * nowMs: 毫秒时间戳(给 LLM 做差值用)
19
+ * iso: "2026-04-22T14:32:05+08:00"
20
+ */
21
+ export function formatBeijingNow() {
22
+ const now = new Date();
23
+ const nowMs = now.getTime();
24
+
25
+ // 转北京时间(东八区偏移)
26
+ const bj = new Date(nowMs + 8 * 3600 * 1000);
27
+ const y = bj.getUTCFullYear();
28
+ const m = String(bj.getUTCMonth() + 1).padStart(2, '0');
29
+ const d = String(bj.getUTCDate()).padStart(2, '0');
30
+ const hh = String(bj.getUTCHours()).padStart(2, '0');
31
+ const mm = String(bj.getUTCMinutes()).padStart(2, '0');
32
+ const ss = String(bj.getUTCSeconds()).padStart(2, '0');
33
+ const weekday = WEEKDAY_CN[bj.getUTCDay()];
34
+
35
+ const today = `${y}-${m}-${d}`;
36
+ const dateTime = `${today} ${hh}:${mm}:${ss}`;
37
+ const iso = `${today}T${hh}:${mm}:${ss}+08:00`;
38
+
39
+ return { today, dateTime, weekday, nowMs, iso };
40
+ }
41
+
42
+ /**
43
+ * 返回适合塞进 prompt 的一行文本
44
+ * "当前时间:2026-04-22 周三 14:32:05(北京时间,毫秒时间戳 1745...)"
45
+ */
46
+ export function beijingNowLine() {
47
+ const { today, weekday, dateTime, nowMs } = formatBeijingNow();
48
+ return `当前时间:${dateTime} ${weekday}(北京时间,毫秒时间戳 ${nowMs})`;
49
+ }
@@ -1,53 +1,53 @@
1
- # server/style-pipeline/ — 风格提取流水线
2
-
3
- **Nodesign 第二条核心通路**:用户上传参考素材(PPT / PDF / HTML)→ 提取结构化 style tokens → 喂给 engine 下游。
4
-
5
- ## 为什么这个模块独立于 engine
6
-
7
- 组长释放的产品意图:当前 deskskill-engine 是"brief → metaphor 推导 → deck"单管道,但真实需求是"风格参考"——用户上传已有 deck,想保留其视觉语言做新内容。
8
-
9
- **这事儿是后端工程问题,不是 skill 问题**:色板抽样、字体识别、spacing 测量、layout grid 推断——按训练分布让 LLM 用 declarative 路径描述风格会丢精度(procedural / declarative 能力诊断已知)。所以做工程化提取,输出结构化 tokens 喂 skill 下游。
10
-
11
- ## 输入 / 输出契约(待设计)
12
-
13
- **输入**:
14
- - `application/pdf` — PDF 演示稿
15
- - `.pptx` — PowerPoint
16
- - `.html` — 已有 HTML deck(最干净,可能首推 MVP)
17
-
18
- **输出**:`StyleTokens` 结构化 JSON(schema 待定),大致:
19
- ```json
20
- {
21
- "palette": {
22
- "background": ["#fffaf0", "#f0e8d8"],
23
- "foreground": ["#1a1a1a", "#666"],
24
- "accent": ["#c83e3e"]
25
- },
26
- "typography": {
27
- "display": { "family": "...", "weight": 800, "tracking": "-0.02em" },
28
- "body": { "family": "...", "weight": 400, "size_clamp": "..." }
29
- },
30
- "spacing": { "rhythm": [4, 8, 16, 32, 64], "page_padding": "..." },
31
- "layout": { "grid": "12-col" | "asymmetric" | ..., "alignment": "..." },
32
- "motion_signals": [...], // 如果是 HTML,可静态扫到 transition / animation
33
- "metaphor_hints": "..." // 可选:让 LLM 看一眼后给一句话直觉总结
34
- }
35
- ```
36
-
37
- ## 技术路线候选(动工前需先做根因诊断)
38
-
39
- ⚠️ **先别选实现方式**。组长说之前用模版 skill 试过风格参考路径效果不好——根因待诊断(参 [HANDOVER.md](../../HANDOVER.md) §六)。
40
-
41
- 提取技术几条候选路线:
42
- - **PDF / PPTX**:`pdf2htmlEX` / `python-pptx` / `LibreOffice headless` 转中间格式后扫
43
- - **HTML**:DOM + computed style 直接读
44
- - **视觉路径**:截图 → vision model(Kimi K2.6 / Claude Opus)描述 + 关键元素裁切
45
- - **混合**:DOM 提骨架 + vision 提语义(推荐)
46
-
47
- ## 与 engine 的接口
48
-
49
- style-pipeline 输出的 `StyleTokens` 作为 engine `runs` 的 `inputs.style_reference` 传入,engine 在加载 deskskill-engine 时把 tokens 注入 system prompt 一段,让 metaphor 推导跟 reference 对话(不是替代 metaphor)。
50
-
51
- ## 责任划分
52
-
53
- 负责人:你。新东西。
1
+ # server/style-pipeline/ — 风格提取流水线
2
+
3
+ **Nodesign 第二条核心通路**:用户上传参考素材(PPT / PDF / HTML)→ 提取结构化 style tokens → 喂给 engine 下游。
4
+
5
+ ## 为什么这个模块独立于 engine
6
+
7
+ 组长释放的产品意图:当前 deskskill-engine 是"brief → metaphor 推导 → deck"单管道,但真实需求是"风格参考"——用户上传已有 deck,想保留其视觉语言做新内容。
8
+
9
+ **这事儿是后端工程问题,不是 skill 问题**:色板抽样、字体识别、spacing 测量、layout grid 推断——按训练分布让 LLM 用 declarative 路径描述风格会丢精度(procedural / declarative 能力诊断已知)。所以做工程化提取,输出结构化 tokens 喂 skill 下游。
10
+
11
+ ## 输入 / 输出契约(待设计)
12
+
13
+ **输入**:
14
+ - `application/pdf` — PDF 演示稿
15
+ - `.pptx` — PowerPoint
16
+ - `.html` — 已有 HTML deck(最干净,可能首推 MVP)
17
+
18
+ **输出**:`StyleTokens` 结构化 JSON(schema 待定),大致:
19
+ ```json
20
+ {
21
+ "palette": {
22
+ "background": ["#fffaf0", "#f0e8d8"],
23
+ "foreground": ["#1a1a1a", "#666"],
24
+ "accent": ["#c83e3e"]
25
+ },
26
+ "typography": {
27
+ "display": { "family": "...", "weight": 800, "tracking": "-0.02em" },
28
+ "body": { "family": "...", "weight": 400, "size_clamp": "..." }
29
+ },
30
+ "spacing": { "rhythm": [4, 8, 16, 32, 64], "page_padding": "..." },
31
+ "layout": { "grid": "12-col" | "asymmetric" | ..., "alignment": "..." },
32
+ "motion_signals": [...], // 如果是 HTML,可静态扫到 transition / animation
33
+ "metaphor_hints": "..." // 可选:让 LLM 看一眼后给一句话直觉总结
34
+ }
35
+ ```
36
+
37
+ ## 技术路线候选(动工前需先做根因诊断)
38
+
39
+ ⚠️ **先别选实现方式**。组长说之前用模版 skill 试过风格参考路径效果不好——根因待诊断(参 [HANDOVER.md](../../HANDOVER.md) §六)。
40
+
41
+ 提取技术几条候选路线:
42
+ - **PDF / PPTX**:`pdf2htmlEX` / `python-pptx` / `LibreOffice headless` 转中间格式后扫
43
+ - **HTML**:DOM + computed style 直接读
44
+ - **视觉路径**:截图 → vision model(Kimi K2.6 / Claude Opus)描述 + 关键元素裁切
45
+ - **混合**:DOM 提骨架 + vision 提语义(推荐)
46
+
47
+ ## 与 engine 的接口
48
+
49
+ style-pipeline 输出的 `StyleTokens` 作为 engine `runs` 的 `inputs.style_reference` 传入,engine 在加载 deskskill-engine 时把 tokens 注入 system prompt 一段,让 metaphor 推导跟 reference 对话(不是替代 metaphor)。
50
+
51
+ ## 责任划分
52
+
53
+ 负责人:你。新东西。
@@ -1,36 +1,39 @@
1
- /**
2
- * server/ws/broker.js — Per-project EventBus 注册表
3
- *
4
- * 每个 project 一个 EventBus 实例,agent runAgent 跑 turn 时通过 ctx.eventBus.publish
5
- * 推事件,WS 客户端订阅同一个 bus 收 stream。
6
- *
7
- * Bus 是 in-memory pub/sub,不持久化。重启 server 后所有订阅断开,新事件从零开始;
8
- * 前端要能容忍这个(重连后通过 hydrate 重新拉项目状态,丢的事件不补)。
9
- */
10
-
11
- import { EventBus } from '../engine/agent/events.js';
12
- import { attachLiveTurnTracker } from '../engine/runs/live-turn.js';
13
-
14
- /** @type {Map<string, EventBus>} */
15
- const projectBuses = new Map();
16
-
17
- /** 拿 project 的 EventBus(懒创建) */
18
- export function getProjectBus(projectId) {
19
- let bus = projectBuses.get(projectId);
20
- if (!bus) {
21
- bus = new EventBus();
22
- // live-turn 快照折叠器:进行中 turn 的事件物化成可恢复状态,
23
- // WS 重连走"hydrate + ws.live_turn 快照 + 尾随"三段协议。见 live-turn.js
24
- attachLiveTurnTracker(bus);
25
- projectBuses.set(projectId, bus);
26
- }
27
- return bus;
28
- }
29
-
30
- /**
31
- * project 删除时清理 bus(释放内存)。
32
- * 不影响已建立的 ws 连接 — 它们还能 publish 但不再有订阅者。
33
- */
34
- export function disposeProjectBus(projectId) {
35
- projectBuses.delete(projectId);
36
- }
1
+ /**
2
+ * server/ws/broker.js — Per-project EventBus 注册表
3
+ *
4
+ * 每个 project 一个 EventBus 实例,agent runAgent 跑 turn 时通过 ctx.eventBus.publish
5
+ * 推事件,WS 客户端订阅同一个 bus 收 stream。
6
+ *
7
+ * Bus 是 in-memory pub/sub,不持久化。重启 server 后所有订阅断开,新事件从零开始;
8
+ * 前端要能容忍这个(重连后通过 hydrate 重新拉项目状态,丢的事件不补)。
9
+ */
10
+
11
+ import { EventBus } from '../engine/agent/events.js';
12
+ import { attachLiveTurnTracker } from '../engine/runs/live-turn.js';
13
+ import { attachBoardTasklist } from '../engine/runs/board-tasklist.js';
14
+
15
+ /** @type {Map<string, EventBus>} */
16
+ const projectBuses = new Map();
17
+
18
+ /** project 的 EventBus(懒创建) */
19
+ export function getProjectBus(projectId) {
20
+ let bus = projectBuses.get(projectId);
21
+ if (!bus) {
22
+ bus = new EventBus();
23
+ // live-turn 快照折叠器:进行中 turn 的事件物化成可恢复状态,
24
+ // WS 重连走"hydrate + ws.live_turn 快照 + 尾随"三段协议。见 live-turn.js
25
+ attachLiveTurnTracker(bus);
26
+ // 步骤清单镜像成板书 + 每步产物连线(2026-08-23 黑板文化,harness 做不靠 agent 记得)
27
+ attachBoardTasklist(bus, projectId);
28
+ projectBuses.set(projectId, bus);
29
+ }
30
+ return bus;
31
+ }
32
+
33
+ /**
34
+ * project 删除时清理 bus(释放内存)。
35
+ * 不影响已建立的 ws 连接 — 它们还能 publish 但不再有订阅者。
36
+ */
37
+ export function disposeProjectBus(projectId) {
38
+ projectBuses.delete(projectId);
39
+ }