Commit graph

2270 commits

Author SHA1 Message Date
Kayshen-X d5131c99e7 fix(orchestrator): center resolved radial content 2026-07-15 23:49:58 +08:00
Kayshen-X 77a984948e fix(desktop): order chat tool events deterministically 2026-07-15 23:49:32 +08:00
Kayshen-X 52260c3155 fix(ci): retry ARM apt prerequisites 2026-07-15 23:22:22 +08:00
Kayshen-X d978a63d63 test(services): make settings temp paths portable 2026-07-15 23:13:08 +08:00
Kayshen-X c355719fd5 fix(ci): clear Rust workflow blockers 2026-07-15 22:47:39 +08:00
Kayshen-X ab1218eab0 fix(web): restore CanvasKit test coverage 2026-07-15 22:47:28 +08:00
Kayshen-X a37d9a8d3d fix(orchestrator): stabilize radial repair checks 2026-07-15 22:47:18 +08:00
Kayshen-X 0635927c42 fix(ci): install ripgrep for version guard 2026-07-15 22:47:01 +08:00
Kayshen-X 6721a02837 chore: update Jian submodule 2026-07-15 21:17:21 +08:00
Kayshen-X f82f4e4ea3 fix: enforce centralized version inputs 2026-07-15 21:17:21 +08:00
Kayshen-X e28506d0af fix: cover all version guard inputs 2026-07-15 21:17:21 +08:00
Kayshen-X 4f572730b9 fix: complete version synchronization guidance 2026-07-15 21:17:21 +08:00
Kayshen-X e5b7425f3a build: add version synchronization gate 2026-07-15 21:17:21 +08:00
Kayshen-X 68579c4c86 fix(release): detect punctuated version examples 2026-07-15 21:17:21 +08:00
Kayshen-X 84993cadc9 fix(release): gate publishing on Cargo version 2026-07-15 21:17:21 +08:00
Kayshen-X 567453bfc5 fix: reject commented version derivation checks 2026-07-15 21:17:21 +08:00
Kayshen-X d3fc4fed6d build: derive package versions from Cargo 2026-07-15 21:17:21 +08:00
Kayshen-X 983b2a3573 refactor(sdk): use TypeScript AST for version sync 2026-07-15 21:17:21 +08:00
Kayshen-X 4988343a4b fix(sdk): ignore escaped comment markers 2026-07-15 21:17:21 +08:00
Kayshen-X 78d9f5406e docs: update localized version sync commands 2026-07-15 21:17:21 +08:00
Kayshen-X 427e2b8263 fix(sdk): harden version synchronization 2026-07-15 21:17:21 +08:00
Kayshen-X bb905db75c fix(sdk): parse JSONC comments in version sync 2026-07-15 21:17:21 +08:00
Kayshen-X 1f789095a9 build(sdk): sync package versions from Cargo 2026-07-15 21:17:21 +08:00
Kayshen-X 7c8e2abfa7 test(cli): enforce complete bundle templating 2026-07-15 21:17:21 +08:00
Kayshen-X 83063bc279 refactor(cli): render bundled skill version from Cargo 2026-07-15 21:17:21 +08:00
Kayshen-X ec3dbf964d test: handle fixture version collision 2026-07-15 21:17:21 +08:00
Kayshen-X 5b0d1edb4c test: decouple document fixtures from product releases 2026-07-15 21:17:20 +08:00
Kayshen-X e0a2bd4e69 refactor: derive Rust product versions from Cargo 2026-07-15 21:17:20 +08:00
Kayshen-X b542a7e5d1 test(panels): align legacy gutter assertions 2026-07-15 21:17:20 +08:00
Kayshen-X 9bd9adf505 test(panels): strengthen layer gutter regressions 2026-07-15 21:17:20 +08:00
Kayshen-X 8e2cca4f6b fix(panels): align labels with layer action gutter 2026-07-15 21:17:20 +08:00
Kayshen-X d41da4fc64 fix: harden workspace version reader inputs 2026-07-15 21:17:20 +08:00
Fini 050fac23cd fix(agent): separate CLI generation and canvas modes 2026-07-15 21:10:11 +08:00
Fini fff96c8ad5 feat(agent): unify generation UX and CLI providers 2026-07-15 03:48:29 +08:00
Fini 652afc9031 fix(orchestrator): preserve and repair progress rings 2026-07-15 03:29:39 +08:00
Kayshen-X 3a41f2ea7f feat(web): make credential persistence deployment-aware 2026-07-14 23:36:37 +08:00
Fini a02b124aae fix(desktop): align design session identity and lifecycle 2026-07-14 00:30:01 +08:00
Fini 6e2bbd379a refactor(agent): make design repair explicit and bounded 2026-07-14 00:30:00 +08:00
Fini eea8901042 fix(mcp): harden batch design and image semantics 2026-07-14 00:29:59 +08:00
Fini 44a4fe4e24 feat(editor): align canvas layout and sizing behavior 2026-07-14 00:29:58 +08:00
Fini c7e7e45810 fix(desktop): find image slots by geometry, not by name
DeepSeek ships a card's photo area as an UNNAMED rectangle sized
fill_container x fill_container - no keyword, no number - so every
name-and-size heuristic missed it and the whole page came out as grey
boxes. What a slot IS is a question about geometry, so the pass now asks
the real layout: an empty painted box that RESOLVES to picture size, in a
card that has words in it, is a photo slot. The words come from the card's
own subtree (a title nested in an info frame still names the picture), the
nearest ancestor that names the subject wins over them, and a cousin card
is never consulted.
2026-07-14 00:29:57 +08:00
Fini f6fe94bc1a fix(agent): explain the fresh-sandbox rule, and paint rich text at real widths
A batch died on "header is not defined": the model referenced a const from
the PREVIOUS batch's script, but every script runs in a fresh sandbox. The
error now says so and points at the fix (reference the node by its id
string), and the program-DSL contract states it up front.

The transcript's markdown also painted every span at the wrap ESTIMATE
(6.6px per unit) while skia draws real glyph advances, so each span after
the first sat at a slightly wrong x - code chips drifted off their words
and a sentence read as fragments. Paint now advances by the measured width;
wrapping stays estimate-based, since it must stay backend-free.
2026-07-14 00:29:56 +08:00
Fini f369e91390 fix(desktop): recognize the abbreviations weak models name image slots with
MiniMax-M3 shipped a whole travel page as grey boxes: it builds every card
around a rectangle named "img" (or a "ph" rectangle inside an "img"
wrapper), and neither word was in the image-slot keyword table, so the
enrichment pass never saw a single slot. Both are slots now - and because
such a name carries no subject of its own, the query falls through to the
card that names the picture ("Santorini").
2026-07-14 00:29:55 +08:00
Fini f04e0a8fb3 fix(editor): give the cursor a clean white rim that cannot jag
The rim was a polygon STROKE, and the trait's fallback draws a polygon
stroke as one capped line per edge - so every vertex of the densely
sampled arc notched and the rim's width visibly wobbled. Two fixes: the
native backend gains a real single-path, round-joined, antialiased
polygon stroke (every caller benefits), and the cursor's rim is now
FILLED geometry - the silhouette outset by an exact 1.6px, painted white,
then covered by the body. The halo layers clear the rim so the outline
reads crisp against both light and dark designs.
2026-07-14 00:29:54 +08:00
Fini 8c07452298 fix(agent): teach the token vocabulary, and stop broken refs from painting nothing
The search bar came out grey with an invisible filter icon. Two causes,
both mine to fix.

The model painted the bar $--accent believing it was the brand colour -
in the shadcn vocabulary --accent is a quiet NEUTRAL surface and the brand
colour is --primary. The design-system teaching I added told the model to
use tokens but never said what they MEAN; it now carries the semantics
table, with the neutral-vs-brand trap called out.

The filter glyph was painted $--white - a token in no table. An unresolvable
reference silently rendered as an invisible glyph. A broken reference is now
repaired against the surface it sits on: a glyph on a soft tint takes that
tint's colour at full strength, a glyph on a token surface takes that token's
-foreground partner, and a container's unknown fill is dropped rather than
guessed.
2026-07-14 00:29:53 +08:00
Fini f1178c76c1 fix(desktop): one subject, one photo - a rebuilt card keeps its picture
Watching a run frame by frame: a real Bali temple photo landed, then
halfway through it turned into a plain blue sky. The model had rebuilt
the section (fresh node ids), the same query searched again, and the
session-wide dedup - there to stop two cards sharing one picture - now
skipped the very photo that query had already chosen, leaving the junk
below it. A query this session already answered now resolves from a memo:
no network call, and no downgrade. Dedup still guards different subjects
from sharing a photo.
2026-07-14 00:29:52 +08:00
Fini c5feaeec01 fix(desktop): open a multi-page file where its design actually is
A 16-page document whose first page was a blank cover opened onto empty
canvas ("content bbox None") and read as a load failure - the design was
on page 2. With no editor metadata to restore, the file now lands on the
first page that has content; a file that is empty everywhere still opens
on page 1.
2026-07-14 00:29:51 +08:00
Fini 985654e913 feat(editor): render the narration as typed markdown, not a grey wall
The model writes markdown - bold labels, hex codes in backticks, bulleted
build summaries - and the panel flattened all of it: markers stripped,
bullets faked by gluing a dot into the string, code indistinguishable
from prose. The transcript now renders a deliberate subset (**strong**,
`code`, and - bullets) as real typography: labels in bold on the
foreground tone, body in the muted one, code in a tinted chip, bullets
with a hanging indent so wrapped lines align under the text. Unclosed
markers stay literal - a syntax that silently eats characters is worse
than none.
2026-07-14 00:29:50 +08:00
Fini 5df84f0591 fix(agent): an omitted container layout stacks instead of turning into a row
The engine's flex default is a ROW, so a section frame that never declared
layout laid its title beside its card rail and pushed the cards off the
screen (measured: every section in a DS run). An omission is not a request
for a row - a container with flow children and no layout now stacks, and
the program-DSL contract says to declare it.
2026-07-14 00:29:49 +08:00
Fini 03e54a7a8b fix(mcp): an empty input slot is not a competing input
A batch died on "provide only one of script, operations, or nodes_json"
because the model sent the unused slots along as empty placeholders. An
empty value ("", [], {}, null) is not a choice of input: the batch now
runs whichever slot the caller actually filled, while a lone empty
program still reports rather than reading as applied.
2026-07-14 00:29:48 +08:00