Skip to main content

v3.22.0

Released: July 28, 2026

✨ New Features

LuaSkill now accepts the same optional condition as LuaTool, one level up:
When it returns false, the skill’s tools can’t be called and the skill’s name, context, and tool names are left out of the agent’s prompt entirely β€” the agent doesn’t know the capability exists. A tool-level condition only makes a tool uncallable; the skill’s name and context stay in the prompt, so the agent can still say β€œβ€¦but you’re not enrolled, so I can’t do that”. Reach for the skill-level gate when the existence of a feature is itself sensitive: tiering, entitlements, per-customer capabilities.Evaluated per message, per user, with the full Platform API available. Fail-closed β€” a condition that throws or times out hides the skill. Skills without a condition are unaffected. See Conditional Skills.
Template header values now accept a Meta media id as well as a public URL:
Upload the asset to Meta once and reuse the id across a campaign, instead of having the image re-fetched for every recipient. image_id, video_id and document_id sit alongside the existing image_url / video_url / document_url keys β€” an id is used in preference to a URL when both are given, and document_filename still applies either way.

πŸ› Bug Fixes

async condition() { ... } now behaves the same as condition: async () => { ... }. Previously the condition was dropped and the skill failed to build.
A skill defined as a class alongside its tools now builds correctly and stays small β€” tool code no longer runs when the skill’s condition is evaluated.

v3.21.0

Released: July 24, 2026

✨ New Features

Publish a versioned snapshot of an agent’s entire configuration (skills, webhooks, jobs, processors, triggers, model, plus a declared env-var contract) and install or roll it out to other agents. Includes fleet rollout across many agents with a per-target result table, an install ledger, consent-based creator updates, rollback via lua version promote, and manifest inspection.
Templates never touch a target agent’s persona, environment variable values, or channels.
List a skill with --visibility private to make it visible and installable only within your organization.

πŸ”§ Improvements

lua marketplace [skill|template] <action> replaces the previous create/install role menus with one flat action namespace per domain. Two actions were renamed: viewing your own listings is now mine, and editing listing metadata is now edit. See the marketplace command reference for the full old β†’ new migration table.
Flags like lua marketplace template view --version 2 previously printed the CLI’s own version instead of selecting a version. The CLI’s version flag is now -V / --cli-version (bare lua --version still works).

πŸ”„ Changes

Clearing another user’s conversation history is no longer supported. The command now clears only your own history and fails with a clear message if --user is passed.

v3.20.0

Released: July 21, 2026

✨ New Features

See, per primitive, which version is pinned by the active agent version versus what’s in your local project.
Mismatches are flagged with direction-aware guidance: primitives that are pushed but not yet live point you to lua version create + lua version promote (or lua deploy <type> for a single primitive), while local files older than what’s live get a lua sync recommendation β€” with a warning that deploying older files would roll production back.
React to a WhatsApp message with an emoji from your agent code:

πŸ”§ Improvements

For agents using agent versioning, lua deploy now automatically creates and promotes a new agent version scoped to the deployed primitive β€” the deploy is live immediately and shows up in lua version list. The success output includes the promoted version, and if the live version can’t be updated the deploy fails with a clear message instead of reporting success.
Connection listings now indicate when a connection has been paused.

v3.19.0

Released: July 3, 2026

✨ New Features

Chat requests now accept an optional clientContext.timezone field β€” an IANA timezone string. When provided, the agent uses it as the user’s local timezone for date/time-aware responses; when omitted it falls back to the user’s stored profile, country, or UTC.
Also available on Agents.invoke. See HTTP API and Agents API.
Set a default reasoning effort for your agent, normalized across every reasoning-capable provider (Claude, GPT/o-series, Gemini, Groq, DeepSeek, xAI, Qwen).
effort is one of 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'max'. Left unset, it defaults to adaptive reasoning where the model supports it and an explicit low effort otherwise, favoring lower cost/latency on turns that don’t ask for deeper thinking. show controls whether the reasoning trace is surfaced to the caller (default true). A per-request reasoning override always takes precedence over this agent-level default. See LuaAgent β†’ modelSettings and Model Selection β†’ Reasoning Effort.
Resolve a colleague by name within your organization and get back the channel handles (WhatsApp, SMS, email) they’ve chosen to share. Pair it with Channels.send to message them directly β€” no hard-coded phone numbers.
Returns a list of matches so an ambiguous name can be disambiguated β€” each match includes its shareable targets[] (empty if the teammate hasn’t opted in to sharing anything).
Turn on browser: true to give your agent browser tools like searchWeb, routed to the user’s connected desktop browser when available, or a cloud fallback otherwise.
Pass an object instead of true for policy: engine ('auto' default, 'agent-browser' for local-only, 'browser-use' for cloud-only), allowedDomains, credentials (named vault entries β€” never raw secrets), and maxSessionMinutes. Off by default β€” a browser session costs money and carries risk, so it’s opt-in.

πŸ› Bug Fixes

version create could previously refuse with β€œno staged changes” even when you had real changes to snapshot, or silently accept a run with nothing to snapshot. It now diffs the actual content against the previous version β€” including a rename with no other change. When there’s genuinely nothing new, it now tells you so plainly instead of throwing an error. lua version diff also shows voice changes, and the β€œβ€”auto-deploy was ignored” notice now appears in the final push summary, not just at the very top.

v3.18.0

Released: June 22, 2026

✨ New Features

Your agent can now reach out first β€” send messages on any connected channel from tools, jobs, webhooks, and triggers. Every send is recorded to the user’s conversation thread, so the agent picks up with full context when they reply.
See Channels API and Proactive Messaging.
Define a trigger with a verify β†’ filter β†’ transform pipeline and get a pasteable URL that wakes your agent on any external event β€” no execute function required.
Manage triggers from the CLI:
Prefer no code? lua triggers create --name daily --instruction "Reply with today's date" creates a URL trigger with no SDK.
Let your agent send messages on its connected channels as part of a conversation by enabling the outboundChannels feature:
Scope it to current_user (message only the person it’s talking to) or anyone (message recipients it specifies).
Drop specific tools from a voice agent, and transfer a live call to another in-room agent.
Send templates with media-rich headers. Create a template with format: 'IMAGE', 'VIDEO', or 'DOCUMENT' and provide a sample media URL for approval (must be publicly reachable HTTPS and within Meta’s size/MIME limits).When sending, use values.header.image_url for IMAGE templates, values.header.video_url for VIDEO templates, or values.header.document_url (with optional document_filename) for DOCUMENT templates:
See the Templates API for creation details and size limits.

πŸ”§ Improvements

Images embedded in an email body β€” for example pasted or dragged into Gmail compose β€” previously arrived as just a [image: …] text placeholder, with no image part. They are now forwarded to your agent as image parts, the same way paperclip attachments are.The rules:
  • The embedded image must be referenced in the email’s HTML body and be at least 1 KB (spacer pixels are filtered out)
  • Up to 10 embedded images per email are forwarded; regular attachments are unaffected
  • Remote-hosted images (e.g. Gmail signature images, which are hosted rather than embedded) are not fetched
  • Attachments mislabeled as embedded content by some clients are detected and forwarded as normal attachments
The [image: …] placeholder still appears in the message text β€” use the image part, not the placeholder. See Email Channel β†’ Attachments and Embedded Images.

v3.17.2

Released: June 1, 2026

πŸ› Fixes

lua git auth github now links your GitHub account reliably using GitHub’s device flow β€” a code is shown in your terminal that you enter at github.com/login/device.
See the Git Command documentation for the full workflow.

✨ New Features

lua git connect --auto-push enables pushing each auto-commit to your linked GitHub repository. It checks that a GitHub account is linked and that your origin is a GitHub HTTPS remote before turning auto-push on, so a missing link or remote is reported immediately.
The git block in lua.skill.yaml is managed by these commands β€” you no longer need to edit it by hand. See the Git Command documentation for details.

v3.17.1

Released: May 29, 2026

✨ New Features

Set sampling settings once on the agent instead of overriding them in every skill. Supports temperature, topP, topK, maxOutputTokens, presencePenalty, frequencyPenalty, stopSequences, and seed β€” forwarded to the model on every chat turn.
Obviously-broken values (non-finite numbers, temperature outside 0..2, topP outside 0..1, non-positive maxOutputTokens, non-string stopSequences) are rejected at construction time. Provider-specific range checks are deferred to the provider.
Constrain the model response to a JSON Schema. The parsed object lands on result.output. No more β€œrespond with JSON only” prompts and no more JSON.parse boilerplate.
On Google models, the auto-injected google_search tool is suppressed when structuredOutput is set (Vertex does not allow mixing function-calling tools with google_search).
AiGenerateInput, AiGenerateOutput, AiGenerateStructuredOutput, AgentModelSettings, and sub-shapes (AiGenerateJsonSchema, AiGenerateSource, AiGenerateToolCall, AiGenerateToolResult) are now importable directly from lua-cli.

v3.5.0-alpha.2

πŸ”§ Improvements

Lua.request.webhook.payload is now populated for inbound emails with a JMAP-aligned object containing parsed message metadata.
Access the Message-ID for deduplication, full RFC 5322 header list via headerLines, and all threading metadata (messageId, inReplyTo, references). See the API reference for the complete shape and AgentMail divergence note.

v3.16.0

Released: May 19, 2026

✨ New Features

Define voice agents in TypeScript alongside your LuaAgent. Supports cascaded (STT/LLM/TTS) and realtime (speech-to-speech) shapes, with hooks for onEnter, onUserTurnCompleted, onExit, and voice-only tools.
Reference the voice from your LuaAgent’s voices: [supportVoice]. lua push ships it through the same versioned-primitive flow as skills and webhooks.
Buy, bind, list, and release phone numbers from the CLI:
SMS-capable numbers route through Vonage; voice-only routes through LiveKit-native PSTN. The bind action wires the number directly to your agent for inbound calls.
Test voice agents with text input and event-stream assertions, runnable in CI:
Talk to your voice agent during development without going through a phone number:
View voice call logs from the CLI:
Also available as a choice in the interactive lua logs picker.
Re-exports of LiveKit’s plugin namespaces from lua-cli so you don’t need a direct LiveKit dependency in your project:
Factor shared tool / skill / webhook / etc. logic into a base class in a workspace package, then extend per-agent with field initializers:
Works for every primitive type. The compiler walks the full extends chain, including transitive extends through shared intermediates.

πŸ”§ Improvements

Publishing a new voice version with lua push voice is enough β€” the next call uses the new version. No need to re-push the agent.

πŸ“ Notes

Voice agents require the latest server-side endpoints. Self-hosted Lua deployments must deploy the latest server before publishing voice agents via lua push.

v3.15.3

Released: May 12, 2026

✨ New Features

After a primitive push, the CLI now also attaches the gzipped workspace archive to each skill’s per-skill source store, so the Builder UI’s source panel stays in sync with your CLI edits.
The attach is non-fatal β€” if it fails, the push is still considered successful, because the primitive is already deployed and the agent-level backup already succeeded. The per-skill store is a denormalized projection for the Builder UI, not the canonical source store.

v3.15.2

Released: May 8, 2026
If you’re upgrading from v3.15.1, upgrade directly to v3.15.2 (or later). v3.15.1 has a startup crash on fresh installs from npm.

πŸ› Bug Fixes

v3.15.1 shipped with a missing runtime dependency that crashed every CLI command on a fresh npm install [email protected], not just the new lua source subcommands. v3.15.2 removes the dependency entirely β€” the affected paths now use the same HTTP layer as the rest of the CLI, so install size and dependency footprint are unchanged from v3.15.0.If you were stuck on v3.15.0 because of this, you can upgrade safely now:

v3.15.1

Released: May 7, 2026
This release has a startup crash on fresh installs from npm. Upgrade directly to v3.15.2 or later.

✨ New Features

Two new subcommands for working with your agent’s backup version history.List versions:
The currently active version is starred in the output.Roll back to a past version:
Rollback downloads the chosen version’s files into your local workspace and then auto-pushes the rolled-back state as the next version. History is append-only β€” the original v12 is never overwritten. After a rollback you have an explicit new version at the head representing β€œwe returned to v12 on this date.”
lua push <primitive> now always runs a fresh-from-disk backup-push as the final step. If the backup fails, the command exits non-zero.No more silent partial success where the primitive landed on the server but your local source never reached the canonical store. This makes the CLI a reliable single source of truth for β€œthis version was pushed from this machine in this state.”
Builds the backup manifest by walking your project directory directly from disk, instead of reading the compiled manifest.
Always-on for the auto-backup hook; opt-in for explicit lua push backup calls. Use this when files have been written by the Builder or by any other out-of-band path that bypassed lua compile.

πŸ”§ Improvements

Init’s restore step now hits the active manifest endpoint, which reflects every successful push from any platform β€” CLI, Builder chat, dashboard edits.Previously, lua init against a Builder-managed agent could restore a backup days or weeks behind the actual runtime state because the Builder’s writes weren’t reaching the legacy backup manifest reliably.
After lua init and after every successful lua push, the CLI records the server’s active backup version into your local lua.skill.yaml. Foundation for future staleness warnings (β€œlocal is behind server”) and for cross-machine drift recovery.
The new fresh-from-disk walker enumerates source files directly, so files written by the Builder (or any out-of-band edit) make it into your backup. Per-file cap: 256 KB. Skipped: node_modules, .git, dist, dist-v2, .env, and lockfiles.Previously, the reconcile-only path re-hashed files already in the compiled manifest, missing anything written outside lua compile.

πŸ› Bug Fixes

Network timeouts or missing blobs during the post-init backup restore are now caught and logged. lua init continues with an empty workspace and tells you what failed, instead of aborting with an unhandled exception.
The dist-v2 directory is no longer accidentally pulled into fresh backups. Previously, every fresh backup included the entire compiled tree (bundles, per-file source copies, the manifest), inflating per-push size and contradicting the intent that compiled artifacts stay separate.

v3.15.0

Released: May 6, 2026

✨ New Features

Clone an entire agent into a new one in a single command:
The duplicated agent includes its persona, skills, MCP servers, env vars, and a full project backup that is restored locally so you can lua push immediately. The new agent inherits its source’s LLM model β€” lua init no longer prompts for a model.Opt-in flags add more buckets to the copy:
Cross-org duplicates are supported by adding --org-id <target-org-id>.The interactive lua init flow (no flags) now offers β€œDuplicate an existing agent” as a third choice alongside β€œCreate a new agent” and β€œUse one of your existing agents”.
Persona and skill context can now be split per channel using an object form. The previous string form keeps working β€” adopt the object form only where you need it.
Useful when a voice agent needs different phrasing than the same agent’s chat surface. The CLI pushes voice-only personas correctly (previously they could be skipped as empty), and lua sync --pull round-trips the object form back to your source file with all channel branches preserved.The new PersonaText type is exported from lua-cli for use in your own typings.

πŸ”§ Improvements

When a command hits a 401 from the server, lua-cli now distinguishes between two very different conditions and tailors the remediation hint accordingly:
  • API key invalid or expired β€” Authentication failed. Run \lua auth configure` to set a new API key.`
  • API key valid, but no access to this agent β€” Access denied for this agent. Run \lua agents` to list agents you can access, or `lua init` to switch projects.`
Previous versions printed a single generic message for both, sending users to a dead-end remediation flow when their key was actually fine.
Setting priority on a LuaPostprocessor now correctly ships to production. In previous versions, the field was silently dropped during compile, so postprocessors always ran in their default order regardless of declared priority.No code change needed β€” re-run lua push and your existing priority declarations now take effect.
Restoring a project backup from an older agent no longer aborts mid-restore with incorrect header check when one of its stored blobs was archived without compression. Uncompressed blobs are now passed through verbatim.Affects lua init --restore-sources, lua init --from-agent-id, and any other path that restores a project backup.
Two related fixes for the new channel-aware persona shape:
  • Voice-only personas now push. A persona of just { voice: '...' } (no base, no text) is correctly applied. Earlier this was silently skipped as empty.
  • lua sync --pull preserves all channel branches. Pulling an object-form persona from the server and writing it back to local source no longer drops voice or text.

πŸ› Bug Fixes

lua production now correctly displays personas using the new object form, instead of crashing on .length / .substring() calls or printing the literal string [object Object].
Skills that don’t define a context now push without error. Previously the CLI would send an empty string and the server would reject it under the new stricter persona/context validator.
The source-write path for string-form personas now produces a properly-quoted literal under all edit paths, instead of occasionally emitting unquoted text that broke compilation.

v3.14.0

Released: May 5, 2026

πŸ”§ Improvements

lua push now reliably uploads agents of any size, including those with many tools or large code bundles.Previously, agents that exceeded the upload size limit would fail mid-push with a β€œrequest too large” error. This no longer happens β€” pushes succeed regardless of total bundle size.Applies to every primitive type:
  • skills (and their tools)
  • webhooks
  • jobs
  • preprocessors / postprocessors
  • devices and device triggers
No configuration or command change required. Just run lua push as usual.
Duplicate copies of code bundles have been removed from the push payload across all primitive types. Each push is now hundreds of KB to several MB smaller, which makes pushes faster β€” especially on slow connections.Sandbox sessions launched by lua chat benefit from the same reduction.No action needed; the change is automatic with this release.

v3.13.0

Released: April 29, 2026

✨ New Features

A new lua status command (alias: lua describe) dumps the full state of your agent in one shot β€” no more running five separate commands to understand what’s going on.
What it shows:
  • Environment β€” CLI version, install method, Node version, API base, env overrides
  • Updates β€” current vs latest published version
  • Auth β€” key source, email, user ID, org list, server reachability
  • Project β€” config path, agent name/ID, manifest primitive count
  • Primitives β€” per-type sync table: local version, server version, status (synced / ahead / behind / not deployed) for skills, webhooks, jobs, preprocessors, postprocessors, MCP servers, devices, device triggers
  • Persona β€” synced / drifted
  • Backup β€” synced / out-of-sync
  • Telemetry β€” enabled/disabled
  • Next steps β€” actionable hints based on current state
The --json flag outputs a stable JSON document (schemaVersion: 1) suitable for LLM agent consumption or CI dashboards. All progress output is suppressed in JSON mode.
Mistyped commands now show a β€œDid you mean X?” suggestion instead of a bare error:
Works for top-level commands and constrained argument values (log types, primitive kinds, environments) across all 22 commands.
Common aliases are now accepted everywhere constrained argument values are expected:For example: lua logs --type pp is equivalent to lua logs --type postprocessor.
Every push, deploy, chat, compile, sync, and test surface now provides contextual guidance after the operation:
  • Error paths β€” πŸ’‘ Diagnose: run \lua logs β€”type X β€”name Y β€”limit 10β€œ pointing at the right log stream for what just failed.
  • Success paths β€” ✨ Tip: run \lua logs β€”limit 10β€œ nudges you to verify production execution.
  • lua chat β€” after each conversation turn, silently probes for agent_error logs. If any fired during that turn, prints: ⚠️ N new agent error(s) β€” run \lua logs β€”type agent_error` to inspect.`
  • lua compile β€” tip to run lua test after a successful compile.
  • lua sync --push β€” tip to verify with lua logs after pushing.
To suppress all hints (for CI scripts): LUA_NO_HINTS=1 lua push all
Two improvements to lua test output:Shape headers β€” the tool return value is now prefixed with its type and field names:
--json flag β€” outputs pure JSON on stdout, with all progress and compile output redirected to stderr. Enables clean piping:

πŸ› Bug Fixes

Primitive arrays defined outside the agent config object previously caused primitives to be silently dropped from the compiled manifest. All of the following patterns now resolve correctly:
Previously, using any of these patterns would cause the compile to succeed (βœ… Compiled N primitives) but with the primitives silently absent from the manifest β€” resulting in a broken agent after push.
lua push all now automatically retries once when it encounters an β€œalready exists” version collision. It re-fetches the current highest server version, bumps to the next one, and retries β€” resolving the most common lua push all failure without any user intervention.Additionally, sandbox versions (e.g. 1.0.21-sandbox) are now correctly excluded when calculating the next production version bump.
Primitives that exist on the server but not in your local YAML are now shown in interactive delete and trigger menus, clearly marked as [server only]. Previously these orphaned primitives were invisible in menus, making them impossible to delete or trigger interactively.Non-interactive delete (lua preprocessors delete --preprocessor-name X) also now falls back to server data for all primitive types.The orphan warning message now shows the exact delete command to use:
zod is now bundled with the CLI. Previously, if your node_modules/zod was corrupted β€” by a partial install, a dependency conflict, or switching branches mid-install β€” every tool got an empty inputSchema: {} and the compile printed βœ… Compiled N primitives anyway, shipping a broken agent silently.Now:
  • The bundled copy is used first and is immune to node_modules corruption.
  • A local node_modules fallback is tried second.
  • If both fail, compile aborts immediately with a clear reinstall hint before any primitive is processed.
  • Monorepo backup β€” lua push backup now captures source files imported from cross-package paths in a monorepo and restores them to .lua/external/ on lua sync --accept.
  • Log type runtime β€” The log source previously called mastra is now runtime. Use lua logs --type runtime (was --type mastra).
  • New log types β€” lua logs --type rag and lua logs --type device-trigger are now valid filter values.
  • Startup warnings eliminated β€” Extraneous warnings that appeared on every CLI command have been removed.
  • Skill sandbox stale ID β€” Sandbox sessions that expire after 24 hours no longer show a misleading β€œrun lua push first” message. The CLI now recovers automatically.
  • lua init template fixes β€” Data.update and Products.search usage in the scaffolded template was corrected.

v3.12.3

Released: April 24, 2026

✨ New Features

lua-cli now installs three binary aliases pointing to the same entry point: lua, heylua, and lua-ai. Users who have the Lua programming language interpreter installed (which also claims the lua command) can run heylua or lua-ai without any conflict or post-install workaround. Existing scripts using lua continue to work unchanged.

v3.12.2

Released: April 23, 2026

✨ New Features

Attach images and documents to any chat message using @<path> syntax β€” in both interactive and non-interactive mode.
Images are sent as vision inputs; documents and text files are sent as file parts. The @ token is stripped from the message text β€” only the file is forwarded alongside any remaining text.Supported types include: .png, .jpg, .gif, .webp, .heic, .pdf, .docx, .xlsx, .ppt, .csv, .json, .html, .txt, .md, .eml, and more. Files with unsupported extensions are left in your message as plain text. Email addresses ([email protected]) are never mistaken for file paths.Maximum attachment size: 10 MB per file. Multiple attachments per message are supported.

v3.12.1

Released: April 22, 2026

πŸ› Bug Fixes

Agent creation previously ended with a 30-second blind sleep. That wait has been removed β€” lua init now completes immediately after the server responds. The agent persona is read directly from the create API response.
The chosen model is now sent in the initial create request instead of a follow-up PATCH call, eliminating a window where the agent could briefly exist without a model.

v3.12.0

Released: April 22, 2026

✨ New Features

lua triggers is now a top-level command (alias for lua integrations webhooks) that lets you manage your integration triggers directly from the CLI.New pause and resume subcommands let you suspend or restore triggers individually or for an entire connection:
The trigger list now displays rich status icons β€” βœ… active, ⏸️ paused, πŸ’³ credit-suspended, πŸ”΄ unhealthy β€” so you can see trigger health at a glance.The connect flow is also updated: triggers are opt-in by default (none pre-selected), giving you explicit control over which events wake your agent.

πŸ› Bug Fixes

Skills (defineSkill) were silently dropped from the compiled manifest because they were fed through esbuild like tools and webhooks. Skills are metadata-only (name, description, context, tool refs) and do not contain executable code. They now produce a JSON metadata artifact and flow through the full pipeline. Resolves the circular failure: lua push skill β†’ β€œno server ID, run lua compile” β†’ β€œnot found in manifest”.
MCP server IDs are now written back to lua.skill.yaml immediately after a successful push, so the server is never treated as an orphan on its first deploy. Re-pushes are fully idempotent.

v3.11.0

Released: April 21, 2026

✨ New Features

Added a reusable agent invocation surface callable from within a LuaSkill, LuaWebhook, LuaJob, or any other primitive:
Added support for device triggers as a first-class primitive decoupled from defineDevice, compiled and pushed like webhooks.
Added lua governance add and lua governance remove commands to configure runtime enforcement of governance policies for your agents.

πŸ› Bug Fixes

Allowed underscores in device trigger names.
Push-backup refusal message now shows project hashes instead of misleading timestamps.

v3.10.0

Released: April 16, 2026

✨ New Features

Manage the LLM model for your agent directly from the CLI.
lua models list shows all approved models grouped by provider, with the current model highlighted. lua models set writes the chosen model into your src/index.ts and syncs it to the server. lua models unset removes the model property and clears it on the server.
Full CLI for managing devices connected to your agent. Devices are a new first-class primitive type that enables your agent to send commands to physical or virtual hardware and receive trigger payloads from them.
Push device definitions with lua push device or include them in lua push all. Connect hardware or virtual devices using @lua/device-client.All actions support interactive mode β€” omit --device-name to choose from a picker.
lua sync --accept now detects files you have modified locally since the last lua push backup and refuses to overwrite them.
After every successful lua push backup, a local cache of file hashes is stored in .lua/backup-manifest.json. The guard compares this cache against your current files and only flags files that were actually modified.If no backup has been run yet, the pull proceeds with a warning rather than failing.
New agents created via lua init now receive a structured persona template instead of "Placeholder persona". The template includes suggested sections β€” identity, tone, audience, capabilities, boundaries, and guidelines β€” each with guidance notes to help you write an effective persona. It is designed to be reshaped or replaced entirely.

πŸ› Bug Fixes

The backup conflict detector used full 64-character SHA-256 hashes when reading files from disk, while the backup manifest stored 16-character truncated hashes (matching the compiler format). Every comparison failed, so every file appeared as a conflict regardless of whether anything had actually changed. Fixed by aligning the detector to use the same 16-char hash as the manifest.
When a backup restore failed (network error, missing manifest), the CLI printed β€œSync complete” and exited with code 0 β€” silently masking the failure. When drift included source-bearing primitives but no backup was available, the missing count was also never incremented. Both failure paths now correctly propagate the error so CI/CD pipelines can detect a failed pull.

πŸ”§ Improvements

Use lua sync --accept --force (or lua sync --force) to intentionally overwrite local changes when pulling from the server.

v3.9.3

Released: April 15, 2026

✨ New Features

Choose your agent’s LLM model during lua init.Interactive mode: a searchable, provider-grouped model list appears after org and name selection. Select a model or skip to use the server default.Non-interactive mode:
The selected model is written into your generated src/index.ts and synced to the server. Works correctly across fresh init, re-init, backup restore, and agent-switch flows.

πŸ› Bug Fixes

lua sync --accept and interactive pull for MCP servers were silently no-ops β€” servers created via the dashboard were never written to local YAML even when drift was detected. Fixed: MCP servers missing locally are now correctly added to YAML on pull.
During lua sync, the push suggestion for MCP servers was lua push mcpServer --name "X" (invalid command). Fixed to lua push mcp --name "X".

πŸ”§ Improvements

The option to use an existing agent now reads β€œUse one of your existing agents” instead of β€œExtend one of your existing agents”. The word β€œextend” implied inheritance; the actual behavior is source restore or template scaffold.

v3.9.0

Released: April 13, 2026

πŸ”§ Improvements

keytar (OS keychain) has been removed. The CLI now works on headless Debian, Docker, and VMs without any native system dependencies.API key resolution order:
  1. LUA_API_KEY environment variable
  2. ~/.lua-cli/credentials file (written by lua auth configure)
  3. .env file values
Upgrading from v3.8.x or earlier? Run lua auth configure once to store your key in the new location. Your previous key stored in the OS keychain is not migrated automatically.

v3.8.0

Released: April 8, 2026

✨ New Features

Subscribe your webhooks to WhatsApp message lifecycle events dispatched when Meta sends status callbacks.
Supported events: sent, delivered, read, failed, played.
lua deploy now mirrors lua push [type] β€” deploy any primitive interactively or directly:
New generic flags: --name (replaces --skill-name) and --set-version (replaces --skill-version). Deprecated aliases kept for backwards compatibility.

πŸ› Bug Fixes

lua jobs deploy -i myJob -v latest now works correctly β€” -i and -v are registered as short flags for --job-name and --job-version. The activate/deactivate selection list now shows the live server status badge next to each job.
Jobs, preprocessors, and postprocessors were comparing the wrong ID against activeVersionId, causing the active version to not be highlighted correctly. Fixed to use the version’s own ID in all cases.
Invalid event types passed to lua webhooks events unsubscribe now show a clear validation error instead of a misleading β€œnot subscribed” message.

v3.7.5

Released: March 30, 2026

✨ New Features

Agents can now have individual batching configuration for message debouncing. New lua chat flags for testing:
Batching config is set per-agent with fallback to environment variables.

v3.7.4

Released: March 27, 2026

πŸ› Bug Fixes

Fixed several issues that could cause API key saves to silently fail on macOS. The auth flow now correctly reports errors and clears stale data on re-authentication.
.env parsing now correctly strips inline comments: LUA_API_KEY=abc # my comment resolves to abc.

v3.7.3

Released: March 24, 2026

πŸ”§ Improvements

Automatic retries with backoff for transient server failures (429, 500–504). Max 3 retries, never retries client errors. Improves reliability for flaky network conditions.
Removed the lua dev web UI command and unused dependencies, significantly reducing install size.

πŸ› Bug Fixes

Chat sessions now have a 5-minute timeout instead of hanging indefinitely on unresponsive connections.

v3.7.2

Released: March 24, 2026

✨ New Features

New AI.generate API for running text generation from within tools, aligned with Vercel AI SDK generateText semantics.Simplified β€” returns plain text:
Full options β€” returns rich result:
Supported providers: google/* (Vertex AI), openai/*, anthropic/* β€” with automatic fallback if the requested provider’s API key is missing.Google Search grounding is automatically attached for Google models.

πŸ”§ Improvements

Keytar is now loaded on demand and skipped entirely when LUA_SKIP_KEYCHAIN is set. Fixes MODULE_NOT_FOUND errors in StackBlitz WebContainers and browser sandboxes.

v3.7.0

Released: March 20, 2026

✨ New Features

Use lua chat -t or --thread <id> for isolated sessions. lua chat clear --thread <id> clears one thread. Omit the thread ID with -t to auto-generate a UUID.
--clear / --clear-thread clear history when the session endsβ€”useful after testing without running lua chat clear separately.

πŸ› Bug Fixes

Pushing after removing model from your agent now clears the server-side model (BAC-87).
Help text and examples reference current feature names (e.g. inquiry instead of deprecated tickets).

v3.6.7

Released: March 15, 2026

πŸ› Bug Fixes

Connecting integrations defaults to exposing full MCP tool payloads (hide sensitive off). defer_tools is aligned with Unified.to expectations.
Compiling skills resolves tool references more reliably for imports and dependencies.

v3.6.6

Released: March 11, 2026

✨ New Features

Added lua logs --type agent_error to filter logs for execution errors in tools, webhooks, and jobs.

πŸ› Bug Fixes

Fixed timezone handling for cron schedules and improved error logging for failed cron jobs.

v3.6.5

Released: March 10, 2026

πŸ”§ Improvements

Extended base URLs for internal service discovery.

v3.6.1

Released: March 2, 2026

πŸ› Bug Fixes

interval and once job schedules now compile and push correctly. Previously, the seconds field (interval) and executeAt field (once) were silently dropped during compilation, causing lua push job to fail with:
All three schedule types now work as documented:
Agents that reference imported primitives using instantiation patterns in their config arrays (e.g. jobs: [new MyJob()]) now correctly resolve and compile.
The CLI now exits immediately after completing a command. Previously, a background timer kept the process alive for up to ~1s after all work was done.

v3.6.0

Released: February 27, 2026

✨ New Features

LuaAgent now supports a model property to control which AI model your agent uses. Specify a static model string or a dynamic resolver function.
Supported providers: google/*, openai/*, anthropic/*. Default: google/gemini-2.5-flash.
lua-cli now collects usage data to help improve the developer experience. A new lua telemetry command lets you control data collection:
Or set LUA_TELEMETRY=false in your environment. See Telemetry for details.

πŸ”§ Improvements

keytar (OS keychain access) is now optional. Fixes installation on CI/CD systems without native build tools. Falls back to environment variables or .env file.

v3.5.0

Released: February 20, 2026

✨ New Features

The User.get() method now supports looking up users by email address or phone number, in addition to userId.
Useful for webhooks receiving contact info from external systems.
Connect your agent to 250+ third-party services via Unified.to. When you connect an account, an MCP server is automatically created to expose tools to your agent.
Key Features:
  • OAuth and API token authentication
  • Automatic MCP server creation and activation per connection
  • Event-driven webhook triggers that wake up your agent
  • Server-side finalization for reliable connection setup
See the Integrations Command documentation.
Event-driven triggers that wake up your agent when events occur in connected services.
  • Triggers pre-selected by default in interactive mode
  • Choose between β€œAgent wake-up” mode or custom webhook URLs
  • Friendly labels for OAuth scopes and webhook events
  • JSON output: lua integrations webhooks list --json
Back up your project source files to cloud storage and restore them on any machine.
Key Features:
  • Content-addressed storage with automatic deduplication
  • S3 direct upload β€” no file size limits
  • Efficient incremental backups (only changed files uploaded)
  • Full project recovery on new machines
See the Skill Management documentation.
New global --ci flag makes the CLI fail loudly on missing required arguments instead of silently hanging in non-TTY environments.
See the Non-Interactive Mode documentation.
New lua update command for self-updating from npm, plus a background outdated version warning on every command.
  • Background version check with 24h file cache (zero latency impact)
  • Alpha users stay on alpha channel, stable users stay on latest
  • Boxed warning to stderr when outdated
New lua agents command lists all organizations and agents you have access to.
See the Utility Commands documentation.
You can now define primitive properties using variables and imports β€” not just inline literals.
Supported for: job schedule/retry, skill tools arrays, MCP server resolver functions, and all agent config arrays.
lua push all now pushes everything including persona and backup:
Persona and backup failures are non-fatal β€” the rest of the push completes normally.
The CLI now automatically adds dist-v2/ to your .gitignore: - New projects: Included in lua init template - Existing projects: Added after first successful compilation - Idempotent and safe to run multiple times
lua logs --type mcp # View MCP tool execution logs lua logs --type

πŸ”§ Breaking Changes

These changes may affect existing scripts and workflows. Please update accordingly.
Reason: Avoids confusion with the global --version flag that shows CLI version.
New flag: --verbose for detailed compilation output.

πŸš€ Improvements

lua push --force now automatically checks the server for the highest existing version.Benefit: Prevents β€œVersion already exists” errors during automated deployments.
lua sync now runs compilation first for more accurate drift detection.
Chat now displays preprocessor block response text instead of showing empty responses.
All errors now go through standardized formatting for clearer, more actionable messages.

⚑ Performance

  • Before: 6 sequential HTTP calls (~3-6s)
  • After: All fetched in parallel (~1s)
One HTTP call per primitive type instead of one per entity.
No upfront validation call. The first API call validates the key.

πŸ› Bug Fixes

  • Job Creation: Fixed __exports naming collision when primitives called Jobs.create() at runtime
  • Backup Size Limit: S3 presigned uploads fix β€œrequest entity too large” for large projects
  • MCP Server Duplicates: Intelligent URL merging handles concurrent MCP creation flows
  • Email Channels: Aligned with updated API schema (mode selection, displayName, response types)
  • Agent Config Arrays: Defining jobs: MY_JOBS via variables no longer silently empties the agent
  • Webhook headerSchema: Header validation schemas now correctly pushed to server
  • Tool Conditions: Tools without condition() no longer fail at runtime
  • MCP Server Push: Fixed detection, manifest metadata, and push pipeline (3 bugs)
  • Auth Errors: AuthenticationError properly propagated; 403 Forbidden handling added
  • Compile Sync: Handlers no longer overwrite each other’s IDs
  • Marketplace: Only shows skills with published and approved versions
  • Test Command: Fixed preprocessor test handling for object format

πŸ“ Interface Updates

  • Added UserLookupOptions for email/phone lookup
  • Added EmailChannelMode, CreateGeneratedEmailChannelResponse, CreateExistingEmailChannelResponse
  • Added MCPServerSource enum for tracking MCP server origin
  • Updated User.get() return type to UserDataInstance | null
  • Added 'mcp' and 'mastra' to log type enums

v3.4.0

Released: January 22, 2026

✨ New Features

The lua compile command now uses a safer, non-destructive sync pattern. Instead of automatically deleting primitives on the server that aren’t in your local code, it now:
  • Warns about orphaned primitives (skills, webhooks, jobs, MCP servers)
  • Suggests using explicit delete commands
  • Filters warnings to CLI-sourced skills only (ignores marketplace and manual skills)
This prevents accidental data loss and gives you full control over what gets removed.
Explicit delete commands for managing primitives no longer in your local code:
# Delete a skill from the server lua skills delete --skill-name
Supported transports:
  • 'streamable-http' - Modern MCP standard (recommended)
  • 'sse' - Legacy Server-Sent Events transport
stdio transport removed: Local MCP servers using stdio transport are not supported yet. Use remote servers with streamable-http or sse instead.

πŸ› Bug Fixes

  • Push: Fixed crash when pushing primitives without a version field. First push now defaults to version 0.0.1 and shows β€œ(none - first push)” in prompts.

πŸ“ Interface Updates

  • Added MCPStreamableHttpServerConfig interface for streamable-http transport
  • Updated MCPTransport type to 'sse' | 'streamable-http'
  • Added SkillSource type: 'cli' | 'marketplace' | 'manual'
  • Removed MCPStdioServerConfig (stdio not supported yet)

v3.3.0

Released: January 20, 2026

✨ New Features

All CLI commands now support full non-interactive operation, enabling seamless automation for AI IDEs, CI/CD pipelines, and shell scripting.Design Patterns:
  • Consistent option naming: --<entity>-name and --<entity>-version
  • --force flag for skipping confirmation prompts
  • --json flag for machine-readable output
  • Action arguments for entity management (view, versions, deploy, activate, deactivate)
See the Non-Interactive Mode Guide for complete documentation.
The logs command now supports filtering by user messages and agent responses:
lua logs --type user_message --limit 20 lua logs --type agent_response
Also supported for SSE transport with url and headers resolver functions.
Added filter support to Products.get() with backward compatibility:

πŸ› Bug Fixes

  • Chat: Allow lua chat to work without mandatory skills - agents can now have only webhooks, jobs, or processors
  • Commands: Normalized action handling for case-insensitive action comparisons

πŸ”§ Improvements

  • Chat Command: Informational message when defaulting to sandbox environment
  • Chat Command: Improved visual separation between compile logs and chat response
  • Env Command: Proper error handling for save/delete operations
  • Push Command: Shared helper functions reduce code duplication

v3.2.0

Released: January 13, 2026

✨ New Features

New lua sync command to detect drift between server and local code:
Features:
  • Compare agent name and persona between server state and local code
  • Fetch latest published persona version (excludes drafts and rollbacks)
  • Show colored line-by-line diff for easy comparison
  • Interactive resolution: update local from server or continue with local
  • Integrated into compile flow with --no-sync and --force-sync flags
New lua chat clear command to clear conversation history:
Accepts userId, email, or mobile number as the identifier.
New Lua namespace for runtime access:
Channel is typed as a union type: 'dev' | 'webchat' | 'whatsapp' | 'messenger' | 'voice' | 'api' | 'email'
Access raw webhook payloads in tool execute functions:
Browse marketplace skills now supports pagination:
  • Navigate through pages with Previous/Next options
  • Shows page info (Page X/Y) and total count
  • Configurable page size (default: 10 items)

πŸ”§ Improvements

  • Simplified Agent Creation: Streamlined lua init flow with cleaner prompts
  • Better TypeScript Support: Improved handling of path aliases and variable references in your code

πŸ› Bug Fixes

  • Fixed sync command occasionally showing false drift detection
  • Fixed skill publishing issues
  • Fixed compilation when skills are defined inline vs imported from separate files

v3.1.0

Released: December 7, 2025

✨ New Features

New LuaMCPServer class for integrating Model Context Protocol servers with your agent:
CLI commands:
  • lua mcp - List, activate, deactivate, or delete MCP servers
  • lua push mcp - Push individual MCP servers
  • MCP servers included in lua push all --force
Tools can now have a condition function that determines if the tool is available:
Use conditions to dynamically enable/disable tools based on user subscription, verification status, feature flags, or region.
New CDN namespace for uploading and retrieving files:
New methods for job management:
New lua evals command opens the Evaluations Dashboard with your agent pre-configured. bash lua evals
New Templates namespace for WhatsApp template messaging:
New lua marketplace command for discovering, installing, and publishing skills: For Creators: - Publish skills to the global marketplace - Version management with semantic versioning - Environment variable configuration per version For Installers: - Browse and search for verified skills - Smart installation with dependency checks - Interactive environment variable configuration
The lua logs command now features: - Interactive filtering by primitive type (Skills, Jobs, Webhooks, etc.) - Live data from API including dynamically created jobs - Context-aware log display with detailed metadata
New user._luaProfile property for read-only core user data:

πŸ’₯ Breaking Changes

These changes may require updates to your existing code.
JobInstance now receives the full Job entity with activeVersion:
The welcomeMessage field has been removed from LuaAgent configuration: - For voice: use voiceConfig.welcomeMessage - For chat widgets: use WebchatChannelConfig.welcomeMessage
Webhook execute functions now receive a single event object:
PreProcessorResult now uses a discriminated union:
  • modifiedMessage is now ChatMessage[] (array)
  • Added priority field for execution order
  • Removed context field

πŸ”§ Improvements

  • Data API Type Safety: searchText parameter added to Data.create() and Data.update(), data parameter type changed to Record<string, any>
  • PostProcessor Simplified: Return type now requires modifiedResponse: string, removed async field
  • Compilation: Handle .js extensions for Node16/NodeNext module resolution
  • Template: Minimal by default, use --with-examples flag for examples
  • Web UI: React Query, Sonner toasts, improved env panels, docs in toolbar

πŸ› οΈ Refactoring

  • Removed context field from webhooks, jobs, and postprocessors
  • Removed version field from LuaSkill, LuaJob, and processor configurations
  • Improved push command: displays both webhookId and webhook-name URL formats
  • Rewritten interfaces/jobs.ts to match lua-api DTOs exactly

v3.0.3

Released: October 30, 2025

🎯 User API Enhancement

Enhanced User.get() method now accepts an optional userId parameter:
Use Cases:
  • Fetch data for specific users in admin tools
  • Access user information in webhooks/jobs
  • Multi-user data operations
  • User management features
This enhancement allows tools, webhooks, and jobs to access any user’s data, enabling more sophisticated multi-user scenarios.

v3.0.2

Released: October 30, 2025

πŸš€ Major Improvements to Compilation System

This release brings comprehensive dependency bundling, debug mode, enhanced validation, and critical bug fixes.
All components now properly bundle external dependencies:
  • βœ… LuaWebhooks bundle dependencies (e.g., Stripe, axios)
  • βœ… LuaJobs bundle dependencies
  • βœ… PreProcessors bundle dependencies (e.g., lodash)
  • βœ… PostProcessors bundle dependencies (e.g., date-fns)
  • βœ… Nested Jobs (Jobs.create()) independently bundle their own dependencies
Impact: All compiled components are now truly portable and self-contained, requiring no dependency installation on deployment targets.
Added --debug flag to lua compile command: bash lua compile --debug # or LUA_DEBUG=true lua compile Features: - Verbose step-by-step logging
  • Shows detected imports and dependencies - Displays bundle sizes (uncompressed and compressed) - Preserves temp files for inspection - Shows timing information for each component - Full error stack traces
  • tsconfig.json validation - Clear error if missing or invalid - Empty bundle detection - Warns about suspiciously small bundles (under 100 bytes)
  • Bundle output validation - Ensures esbuild creates valid output - Null config handling - Graceful compilation without lua.skill.yaml - Safe optional chaining - Fixed crash when agentData is null
Context-aware error messages with actionable hints: - Dependency resolution failures β†’ β€œRun npm install” - TypeScript syntax errors β†’ β€œCheck syntax in filename.ts” - Missing files β†’ Shows expected path - Full stack traces in debug mode
Enhanced resolveImportPath() to support:
  • .ts, .tsx, .js, .jsx files
  • Directory imports (index.ts, index.tsx, index.js)
Critical Fix: Relative imports now work correctly in Jobs, Webhooks, and Processors:

πŸ› Bug Fixes

  • Fixed null reference error when compiling without LuaAgent
  • Fixed crash when lua.skill.yaml is missing
  • Fixed compilation with empty agent name/persona
  • Critical: Fixed relative import resolution in all component types

🧹 Code Quality

  • Removed obsolete dynamic-job-bundler.ts
  • Extracted common helpers (extractRelevantImports, bundleAndCompressExecuteFunction)
  • Reduced bundling.ts from 1,149 to 1,036 lines (9.8% reduction)
  • Added 27 comprehensive tests for bundling, execution, validation, and relative imports

v3.0.0

Released: October 2025

πŸŽ‰ Major Release

Version 3.0.0 focuses on developer experience, deployment automation, and real-time chat capabilities.

✨ New Features

The flagship feature: a single, intuitive way to configure your entire agent.Before (v2.x):
After (v3.0.0):
Benefits:
  • Single source of truth
  • Clearer organization
  • Automatic YAML synchronization
  • Better IDE support
Real-time chat responses with improved UX: bash lua chat - βœ… Animated typing indicator while waiting - βœ… Text streams character-by-character - βœ… Sandbox and production environment selection - βœ… Uses /chat/stream endpoint for real-time updates
New command for deploying all components without prompts: bash # Push all with auto-versioning lua push all --force # Push and deploy to production lua push all --force --auto-deploy What it does: 1. Compiles project 2. Reads all components from lua.skill.yaml 3. Increments patch versions automatically 4. Pushes all components to server 5. Deploys to production (if --auto-deploy) Features: - Auto-bumps patch versions (e.g., 1.0.0 β†’ 1.0.1) - Perfect for CI/CD pipelines - Retry mechanism with exponential backoff
Flexible authentication with multiple sources (priority order): 1. System Keychain (macOS Keychain, Windows Credential Vault, Linux libsecret) 2. Environment Variable (LUA_API_KEY) 3. .env File (LUA_API_KEY=...) Usage in CI/CD: bash export LUA_API_KEY=your-key lua push all --force --auto-deploy
Bidirectional synchronization ensures consistency:On lua init:
  • Agent name, persona β†’ YAML + index.ts LuaAgent
On lua compile:
  • LuaAgent persona β†’ YAML
No manual synchronization needed!

πŸ”§ Improvements

  • Excluded lua-cli internals from bundles
  • Reduced bundle sizes by 50-70%
  • Fixed relative import issues
  • Proper sandbox globals (tools use sandbox-provided APIs)
  • code field now properly compressed and included - Execute function properly converts to strings - Excludes lua-cli imports from job execute functions - Better metadata support for passing data
  • Comprehensive template with 30+ example tools
  • Quick Start Guide for new users
  • TypeScript examples with best practices
  • CI/CD integration examples

πŸ› Bug Fixes

Bundling:
  • Fixed Cannot find module '../services/ApiService' in pre-bundled tools
  • Fixed process.cwd is not a function in sandbox execution
  • Fixed lua-cli API code being bundled into tools
Push & Deploy:
  • Fixed webhooks and jobs not found during push all
  • Fixed missing tools array causing validation errors
  • Fixed deployment timing issues with retry mechanism
Chat:
  • Fixed welcome message reading from lua.skill.yaml
  • Fixed streaming endpoint integration
  • Fixed typing indicator cleanup on errors

πŸ’₯ Breaking Changes

These changes require updates to your existing code.
Old Way:
New Way:
Migration:
  1. Wrap your existing skills in a LuaAgent
  2. Add name and persona fields
  3. Run lua compile to sync with YAML
  • Old: /chat/generate/:agentId - New: /chat/stream/:agentId No action needed - handled automatically by CLI.
Jobs must use metadata for data passing:

πŸ“Š Statistics


Upgrade Guides

From v3.0.x to v3.1.0

Required changes:
  1. Update JobInstance access patterns (use activeVersion.schedule, id instead of jobId)
  2. Update webhook execute functions to use event object
  3. Update PreProcessor responses to use discriminated union
  4. Remove welcomeMessage from LuaAgent (configure on channel/voice instead)

From v2.x to v3.0.0

Required changes:
  1. Wrap skills in a LuaAgent configuration
  2. Update jobs to use metadata for data passing
  3. Run lua compile to sync with YAML