Skip to content

[pull] master from industrial-optimization-group:master#149

Merged
pull[bot] merged 28 commits intolight-weaver:masterfrom
industrial-optimization-group:master
Apr 2, 2026
Merged

[pull] master from industrial-optimization-group:master#149
pull[bot] merged 28 commits intolight-weaver:masterfrom
industrial-optimization-group:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Apr 2, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

- Add what-if scenario simulation to Decision Journey view
- New backend POST /method/enautilus/simulate endpoint runs E-NAUTILUS greedily to completion for a
chosen objective (best or worst), ephemeral with no DB writes
- New ENautilusSimulateRequest/Response/StepResult models with deprioritize flag for worst-case
selection
- Frontend what-if buttons in iteration detail panel: "best" (blue) and "worst" (red) per objective
- Chart overlay renders simulated path as dashed lines with hollow circle markers
- Comparison table shows actual vs what-if final values with colored deltas
- Extract normalizePoint, buildNormalizationMaps, computeSimulatedJourneySteps helpers in
journey-utils
- Highlight selected iteration in chart with vertical band
- Default visualization pane to 65% height for more chart room
- Regenerate frontend client
- Added map support to the UI
  - Replace hardcoded clinic map system with metadata-driven site selection map
  - Add SiteSelectionMetaData DB model (follows ForestProblemMetaData pattern)
  - Add POST /site-selection/load_metadata endpoint (with ownership check)
  - Add POST /site-selection/map endpoint (reads metadata + solution variables)
  - Remove /clinic/ router, ClinicMapRequest/Response models, and clinic_map.py
  - Rename clinic-map.svelte to site-selection-map.svelte (accepts problem_id prop)
  - Add map metadata upload dialog on Problems page (JSON file upload)
  - Fix orval import mismatches after regeneration (getProblemProblemGetPost, addRepresentativeSolutionSet)
  - Fix swapped arguments in fetch_interactive_session call (utils.py line 229)
  - Add test_site_selection.py with model and endpoint tests
- Fixed relative path making conftest hang on Dimitry test problem
- Add constrained variant endpoint POST
  /problem/{problem_id}/constrained_variant
- Add VariableFixing, ConstrainedVariantRequest,
  ConstrainedVariantResponse models
- Add is_temporary and parent_problem_id fields to ProblemDB for variant
  tracking
- Use SessionContextGuard for ownership/existence checks in the new
  endpoint
- Simplify DELETE /problem/{problem_id}: owners can delete any of their
  problems
- Add test_constraint_variant.py with 12 tests (model, endpoint, delete
  behavior)
- Fix infinite loop in dmitry_forest_problem_disc() (use relative path
  instead of walking to /DESDEO)
- Regenerated Orval clients
- Fix SessionContextGuard HTTP status codes: 404 for missing resources,
  403 for ownership failures (was 400 for both)
- Update fetch_user_problem to query by ID first, then check ownership
  separately
- Update test_delete_problem.py: unauthorized deletion now correctly
  expects 403 instead of 401
- Update test_constraint_variant.py: wrong_owner expects 403, not_found
  expects 404
- Add map interaction: click site markers to cycle free → restricted →
  forced
- Multiple sites per city node are constrained together
- Re-solve with RPM using E-NAUTILUS final objectives as aspiration
  levels
- Constrained variant inherits parent problem's solver metadata
  (pyomo_cbc)
- Fix tensor variable indexing in constraints: use ["At", symbol,
  ...indices] for Pyomo compatibility
- Unroll tensor variables in RPM results for frontend compatibility (sv
  → sv_1..sv_60)
- Return site_variable_symbols and site_node_names from
  /site-selection/map endpoint
- Add comparison bottom panel with tabbed Parallel Coordinates /
  Comparison Table views
- Solution tab shows constrained solution with original as dashed
  comparison line
- "Use this solution" accepts constrained result, "Reset" reverts to
  original
- Clear constraint markers after successful re-solve to show natural
  solution colors
- Cleanup temporary problem variants on reset, navigation, and re-solve
- Updated api client to use correct url's for api calls in debug/deploy.
- Fixed some URL resolving issues and passing access token cookies
  correctly in the UI (mostly affecting deployment).
- Add catch-all proxy route /api/[...path] that forwards browser API calls
  to the upstream API using event.fetch, so handleFetch intercepts for
  cookie injection and 401/token-refresh handling
- Fix getUrl to return relative /api/<path> on the browser side instead of
  a direct cross-origin URL, routing all browser traffic through the proxy
- Switch server-side detection in getUrl from process.env check to
  typeof window === 'undefined' with http://localhost:8000 fallback
- Remove client-side 401 retry logic from customFetch — now handled
  server-side by handleFetch via the proxy
- Remove dead Vite /api proxy config from vite.config.ts
- Updated docs to include guide on how to setup fullstack on OpenShift
  using the oc tool from a terminal.
- Polished deployment files.
- Add /manage-users page for analysts and admins to create DM and
  analyst accounts.
- Guard the route server-side; restrict POST /add_new_dm API endpoint to
  analyst/admin (was public)
- Populate auth store on topbar mount via /user_info to enable
  role-based nav visibility
- Enable Orval Zod body schema generation and regenerate client
- Fix API_BASE_URL in webui README
- Added endpoint to get a list of DM users.
- Modified endpoints for adding problems so that admin and analyst users
  may add problems for other users.
- Tested the new and modified endpoints.
- Analysts and admins can view, delete, and manage all users' problems
- Added fetch_problem_with_role_check helper in utils.py (role-aware
  ownership bypass)
- Problem listing endpoints return all problems for analysts, own only
  for DMs
- Problem action endpoints (delete, solver, JSON, repr sets) allow
  analyst access to any problem
- Problems UI: user filter dropdown (default "Myself"), Owner field in
  detail panel
- Problems define page: DM selector for analyst to assign problem to a
  DM on creation
- Fixed test_delete_problem_unauthorized (analyst role changed to DM)
- Regenerated orval client with new DM users endpoint and target_user_id
  params
- Analysts and admins can view, create, and delete interactive sessions
  for any user
- Added fetch_interactive_session_with_role_check helper in utils.py
  (role-aware ownership bypass)
- Session listing returns all sessions for analysts, own only for DMs;
  empty list returns 200+[] instead of 404
- POST /session/new accepts ?target_user_id= for analysts to create
  sessions on behalf of DMs
- GET /session/get/{id} and DELETE /session/{id} now enforce ownership
  for DMs (fixes latent security bug)
- Fixed InteractiveSessionBase missing from_attributes=True (POST
  /session/new was returning {})
- Sessions UI: user filter dropdown (default "Myself"), Owner column,
  "Create for" DM selector
- Regenerated orval client with new session endpoint params
- Updated config files.
- Updated docs on how to deploy on Openshift
@pull pull Bot locked and limited conversation to collaborators Apr 2, 2026
@pull pull Bot added the ⤵️ pull label Apr 2, 2026
@pull pull Bot merged commit 8d68b87 into light-weaver:master Apr 2, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant