Referência de Tipos de Entradas

Esta página resume os kinds de entrada disponíveis e aponta para suas referências detalhadas de módulos e sistemas.

Os blocos YAML e Lua são fragmentos de referência, não uma única aplicação. IDs do registro, credenciais, objetos de dados e helpers como get_users ou delete_user são ilustrativos; consulte as páginas de módulos vinculadas para ver os contratos completos de retorno e erro.

Entradas referenciam umas às outras usando o formato namespace:name. O registro automaticamente conecta dependências baseado nessas referências, garantindo que recursos sejam inicializados na ordem correta.

Veja Também

Runtime Lua

Tipo Descrição
function.lua Ponto de entrada de função Lua
process.lua Processo Lua de longa duração
workflow.lua Workflow Temporal (determinístico)
library.lua Biblioteca Lua compartilhada
module.lua Interface de módulo Lua
function.lua.bc Bytecode de função pré-compilado
library.lua.bc Bytecode de biblioteca pré-compilado
process.lua.bc Bytecode de processo pré-compilado
workflow.lua.bc Bytecode de workflow pré-compilado
- name: handler
  kind: function.lua
  source: file://handler.lua
  method: main
  modules:
    - http
    - json
  imports:
    utils: app.lib:helpers  # Import another entry as module
Use imports para referenciar outras entradas Lua. Elas se tornam disponíveis via require("nome_alias") no seu código.

Serviços HTTP

Tipo Descrição
http.service Servidor HTTP (vincula porta)
http.router Prefixo de rota e middleware
http.endpoint Endpoint HTTP (método + caminho)
http.static Serviço de arquivos estáticos
# HTTP server
- name: gateway
  kind: http.service
  addr: ":8080"
  lifecycle:
    auto_start: true

# Router with middleware
- name: api
  kind: http.router
  meta:
    server: gateway
  prefix: /api
  middleware:
    - cors
    - ratelimit

# Endpoint
- name: users_list
  kind: http.endpoint
  meta:
    router: app:api
  method: GET
  path: /users
  func: list_handler

API Lua: Veja Módulo HTTP

local http = require("http")
local req = http.request()
local resp = http.response()

resp:set_status(200)
resp:write_json({users = get_users()})

Bancos de Dados

Tipo Descrição
db.sql.sqlite Banco de dados SQLite
db.sql.postgres Banco de dados PostgreSQL
db.sql.mysql Banco de dados MySQL
db.cdc.postgres Origem de Change Data Capture do Postgres (veja CDC)
db.cdc.sqlite Origem de Change Data Capture do SQLite (veja CDC)

SQLite

- name: database
  kind: db.sql.sqlite
  file: "./data/app.db"
  lifecycle:
    auto_start: true

# In-memory for testing
- name: testdb
  kind: db.sql.sqlite
  file: ":memory:"

PostgreSQL

- name: database
  kind: db.sql.postgres
  host: localhost
  port: 5432
  database: dbname
  username: user
  password: pass
  options:
    sslmode: disable
  pool:
    max_open: 25
    max_idle: 5
    max_lifetime: "30m"
  lifecycle:
    auto_start: true

MySQL

- name: database
  kind: db.sql.mysql
  host: localhost
  port: 3306
  database: dbname
  username: user
  password: pass
  options:
    parseTime: "true"
  lifecycle:
    auto_start: true

Veja Database para referências de segredos ${env:NAME}, opções TLS e ajuste do pool de conexões. Quando um valor vindo de env por trás de uma entrada de banco de dados muda, o pool é trocado ao vivo — empréstimos ativos terminam com as configurações de conexão antigas.

API Lua: Veja Módulo SQL

local sql = require("sql")
local db, err = sql.get("app:database")

local rows, err = db:query("SELECT * FROM users WHERE id = ?", {user_id})
db:execute("INSERT INTO logs (msg) VALUES (?)", {message})

Armazenamentos Chave-Valor

Tipo Descrição
store.memory Armazenamento chave-valor em memória
store.sql Armazenamento chave-valor com backend SQL
store.kv.raft KV replicado em cluster, fortemente consistente (Raft compartilhado)
store.kv.crdt KV replicado em cluster, eventualmente consistente (gossip/CRDT)
# Memory store
- name: cache
  kind: store.memory
  lifecycle:
    auto_start: true

# SQL-backed store
- name: persistent_store
  kind: store.sql
  database: app:database
  table_name: kv_store
  lifecycle:
    auto_start: true

# Cluster-replicated store (requires clustering)
- name: deployments
  kind: store.kv.raft
  namespace: deploy

Os tipos store.kv.* precisam do clustering habilitado. Veja Store para os tradeoffs de consistência.

API Lua: Veja Módulo Store

local store = require("store")
local s, err = store.get("app:cache")

s:set("user:123", user_data, 3600)  -- TTL in seconds
local data = s:get("user:123")

Filas

Tipo Descrição
queue.driver.memory Driver de fila em memória
queue.driver.amqp Driver AMQP (RabbitMQ)
queue.driver.sqs Driver AWS SQS
queue.queue Declaração de fila
queue.consumer Consumidor de fila
# Driver
- name: queue_driver
  kind: queue.driver.memory
  lifecycle:
    auto_start: true

# Queue
- name: jobs
  kind: queue.queue
  driver: queue_driver

# Consumer
- name: job_consumer
  kind: queue.consumer
  queue: app:jobs
  func: job_handler
  concurrency: 4
  prefetch: 10
  lifecycle:
    auto_start: true

API Lua: Veja Módulo Queue

local queue = require("queue")

-- Publish a message
queue.publish("app:jobs", {task = "process", id = 123})

-- No handler do consumidor: o corpo da mensagem é o argumento do handler
local function main(data)
    -- acessa os metadados de entrega via a mensagem atual
    local msg = queue.message()
    local id = msg:id()
    local priority = msg:header("priority")
    msg:ack()
end
O func do consumidor é invocado uma vez por mensagem, com o corpo da mensagem como argumento. Use queue.message() dentro do handler para obter id(), header()/headers() e ack()/nack() da entrega.

Gerenciamento de Processos

Tipo Descrição
process.host Host de execução de processos
process.service Processo supervisionado (encapsula process.lua)
terminal.host Host de terminal/CLI
pg.scope Escopo de grupo de processos (veja Process Groups)
# Process host (where processes run)
- name: processes
  kind: process.host
  host:
    workers: 32             # Worker goroutines (default: NumCPU)
    queue_size: 1024        # Global queue capacity
    local_queue_size: 256   # Per-worker queue
  lifecycle:
    auto_start: true

# Process definition
- name: worker_process
  kind: process.lua
  source: file://worker.lua
  method: main

# Supervised process service
- name: worker
  kind: process.service
  process: app:worker_process
  host: app:processes
  input: ["arg1", "arg2"]
  lifecycle:
    auto_start: true
    restart:
      max_attempts: 10

- name: terminal
  kind: terminal.host
  lifecycle:
    auto_start: true
Use process.service quando precisar que um processo execute como serviço supervisionado com reinicialização automática. O campo process referencia uma entrada process.lua.

Atualizar uma entrada process.host ao vivo redimensiona host.workers no lugar — processos em execução, PIDs e filas são preservados. host.queue_size, host.local_queue_size e lifecycle são fixados na construção: uma atualização ao vivo que os altere é rejeitada, assim como redimensionar workers em um host cujos workers são gerenciados por afinidade.

Segurança de processo

Entradas process.lua e process.lua.bc aceitam um bloco security: de nível superior. Ele faz parte da entrada, portanto se aplica a todo spawn desse processo, tanto em process.host quanto em terminal.host:

- name: worker_process
  kind: process.lua
  source: file://worker.lua
  method: main
  security:
    actor:
      id: system.worker
      meta:
        tenant: acme
    policies:
      - app.security:worker_policy
    groups:
      - app.security:background_jobs
Campo Descrição
actor.id Identidade do ator sob a qual o processo executa; substitui o ator herdado
actor.meta Atributos do ator avaliados pelas políticas
policies IDs de registro (namespace:name) das políticas mescladas no escopo
groups IDs de registro de grupos de políticas cujas políticas são mescladas no escopo

A resolução ocorre quando o processo inicia e é atômica: se qualquer política ou grupo listado não puder ser resolvido, o spawn falha e nenhum contexto parcial é instalado. Omitir actor herda o ator do processo que faz o spawn; omitir tanto policies quanto groups herda o escopo do processo que faz o spawn. function.lua, function.lua.bc, process.lua e process.lua.bc aceitam o bloco.

Uma entrada de comando pode declarar adicionalmente meta.command.security, que se aplica apenas quando a entrada é lançada como um comando CLI — veja Segurança de comando. Isso não afeta spawns comuns.

Veja Segurança.

Temporal (Workflows)

Tipo Descrição
temporal.client Conexão com cliente Temporal
temporal.worker Worker Temporal
- name: temporal_client
  kind: temporal.client
  address: "localhost:7233"
  namespace: "default"
  auth:
    type: none  # none, api_key, mtls
  lifecycle:
    auto_start: true

- name: temporal_worker
  kind: temporal.worker
  client: temporal_client
  task_queue: "main-queue"
  lifecycle:
    auto_start: true

Armazenamento em Nuvem

Tipo Descrição
config.aws Configuração AWS
cloudstorage.s3 Acesso a bucket S3
- name: aws
  kind: config.aws
  region: "us-east-1"
  access_key_id: ${env:AWS_ACCESS_KEY_ID}
  secret_access_key: ${env:AWS_SECRET_ACCESS_KEY}

- name: uploads
  kind: cloudstorage.s3
  config: app:aws
  bucket: "my-uploads"
  endpoint: ""  # Optional, for S3-compatible services

API Lua: Veja Módulo Cloud Storage

local cloudstorage = require("cloudstorage")
local storage, err = cloudstorage.get("app:uploads")

storage:upload_object("files/doc.pdf", file_content)
local url = storage:presigned_get_url("files/doc.pdf", {expiration = 3600})  -- segundos, padrão 3600
Use endpoint para conectar a serviços compatíveis com S3 como MinIO ou DigitalOcean Spaces.

Sistemas de Arquivos

Tipo Descrição
fs.directory Acesso a diretório
fs.embed Sistema de arquivos embutido somente leitura
- name: data_dir
  kind: fs.directory
  directory: "./data"
  auto_init: true   # Create if not exists
  mode: "0755"      # Permissions

API Lua: Veja Módulo Filesystem

local fs = require("fs")
local filesystem, err = fs.get("app:data_dir")

local file = filesystem:open("output.txt", "w")
file:write("Hello, World!")
file:close()

Ambiente

Tipo Descrição
env.storage.memory Armazenamento de env em memória
env.storage.file Armazenamento de env baseado em arquivo
env.storage.os Ambiente do SO
env.storage.static Armazenamento estático somente leitura de chave-valor
env.storage.router Roteador de env (múltiplos armazenamentos)
env.variable Variável de ambiente
- name: os_env
  kind: env.storage.os

- name: file_env
  kind: env.storage.file
  file_path: ".env"
  auto_create: true

- name: defaults
  kind: env.storage.static
  values:
    PUBLIC_API_HOST: "https://api.example.com"
    APP_ENV: "production"

- name: app_env
  kind: env.storage.router
  storages:
    - app:os_env
    - app:file_env
    - app:defaults

API Lua: Veja Módulo Env

local env = require("env")

local api_key = env.get("API_KEY")
env.set("CACHE_TTL", "3600")
O roteador tenta armazenamentos em ordem. Primeiro match ganha para leituras; escritas vão para o primeiro armazenamento da lista.

Templates

Tipo Descrição
template.jet Template Jet individual
template.set Configuração de conjunto de templates
# Template set with engine configuration
- name: templates
  kind: template.set
  engine:
    development_mode: false
    extensions:
      - ".jet"
      - ".html.jet"

# Individual template
- name: email_template
  kind: template.jet
  source: file://templates/email.jet
  set: app:templates

API Lua: Veja Módulo Template

local templates = require("templates")
local set, err = templates.get("app:templates")

local html = set:render("email", {
    user = "Alice",
    message = "Welcome!"
})

Segurança

Tipo Descrição
security.policy Política de segurança com condições
security.policy.expr Política baseada em expressão
security.token_store Armazenamento de tokens
# Condition-based policy
- name: admin_policy
  kind: security.policy
  policy:
    actions: "*"
    resources: "*"
    effect: allow
    conditions:
      - field: "actor.meta.role"
        operator: eq
        value: "admin"

# Expression-based policy
- name: owner_policy
  kind: security.policy.expr
  policy:
    actions: "*"
    resources: "*"
    effect: allow
    expression: 'actor.id == meta.owner_id || actor.meta.role == "admin"'
  groups:
    - operators

Grupos de políticas são formados pelas próprias políticas: uma política lista sob groups: os IDs dos grupos aos quais pertence, e um grupo é o conjunto de políticas que o nomeiam. Não existe um tipo de entrada separado para grupos. IDs de grupo são IDs de registro — um nome simples resolve no namespace da política que o declara, então operators acima torna-se app.security:operators quando declarado no namespace app.security. As entradas referenciam grupos pelo namespace:name completo.

API Lua: Veja Módulo Security

local security = require("security")

-- Check permission before action
if security.can("delete", "users", {user_id = id}) then
    delete_user(id)
end

-- Get current actor
local actor = security.actor()
Toda política em escopo é avaliada. Um deny de qualquer política correspondente vence todo allow; sem nenhum deny, um allow correspondente concede o acesso. A ordem não importa.

Contratos (Injeção de Dependência)

Tipo Descrição
contract.definition Interface com especificações de métodos
contract.binding Mapeia métodos de contrato para implementações de funções
# Define the contract interface
- name: greeter
  kind: contract.definition
  methods:
    - name: greet
      description: Returns a greeting message
    - name: greet_with_name
      description: Returns a personalized greeting
      input_schemas:
        - format: "application/schema+json"
          definition: {"type": "string"}
      output_schemas:
        - format: "application/schema+json"
          definition: {"type": "string"}

# Implementation functions
- name: greeter_greet
  kind: function.lua
  source: file://greeter_greet.lua
  method: main

- name: greeter_greet_name
  kind: function.lua
  source: file://greeter_greet_name.lua
  method: main

# Bind contract methods to implementations
- name: greeter_impl
  kind: contract.binding
  contracts:
    - contract: app:greeter
      default: true
      methods:
        greet: app:greeter_greet
        greet_with_name: app:greeter_greet_name

Uso no Lua:

local contract = require("contract")

-- Open binding by ID
local greeter, err = contract.open("app:greeter_impl")

-- Call methods
local result = greeter:greet()
local personalized = greeter:greet_with_name("Alice")

-- Check if instance implements contract
local is_greeter = contract.is(greeter, "app:greeter")

API Lua: Veja Módulo Contract

Marque um binding como default: true para usá-lo ao abrir um contrato sem especificar um ID de binding. Um contrato pode ter apenas um binding padrão.

Execução

Tipo Descrição
exec.native Execução de comando nativo
exec.docker Execução em container Docker
- name: native_exec
  kind: exec.native
  default_work_dir: "/app"
  command_whitelist:
    - "ls"
    - "cat"

- name: docker_exec
  kind: exec.docker
  image: "python:3.11-slim"
  default_work_dir: "/workspace"
  auto_remove: true
  memory_limit: 536870912  # 512MB
  command_whitelist:
    - "python"

Runtime WASM

Tipo Descrição
function.wat Função WebAssembly (formato de texto WAT)
function.wasm Função WebAssembly (binário)
process.wasm Processo WebAssembly
# O texto WAT é source inline
- name: sum_wat
  kind: function.wat
  source: file://sum.wat
  method: sum
  transport: payload   # ou wasi-http

# O WASM binário é carregado de uma entrada de filesystem e verificado por hash
- name: sum
  kind: function.wasm
  fs: app:modules
  path: sum.wasm
  hash: sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae
  method: sum
  transport: payload

function.wasm e process.wasm recebem fs, path e hash — não há campo source em uma entrada binária; source pertence apenas a function.wat. hash é obrigatório e deve ser sha256:<hex>; o módulo é rejeitado se os bytes não corresponderem.

Veja Visão Geral do WASM.

Redes

Tipo Descrição
network Overlay de rede base
network.socks5 Overlay de proxy SOCKS5
network.i2p Overlay de rede I2P
network.tailscale Overlay do Tailscale

Referenciado por http.service via network:, por funcs/process via a opcao network e por http_client via a opcao overlay_network. Veja Rede.

Primitivas do Registro

Tipo Descrição
registry.entry Entrada de dados pura, sem serviço por trás (configuração específica da aplicação)
ns.definition Definição de namespace
ns.requirement Declaração de requisito de namespace
ns.dependency Dependência de namespace

Os tipos ns.* são declarados como qualquer outra entrada: um componente declara ns.definition e ns.requirement, e um host declara ns.dependency. Veja Construindo Componentes.

Configuração de Ciclo de Vida

A maioria das entradas suporta configuração de ciclo de vida:

lifecycle:
  auto_start: true          # Start automatically
  start_timeout: 10s        # Max startup time
  stop_timeout: 10s         # Max shutdown time
  stable_threshold: 5s      # Uninterrupted run time before retry accounting resets
  requires:
    - app:database
  restart:                  # Retry policy
    initial_delay: 1s
    max_delay: 90s
    backoff_factor: 2.0
    max_attempts: 0         # 0 = infinite
Use depends_on para garantir que entradas iniciem na ordem correta. O supervisor inicia uma entrada dependente somente depois que cada uma de suas dependências concluiu o próprio início.

Formato de Referência de Entradas

Entradas são referenciadas usando o formato namespace:name:

# Definition
namespace: app.users
entries:
  - name: handler
    kind: function.lua

# Reference from another entry
func: app.users:handler

Sobrescrevendo entradas

Qualquer campo de uma entrada — incluindo seu kind — pode ser sobrescrito na inicialização sem editar o YAML de origem, usando a seção de configuração override: ou a flag -o do CLI. As chaves usam o formato namespace:entry:path:

override:
  app:gateway:addr: ":9090"        # data field (a bare path targets data.*)
  app:worker:meta.priority: high    # meta field
  app:db:kind: db.sql.postgres      # the entry's typed kind
  app:db:data.kind: custom          # a payload field literally named "kind"
Path Mira
kind O kind tipado da entrada (deve ser uma string não vazia)
data.<field> ou <field> simples Um campo no payload de dados da entrada
meta.<field> Um campo nos metadados da entrada

Os mesmos overrides se aplicam a partir do CLI:

wippy run -o app:db:kind=db.sql.postgres -o app:gateway:addr=:9090

Valores do CLI (-o) são convertidos pela forma (true/false para bool, números para números, caso contrário string); valores da seção override: mantêm seu tipo YAML. Para sobrescrever seções globais de configuração em vez de entradas, use --set.