feat(identity-wallet): add perform_did_ceremony Tauri command and relay client extensions
Subcomponent A (Task 1): Extended RelayClient with three new methods:
- get(path): sends GET request to relay, returns raw Response for caller inspection
- post_with_bearer(path, body, token): sends POST with Bearer auth header
- base_url(): const fn exposing compile-time relay URL (localhost:8080 debug, relay.ezpds.com release)
Subcomponent B (Tasks 2-4): Added perform_did_ceremony orchestration command
- Step 1: Get or create device P-256 key (rotation key)
- Step 2: Fetch relay's active signing key via GET /v1/relay/keys
- Step 3: Build signed DID PLC genesis op with external signer callback
- Step 4: Retrieve pending session token from Keychain
- Step 5: POST signed genesis op to relay at /v1/dids with Bearer auth
- Step 6: Overwrite session-token in Keychain with upgraded token
- Step 7: Persist DID in Keychain for subsequent app sessions
Added supporting types:
- RelaySigningKey: deserializes GET /v1/relay/keys response (camelCase)
- CreateDidRequest: serializes POST /v1/dids request body (camelCase)
- CreateDidResponse: deserializes POST /v1/dids response (camelCase)
- DIDCeremonyResult: success result with DID field (camelCase)
- DIDCeremonyError: typed error enum with SCREAMING_SNAKE_CASE serialization
Added 8 serialization tests covering all DIDCeremonyError variants and DIDCeremonyResult,
verifying the TypeScript-facing serialization contracts. All tests pass.
Verifies MM-146.AC3.1 through MM-146.AC3.7 (success and failure paths).