@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/README.md
CHANGED
|
@@ -1,140 +1,190 @@
|
|
|
1
1
|
# NoDesign
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
agent 在真实文件上做出网站、演示稿、图像和视频,过程实时演在画布上;你直接在
|
|
5
|
-
产物上改字、圈选、留评论、拖拽整理,agent 接着你的动作继续做。
|
|
6
|
-
|
|
7
|
-
线上实例(内测,邀请制):`nodesign.xiaobuyu.trade`
|
|
8
|
-
|
|
9
|
-
## 它长什么样
|
|
10
|
-
|
|
11
|
-
- **画布即桌面**:项目就是一张空间画布,画布上的一切与磁盘一一对应。文件夹是
|
|
12
|
-
真目录,卡片 id 就是文件路径,拖一张卡进文件夹等于真的 `mv`。
|
|
13
|
-
- **产物即文件**:形态由文件证据认定,不用声明。写出 `<名字>.html` 是一份
|
|
14
|
-
deck;建一个带 `index.html` 的文件夹是一个站点,配响应式取景的显示器窗;
|
|
15
|
-
普通文件各自成卡,图片、视频、Office 文档、Markdown 都读得开。
|
|
16
|
-
- **agent 是在场的**:一枚铅笔定格风格的 Claude 星芒住在画布上。干活时贴着
|
|
17
|
-
它正在写的那张卡,代码直播框跟在身边;空闲时停在你的视野里,写一句刚才
|
|
18
|
-
干了什么。点它可以直接搭话。
|
|
19
|
-
- **关系是一等公民**:六类关系线(改自、批注、接着、取材、对照、自定义
|
|
20
|
-
label)。你画的线 agent 读得到,agent 也会在收尾时主动把产物之间的关系画
|
|
21
|
-
出来;HTML 里真实引用的素材由服务端自动对账成取材边。版面排布按关系走:
|
|
22
|
-
相关的凑近、对照的成行、现役主角放大。
|
|
23
|
-
|
|
24
|
-
## agent 能做什么
|
|
25
|
-
|
|
26
|
-
| 能力 | 说明 |
|
|
27
|
-
|---|---|
|
|
28
|
-
| 建站 / 做 deck | 手写或构建型站点(Astro、11ty 均可,产物根自动认定);deck 固定比例分页 |
|
|
29
|
-
| 看得见 | 截图自检(回传 console 错误与加载失败资源)、DOM 查询、真机移动端取景 |
|
|
30
|
-
| 画布语言 | `read_board` 看座次、`arrange_on_board` 语义摆位、`create_on_board` 手写便签、`organize_board` 归纳收纳、`relate_on_board` 画关系线 |
|
|
31
|
-
| 图像 | `generate_image` 生图、`remove_background` 抠图;可接自部署 GPU 产线(多模型生图、文生视频,按账号开通) |
|
|
32
|
-
| 发布 | `publish_site` 一键发布到四级子域名(Cloudflare Pages);下线即回收 |
|
|
33
|
-
| 导出 | PDF / PPTX / 整站 zip / 工程交付包,浏览器直接下载 |
|
|
34
|
-
| 记忆 | 项目级风格档案与用户偏好档,跨会话不忘;共享便利贴层与决策记录 |
|
|
3
|
+
一张无限画布,一个始终在场的 Agent。
|
|
35
4
|
|
|
36
|
-
|
|
37
|
-
截图进 pending buffer 下一轮自动带上,拖拽移动、样式调整、删除都以结构化意图
|
|
38
|
-
落地。
|
|
5
|
+
告诉它你想做什么,它会在画布上创建网站、演示稿、文档、图片和视频。所有产物都会保存为真实文件,可以继续编辑、批注、下载和发布。
|
|
39
6
|
|
|
40
|
-
|
|
7
|
+

|
|
41
8
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
cwd 指向项目工作区);in-process MCP 提供 31 件业务工具;hooks
|
|
47
|
-
做注入与守卫;WS 采用快照加尾随协议,断线重连不丢流。
|
|
9
|
+
## 立即体验
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx @xiaobuyu/nodesign
|
|
48
13
|
```
|
|
49
14
|
|
|
50
|
-
|
|
15
|
+
需要 Node.js 20+,并配置至少一种模型接入方式:
|
|
51
16
|
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
-
|
|
55
|
-
拖拽与 agent 工具共用;改名是一等动词,三层传播(画布身份、关系线端点、
|
|
56
|
-
转发表)保证 agent 背着画布 `mv` 之后版面不散。
|
|
57
|
-
- **事件三管线**:一条 WS 进来分流为舞台旁路(画布演出)、聊天流折叠、控制
|
|
58
|
-
帧。分流名单与过期判据抽成纯函数并有钉子测试。
|
|
59
|
-
- **多用户**:邀请码注册、按用户隔离、用量计费闸门、内容外审档位。
|
|
17
|
+
- Claude 订阅或 Anthropic API
|
|
18
|
+
- OpenAI、DeepSeek、智谱、通义、OpenRouter
|
|
19
|
+
- Ollama 或其他兼容 OpenAI API 格式的模型服务
|
|
60
20
|
|
|
61
|
-
|
|
21
|
+
NoDesign 本身不收取订阅费,也不对模型调用加价。项目文件和配置保存在本地。使用云端模型时,完成任务所需的上下文会发送给你配置的模型服务。使用本地模型(如 Ollama)时,所有数据都留在你的电脑上。
|
|
62
22
|
|
|
63
|
-
|
|
64
|
-
本地版默认单租户:没有登录墙、没有账号和额度,服务只绑 `127.0.0.1`,数据都在 `~/.nodesign/`
|
|
65
|
-
(`.env` 钥匙 / `config.json` 模型插槽 / 数据库 / 项目 / 缓存)。
|
|
23
|
+
暂时不想安装,也可以通过在线实例体验基础能力:[nodesign.xiaobuyu.trade](https://nodesign.xiaobuyu.trade)
|
|
66
24
|
|
|
67
|
-
|
|
25
|
+
在线体验版提供免费模型和每日额度,部分本地能力暂未开放。
|
|
68
26
|
|
|
69
|
-
|
|
70
|
-
npx @xiaobuyu/nodesign # 首次会下载约 470MB(含 Claude CLI 本体),起来后自动开浏览器
|
|
71
|
-
npx @xiaobuyu/nodesign login # 用 Claude 订阅的话登录一次(不用另装 claude CLI);用 API Key 的话在设置页填
|
|
72
|
-
# 或者装成全局命令:npm i -g @xiaobuyu/nodesign,之后直接 nodesign / nodesign login
|
|
73
|
-
```
|
|
27
|
+
## 它能帮你做什么
|
|
74
28
|
|
|
75
|
-
|
|
29
|
+
三个典型场景:
|
|
76
30
|
|
|
77
|
-
|
|
31
|
+
- **做一个作品集页面**:把参考图和文字素材放到画布上,告诉 Agent 你要什么风格,检查桌面、平板和手机尺寸下的效果,配置后一键发布到公网。
|
|
32
|
+
- **做一份演示稿**:把照片、文字和参考风格放到画布上,Agent 生成分页幻灯,你直接在上面批注修改,导出 PDF 或 PPTX。
|
|
33
|
+
- **做一个内容项目**:网站、图片、视频和文档放在同一张画布上,由同一个 Agent 连续处理。Agent 可以在不同产物之间继续取材和修改。
|
|
78
34
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
35
|
+
### 产物类型
|
|
36
|
+
|
|
37
|
+
| 产物 | 格式 | 能做什么 |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| 演示稿(幻灯、长图、海报) | `.html` | 16:9、9:16、4:3 等比例分页,导出 HTML、PDF、PPTX |
|
|
40
|
+
| 站点(作品集、落地页、小应用) | 带 `index.html` 的文件夹 | 桌面、平板和手机尺寸预览,整站 zip 导出,配置 Cloudflare 后可一键发布 |
|
|
41
|
+
| Word 文档 | `.docx` | 直接生成标准 OOXML,不是把 HTML 包装成 Word 文件。页图预览、翻页、下载原件 |
|
|
42
|
+
| 图片 | 常见图片格式 | 生图、抠图 |
|
|
43
|
+
| 视频 | 常见视频格式 | 视频导入、预览与转码 |
|
|
44
|
+
|
|
45
|
+
这些文件不依赖 NoDesign 的私有格式,可以使用其他工具继续编辑和下载。
|
|
46
|
+
|
|
47
|
+
使用 NoDesign 完成的实际项目:一个乐队的研究站、一份 15 页的西藏攻略幻灯配站点、一套像素风服务器宣传页、一份改了六版的简历 .docx。也有实验性项目,比如一个在页面上选择剧情、在聊天里生成内容的互动视觉小说。已发布的一个站点:[spica-mix.share.xiaobuyu.trade](https://spica-mix.share.xiaobuyu.trade)。
|
|
48
|
+
|
|
49
|
+
## 它为什么不只是另一个 AI 聊天框
|
|
50
|
+
|
|
51
|
+
### 画布就是工作区
|
|
52
|
+
|
|
53
|
+
画布上的卡片对应真实文件,文件夹对应真实目录。移动、编辑和整理卡片,也会同步改变磁盘上的内容。
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
### Agent 始终在场
|
|
58
|
+
|
|
59
|
+
Agent 会出现在它正在处理的内容旁边。你可以看到它正在编辑哪个文件,以及内容如何逐步生成,而不是只能等待聊天框返回最终结果。
|
|
60
|
+
|
|
61
|
+
### 你的操作会成为下一轮上下文
|
|
62
|
+
|
|
63
|
+
你可以直接修改文字、圈选区域、拖动元素,或者在不同产物之间建立「参考」「批注」「接着做」等关系。这些操作会被整理为后续任务的上下文。
|
|
64
|
+
|
|
65
|
+

|
|
66
|
+
|
|
67
|
+
### Agent 能检查自己的结果
|
|
68
|
+
|
|
69
|
+
它可以获取不同屏幕尺寸下的页面截图、样式计算结果、控制台错误、字体加载状态和动效帧,并根据检查结果继续修改。做完之后它自己截图核对,改了两轮你还是不满意,它会请一个只读的评审子代理逐页检查。
|
|
70
|
+
|
|
71
|
+

|
|
72
|
+
|
|
73
|
+
### 记忆是可见、可编辑的
|
|
74
|
+
|
|
75
|
+
项目决策、风格记录和个人偏好不会只藏在对话历史中。它们会以可见内容保留在工作区,也可以沉淀成可复用的 Skill。
|
|
76
|
+
|
|
77
|
+
## 本地版与线上版
|
|
78
|
+
|
|
79
|
+
| | 本地版 `npx @xiaobuyu/nodesign` | 线上版 [nodesign.xiaobuyu.trade](https://nodesign.xiaobuyu.trade) |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| 模型 | 你自己配置的(Claude 订阅、API Key 或兼容 OpenAI API 格式的服务) | 免费模型,每日额度 |
|
|
82
|
+
| 数据 | 保存在 `~/.nodesign/`,服务仅监听 `127.0.0.1` | 服务端存储,按用户隔离 |
|
|
83
|
+
| 账号 | 无需账号,打开即可使用 | 公开注册 |
|
|
84
|
+
| 能力 | 全部。截图、Word、抠图、生图等按本机环境自动探测。站点发布需要配置 Cloudflare Pages | 截图、搜索、生图开放。站点发布和订阅模型暂不对外开放 |
|
|
85
|
+
| 费用 | 无订阅,无抽成。模型费用由你配置的服务商收取 | 免费 |
|
|
84
86
|
|
|
85
|
-
|
|
87
|
+
本地版是主力。线上版用来在不安装的情况下快速体验。
|
|
86
88
|
|
|
87
|
-
|
|
88
|
-
截图自检要 `npx playwright install chromium`;Word 形态要装 LibreOffice。缺的能力对应的工具
|
|
89
|
-
会在 agent 面前标「不可用 + 装法」,不会静默失败
|
|
90
|
-
- **模型**:「Claude 官方」(API Key 或 `nodesign login` 的订阅登录态)与「自定义接入」(DeepSeek / OpenAI /
|
|
91
|
-
智谱 / 通义 / OpenRouter / 中转站 / 本机 Ollama…,选服务商预设填钥匙和模型名即可)两张并列的卡;
|
|
92
|
-
没配任何一种时模型选择器是空的
|
|
93
|
-
- **其他钥匙与开关**:四家搜索 / 生图通道 / Cloudflare 发布 / 沙盒与权限模式,写进
|
|
94
|
-
`~/.nodesign/.env`,钥匙类保存即生效
|
|
95
|
-
- 模型插槽细节:自己的上游(Anthropic 或 OpenAI-chat 协议的任何端点)+ 模型行,保存后重启生效;
|
|
96
|
-
每行可「体检」(非流式 / 流式 / 工具调用 / 看图 / count_tokens 五项红绿)
|
|
89
|
+
## 配置
|
|
97
90
|
|
|
98
|
-
|
|
91
|
+
启动后点右上角齿轮进入设置页,分为四个区域:
|
|
99
92
|
|
|
100
|
-
|
|
101
|
-
|
|
93
|
+
- **模型**:两张并列的卡片。「Claude 官方」填 API Key 或通过 `nodesign login` 登录 Claude 订阅。「自定义接入」从服务商预设里选一个(DeepSeek、OpenAI、智谱、通义、OpenRouter、Ollama 等),填入接口地址和密钥。每个模型配置都可以运行连接测试,实际验证普通对话、流式输出、工具调用、图片理解和计数能力。没有配置任何模型时,模型选择器是空的。
|
|
94
|
+
- **本机能力**:启动时自动探测 git、Chromium、LibreOffice、poppler、ffmpeg、rembg、生图、搜索、发布能力。缺少的会标出安装方法,对应工具会明确显示为不可用,并附上安装说明。
|
|
95
|
+
- **其他设置**:搜索(四家任选一)、生图通道、Cloudflare 发布、沙盒与权限模式。
|
|
96
|
+
- **状态**:数据目录、配置文件路径、重启。
|
|
97
|
+
|
|
98
|
+
配置文件存放在 `~/.nodesign/.env`(密钥)和 `~/.nodesign/config.json`(模型插槽),也可以直接编辑。
|
|
99
|
+
|
|
100
|
+
## 安全与隐私
|
|
101
|
+
|
|
102
|
+
每个项目使用独立的工作区目录。本地数据默认保存在 `~/.nodesign/`,服务仅监听 `127.0.0.1`。
|
|
103
|
+
|
|
104
|
+
在支持的平台上,可以启用系统级命令沙盒:
|
|
105
|
+
|
|
106
|
+
- Linux:bubblewrap
|
|
107
|
+
- macOS:sandbox-exec
|
|
108
|
+
- Windows:当前暂不提供系统级命令沙盒
|
|
109
|
+
|
|
110
|
+
还可以启用自动权限检查,对文件上传、外部请求和其他敏感操作进行额外判断。
|
|
111
|
+
|
|
112
|
+
本地版默认不启用命令沙盒和自动权限检查。请根据使用场景在设置中开启。在 Windows 上,建议仅打开你信任的项目,并在执行涉及工作区外文件、安装软件或上传内容的操作前确认 Agent 的计划。
|
|
113
|
+
|
|
114
|
+
## 项目状态
|
|
115
|
+
|
|
116
|
+
个人项目,2026 年 4 月底起步,目前仍在快速迭代。版本号 `0.0.1` 是本地发行版的首个公开版本,核心功能已在内测中稳定使用。
|
|
117
|
+
|
|
118
|
+
### 功能
|
|
119
|
+
|
|
120
|
+
| 能力 | 当前状态 |
|
|
121
|
+
|---|---|
|
|
122
|
+
| 画布与项目管理 | 内测主版本运行中 |
|
|
123
|
+
| 网站生成、预览与发布 | 稳定 |
|
|
124
|
+
| 演示稿生成与导出 | 稳定 |
|
|
125
|
+
| Word 文档 | 可用。预览分页与 Microsoft Word 可能存在偏差 |
|
|
126
|
+
| 图片与视频工具 | 可用。具体能力取决于本机依赖和服务配置 |
|
|
127
|
+
| 互动演出模式 | 实验中,尚未完整进入公开版本 |
|
|
128
|
+
|
|
129
|
+
### 平台兼容性
|
|
130
|
+
|
|
131
|
+
| 平台 | 状态 |
|
|
132
|
+
|---|---|
|
|
133
|
+
| Linux | 生产环境运行中 |
|
|
134
|
+
| Windows | 已完成真机安装与运行验证 |
|
|
135
|
+
| macOS | 有对应代码分支,尚未在真机上验证 |
|
|
136
|
+
| 移动端 | 可以浏览和对话,整理和编辑建议使用电脑 |
|
|
137
|
+
|
|
138
|
+
## 技术架构
|
|
139
|
+
|
|
140
|
+
- **前端**:React + Vite。无限画布的相机、命中检测、关系排布和产物能力系统为自研实现(web/src/lib,45 个纯函数模块,配有单测)。
|
|
141
|
+
- **服务端**:Node.js ESM。Agent 会话以项目工作区作为执行目录,通过约 50 个进程内工具操作文件、浏览器和不同类型的产物。
|
|
142
|
+
- **会话同步**:服务端维护会话状态,支持流式输出、断线恢复和多标签页同步。
|
|
143
|
+
- **模型兼容**:原生支持 Claude,并通过格式转换接入兼容 OpenAI API 的模型服务。无法匹配上游时直接返回错误,避免请求被发送到错误的模型服务。
|
|
144
|
+
- **产物系统**:网站、演示稿和 Word 文档通过统一的注册机制接入预览、导出和发布流程。新增产物类型时,通过同一注册入口接入相关能力。
|
|
102
145
|
|
|
103
146
|
## 开发
|
|
104
147
|
|
|
105
148
|
```bash
|
|
106
149
|
npm install && cd web && npm install && cd ..
|
|
150
|
+
npm run dev # 服务端,读 .env
|
|
151
|
+
cd web && npm run dev # 前端
|
|
152
|
+
npm test # server 测试 + web 测试
|
|
153
|
+
```
|
|
107
154
|
|
|
108
|
-
|
|
109
|
-
npm run dev
|
|
155
|
+
> 注意:完整运行需要配置模型接入(Claude 订阅或 API Key)以及部分本地工具依赖。设置页会列出缺少的依赖和安装方法。
|
|
110
156
|
|
|
111
|
-
|
|
112
|
-
cd web && npm run dev
|
|
113
|
-
```
|
|
157
|
+
项目以 Vitest 测试套件作为发布前检查,server 和 web 合计 980 项用例,覆盖前后端契约、模块边界、权限能力表和关键用户文案。部分约束以静态测试固化,避免仅依赖注释和人工约定。例如:
|
|
114
158
|
|
|
115
|
-
|
|
159
|
+
- 前后端双份能力表逐项对账
|
|
160
|
+
- 权限判断必须通过能力表查询
|
|
161
|
+
- 用户可见文案的措辞检查
|
|
162
|
+
- 源文件行数棘轮
|
|
116
163
|
|
|
117
|
-
|
|
118
|
-
npm test # server 单测 + web 单测(含 lint 型测试)
|
|
119
|
-
npm run test:server # 仅服务端
|
|
120
|
-
node web/src/components/canvas/_hook-order-check.mjs # TDZ 依赖顺序体检
|
|
121
|
-
```
|
|
164
|
+
前端部署使用 `web/scripts/deploy.sh`(新分片加入、旧分片不删、`index.html` 原子替换)。服务端改动需要重启进程。
|
|
122
165
|
|
|
123
|
-
|
|
166
|
+
## 许可
|
|
124
167
|
|
|
125
|
-
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
168
|
+
AGPL-3.0。可以使用,可以修改,可以自行部署。对外提供服务时,修改需要一并开源。
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## English overview
|
|
173
|
+
|
|
174
|
+
**NoDesign** is an agent workbench for independent creators. An infinite canvas serves as your workspace: describe what you want, and the agent builds websites, slide decks, images, video and Word documents as real files on disk, right on the canvas. You can edit text in place, circle a region and annotate, drag elements around, and draw relations between cards. The agent picks all of that up on its next turn.
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
npx @xiaobuyu/nodesign
|
|
178
|
+
```
|
|
130
179
|
|
|
131
|
-
|
|
132
|
-
开着的页面不断链。服务端改动记得重启进程,Node 不热重载。
|
|
180
|
+
Requires Node.js 20+ and at least one model provider: a Claude subscription (`npx @xiaobuyu/nodesign login`), an Anthropic API key, or any OpenAI-compatible endpoint (DeepSeek, OpenAI, OpenRouter, local Ollama, etc.). Runs on your machine with your own key. No subscription fee, no markup on model calls. Project files stay local; when using cloud models, task context is sent to the provider you configured. A hosted instance is available at [nodesign.xiaobuyu.trade](https://nodesign.xiaobuyu.trade) for trying it without installing.
|
|
133
181
|
|
|
134
|
-
|
|
135
|
-
回归)与 `web/scripts/shot-live.mjs`(登录真服务端截图加探针,查真问题用)。
|
|
182
|
+
What makes it different from a chat interface:
|
|
136
183
|
|
|
137
|
-
|
|
184
|
+
- **The canvas is a real workspace.** Every card is a file, every folder is a directory. Dragging a card into a folder actually moves the file on disk.
|
|
185
|
+
- **The agent is present.** It appears next to the card it's editing, and you can see code being written in real time.
|
|
186
|
+
- **Your actions feed back.** Direct text edits, region selections, element dragging, and relation lines ("reference", "annotate", "continue") all become context for the next turn.
|
|
187
|
+
- **The agent inspects its own work.** It captures screenshots at different viewport widths, reads computed styles, console errors, font loading status, and animation filmstrips, then continues editing based on what it finds.
|
|
188
|
+
- **Memory is visible.** Decisions, style notes, and preferences live in the workspace as editable content, and can be crystallized into reusable Skills.
|
|
138
189
|
|
|
139
|
-
|
|
140
|
-
连线范式、铅笔精灵、agent 摆位与归纳工具、根站治理。方向与记录见提交历史。
|
|
190
|
+
Personal project, started late April 2026, actively developed. Version 0.0.1 is the first public local release. 980 Vitest cases as the deploy gate. Production runs on Linux; tested on Windows; macOS code paths exist but are not yet verified on real hardware. Licensed AGPL-3.0.
|
package/bin/nodesign.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
package/server/api/README.md
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
# server/api/ — HTTP API 入口
|
|
2
|
-
|
|
3
|
-
Nodesign 对外的公网 / 内网 HTTP 接口层。
|
|
4
|
-
|
|
5
|
-
## 计划路由(待实现)
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
POST /engine/runs 启动一个 skill run
|
|
9
|
-
body: { skill, brief, style_reference?, tools?, options? }
|
|
10
|
-
→ 201 { run_id, status, stream_url }
|
|
11
|
-
|
|
12
|
-
GET /engine/runs/:id 查 run 状态
|
|
13
|
-
GET /engine/runs/:id/stream SSE 实时进度(text/thinking/tool_call/screenshot/done)
|
|
14
|
-
GET /engine/runs/:id/artifacts 列产物
|
|
15
|
-
GET /engine/runs/:id/artifacts/:filename 下载/打开(deck.html 直接可看)
|
|
16
|
-
POST /engine/runs/:id/cancel 取消
|
|
17
|
-
|
|
18
|
-
POST /style/extract 上传素材 → 提 style tokens
|
|
19
|
-
body: multipart (file) | { url }
|
|
20
|
-
→ { task_id }
|
|
21
|
-
GET /style/tasks/:id 提取结果
|
|
22
|
-
|
|
23
|
-
POST /edit/sessions 启动 edit 会话(绑定一个 deck)
|
|
24
|
-
POST /edit/sessions/:id/messages 发指令
|
|
25
|
-
GET /edit/sessions/:id/stream SSE
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 鉴权(待组长确认)
|
|
29
|
-
|
|
30
|
-
7 个待对齐问题里有"已有平台具体指什么" → 决定鉴权方式:
|
|
31
|
-
- 平台 SSO:复用平台的 token / cookie
|
|
32
|
-
- 自建:JWT + bcrypt
|
|
33
|
-
- 内部测试期:仅 `INTERNAL_API_TOKEN` Bearer
|
|
34
|
-
|
|
35
|
-
外部 API 必加:rate limit、CORS、CSRF(如有 cookie 鉴权)。
|
|
36
|
-
|
|
37
|
-
## 调用方
|
|
38
|
-
|
|
39
|
-
- **Web 前端**([Nodesign/web/](../../web/),待建)—— 主入口
|
|
40
|
-
- **小合**([dev/server/bot/](../../../dev/server/bot/))—— 内部 fn call,复用 `INTERNAL_API_TOKEN`
|
|
41
|
-
- **第三方 / CLI**(远期)
|
|
42
|
-
|
|
43
|
-
## 框架选择
|
|
44
|
-
|
|
45
|
-
Express 5(与 dev/ 一致,复用度高)。如果未来 SSE 量大可换 Fastify。
|
|
1
|
+
# server/api/ — HTTP API 入口
|
|
2
|
+
|
|
3
|
+
Nodesign 对外的公网 / 内网 HTTP 接口层。
|
|
4
|
+
|
|
5
|
+
## 计划路由(待实现)
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
POST /engine/runs 启动一个 skill run
|
|
9
|
+
body: { skill, brief, style_reference?, tools?, options? }
|
|
10
|
+
→ 201 { run_id, status, stream_url }
|
|
11
|
+
|
|
12
|
+
GET /engine/runs/:id 查 run 状态
|
|
13
|
+
GET /engine/runs/:id/stream SSE 实时进度(text/thinking/tool_call/screenshot/done)
|
|
14
|
+
GET /engine/runs/:id/artifacts 列产物
|
|
15
|
+
GET /engine/runs/:id/artifacts/:filename 下载/打开(deck.html 直接可看)
|
|
16
|
+
POST /engine/runs/:id/cancel 取消
|
|
17
|
+
|
|
18
|
+
POST /style/extract 上传素材 → 提 style tokens
|
|
19
|
+
body: multipart (file) | { url }
|
|
20
|
+
→ { task_id }
|
|
21
|
+
GET /style/tasks/:id 提取结果
|
|
22
|
+
|
|
23
|
+
POST /edit/sessions 启动 edit 会话(绑定一个 deck)
|
|
24
|
+
POST /edit/sessions/:id/messages 发指令
|
|
25
|
+
GET /edit/sessions/:id/stream SSE
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 鉴权(待组长确认)
|
|
29
|
+
|
|
30
|
+
7 个待对齐问题里有"已有平台具体指什么" → 决定鉴权方式:
|
|
31
|
+
- 平台 SSO:复用平台的 token / cookie
|
|
32
|
+
- 自建:JWT + bcrypt
|
|
33
|
+
- 内部测试期:仅 `INTERNAL_API_TOKEN` Bearer
|
|
34
|
+
|
|
35
|
+
外部 API 必加:rate limit、CORS、CSRF(如有 cookie 鉴权)。
|
|
36
|
+
|
|
37
|
+
## 调用方
|
|
38
|
+
|
|
39
|
+
- **Web 前端**([Nodesign/web/](../../web/),待建)—— 主入口
|
|
40
|
+
- **小合**([dev/server/bot/](../../../dev/server/bot/))—— 内部 fn call,复用 `INTERNAL_API_TOKEN`
|
|
41
|
+
- **第三方 / CLI**(远期)
|
|
42
|
+
|
|
43
|
+
## 框架选择
|
|
44
|
+
|
|
45
|
+
Express 5(与 dev/ 一致,复用度高)。如果未来 SSE 量大可换 Fastify。
|
package/server/api/_guard.js
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* server/api/_guard.js — 项目路由统一守卫(2026-07-30 多用户内测)
|
|
3
|
-
*
|
|
4
|
-
* 老范式是每个 handler 开头两行 `validateProjectId` + `getProject`(4 个文件
|
|
5
|
-
* 各有局部 guard()、其余 ~40 处内联)。多用户后归属校验必须只有一个实现,
|
|
6
|
-
* 全部收敛到这里。
|
|
7
|
-
*
|
|
8
|
-
* 语义:项目不存在、或存在但不属于当前用户(admin 例外)→ 一律 404,
|
|
9
|
-
* 不区分两种情况 —— 别让外人靠状态码枚举 pid 空间。
|
|
10
|
-
*
|
|
11
|
-
* req.user 由 auth/middleware.js authGuard 挂(登录墙关闭时是匿名 admin,
|
|
12
|
-
* 单机开发行为不变)。
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { validateProjectId, getProject } from '../projects/store.js';
|
|
16
|
-
import { getRun } from '../engine/runs/store.js';
|
|
17
|
-
import { getUserById } from '../auth/users-store.js';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* 模型资格按谁算:**项目 owner**(08-21 晚)。非 admin 只能进自己的项目(guardProject),
|
|
21
|
-
* 所以对他们 owner 就是自己;差别只在 admin 代看别人的项目 —— 那时选模型/默认模型/锁行
|
|
22
|
-
* 都得按 owner 的档位(auth/tier.js),否则 admin 选了订阅 Claude 行、session-loop 按 owner
|
|
23
|
-
* 断言 OAuth 资格时再打回 INIT_FAILED。owner 查不到时退回请求者(不放大权限:admin 本就全开)。
|
|
24
|
-
*/
|
|
25
|
-
export function modelUserFor(req, project) {
|
|
26
|
-
const ownerId = project?.ownerId;
|
|
27
|
-
if (!ownerId || ownerId === req.user?.id) return req.user;
|
|
28
|
-
return getUserById(ownerId) || req.user;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @returns {object|null} project;null 时响应已发出,caller 直接 return
|
|
33
|
-
*/
|
|
34
|
-
export function guardProject(req, res) {
|
|
35
|
-
try {
|
|
36
|
-
validateProjectId(req.params.pid);
|
|
37
|
-
} catch (err) {
|
|
38
|
-
res.status(400).json({ error: err.message || 'invalid projectId' });
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
const project = getProject(req.params.pid);
|
|
42
|
-
const user = req.user;
|
|
43
|
-
const allowed = project && (user?.role === 'admin' || (user && project.ownerId === user.id));
|
|
44
|
-
if (!allowed) {
|
|
45
|
-
res.status(404).json({ error: 'project not found' });
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
return project;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** 归属判断(不发响应)—— WS upgrade 等非 express 场景用 */
|
|
52
|
-
export function userOwnsProject(user, project) {
|
|
53
|
-
if (!project || !user) return false;
|
|
54
|
-
if (user.role === 'admin') return true;
|
|
55
|
-
// ⚠️ `project.ownerId === user.id` 在**两边都 undefined** 时是 true。今天不可达
|
|
56
|
-
// (每行都有 owner,bootstrapAuth 每次启动回填 NULL),但离"通配放行"只差一个
|
|
57
|
-
// 缺列或一个改了形状的调用方。归属判断上宁可写死。
|
|
58
|
-
return typeof user.id === 'string' && user.id !== ''
|
|
59
|
-
&& typeof project.ownerId === 'string' && project.ownerId === user.id;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* /:pid/runs/:runId/* 路由的第二道锁:runId 必须真属于这个 pid。
|
|
64
|
-
* cancel/rewind/answer 走的是全局内存 Map(key 只有 runId),没有这道校验
|
|
65
|
-
* 就是"拿自己的 pid + 别人的 runId"的跨租户控制通道。
|
|
66
|
-
* guardProject 通过之后调;不通过时已响应 404。
|
|
67
|
-
*/
|
|
68
|
-
export function guardRunInProject(req, res) {
|
|
69
|
-
const run = getRun(req.params.runId);
|
|
70
|
-
if (!run || run.projectId !== req.params.pid) {
|
|
71
|
-
res.status(404).json({ error: 'run not found' });
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
return run;
|
|
75
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* server/api/_guard.js — 项目路由统一守卫(2026-07-30 多用户内测)
|
|
3
|
+
*
|
|
4
|
+
* 老范式是每个 handler 开头两行 `validateProjectId` + `getProject`(4 个文件
|
|
5
|
+
* 各有局部 guard()、其余 ~40 处内联)。多用户后归属校验必须只有一个实现,
|
|
6
|
+
* 全部收敛到这里。
|
|
7
|
+
*
|
|
8
|
+
* 语义:项目不存在、或存在但不属于当前用户(admin 例外)→ 一律 404,
|
|
9
|
+
* 不区分两种情况 —— 别让外人靠状态码枚举 pid 空间。
|
|
10
|
+
*
|
|
11
|
+
* req.user 由 auth/middleware.js authGuard 挂(登录墙关闭时是匿名 admin,
|
|
12
|
+
* 单机开发行为不变)。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { validateProjectId, getProject } from '../projects/store.js';
|
|
16
|
+
import { getRun } from '../engine/runs/store.js';
|
|
17
|
+
import { getUserById } from '../auth/users-store.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 模型资格按谁算:**项目 owner**(08-21 晚)。非 admin 只能进自己的项目(guardProject),
|
|
21
|
+
* 所以对他们 owner 就是自己;差别只在 admin 代看别人的项目 —— 那时选模型/默认模型/锁行
|
|
22
|
+
* 都得按 owner 的档位(auth/tier.js),否则 admin 选了订阅 Claude 行、session-loop 按 owner
|
|
23
|
+
* 断言 OAuth 资格时再打回 INIT_FAILED。owner 查不到时退回请求者(不放大权限:admin 本就全开)。
|
|
24
|
+
*/
|
|
25
|
+
export function modelUserFor(req, project) {
|
|
26
|
+
const ownerId = project?.ownerId;
|
|
27
|
+
if (!ownerId || ownerId === req.user?.id) return req.user;
|
|
28
|
+
return getUserById(ownerId) || req.user;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @returns {object|null} project;null 时响应已发出,caller 直接 return
|
|
33
|
+
*/
|
|
34
|
+
export function guardProject(req, res) {
|
|
35
|
+
try {
|
|
36
|
+
validateProjectId(req.params.pid);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
res.status(400).json({ error: err.message || 'invalid projectId' });
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const project = getProject(req.params.pid);
|
|
42
|
+
const user = req.user;
|
|
43
|
+
const allowed = project && (user?.role === 'admin' || (user && project.ownerId === user.id));
|
|
44
|
+
if (!allowed) {
|
|
45
|
+
res.status(404).json({ error: 'project not found' });
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return project;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 归属判断(不发响应)—— WS upgrade 等非 express 场景用 */
|
|
52
|
+
export function userOwnsProject(user, project) {
|
|
53
|
+
if (!project || !user) return false;
|
|
54
|
+
if (user.role === 'admin') return true;
|
|
55
|
+
// ⚠️ `project.ownerId === user.id` 在**两边都 undefined** 时是 true。今天不可达
|
|
56
|
+
// (每行都有 owner,bootstrapAuth 每次启动回填 NULL),但离"通配放行"只差一个
|
|
57
|
+
// 缺列或一个改了形状的调用方。归属判断上宁可写死。
|
|
58
|
+
return typeof user.id === 'string' && user.id !== ''
|
|
59
|
+
&& typeof project.ownerId === 'string' && project.ownerId === user.id;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* /:pid/runs/:runId/* 路由的第二道锁:runId 必须真属于这个 pid。
|
|
64
|
+
* cancel/rewind/answer 走的是全局内存 Map(key 只有 runId),没有这道校验
|
|
65
|
+
* 就是"拿自己的 pid + 别人的 runId"的跨租户控制通道。
|
|
66
|
+
* guardProject 通过之后调;不通过时已响应 404。
|
|
67
|
+
*/
|
|
68
|
+
export function guardRunInProject(req, res) {
|
|
69
|
+
const run = getRun(req.params.runId);
|
|
70
|
+
if (!run || run.projectId !== req.params.pid) {
|
|
71
|
+
res.status(404).json({ error: 'run not found' });
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return run;
|
|
75
|
+
}
|