feat: Home Assistant API tools (ha_get_state, ha_get_states, ha_call_service)

Register three HA orchestrator tools so Inara can read device states and
control devices via the HA REST API. ha_call_service requires admin role
and user confirmation. Also includes accumulated UI fixes (setProcessing
helper, wasNewSession flag cleanup).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-05-11 21:39:35 -04:00
parent ba91de37c5
commit fc6600c33e
5 changed files with 334 additions and 15 deletions

View File

@@ -71,6 +71,11 @@ from tools.agent_notes import (
agent_notes_clear as _agent_notes_clear,
)
from tools.agents import spawn_agent as _spawn_agent
from tools.homeassistant import (
ha_get_state as _ha_get_state,
ha_get_states as _ha_get_states,
ha_call_service as _ha_call_service,
)
# ── Declaration imports ───────────────────────────────────────────────────────
@@ -85,7 +90,8 @@ import tools.reminders as _mod_reminders
import tools.scratch as _mod_scratch
import tools.notify as _mod_notify
import tools.agent_notes as _mod_agent_notes
import tools.agents as _mod_agents
import tools.agents as _mod_agents
import tools.homeassistant as _mod_homeassistant
# ── Tool categories — used by the Model Registry UI for grouped checkboxes ───
@@ -109,6 +115,7 @@ TOOL_CATEGORIES: dict[str, list[str]] = {
"Aether Tasks": ["ae_task_list"],
"Agent Notes": ["agent_notes_read", "agent_notes_write", "agent_notes_append", "agent_notes_clear"],
"Agents": ["spawn_agent"],
"Home Assistant": ["ha_get_state", "ha_get_states", "ha_call_service"],
}
# ── Callable registry ─────────────────────────────────────────────────────────
@@ -164,6 +171,9 @@ _CALLABLES: dict[str, callable] = {
"agent_notes_append": _agent_notes_append,
"agent_notes_clear": _agent_notes_clear,
"spawn_agent": _spawn_agent,
"ha_get_state": _ha_get_state,
"ha_get_states": _ha_get_states,
"ha_call_service": _ha_call_service,
}
# ── Role-based access control ─────────────────────────────────────────────────
@@ -185,6 +195,7 @@ TOOL_ROLES: dict[str, str] = {
"nc_talk_send": "admin",
"http_post": "admin",
"nc_talk_history": "admin",
"ha_call_service": "admin",
}
# Tools that require explicit user confirmation before executing.
@@ -196,6 +207,7 @@ CONFIRM_REQUIRED: set[str] = {
"cron_remove",
"reminders_clear",
"http_post",
"ha_call_service",
}
_ROLE_RANK: dict[str, int] = {"user": 0, "admin": 1}
@@ -221,6 +233,7 @@ _ALL_DECLARATIONS: list[types.FunctionDeclaration] = (
+ _mod_ae_tasks.DECLARATIONS
+ _mod_agent_notes.DECLARATIONS
+ _mod_agents.DECLARATIONS
+ _mod_homeassistant.DECLARATIONS
)
# Full Gemini Tool object (all tools — use get_tools_for_role() in production)