Metadata-Version: 2.5
Name: liberty-embed
Version: 0.1.1
Summary: Liberty Embed para o backend da app: valida o ticket do host, abre a sessão, calcula permissões e protege as rotas.
Author: Liberty TI
License-Expression: LicenseRef-Proprietary
Keywords: embed,iframe,jwt,liberty,tenant
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.13
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: pyjwt[crypto]<3,>=2.8
Provides-Extra: dev
Requires-Dist: fastapi>=0.110; extra == 'dev'
Requires-Dist: httpx2>=2; extra == 'dev'
Requires-Dist: jsonschema>=4.20; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: python-multipart>=0.0.9; extra == 'dev'
Requires-Dist: pyyaml>=6; extra == 'dev'
Requires-Dist: uvicorn>=0.30; extra == 'dev'
Provides-Extra: fastapi
Requires-Dist: fastapi>=0.110; extra == 'fastapi'
Provides-Extra: yaml
Requires-Dist: pyyaml>=6; extra == 'yaml'
Description-Content-Type: text/markdown

# liberty-embed

Lado backend da app da Liberty no Liberty Embed: valida o ticket que o sistema do hospital assina,
cria o usuário no tenant, calcula as permissões, emite a sessão e protege as rotas. Traz também a
linha de comando `liberty-embed`, que o integrador usa em qualquer linguagem.

```bash
pip install "liberty-embed[fastapi,yaml]"    # backend da app
pipx install liberty-embed                   # só a linha de comando
```

## Backend FastAPI

```python
import os

from fastapi import Depends, FastAPI
from liberty_embed import Actor, EmbedService, Registry, SessionManager, current_actor
from liberty_embed.fastapi import mount_embed, require_perm

service = EmbedService(
    app_id="insight-agents",
    registry=Registry.from_file("registry.json"),
    sessions=SessionManager(app_id="insight-agents", private_key_pem=os.environ["EMBED_SESSION_PRIVATE_KEY"], kid="insight-agents-1"),
    # O que cada papel pode fazer na app. O contrato do tenant ainda filtra.
    policy={
        "gestao": {"chat.use", "history.read", "documents.export"},
        "medico": {"chat.use", "history.read", "context.read", "documents.write"},
    },
)

app = FastAPI()
mount_embed(app, service)  # POST /api/embed/v1/session, GET /api/embed/v1/bootstrap, /.well-known/*


@app.post("/api/chat/stream")
async def chat(actor: Actor = Depends(require_perm("chat.use"))):
    return {"tenant": current_actor().tenant_id}  # current_actor() vale em qualquer camada da request
```

A permissão efetiva é contrato do tenant ∩ política do papel ∩ `scope` do ticket. Toda rota de
produto leva `require_perm`; esconder botão no front não protege nada.

Em produção, troque os stores em memória pelos SQL (`SqlUserStore`, `SqlReplayStore`,
`SqlAuditSink`), com um schema por tenant: `liberty-embed schema <tenant>` gera a migração.

## Linha de comando

| Comando | Faz |
| --- | --- |
| `liberty-embed keys --kid <kid> --out <pasta>` | Gera o par ES256: PEM privado e `.jwks.json` público |
| `liberty-embed registry new --kit --app <app> -o registry/dev/host-simulado.yaml` | Libera a app para o host simulado (`npx @libertyti/embed-kit`) |
| `liberty-embed registry new --tenant <host> --origin <origem> --jwks-uri <url> --app <app> -o teste.json` | Um tenant com um host, um ambiente e uma app. `--jwks-file` no lugar de `--jwks-uri` grava o JWKS dentro do catálogo |
| `liberty-embed registry compile <pasta ou arquivos> -o registry.json` | Junta os arquivos de tenant no catálogo que a app carrega |
| `liberty-embed registry check registry.json` | Valida o catálogo |
| `liberty-embed schema <tenant>` | SQL do schema do tenant |
| `liberty-embed ticket inspect <ticket>` | Mostra header e claims e aponta problema de formato |
| `liberty-embed ticket verify <ticket> --registry registry.json --app <app> --host <host>` | Valida como a app valida, buscando o JWKS do host |

## Testar sem um hospital

```bash
liberty-embed keys --kid insight-agents-dev-1 --out .dev-keys      # o PEM vai para EMBED_SESSION_PRIVATE_KEY
liberty-embed registry new --kit --app insight-agents -o registry/dev/host-simulado.yaml
liberty-embed registry compile registry/dev -o registry.json
APP_ID=insight-agents APP_URL=http://localhost:3100/embed npx @libertyti/embed-kit
```

Abra <http://localhost:5170> e clique em **Abrir app**. O front da app usa o
[`@libertyti/embed-app`](https://www.npmjs.com/package/@libertyti/embed-app).

O passo a passo completo está no console da Liberty: Docs → Liberty Embed → Como usar.
