Bug: when fetchUi('/public') resolves to http://host:port/public, the
isWebBricksBackendResource() check compared the full URL string against
'/public' and always returned false, so _webbricks_=1 was never added.
Fix: extract the path component from full URLs (strip scheme+host) before
running the .ui/.dspy/public/root detection logic. All HTTP methods
(getText/getJson/postJson/postForm) delegate to withBackendContextIfNeeded
which calls isWebBricksBackendResource, so this fix covers all code paths.
- isWebBricksBackendResource() now matches /public and / as WebBricks backend resources
- BricksHttp.kt switched from manual URL query string to Ktor parameter() API
- Added test/generic-client/build.sh for one-click build/run/package
- DevLogStore: centralized log store with Flow-based observation (INFO/WARN/ERROR/EXCEPTION levels)
- DevHttpInterceptor: capture request/response pairs with timing and body details
- DevPanel: bottom panel with Logs/Network/Errors tabs, expandable entries, JSON formatting
- Integrated into BricksHttp (all HTTP methods), BricksParser, ActionDispatcher, Main
- Move Main.kt from shared/ to test/generic-client/ (library module should not have main)
- Add test/generic-client/ as generic bricks-mp desktop host with DevMode toggle
- Add kotlinx-datetime dependency for timestamp handling
- Add materialIconsExtended for DevPanel icons
- Endpoint was /rbac/user/userpassword_login.dspy (401), changed to /rbac/user/up_login.dspy
- Form param was passwd (500 error), changed to password (matches login.ui form field name)