@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.
- package/README.md +156 -106
- package/bin/nodesign.js +0 -0
- package/package.json +1 -1
- package/server/api/README.md +45 -45
- package/server/api/_guard.js +75 -75
- package/server/api/admin.js +187 -187
- package/server/api/assets/docx-page.js +103 -103
- package/server/api/assets/helpers.js +42 -22
- package/server/api/assets/notes.js +194 -144
- package/server/api/assets.js +891 -896
- package/server/api/board.js +134 -57
- package/server/api/browse.js +138 -138
- package/server/api/canvas.js +444 -444
- package/server/api/chatai.js +324 -324
- package/server/api/exports/build-standalone.js +980 -980
- package/server/api/exports/cards.js +118 -118
- package/server/api/exports/docx-pdf.js +46 -46
- package/server/api/exports/export-page.js +142 -142
- package/server/api/exports/handoff.js +147 -147
- package/server/api/exports.js +690 -690
- package/server/api/instruction.js +75 -75
- package/server/api/me.js +116 -116
- package/server/api/memory.js +185 -185
- package/server/api/pending-changes.js +366 -366
- package/server/api/plugins.js +164 -164
- package/server/api/projects.js +220 -220
- package/server/api/publish.js +64 -64
- package/server/api/recent.js +73 -73
- package/server/api/sessions.js +589 -589
- package/server/api/skills.js +77 -77
- package/server/api/standalone-fit.js +168 -168
- package/server/api/turn-compose.js +180 -180
- package/server/api/turn-inflight.js +44 -44
- package/server/auth/README.md +17 -17
- package/server/auth/middleware.js +138 -138
- package/server/auth/origin-guard.js +71 -71
- package/server/auth/session.js +108 -108
- package/server/auth/tier.js +113 -113
- package/server/auth/users-store.js +348 -348
- package/server/edit/README.md +29 -29
- package/server/engine/README.md +113 -113
- package/server/engine/agent/agent-shared.js +550 -550
- package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -4
- package/server/engine/agent/auto-mode-rules.js +78 -78
- package/server/engine/agent/context.js +418 -418
- package/server/engine/agent/events.js +465 -464
- package/server/engine/agent/hooks/canvas-validate.js +199 -199
- package/server/engine/agent/hooks/failure.js +120 -120
- package/server/engine/agent/hooks/file-events.js +75 -75
- package/server/engine/agent/hooks/lifecycle.js +233 -233
- package/server/engine/agent/hooks/post-canvas-focus.js +80 -80
- package/server/engine/agent/hooks/post-guidance.js +206 -206
- package/server/engine/agent/hooks/post-subagent-report.js +104 -104
- package/server/engine/agent/hooks/post-trim.js +58 -58
- package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -34
- package/server/engine/agent/hooks/pre-defaults.js +84 -84
- package/server/engine/agent/hooks/pre-injectors.js +277 -277
- package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -78
- package/server/engine/agent/hooks/pre-starter-files.js +61 -61
- package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -78
- package/server/engine/agent/hooks/site-validate.js +94 -94
- package/server/engine/agent/hooks/tool-prompts.js +31 -31
- package/server/engine/agent/hooks/turn-state-memory.js +56 -56
- package/server/engine/agent/hooks/user-prompt-submit.js +258 -215
- package/server/engine/agent/hooks.js +354 -354
- package/server/engine/agent/init-contract.js +69 -69
- package/server/engine/agent/isolation.js +159 -159
- package/server/engine/agent/model-table.js +292 -292
- package/server/engine/agent/plugin-loader.js +266 -266
- package/server/engine/agent/prompts/nodesign-prelude.md +388 -336
- package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -71
- package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -98
- package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -583
- package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -483
- package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -100
- package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -270
- package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -70
- package/server/engine/agent/prompts/tools/site-reference.md +106 -106
- package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -125
- package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -48
- package/server/engine/agent/session-loop.js +1035 -1024
- package/server/engine/agent/session-model.js +164 -164
- package/server/engine/agent/skill.js +204 -204
- package/server/engine/agent/task-events.js +78 -78
- package/server/engine/agents/ds-extractor.md +132 -132
- package/server/engine/agents/explorer.md +190 -190
- package/server/engine/agents/index.js +230 -230
- package/server/engine/agents/schemas/design-system.json +156 -156
- package/server/engine/agents/schemas/tweak-schema.json +113 -113
- package/server/engine/agents/tweak-proposer.md +127 -127
- package/server/engine/agents/vision-checker.md +254 -254
- package/server/engine/browse/capture.js +422 -422
- package/server/engine/browse/card.js +137 -137
- package/server/engine/browse/handover.js +59 -59
- package/server/engine/browse/page-digest.js +119 -119
- package/server/engine/browse/refs.js +196 -196
- package/server/engine/browse/registry.js +307 -307
- package/server/engine/browse/screencast.js +170 -170
- package/server/engine/browse/state.js +121 -121
- package/server/engine/chatai/chat-log.js +79 -79
- package/server/engine/chatai/index.js +193 -193
- package/server/engine/chatai/openai-compat.js +152 -152
- package/server/engine/chatai/orchestrate.js +309 -309
- package/server/engine/chatai/perform.js +40 -40
- package/server/engine/chatai/summarize.js +79 -79
- package/server/engine/mcp/capability-gate.js +52 -52
- package/server/engine/mcp/index.js +351 -339
- package/server/engine/mcp/param-sanitizer.js +142 -142
- package/server/engine/mcp/tools/arrange-on-board.js +124 -124
- package/server/engine/mcp/tools/artifact-session.js +278 -278
- package/server/engine/mcp/tools/browse-computer.js +421 -421
- package/server/engine/mcp/tools/browse-find-batch.js +183 -183
- package/server/engine/mcp/tools/browse-screenshot.js +157 -157
- package/server/engine/mcp/tools/browse.js +480 -480
- package/server/engine/mcp/tools/build-docx.js +101 -101
- package/server/engine/mcp/tools/clear-pending-changes.js +99 -99
- package/server/engine/mcp/tools/create-on-board.js +152 -155
- package/server/engine/mcp/tools/crystallize-skill.js +168 -168
- package/server/engine/mcp/tools/edit-sketch.js +167 -0
- package/server/engine/mcp/tools/explain-style.js +237 -237
- package/server/engine/mcp/tools/export-handoff.js +133 -133
- package/server/engine/mcp/tools/expose-tweaks.js +149 -149
- package/server/engine/mcp/tools/generate-image.js +842 -842
- package/server/engine/mcp/tools/get-computed-styles.js +164 -164
- package/server/engine/mcp/tools/get-pending-changes.js +205 -205
- package/server/engine/mcp/tools/h3box-ssh.js +84 -84
- package/server/engine/mcp/tools/helpers/acquire-page.js +82 -82
- package/server/engine/mcp/tools/helpers/motion-lab.js +554 -554
- package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -112
- package/server/engine/mcp/tools/helpers/perception-page.js +215 -215
- package/server/engine/mcp/tools/helpers/reference-download.js +103 -103
- package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -80
- package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -280
- package/server/engine/mcp/tools/highlight.js +68 -68
- package/server/engine/mcp/tools/list-pages.js +222 -222
- package/server/engine/mcp/tools/look-at-board.js +124 -0
- package/server/engine/mcp/tools/lookup-tags.js +59 -59
- package/server/engine/mcp/tools/navigate-to-page.js +60 -60
- package/server/engine/mcp/tools/organize-board.js +64 -64
- package/server/engine/mcp/tools/paint-still.js +434 -434
- package/server/engine/mcp/tools/pin-to-board.js +130 -130
- package/server/engine/mcp/tools/preview-deck.js +130 -130
- package/server/engine/mcp/tools/profile-scroll.js +305 -305
- package/server/engine/mcp/tools/publish-site.js +102 -102
- package/server/engine/mcp/tools/query-elements.js +195 -195
- package/server/engine/mcp/tools/read-board.js +190 -103
- package/server/engine/mcp/tools/read-document.js +93 -93
- package/server/engine/mcp/tools/read-page.js +264 -264
- package/server/engine/mcp/tools/read-tavern-json.js +143 -143
- package/server/engine/mcp/tools/read-user-view.js +59 -0
- package/server/engine/mcp/tools/record-decision.js +140 -140
- package/server/engine/mcp/tools/relate-on-board.js +112 -110
- package/server/engine/mcp/tools/report-issue.js +115 -115
- package/server/engine/mcp/tools/roll-film.js +266 -266
- package/server/engine/mcp/tools/screenshot-docx.js +138 -138
- package/server/engine/mcp/tools/screenshot-url.js +195 -195
- package/server/engine/mcp/tools/screenshot.js +583 -583
- package/server/engine/mcp/tools/sketch-on-board.js +337 -0
- package/server/engine/mcp/tools/tier-gate.js +96 -96
- package/server/engine/mcp/tools/trace-motion.js +215 -215
- package/server/engine/mcp/tools/web-search.js +548 -548
- package/server/engine/mcp/tools/write-on-board.js +130 -0
- package/server/engine/motion/inventory.js +349 -349
- package/server/engine/perception/session.js +235 -235
- package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -5
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +199 -192
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -667
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -22
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -25
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -23
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -21
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -23
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -21
- package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +169 -162
- package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -407
- package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -80
- package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +235 -228
- 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
- package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -268
- package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +330 -323
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -134
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -61
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -163
- package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -86
- package/server/engine/runs/active-runs.js +698 -698
- package/server/engine/runs/board-tasklist.js +130 -0
- package/server/engine/runs/live-turn.js +252 -252
- package/server/engine/runs/store.js +364 -364
- package/server/engine/runs/turn-relay.js +217 -217
- package/server/engine/runtime/workspace.js +164 -164
- package/server/index.js +3 -0
- package/server/lib/artifact-file-path.js +80 -80
- package/server/lib/artifact-target.js +284 -284
- package/server/lib/asset-refs.js +239 -239
- package/server/lib/async-queue.js +104 -104
- package/server/lib/auto-relations.js +130 -130
- package/server/lib/binding-types.js +72 -60
- package/server/lib/board-graph-export.js +191 -0
- package/server/lib/board-groups.js +167 -0
- package/server/lib/board-hero.js +76 -0
- package/server/lib/board-kind-sizes.js +85 -62
- package/server/lib/board-relations.js +133 -133
- package/server/lib/browse-proxy.js +180 -180
- package/server/lib/canvas-id.js +36 -36
- package/server/lib/chalk.js +121 -0
- package/server/lib/cover.js +227 -227
- package/server/lib/danbooru-tags.js +291 -291
- package/server/lib/doc-extract.js +156 -156
- package/server/lib/docx/build-from-source.js +260 -260
- package/server/lib/docx/build.js +490 -490
- package/server/lib/docx/dump-styles.js +287 -287
- package/server/lib/docx/fonts/nodesign-cjk.conf +164 -164
- package/server/lib/docx/merge-runs.js +129 -129
- package/server/lib/docx/numbering.js +218 -218
- package/server/lib/docx/order.js +152 -152
- package/server/lib/docx/rawzip.js +172 -172
- package/server/lib/docx/render.js +92 -92
- package/server/lib/docx/text-lint.js +225 -225
- package/server/lib/docx/tokens.js +335 -335
- package/server/lib/docx/units.js +29 -29
- package/server/lib/docx/xml.js +291 -291
- package/server/lib/docx-pages.js +187 -187
- package/server/lib/export-collect.js +289 -289
- package/server/lib/export-package.js +210 -210
- package/server/lib/html-srcset.js +145 -145
- package/server/lib/image-variant.js +460 -460
- package/server/lib/ingress/forward-openai-chat.js +305 -305
- package/server/lib/ingress/openai-chat.js +491 -491
- package/server/lib/ingress/session-notice.js +66 -66
- package/server/lib/ingress/session-routes.js +68 -68
- package/server/lib/ingress/slot-probe.js +130 -130
- package/server/lib/ingress/upstream-billing.js +52 -52
- package/server/lib/ingress/upstream-fail-streak.js +72 -72
- package/server/lib/ingress/upstream-truncation.js +48 -48
- package/server/lib/issues-store.js +182 -182
- package/server/lib/kinds/deck.js +72 -72
- package/server/lib/kinds/docx.js +283 -283
- package/server/lib/kinds/file-kinds.js +113 -113
- package/server/lib/kinds/index.js +202 -202
- package/server/lib/kinds/site.js +161 -161
- package/server/lib/model-ingress.js +543 -543
- package/server/lib/moderation.js +255 -255
- package/server/lib/notice-store.js +103 -103
- package/server/lib/plugin-install.js +104 -104
- package/server/lib/plugin-validator.js +721 -721
- package/server/lib/publish-store.js +115 -115
- package/server/lib/quick-summary.js +52 -52
- package/server/lib/quota.js +270 -270
- package/server/lib/rate-window.js +29 -29
- package/server/lib/reference-assets.js +92 -92
- package/server/lib/region-shot.js +135 -135
- package/server/lib/safe-path.js +73 -73
- package/server/lib/sdk-session.js +33 -33
- package/server/lib/showcase-store.js +92 -92
- package/server/lib/site-publish.js +465 -465
- package/server/lib/sketch-layout.js +277 -0
- package/server/lib/ssrf-guard.js +432 -432
- package/server/lib/task-scan.js +158 -158
- package/server/lib/tavern-json.js +154 -154
- package/server/lib/video-variant.js +237 -237
- package/server/lib/workspace-path.js +33 -33
- package/server/ops/fix-sdk-musl.mjs +40 -40
- package/server/ops/install-macos-fonts.sh +114 -114
- package/server/ops/macos-fonts.conf +336 -336
- package/server/ops/sandbox-shim/bwrap +57 -57
- package/server/projects/assets-summary.js +119 -119
- package/server/projects/auto-name.js +53 -53
- package/server/projects/board-limits.js +12 -0
- package/server/projects/board-sanitize.js +252 -0
- package/server/projects/board-store.js +507 -640
- package/server/projects/move-entry.js +103 -103
- package/server/projects/store.js +270 -270
- package/server/projects/ui-config.js +60 -54
- package/server/projects/viewpoint-store.js +78 -0
- package/server/projects/workspace-templates.js +53 -53
- package/server/projects/workspace.js +1025 -1025
- package/server/runtime/local-config.js +177 -177
- package/server/runtime/profile.js +72 -72
- package/server/services/rembg-service.py +334 -334
- package/server/shared/README.md +25 -25
- package/server/shared/deck.js +54 -54
- package/server/shared/time.js +49 -49
- package/server/style-pipeline/README.md +53 -53
- package/server/ws/broker.js +39 -36
- package/server/ws/browse-channel.js +177 -177
- package/server/ws/index.js +386 -386
- package/web/README.md +89 -89
- package/web/dist/assets/BrowserWindow-P_vIdh-G.js +11 -0
- package/web/dist/assets/{DeckWindow-4G0xX7P3.js → DeckWindow-BpLv5082.js} +3 -3
- package/web/dist/assets/{DocxWindow-BXQsoPkh.js → DocxWindow-DSAU1-tD.js} +4 -4
- package/web/dist/assets/MermaidBlock-DR1GikCv.js +313 -0
- package/web/dist/assets/SiteWindow-92uBuRRR.js +18 -0
- package/web/dist/assets/abnfDiagram-VCTEODGH-uA8Esix4.js +1 -0
- package/web/dist/assets/arc-D_khH_xN.js +1 -0
- package/web/dist/assets/architectureDiagram-5GKGNRK7-DydJHqOt.js +36 -0
- package/web/dist/assets/blockDiagram-NRAW4CY4-B7wBbKiW.js +129 -0
- package/web/dist/assets/c4Diagram-UCG6FXSJ-6mrH0x7Y.js +38 -0
- package/web/dist/assets/channel-DGkccMO1.js +1 -0
- package/web/dist/assets/chunk-2Q5K7J3B-Cuikho5Q.js +1 -0
- package/web/dist/assets/chunk-5VM5RSS4-3-KZ5AUz.js +15 -0
- package/web/dist/assets/chunk-F27PBJKO-Bkwq2gGU.js +1 -0
- package/web/dist/assets/chunk-G27WJ6UU-BLyQzdGE.js +231 -0
- package/web/dist/assets/chunk-JWPE2WC7-B7HxxQds.js +1 -0
- package/web/dist/assets/chunk-LCL6LL3I-CtXrnUwF.js +206 -0
- package/web/dist/assets/chunk-POPQ4Y6H-dxddZlXt.js +1 -0
- package/web/dist/assets/chunk-SVP7TREG-DpkmrgHn.js +88 -0
- package/web/dist/assets/chunk-XXDRQBXY-BwZ7RbpQ.js +1 -0
- package/web/dist/assets/classDiagram-DTDB5LWJ-BGscw3OD.js +1 -0
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-BGscw3OD.js +1 -0
- package/web/dist/assets/cose-bilkent-JH36ORCC-DGFOsMUt.js +1 -0
- package/web/dist/assets/cynefin-OW5HDTMX-DUwn3ehS.js +178 -0
- package/web/dist/assets/cynefinDiagram-5FMLGOSQ-DlLAOZ9x.js +62 -0
- package/web/dist/assets/cytoscape.esm-BjAbmLdb.js +331 -0
- package/web/dist/assets/dagre-3AP2YEHR-CyourLfz.js +4 -0
- package/web/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/web/dist/assets/diagram-S7CK7UJ4-BTMbx2np.js +30 -0
- package/web/dist/assets/diagram-UQ7AKVKN-UK94_1-P.js +41 -0
- package/web/dist/assets/diagram-VSXAHHWV-C7zS-v9v.js +3 -0
- package/web/dist/assets/diagram-VX7I27RA-DKJRa6CK.js +24 -0
- package/web/dist/assets/diagram-Z3DM3KII-kUbAfGAp.js +24 -0
- package/web/dist/assets/ebnfDiagram-PWID7BFC-CVW16_vb.js +1 -0
- package/web/dist/assets/erDiagram-SSCWMZ5O-BRQMFQ5y.js +99 -0
- package/web/dist/assets/flowDiagram-A5DVABFB-S34LpLtK.js +168 -0
- package/web/dist/assets/ganttDiagram-EL5Y4UJY-BFiqk1-G.js +292 -0
- package/web/dist/assets/gitGraphDiagram-WWUBYQGX-LZsrdyyv.js +106 -0
- package/web/dist/assets/index-GAamh1p4.js +2152 -0
- package/web/dist/assets/infoDiagram-RXCK75RN-0DvN6KIp.js +2 -0
- package/web/dist/assets/init-Gi6I4Gst.js +1 -0
- package/web/dist/assets/ishikawaDiagram-5VMMS53U-CaY3A-Bx.js +70 -0
- package/web/dist/assets/journeyDiagram-EYS64GPL-BBeiaCrj.js +139 -0
- package/web/dist/assets/kanban-definition-3QL26DDD-ux42DRXQ.js +89 -0
- package/web/dist/assets/layout-CnXiF_NB.js +1 -0
- package/web/dist/assets/linear-BMW0u6G6.js +1 -0
- package/web/dist/assets/mindmap-definition-FBJOCRG2-hUxSpdKn.js +96 -0
- package/web/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/web/dist/assets/pegDiagram-XKGWAZYB-aCaQPH0w.js +1 -0
- package/web/dist/assets/{pending-edit-apply-DTjo2geW.js → pending-edit-apply-AcdOQ9Ij.js} +6 -6
- package/web/dist/assets/pieDiagram-E7YTZNPT-CmOEZ8zg.js +39 -0
- package/web/dist/assets/quadrantDiagram-AXDQQJYC-VW6fAhsV.js +7 -0
- package/web/dist/assets/railroadDiagram-O6MQD6OU-CKJ7Ba5K.js +1 -0
- package/web/dist/assets/requirementDiagram-EFPCY7ZU-pNGkq9Vw.js +84 -0
- package/web/dist/assets/{rotate-cw-LMT3x1Zj.js → rotate-cw-KAfChbGV.js} +1 -1
- package/web/dist/assets/sankeyDiagram-P5KCCOFB-BIMmDTfZ.js +40 -0
- package/web/dist/assets/sequenceDiagram-WJ2MYXX4-BBW7wzKY.js +162 -0
- package/web/dist/assets/sizeCapture-X5ZJPWSS-DdkXmLYR.js +1 -0
- package/web/dist/assets/{square-dashed-mouse-pointer-CBoAkfhi.js → square-dashed-mouse-pointer-CDUlhUP7.js} +1 -1
- package/web/dist/assets/stateDiagram-HBIQ2CUA-W313Uz16.js +1 -0
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-DDhJBZzf.js +1 -0
- package/web/dist/assets/swimlanes-XN3QIQJK-C29TL26K.js +1 -0
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BfN-Xdmu.js +8 -0
- package/web/dist/assets/timeline-definition-24CTP7MA-CF0JMObX.js +120 -0
- package/web/dist/assets/vennDiagram-4TSXK5OY-DrDFsaH3.js +34 -0
- package/web/dist/assets/wardleyDiagram-VM6X3IG4-CVrnRIS_.js +78 -0
- package/web/dist/assets/xychartDiagram-S5SC5T6Z-BvkN1zsT.js +7 -0
- package/web/dist/index.html +17 -17
- package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +0 -11
- package/web/dist/assets/SiteWindow-D6eS-2gM.js +0 -18
- package/web/dist/assets/index-Cbl3ATvp.js +0 -2125
package/server/shared/README.md
CHANGED
|
@@ -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`。
|
package/server/shared/deck.js
CHANGED
|
@@ -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
|
+
}
|
package/server/shared/time.js
CHANGED
|
@@ -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
|
+
负责人:你。新东西。
|
package/server/ws/broker.js
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
+
}
|