Commit Graph

  • 40eaf026c0 Merge remote-tracking branch 'origin/main' main stroblme 2026-11-06 14:39:38 +01:00
  • 5eec267a7e A code-declared node's shim names only its triggering ports, so a non-triggering input with no value yet reaches the function as its own default instead of failing the call stroblme 2026-11-06 14:35:12 +01:00
  • 40e60b422b A querying chart offers its own windows: an optional ranges list of {label, range_s, interval_s}, up to 8 and checked by the server, where range_s 0 asks for the whole history; the editor lists and picks them, and the refresh is capped at what a timer can hold stroblme 2026-11-06 14:33:25 +01:00
  • 261cf1ec2a Assistant answers general questions and stays silent for overheard talk ("Ignored." is not said); stt prompt setting sent as the transcription prompt Melvin Strobl 2026-11-06 07:27:44 +01:00
  • 4c15f4abe1 Test hygiene: empty the flow store between modules, unbind demand on shutdown, poll the hook state in test_flow_ids, count only the watcher under test in the revoked-link test, delete runs.spec's runs stroblme 2026-11-05 08:03:56 +01:00
  • c6ac7f80a9 A batch run fails a node with no value on a triggering input instead of calling it, naming the input and its producer, and skips what waits on it stroblme 2026-11-05 07:35:02 +01:00
  • 78b2c1438c pause_intake answers False when claimed work outlasts its timeout, and reload then resumes intake and raises RebuildBusy before tearing anything down stroblme 2026-11-05 06:43:33 +01:00
  • 1a622edb1f RedisState's compare-and-swap watches through its pipeline, so a write between the compare and EXEC fails the swap; pause_intake waits out a claim already under way, so nothing dispatches after it returns stroblme 2026-11-04 21:53:41 +01:00
  • d028bf326a A batch run skips the nodes waiting on a failed one and ends error; a run whose nodes cannot load fails with the load error before anything executes; cancelling a run stops its pipeline without announcing a pause of the live flow; batch_issues refuses a delay node's interval; the client accepts an engine URL with or without /api/v1; RedisState's compare-and-swap records the names it writes stroblme 2026-11-04 21:38:21 +01:00
  • eb17528ce6 FlowNotFound says whether a published flow or any flow is missing; read_all stamps its cache with the revision from before its scan; dashboard discard and delete commits name the key; a RedisState ttl expires counters and the names set too; bench_startup publishes the version after its saves, and only when there is a draft stroblme 2026-11-04 21:20:29 +01:00
  • b7f1d21712 Docs for key renames: ids and keys in the flow concepts, the rename routes, events and 503s in the API reference, hooks during a rename, sync and run metrics after one; a pinned restore refused for its recorded key names that key in the 409 stroblme 2026-11-03 08:09:35 +01:00
  • f9d5f510c2 Startup deletes the work queue's keys from before it moved from pipeline: to queue: (stream, timers, dead letters, parked lists, done markers), logged with what they held; an old stream still holding undelivered work stays, is logged as an error, and counts as queued work for the keys it names stroblme 2026-11-03 07:55:14 +01:00
  • 3ae5255617 Rename UI: superuser Key row and rename dialog for flows and dashboards (live plan with rewritten documents, counts, refusals and warnings, typed confirmation, what the drain waits for and calling it off); applyRename and the socket's renamed remap the live store and refetch at unchanged URLs, editors whose document moved reload so neither undo nor a queued save restores old bindings, a reconnect checks again and its snapshot replaces values; a retry toast for the rename's 503s, autosaves send themselves again; dashboard saves are based on their own versions only; Playwright rename spec, liveStore check, editor and dashboard docs stroblme 2026-11-02 22:58:41 +01:00
  • ba4aae390d Rename orchestration, splice and routes: a Renamer runs one rename at a time, closing the gate, taking the controller lock and holding the engine, each waiting without a limit and saying what it waits for (summary rename status, rename_waiting); DELETE on the pending request or a closed connection calls it off until the journal begins (409 aborted); then journal, steps and audit, retried in the background on failure (503 completing); splice_renamed rebuilds the affected flows under the held lock keeping stopped, paused and parked work, history limits and device wiring refreshed before activation; AlertManager.rename and EventBus.rename/settle follow the names; flow and dashboard rename routes answer by code and repeat stored results; renamed, dashboard_changed and pipeline_rebuilt after release; fluksio serve reads flow files without building a FlowStore stroblme 2026-11-02 22:14:44 +01:00
  • 2d65118d82 Rename journal, steps and recovery: rename.json (RENAME_JOURNAL_FILE) records each step, documents are written whole and committed alone (FlowStore.replace_documents, identity.write_documents) and rolled back before the journal goes forward; history per run scoped by flow id, alert ledger, alerts.json, state and queue steps idempotent and checkpointed; audit row once per op; recover_documents before assign_ids and recover_runtime before the engine is built, retried until done; repeated requests get the stored result, stale ones 409; plan refuses rename_in_progress; alerts.json written atomically; completeness scanner in the test utilities stroblme 2026-11-02 21:30:01 +01:00
  • fa2a213631 Rename planner and document rewrite: rewrite_documents moves qualified names of the renamed flow in every flow (ports, inputs, outputs) and dashboard binding (one key table, WIDGET_BINDINGS, shared with the WidgetDef accessors, legacy pages included), published and draft, as plain JSON with both variants above either version; plan_rename reports documents, counts, fingerprint, warnings and refusals; superuser plan routes for flows and dashboards; key residue classifies state as the mapper does; duplicate retargets inputs and outputs too; queue reports its Redis version and other consumers stroblme 2026-11-02 21:06:39 +01:00
  • 81bd7c2724 Admission gate for a rename: RenameGate in flow/rename.py, installed by main.AdmissionGate inside CORS, turns mutating API requests away with 503 renaming and Retry-After while closed and drains those admitted without a limit, abortable; affected flows' hooks get 503 or socket close 1013, reads, sign-in, assistant, workers, artifacts and rename routes pass; the run cache misses while the gate is closed; trigger_node lets EngineHeld through instead of reporting a node failure stroblme 2026-11-02 20:53:08 +01:00
  • cb709c19ac Merge branch 'rename-s2' stroblme 2026-11-02 20:32:36 +01:00
  • badcf94491 Engine holds for a rename: the pipeline refuses publish and inline cascades with EngineHeld once those running have finished, the execution service stops claiming and its timers once claimed cascades have finished; both wait without a limit, report what is busy and can be aborted. REST answers 503 with Retry-After, a device frame busy. Redis adds no longer wait for each other, only a queue hold waits for them stroblme 2026-11-02 20:21:17 +01:00
  • be18a94089 Merge branch 'rename-s2' stroblme 2026-11-02 19:58:45 +01:00
  • aa95245456 Merge branch 'ids-clients' stroblme 2026-11-02 19:58:45 +01:00
  • fa15522cb0 Frontend addresses flows and dashboards by id: routes /flows/$flowId, /dashboards/$id and /view/$id, query keys, saves, lists, device pickers, search, brain and endpoint links and generated results dashboards go by id, while live values, issues, pauses and message names keep the key; tabs take the title from the document; creating uses POST and opens the issued id; the flow and dashboard panels show key and id with a copy button and a served HTTP or WebSocket node shows its hook URL under the flow id; specs create by POST and ids.spec.ts exercises issued ids stroblme 2026-11-02 19:57:43 +01:00
  • 46b57de4ec Rename migrations for live state and the work queue: state keys move with RENAMENX in batches (type, TTL and history capacity kept), the queue rebuilds its streams with the same ids, group and pending entries, rewrites timers, parked and held items and done markers, and can hold new work in a list released in order; nothing calls them yet stroblme 2026-11-02 19:50:54 +01:00
  • 9eb0517403 Node-types doc names the training route by flow id stroblme 2026-11-02 19:39:50 +01:00
  • 53916d869b Clients take a flow's id or key: one resolver in the SDK, id first, explicit id:/key:, a warning for reads and a refusal for changes when a name means two flows, deleted flows found by their last key; sync creates by POST, retries a create race through the drift checks and reports the id; MCP gets create_flow and resolves every flow argument with the caller's token; displays show flow_name; an engine from before ids is named as such stroblme 2026-11-02 19:39:14 +01:00
  • ebcc480a8c Rename mapper: flow/namespace.py maps state keys, work items and alert dedup keys from an old flow key to a new one; the state key families and WorkItem fields are registered there, the key builders take their prefixes from it, and done markers read back with queue.done_marker stroblme 2026-11-02 19:28:25 +01:00
  • fd637e0f1e Tests clear flow tombstones between modules with the other engine rows, and the tombstone test commits its prune before checking the count, so a wrong count no longer holds the write lock over the tests after it stroblme 2026-11-02 19:14:59 +01:00
  • d4a1b1db47 History is kept by flow id: runs, cascades, rollups and events file the id in their flow column and nodes as <flow id>.<node>, the API answers flow plus flow_name and shows and takes nodes as <key>.<node>; events carry flow_id from the moment they are published; run queue items, the stage cache and cached curves keep ids and keys apart; endpoints, the brain graph, device bindings and search name the id to open stroblme 2026-11-02 19:01:19 +01:00
  • e6027af8fe Prove the rename's stream rebuild on a real Redis: same ids, group, lag and pending entries after RENAME, ENTRIESREAD set after XSETID because Redis caps it; backend CI gets a Redis 8.2 service stroblme 2026-11-02 18:51:14 +01:00
  • 08a6376836 Flows and dashboards are created by POST under an issued or superuser-pinned id; PUT only updates; deleted flows leave a tombstone with their key; the controller stores by id and runs by key, hooks live under /hooks/<flow id>; a key with state or queued work behind it is refused until cleared stroblme 2026-11-02 17:41:23 +01:00
  • fae85f5ecb Flows and dashboards get ids: the store is addressed by id with a key index, the first start gives every document its key as id, fluksio store migrate --dry-run and ls; the rename routes are gone stroblme 2026-11-02 16:54:11 +01:00
  • de13c48c90 CI stacks come up on the runner again: mosquitto reads its config from /etc/mosquitto, where Ubuntu's AppArmor profile lets it, and Playwright reaches the app on localhost, a secure context for the clipboard spec stroblme 2026-11-02 07:22:32 +01:00
  • c675d2041c Ring face's unit sized inline relative to the reading, so pre-commit's arbitrary font size check passes stroblme 2026-11-02 07:03:39 +01:00
  • 66588c58aa Merge the v0.2.0 worker range fix stroblme 2026-11-01 13:47:19 +01:00
  • 7919cf5670 fluksio requires fluksio-worker 0.2.x: the 0.1 range left the 0.2.0 wheels unresolvable, and publish stopped on it v0.2.0 stroblme 2026-11-01 13:23:51 +01:00
  • 78e1011089 Back to development stroblme 2026-11-01 13:21:13 +01:00
  • 5e3a2f9a62 Release v0.2.0 stroblme 2026-11-01 13:18:37 +01:00
  • 64ef7c84d6 Portal members: a request that loses the adoption race reads back the winner's user instead of being refused stroblme 2026-11-01 11:21:42 +01:00
  • df1071ce73 Message suggestions stay open when an empty field is clicked: the field's own focus no longer counts as outside the list stroblme 2026-11-01 11:17:18 +01:00
  • e6614ff378 Image builds with uv 0.13.6; follow-redirects 1.16.2 and seroval 1.6.12; getting started covers Docker on Raspberry Pi OS and Compose 2.24 stroblme 2026-11-01 10:59:51 +01:00
  • d8eb6968f0 test_wren: load numpy itself, so the BLAS test passes alone stroblme 2026-11-01 10:59:45 +01:00
  • b41684a608 UI: 409 toasts read the message, chat sheet named per tab, 44px phone sidebar trigger, button grids shade as controls, unambiguous chart label key, optional settings typed and cleared to null stroblme 2026-11-01 10:59:43 +01:00
  • 7f40ea62de Duplicating a copy names it after the original; a failed duplicate or delete says why stroblme 2026-11-01 10:59:36 +01:00
  • 8f4c7d8ff1 Worker: wait for a node process's exit status before telling a signal from a failure stroblme 2026-11-01 10:59:35 +01:00
  • 7a7315043d Alerts: a delivery no channel took leaves the cooldown unspent stroblme 2026-11-01 10:59:28 +01:00
  • 83c5f2dfcf A run that starts clears its 'Waiting for a worker' reason stroblme 2026-11-01 10:59:21 +01:00
  • 48d4be6093 Starting a running flow restarts its nodes, so interval and cron Injects keep firing; a params-dict node is told settings arrive by name stroblme 2026-11-01 10:59:14 +01:00
  • e0f5ddc3a4 Devices may publish to their own out ports' messages (a level set on the device itself) Melvin Strobl 2026-10-29 21:58:38 +01:00
  • d2e8c01785 Getting started: own settings go in compose.override.yml, uv waits 120 s for a download Melvin Strobl 2026-10-29 21:35:50 +01:00
  • 75b3a93094 Fix work recovery and reduce engine and chart overhead stroblme 2026-10-29 14:24:17 +01:00
  • 20a0853f69 Entry chunk: signup and the form schemas leave it, build runs without warnings stroblme 2026-10-28 18:02:06 +01:00
  • 87e750c776 Code editor: CodeMirror 6 replaces Monaco stroblme 2026-10-28 17:32:49 +01:00
  • 5d0ea480bf Alerts: a Telegram channel, one chat or group each, connected by a one-time link stroblme 2026-10-28 13:06:58 +01:00
  • bfaaa7cd03 Alerts: cooldowns survive a restart, and a connection must stay down a minute before it alerts stroblme 2026-10-28 12:46:42 +01:00
  • 00842fa175 Health summary: a node is failing after two failures in a row; one is a warning, a good run ends both stroblme 2026-10-28 12:42:35 +01:00
  • 2dc20911a3 Alerts: configuration, test and search entries are a superuser's; subscribing a browser stays open stroblme 2026-10-28 12:40:44 +01:00
  • 29f4d93c2a Search: node settings are indexed, with credentials masked on the server stroblme 2026-10-28 11:07:27 +01:00
  • 2e0ba32124 Node panel: ports read message first on inputs, code name is text until it differs stroblme 2026-10-28 11:04:15 +01:00
  • c04e4883c2 MCP: mcp 2.3 (MCPServer, transport arguments on streamable_http_app, bearer read in middleware); tests for the 2026-07-28 revision and the resource check stroblme 2026-10-28 09:21:01 +01:00
  • c04d6b83c6 MCP tests: the SDK's own client connects over streamable HTTP with a bearer, and older protocol revisions still answer stroblme 2026-10-28 09:11:58 +01:00
  • a6487aeba9 Traefik access log drops the request path, where a hook's secret sits stroblme 2026-10-28 09:10:39 +01:00
  • 439daf5655 Backend: mcp 1.30, uv 0.13 and dnspython 2.9 for their advisories; MCP tokens checked against the resource URL stroblme 2026-10-28 08:42:07 +01:00
  • 9ed2f5fbea Frontend: tar, handlebars, dompurify and zod overridden to their fixed versions stroblme 2026-10-28 08:42:06 +01:00
  • b5e1a4c5b2 Request log: a hook's secret is masked in uvicorn's lines and the tunnel connector's failure line stroblme 2026-10-28 08:41:52 +01:00
  • 5c7a8773ad SDK: sync and run import the declaring module in a child process stroblme 2026-10-28 08:11:14 +01:00
  • 34243e6902 SDK: artifacts work outside a node, run --follow prints status and queue waits, fluksio cancel stroblme 2026-10-28 08:07:35 +01:00
  • 4c2df681d3 Flow canvas: label and edge popovers follow pan and zoom, the editors' dock is a full-width bar on a phone stroblme 2026-10-28 07:38:04 +01:00
  • 5a831ba758 Flow canvas: second value restarts the edge pulse, dock uses the phone's width, search arrives on an input's label popover stroblme 2026-10-27 21:50:18 +01:00
  • f52d9c3077 Service node ends its call when the loop cancels every task; test order and timing leaks stroblme 2026-10-27 21:23:40 +01:00
  • 540c915c5e development.md: the CI section lists all six workflows stroblme 2026-10-27 17:53:03 +01:00
  • e37aa2bdd7 Backend messages and field descriptions that reach the UI lose their em-dashes stroblme 2026-10-27 17:52:55 +01:00
  • 4cb028de41 Chat: one phone header button, quick-prompt chips, double-click to reuse a message stroblme 2026-10-27 17:39:36 +01:00
  • 00cda9d2f1 connector: wanted(port) says whether anyone watches or reads a port Melvin Strobl 2026-10-27 15:20:24 +01:00
  • 7b453af3fe wren node: calibration setting, passed to wren's training as the installation's calibration records Melvin Strobl 2026-10-26 22:17:48 +01:00
  • ba75c78820 wren node: install hints and docs pin the public v2.0.0 tag Melvin Strobl 2026-10-25 17:17:17 +01:00
  • b443240f92 up Melvin Strobl 2026-10-25 14:56:25 +01:00
  • 82c64a10b6 Make documentation standalone and generalize examples Melvin Strobl 2026-10-25 14:43:20 +01:00
  • 96ba512d40 wren node: untrained targets left out of the prompt, a read beside a held-back set goes on whole Melvin Strobl 2026-10-25 12:09:37 +01:00
  • e9941b770d wren node: Train in the panel, as a run of wren's training flow stroblme 2026-10-25 01:18:54 +02:00
  • 07fa5a2dc2 wren node: targets from the wiring, on wren 2 stroblme 2026-10-24 21:28:42 +02:00
  • 6892651e76 Artifact sweep keeps digests named in node settings stroblme 2026-10-24 21:28:35 +02:00
  • aa49972087 docs: no wren model makes brightness calls yet Melvin Strobl 2026-10-23 12:21:43 +02:00
  • 4708265c85 Bump certifi to 2026.10.19 (eMudhra CA distrust) Melvin Strobl 2026-10-23 08:57:14 +02:00
  • a34d47b24f wren node writes the house brightness from lights.set/dim/brighten (wren s11) Melvin Strobl 2026-10-22 22:43:33 +02:00
  • 613eb8a744 wren node takes switches (plug, socket, appliances), refused when the model lacks the kind Melvin Strobl 2026-10-22 17:48:41 +02:00
  • 6b575a4989 wren applies all/every commands itself, answers temperatures, reads aliases and number words; tts says units and clock times Melvin Strobl 2026-10-22 12:34:40 +02:00
  • bf63b3d6d4 wren leaves unnamed areas to the assistant; assistant targets take a closed set of values stroblme 2026-10-22 10:56:20 +02:00
  • f1452f3119 wren sees every area and reads the command plain Melvin Strobl 2026-10-20 08:34:07 +02:00
  • 1a8f6875c4 Assistant confirms a command from the values it set, without a second round Melvin Strobl 2026-10-20 08:26:14 +02:00
  • a286cf4ceb Assistant node, and the Control tab as one conversation (openpanel V5) Melvin Strobl 2026-10-19 23:23:25 +02:00
  • 4df7bdb057 Speech calls keep one connection per server, opened when listening starts Melvin Strobl 2026-10-19 22:06:01 +02:00
  • f50d8b9570 tts speaks MP3: a seventh of WAV's bytes over a slow link to the server Melvin Strobl 2026-10-19 21:55:17 +02:00
  • 16383ea6e2 Voice nodes (openpanel V4): stt, tts, wren reply/unhandled, socket publish Melvin Strobl 2026-10-19 21:34:02 +02:00
  • 85dad39973 Service node: a server kept running on a worker (openpanel V2) Melvin Strobl 2026-10-19 18:43:04 +02:00
  • 80e0201612 Binary uplink takes audio chunks beside image frames (openpanel VS4) Melvin Strobl 2026-10-19 16:04:39 +02:00
  • d18ddad789 Docs: a camera's snapshot_min_s, hold_s at least 2, person on connect Melvin Strobl 2026-10-17 10:44:14 +02:00
  • 72c1d73e96 Camera permission and review fixes (openpanel C3, C4) Melvin Strobl 2026-10-17 09:20:04 +02:00
  • 6a98dcd23f Live view over WebRTC (openpanel L1, server and browser) Melvin Strobl 2026-10-17 08:37:39 +02:00
  • efd883d092 Access log: the pairing poll's ?secret= and a socket's ?ticket= are masked too Melvin Strobl 2026-10-16 21:57:35 +02:00
  • 464490bc37 Docs: keeping a camera's snapshot Melvin Strobl 2026-10-16 21:15:15 +02:00