docs(readme): redesenha o README com hero em SVG [skip ci]
This commit is contained in:
1 parent
8ce05620e0
commit
13b464b4d6
5 files changed
+403
-647
No files matched your search
+97
-171
@@ -1,210 +1,136 @@
|
||||
<p align="center">
|
||||
<img src="./src/assets/images/logo/PiAgentUiBlack%20%283%29.png" alt="Logo do PiAgentUI" width="760" />
|
||||
</p>
|
||||
<div align="center">
|
||||
|
||||
# PiAgentUI
|
||||
<img src="assets/readme/hero.svg" width="100%" alt="PiAgentUI: workspace desktop e web para sessões reais do Pi Agent, com chat, cards de tool calls e o painel Files, Changes, MCP e Skills">
|
||||
|
||||
**Workspace desktop e web para agentes de código: sessões reais do Pi Agent, chat com streaming, painéis de MCP e skills, terminal, explorador de arquivos e app desktop em Tauri.**
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
[](https://github.com/evandrodevbr/PiAgentUI/actions/workflows/build.yml)
|
||||
[Issues](https://git.evandro.dev.br/evandro/PiAgentUI/issues) · [Changelog](CHANGELOG.md) · [Specs de design](docs/superpowers/specs/)
|
||||
|
||||
[English (US)](./README.md) | **Português (BR)** | [Español](./README.es.md) | [日本語](./README.ja.md)
|
||||
[English](README.md) · **Português (BR)** · [Español](README.es.md) · [日本語](README.ja.md)
|
||||
|
||||
## Sobre
|
||||
</div>
|
||||
|
||||
PiAgentUI é uma interface de chat e um workspace para o runtime do Pi Agent. No lugar de um terminal cru, ele reúne sessões, troca de modelo, tool calls em cards, metadados de servidores MCP, skills agrupadas por origem, slash commands, controles de Git, terminal e explorador de arquivos, como aplicação web ou como app desktop Tauri.
|
||||

|
||||
|
||||
O projeto é Pi-first: sessões, modelos, uso de contexto, tool calls, skills, configuração MCP e slash commands vêm do runtime do Pi sempre que possível. A UI cacheia e enriquece esses dados para apresentação, mas não inventa estado do agente. É um fork e uma reescrita da base OpenCodeUI, e parte dessa herança ainda aparece (veja [Estado atual e limitações](#estado-atual-e-limitações)).
|
||||
## O que é
|
||||
|
||||
PiAgentUI é uma interface de chat e um workspace para o [agente de código Pi](https://www.npmjs.com/package/@mariozechner/pi-coding-agent). Roda como app web servido por uma extensão do Pi ou como app desktop em Tauri 2, e mostra numa janela o que o terminal cru esconde: a lista de sessões, as tool calls, os servidores MCP, as skills e o uso de contexto.
|
||||
|
||||
- Faz streaming das sessões reais do Pi por SSE (`/global/event`) e renderiza Markdown, código (Shiki) e matemática (KaTeX).
|
||||
- Mostra tool calls como cards e o uso de contexto da sessão ativa.
|
||||
- Troca de modelo usando as capacidades que o runtime informa.
|
||||
- Lista os servidores MCP configurados (transporte, comando, URL, origem) e as skills efetivas agrupadas por origem.
|
||||
- Expõe slash commands nativos e dinâmicos, além de controles de Git no composer.
|
||||
- Embute um terminal (xterm.js) e um explorador de arquivos ao lado do chat.
|
||||
- Aceita entrada de voz por um endpoint de STT compatível com OpenAI configurado nas settings.
|
||||
- Idiomas da interface: `en`, `pt-BR`, `es`, `zh-CN`, `hi`, `bn`, `ar` (`src/locales/`).
|
||||
|
||||
## Por que usar
|
||||
|
||||
O PiAgentUI não guarda estado próprio do agente. Sessões, modelos, tools, skills e comandos vêm do runtime do Pi pela extensão, então o que aparece na tela é o que o Pi está rodando.
|
||||
|
||||
Não use se você não roda o Pi: sem a extensão, a interface mostra só o diálogo de conexão com o servidor. Ele também atende um runtime por janela e não tem demo hospedada nem pacote publicado no npm.
|
||||
|
||||
## Como funciona
|
||||
|
||||
```text
|
||||
janela do navegador / webview Tauri
|
||||
|
|
||||
| HTTP /api/* + SSE /global/event + WebSocket
|
||||
v
|
||||
Servidor da extensão Pi (extensions/piagentui-server.ts, Node http + ws)
|
||||
|-- serve o build da UI a partir de dist/ e injeta window.PI_BOOT_DATA {baseUrl, token}
|
||||
|-- grava os dados de conexão em ~/.pi/agent/piagentui-port.json {port, token}
|
||||
|-- exige bearer token em /api/* e restringe o acesso ao loopback por padrão
|
||||
|-- faz a ponte para sessões, modelos, ferramentas, MCP, skills e comandos
|
||||
^
|
||||
| carregado pelo runtime
|
||||
Processo do Pi Agent
|
||||
```
|
||||
|
||||
- Ao iniciar uma sessão, a extensão escuta na porta `58785` (ou na próxima livre) e publica a porta escolhida e um token aleatório no arquivo de descoberta.
|
||||
- `GET /global/health` é aberto; todas as outras rotas `/api/*` exigem `Authorization: Bearer <token>`.
|
||||
- O app Tauri lê o mesmo arquivo de descoberta pelo comando Rust `get_pi_agent_connection`, então o build desktop se conecta ao runtime local sem configuração manual.
|
||||
- `npm run dev` (Vite) serve apenas o front end em desenvolvimento; ele faz proxy de `/api` para `127.0.0.1:4096` removendo o prefixo `/api`. Aponte para um servidor compatível ou use o build servido pela extensão para o fluxo Pi.
|
||||
|
||||
## Stack
|
||||
|
||||
| Área | Escolha |
|
||||
|---|---|
|
||||
| UI | React 19, TypeScript 5.9 |
|
||||
| Build | Vite 8 (rolldown), com `tsc -b` como gate de tipos |
|
||||
| Estilo | Tailwind CSS 4 e design tokens do projeto |
|
||||
| Desktop e mobile | Tauri 2 (Rust 1.85+), alvos Android gerados em `src-tauri/gen` |
|
||||
| Markdown e código | Streamdown, Shiki, KaTeX |
|
||||
| Terminal | xterm.js |
|
||||
| i18n | i18next, locales `en`, `pt-BR`, `es`, `ja`, `zh-CN`, `hi`, `bn`, `ar` |
|
||||
| Testes | Vitest 4, Testing Library, jsdom |
|
||||
| Backend local | Extensão Pi: servidor HTTP Node com `ws` (SSE e WebSocket) |
|
||||
| Gateway (containers) | Roteador Rust (`src-router`, axum) na frente do Caddy |
|
||||
| Pacotes | npm com `package-lock.json` |
|
||||
|
||||
## Requisitos
|
||||
|
||||
- Node.js `>=22` (o CI roda Node 22; verificado localmente em Node 24.20.0)
|
||||
- npm `>=10` (o repositório é npm; `package-lock.json` é a referência)
|
||||
- Rust `1.85+` apenas para buildar o app desktop ou o gateway
|
||||
- Docker apenas para a stack de containers em `docker/`
|
||||
- Pi Agent instalado para ter sessões e modelos reais; sem ele a UI sobe em modo standalone e mostra apenas o diálogo de conexão com servidores
|
||||
- `extensions/piagentui-server.ts` é a extensão do Pi. Ela serve a UI compilada de `dist/` com `http` + `ws` do Node e injeta `window.PI_BOOT_DATA` (URL base e token).
|
||||
- Ao iniciar, escuta na porta `58785` (ou na próxima livre) e grava a porta e um token aleatório em `~/.pi/agent/piagentui-port.json`.
|
||||
- `GET /global/health` é aberto; as outras rotas `/api/*` exigem `Authorization: Bearer <token>`. O socket escuta em `0.0.0.0`, mas cada requisição é checada contra loopback, a menos que o acesso pela LAN em `/api/network/access` esteja ligado (vem desligado).
|
||||
- O app Tauri lê o mesmo arquivo de descoberta pelo comando `get_pi_agent_connection`, então o build desktop conecta no runtime local sem configuração manual.
|
||||
- Em containers, o router em Rust (`src-router/`, axum) fica atrás do Caddy como gateway na frente dos serviços de frontend e backend.
|
||||
|
||||
## Início rápido
|
||||
|
||||
| Ferramenta | Versão | Usada para |
|
||||
|---|---|---|
|
||||
| Node.js | `>=22` (`.tool-versions`: 22.22.0) | tudo |
|
||||
| npm | a que vem com o Node | tudo (`package-lock.json`) |
|
||||
| Rust | `1.85.0` (`.tool-versions`) | app desktop e router do gateway |
|
||||
| Docker Compose | recente | só a stack em containers |
|
||||
| Pi Agent | instalado localmente | sessões e modelos reais |
|
||||
|
||||
```bash
|
||||
git clone https://github.com/evandrodevbr/PiAgentUI.git
|
||||
git clone https://git.evandro.dev.br/evandro/PiAgentUI.git
|
||||
cd PiAgentUI
|
||||
npm ci # 615 pacotes; roda scripts/copy-material-icons.mjs
|
||||
npm run build # tsc -b && vite build -> dist/
|
||||
npm run dev # servidor de desenvolvimento Vite em http://localhost:5173
|
||||
npm ci # o postinstall roda scripts/copy-material-icons.mjs
|
||||
npm run build # tsc -b && vite build -> dist/
|
||||
npm run dev # servidor Vite em http://localhost:5173
|
||||
```
|
||||
|
||||
UI web servida pela extensão Pi (é o caminho que conversa com o runtime Pi de verdade):
|
||||
`npm run dev` é só o front end: ele faz proxy de `/api` para `127.0.0.1:4096` sem o prefixo. Para o fluxo com o Pi, compile antes e deixe a extensão servir `dist/` (o Pi carrega este repositório como pacote pelo campo `pi.extensions` do `package.json`):
|
||||
|
||||
```bash
|
||||
npm run build # a extensão serve o dist/
|
||||
# com o Pi Agent carregando este repositório como pacote Pi (veja "pi" em package.json)
|
||||
cat ~/.pi/agent/piagentui-port.json # {"port": 58785, "token": "..."}
|
||||
npm run build
|
||||
cat ~/.pi/agent/piagentui-port.json # {"port": 58785, "token": "..."}
|
||||
# abra http://127.0.0.1:58785
|
||||
```
|
||||
|
||||
App desktop:
|
||||
Desktop e Android:
|
||||
|
||||
```bash
|
||||
npm run tauri dev # janela de desenvolvimento, usa o servidor Vite
|
||||
npm run tauri build # empacota conforme src-tauri/tauri.conf.json (deb no Linux, dmg, nsis)
|
||||
npm run tauri dev # janela desktop sobre o servidor Vite
|
||||
npm run tauri build # bundles: nsis, dmg, deb (src-tauri/tauri.conf.json)
|
||||
npm run tauri android dev # veja scripts/dev-android.sh
|
||||
```
|
||||
|
||||
Android (veja `scripts/dev-android.sh` e o job de Android no workflow de release):
|
||||
Antes de um PR, `npm run validate` roda typecheck, typecheck da extensão, lint, build e testes; é o gate que o CI roda em `build.yml`.
|
||||
|
||||
```bash
|
||||
npm run tauri android dev
|
||||
```
|
||||
## Configuração
|
||||
|
||||
## Uso
|
||||
A stack em containers foi herdada do deploy do OpenCodeUI. Copie `.env.example` para `.env` antes.
|
||||
|
||||
Rotas locais expostas pelo servidor da extensão. Todas, exceto `/global/health` e a rota SSE, exigem o bearer token do arquivo de descoberta.
|
||||
| Arquivo | Comando | O que faz |
|
||||
|---|---|---|
|
||||
| `docker-compose.yml` | `docker compose up -d` | Stack completa: `gateway` (Caddy + router em Rust, `127.0.0.1:6658` e `6659`), `frontend`, `backend` (`opencode serve`, 4096, limite de 4G de memória). |
|
||||
| `docker-compose.standalone.yml` | `docker compose -f docker-compose.standalone.yml up -d` | Só o front end, para um `opencode serve` já existente. Usa `BACKEND_URL` (padrão `host.docker.internal:4096`) e `PORT` (padrão `3000`). |
|
||||
| `docker-compose.host.yml` | `docker compose -f docker-compose.yml -f docker-compose.host.yml up -d` | Override opcional: o `backend` roda privilegiado, com o socket do Docker e o `/` do host montado em `/host`. |
|
||||
| `docker-compose.build.yml` | `docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build` | Override opcional: compila gateway, frontend e backend localmente a partir de `docker/`. |
|
||||
|
||||
| Rota | Para que serve |
|
||||
|---|---|
|
||||
| `GET /global/health` | Prova de vida, responde `{"status":"ok","pi":"ready"}` |
|
||||
| `GET /global/event` | Stream SSE de eventos (sessões, partes de mensagem, status) |
|
||||
| `GET /api/models` | Lista de modelos com capacidades normalizadas |
|
||||
| `GET /api/sessions` | Lista de sessões |
|
||||
| `POST /api/sessions` | Cria sessão |
|
||||
| `POST /api/sessions/abort` | Aborta o turno em execução |
|
||||
| `GET /api/sessions/:id/messages` | Histórico da sessão normalizado para renderização |
|
||||
| `GET /api/sessions/:id/context` | Uso de contexto da sessão ativa |
|
||||
| `POST /api/messages/send` | Envia mensagem do usuário para uma sessão |
|
||||
| `GET /api/skills` | Skills efetivas agrupadas por origem |
|
||||
| `GET /api/mcp/status` | Servidores MCP configurados (transporte, comando, URL, origem) |
|
||||
| `GET /api/commands/list` | Slash commands built-in e dinâmicos |
|
||||
| `GET /api/agents`, `GET /api/files/list`, `GET /api/permissions/list`, `GET /api/questions/list` | Inventário do runtime para os painéis |
|
||||
| `GET /api/vcs/status`, `/info`, `/branches` | Estado do Git usado pelos controles do composer |
|
||||
| `GET /api/extensions/list` | Catálogo de extensões do painel de extensões |
|
||||
| `GET /api/settings/stt`, `/api/settings/tts` | Configurações de voz (STT/TTS) |
|
||||
| `GET /api/network/access`, `POST /api/network/access` | Chave de acesso em LAN (padrão: só loopback) |
|
||||
<details>
|
||||
<summary>Variáveis de ambiente (só para a stack em containers)</summary>
|
||||
|
||||
A tabela completa de rotas, incluindo as mutações de Git e de extensões, está em [`extensions/piagentui-server.ts`](extensions/piagentui-server.ts). Portas e caminhos podem mudar; o arquivo de descoberta é a fonte de verdade para porta e token.
|
||||
| Variável | Obrigatória | Descrição |
|
||||
|---|---|---|
|
||||
| `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `DEEPSEEK_API_KEY`, `GROQ_API_KEY`, `MISTRAL_API_KEY`, `XAI_API_KEY` | Ao menos uma | Chaves de provedores de LLM repassadas ao container do backend. |
|
||||
| `GATEWAY_PORT` | Não (`6658`) | Porta do host para o ponto de entrada unificado. |
|
||||
| `PREVIEW_PORT` | Não (`6659`) | Porta do host para o ponto de entrada de previews. |
|
||||
| `PREVIEW_DOMAIN` | Não | Domínio separado para previews; o proxy reverso encaminha para `PREVIEW_PORT`. |
|
||||
| `WORKSPACE` | Não (`./workspace`) | Pasta do host montada em `/workspace` no backend. |
|
||||
| `OPENCODE_SERVER_PASSWORD` | Em deploys públicos | Senha do backend e do router. |
|
||||
| `OPENCODE_SERVER_USERNAME` | Não (`opencode`) | Usuário que acompanha a senha acima. |
|
||||
| `PUBLIC_BASE_URL` | Não | URL base pública usada pelo router embutido no gateway. |
|
||||
| `ROUTER_SCAN_INTERVAL` | Não (`5`) | Intervalo de varredura do router. |
|
||||
| `ROUTER_TOKEN_LENGTH` | Não (`12`) | Tamanho dos tokens de rota gerados. |
|
||||
| `ROUTER_PORT_RANGE` | Não (`3000-9999`) | Faixa de portas que o router atende. |
|
||||
| `ROUTER_EXCLUDE_PORTS` | Não (`4096`) | Portas que o router ignora. |
|
||||
| `DOCKER_API_VERSION` | Não (`1.40`) | Versão da API do Docker para o backend; definida no `docker-compose.yml`, não no `.env.example`. |
|
||||
| `USE_CHINA_MIRROR` | Não (`1`) | Opção de build da imagem do backend: usa os mirrors abaixo. |
|
||||
| `APT_MIRROR`, `APT_SECURITY_MIRROR`, `NPM_CONFIG_REGISTRY`, `NODEJS_ORG_MIRROR`, `PIP_INDEX_URL`, `PIP_TRUSTED_HOST` | Não | Mirrors para o toolchain do backend. |
|
||||
| `MISE_INSTALL_URL`, `OPENCODE_INSTALL_URL` | Não | URLs de instalação usadas no build da imagem do backend. |
|
||||
|
||||
Auditar o agente pelo shell também funciona, por exemplo:
|
||||
</details>
|
||||
|
||||
```bash
|
||||
TOKEN=$(node -e "console.log(require(process.env.HOME+'/.pi/agent/piagentui-port.json').token)")
|
||||
curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:58785/api/models | head -c 300
|
||||
```
|
||||
## Estado do projeto
|
||||
|
||||
## Produção e deploy
|
||||
Beta, antes da 1.0 (`0.6.10`), mantido por um desenvolvedor. As releases saem do `release.yml` em tags `v*` (artefatos para Windows, macOS, Linux e Android); o `deploy.yml` publica o build web com `VITE_BASE_PATH=/PiAgentUI/`.
|
||||
|
||||
```bash
|
||||
npm run build # tsc -b && vite build; saída em dist/ (cerca de 14 MB, estático)
|
||||
npm run preview # serve o dist/ localmente para conferência final
|
||||
```
|
||||
- O nome OpenCodeUI ainda não saiu de tudo: o crate do router em Rust é `opencodeui-router`, as imagens são `opencodeui-*`, os APKs Android saem como `OpenCodeUI-*`, os comentários do `.env.example` estão em chinês e o backend Docker roda `opencode serve`, que é do deploy herdado, não do fluxo com a extensão do Pi.
|
||||
- `docker-compose.yml` e `docker-compose.standalone.yml` ainda puxam a imagem upstream `ghcr.io/lehhair/opencodeui-frontend`.
|
||||
- Os testes são de componente e de servidor (Vitest). Não há testes do shell Tauri nem do router em Rust além da compilação, nem teste end-to-end no navegador, nem meta de cobertura.
|
||||
- A entrada de voz depende de um endpoint de STT compatível com OpenAI e não tem teste automatizado no navegador.
|
||||
|
||||
- Hospedagem estática: `dist/` é uma SPA comum. Se for montada em um subcaminho, build com `VITE_BASE_PATH=/subcaminho/ npm run build`.
|
||||
- Container (front end com Caddy): `docker/Dockerfile.frontend` builda a UI em Node 22 e serve pelo Caddy na porta 3000.
|
||||
- Stack completa de containers: `docker-compose.yml` sobe `gateway` (Caddy com o roteador Rust em 6658/6659), `frontend` e `backend`. Copie `.env.example` para `.env` antes. As imagens vêm de `ghcr.io/evandrodevbr/opencodeui-{backend,frontend,gateway}`, publicadas pelos workflows `docker-*`; para buildar localmente use `docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build`.
|
||||
- GitHub Pages: `.github/workflows/deploy.yml` builda o `dist/` com `VITE_BASE_PATH=/PiAgentUI/` e publica a cada push em `main` (na primeira vez, habilite o Pages com origem "GitHub Actions").
|
||||
- Releases desktop e mobile: `.github/workflows/release.yml` roda em tags `v*` e anexa artefatos de Windows, macOS, Linux e Android ao release do GitHub.
|
||||
|
||||
## Estrutura do projeto
|
||||
|
||||
```text
|
||||
extensions/ Extensão Pi: servidor HTTP/WebSocket, store de settings,
|
||||
gerentes de git e de extensões, todos com testes Vitest
|
||||
src/ Front end React (entrada Vite em index.html)
|
||||
├── api/ Clientes HTTP/SSE e pipeline de requisições
|
||||
├── components/ Peças de UI compartilhadas (code blocks, diffs, command palette)
|
||||
├── features/ chat, input, mensagens, ferramentas, sessões, settings, slash commands
|
||||
├── hooks/ sessão, eventos, transcrição, permissões
|
||||
├── locales/ 8 bundles traduzidos
|
||||
├── store/ Stores (sessões, mensagens, layout, tema)
|
||||
└── constants/ URL base da API, chaves de storage, métricas de UI
|
||||
src-router/ Roteador do gateway em Rust (axum), atrás do Caddy
|
||||
src-tauri/ Shell desktop e mobile Tauri 2 (Rust), projeto Android em gen/
|
||||
docker/ Dockerfiles, configs do Caddy, entrypoints
|
||||
scripts/ cópia de ícones, bump de versão, preparação de release, helper Android
|
||||
docs/superpowers/ Specs de design e planos escritos durante a migração
|
||||
```
|
||||
|
||||
## Verificação
|
||||
|
||||
Tudo abaixo foi executado em um clone limpo neste estado do repositório:
|
||||
|
||||
| Comando | Resultado |
|
||||
|---|---|
|
||||
| `npm ci` | 615 pacotes instalados, postinstall copia 266 ícones |
|
||||
| `npm run typecheck` | exit 0 (`tsc -b`, projetos app e extensão) |
|
||||
| `npm run typecheck:extensions` | exit 0 |
|
||||
| `npm run lint` | exit 0 (0 erros, 109 avisos) |
|
||||
| `npm run build` | exit 0, `dist/` com cerca de 14 MB |
|
||||
| `npm run test:run` | 89 arquivos, 319 testes, todos passando |
|
||||
| `npm run validate` | exit 0 (o mesmo gate que o CI roda em `build.yml`) |
|
||||
| `cargo check` em `src-router/` | exit 0 |
|
||||
| `cargo check --manifest-path src-tauri/Cargo.toml` | exit 0 (1 aviso) |
|
||||
| servidor da extensão via HTTP | `/global/health` 200, `/` 200 com `PI_BOOT_DATA`, `/api/models` 200 com token e 401 sem, `/api/sessions`, `/api/sessions/:id/messages`, `/api/sessions/:id/context`, `/api/skills`, `/api/mcp/status`, `/api/commands/list`, `/api/network/access` todos 200, `/global/event` 200 `text/event-stream` |
|
||||
|
||||
Dois detalhes ao rodar a suíte: `npm run test:run` precisa do `dist/` existir, porque o teste do servidor da extensão busca o `index.html` servido, então `npm run build` deve rodar antes (é a ordem em `npm run validate`); e `npm run format:check` hoje acusa 67 arquivos fora do padrão do Prettier, então `npm run check` falha nesse passo mesmo com o gate do CI passando.
|
||||
|
||||
## Estado atual e limitações
|
||||
|
||||
- Projeto ativo de um desenvolvedor, pré-1.0 (`0.6.10`). Chat, sessões, MCP, skills e painéis de comandos funcionam contra um runtime Pi real; algumas áreas ainda mudam rápido.
|
||||
- A herança de nomes da base OpenCodeUI foi limpa só em parte: o crate Rust se chama `opencodeui-router`, as imagens de container são `opencodeui-*`, os comentários do `.env.example` estão em chinês e a stack Docker roda um backend `opencode serve` que pertence ao deploy herdado, não ao fluxo da extensão Pi.
|
||||
- Não há teste do shell Tauri nem do gateway Rust além da compilação; os pacotes desktop e Android só são gerados pelo workflow de release.
|
||||
- A suíte é de componentes e de servidor; não há teste end-to-end de navegador nem limite de cobertura.
|
||||
- `@mariozechner/pi-coding-agent` é devDependency só para tipos (o runtime fornece a API real da extensão) e o npm marca essa linha como depreciada em favor de `@earendil-works/pi-coding-agent`.
|
||||
- O front end conversa com um runtime por janela: o arquivo de descoberta ou um servidor configurado à mão. Não há agregação de múltiplos runtimes.
|
||||
- A entrada de voz existe na UI (`src/hooks/useVoiceTranscription.ts`) e exige um endpoint STT compatível com OpenAI configurado nos settings; não há teste automatizado de navegador para ela.
|
||||
- Sem pacote publicado no npm e sem demo web hospedada; o README e o código assumem um runtime local.
|
||||
|
||||
## Documentação
|
||||
|
||||
| Documento | Conteúdo |
|
||||
|---|---|
|
||||
| [`docs/superpowers/specs/`](docs/superpowers/specs/) | Specs de design da migração para extensão Pi, sessões, STT e controles de Git |
|
||||
| [`docs/superpowers/plans/`](docs/superpowers/plans/) | Planos de implementação e roadmap de contexto, skills e MCP |
|
||||
| [`CHANGELOG.md`](CHANGELOG.md) | Histórico de releases usado pelo workflow de release |
|
||||
| [`docker/`](docker/) | Dockerfiles, configs do Caddy e entrypoints da stack de containers |
|
||||
Issues e pull requests vão para o [issue tracker](https://git.evandro.dev.br/evandro/PiAgentUI/issues); rode `npm run validate` antes de abrir um PR.
|
||||
|
||||
## Licença
|
||||
|
||||
GPL-3.0-only, conforme `package.json` e [`LICENSE`](LICENSE). PiAgentUI é um fork e uma reescrita do OpenCodeUI; os autores originais estão creditados em `src-tauri/Cargo.toml`.
|
||||
GPL-3.0-only, veja [`LICENSE`](LICENSE). O PiAgentUI é um fork retrabalhado do OpenCodeUI; o autor original está creditado em `src-tauri/Cargo.toml`.
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<sub>Feito por <a href="https://evandro.dev.br">Evandro Fonseca Junior</a> · <a href="https://git.evandro.dev.br/evandro">git.evandro.dev.br</a></sub>
|
||||
</div>
|
||||
Reference in new issue
Block a user