Skip to content
Back to skills

Architecture

ASecurity

Documentacao completa da arquitetura do Ravi. Use quando precisar: - Entender como o sistema funciona end-to-end - Modificar componentes existentes - Adicionar novos subsistemas - Debugar fluxos de mensagem - Onboarding no codebase

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 20, 2026
ai-agentsgobashsqlnodeapi

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned October 20, 2026

npx -y skills add filipexyz/ravi --skill architecture --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Architecture?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Architecture
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/filipexyz-architecture/badge)](https://www.skillsdirectory.com/skills/filipexyz-architecture)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ravi-architecture
description: |
  Documentacao completa da arquitetura do Ravi. Use quando precisar:
  - Entender como o sistema funciona end-to-end
  - Modificar componentes existentes
  - Adicionar novos subsistemas
  - Debugar fluxos de mensagem
  - Onboarding no codebase
---

# Ravi - Arquitetura do Sistema

Ravi é um runtime multi-agent com canais via omni, coordenação interna por NATS JetStream,
estado em SQLite e execução por providers plugáveis atrás de um contrato único.

**Repositório:** `<ravi.bot repo>`
**Runtime:** Bun
**DB:** SQLite
**PubSub:** NATS JetStream

## Fluxo Principal de Mensagens

```text
WhatsApp/Discord/Telegram/Matrix
  -> omni API
  -> NATS JetStream MESSAGE
  -> OmniConsumer
  -> ravi.<session>.prompt
  -> RuntimePromptSubscription
  -> RuntimeSessionDispatcher
  -> RuntimeSessionLauncher
  -> RuntimeProvider.startSession(RuntimeStartRequest)
  -> RuntimeEvent stream
  -> RuntimeEventLoop
  -> ravi.session.<session>.runtime/tool/stream/response
  -> Gateway
  -> OmniSender
  -> canal
```

## Fronteira Ravi ↔ Omni

O Ravi decide comportamento operacional; o Omni transporta mensagens e presença para o canal.

Quando debugar sintomas que atravessam a fronteira:

- prove primeiro a última linha confiável no Ravi: routing, session, runtime event, target e payload outbound
- use logs do Omni para observar entrega/transporte, não para mover ownership automaticamente
- não corrija Omni para compensar lifecycle, routing, presence, task ou session state quebrado no Ravi
- só edite Omni ou outro repo externo quando a evidência apontar para contrato/adaptador de transporte e houver autorização explícita

Se o usuário delimitar "o problema é no Ravi", mantenha o patch no Ravi e trate o outro repo como evidência externa.

## Fronteiras Core

### `daemon.ts`

Composition root do processo:

- carrega env de `~/.ravi/.env`
- inicia NATS/JetStream
- inicia omni
- inicia RaviBot
- inicia OmniConsumer e Gateway
- inicia heartbeat, cron e triggers
- controla shutdown global

### `bot.ts`

Composition root do runtime de conversas.

Responsabilidades permitidas:

- construir `RuntimeSessionDispatcher`
- construir `RuntimePromptSubscription`
- construir `RuntimeHostSubscriptions`
- iniciar/parar subscriptions
- expor wrappers estreitos para testes/CLI

Responsabilidades proibidas:

- lógica específica de provider
- montagem de prompt/env/provider request
- autorização de tool/bash/session
- event loop de provider
- regra de fila/interrupção
- regra de task/profile/model

### `runtime/session-dispatcher.ts`

Decide o que fazer com um prompt:

- debounce
- sessão viva vs cold start
- troca de provider
- troca de modelo/effort/thinking
- queue, wake, interrupt
- delivery barrier
- after_task deferral
- limite de concorrência

### `runtime/session-launcher.ts`

Orquestra o start de uma sessão runtime.

Não deve virar saco de responsabilidades. Ele coordena:

- resolução de sessão/agent/provider via `session-resolver`
- resolução task/profile/model via `task-runtime-context`
- montagem do `RuntimeStartRequest` via `runtime-request-builder`
- persistência inicial de provider state
- aceite da task vinculada
- start do `RuntimeEventLoop`

### `runtime/runtime-request-builder.ts`

Compoe o `RuntimeStartRequest` final a partir dos modulos menores:

- `runtime-request-context.ts` — runtime context, tool context e env Ravi
- `runtime-provider-bootstrap.ts` — `prepareSession`, host services e plugins
- `runtime-session-continuity.ts` — resume/fork por provider state
- `runtime-host-attachments.ts` — hooks, spec server e remote spawn
- `runtime-request-builder.ts` — composicao final do start request

Regra: novo provider entra por adapter + capabilities. Nao adicionar branch por provider em
`bot.ts`, `session-launcher.ts` ou `runtime-request-builder.ts`.

### `runtime/host-services.ts`

Bridge de serviços do host:

- dynamic tools
- autorização de tool
- autorização de comando
- autorização de capability
- user input/poll
- session scope
- auditoria de denies

### `runtime/host-hooks.ts`

Bridge de hooks nativos quando o provider suporta:

- pre-tool permission
- bash permission
- sanitize bash
- pre-compact
- AskUserQuestion
- spec/exit plan hooks

### `runtime/host-event-loop.ts`

Traduz eventos do provider para eventos canônicos Ravi:

- `runtime`
- `tool`
- `stream`
- `response`

Também persiste provider session state em `turn.complete`.

## Runtime Provider Contract

O provider é adapter. O Ravi runtime é a fonte de verdade.

Providers built-in registrados em `src/runtime/provider-registry.ts`:

| Provider | Execução | Estado de sessão | Tool permissions | Controle runtime |
|----------|----------|------------------|------------------|------------------|
| `claude` | `sdk` | `provider-session-id` | `ravi-host` | sem `control` nativo |
| `codex` | `subprocess-rpc` | `thread-id` | `ravi-host` | `runtimeControl` habilitado |
| `pi` | `subprocess-rpc` | `file-backed` | `provider-native` | `runtimeControl` habilitado |

Regras de uso:

- Agent escolhe runtime por `agent.provider`; ausência usa o default do registry.
- Agent escolhe modelo por `agent.model`; o formato é provider-specific.
- Para `pi`, selectors que também são provider ids precisam vir como `provider/model`, por exemplo `kimi-coding/kimi-for-coding`.
- Novo runtime entra no registry e declara capabilities; não espalhe branch por provider fora do adapter, registry, model validation ou compatibilidade explícita.

Contrato canônico:

- provider recebe `RuntimeStartRequest`
- provider emite `RuntimeEvent`
- provider declara `RuntimeCapabilities`
- provider pode expor `interrupt`, `setModel` e `control`
- provider não muta task/session/canal diretamente

Documento canônico: `design/runtime-provider-contract.md`

Checklist para novo provider:

1. Implementar `RuntimeProvider` e declarar `RuntimeCapabilities`.
2. Usar `prepareSession` apenas para env/bootstrap/dynamic tools/approvals.
3. Normalizar output nativo para `RuntimeEvent`.
4. Cobrir capability matrix e prepare-session shape nos testes de contrato.
5. Criar testes especificos do provider para normalizacao de eventos.

## Capability Gates

Use `RuntimeCapabilities`, nunca branch solto por provider fora do registry/adapters.

Capabilities importantes:

- `supportsSessionResume`
- `supportsSessionFork`
- `supportsPartialText`
- `supportsToolHooks`
- `supportsHostSessionHooks`
- `supportsPlugins`
- `supportsMcpServers`
- `supportsRemoteSpawn`
- `toolAccessRequirement`
- `legacyEventTopicSuffix`

## Model Switching

A troca de modelo é estratégia runtime:

- `direct-set`: handle suporta `setModel`
- `restart-next-turn`: precisa reiniciar antes do próximo turno

Código: `runtime/model-switch.ts`

Não faça branch por provider para isso.

## Router / Sessions

Resolução de rota:

1. `thread:<id>`
2. grupo/contato
3. instance default agent
4. global default agent

Session key segue o formato:

```text
agent:<agentId>:main
agent:<agentId>:dm:<phone>
agent:<agentId>:whatsapp:group:<groupId>
agent:<agentId>:whatsapp:main:group:<groupId>:thread:<threadId>
```

O runtime autoritativo é a sessão no DB + provider state persistido.

## Tasks / Profiles / Workflow

Fronteira obrigatória:

- `task` executa
- `profile` define protocolo local da task
- `workflow` coordena nodes/edges/readiness/run state

Invariantes:

- `parentTaskId` não é scheduling
- `launch plan` fica na task
- profile não coordena workflow

## Plugins / Skills

Plugins internos ficam em `src/plugins/internal`.

Build:

```bash
bun run build
```

Em source/dev, o Ravi descobre `src/plugins/internal/**` direto do filesystem.
No pacote publicado, o build gera `dist/bundle/internal-plugins.json` para manter as skills internas autocontidas.
Não versionar registry gerado de skills no source.

Skills nativas de runtime podem ser sincronizadas para ambientes de provider quando suportado.

## Validação Recomendada Antes De Fechar Mudança Core

```bash
bun test src/runtime/model-switch.test.ts src/runtime/provider-contract.test.ts src/runtime/index.test.ts
bun test src/bot.runtime-guards.test.ts src/delivery-barriers.test.ts
bun run typecheck
bun run build
```

Se mexer em provider adapter, rode também o teste específico do provider alterado.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.