---
id: "0147"
title: "matrix-client-pc scaffold: Wails + React+Mantine + login MAS"
status: pending
priority: high
created: 2026-05-24
related_flows: ["0010"]
related_issues: ["0148", "0162"]
dependencies: ["0162"]
tags: [matrix, wails, react, mantine, mas, oidc, scaffold]
---

## Objetivo

Crear el esqueleto de la app `projects/element_agents/apps/matrix_client_pc/` con Wails v2 (Go) + React+Vite+Mantine+`@fn_library` y dejar funcionando el login MAS OIDC contra `mas-...organic-machine.com`. Resultado: arrancar binario -> redirect navegador a MAS -> volver con token -> mostrar perfil del usuario.

## Tareas

1. `wails init -n matrix_client_pc -t react-ts` dentro de `projects/element_agents/apps/`.
2. Sub-repo Gitea: `git init -b master` + crear repo `dataforge/matrix_client_pc` + push inicial.
3. `app.md` con frontmatter (lang=go, framework=wails, tags incluyen `matrix` + `service`? — NO, es app cliente, sin tag service).
4. `go.mod` con deps: `wails/v2`, `mautrix-go`, `keyring`.
5. Reemplazar template frontend por React+Mantine+`@fn_library`. Symlink `frontend/src/fn_library` -> `../../../../../frontend/functions/ui/` (o copia si symlink no funciona en build).
6. Backend Go (`backend/`):
   - `wails.json` con `bindings` para `MatrixService`.
   - `MatrixService.Login() -> URL` (devuelve URL MAS OIDC).
   - `MatrixService.HandleCallback(code) -> User`.
   - `MatrixService.GetSession() -> *Session` (lee de keyring).
   - `MatrixService.Logout()`.
7. Frontend React: layout `AppShell` Mantine, pagina `Login.tsx` con boton "Sign in with Matrix" -> abre URL MAS en navegador del SO.
8. Persistencia tokens en keyring SO (`github.com/zalando/go-keyring`).
9. Loopback HTTP local (`127.0.0.1:0`, puerto libre aleatorio) para recibir callback OIDC.
10. Test e2e basico: arrancar app, login con `@dev-pc:matrix-af2f3d.organic-machine.com`, ver perfil.

## Funciones del registry a crear (delegar a fn-constructor)

- `matrix_client_init_go_infra` — `mautrix.NewClient(homeserver, userID, accessToken) -> *Client, error`. Wrapper que configura SQLite store + crypto store.
- `mas_oidc_flow_go_infra` — `StartFlow(masURL) -> authURL, codeVerifier, state`. `ExchangeCode(code, codeVerifier) -> *Token`.
- `keyring_save_token_go_infra` / `keyring_load_token_go_infra` — wrappers `go-keyring`.

## Acceptance

- [ ] Binario Wails compila para linux/amd64 + windows/amd64.
- [ ] `wails dev` arranca con hot-reload.
- [ ] Login MAS OIDC end-to-end: boton -> navegador -> consent -> callback -> perfil visible.
- [ ] Token persistido entre re-arranques (no re-login si token vigente).
- [ ] `app.md` con `uses_functions` que apunta a las 3 funciones nuevas.
- [ ] Sub-repo `dataforge/matrix_client_pc` creado con commit inicial.

## Notas

- MAS URL: leerla de `.well-known/matrix/client` del homeserver para no hardcodear.
- Refresh token: MAS usa OAuth 2.0 estandar — implementar refresh proactivo (~5min antes de expiry).
- Gotcha: en Windows, `wails dev` requiere WebView2 instalado.
