* feat: add WeChat design system, login-flow skill, and fix API mode tool_calls bug
- Add WeChat design system (design-systems/wechat/) with full brand spec
including color palette, typography, and component rules for chat UI
- Add login-flow skill (skills/login-flow/) for mobile authentication flows
with P0 checklist, example HTML, and i18n registration across 3 locales
- Fix DeepSeek V4 bug: API/BYOK mode (streamFormat=plain) models now receive
a directive to emit only <artifact> HTML blocks and suppress tool_calls,
since plain adapters proxy to external providers that cannot execute tools
* fix: restore full server.ts and WeChat DESIGN.md from ad46d8cd commit
Restore files that were corrupted in PR #1083 head branch.
The WeChat DESIGN.md was reduced to a single line (filename only)
and server.ts was reduced to ~1 line. Both are restored to their
original ad46d8cd state with full content.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: restore full server.ts and WeChat DESIGN.md from ad46d8cd
Restore files corrupted in PR #1083:
- apps/daemon/src/server.ts: restored 7106-line file
- design-systems/wechat/DESIGN.md: restored 301-line WeChat design spec
- skills/login-flow/SKILL.md: restored from local working state
- skills/login-flow/example.html: restored 351-line example HTML
* fix: only suppress tool_calls when streamFormat='plain' explicitly, remove nonexistent assets/template.html
1. streamFormat check now requires explicit 'plain' value instead of defaulting
to 'plain' when undefined. This prevents normal tool-using chat runs from
incorrectly inheriting the API/BYOK tool_calls suppression rule.
2. login-flow SKILL.md: removed reference to assets/template.html since that file
does not exist in the skill bundle and derivePreflight() would inject a hard
instruction to read it before any other tool, causing pre-flight to fail.
* fix: thread streamFormat to composeSystemPrompt in server.ts call
Previously the composeSystemPrompt call at line ~4940 omitted streamFormat,
causing the composer to default to 'plain' and suppress tool_calls even
for tool-using chat runs. Now streamFormat is passed through from the
adapter definition so the API mode rule only fires when streamFormat='plain'
is explicitly set.
* fix: WeChat category metadata, font-family, and login-flow example interactivity
WeChat DESIGN.md:
- Add Category: Social & Messaging metadata so it appears correctly in picker
- Fix font-family declaration: remove invalid -webkit-font-family prefix,
use standard font-family so downstream CSS generation works correctly
skills/login-flow/example.html:
- Add password toggle click handler so show/hide actually works
- Change Apple icon fill from hardcoded #fff to currentColor so it is
visible on light backgrounds
* fix: mirror streamFormat suppression in contracts composer and add WeChat i18n
1. packages/contracts/src/prompts/system.ts: Add streamFormat parameter to
ComposeInput and ComposeInput interface, mirroring the same suppression
rule from daemon prompts/system.ts. When streamFormat='plain' is passed,
a directive is appended telling models not to emit tool_calls and to only
output <artifact> HTML blocks.
2. apps/web/src/i18n/content.{ts,fr,ru}.ts: Add WeChat design system entries:
- Add 'wechat' to DE/FR/RU_DESIGN_SYSTEM_IDS_WITH_EN_FALLBACK arrays
- Add 'wechat' summary to DE/FR/RU_DESIGN_SYSTEM_SUMMARIES
- Add 'Social & Messaging' category to DE/FR/RU_DESIGN_SYSTEM_CATEGORIES
(matching the Category: Social & Messaging metadata in WeChat DESIGN.md)
* fix: thread streamFormat='plain' into web composeSystemPrompt for api mode
* test: focus localized content coverage on missing resources
---------
Co-authored-by: Open Design Contributor <z@open-design.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: mrcfps <mrc@powerformer.com>