Record the connectors and what is still read-only

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LF61rxW1FG5YCD2J9YqjY
This commit is contained in:
2026-08-16 10:00:10 +02:00
co-authored by Claude Fable 5
parent be6d4fc13c
commit 4de3cd7c66
5 changed files with 28 additions and 0 deletions
+10
View File
@@ -86,6 +86,16 @@ Deferring because out of scope is fine, but don't mention deferring than.
`crypto.hash is not a function` — Vite 7 wants Node 20.12+ and the host has 18. The
Docker image builds fine, so it only bites local bundling; `bunx tsc` still type-checks.
- FEAT/NODE: the connectors only read. Enable the write paths with someone watching:
WF-RAC `setAirconStat` (needs an operatorId registered with the unit first, which is
itself a write) and Art-Net `transmit`.
- FEAT/NODE: the second WF-RAC unit (the one Node-RED addresses with operatorId "0")
closes the connection on an anonymous read. It likely wants an account registered;
the first unit answers without one.
- CHORE/NODE: `wfrac` reports `mode` as "unknown" while the unit is off, because the
mode bits hold a value outside the known set. Faithful to the reference decoder, but
"off" would read better.
## Blocked
- FEAT/UI: a "Bug" icon on the node error bubble opening the logs panel at that node's
+5
View File
@@ -52,6 +52,11 @@ external interfaces. See `docs/architecture/structure.canvas` → *Backend M
packages found through the `fluksio.node_types` entry point group; the
contract is documented in `docs/connectors/` with a working skeleton at
`connector-skeleton/`. The registry follows later
- [x] First real connectors written against that contract from outside the engine:
WF-RAC aircon, calendar, UniFi presence and Art-Net, in `connectors/`.
Built by `make connectors` and installed into the image. Reading only for
now — the aircon package cannot produce a command and Art-Net keeps its
packets off the wire until `transmit` is switched on
- [x] Node lifecycle as a protocol (`start`/`stop`/`report_health` on `Node`),
replacing the controller's per-type isinstance chains — the same hooks a
connector implements, validated on the built-in nodes first
+9
View File
@@ -40,6 +40,15 @@ RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --frozen --package app
# Connectors are ordinary installed packages found through the
# `fluksio.node_types` entry point. `make connectors` builds them into here;
# an image with none is the normal case.
COPY ./backend/connector-wheels /tmp/connector-wheels
RUN --mount=type=cache,target=/root/.cache/uv \
sh -c 'ls /tmp/connector-wheels/*.whl >/dev/null 2>&1 \
&& uv pip install --python /app/.venv/bin/python /tmp/connector-wheels/*.whl \
|| echo "no connectors bundled"'
WORKDIR /app/backend/
# Single worker on purpose: the process hosts the flow engine, and a second
+1
View File
@@ -0,0 +1 @@
*.whl
+3
View File
@@ -0,0 +1,3 @@
Connector wheels built by `make connectors` at the workspace root land here and
are installed into the image. Kept empty in git: a connector is an installed
package, not part of the app.