Skip to content

Release 1.1.0: promote beta to stable - #69

Merged
dkmaker merged 47 commits into
mainfrom
beta
Sep 13, 2026
Merged

dkmaker merged 47 commits into
mainfrom
beta

Conversation

@dkmaker

@dkmaker dkmaker commented Sep 13, 2026

Copy link
Copy Markdown
Owner

Promote the beta integration branch to main for the 1.1.0 stable release. Brings web search + in-app setup, responsive chat layout, per-user sessions, buildx-on-native-runners CI, and the batch of drawer/bug/guardrail fixes. Merge (not squash) so release-please computes the stable changelog from the true commit history.

github-actions Bot and others added 30 commits September 12, 2026 18:29
Ports the standalone web-search extension into the add-on, adapted:
- Providers: perplexity (API), perplexity_openrouter (Perplexity models via
  OpenRouter), brave (Brave Search). Chosen in a new websearch config section.
- HA-tailored intents: docs, troubleshoot, howto, quick, search. No disk cache.
  Never uses a deep-research model.
- Registers ONLY when enabled + keyed (lib/websearch-config.ts); disabled leaves
  no tool and no prompt footprint. When enabled, injects a 'validate via search
  instead of pre-trained knowledge' instruction into the system prompt.
- Rich output via defineHaTool (kind:message markdown + Sources); tool-meta entry
  for the web_search render block.
- config.yaml websearch section + schema, init-pi env mapping, en/da translations.
Web search is now set up inside the Pi Agent panel (⚙️ settings) like the AI
provider, not via editable config.yaml fields:
- provider-setup.ts: a 'Web search (optional)' section — provider + API key,
  Test&save, disable, live status.
- engine.ts: readWebsearch + validateWebsearch (real per-provider test call) +
  saveWebsearch/disableWebsearch → writeAddonOptions(websearch) → set WEBSEARCH_*
  env → reloadTools() (loader.reload + rebuild session) so web_search registers
  LIVE with no restart. WS save_websearch/disable_websearch + websearch_status.
- types.ts / chat-app.ts / i18n: websearch events, status plumbing, labels.
- config.yaml websearch is now an app-managed stub (translations updated); the
  beta tile mirrors it, enforced by dev-scripts/check-beta-config.py wired into
  build.yaml (this drift hid web_search from beta.1). Refs #EFEAR? no — web_search.
The in-app websearch validate call sent max_tokens:1, which Perplexity (and
Perplexity-via-OpenRouter) reject with HTTP 400 'max_tokens must be at least
16'. Bump to 16 so Save & test succeeds.
Full-window width felt wrong on desktop. Cap + center ONLY the message rows at
900px (--pi-maxw); the header/nav bar and the composer (chat input) stay full
width. Bubbles are 90% max — user right-aligned, assistant replies left-aligned.
Tool blocks keep the message-column width. On mobile the rows just fill the
viewport (max-width only caps).
…rger

On phones the in-app header stacked under Home Assistant's own ingress header,
wasting vertical space. Below 640px: hide our header entirely and show a menu
burger at the bottom-left of the composer that opens the drawer. Moved AI
settings and the theme toggle into the drawer (alongside new chat + setup) so
every header action stays reachable. Desktop keeps the full top header.
beta is the integration branch (feature PRs target beta); main is
release-only via a beta->main merge at stable time. Every commit must
carry its true Conventional-Commit type so features flow cleanly on
beta->main and both release-please changelogs stay correct.
…lease flow

Grounded in release-please's branch-history model (googleapis/release-please#2515):
features are authored once on beta and promoted to stable by git-merging
beta->main, never cherry-picked. Adds the post-release main->beta back-merge
and the Release-As graduation note.
…cal goes stale)

release-please + the tile-sync bot push to both main and beta on their own,
so local refs fall behind origin — fetch and branch/rebase onto the remote ref
before working.
The virtual /setup-guide session row in the drawer is no longer used. Removed it
from the history list; the wizard stays reachable via the welcome-screen chip.

Closes #WSWXV
pi's bash has no default timeout and an effectively unbounded max, so a command
with no timeout runs forever. Clamp event.input.timeout in the tool_call hook
(default 60, max 600); in-place mutation is honored by the agent loop.

Closes #EFEAR
On WS (re)connect the engine sent config/websearch/stats/sessions but not the
active session history, so a page reload dropped to a blank new chat. Send the
current history (+ title) on connect; empty for a fresh session.

Closes #DMDQW
…t slow

amd64 built in 1.4 min while the aarch64 leg hung ~50 min on the deprecated
home-assistant/builder@master action. Never wait out a stalled build.
The mobile drawer rendered AI provider & theme as .sess rows under the Sessions
heading, so they looked like virtual chat-history entries. Move them into a
distinct icon-labelled actions group above a divider; the Sessions list now only
holds real chats.
@master is deprecated + moving and hung the aarch64 leg for ~50 min during the
beta.4 build. Pin to the latest immutable release for reproducible builds. Full
BuildKit migration tracked in #H5U58.
The builder action resolves the builder *image* by its own version tag, and
only 2026.02.1 has a published {arch}-builder image. Pinning the action to
2026.06.0 made it pull ghcr.io/home-assistant/amd64-builder:2026.06.0 which
does not exist (manifest unknown) and the build failed. 2026.02.1 is the last
tag with a real builder image — what @master silently falls back to — so it is
immutable and working.

Release-As: 1.1.0-beta.6
dkmaker and others added 17 commits September 13, 2026 14:24
…stant/builder)

Replace the deprecated home-assistant/builder action with docker buildx +
docker/build-push-action, building each arch on its NATIVE runner (ubuntu-latest
for amd64, ubuntu-24.04-arm for aarch64) — no QEMU emulation, so aarch64 builds
fast instead of the ~15-20 min emulated builds that hung beta.4. The Dockerfile
is already buildx-ready (ARG BUILD_FROM). Per-arch image names + io.hass labels
are preserved; PR builds build without pushing. Resolves the deprecated-builder
+ slow/hung-aarch64 problems (#H5U58).

Release-As: 1.1.0-beta.7
…r sessions

Sessions were global — every HA user saw the same conversation + session list.
Now each user (X-Remote-User-Id from ingress) gets its own AgentSession, event
stream, and single-flight lock, held in a Map (cap 5, LRU-evict idle). Sessions
run in PARALLEL across users, one turn at a time per user, on the shared
ModelRuntime (HA WS is id-multiplexed so concurrent tool calls are safe).

Storage is isolated via a per-user sessionDir (SessionManager.create/list/open
take a sessionDir separate from cwd) — cwd stays agentCwd so tools/scratch/
write-guard are unchanged. Idle sessions (>30 min, no clients) dispose to free
heap and reopen from disk on demand. pi_agent.ask keeps its own isolated
ephemeral session + queue. Model change applies via setModel (preserves each
user's conversation); websearch enable recreates sessions to re-register tools.

Closes #NANH3
Add a firm Core Principle: talking/asking is not a command to change things.
When the user asks or discusses, answer or propose — do not create/edit
automations, scripts, helpers, config, write files, or call side-effecting
services unless told to do that specific thing. May show a plan or proof, then
wait for an explicit go-ahead. Stops the agent running off coding on its own.
Reframe the scope guardrail around identity + method: it is a Home Assistant
assistant that behaves like a knowledgeable USER, not a software developer. It
must always use approved, normal Home Assistant ways (API tools, standard config,
conventions), never hack or work around guards (.storage edits, write-guard
bypass, shell tricks), and when there is no normal path it must propose and get
explicit user approval before going off the beaten path.
On desktop the AI-provider/model and theme controls already live in the
top-right header, so repeating them in the drawer's action group was
redundant. The header is hidden on mobile (<=640px) where the drawer is the
only way to reach them, so scope .drawer-actions to the mobile breakpoint.
# Conflicts:
#	addon/translations/da.yaml
#	addon/translations/en.yaml
@dkmaker
dkmaker merged commit 762f76a into main Sep 13, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant