@ -55,7 +55,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this
| [mariadb.yaml](mariadb.yaml) | MariaDB recorder health and capacity SQL sensors. | `sensor.mariadb_status`, `sensor.database_size` |
| [tugtainer_updates.yaml](tugtainer_updates.yaml) | Tugtainer container update notifications via webhook + persistent alerts, plus event-based Joanna dispatch when reports include `### Available:` (24h cooldown via `mode: single` + delay, no new helpers). | `persistent_notification.create`, `event: tugtainer_available_detected`, `script.joanna_dispatch`, `input_datetime.tugtainer_last_update` |
| [bearclaw.yaml](bearclaw.yaml) | Joanna/BearClaw bridge automations that forward Telegram commands to codex_appliance, include LLM-first routing context for freeform text, relay replies back, ingest `/api/bearclaw/status` telemetry, and expose dispatch plus QMD/memory-index sensors for Infrastructure dashboards. | `rest_command.bearclaw_*`, `sensor.bearclaw_status_telemetry`, `sensor.joanna_*`, `binary_sensor.joanna_*`, `automation.bearclaw_*`, `script.send_to_logbook` |
| [telegram_bot.yaml](telegram_bot.yaml) | Telegram transport package for BearClaw and other ops flows; the shared `joanna_send_telegram` helper now lives under `config/script/`. | `telegram_bot.send_message`, `script.joanna_send_telegram` |
| [telegram_bot.yaml](telegram_bot.yaml) | Legacy Telegram transport marker for BearClaw; the shared `joanna_send_telegram` helper now forwards through the codex_appliance direct Telegram API. | `rest_command.bearclaw_telegram_send`, `script.joanna_send_telegram` |
# Notes: Reply webhook writes JOANNA activity entries to logbook for traceability.
# Notes: Non-urgent autonomous Joanna Telegram replies are suppressed during quiet hours (23:00-08:00) unless the appliance marks `quiet_hours_bypass`; urgent levels and Telegram-initiated conversations still deliver immediately.
# Notes: The callback webhook writes JOANNA activity entries to logbook for traceability and optional HA alerts.
{% set has_user = trigger.event.data.user_id is defined %}
{% set has_chat = trigger.event.data.chat_id is defined %}
{% set allowed_users = (allowed_user_ids_csv | default('', true) | string).split(',') | map('trim') | reject('equalto', '') | list %}
{% set allowed_chats = (allowed_chat_ids_csv | default('', true) | string).split(',') | map('trim') | reject('equalto', '') | list %}
{% set incoming_user = trigger.event.data.user_id | default('') | string | trim %}
{% set incoming_chat = trigger.event.data.chat_id | default('') | string | trim %}
{{has_user and has_chat and allowed_users | count > 0 and allowed_chats | count > 0 and incoming_user in allowed_users and incoming_chat in allowed_chats }}
action:
- variables:
command_text:"{{ (trigger.event.data.args | default([])) | join(' ') | trim }}"
{% set has_user = trigger.event.data.user_id is defined %}
{% set has_chat = trigger.event.data.chat_id is defined %}
{% set allowed_users = (allowed_user_ids_csv | default('', true) | string).split(',') | map('trim') | reject('equalto', '') | list %}
{% set allowed_chats = (allowed_chat_ids_csv | default('', true) | string).split(',') | map('trim') | reject('equalto', '') | list %}
{% set incoming_user = trigger.event.data.user_id | default('') | string | trim %}
{% set incoming_chat = trigger.event.data.chat_id | default('') | string | trim %}
{% set cb = trigger.event.data.data | default('') %}
{{has_user and has_chat and allowed_users | count > 0 and allowed_chats | count > 0 and incoming_user in allowed_users and incoming_chat in allowed_chats and (cb.startswith('/bear_') or cb.startswith('/bc_')) }}
message_id:"{{ trigger.event.data.message.message_id if trigger.event.data.message is defined and trigger.event.data.message.message_id is defined else '' }}"
{% set has_user = trigger.event.data.user_id is defined %}
{% set has_chat = trigger.event.data.chat_id is defined %}
{% set allowed_users = (allowed_user_ids_csv | default('', true) | string).split(',') | map('trim') | reject('equalto', '') | list %}
{% set allowed_chats = (allowed_chat_ids_csv | default('', true) | string).split(',') | map('trim') | reject('equalto', '') | list %}
{% set incoming_user = trigger.event.data.user_id | default('') | string | trim %}
{% set incoming_chat = trigger.event.data.chat_id | default('') | string | trim %}
{% set plain_text = trigger.event.data.text | default('') | trim %}
{{has_user and has_chat and allowed_users | count > 0 and allowed_chats | count > 0 and incoming_user in allowed_users and incoming_chat in allowed_chats and plain_text != '' and not plain_text.startswith('/') }}
action:
- variables:
plain_text:"{{ trigger.event.data.text | default('') | trim }}"