feat(wake): identita' propria per il turno di risveglio #18

Merged
claudia merged 1 commit from feat/wake-own-identity into main 2026-09-15 09:57:03 +00:00
Owner

Problema

Il turno di risveglio di fine task arriva in chat con nome e avatar dell'owner della sessione (la faccia di Marcello sul report del runner). Non è un bug nostro: OpenClaw popola sender solo da un profilo autenticato, e il campo non è passabile da chat.send. Con la password condivisa il waker non ha profilo → nessun sender → la UI ripiega sull'utente della chat.

Soluzione

GW_WAKE_WS_IDENTITY_EMAIL (+ _HEADER / _XFF): il connect si presenta con gli header trusted-proxy invece della password. OpenClaw crea/riusa un profilo utente dedicato e il bubble prende nome e avatar di quello.

Cose che non sono ovvie

  • L'XFF è obbligatorio. Senza X-Forwarded-For il gateway non tratta la richiesta come proxata e risponde NOT_PAIRED / device identity required, anche con allowLoopback: true. Verificato sul gateway reale.
  • L'identità nasce senza scope. Va elencata in openclaw.json, sennò chat.send con provenance torna FORBIDDEN missing scope: operator.write:
    "gateway": { "auth": { "identityScopes": {
      "agent-runner@soltea.it": ["operator.admin"] } } }
    
    Sono grant di sola sessione: non creano pairing né toccano i device.
  • Fallback. Se il connect d'identità fallisce (non mappata, header diverso, istanza in auth mode token) si ripiega sulla password con un warning: meglio un esito con la faccia sbagliata che un esito perso.
  • ⚠️ Deroga consapevole. La doc di OpenClaw consiglia la password per i client interni che non passano dal reverse proxy. Il rischio pratico non cambia (il waker ha già la password, quindi già admin), ma è una porta lasciata socchiusa per nginx. Documentato nel README.

Compatibilità

Default invariato: campo vuoto = percorso storico a password.

Test

100 passed (erano 96): 4 nuovi sul percorso d'identità — header mandati, password omessa, header configurabile, fallback su fallimento.

Ricreato anche il venv di sviluppo, che puntava a un python3.11 non più presente sulla macchina.

🤖 Generated with Claude Code

## Problema Il turno di risveglio di fine task arriva in chat con **nome e avatar dell'owner della sessione** (la faccia di Marcello sul report del runner). Non è un bug nostro: OpenClaw popola `sender` **solo** da un profilo autenticato, e il campo non è passabile da `chat.send`. Con la password condivisa il waker non ha profilo → nessun `sender` → la UI ripiega sull'utente della chat. ## Soluzione `GW_WAKE_WS_IDENTITY_EMAIL` (+ `_HEADER` / `_XFF`): il connect si presenta con gli header trusted-proxy invece della password. OpenClaw crea/riusa un profilo utente dedicato e il bubble prende nome e avatar di quello. ## Cose che non sono ovvie - **L'XFF è obbligatorio.** Senza `X-Forwarded-For` il gateway non tratta la richiesta come proxata e risponde `NOT_PAIRED / device identity required`, anche con `allowLoopback: true`. Verificato sul gateway reale. - **L'identità nasce senza scope.** Va elencata in `openclaw.json`, sennò `chat.send` con provenance torna `FORBIDDEN missing scope: operator.write`: ```json5 "gateway": { "auth": { "identityScopes": { "agent-runner@soltea.it": ["operator.admin"] } } } ``` Sono grant di sola sessione: non creano pairing né toccano i device. - **Fallback.** Se il connect d'identità fallisce (non mappata, header diverso, istanza in auth mode `token`) si ripiega sulla password con un warning: meglio un esito con la faccia sbagliata che un esito perso. - ⚠️ **Deroga consapevole.** La doc di OpenClaw consiglia la password per i client interni che non passano dal reverse proxy. Il rischio pratico non cambia (il waker ha già la password, quindi già admin), ma è una porta lasciata socchiusa per nginx. Documentato nel README. ## Compatibilità Default invariato: campo vuoto = percorso storico a password. ## Test 100 passed (erano 96): 4 nuovi sul percorso d'identità — header mandati, password omessa, header configurabile, fallback su fallimento. Ricreato anche il venv di sviluppo, che puntava a un `python3.11` non più presente sulla macchina. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Con la sola password condivisa il `chat.send` di fine task arriva senza
`sender`: la Control UI ripiega su nome e avatar dell'owner della sessione,
quindi il report del runner porta la faccia dell'umano. Il campo non e'
passabile da `chat.send` — OpenClaw popola `sender` solo da un profilo
autenticato.

Aggiunge GW_WAKE_WS_IDENTITY_EMAIL (+ _HEADER / _XFF): il connect si presenta
con gli header trusted-proxy invece della password, OpenClaw crea/riusa un
profilo dedicato e il bubble prende nome e avatar suoi.

Note:
- l'XFF e' obbligatorio: senza, il gateway non tratta la richiesta come
  proxata e risponde NOT_PAIRED / device identity required anche con
  allowLoopback attivo;
- l'identita' trusted-proxy nasce senza scope: va elencata in
  gateway.auth.identityScopes con operator.admin, sennò chat.send con
  provenance torna FORBIDDEN;
- se il connect d'identita' fallisce si ripiega sulla password con un
  warning: l'esito del task deve arrivare comunque.

Default invariato (campo vuoto = percorso storico a password).
Ricreato anche il venv di sviluppo, che puntava a un python3.11 non piu'
presente sulla macchina.
claudia deleted branch feat/wake-own-identity 2026-09-15 09:57:03 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Soltea-org/soltea-agent-gateway!18
No description provided.