Changelog
View SourceAll notable changes to lemon_gateway are documented here.
The format follows Keep a Changelog;
releases follow Semantic Versioning from 0.1.0 onward.
[Unreleased]
First release as a standalone package. This release is mostly about what the gateway no longer knows: it went from an application wired to a specific coding agent to an engine runtime anything can register with.
Added
LemonGateway.EngineRegistry.register/1— engines register themselves at boot instead of being named in the gateway's compiled-in engine list. Registration also updates:lemon_gateway, :engines, so a registry restart keeps the engine, and a configured engine whose module is absent from the build is skipped rather than crashing the registry. This is how the platform stopped depending on any particular agent implementation.LemonGateway.Workspacereadsconfig :lemon_gateway, :workspace_dir(accepting an{module, function, args}tuple), replacing a direct call into a specific agent's configuration.LemonGateway.Config.replacement_config/0, so the application that owns an environment key is the one that reads it.- The engine runtime registers three capabilities —
engine_registry,transport_registryandgateway_config— throughLemonCore.EngineInfoBridge. Other packages asklemon_coreabout the gateway instead of constructingLemonGateway.*atoms at runtime.
Changed
Engine.cancel/1is now total and idempotent. Every built-in CLI engine used to raiseFunctionClauseErrorwhen handed a context it did not recognise; cancelling an unknown or already-finished run is now a no-op. The contract is written down inLemonGateway.Engine's moduledoc, along with the steer invariant, andLemonPlatformTest.EngineCaseturns it into tests.- The gateway no longer writes chat state; the router is its single writer.
- Ingress (the HTTP webhook listener and the Twilio SMS utility) is documented
as gateway-owned by design rather than as "legacy" awaiting migration. It is
off by default and stays here because it needs synchronous HTTP responses,
which the channel
Pluginbehaviour deliberately does not offer.
Removed
- The Farcaster transport is gone (about 1.4k LOC of transport and tests,
plus its configuration keys, validators and 6 environment variables:
FARCASTER_*andLEMON_GATEWAY_ENABLE_FARCASTER). It was off by default and unused. If you were running it, pin the previous revision. - The email transport is gone, replaced by
LemonChannels.Adapters.Emailinlemon_channels— email is a conversational channel, and this package no longer pretends otherwise. Threading state carries over untouched (same:email_message_threads/:email_thread_statetables), and the adapter still reads the TOML[gateway]emailblock, so an existing relay, sender and webhook token keep working without edits. Two changes worth knowing: inbound now arrives onLemonChannels.InboundHttpatPOST /emailwith the token in anx-webhook-tokenheader rather than on the gateway's own listener, andenable_emailno longer does anything here.gen_smtpandmailare no longer dependencies of this package. - The dependency on any specific coding agent. The in-process engine shim moved to the agent that owns it and registers itself; the edge now points from the agent to this package.
Known gaps
- Voice support is deferred and undocumented.