Repository navigation
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #330 +/- ##
==========================================
+ Coverage 88.21% 88.46% +0.25%
==========================================
Files 227 241 +14
Lines 36147 39201 +3054
Branches 2324 2895 +571
==========================================
+ Hits 31886 34681 +2795
- Misses 4257 4515 +258
- Partials 4 5 +1
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
geonnave
force-pushed
the
site-editor-p5
branch
from
October 4, 2026 02:39
7c2c5fc to
b82d446
Compare
geonnave
force-pushed
the
site-editor-p5
branch
from
October 15, 2026 10:57
b82d446 to
ea866d7
Compare
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
… page Any web page in the browser can send requests to 127.0.0.1 with a valid Host header, and behind a permissive CORS policy read the replies, so the Host check alone let it save site.toml; a server bound beyond loopback took any Host. The peer address, Origin and Sec-Fetch-Site are checked. AI-assisted: Claude Opus 5.5
…ng tables A patched file is read back and must give the model that was sent, so a layout the patcher does not follow is refused rather than written. AI-assisted: Claude Opus 5.5
…adable files AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…e saving AI-assisted: Claude Opus 5.5
geonnave
force-pushed
the
site-editor-p5
branch
from
October 15, 2026 11:09
ea866d7 to
ff04149
Compare
Breaking: schema 3 calibration files are refused, so a calibration is collected again. swarmit's own calibration reader still expects schema 3 and needs its matching change before the dashboard reads these files. AI-assisted: Claude Opus 5.5
… block AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…'s next round AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…tangle Breaking, cross-repo: the messages and the config page (magic SWRP, 872 bytes) only match a swarmit bootloader and net core that store stations by mask, and swarmit's Python must accept mask messages before it relays them. Robots below device info 4 are refused with a reflash. AI-assisted: Claude Opus 5.5
…y-run AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…s of their own AI-assisted: Claude Opus 5.5
Breaking wire change, landing with DotBot-libs' 16-bit calibrated field: every advertisement field after the mask moves by one byte and the vendored dotbot_control.wasm is rebuilt at ABI 3 from that change. With the one-byte mask, a calibration naming station 8 or above read every sandbox robot as missing it and resent homographies on each advert. AI-assisted: Claude Opus 5.5
…obots AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…s zero AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…editor AI-assisted: Claude Opus 5.5
…on stills AI-assisted: Claude Opus 5.5
…on save AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…moving ones AI-assisted: Claude Opus 5.5
…leave omitted tables AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…s charger AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
… name AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
…ite pack AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
AI-assisted: Claude Opus 5.5
… panel AI-assisted: Claude Opus 5.5
geonnave
force-pushed
the
site-editor-p5
branch
from
October 15, 2026 12:29
ff04149 to
d988689
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #329 (objects), on #328, #327, #326, #315 and the LH2 stack to #343. Merges after them; until then the diff also carries their commits.
The site editor, until now a page of its own behind
dotbot site edit, can also be opened inside the console, on the controller's own site, and a save shows on the live map without restarting the controller./controller/site-editor/serves the editor's JSON routes over the controller's site pack (no page; the console carries the component). It answers only when the site was read from a pack, else 404, and only requests from this machine's own browser, with the same guard assite edit: the peer address must be loopback, whateverHostsays, and a request whoseOriginorSec-Fetch-Sitenames another site gets a 403. The controller's API allows any origin over CORS, so without that check any web page open in the operator's browser could read and save the pack. A save that wrote the file reloads the site from the pack on the controller's loop, publishes it as asitestream event, and hands the walls, obstacles and chargers to a running simulator, robots where they are; the calibration session takes the new site too. A pack that no longer reads leaves the site as it was, with a warning, and an anchor or extent that no longer matches the loaded calibration is logged.siteevent, so every open console redraws. The component is loaded lazily, so the console's first load does not carry it.basefor its routes and anonClose, and is otherwise the same as the standalone page.Also: an existing proxy test made its own
pytest.MonkeyPatch()and never undid it, which lefthttpx.AsyncClientmocked for every later test in the run; it now uses the fixture.Plan: rendered copy https://claude.ai/artifact/LHUXjhx1nMWifC2oGRBayt, source https://github.com/DotBots/dotbot-workspace/blob/main/plans/site-editor/plan.html (both internal).
While the editor is open over the console, the console's own keys (G, R, the panel keys, its undo of a queued waypoint, Enter confirming a fleet action) stay off; only the stop key stays live. Camera stills load from the controller's routes.
Validation. pytest, against the real controller and simulator on a stepped clock: the panel loads the controller's pack and a save of a wall reaches
/controller/site, thesiteevent and the simulator; a robot driven at a wall drawn while it runs stops at it; another host is refused; a site without a pack has no panel. vitest: the embedded editor talks only to the controller's routes and Close does not stop a server; Edit site is offered only when the routes answer.npm run lint, typecheck and build;pre-commit run --all-files; full pytest 1850 passed, vitest 878 passed; also a remote peer refused whatever its Host, a cross-origin save refused through the console's CORS, the calibration session taking the reloaded site, a pack that no longer reads keeping the site, barriers swapped mid-tick.By hand, headless:
dotbot run simulator --site c405-arenaon a copy of a real pack; the routes answer 200 on 127.0.0.1 and 403 for another Host header or another site's Origin; in headless Chrome, Layers, Edit site opens the editor,dev-corneris narrowed to 500 mm and a wall drawn, Save and Close, and the map draws the wall at once while/controller/siteserves both changes and the file holds them.dotbot/tests/test_site_editor_panel.pydotbot/console-web/src/editSiteButton.test.tsxdotbot/console-web/src/siteEditor/SiteEditor.tsxdotbot/controller.pydotbot/server.pydotbot/console-web/src/App.tsxdotbot/console-web/src/siteEditor/api.tsdotbot/console-web/src/siteEditor/siteEditor.test.tsxRightPane.tsx,siteEditorPanel.test.ts,dotbot/dotbot_simulator.py,siteEditorPanel.ts,dotbot/site_editor.py,useFleet.ts,test_server.py