@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
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* server/engine/agent/session-model.js — 会话跑在哪个模型上,这里是唯一答案
|
|
3
|
-
*
|
|
4
|
-
* 在此之前这个事实有 5 个读法和 3 个写法,各不相同:
|
|
5
|
-
*
|
|
6
|
-
* 读:session-loop 内联一条 `cfg.model || env || 'kimi-k2.6'`(真正生效的那条);
|
|
7
|
-
* turn.js 又抄了一遍同样的链算 prevEffective;canvas.js 的 readSessionConfig
|
|
8
|
-
* 只读文件不带 env 兜底;sessions.js 问 `querySession.ctx?.appModel` —— 而
|
|
9
|
-
* activeQuerySessions 的 ctx 字段**从注册起就是 null,没有任何地方填过**,
|
|
10
|
-
* 那一支永远走不到;前端干脆只信自己的 localStorage。
|
|
11
|
-
* 写:turn.js 的 body.model(写文件 + 空闲时重启 query);canvas.js 的
|
|
12
|
-
* PATCH /config(任意字段透传,写了文件但不重启 query,跑着的会话不认账);
|
|
13
|
-
* POST /runs/:runId/model 调 SDK setModel(只改运行时,不落文件,下次 resume 变回去)。
|
|
14
|
-
*
|
|
15
|
-
* 同一个事实有五份算法,就一定会有对不上的时候 —— 比如按钮上写着 Sonnet、
|
|
16
|
-
* 会话实际跑 Opus,或者选了「默认」什么也没发生。
|
|
17
|
-
*
|
|
18
|
-
* 优先级(跟 session-loop 原来那条完全一致,只是搬到了一处):
|
|
19
|
-
* 调用方显式指定 > session-config.json 的 model > NODESIGN_MODEL > 兜底常量
|
|
20
|
-
*
|
|
21
|
-
* 「覆盖」(override) 指 session-config.json 里那一项。清掉它 = 回到全局默认,
|
|
22
|
-
* 这是「默认」那个选项该做的事 —— 以前它什么也不做。
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import path from 'path';
|
|
26
|
-
import { promises as fs } from 'fs';
|
|
27
|
-
import { getQuerySession, closeQuerySession } from '../runs/active-runs.js';
|
|
28
|
-
|
|
29
|
-
const CONFIG_NAME = 'session-config.json';
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* NODESIGN_MODEL 没配时的兜底。原值是 kimi 网关时代的 'kimi-k2.6',08-21 深夜 kimi 行从模型表删除后
|
|
33
|
-
* 改成订阅默认行(一个不在表里的名字会被 resolveModelRoute 当订阅模型,兜底必须是真名);
|
|
34
|
-
* 正常部署 .env 里一定有 NODESIGN_MODEL,走不到这里。
|
|
35
|
-
*/
|
|
36
|
-
const LEGACY_FALLBACK_MODEL = 'claude-sonnet-5[1m]';
|
|
37
|
-
|
|
38
|
-
/** 全局默认模型(不含会话覆盖)。每次现读 env —— 进程内改 env 也能生效 */
|
|
39
|
-
export function defaultModel() {
|
|
40
|
-
return process.env.NODESIGN_MODEL || LEGACY_FALLBACK_MODEL;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// ── config 文件的读改写串行化 ──
|
|
44
|
-
// turn.js(发消息时)和模型接口(用户点 picker 时)可能同时改同一个文件,
|
|
45
|
-
// 各自 read-modify-write 会互相吃掉对方的字段。按路径排队。
|
|
46
|
-
/** @type {Map<string, Promise<any>>} */
|
|
47
|
-
const configLocks = new Map();
|
|
48
|
-
|
|
49
|
-
function withConfigLock(sessionRoot, fn) {
|
|
50
|
-
const key = path.resolve(sessionRoot);
|
|
51
|
-
const prev = configLocks.get(key) || Promise.resolve();
|
|
52
|
-
const next = prev.then(fn, fn);
|
|
53
|
-
// 链上留的是"完成信号",不是结果,避免上一个的异常传染下一个
|
|
54
|
-
configLocks.set(key, next.then(() => {}, () => {}));
|
|
55
|
-
return next;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* ⚠️ 参数是**会话私档目录**(`<工作区>/.nd/<sid>/`),不是工作区根。
|
|
60
|
-
*
|
|
61
|
-
* 2026-08-07 扁平化之前两者是同一个目录(一个会话一个沙盒),所以这里叫
|
|
62
|
-
* `sessionRoot` 也没错。现在工作区是全项目共用的 —— 传工作区根进来的话,
|
|
63
|
-
* 一个项目里所有会话会共用一份 session-config.json,**在一条会话里换模型,
|
|
64
|
-
* 另一条会话跟着变**。调用方一律传 getSessionMetaDir(pid, sid)。
|
|
65
|
-
*/
|
|
66
|
-
function configPath(sessionMetaDir) {
|
|
67
|
-
// 传错了要当场炸,不能默默共用一份配置。这个错误的表现是"在一条会话里换了
|
|
68
|
-
// 模型,另一条会话也变了"——没人会把它跟一个路径参数联系起来,静默半年都可能。
|
|
69
|
-
if (!/[/\\]\.nd[/\\][0-9a-f-]{36}$/i.test(path.resolve(sessionMetaDir))) {
|
|
70
|
-
throw new Error(
|
|
71
|
-
`[session-model] 需要会话私档目录(<工作区>/.nd/<sid>/),拿到的是 ${sessionMetaDir}。`
|
|
72
|
-
+ '用 getSessionMetaDir(pid, sid),别传工作区根。',
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
return path.join(sessionMetaDir, CONFIG_NAME);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** 读整份 config(文件不存在 / 坏了 → {})。不带任何默认字段填充 */
|
|
79
|
-
export async function readSessionConfigFile(sessionRoot) {
|
|
80
|
-
try {
|
|
81
|
-
const raw = await fs.readFile(configPath(sessionRoot), 'utf8');
|
|
82
|
-
const cfg = JSON.parse(raw);
|
|
83
|
-
if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg)) return {};
|
|
84
|
-
return cfg;
|
|
85
|
-
} catch {
|
|
86
|
-
return {};
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** 会话自己的模型覆盖;没设过返回 null */
|
|
91
|
-
export async function readSessionModelOverride(sessionRoot) {
|
|
92
|
-
const cfg = await readSessionConfigFile(sessionRoot);
|
|
93
|
-
return typeof cfg.model === 'string' && cfg.model.trim() ? cfg.model.trim() : null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* 这个会话实际会跑的模型。
|
|
98
|
-
* @returns {Promise<{ model: string, override: string|null, fallback: string }>}
|
|
99
|
-
* override = 用户在这个会话里选过的;null 表示跟随全局默认
|
|
100
|
-
*/
|
|
101
|
-
export async function resolveSessionModel(sessionRoot) {
|
|
102
|
-
const override = await readSessionModelOverride(sessionRoot);
|
|
103
|
-
const fallback = defaultModel();
|
|
104
|
-
return { model: override || fallback, override, fallback };
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* 写 / 清会话的模型覆盖。
|
|
109
|
-
*
|
|
110
|
-
* @param {string} sessionRoot
|
|
111
|
-
* @param {string|null} model 字符串 = 设成它;null = **清掉覆盖**,回到全局默认
|
|
112
|
-
* @returns {Promise<{ model: string, override: string|null, changed: boolean, previous: string }>}
|
|
113
|
-
* changed 指"实际生效的模型变了没有" —— 调用方据此决定要不要重启空闲 query。
|
|
114
|
-
* 把覆盖设成跟全局默认一样的值不算变(跑着的会话本来就是那个模型)。
|
|
115
|
-
*/
|
|
116
|
-
export async function writeSessionModelOverride(sessionRoot, model) {
|
|
117
|
-
const wanted = typeof model === 'string' && model.trim() ? model.trim() : null;
|
|
118
|
-
return withConfigLock(sessionRoot, async () => {
|
|
119
|
-
const cfg = await readSessionConfigFile(sessionRoot);
|
|
120
|
-
const fallback = defaultModel();
|
|
121
|
-
const previous = (typeof cfg.model === 'string' && cfg.model.trim()) ? cfg.model.trim() : fallback;
|
|
122
|
-
const next = { ...cfg, updatedAt: new Date().toISOString() };
|
|
123
|
-
if (wanted) next.model = wanted;
|
|
124
|
-
else delete next.model; // 清覆盖 = 删字段,不是写 null
|
|
125
|
-
const effective = wanted || fallback;
|
|
126
|
-
if (previous !== effective || (cfg.model || null) !== wanted) {
|
|
127
|
-
await fs.writeFile(configPath(sessionRoot), JSON.stringify(next, null, 2), 'utf8');
|
|
128
|
-
}
|
|
129
|
-
return { model: effective, override: wanted, changed: previous !== effective, previous };
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* 改模型的**完整**动作:写配置 + 让已经跑着的会话认账。
|
|
135
|
-
*
|
|
136
|
-
* 这两步必须绑在一起。以前 PATCH /config 只写文件不碰 query,配置说 Opus、
|
|
137
|
-
* 跑着的进程还是 Sonnet,要等下次 resume 才对上,中间这段时间界面和事实分家。
|
|
138
|
-
*
|
|
139
|
-
* 空闲时才关 query:turn 正在跑就只落配置,等这一轮结束后自然重启(前端 picker
|
|
140
|
-
* 在运行中是禁用的,这里是兜底)。closeQuerySession 之后下一条消息走
|
|
141
|
-
* startNewRunSession,从同一份 jsonl 以新模型 resume —— 对话内容无损,上下文
|
|
142
|
-
* 窗口 / spoofing alias / thinking 配置全按新模型重算。
|
|
143
|
-
*
|
|
144
|
-
* @param {string} sessionId
|
|
145
|
-
* @param {string} sessionRoot
|
|
146
|
-
* @param {string|null} model null = 清掉覆盖
|
|
147
|
-
* @param {string} reason 日志用
|
|
148
|
-
*/
|
|
149
|
-
export async function applySessionModel(sessionId, sessionRoot, model, reason = 'api') {
|
|
150
|
-
const result = await writeSessionModelOverride(sessionRoot, model);
|
|
151
|
-
let restarted = false;
|
|
152
|
-
if (result.changed) {
|
|
153
|
-
const qs = getQuerySession(sessionId);
|
|
154
|
-
if (qs && !qs.currentRunId) {
|
|
155
|
-
closeQuerySession(sessionId, 'model_change');
|
|
156
|
-
restarted = true;
|
|
157
|
-
}
|
|
158
|
-
console.info(
|
|
159
|
-
`[session-model] sid=${sessionId.slice(0, 8)} ${result.previous} → ${result.model}`
|
|
160
|
-
+ ` (${reason}${restarted ? ', query restarted' : ', applies on next resume'})`,
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
return { ...result, restarted };
|
|
164
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* server/engine/agent/session-model.js — 会话跑在哪个模型上,这里是唯一答案
|
|
3
|
+
*
|
|
4
|
+
* 在此之前这个事实有 5 个读法和 3 个写法,各不相同:
|
|
5
|
+
*
|
|
6
|
+
* 读:session-loop 内联一条 `cfg.model || env || 'kimi-k2.6'`(真正生效的那条);
|
|
7
|
+
* turn.js 又抄了一遍同样的链算 prevEffective;canvas.js 的 readSessionConfig
|
|
8
|
+
* 只读文件不带 env 兜底;sessions.js 问 `querySession.ctx?.appModel` —— 而
|
|
9
|
+
* activeQuerySessions 的 ctx 字段**从注册起就是 null,没有任何地方填过**,
|
|
10
|
+
* 那一支永远走不到;前端干脆只信自己的 localStorage。
|
|
11
|
+
* 写:turn.js 的 body.model(写文件 + 空闲时重启 query);canvas.js 的
|
|
12
|
+
* PATCH /config(任意字段透传,写了文件但不重启 query,跑着的会话不认账);
|
|
13
|
+
* POST /runs/:runId/model 调 SDK setModel(只改运行时,不落文件,下次 resume 变回去)。
|
|
14
|
+
*
|
|
15
|
+
* 同一个事实有五份算法,就一定会有对不上的时候 —— 比如按钮上写着 Sonnet、
|
|
16
|
+
* 会话实际跑 Opus,或者选了「默认」什么也没发生。
|
|
17
|
+
*
|
|
18
|
+
* 优先级(跟 session-loop 原来那条完全一致,只是搬到了一处):
|
|
19
|
+
* 调用方显式指定 > session-config.json 的 model > NODESIGN_MODEL > 兜底常量
|
|
20
|
+
*
|
|
21
|
+
* 「覆盖」(override) 指 session-config.json 里那一项。清掉它 = 回到全局默认,
|
|
22
|
+
* 这是「默认」那个选项该做的事 —— 以前它什么也不做。
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import path from 'path';
|
|
26
|
+
import { promises as fs } from 'fs';
|
|
27
|
+
import { getQuerySession, closeQuerySession } from '../runs/active-runs.js';
|
|
28
|
+
|
|
29
|
+
const CONFIG_NAME = 'session-config.json';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* NODESIGN_MODEL 没配时的兜底。原值是 kimi 网关时代的 'kimi-k2.6',08-21 深夜 kimi 行从模型表删除后
|
|
33
|
+
* 改成订阅默认行(一个不在表里的名字会被 resolveModelRoute 当订阅模型,兜底必须是真名);
|
|
34
|
+
* 正常部署 .env 里一定有 NODESIGN_MODEL,走不到这里。
|
|
35
|
+
*/
|
|
36
|
+
const LEGACY_FALLBACK_MODEL = 'claude-sonnet-5[1m]';
|
|
37
|
+
|
|
38
|
+
/** 全局默认模型(不含会话覆盖)。每次现读 env —— 进程内改 env 也能生效 */
|
|
39
|
+
export function defaultModel() {
|
|
40
|
+
return process.env.NODESIGN_MODEL || LEGACY_FALLBACK_MODEL;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ── config 文件的读改写串行化 ──
|
|
44
|
+
// turn.js(发消息时)和模型接口(用户点 picker 时)可能同时改同一个文件,
|
|
45
|
+
// 各自 read-modify-write 会互相吃掉对方的字段。按路径排队。
|
|
46
|
+
/** @type {Map<string, Promise<any>>} */
|
|
47
|
+
const configLocks = new Map();
|
|
48
|
+
|
|
49
|
+
function withConfigLock(sessionRoot, fn) {
|
|
50
|
+
const key = path.resolve(sessionRoot);
|
|
51
|
+
const prev = configLocks.get(key) || Promise.resolve();
|
|
52
|
+
const next = prev.then(fn, fn);
|
|
53
|
+
// 链上留的是"完成信号",不是结果,避免上一个的异常传染下一个
|
|
54
|
+
configLocks.set(key, next.then(() => {}, () => {}));
|
|
55
|
+
return next;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* ⚠️ 参数是**会话私档目录**(`<工作区>/.nd/<sid>/`),不是工作区根。
|
|
60
|
+
*
|
|
61
|
+
* 2026-08-07 扁平化之前两者是同一个目录(一个会话一个沙盒),所以这里叫
|
|
62
|
+
* `sessionRoot` 也没错。现在工作区是全项目共用的 —— 传工作区根进来的话,
|
|
63
|
+
* 一个项目里所有会话会共用一份 session-config.json,**在一条会话里换模型,
|
|
64
|
+
* 另一条会话跟着变**。调用方一律传 getSessionMetaDir(pid, sid)。
|
|
65
|
+
*/
|
|
66
|
+
function configPath(sessionMetaDir) {
|
|
67
|
+
// 传错了要当场炸,不能默默共用一份配置。这个错误的表现是"在一条会话里换了
|
|
68
|
+
// 模型,另一条会话也变了"——没人会把它跟一个路径参数联系起来,静默半年都可能。
|
|
69
|
+
if (!/[/\\]\.nd[/\\][0-9a-f-]{36}$/i.test(path.resolve(sessionMetaDir))) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`[session-model] 需要会话私档目录(<工作区>/.nd/<sid>/),拿到的是 ${sessionMetaDir}。`
|
|
72
|
+
+ '用 getSessionMetaDir(pid, sid),别传工作区根。',
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return path.join(sessionMetaDir, CONFIG_NAME);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** 读整份 config(文件不存在 / 坏了 → {})。不带任何默认字段填充 */
|
|
79
|
+
export async function readSessionConfigFile(sessionRoot) {
|
|
80
|
+
try {
|
|
81
|
+
const raw = await fs.readFile(configPath(sessionRoot), 'utf8');
|
|
82
|
+
const cfg = JSON.parse(raw);
|
|
83
|
+
if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg)) return {};
|
|
84
|
+
return cfg;
|
|
85
|
+
} catch {
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** 会话自己的模型覆盖;没设过返回 null */
|
|
91
|
+
export async function readSessionModelOverride(sessionRoot) {
|
|
92
|
+
const cfg = await readSessionConfigFile(sessionRoot);
|
|
93
|
+
return typeof cfg.model === 'string' && cfg.model.trim() ? cfg.model.trim() : null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 这个会话实际会跑的模型。
|
|
98
|
+
* @returns {Promise<{ model: string, override: string|null, fallback: string }>}
|
|
99
|
+
* override = 用户在这个会话里选过的;null 表示跟随全局默认
|
|
100
|
+
*/
|
|
101
|
+
export async function resolveSessionModel(sessionRoot) {
|
|
102
|
+
const override = await readSessionModelOverride(sessionRoot);
|
|
103
|
+
const fallback = defaultModel();
|
|
104
|
+
return { model: override || fallback, override, fallback };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 写 / 清会话的模型覆盖。
|
|
109
|
+
*
|
|
110
|
+
* @param {string} sessionRoot
|
|
111
|
+
* @param {string|null} model 字符串 = 设成它;null = **清掉覆盖**,回到全局默认
|
|
112
|
+
* @returns {Promise<{ model: string, override: string|null, changed: boolean, previous: string }>}
|
|
113
|
+
* changed 指"实际生效的模型变了没有" —— 调用方据此决定要不要重启空闲 query。
|
|
114
|
+
* 把覆盖设成跟全局默认一样的值不算变(跑着的会话本来就是那个模型)。
|
|
115
|
+
*/
|
|
116
|
+
export async function writeSessionModelOverride(sessionRoot, model) {
|
|
117
|
+
const wanted = typeof model === 'string' && model.trim() ? model.trim() : null;
|
|
118
|
+
return withConfigLock(sessionRoot, async () => {
|
|
119
|
+
const cfg = await readSessionConfigFile(sessionRoot);
|
|
120
|
+
const fallback = defaultModel();
|
|
121
|
+
const previous = (typeof cfg.model === 'string' && cfg.model.trim()) ? cfg.model.trim() : fallback;
|
|
122
|
+
const next = { ...cfg, updatedAt: new Date().toISOString() };
|
|
123
|
+
if (wanted) next.model = wanted;
|
|
124
|
+
else delete next.model; // 清覆盖 = 删字段,不是写 null
|
|
125
|
+
const effective = wanted || fallback;
|
|
126
|
+
if (previous !== effective || (cfg.model || null) !== wanted) {
|
|
127
|
+
await fs.writeFile(configPath(sessionRoot), JSON.stringify(next, null, 2), 'utf8');
|
|
128
|
+
}
|
|
129
|
+
return { model: effective, override: wanted, changed: previous !== effective, previous };
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* 改模型的**完整**动作:写配置 + 让已经跑着的会话认账。
|
|
135
|
+
*
|
|
136
|
+
* 这两步必须绑在一起。以前 PATCH /config 只写文件不碰 query,配置说 Opus、
|
|
137
|
+
* 跑着的进程还是 Sonnet,要等下次 resume 才对上,中间这段时间界面和事实分家。
|
|
138
|
+
*
|
|
139
|
+
* 空闲时才关 query:turn 正在跑就只落配置,等这一轮结束后自然重启(前端 picker
|
|
140
|
+
* 在运行中是禁用的,这里是兜底)。closeQuerySession 之后下一条消息走
|
|
141
|
+
* startNewRunSession,从同一份 jsonl 以新模型 resume —— 对话内容无损,上下文
|
|
142
|
+
* 窗口 / spoofing alias / thinking 配置全按新模型重算。
|
|
143
|
+
*
|
|
144
|
+
* @param {string} sessionId
|
|
145
|
+
* @param {string} sessionRoot
|
|
146
|
+
* @param {string|null} model null = 清掉覆盖
|
|
147
|
+
* @param {string} reason 日志用
|
|
148
|
+
*/
|
|
149
|
+
export async function applySessionModel(sessionId, sessionRoot, model, reason = 'api') {
|
|
150
|
+
const result = await writeSessionModelOverride(sessionRoot, model);
|
|
151
|
+
let restarted = false;
|
|
152
|
+
if (result.changed) {
|
|
153
|
+
const qs = getQuerySession(sessionId);
|
|
154
|
+
if (qs && !qs.currentRunId) {
|
|
155
|
+
closeQuerySession(sessionId, 'model_change');
|
|
156
|
+
restarted = true;
|
|
157
|
+
}
|
|
158
|
+
console.info(
|
|
159
|
+
`[session-model] sid=${sessionId.slice(0, 8)} ${result.previous} → ${result.model}`
|
|
160
|
+
+ ` (${reason}${restarted ? ', query restarted' : ', applies on next resume'})`,
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
return { ...result, restarted };
|
|
164
|
+
}
|