Repository navigation
1.15.0
What's changed
Changes since 1.14.9
🚀 New features
- #2722 - Fold schema component aliases data-driven in the catalog sync (J. Nick Koston (@bdraco))
- #2732 - Waveshare ESP32-C5-Zero (Ludovic BOUÉ (@lboue))
- #2733 - Add an MCP server endpoint (J. Nick Koston (@bdraco))
- #2736 - Add a minimal MCP server library (J. Nick Koston (@bdraco))
- #2739 - Bound concurrent validate streams (J. Nick Koston (@bdraco))
- #2742 - Add a stream client that collects output and the result frame (J. Nick Koston (@bdraco))
- #2745 - Log the frames the collecting client drops (J. Nick Koston (@bdraco))
- #2747 - Add apply_yaml_diff for the automation editor's splice (J. Nick Koston (@bdraco))
- #2749 - Name the stream in the collecting client's drop log (J. Nick Koston (@bdraco))
- #2754 - Add is_device_config_name beside is_secrets_file (J. Nick Koston (@bdraco))
- #2757 - Let automations/delete save the config in one call (J. Nick Koston (@bdraco))
- #2758 - Add scanned_component_entries beside the other device helpers (J. Nick Koston (@bdraco))
- #2762 - Omit component catalog fields that hold their default (J. Nick Koston (@bdraco))
- #2766 - Enforce minimum, maximum and default in MCP tool schemas (J. Nick Koston (@bdraco))
- #2767 - Add job_report and dependent_job to the firmware helpers (J. Nick Koston (@bdraco))
- #2768 - Omit automation catalog fields that hold their default (J. Nick Koston (@bdraco))
- #2773 - Omit default fields on the per-device automation rows (J. Nick Koston (@bdraco))
- #2780 - Let update_config refuse a device YAML that changed since the caller read it (J. Nick Koston (@bdraco))
- #2784 - Let automations/delete refuse an automation that changed or moved since it was listed (J. Nick Koston (@bdraco))
- #2787 - Show both sides in a diff excerpt and pin the delete guard messages (J. Nick Koston (@bdraco))
- #2788 - Let automations/upsert save under the lock and prove what it replaces (J. Nick Koston (@bdraco))
- #2789 - Add an upsert_automation MCP tool that lands an automation in the right place (J. Nick Koston (@bdraco))
- #2794 - Enforce enum, array items and closed nested objects in MCP tool schemas (J. Nick Koston (@bdraco))
- #2801 - Refuse required on an open object in MCP tool schemas (J. Nick Koston (@bdraco))
- #2808 - Leave an untypable typed hub unfiltered and require the restrictive set (J. Nick Koston (@bdraco))
- #2820 - Carry has_condition_gate in the automation catalog (J. Nick Koston (@bdraco))
- #2823 - Type upsert_automation's location and automation in the MCP tool schema (J. Nick Koston (@bdraco))
- #2824 - Append a bounded esphome config run to the upsert_automation MCP reply (J. Nick Koston (@bdraco))
- frontend#1740 - Add the improv_ble navigator row icon (J. Nick Koston (@bdraco))
- frontend#1750 - Tolerate catalog fields the backend omits at their default (J. Nick Koston (@bdraco))
- frontend#1754 - Read absent automation catalog flags as false and backfill body config_entries (J. Nick Koston (@bdraco))
- frontend#1758 - Backfill a script's parameters when the wire omits the empty list (J. Nick Koston (@bdraco))
🐛 Bug fixes
- #2740 - Refuse the secrets filename when creating a device (J. Nick Koston (@bdraco))
- #2743 - Report an unserialisable tool result without claiming the tool failed (J. Nick Koston (@bdraco))
- #2744 - Treat both secrets spellings as the secrets file (J. Nick Koston (@bdraco))
- #2750 - Tell an unreadable job log apart from an empty one (J. Nick Koston (@bdraco))
- #2752 - Answer invalid_args for a malformed automation location (J. Nick Koston (@bdraco))
- #2759 - Answer not_found for a missing config on every automations command (J. Nick Koston (@bdraco))
- #2760 - Refuse a read-modify-write save when the file changed underneath it (J. Nick Koston (@bdraco))
- #2761 - Refuse a config-only rename when the file changed underneath it (J. Nick Koston (@bdraco))
- #2764 - Collect required groups from typed schema branches (J. Nick Koston (@bdraco))
- #2765 - Answer not_found for a vanished config on every device command (J. Nick Koston (@bdraco))
- #2775 - Keep the list item probe from hanging on a codegen MockObj (J. Nick Koston (@bdraco))
- #2778 - Stop a component depending on itself through its auto load closure (J. Nick Koston (@bdraco))
- #2782 - Record the id class a reference needs and the classes its candidates provide (J. Nick Koston (@bdraco))
- #2785 - Tolerate a dropped trailing newline in an expected text and show what differs (J. Nick Koston (@bdraco))
- #2792 - Show a hunk header only when a line under it is shown (J. Nick Koston (@bdraco))
- #2802 - Treat an install without its upload job as a server fault (J. Nick Koston (@bdraco))
- #2806 - Treat a mapping-form interval or script block as a one-item list (J. Nick Koston (@bdraco))
- #2813 - Guard an aliased anchor on every block rewrite and name an alias inside a flow value (J. Nick Koston (@bdraco))
- #2814 - Remember the hostname a flash-free rename leaves on the device (J. Nick Koston (@bdraco))
- #2821 - Resolve an id-less script by the id its listing shows (J. Nick Koston (@bdraco))
- #2825 - Round-trip a scalar wait_until as a scalar (J. Nick Koston (@bdraco))
- #2826 - Inherit a base's sub-blocks in the id walk so split platforms offer their nested sensor ids (J. Nick Koston (@bdraco))
- frontend#1748 - Quote form values that start with a YAML indicator (J. Nick Koston (@bdraco))
- frontend#1749 - Hold the bare !secret tag to its single-key form (J. Nick Koston (@bdraco))
- frontend#1753 - Show required group members in the add component form (J. Nick Koston (@bdraco))
- frontend#1760 - Filter reference pickers by the id class the field needs (J. Nick Koston (@bdraco))
- frontend#1762 - Name a seeded value the form drops and mask an undeclared credential key (J. Nick Koston (@bdraco))
- frontend#1761 - Mask a secure child's value in a block's summary of what it holds (J. Nick Koston (@bdraco))
- frontend#1759 - Give a nested block a required group demands an enable switch (J. Nick Koston (@bdraco))
- frontend#1765 - Read a nested block's own required groups once the block is in use (J. Nick Koston (@bdraco))
- frontend#1764 - List a mapping-form script or interval block as one navigator row (J. Nick Koston (@bdraco))
- frontend#1763 - Leave the search term alone when the Filters menu clears filters (David Coulson (@davidcoulson))
- frontend#1766 - Stop masking the eap key, which is a path to a PEM file (J. Nick Koston (@bdraco))
- frontend#1771 - Read the condition gate off the catalog's has_condition_gate flag (J. Nick Koston (@bdraco))
- frontend#1772 - Derive the add form's constraint gate from the render plan (J. Nick Koston (@bdraco))
🔄 Refactor
- #2734 - Expose the helpers the MCP endpoint reuses (J. Nick Koston (@bdraco))
- #2741 - Export the automation body types from the catalog (J. Nick Koston (@bdraco))
- #2753 - Share one splice implementation between the diff producers and the applier (J. Nick Koston (@bdraco))
- #2756 - Add plain_lines and move the conceal redaction beside the ANSI helpers (J. Nick Koston (@bdraco))
- #2777 - Move the device config read helpers to a neutral helpers module (J. Nick Koston (@bdraco))
- frontend#1751 - Type catalog list rows without the body fields they never carry (J. Nick Koston (@bdraco))
- frontend#1769 - Fold case inside the credential key predicate and look its parent up once (J. Nick Koston (@bdraco))
- frontend#1768 - Hoist two inline regular expressions into named constants (J. Nick Koston (@bdraco))
- frontend#1767 - Ask the credential rules about a key instead of a synthetic YAML line (J. Nick Koston (@bdraco))
📚 Documentation
- #2791 - Say what a null upload_job_id or cancel status means (J. Nick Koston (@bdraco))
- #2798 - Record that esphome owns config validation (J. Nick Koston (@bdraco))
- #2803 - Keep the validation-ownership evidence in one place (J. Nick Koston (@bdraco))
- frontend#1752 - Say a missing config answers NOT_FOUND in the clone and friendly name comments (J. Nick Koston (@bdraco))
🧹 Maintenance
- #2769 - Export refuse_empty_write from the devices helpers (J. Nick Koston (@bdraco))
- #2781 - Pin the expected path's side effects and hoist the secrets name (J. Nick Koston (@bdraco))
- #2809 - Name the untyped variant the sync leaves unfiltered and document the restrictive set (J. Nick Koston (@bdraco))
- #2812 - Return the untyped variant as a sentinel and mirror the keyword order at the call site (J. Nick Koston (@bdraco))
⬆️ Dependencies / CI
6 changes
- #2726 - ci: bump astral-sh/setup-uv from 10.0.1 to 10.1.0 (Dependabot (@dependabot)[bot])
- #2728 - deps: bump ruff from 0.16.6 to 0.16.7 (Dependabot (@dependabot)[bot])
- #2731 - ci: bump codecov/codecov-action from 7.0.0 to 7.1.0 (Dependabot (@dependabot)[bot])
- #2783 - Speed up the Windows pytest job (J. Nick Koston (@bdraco))
- #2816 - ci: bump codecov/codecov-action from 7.1.0 to 7.1.1 (Dependabot (@dependabot)[bot])
- #2817 - ci: bump esphome/workflows/.github/workflows/lock.yml from 2026.8.1 to 2026.9.0 (Dependabot (@dependabot)[bot])