weishu
|
fa91f06662
|
feat(ios): new session flow (A-M3c)
Port of the tested Android NEW SESSION reference (B-M3d) to iOS:
- HapiProtocol: NewSessionCatalogs (static claude models/efforts + codex
reasoning-effort fallback, exact Android data) in Catalog/; CodexModelSummary
+ CodexModelsResponse wire types (shared/src/apiTypes.ts).
- HapiClient: machineCodexModels endpoint (GET /api/machines/:id/codex-models,
rpc_target_missing surfaces as APIError); NewSession/NewSessionForm.swift —
typed Codable draft (tolerant decode) + NewSessionLogic: exact spawn body
per SpawnSessionRequestSchema (yolo incl. false for non-grok/non-codex-family,
permissionMode incl. 'default' for grok+codex-family, sessionType always,
trimmed-or-absent worktreeName, serviceTier only while fast tier visible,
collaborationMode only when plan, model only claude/codex), parent-path
derivation, suggestion filtering, recent-path LRU(8), worktree-name
validation, codex catalog helpers, draft sanitization.
- App: Features/NewSession (NewSessionModel @Observable orchestration —
machine preselect last-used, 250 ms debounced list-directory autocomplete
with per-parent cache, exists probe with worktree-blocking / simple
two-tap-create, codex catalog fetch + selection reconcile, UserDefaults
draft/prefs per hub; NewSessionView Form UI with per-flavor option matrix);
session-list "+" toolbar button on HomeView presents the sheet, success
dismisses and pushes the chat.
- Tests: spawn-body exactness (4 configs, canonical JSON), parent query,
suggestions, LRU, worktree validation, fast-tier detection, reasoning-effort
normalization, draft sanitize + tolerant decode; codex-models endpoint
request/error construction.
|
2026-08-18 10:03:05 +08:00 |
|
weishu
|
1f0ec6184d
|
feat(ios): HapiClient API transport + auth (A-M1b)
APIClient (final class, Sendable) with typed endpoints for the M2/M3 REST
surface behind an HTTPPerforming seam; actor AuthManager with single-flight
JWT refresh (POST /api/auth), proactive refresh 10 min before exp, terminal
authFailed state, and 401 -> refresh -> retry-once wiring per
docs/api/client-contract/auth.md; Keychain credential store (per-hub records
under run.hapi.companion) with CredentialStoring seam + in-memory double;
HubRegistry (ordered hubs + active hub in injectable UserDefaults, origin
normalization); payload-only JWT decoding; APIError {status, code, body}
parsing per errors.md; minimal multipart builder for M4c dictation; 256 MB
URLCache session for generated images.
Request/response wire models (SendMessageRequest, PermissionApproveRequest,
SpawnRequest/SpawnResponse, MessagesQuery, envelopes, RPC-wrapped shapes)
join HapiProtocol/Models mirroring shared/src/apiTypes.ts.
swift-testing coverage: JWT decode (padding/garbage/hostile exp), auth
single-flight (8 concurrent callers -> one exchange), 401 retry-once and
terminal paths, APIError body parsing, endpoint request construction
byte-checks (cursor queries, deliveryMode body, answers formats, explicit
null model reset) via a recording performer, hub URL normalization,
multipart bytes.
|
2026-08-17 15:20:03 +08:00 |
|