lua logs lists execution logs for the configured agent, newest first, filtered by log source, by a named primitive, or by end user. It reads only.
Verified against lua-cli 3.33.0.
Synopsis
Description
Without--type, --name, --user-id, or --json, the command opens a menu: all agent logs, or a filter by skills, jobs, webhooks, preprocessors, postprocessors, devices, user messages, agent responses, agent errors, MCP tools, runtime, knowledge base (RAG), device triggers, or voice calls, with page navigation. With any of those flags it prints one page and exits. --ci does not stop the menu; pass --type or --json.
--type accepts all, skill, job, webhook, preprocessor, postprocessor, mcp, device, device-trigger, user_message, agent_response, agent_error, runtime, rag, and calls. Plural and short forms such as skills, pre, post, kb, error, response, and user are normalized. Any other value exits 2 and lists the valid values; that Valid values hint omits all and calls, which are handled before the check and are accepted. --name narrows one of the entity types (skill, job, webhook, preprocessor, postprocessor, device) to one primitive by name or id; it requires --type, is refused for the other types, and exits 3 when the primitive does not exist. --user-id keeps only logs produced for one end user. --agent-id reads another agent you administer instead of the one in lua.skill.yaml.
There is no time filter and no environment filter. Sandbox and production entries are stored together, and metadata.channel, where present, is dev for every message sent from lua chat in either environment, while end-user traffic carries its channel (pop for the web widget, whatsapp, slack, email, api, and so on); to bound a check, compare timestamp in jq. A tool that throws is written as an error entry under its own source (--type skill, or mcp); agent_error holds failures of the message pipeline itself, such as billing, validation, and model errors, so a post-release check reads both.
Pages hold --limit entries (default 20) and --page selects one (default 1); the server caps a page at 100 entries, so --limit 500 returns 100 and pagination.limit reports the cap. The API returns entries newest first and --json keeps that order; the text view prints a page oldest to newest so the latest entry is at the bottom, and ends with a hint block unless LUA_NO_HINTS is set. --type calls reads voice call records instead of execution logs, accepts --direction and --status, and prints a table or a different JSON shape. A failure keeps the typed ✖ line on stderr even with --json; there is no JSON error envelope.
Arguments
None.Options
Output
--json prints { logs, pagination }. Each entry has id, timestamp, type (log or metric), subType (error, warn, info, debug, start, complete), message, an optional duration in milliseconds, and metadata with logSource, primitiveId, primitiveName, toolId, toolName, userId, agentId, runId, and channel as available. There is no level field; filter errors on subType. Trimmed to one entry:
Output
--type calls --json prints { calls, total, page, limit, totalPages }, where each call has startedAt, direction, from, to, status, and optional durationSeconds and recordingUrl:
Output
Examples
Check for errors after a test message or a promote:--type exits 2 and lists the accepted values:
Output
Exit codes
See also
- Read logs and debug — the verification loop after a promote
- Troubleshooting
lua chat— what triggers the per-turn error probelua voice— where call records come from

