diff options
| author | soryu-co <bot@soryu.co> | 2026-04-24 16:45:51 +0000 |
|---|---|---|
| committer | soryu-co <bot@soryu.co> | 2026-04-24 16:45:51 +0000 |
| commit | 105730ceaa292b1e3589c23d5aad8f35ccf04b8e (patch) | |
| tree | 6cf0c05e911cf62e3cd102377a4e24876b2cb064 /frontend/src/components | |
| parent | 8f8e3b54cbecf51ce6a87e9e028caaad428879be (diff) | |
| download | soryu-105730ceaa292b1e3589c23d5aad8f35ccf04b8e.tar.gz soryu-105730ceaa292b1e3589c23d5aad8f35ccf04b8e.zip | |
Makima iOS M3-M8 — Home, Tasks, WebSocket, notifications, polish
Extends the M2 auth scaffold with the rest of the v1 surface area. All
milestones from docs/ios-v1-plan.md land here.
M3 — Composite Home dashboard
- HomeStore (@Observable): parallel fetch of contracts, daemons, directives,
tasks, latest listen session. Each card degrades independently on error.
- HomeView: NavigationStack routing to Contracts, Tasks, Daemons, Directives,
Listen, and per-item detail views. Pull-to-refresh.
- HomeCards: SectionCard chrome + Contracts/Daemons/Directives/Listen/
RecentTasks cards with StatusDot, CountPill, relative-time helpers.
M4 — Contracts + Tasks
- ContractsListView: filter (active/completed/archived/all), sorted by
updatedAt.
- ContractDetailView: phase card + per-contract tasks.
- TasksListView: status filter pills.
- TaskDetailView: metadata card, completion-gate card (rendered only when
<COMPLETION_GATE> present in output), output card that merges polled body
with live WS events. Polls every 8s as a fallback when WS is offline.
M5 — WebSocket + markdown/code rendering
- TaskWebSocket: URLSessionWebSocketTask wrapper for
/api/v1/mesh/tasks/subscribe. Wire messages match mesh_ws.rs
(subscribeAll / subscribe / subscribeOutput / taskUpdated / taskOutput /
error). Exponential-backoff reconnect (1s -> 30s cap), status callback
feeds the masthead WS pill.
- CompletionGate: parses <COMPLETION_GATE>…</COMPLETION_GATE> into
{ready, reason, progress, blockers}. CompletionGateView renders it as a
status card with dashed accent border (ok/warn tint).
- MarkdownBlocks: hand-rolled split-on-fences renderer. Prose blocks via
AttributedString(markdown:), code blocks via a monospaced, horizontally-
scrollable CodeBlockView with optional language chip.
- TaskOutputRenderer: merges polled body + streamed LIVE// events with
per-kind colour (assistant / tool_use / tool_result / error).
M6 — Directives, Daemons, Listen (read-only)
- DirectivesListView: status dot (pending -> warn), goal preview. Notes
that answering questions is web-only in v1.
- DaemonsListView: online/total, heartbeat relative time, task concurrency.
- ListenHistoryView: session preview list; tolerates 404 if the endpoint
isn't deployed on the user's instance. Notes that live listen is
web-only in v1.
- ScreenShell: shared chrome (back chevron, title, WS pill, grid bg) for
all detail screens.
M7 — Notifications + deep links
- NotificationCenterBridge: requests .alert/.badge/.sound auth on first
launch; fires local notifications on task-done/failed/blocked and
directive-question events with a makima:// deepLink in userInfo.
- DeepLink enum: parses makima://task/<uuid>, makima://contract/<uuid>,
makima://directive/<uuid>. Wired in MakimaApp via .onOpenURL; AppState
holds a pendingDeepLink for consumers.
- URL scheme registered in project.yml's CFBundleURLTypes.
M8 — Polish
- RELEASING.md: pre-flight checklist, xcodebuild archive/export flow,
ExportOptions.plist template, App Store submission checklist.
- README: full 'what's implemented' matrix, architecture overview, deep-link
reference, privacy statement.
M2 bug fixes rolled in
- ListEnvelope<Item>: generic decoder for the daemons/tasks/contracts/
directives/orders wrapper endpoints ({items:[...], total:N}). Falls back
to a bare array for resilience.
- AuthStore: now uses ListEnvelope<Daemon> for the probe (was bare array).
- rotateKey: accepts both apiKey and api_key casings in the response.
- Logo: adds missing import UIKit.
Tests added
- CompletionGateTests: parse ready=true, blockers list, nil on missing.
- MarkdownBlocksTests: prose/code splitting, pure prose.
- DeepLinkTests: task/directive parsing, wrong-scheme rejection, unknown
host rejection.
- ListEnvelopeTests: daemons wrapper, tasks wrapper, bare-array fallback.
- APIClientTests: updated stub to return the envelope shape.
Not wired (deferred to v1.1 per plan)
- Supabase OAuth (Authorization: Bearer path)
- APNs push via services/push-proxy/
- Answer directive questions in-app
- Live Listen with mic + transcription
- Speak (TTS)
- Files editor, mesh merge UI, worktree diff viewer, daemon reauth flow
File count: 34 new/modified, ~2670 LOC.
Diffstat (limited to 'frontend/src/components')
0 files changed, 0 insertions, 0 deletions
