weishu
|
6066f20c20
|
feat(ios): zh-CN localization + catalog dedupe (A-M5)
Part 1 — Simplified Chinese localization of the iOS app layer:
- ios/Hapi/Resources/Localizable.xcstrings: hand-authored String Catalog
(395 keys, zh-Hans; en implicit as source). Terminology mined from
web/src/lib/locales/zh-CN.ts (会话/新建会话/权限模式/允许/拒绝/工作树/
机器/语音输入/用量/草稿夹 …).
- Mechanical edits only: merged multi-part string concatenations into
single LocalizedStringKey literals, converted ternary/plain-String user
copy to String(localized:), switched helper params (detailRow,
DashboardCard, optionPicker, notice) to LocalizedStringKey.
- LocalizedNoticeMapper (app layer): display-point translation of the 27
known HapiKit-emitted strings (ChatInteractor notices, dictation errors,
window-sync warnings, files fallbacks, worktree-name validation) with
verbatim passthrough for server-originated text; package stays
language-free.
- Deliberately untranslated (web parity / non-copy): event rows
(EventPresentation — web renders presentation.ts verbatim), catalog
option labels (Default/Auto/Sonnet/permission modes — web shows them
verbatim), tool names, code-like titles (grep(pattern:), MCP:, Skill,
Task), unit suffixes (B/KB/MB, m/h/d/w), decorative separators.
- Language row wired: AppLanguage gains .system (follow system, new
default); explicit picks write the AppleLanguages override, Follow
system removes it; footer notes a relaunch applies it (no supported
in-place SwiftUI locale swap).
- project.pbxproj: zh-Hans added to knownRegions.
Part 2 — #39 catalog dedupe (HapiProtocol):
- NewSessionCatalogs.claudeModels/claudeEfforts now derive from
ClaudeModels/ClaudeEfforts (single source shared with ModelCatalog);
codexReasoningEfforts stays own data (web CODEX_REASONING_EFFORT_OPTIONS
minus max); effortLabel delegates to ModelCatalog.capitalizedFirst.
- New CatalogTests lock test for the derived option lists.
Gate: bash ios/scripts/linux-test.sh — 459 tests green.
|
2026-08-18 16:04:03 +08:00 |
|
weishu
|
a4355d1837
|
feat(ios): read-only chat assembly (A-M2f)
Wires the merged M2 pieces into a usable pair -> list -> live chat flow:
- pbxproj: link HapiUI into the app target (UUIDs C7/C8, mirroring the
existing HapiProtocol/HapiClient product references; only project change).
- HubSession: MessageWindowControllers registry + per-chat ChatSession
factory with in-memory per-session SSE resume cursors and scene-phase
forwarding to the active chat.
- ChatSession (app): session-scope SSEClient while the chat is open;
window opened/activated before subscribing; a single consume task awaits
every event into the window actor, giving Android-channel-equivalent
arrival-order ingestion; session-updated and friends route through the
shared SyncEventRouter (detail patching), session-removed clears the
window, a gap handshake triggers full resync + detail refetch + catch-up
tail sync; stop hands the cursor back for seamless reopen.
- ChatPipeline (HapiClient): actor running the reduction path off-main -
queued-row filter, normalization memoized by row instance identity,
reduce + buildVisibleChatBlocks with previousGroups-stable group ids.
- ChatModel: window state + detail agentState + machine labels -> serial
~100 ms-coalesced pipeline loop (first run immediate, publishes strictly
ordered), header title cascade, loading/empty/error states, loadOlder /
retry, last-seen stamping on every update.
- ChatView: bottom-anchored ScrollView/LazyVStack (defaultScrollAnchor +
scrollPosition(id:)), auto-stick at bottom, new-messages pill, top
sentinel paging with documented scroll re-anchoring, degraded banners.
- Block views: user bubble w/ attachment chips, agent markdown, collapsed
reasoning, tool cards (knownTools.tsx-parity presentation, status chip,
read-only permission row w/ pending banner, per-tool bodies: terminal,
before/after edits, write content, unified-diff detection -> DiffTextView,
checklists, read-only questions, pretty-JSON fallback, children rail),
tool groups, centered event rows (presentation.ts port), cli output,
generated images (authed bytes + in-memory cache + full-screen viewer),
codex review verdict card.
- Navigation/links: session list now pushes ChatView; app-level
\.hapiOpenURL handler (https/http -> SFSafariViewController, custom
schemes confirm first, hapi-file:// -> M4 placeholder) + theme injection.
- Tests: ChatPipelineTests drive the runner with fixture-derived windows
(stable ids, memo-stable recomputes, queued filter, group-id stability
across an older-page arrival).
- README: M2f app-layer description.
|
2026-08-17 20:55:36 +08:00 |
|