Repository navigation
Releases: NINKCH/dsh-infinite_canvas
Release list
v0.19.20 — strict project isolation, asset naming, genre cards v3
Highlights
- Strict project isolation in the assets panel. General-project assets no longer bleed into every project's view — scope filters strictly, with "General project" and "All" as the explicit ways to see shared material. The search box (embedded magnifier) and the project selector now share one row (search ≈2/3, selector ≈1/3), and text assets (scripts/storyboards) get the same project dropdown as media cards.
- Canvas nodes take the asset's name. No more 图片1/视频2/文本1 — both single-add and batch add name nodes after the asset. The redundant "image" asset category is removed (character/prop/scene already are images; everything else lands in General, with legacy image-tagged assets normalized at read time).
- Unified import handles text. One Import button routes by file type: images/videos as before, plus
.txt/.mdfiles imported as script text assets (named from the file name) — a hundred-chapter novel imports in one pass, then batch-places onto the canvas as storyboard sources. - Genre cards v3: option-menu mechanism libraries, no mandated story direction. All 37 genre cards rebuilt so story mechanics (conflict, character, payoff-hook, pacing) are OPTION menus — 3+ selectable directions per library, combinable, adaptable, skippable. The script-slice head now states the doctrine (entries are combinable parts; events and direction belong to the script) and material precedence (existing novel/script text and the bible outrank the genre library; style and camera always apply). New Shanhai Myth genre card ships 异兽图志/法术能力/神器地理 material libraries (consumed by asset sheets only, never by script/storyboard) and a seven-family FX lexicon. A regression gate bans the old single-direction template sections and phrases across all cards.
Full changelog: v0.19.19...v0.19.20
v0.19.19 — Sanbao image tasks, FX storyboard contract, tail-frame fix
Highlights
- Sanbao image tasks are now async and queryable. Image requests against sanbaobeauty.com auto-route to
POST /openapi/v1/images(task id persisted on the node, poll, then download with the transient-retry window). The OpenAI-compatible sync endpoint used to 504 at the proxy with no task id, losing both the image and the fee. Local reference images upload via/openapi/v1/uploads/rawwith the extended-paramuploadKey; also available explicitly as the "Sanbao image task" mode. Generic OpenAI-compatible image submits gain one transient retry on 502/503/504/429/408. - FX-driven storyboard contract (
fx_motion). Fantasy genres and looks now unlock a dedicated shot contract: motion may be carried by an effect while the body stays still, picture-state beats replace the mandatory body beats for FX shots, a fantasy VFX lexicon, per-character FX signatures quoted verbatim, the speed iron law (instant events are state differences across cuts, never animated inside a shot), and a keyframe-first tip. Flags ship on fantasy / xianxia-cultivation / wuxia / smalltown-uncanny genres, four fantasy looks, and the new Shanhai Myth genre card (seven-family FX lexicon). Realist projects are untouched. state_jumpshots and a real capacity check. Same-framing state jumps (lantern-flash reveal, a shadow already there) are now a legal cut with dedicated prompt language and precise negatives. The storyboard capacity warning judges the real shot count (100) instead of script length, which misfired on every detailed scene.- One tail frame per video. Two uncoordinated pipelines could each save a "last frame" asset for the same video, so one generation produced three tail assets. The generation path now owns extraction (tailPending lock), stores exactly one frame (best pick or last), and both chain ports point at it.
Full changelog: v0.19.18...v0.19.19
v0.19.18 — Sanbao download retry, asset self-heal, assets toolbar
Highlights
- Sanbao downloads now retry while the CDN cache warms. A
succeededtask only means transcoding finished; the first GET can return HTTP 502 for 2-3 minutes (worst case about 5) while the file propagates. Downloads now retry inside a 10-minute window at 10s intervals, refreshing the signed URL from the task status before each attempt. 401/400 still fail immediately, and a window timeout reports the task id so the result can be recovered. - Asset previews survive refresh and host sync again. History cleanup can no longer erase
assetId(store guard plus non-destructive pruning), orphaned nodes are relinked on every startup (2s primary plus 10s fallback, with[IC] asset-relinkdiagnostics), and host sync no longer overwrites repaired pointers with null. - Assets page: one toolbar row and a jump-to-page pager. Sync-all, import, select-page, batch add/delete/clear and pagination now share the row below the project selector. Buttons are outline-only (transparent background, 1px border, red outline for delete). Pagination uses a page input with Enter/blur jump, invalid text is ignored, out-of-range values are clamped, and the total count sits on the right.
- Assets multi-select with batch add-to-canvas and batch delete. Batch add places nodes right of the rightmost node via
layoutBatchColumns(up to 5 per column, zero overlap) and skips audio with a count note; batch delete reuses the per-asset deletion path behind one confirmation.
Full changelog: v0.19.17...v0.19.18
v0.19.17 — Sanbao adapter, injection division, update source probe
Highlights
- Sanbao (涓夊疂褰卞儚宸ュ潑) video vendor adapter. Task-based multi-reference generation (
POST /openapi/v1/videos,reference: "all"), reference images as string data-URLs (accepted by every model, live-verified), reference audio asaudios: [{tag, url}], lowercaseresolution(480p/720p/1080p/2k). If the relay rejects local media format, the runner uploads blobs once via/openapi/v1/uploads/rawwith a dedicateduploadKey(extended params) and retries with the returned URLs 鈥?credits/auth/rate-limit errors never trigger the retry. - Injection division of labor. The director's camera language, lens grammar and fine tone are digested at the storyboard layer into per-shot fields; video requests now carry a 鈮?.6KB master style lock (aesthetic phrase + delivery pacing + 鈮? negatives) instead of the former 17KB skill-pack dump, keeping shot facts at ~82% of the prompt. The bible gains a one-sentence
styleAnchor; requests carry the anchor while the fullstyletext keeps feeding the script/storyboard LLMs 鈥?no truncation, refined at authoring time. - Update source auto-detection with China mirror fallback. Update check/install probe
registry.npmjs.organdregistry.npmmirror.comconcurrently (3s), prefer official when reachable, fall back to the China mirror for mainland direct connections, cache the choice for 24h, allow manual override (鑷姩妫€娴?/ npm 瀹樻柟婧?/ 涓浗澶ч檰闀滃儚婧? in the update banner, and try the other source once if the selected one fails. - Selected nodes light up their connected edges. All incoming/outgoing edges of selected nodes render in bright green with a double drop-shadow outer glow.
- Fixed "Expand to scenes" losing the last scene's body. The trailing-list stripper matched the first in-scene
浜虹墿锛歚 line and swallowed the rest; it now only removes a pure trailing list block, so per-scene浜虹墿锛歚 lines stay in the body. - Fixed the image style lock silently dropped since 0.19.14.
buildImageLockTextreferenced an undefinedEOL, and the swallowed ReferenceError meant profile-configured projects never received the image lock at all. Also: Sanbao caps reference audio at 3 (matching its warning), and scene-header markdown requires鍦篳 so ordinary numeric headings (## 2024骞村害鎬荤粨`) no longer produce ghost scenes.
Full changelog: v0.19.16...v0.19.17
v0.19.16 — Wan DashScope-compatible relay response compat
Highlights
- Wan (DashScope) video runner now tolerates relay-rewritten response shapes. DashScope-compatible relays (tiantoken-style) relocate
task_id, task status, and the result URL to different positions and casings, which previously caused either an immediate "no task_id" error or a silent 2-hour polling hang. task_idis read fromoutput.task_id,task_id,data.task_id,output.id, orid, in that order.- Task status is normalized before comparison. The status is read from
output.task_status,output.status,task_status, orstatusand lowercased, so official uppercase (SUCCEEDED), relay lowercase (succeeded), and top-level shapes all resolve.unknown/pending/runningand any unrecognized value keep polling 鈥?no false kills. - Failures surface real causes. Terminal failures report
output.code + output.messagewith top-levelmessageas fallback, and terminal status values (failed,expired,rejected,timeout, 鈥? stop polling immediately instead of spinning for 2 hours. - Result URL fallbacks. Besides
output.video_url, the runner now acceptsoutput.urlanddata.result_url. - No new vendor adapter. Response parsing was extracted into pure helpers (
wanTaskIdOf/wanStatusOf/wanPollState) with 27 new regression assertions; every DashScope-compatible relay benefits.
Full changelog: v0.19.15...v0.19.16
v0.19.15 — Generic relay image field fallback
Highlights
- Generic relay fallback for image reference fields. OpenAI-compatible video relays that reject object-style image payloads can now recover without a vendor-specific adapter. When the upstream error explicitly says its image proxy needs an http(s) URL, the client retries once with
input_referencefor a lone first frame or withimagesstring data-URLs for reference images. Auth, rate-limit and content-safety errors never trigger the retry. - The first request shape is unchanged. Existing JUAI / RelayRouter / Seedance-compatible routes keep their original payloads; the compatibility retry only runs for the documented image-proxy URL-shape failure.
- Uppercase resolution is preserved on the fallback request. Values stay in
480P / 720P / 1080Pform instead of being lowercased. - Reference audio is preserved when present. In that case the fallback switches to
media[]withreference_imageandreference_audioentries so audio does not get silently dropped.
Full changelog: v0.19.14...v0.19.15
v0.19.14 — 建点布局代码级强控制 + moyu 图片载荷裸 base64
Added
- Bare-base64 image payloads for URL-only relays (
moyuImagePayload), enabling relays whose image proxy validates raw base64 alongside http(s) URLs.
Fixed
-
moyu image payloads strip the
data:prefix. 0.19.13 sentinput_reference/images[]as dataURLs (data:image/jpeg;base64,…), but the relay's internal image proxy validates against http(s) URLs or bare base64 — thedata:prefix fails that check and the gateway replies 需要http(s)接口url with a 502. AmoyuImagePayload()helper strips the prefix, so both fields now carry bare base64 (the shape the vendor's support confirmed). -
Canvas node placement is now enforced by code, not by caller discipline.
addNodeAtused to take whatever coordinates the caller passed — toolbar shortcuts spawn atworldCenter ± fixed offset, the double-click add menu adds±30px random, reference-image quick-create uses±400— so building two image nodes in a row from the toolbar put them at overlapping positions.addNodeAtnow runs every spawn throughnextNodePosClient(the client twin of the Host'snextNodePos): same-type nodes align to their type column (min x, y = column tail + 40), a first-of-type starts a new column at the caller position, and any candidate box intersecting an existing node (28px min gap) is pushed below it — up to 80 rounds. The caller's position is only used to start a new column. Regressiontest-addnode-column.mjsseeds a graph and asserts column alignment, collision resolution and a zero-overlap sweep; exposed via__DSH_IC_LAYOUT__.
Changed
- Vendor-format dropdown is the single source of routing truth. Model-name routing (11 regexes) removed —
wan3.0-videoon a relay no longer gets rebuilt as a DashScope request; legacy providers getvendorbackfilled from URL traits. (Detailed in 0.19.13 below; listed here because the fix commits ride on top of it.)
v0.19.13 — 厂商格式为唯一路由权威 + moyu 图片字段兼容
Fixed
wan3.0-videoon relay gateways no longer gets routed into the DashScope protocol. The vendor auto-detect used to guess from the model name —wan3.0-videomatched the wan regex and the request was built as{input:{prompt, media[]}, parameters{}}withX-DashScope-Async, which a relay like moyu.info cannot parse; its internal image proxy then replied 需要http(s)接口url and the whole generation 502'd three times (main + both fallbacks). The vendor format dropdown is now the single source of routing truth: all eleven model-name guesses are removed. Routing order: explicitvendor(set in the dropdown) → URL traits (dashscope/klingai/…, also explicit config) → openai fallback. Legacy providers whosevendorfield is empty get it backfilled once from URL traits at settings render.- Image fields for URL-only relays are now shaped per vendor. The openai video branch detects
moyu.infoand switches to its documented shapes: first frame →input_reference(dataURL), reference images →images: ["dataURL", …](plain string array, base64 accepted per vendor support),resolutionin uppercase enum (1080P),durationclamped to [2,30], andgenerate_audio/output_formatare not sent (unknown parameters there). JUAI-style gateways keep the existing[{url, role}]array — behavior unchanged outside the moyu flavor. - Async polling covers the moyu response shape.
extractVideoUrlnow readsdata.result_url;taskFailureOfreadsdata.fail_reason;data.statusSUCCESS/FAILURE map through the existing lowercase normalizer. - Regression:
test-vendor-detect.mjsrewritten for the new routing contract (explicit vendor wins, model name never routes, moyu defaults to openai); newtest-video-image-url.mjslocks the image-field shapes and the JUAI structure. Gate 81 → 82 items, all green.
v0.19.12 — 导演动作/骨架兼容修复 + 图片字段 400 自愈
Fixed
-
Custom director actions now survive save/apply and playback. User actions retain
poseKeys, action clips and loop metadata; applying an action restores those fields, pose loops actually wrap during playback, and the skinning cache invalidates when pose keys or clips change. -
Cross-rig action clips no longer deform the mannequin. Action clips tagged with their source rig are only mounted on a matching skeleton; the awplanet-explorer walk/run set can no longer be applied to
xbot, where its local joint axes produced full-body twisting. -
The
双手抱头pose now puts the hands beside the head. The old fixed Euler recipe left both hands near the hips; directional arm/forearm constraints now raise the elbows and bring the hands to head height. -
Image generation recovers from unsupported-field 400s. When a strict vendor rejects a field such as
watermark, the adapter removes that field and retries once instead of failing the whole generation.
v0.19.11 — Video skill lock hardening and scroll interaction fixes
Highlights
- Video style-lock hardening. The video path now injects only the director, genre, spec and look slices needed for prompt generation, globally de-duplicates cross-layer negatives, and caps the merged negative block at 2,400 UTF-8 bytes. Handwritten vendor-structured prompts containing
subject_definitionsare treated as a direct path: they keep their structure and receive only series-bible entity text, without style-lock or continuity pollution. - Wheel scrolling works over text and script nodes. Scrollable text/script previews, shot lists and dropdown lists now receive native wheel scrolling; short previews and empty canvas continue to support wheel zoom.
- Dropdown scrollbars are visible and easier to hit. Dropdowns, text/script previews and shot lists share a themed 12px scrollbar with a 32px minimum thumb and a hover state.
- No more hidden resize zones under open dropdowns. Node resize handles are suspended while a dropdown is open, then restored on close.
- Regression coverage expanded. Gates now cover the real video lock output, reverse slicing assertions, negative de-duplication/budget behaviour, empty-profile short-circuiting, handwritten structured-prompt exemptions, wheel routing, scrollbar visibility and resize-handle suspension.
Full changelog: v0.19.10...v0.19.11