Skip to content

Releases: NINKCH/dsh-infinite_canvas

v0.19.20 — strict project isolation, asset naming, genre cards v3

Choose a tag to compare

@NINKCH NINKCH released this 01 Nov 17:32

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/.md files 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

Choose a tag to compare

@NINKCH NINKCH released this 01 Nov 13:31

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/raw with the extended-param uploadKey; 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_jump shots 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

Choose a tag to compare

@NINKCH NINKCH released this 01 Nov 07:47

Highlights

  • Sanbao downloads now retry while the CDN cache warms. A succeeded task 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-relink diagnostics), 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

Choose a tag to compare

@NINKCH NINKCH released this 01 Nov 02:49

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 as audios: [{tag, url}], lowercase resolution (480p/720p/1080p/2k). If the relay rejects local media format, the runner uploads blobs once via /openapi/v1/uploads/raw with a dedicated uploadKey (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 full style text 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.org and registry.npmmirror.com concurrently (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. buildImageLockText referenced an undefined EOL, 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

Choose a tag to compare

@NINKCH NINKCH released this 30 Oct 11:43

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_id is read from output.task_id, task_id, data.task_id, output.id, or id, in that order.
  • Task status is normalized before comparison. The status is read from output.task_status, output.status, task_status, or status and lowercased, so official uppercase (SUCCEEDED), relay lowercase (succeeded), and top-level shapes all resolve. unknown / pending / running and any unrecognized value keep polling 鈥?no false kills.
  • Failures surface real causes. Terminal failures report output.code + output.message with top-level message as 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 accepts output.url and data.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

Choose a tag to compare

@NINKCH NINKCH released this 30 Oct 09:09

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_reference for a lone first frame or with images string 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 / 1080P form instead of being lowercased.
  • Reference audio is preserved when present. In that case the fallback switches to media[] with reference_image and reference_audio entries so audio does not get silently dropped.

Full changelog: v0.19.14...v0.19.15

v0.19.14 — 建点布局代码级强控制 + moyu 图片载荷裸 base64

Choose a tag to compare

@NINKCH NINKCH released this 30 Oct 07:20

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 sent input_reference / images[] as dataURLs (data:image/jpeg;base64,…), but the relay's internal image proxy validates against http(s) URLs or bare base64 — the data: prefix fails that check and the gateway replies 需要http(s)接口url with a 502. A moyuImagePayload() 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. addNodeAt used to take whatever coordinates the caller passed — toolbar shortcuts spawn at worldCenter ± 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. addNodeAt now runs every spawn through nextNodePosClient (the client twin of the Host's nextNodePos): 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. Regression test-addnode-column.mjs seeds 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-video on a relay no longer gets rebuilt as a DashScope request; legacy providers get vendor backfilled from URL traits. (Detailed in 0.19.13 below; listed here because the fix commits ride on top of it.)

v0.19.13 — 厂商格式为唯一路由权威 + moyu 图片字段兼容

Choose a tag to compare

@NINKCH NINKCH released this 30 Oct 02:59

Fixed

  • wan3.0-video on relay gateways no longer gets routed into the DashScope protocol. The vendor auto-detect used to guess from the model name — wan3.0-video matched the wan regex and the request was built as {input:{prompt, media[]}, parameters{}} with X-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: explicit vendor (set in the dropdown) → URL traits (dashscope/klingai/…, also explicit config) → openai fallback. Legacy providers whose vendor field 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.info and switches to its documented shapes: first frame → input_reference (dataURL), reference images → images: ["dataURL", …] (plain string array, base64 accepted per vendor support), resolution in uppercase enum (1080P), duration clamped to [2,30], and generate_audio/output_format are 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. extractVideoUrl now reads data.result_url; taskFailureOf reads data.fail_reason; data.status SUCCESS/FAILURE map through the existing lowercase normalizer.
  • Regression: test-vendor-detect.mjs rewritten for the new routing contract (explicit vendor wins, model name never routes, moyu defaults to openai); new test-video-image-url.mjs locks the image-field shapes and the JUAI structure. Gate 81 → 82 items, all green.

v0.19.12 — 导演动作/骨架兼容修复 + 图片字段 400 自愈

Choose a tag to compare

@NINKCH NINKCH released this 29 Oct 10:01

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

Choose a tag to compare

@NINKCH NINKCH released this 28 Oct 10:05

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_definitions are 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