Commit Graph

3281 Commits

Author SHA1 Message Date
wang 0365b7fcd9 feat(web): redesign design system catalog and detail tabs 2026-09-20 00:04:52 +08:00
wangchenglong 877980fb17 fix(web): align home and project composer controls
Restore shared add-menu resources and project context actions, prevent plugin preview clipping, and restore plus and attachment icons.

Use 4px padding for composer tags and match the design-system button to the adjacent plus button.
2026-09-11 19:56:05 +08:00
wangchenglong 03058b2534 fix(web): cap expanded queued messages at six cards
Use 4px outer spacing, keep 2px card gaps, and size the expanded viewport for up to six measured cards. Open at the start of the queue and preserve downward scrolling when new messages arrive. Sync the offline demo and cover overflow and window resizing.
2026-09-10 18:07:20 +08:00
wangchenglong c9f161d59f fix(web): tighten queued message card spacing
Use 8px around the queued-message stack and 2px between expanded cards. Keep the client and offline demo geometry in sync.
2026-09-10 17:53:27 +08:00
wangchenglong 7d2db7014a feat(web): integrate project chat module and offline review demo
Connect the scoped chat implementation to the existing project controller, including history, message navigation, shared composer controls and the queued-message stack. Document the compatibility boundary and include the self-contained demo with client review evidence.
2026-09-10 17:29:43 +08:00
wangchenglong 997a0a08f3 fix(web): reword the Chinese home headline
「我们来设计点原型」→「让我们创建原型」(per product).

The `{word}` placeholder stays. HomeHero splits the string on it to
decide whether a locale opts into the rotating noun at all, so dropping
it would leave Chinese with a frozen headline while en and zh-TW kept
cycling. Two comments quoting the old sentence are updated with it;
zh-TW keeps its own wording.
2026-09-07 19:40:22 +08:00
wangchenglong 79be3bc321 feat(web): one badge for stopped runs, a warm orb for a pending question
Every status that ended without delivering — failed, canceled, and a run
that finished with declared work undone — draws one static badge now,
instead of three unrelated things (an orange orb, nothing at all, and an
amber orb). The row only has to say "this did not finish"; the reason
belongs to the status text beside it. `canceled` drew no glyph before, so
`hasRunStatusGlyph` had to stop excluding it or the badge would never
reach the two surfaces that reserve the column.

That moves the split from "did it go well" to "is it still going". A
stopped run is never spun, because the rotation is what says "working".

Awaiting a reply keeps the orb and turns at running's speed — a pending
question is a live run, not a stalled one, and only `queued` may turn
slowly. It is recoloured to a warm three-step ramp: orange base, amber
second accent and bloom, gold glint.

Recolouring at all needed a new `literal` mode on SiriOrb. The stock
build is tuned around #00FF08 in six places — three slots hardcode green
where `colors` cannot reach, and the white highlights, the saturate/
contrast pair and the overlay texture pass each edit whatever hue they
are handed. None of them disturb the green, whose R sits at 0.00 and G at
1.00, pinned at the channel bounds. #FF8D02 has a mid green channel and
came out green, then yellow, then red as each was found. `literal`
collapses the unreachable slots onto c1 and stops the build editing the
colour; `colors` now accepts c5 so a caller can name the glint that white
is no longer allowed to draw.
2026-09-07 19:39:40 +08:00
wangchenglong 7c9b4dbfbd chore: ignore .playwright-cli capture output
Same reason .playwright-mcp/ is ignored one line up: ad-hoc YAML page
snapshots and PNGs from local visual checks, holding local UI state and
maintained as a fixture by nobody.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:44:06 +08:00
wangchenglong 9bea9280c0 fix(web): restore the entry rail's real workspace context
Revert a TEMP local hack that pinned context to null so the signed-out
footer could be inspected without signing the dev copy out. It was marked
REVERT and must not ship — with it in place the rail renders the
logged-out shell for everyone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:43:54 +08:00
wangchenglong 511d454908 fix(web): trace the routines shell radius concentric with its input
The shell and the white input inside it both used --radius-xl, so at an
equal literal radius the outer corner read squarer than the inner one.
The shell sits 6px outside that box (1px border + 5px padding), so adding
those 6px is what puts both corners on the same curve.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:43:54 +08:00
wangchenglong 56751b4d26 fix(web): drop the message center card's hover states
Per product the card carries no hover feedback at all now. That left the
archive button unreachable with a mouse: it sat at opacity: 0 until
.item:hover or :focus-within opened it, and those are exactly the states
the card no longer has. Touch already had it permanently through a
(hover: none) block, so this is that treatment everywhere. The summary's
5% accent wash goes with it, along with the expanded-state rule that
existed only to cancel it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:43:54 +08:00
wangchenglong 2981a2025f fix(web): keep the staged attachment band in sight as the prompt scrolls
The scroller sat on .home-hero__prompt-flow, which is also the attachment
band's parent — so scrolling a long prompt carried the band away with the
text, and an attachment the user had just staged left the screen while
they were still writing about it.

Move the scroll down to a new .home-hero__prompt-surface holding the
prompt and its lead chip and nothing else. That element keeps the
position: relative the out-of-flow chip needs as a containing block, so
the chip still scrolls with the text it leads rather than pinning itself
to the top of the box.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:43:42 +08:00
wangchenglong d3b251de04 feat(web): lead staged videos and vectors with their own thumbnail
Only rasters got a thumbnail in the composer; a staged .mp4 or .svg fell
back to a generic file chip, and a.kind could not tell them apart because
the daemon splits attachments into image/file only — a video arrives as
'file'. FileTypeIcon decides from the name and MIME type instead, and
both the home hero and the chat composer now draw a first frame for video
and a rendered preview for vectors, opening into the same preview card.

The card's close control was a 36px-tall pill with 0 16px of padding
around a 14px glyph; pinning its width to its height and dropping the
padding makes it the circle it was meant to be, and flex: 0 0 auto stops
a long filename from squashing it back into an oval.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:43:33 +08:00
wangchenglong f7c39b9d2a feat(web): show the page taking shape while a run builds it
The Design Files pane used to sit on an empty state until a run finished
and the first artifact dropped in. Everything the run was doing happened
somewhere the user could not see, and the wait carried no signal that
anything was happening at all.

It now watches the shallowest index.html the run has produced (or the
most recently written HTML file) and renders it live beside a feed of the
steps behind it, with a toggle between the step feed and the full
preview. A new cross-runtime contract, preview-build-focus, lets the
sandboxed preview frame answer "where in this page are you writing right
now" — either by a literal string the agent just wrote or by naming one
of the page's own top-level sections — so the host can walk a cursor down
the page as it is written instead of jumping to wherever the last run of
text happens to land. The frame has no allow-same-origin, so it posts to
'*' and the host identifies it by event.source.

latest-user-prompt goes away with the empty state that echoed it: the
pane now names what the run is doing, which is the more useful of the
two, and keeping both meant recomputing a prompt string on every streamed
token for a line nobody read.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 15:43:24 +08:00
wangchenglong 61dba52422 feat(web): entry follow-ups — team badge, community byline, local-agent step
Follow-ups on the refreshed entry surfaces, all driven by product review of the
running build.

Team badge (RecentProjectsStrip / recent-projects.css)
- The glyph is now remixicon `swap-2-fill` (added to the inlined path table)
  instead of the drawn group-of-people mark.
- The badge hangs off the CARD, not the cover. The cover scales 1.03 on hover,
  so a badge nested in it grew and slid outward at the very moment it faded in,
  landing flush with the card edge while ⋯ stayed 8px in. It now shares the ⋯
  anchor's positioned ancestor and its 8px inset, so both hover affordances sit
  on one line, one per edge.
- Restyled to match ⋯: 26px tall, plain panel ground, accent-coloured 12px
  label, 13px glyph, no stroke and no green wash. Tokens rather than literal
  hex, so the chip still inverts under the dark theme instead of sitting white
  beside a dark ⋯.

Community card byline (CommunityView / CommunityTemplatePreview)
- Cards carry who published the template again, from the catalogue only: a
  manifest author wins, otherwise the SOURCE answers it — bundled and
  marketplace records are Open Design's, a locally authored plugin is the
  signed-in person's own. No invented handles, and the view/remix counts that
  were removed with the placeholder byline stay out until a source exists.

Onboarding "local agent" step (EntryShell / entry-layout.css / AgentIcon)
- Continue moves up beside Back on one row above the panel, one control per
  edge, instead of sitting alone under a panel whose height changes with the
  chosen runtime.
- The CLI grid goes 2 → 3 per row, and BYOK closes it on a row of its own. The
  span is CSS; the panel also sorts BYOK last, so the scan order can never
  leave a hole above it.
- Chips left-align their content. The button primitive centers it, which left
  every logo floating mid-tile instead of leading its name.
- BYOK wears a key glyph (`key-2-fill`) rather than the initial-letter tile the
  fallback gave it: there is no vendor behind it — the runtime is whatever
  provider key the user brings.

Account menu (EntryNavRail / analytics contract / locales)
- The account menu gains a 账单 row that opens the workspace billing console,
  tracked as its own element (distinct from the hover panel's credits row), with
  `entry.accountBilling` / `entry.accountGithubHelp` across the locale files and
  a test covering the row.

Also carried along: rail recent-row, run-status icon and home-hero spacing
tweaks, and the e2e AMR/visual-navigation helper updates that go with them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019DPHofFYG9h3DgjgCDWLYh
2026-09-01 20:43:46 +08:00
elifive555555 2eb6478a38 fix(components): add @types/react-dom so the package builds standalone
dialog.tsx now imports createPortal from react-dom, but the package's
own devDependencies never carried its types — tsc resolves them from a
sibling's node_modules in some layouts, and a fresh pnpm install fails
postinstall with TS7016 in others. Declare the dependency where the
import lives.
2026-09-01 18:43:20 +08:00
elifive555555 ed18e9296c feat(web): align the Community tabs with the Home type row
The gallery's type row now mirrors the Home taxonomy — 原型 / 幻灯片 /
文档 / 图片, Prototype leading and active by default — instead of
deriving its own set from the catalogue (web-clone stays Home-only).
Document renders as a fixed tab even while no document templates ship
yet. The sub-facet pill row and the header search are gone: the type
tabs are the whole filter surface.
2026-09-01 16:35:24 +08:00
elifive555555 513509428a feat(web): narrow the Home type row to three entries plus 更多
The Home type row carried the whole create catalog and folded whatever
did not fit into a 全部 popover, so which types a user actually saw was
a function of their window width. Product wants a fixed entry set
instead: 原型 / 幻灯片 / 文档 inline, and exactly two — 图片 and
网站复刻 — behind a 更多 button.

- `HOME_TYPE_ROW_IDS` / `HOME_TYPE_ROW_MORE_IDS` in `chips.ts` own that
  membership; `TypePillRow` renders the two sets instead of computing
  the split. Fit measurement stays, but only so a narrow viewport can
  push an inline pill into 更多 rather than clipping it.
- `homeHero.chip.prototype` becomes 原型 / Prototype — the row's leading
  type was the only one still labelled in English in the Chinese UI.
- `homeHero.titleWords` drops to the same three nouns, so the rotating
  hero headline names types the row can actually offer.
- Adds the Website clone chip. Its label, description, art and
  `example-web-clone` plugin route all existed already; the catalog
  entry that reaches them did not.
- "全部" reads 更多, reusing `homeHero.subTypeMore` (already translated
  in all 19 locales) rather than adding a key.

Types outside the row — video, audio, HyperFrames, wireframe, mobile,
WebGL, live artifact — keep their catalog entries and stay reachable
through the workspace tabs-bar "+" template handoff, but no longer have
a Home entry point.

Tests: rail / scenario-cards / chip-restore / prefill re-pinned to the
new contract. `HomeView.media-options` and `HomeView.context-picker`
still drive video/audio/HyperFrames through the row and are left red
pending the product call on whether those types get another entry point.
2026-09-01 15:57:44 +08:00
wangchenglong ab0a1a4e61 feat(web): refresh the home and entry surfaces
Reworks the entry experience end to end — the Home hero and its composer, the
nav rail, the workspace tab bar, the recent-projects strip, the community
gallery and the message center — and adds the per-project run status the rail
and the strip now render.

Home / entry
- Hero headline cycles a noun out of `homeHero.titleWords` (RotatingTitleWord);
  locales whose `homeHero.title` carries no `{word}` stay a plain sentence.
- The composer is now one component in two shapes: `page` (Home's full column)
  and `dock` (the bar alone, used by the community view), sharing @mentions,
  staged files, the working-directory row and submit.
- ComposerModePicker is gone; ComposerPlusMenu absorbs what it offered.
- Entry layout, nav rail (with RailRecentRow), workspace tabs and the recent
  projects strip are restyled together against one set of measurements.

Run status
- New `projectRunStatus` state, `useProjectRunStatuses`, `run-progress` and
  `latest-user-prompt` runtime helpers, and `ProjectRunStatusIcon`.
- `ChatRunsResponse` gains `awaitingInputProjectIds`: a run that asked a
  question reads `succeeded` while the project is still blocked, so a caller
  rendering per-project status needs the set to avoid showing such a project
  as finished. Optional — absent means unknown, not none.

Community / message center / design files
- Community gallery gets its own empty state, and the message center gets
  archive plus a reworked card.
- Design files panel gets a dedicated empty state component.

Daemon / desktop / sidecar
- Project create bounds its read-only preparation work (15s) so a stalled
  local catalogue scan cannot strand the web on an optimistic route or leave a
  half-initialized project behind.
- The startup splash runs the same pixel-scan wordmark as the Home hero,
  ported to raw WebGL because the splash renders before the sidecar boots
  (replaces the splash video).
- Sidecar proxy tracks the in-flight request/response so a keepalive replay
  tears down the previous attempt instead of leaking it.

New visuals: SiriOrb, MarqueeLabel, SpaceBackground, the composer beam and the
chat-cards-next surface.

No placeholder data ships with this: the community card byline (author name and
view/remix counts) and the message center's temporary cover image are removed,
so the card footer shows the title only and the media slot renders only when a
message payload actually carries `imageUrl`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016cbrF36bYyw9qpnksvZTjd
2026-08-31 12:01:27 +08:00
Siri-Ray a539ba57ce docs(release): add 0.19.2 release notes open-design-v0.19.2 2026-08-14 22:25:31 +08:00
open-design-release-bot[bot] 687e9b2010 fix: batch streamed events and simplify project exports (#6915) (#6918)
* fix: batch streamed message event persistence

* fix: derive export scope from project id

(cherry picked from commit cf094aad1c)

Co-authored-by: lefarcen <935902669@qq.com>
2026-08-14 12:58:56 +00:00
open-design-release-bot[bot] 90dc5c72e9 fix: install DSH companion from a shell-safe profile path (#6905) (#6911)
(cherry picked from commit e11616da3d)

Co-authored-by: lefarcen <935902669@qq.com>
2026-08-14 11:18:08 +00:00
open-design-release-bot[bot] f84e69beae feat: add one-click DeepSeek Harness bootstrap installers (#6900) (#6909)
* feat: add DeepSeek Harness bootstrap installers

* docs: add DeepSeek Harness one-click install guide

* docs: explain DeepSeek Harness API key setup

* feat: publish DSH installers through production workflow

* fix: make DSH CMD bootstrap self-contained

* fix: keep DSH CMD on the official installer URL

(cherry picked from commit b04ccd1d13)

Co-authored-by: lefarcen <935902669@qq.com>
2026-08-14 11:06:26 +00:00
open-design-release-bot[bot] c4c28c3382 fix(web): restore message center CTA (#6894) (#6907)
* fix(web): restore message center CTA

* fix(web): unify expanded message card surface

(cherry picked from commit cc34d2d409)

Co-authored-by: lefarcen <935902669@qq.com>
2026-08-14 10:52:34 +00:00
open-design-release-bot[bot] a71d476330 chore(release): v0.19.2 2026-08-14 10:04:40 +00:00
Ray Xi 78baa52281 fix(web): cover composer with move dialog (#6854) 2026-08-14 09:03:08 +00:00
Ray Xi 7b7214e52a reorder web home creation type priorities (#6892)
* fix web home media pill placement

* swap UI Mockup and Slide deck positions
2026-08-14 09:02:56 +00:00
Ray Xi 8b452355b7 fix(web): remove deck preview letterboxing (#6829) 2026-08-14 09:02:33 +00:00
Ray Xi 52ef46cf5f docs(release): highlight DeepSeek Harness in 0.19.1 notes (#6895)
* docs(release): highlight DeepSeek Harness in 0.19.1 notes

* docs(release): rename 0.19.1 codename
2026-08-14 09:02:06 +00:00
Joey-nexu e98cc09ab9 feat(landing): curated DeepSeek Harness design plugin collection (#6897)
* feat(landing): add curated DeepSeek Harness design plugin collection

Adds /plugins/deepseek-harness-design/ as a sibling of the Codex design
board: 11 verified native dsh plugins (vision bridges, canvases,
generative UI, design-workflow tools) with flat /plugins/<slug>/ detail
pages, a crossover band for the shared SKILL.md story, a second featured
card on the plugins hub, and 301s for the short route forms.

The Codex collection's data model, copy resolver, detail layout and hub
layout are extracted into shared curated-collection types and components
(curated-skill-detail.astro, curated-collection-hub.astro); the Codex
pages become thin bindings over them with unchanged output. Codex-specific
field names are renamed agent-neutral (howWithAgent, agentNote,
detailHowWithAgent, installRunInAgent) across data and locale files.

* feat(landing): grow DeepSeek Harness collection to 13 plugins, localize 10 locales

Adds a fourth category, Workspace & Preview, with the two ecosystem
workbench plugins that materially help design work (dsh-web-ui,
DSH-better-sidebar), links dsh-vision-toolkit to its upstream repo, and
records real social traction for the entries that have it.

Ships agent-translated copy for all 10 non-English landing locales
(chrome + per-plugin prose), weaves the dsh / dsh-plugin search terms
into the lede, intro, stats and hub feature card, and refreshes the
placeholder art for the new entries.

* feat(landing): simplify DeepSeek collection title, drop crossover band

Retitles the hub to the plain "DeepSeek Harness plugins for design"
(all 11 locales, hub feature card included) with a matching direct lede,
adds a hubTitle override so the <title> is not eyebrow-duplicated, and
removes the SKILL.md crossover band and its copy keys per review.

* feat(landing): move DeepSeek collection hub to /plugins/deepseek-harness-design-plugins/

Exact-match URL for the target query; the previous slug and short forms
301 to it. Asset paths under /plugins/deepseek-harness-design/ are
unchanged: they are public files, not routes.

* feat(landing): point DeepSeek hub hero CTA at the Open Design guide

Replaces the upstream-repo star link in the collection hero with an
internal link to /agents/deepseek-harness-design/, the guide for
designing with DeepSeek Harness inside Open Design, labeled in all 11
locales. The star CTA remains the default for collections without a
guide route.

---------

Co-authored-by: Joey <236967869+joeylee12629-star@users.noreply.github.com>
2026-08-14 08:53:12 +00:00
lefarcen 7594f72c8b fix: guide DeepSeek Harness credential setup (#6890) 2026-08-14 08:32:03 +00:00
lefarcen 34ad192de9 fix(web): recover aborted srcdoc preview navigation (#6882)
* fix(web): recover aborted srcdoc preview navigation

* fix(web): close srcdoc recovery races

* fix(web): version srcdoc base navigation
2026-08-14 08:02:26 +00:00
CVE-Hunter-Leo bdad26cfcb fix(platform): search Nix profile bin dirs for CLI discovery (#6121) (#6885)
* fix(platform): search Nix profile bin dirs for CLI discovery (#6121)

The packaged desktop app does not discover agent CLIs installed through
nix-darwin environment.systemPackages because launchd provides a minimal
PATH that excludes Nix profile directories.

Add three standard Nix bin paths to wellKnownUserToolchainBins:

- /run/current-system/sw/bin (system-wide NixOS/nix-darwin profile)
- /nix/var/nix/profiles/default/bin (default system profile)
- ~/.nix-profile/bin (user's active Nix profile)

Since this list is the single source of truth consumed by both the daemon
runtime resolver and the packaged sidecar PATH builder, all Nix-installed
agent CLIs are now detected after Rescan.

Closes #6121

* fix: gate system-wide Nix paths behind includeSystemBins (review)

Move /run/current-system/sw/bin and /nix/var/nix/profiles/default/bin
behind the includeSystemBins flag so sandboxed runs with OD_AGENT_HOME
do not reach host-installed Nix tools. Keep ~/.nix-profile/bin (home-
relative) always included.

Add test verifying system Nix paths appear only when includeSystemBins
is true and are omitted when false.

---------

Co-authored-by: CVE-Hunter-Leo <CVE-Hunter-Leo@users.noreply.github.com>
2026-08-14 07:22:10 +00:00
open-design-crew[bot] 7a37c1462d feat(export): add reliable standalone HTML export (#6855)
* feat(export): add standalone HTML export

Bundle project-local HTML, CSS, JavaScript, images, fonts, workers,
and iframe dependencies into one offline-safe file.

Expose the same contract through the web download flow and od CLI,
with structured failures and bounded output assembly.

* fix(daemon): honor standalone source URL semantics

Resolve document assets against local base href values, reject browser-invalid TypeScript and JSX sources with a structured 422, and count unquoted first-level resources before graph traversal.

Validated with daemon tests, workspace typecheck, and guard.

* fix(daemon): handle standalone data scripts and CSS URL tokens

Preserve non-JavaScript script payloads as data blocks and scan CSS values without treating strings or comments as project dependencies.

Validated with focused and full daemon tests, workspace typecheck, and guard.

* fix(daemon): classify standalone export resources correctly

Preserve non-HTML iframe MIME types, inline only resource-bearing link relations, and propagate unexpected Vite dist read failures instead of silently falling back.

Validated with focused export tests, the full daemon suite, guard, and workspace typecheck.

* fix(export): preserve version and stylesheet semantics

Hide standalone HTML export for historical versions until dependency snapshots are available, avoiding an action that always fails.

Keep disabled and alternate stylesheets as embedded link elements so standalone export preserves activation semantics. Validated with focused red/green coverage, the full web suite, pnpm guard, and pnpm typecheck.

---------

Co-authored-by: Cheems <94773058+itscheems@users.noreply.github.com>
2026-08-14 07:21:21 +00:00
Joey-nexu 3e83694d40 docs(readme): highlight DeepSeek Harness support (#6889)
Co-authored-by: xne998808-ai <276262049+xne998808-ai@users.noreply.github.com>
2026-08-14 07:18:11 +00:00
Amy 180bef2b7e fix(web): remove deleted projects from workspace tabs (#6886) 2026-08-14 06:56:09 +00:00
lefarcen f9c07517b7 fix: make DeepSeek Harness cancellation authoritative (#6880)
* fix deepseek harness cancellation lifecycle

* fix DeepSeek canceled status rendering

* fix DeepSeek cancellation handshake race

* feat support reasoning selection in composer

* test DeepSeek pre-execute cancellation protocol

* test reasoning selector visual surface
2026-08-14 06:40:10 +00:00
lefarcen eea8a8522d fix(collab): bound workspace refresh storms (#6871)
* fix(collab): bound workspace refresh storms

* fix(collab): push workspace directory freshness

* test(collab): follow identity-aware hub callbacks

* fix(collab): reset authority on account changes

* fix(collab): fence workspace identity transitions

* test(collab): guard full identity reset
2026-08-14 02:19:51 +00:00
PerishFire f9fe73c836 feat: add DeepSeek Harness support (#6874)
* feat(daemon): scaffold DeepSeek Harness profile protocol

* feat(daemon): integrate DeepSeek Harness profile runtime

* fix(daemon): preserve headless prompts on native resume

* refactor(daemon): model Harness profile resume explicitly

* fix(daemon): resume Harness sessions after cancel

* test(daemon): verify DeepSeek Harness Windows carrier

* test(daemon): reap DeepSeek Harness Windows process tree

* feat(agents): surface DeepSeek Harness models and branding

* fix(daemon): surface Harness credential guidance

* feat: add bundled DeepSeek Harness setup

* fix: link DeepSeek Harness installer

* fix: link official Harness docs

* fix(daemon): distinguish Harness companion install

* test(pack): verify bundled Harness resources on Windows

* fix: harden Harness profile turn lifecycle

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(dsh-runtime): stop cancelled restore follow-ups

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(daemon): cancel Harness startup before execute

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(pack): build DeepSeek runtime on cold cache

---------

Co-authored-by: lefarcen <935902669@qq.com>
Co-authored-by: Looper <looper@noreply.github.com>
2026-08-14 02:07:55 +00:00
Marc Chan a62f870ba0 fix(landing): align multilingual DeepSeek campaign copy (#6876)
* align multilingual DeepSeek campaign copy

* refine campaign copy for ja, ko, ru, fr

- ja: headline '最高峰の知性を、制限なく。' (more concise, less preachy)
- ko: headline '최고 수준의 지능, 제한 없이.' (short-form marketing style)
- ru: disclaimer split into two sentences for clarity
- fr: linkLabel add 'de la campagne' for specificity

Applied to both pricing-campaign-content.ts and home-campaign-content.ts
2026-08-14 01:59:59 +00:00
Marc Chan d556647643 feat(landing): sync DeepSeek Pro and Flash landing campaign (#6863)
* sync DeepSeek Pro and Flash landing campaign

* remove pricing customer story

* fix(landing): keep campaign preview off conversion attribution

Preview query params and the cloud-team-demo Upgrade path were treating
campaign visibility as conversion eligibility, so public visitors could
stamp od_campaign_id outside the fixed window.

Split campaignVisible from campaignEligible on Pricing and the team demo,
and use only the real clock window for checkout attribution.

Generated-By: looper 0.11.8 (runner=fixer, agent=grok-build)

* remove campaign preview backdoors

* remove unused cloud team demo page

* add Traditional Chinese campaign copy
2026-08-13 17:36:54 +00:00
Joey-nexu 77b31369fb feat(landing): add DeepSeek Harness design guide (#6864)
* feat(landing): add DeepSeek Harness design guide

* fix(landing): localize DeepSeek Harness hero

* fix(landing): preserve localized Harness titles

---------

Co-authored-by: Joey <236967869+joeylee12629-star@users.noreply.github.com>
2026-08-13 17:18:25 +00:00
Ray Xi bd6988ce56 docs(release): add 0.19.1 release notes (#6867) 2026-08-13 17:12:14 +00:00
lefarcen 9a402b2e4c feat(campaign): extend the DeepSeek V4 campaign to Pro + Flash (#6861)
* feat(campaign): extend the DeepSeek V4 campaign to Pro + Flash

The V4 Flash free week ends 8/13 20:00; a two-week window offering BOTH
V4 Pro and V4 Flash opens at that same instant and runs to 8/27 20:00.

This grows the campaign already in production rather than landing a
second stack beside it. That implementation ran the free week for a
week: its audience resolution (wallet balance is not a subscription),
i18n wiring, localized countdown, frequency control and attribution are
all already exercised, and it carries a product decision this change
must not undo -- the URL review backdoors (campaign / audience / usage
overrides) were deliberately removed, and reviewing the campaign is done
by overriding `window.startAt`, never through query parameters.

Almost all of it is the campaign module growing a second model:
`isDeepSeekV4FlashCampaignModel` now matches either id, which is why the
model switcher badges both without its rendering changing at all, and
the modal's benefit line is an i18n key, so naming both models was copy.
`「立即使用」` now switches a paid user to Pro, the headline benefit.

Two things needed real edits. Model-benefit impressions fired once with
a hardcoded Flash id; product compares the two models' reach separately,
so they now fire once per campaign model actually on screen, each with
its own `model_id`. And `campaign_id` / `element` move to the spec's
`deepseek_v4_pro` naming, with `deepseek_v4_flash` kept declared so the
finished campaign's warehouse rows stay valid.

Copy is rewritten across all 19 locales -- dates, the two-week framing,
both model names, and the peak-hours queue caveat product added. Dates
follow each locale's existing format rather than one imposed format, so
only the day numbers move.

Frequency control is keyed on the campaign id, and the id is new, so a
user who dismissed the free week is still owed this campaign's single
showing. That was an invisible dependency on remembering to change the
id; it now has a test.

Module and i18n key names keep their `…V4Flash` spelling: renaming 28
keys across 19 locales mid-campaign is risk without user-visible
benefit, and belongs in a cleanup pass once the campaign is off.

* fix(web): read a rolling model window as a wait, not a failure

vela's hosted gateway rejects a request that exhausted its rolling
per-model window with `model_limit_exceeded`, phrased for API callers as
"You have reached the 5-hour usage limit for X. Try again after <instant>.
This request was not charged to Wallet Credits."

Two things went wrong with that sentence on the way to a user.

The daemon's `isHardQuotaText` matches its "usage limit" wording, so a
window that resets on its own was classified as `hard_quota` — an
exhausted quota, marked non-retryable. Nothing was charged and nothing
needs topping up, so that both misnames the cause and counts a self-
healing wait against reliability as a real failure.

The web runtime then had nowhere to put it. The AMR branch of
`resolveRunFailureUi` ends in a catch-all returning the generic "task
failed" title with a null message key, which renders the raw upstream
string — so a localized chat showed an English sentence under a wrong
heading. Home is worse: its send path fails before a run exists, never
reaches that mapping at all, and prints `err.message` verbatim.

Classify the window separately, ahead of the hard-quota reading, and give
both surfaces the same localized copy: high demand, when it reopens, and
the reassurance that nothing was charged. The instant is rendered in the
reader's locale — the gateway reports UTC. Both surfaces read the signal
through one shared contracts module so they cannot drift, and degrade to
copy that does not promise a time when no instant is readable.

Other rate limits are untouched: a genuine session-limit exhaustion keeps
its hard_quota reading, and every other business failure on Home still
prints verbatim.

* fix(analytics): keep a campaign entry for the whole campaign

The attribution record expires after seven days, but this campaign runs
fourteen. A visitor who clicks the banner on day 1 and subscribes on day
11 arrives at checkout with no entry left to attribute the payment to,
so the campaign under-reports against the metric it is judged on --
活动归因付费人数 / 金额, both defined as payments carrying its
`campaign_id`.

Extended only for entries that carry a `campaignId`. Raising the window
globally would move the attribution口径 for every other entry point and
the dashboards already built on it; the campaign is the thing that needs
a longer memory, so it is the thing that gets one. Past fourteen days a
campaign entry expires like any other -- the longer window is scoped to
the campaign, not an open-ended exemption.

* fix(campaign): carry the new campaign id through ingest and e2e fixtures

Two places still recognised only the finished free week's id, both found
in review.

The daemon's AMR entry ingest allowlist is fail-closed: an unrecognised
`campaignId` voids the WHOLE entry rather than just its campaign field.
With only `deepseek_v4_flash` listed, every entry this campaign produces
would have been dropped at ingest -- and its success metrics are defined
as payments carrying its `campaign_id`, so it would have reported zero
conversions while converting normally. Both ids are listed now, since
entries minted during the free week can still arrive inside their
attribution window.

The Playwright suite pre-seeds a dismissal so the campaign modal never
opens over a functional spec. That seeding was keyed on the old campaign
id, so the modal would have covered Home in every UI spec. `home-hero-
rail` also clears storage and re-seeded its own hardcoded copy of the
key; it now reapplies the shared map instead, so a future campaign
cannot be dismissed in one place and left interrupting specs in the
other.

* fix(campaign): land the workbench badge on the console, like the modal

The badge opened a hardcoded `https://open-design.ai/zh/pricing/` while
the modal's CTA opened the console's plan surface scoped to the caller's
workspace. Both are in-product entry points for a signed-in user, so one
funnel was being split across two destinations -- and only one of them
lets the user actually subscribe.

The hardcoded link also pinned `/zh/`, so every non-Chinese user landed
on a Chinese page from a badge that renders in all 19 locales.

Now shares the modal's destination, including the workspace scope, so
the console can resolve the right upgrade surface for that workspace.
Verified against a real browser: the badge opens
`/amr/dashboard?workspaceId=…&billing=plan` carrying entry id, source,
campaign id, conversion source and device id.
2026-08-13 16:37:16 +00:00
Ray Xi e279c457f8 fix(web): stop opening comments panel after save (#6862)
* fix(web): open comments panel only from view all

* fix(web): keep comments panel closed after save
2026-08-13 16:28:47 +00:00
lefarcen bdaeead758 fix(web): expand message center rows inline (#6851)
* fix(web): expand message center rows inline

* fix(web): keep paused placeholder suggestions submittable
2026-08-13 14:55:38 +00:00
lefarcen dba64f2e45 fix(landing): short HTML edge TTL + host purge after production deploy (#6552)
* fix(landing): shorten HTML edge TTL and host-purge after production deploy

Long s-maxage=3600 + stale-while-revalidate=86400 left locale HTML
(/zh/pricing/, /de/pricing/, …) on different edge objects after
landing-page-production, so some languages looked deployed and others
did not. Cap HTML/edge docs at s-maxage=60 without multi-hour SWR, and
purge open-design.ai by hostname after pages deploy (token needs Zone
Cache Purge). Hashed _astro assets stay immutable.

* ci(landing): add manual host-purge workflow for edge cache recovery

Allows testing CLOUDFLARE_API_TOKEN Cache Purge permission and one-click
recovery without a full production rebuild. Production deploy still purges
after pages deploy.

* ci(landing): support purge-only production workflow mode

Lets us exercise CLOUDFLARE_API_TOKEN Cache Purge without a full rebuild,
and keeps host purge as a post-deploy job after a real promote.

* ci(landing): move edge-cache purge helper to workflow-owned TypeScript

pnpm guard rejects project-owned .mjs, so the new purge helper blocked
Validate workspace. Convert it to TypeScript and move it next to the other
landing workflow helpers under .github/scripts/, invoked with
--experimental-strip-types like landing-page-deploy-feishu.ts.

Also drop the purge-only production mode: blog-indexing-on-deploy listens on
successful landing-page-production runs and cannot tell a cache-only recovery
run from a real deploy. Purging without a rebuild already has a dedicated
entry point in landing-edge-cache-purge, so production purge now runs only
after a successful deploy.
2026-08-13 14:46:04 +00:00
Marc Chan aab3be9174 feat(landing): extend DeepSeek campaign banner through Aug 27 (#6852)
Refresh homepage and pricing campaign copy to the Pro + Flash two-week offer, and move the exclusive end to 2026-08-27 20:00 Asia/Shanghai.
2026-08-13 14:04:24 +00:00
lefarcen ec0eddd3f8 fix(web): preserve Community template type handoff (#6847)
* fix(web): preserve community template type handoff

* fix(web): keep focused home suggestions submittable
2026-08-13 14:02:29 +00:00
CHENGLONG WANG 698a17aac2 feat(web): refresh home and preview workspace controls (#6692)
* feat(web): home type-fan picker, floating account cluster, docked tab dropdown

Home hero: the 12 create-scenario types render as a fanned card carousel
above the composer (flat elliptical arc, apex card = selected, arrows /
card click switch along the arc; selected card scales about its own
center on an inner body so the outer transform stays a pure arc move).

Entry chrome: the account module leaves the nav-rail bottom and rides a
fixed top-right cluster next to the DeepSeek campaign badge — credits as
its own pill, avatar-only circular trigger, hover menu opens downward
(right-aligned, width-capped). The cluster is app-region no-drag so the
menu stays reachable in the desktop shell.

Project route: the docked workspace tab strip becomes one white dropdown
spanning the chat column (MRU order, most recent first), and the chat
collapse control lifts out of the chat card header to sit left of it.

Design files: the category tab bar drops its near-opaque sticky backdrop
strip and scrolls with content.

* feat(web): polish top-right capsule and dock controls, seed default deck chip

- Home composer seeds 幻灯片 (deck) as the default creation type on a
  fresh mount — same silent deferred-apply path as a user pick, skipped
  whenever a persisted chip draft owns the composer.
- Type fan: tighter card spacing (arc pivot 3700px → 3000px, ~128px
  between neighbours) so the hand-of-cards overlap reads again.
- Top-right chrome: credits + avatar merge into ONE capsule (pill
  material on the shared wrapper, chrome-free 24px segments inside,
  no hover fill on the credits segment).
- Project dock: the chat-collapse control gains a white seat matching
  the tab dropdown, and the dropdown drops its border (shadow only).

* test(web): align refreshed home chrome acceptance coverage

- Read account badges and member labels from the floating account menu.
- Match the default deck route, non-sticky Design Files tabs, and lifted chat control.
- Navigate projects through the visible docked Home control instead of hidden state nodes.
- Cover the affected Web suite and focused UI P0 restoration flows.

* fix(web): lock submit until default routing is ready

- Keep fresh-home sends disabled while the plugin catalog and default deck binding settle.
- Let explicit plugin handoffs supersede the default without leaving Send locked.
- Add a red-spec that holds the catalog response and verifies the routing barrier.

* test(e2e): await seeded type before picker actions

- Wait for the fresh-home deck binding before opening the creation-type menu.
- Switch to Prototype instead of clicking the already-active deck row.
- Preserve clear-selection coverage without racing menu reconciliation.

* fix(web): keep type menu open during internal scroll

- Listen for scroll only on the trigger ancestor chain and the viewport.
- Let the portaled creation-type list scroll without dismissing itself.
- Add coverage that distinguishes internal menu scroll from anchor-moving scroll.

* test(web): await routed submit readiness in legacy flows

- Wait for the Home submit control to become enabled before exercising the AMR workspace race path.
- Wait for refreshed workspace metadata and default routing to settle before submitting a community template.
- Keep the assertions aligned with the production guard that blocks submits until a deterministic default route exists.

* feat(web): replace the home type fan with a capsule pill row

The 12 create-scenario types render as ONE line of capsule pills exactly
as wide as the composer below: pills that fit render inline (8px gaps
throughout), 视频 stays pinned before the 全部 trigger, and the rest fold
into the 全部 popover. Fit is measured against an invisible probe row so
visibility never feeds back into its own measurement. 幻灯片 leads the
order (default-selected type); 网站复刻 trails so it folds first.

The fanned card carousel this replaces is fully removed (component +
styles) — selection still flows through the same onPick scenario path.

* feat(web): drop the clear-type control, cap the type menu at 6 rows

Clearing the creation type is gone (per product): the composer pill loses
its inline x (the chevron now stays in every state) and the menu loses its
leading Clear row, so a type is only ever swapped for another. TemplatePicker
no longer takes onClear.

The type menu shows exactly 6 rows and scrolls for the rest (6 x 44px row +
5 x 2px gap + 12px padding).

Specs that drove the removed control are rewritten around swapping instead:
the e2e clearHomeTemplate helper is deleted, pickHomeTemplate now observes
the pill's has-selection state, and the three clear-specific specs assert the
affordance is absent.

* feat(web): lift the GitHub star badge into the top-right cluster

The star count leaves the account menu's social row and becomes its own
chip between the campaign badge and the account capsule, sharing their
pill material. The menu's social row keeps Discord / X / mail.

* chore(web): clean up stacked EOF whitespace

- Remove the trailing blank line introduced in the home hero stylesheet.
- Keep the shared Playwright home helper free of the same EOF artifact.

* fix(web): polish preview workspace controls

* fix(web): stabilize floating comment interactions

- Treat a configured comment portal as an overlay from the first render and
  pre-mount its empty host, preventing the preview from briefly entering the
  320px local side-dock layout before the floating card appears.
- Route the floating card's close button and Escape key through one cleanup
  path, restore focus to the originating toolbar trigger, and clear board,
  create, and composer state so the card reopens with one click.
- Add red-spec coverage for the transient side-dock class, single-action
  close/reopen behavior, and focus restoration; the tests fail on the PR base
  and pass with this fix.
- Align the signed-out balance action with pill-radius controls, remove the
  redundant portal label, delete obsolete radial/reset/search/card picker CSS,
  and clean the two stacked EOF whitespace issues.
- Preserve the intended steady-state overlay behavior and validate the change
  with 389 focused tests, workspace typecheck, guard, diff checks, and Electron
  frame/focus sampling.

* test(e2e): align shared project title assertion with focus mode

- Wait for the file workspace to become visible after first-open materialization.
- Assert the canonical project-title state without requiring the intentionally hidden focus-mode dock to be visible.
- Preserve stale-title rejection and the visible catalog-title check after returning to All Projects.
- Validate with three focused repetitions, guard, workspace typecheck, and the entry-settings CI lane.

* fix(web): stabilize responsive home controls

- Recompute the Home type-pill split when localized labels or intrinsic pill widths change without a container resize.
- Observe the measured pill children and tail so late font layout cannot leave the overflow decision stale.
- Restore composer errors to the reviewed in-flow presentation instead of carrying the unrelated fixed top-chrome toast.
- Add focused coverage for locale-style rerenders and post-render width settling.

* test(e2e): await default home routing in attachment flow

- Wait for the visible deck binding before checking the Home attachment submit lifecycle.
- Use the shared long timeout so grouped CI does not race catalogue readiness.
- Preserve the production submit gate and the attachment add/remove assertions.

* feat(web): add a view-all-comments entry to the comment popover

* feat(web): cap the docked tab dropdown at six scrollable rows

* fix(web): preserve comment and tab menu interaction semantics

- Return focus to the still-open View all comments control when the floating comment panel closes.
- Include border-box borders in the six-row tab menu height so the last row is not clipped.
- Add focused regression coverage for comment focus restoration and menu sizing.

* test(web): await default routing in AMR home flows

- Wait for the cold Home composer to finish binding its default deck route before clicking Send.
- Preserve the existing AMR balance retry and auth-expiry assertions after the new readiness gate.

* fix(web): preserve explicit Home submit routes

* fix(web): defer restored Home plugin apply

* fix(web): close workspace chrome review gaps

- Clamp the Home template menu to six rows and the visible viewport, flipping it above the trigger when needed.
- Reset docked tab-menu state when its route-owned portal disappears and preserve editor-owned keyboard shortcuts.
- Scope the project header account identity, balance, and billing destination to the project workspace while retaining the ambient fallback for unbound local projects.
- Cover tall and short viewports, dock remounts, composer focus, and ambient/project workspace divergence.

---------

Co-authored-by: Cheems <94773058+itscheems@users.noreply.github.com>
Co-authored-by: Amy <1184569493@qq.com>
2026-08-13 11:16:44 +00:00