…s — Phase 2c
BREAKING (intentional, approved): removes the last two hand-written result-type
mirrors from client-types.ts. wait and alert are genuinely dynamic — wait's
daemon data is toDaemonWaitData's Record, and alert's iOS path is a generic
runner Record — so per the typed-result doctrine they should be the untyped
CommandRequestResult, not an invented closed shape.
- delete WaitCommandResult and AlertCommandResult from client-types.ts; the
client.command.wait/alert methods now return CommandRequestResult.
- drop their public exports from index.ts and the now-unused AlertInfo import.
- the android-lifecycle integration test that read the typed alert.alert.source
now casts the untyped bag.
This completes the result-type half of the client-types.ts mirror deletion (the
13 closed commands already live in src/contracts/* via CommandResultMap). The
Options-type half (deriving from inputSchema) is a separate follow-up.
Verified: tsc, oxfmt + oxlint --deny-warnings, fallow audit clean, Layering
Guard empty, 476 client/contracts/mcp tests pass.
What (breaking — intentional)
Phase 2(c): removes the last two hand-written result-type mirrors from
client-types.ts.waitandalertare genuinely dynamic —wait's daemon data istoDaemonWaitData'sRecord, andalert's iOS path is a generic runnerRecord— so per the typed-result doctrine they should be the untypedCommandRequestResult, not an invented closed shape.WaitCommandResult/AlertCommandResult;client.command.wait/alertnow returnCommandRequestResult.index.tsand the now-unusedAlertInfoimport.alert.alert.sourcenow casts the untyped bag.This is a breaking public-API removal (those two exported type names disappear) — done now that you've green-lit breaking changes in this pass. It completes the result-type half of the mirror deletion; the 13 closed commands already live in
src/contracts/*viaCommandResultMap. The Options-type half (deriving frominputSchema) is a separate follow-up.Verification
tsc --noEmit0;oxfmt+oxlint --deny-warningsclean;fallow audit --base origin/mainclean;vitestclient/contracts/mcp → 476 pass; Layering Guard empty.