# Changelog
## 0.6.2 — 2026-05-11
### Changed
- Widened the `macula` dep from `~> 4.0.0` (which only allowed 4.0.x) to
`~> 4.3` (≥ 4.3.0, < 5.0.0). macula 4.3.0 adds the `station` MRI type +
the `macula_z32` z-base-32 codec. This lets consumers (notably
`hecate-daemon`) drop the `{overrides, [{override, hecate_sdk, …}]}`
block they were using to force the transitive macula pin up to 4.3.x.
- Bumped the event-sourcing stack into lockstep with `hecate-daemon` —
`reckon_db` `1.6.0` → `2.0.0`, `reckon_gater` `1.3.0` → `2.0.1`,
`evoq` `1.9.1` → `1.14.4`, `reckon_evoq` `1.5.0` → `2.0.0`. The pins
were stale by a full major line (`reckon_db`/`reckon_gater`/`reckon_evoq`
2.x carries the `reckon_gater_types` / `reckon_gater_api` renames); the
daemon was already resolving these to the 2.x line via conflict
resolution, so this just makes the SDK's declared deps match reality.
Compiles clean against the new set.
- `app.src` source link → Codeberg (`hecate-social/hecate-sdk`), the
canonical home since the 2026-04-30 migration.
## 0.5.0 — 2026-03-15
### Added
- `hecate_plugin_codegen` — code generation for plugin scaffolding
- `plugin/1` — full plugin skeleton (callback, supervisor, app.src, rebar.config, manifest.json)
- `division/1` — aggregate + state + state/status headers + CMD/PRJ/QRY department apps
- `desk/1` — CMD desk (command, event, handler, API, tests), PRJ desk (projection, tests), QRY desk (page/by_id endpoint, tests)
- `integration/1` — emitter, listener, process manager, requester, responder (each with supervisor)
- All functions idempotent (skip existing files), return `{ok, [FilePath]}`
- Templates split across 5 focused sub-modules for maintainability:
- `hecate_plugin_codegen_plugin` — plugin + division templates
- `hecate_plugin_codegen_cmd` — CMD desk templates
- `hecate_plugin_codegen_prj` — PRJ desk templates
- `hecate_plugin_codegen_qry` — QRY desk templates
- `hecate_plugin_codegen_integration` — integration templates
- Designed for Martha's coder agent roles to call programmatically from BEAM
## 0.4.2 — 2026-03-15
### Added
- `hecate_plugin_routes` — route discovery from OTP app metadata
- `discover_routes/1` — scans app modules for `routes/0` exports, collects route tuples
- `strip_api_prefix/1` — removes "/api" prefix to avoid double-nesting under plugin mount
- Plugins no longer need to copy-paste route discovery logic
- `hecate_plugin_store:start_extra_stores/2` — create additional ReckonDB stores
- Takes base data dir + list of `{StoreId, SubDir, Label}` specs
- Handles directory creation, store startup, already_started, and error logging
- `hecate_plugin_store:start_subscriptions/1` — start evoq event delivery for stores
- Wires up `evoq_store_subscription` for each store ID
## 0.4.1 — 2026-03-15
### Added
- `hecate_plugin_api` — JSON API utilities for plugin Cowboy handlers
- `json_response/3`, `json_ok/2,3`, `json_error/3` — consistent JSON responses
- `read_json_body/1` — decode JSON request bodies
- `get_field/2,3` — extract fields from maps with atom/binary key support
- `format_error/1` — convert error terms to binary
- `sanitize_for_json/1` — recursively convert `undefined` to `null`
- `method_not_allowed/1`, `not_found/1`, `bad_request/2` — standard HTTP errors
- Built-in metric counting: api_requests on every response, api_errors on error responses
- Plugins no longer need to copy-paste api_utils modules
## 0.4.0 — 2026-03-15
### Added
- `hecate_plugin_metrics` — lightweight metrics facade using OTP `counters` + ETS
- `counter/3` for monotonically increasing values
- `gauge/3` for point-in-time values
- `get_all/0` and `get_plugin/1` for reading metrics
- `?METRIC_INC`, `?METRIC_ADD`, `?METRIC_SET` macros in `hecate_plugin.hrl`
- `hecate_plugin_telemetry` — auto-attaches to evoq and reckon-db telemetry events
- 8 handlers: dispatch, projection, aggregate execute, stream write/read, subscription delivery
- Filters by `store_id` for per-plugin metric isolation
- `hecate_plugin_logger` — OTP logger JSON formatter
- One JSON line per log event with timestamp, level, message, plugin name
- Enriches output with logger metadata (plugin_name, mfa, pid, domain)
- Truncates messages at 4096 characters
- Optional `health/0` callback on `hecate_plugin` behaviour
- Return `ok`, `degraded`, or `{unhealthy, Reason}`
- Plugins that don't implement it are assumed healthy
- `telemetry` as explicit dependency (was transitive via evoq)
- Observability guide (`guides/observability.md`)
## 0.3.0 — 2026-03-14
- Add `hecate_plugin_llm` — capability-based LLM model selection for plugins
- `select_model/1` — pick a model by capability tier (fast/balanced/smart)
- `list_models/0` — list all daemon-managed models
- `chat/2,3` and `chat_stream/3` — delegate to daemon's serve_llm domain
- Classifies models by name patterns (Claude, GPT, Gemini, etc.) and parameter size
- Optional provider filtering via `#{provider => <<"openai">>}`
- Bump evoq dependency to 1.9.1
## 0.2.0 — 2026-03-09
- Add `flag_maps/0` callback to `hecate_plugin` behaviour
- Every plugin with CMD aggregates exposes its bit flag maps
- Daemon auto-mounts at `GET /plugin/{name}/api/flag-maps`
- Frontends decode raw status integers into labels
- Add guide extras to ex_doc configuration
## 0.1.0 — 2026-03-09
Initial release.
- `hecate_plugin` behaviour with callbacks: `init/1`, `routes/0`, `store_config/0`, `static_dir/0`, `manifest/0`
- `hecate_plugin_paths` — standard directory layout for plugin data
- `hecate_plugin_store` — ReckonDB store creation and command dispatch
- `hecate_plugin_cowboy` — route prefixing and static file serving
- `hecate_plugin_ws` — WebSocket upgrade and JSON message framing
- `hecate_plugin_validate` — input validation with type checking
- `hecate_plugin_scheduler` — periodic task scheduling
- `hecate_plugin_ratelimit` — token bucket rate limiter
- `hecate_plugin_files` — file upload/download helpers
- Platform dependencies pinned: evoq, reckon_db, reckon_gater, reckon_evoq, cowboy, esqlite, macula, hackney, qdate, faber_tweann, faber_neuroevolution, gpb