1688 Commits
Author SHA1 Message Date
openhands 4d720ee03c fix(furni): generate scale 32 from bundles with .png frame keys
CI / check (push) Successful in 2m30s
CI / deploy (push) Successful in 1m25s
CI / publish-container (push) Successful in 48s
resolveNitroFrame now matches spritesheet frame keys that carry a .png
suffix or namespaced naming, and isScale/scaleName preserve that suffix.
Broken source sprites (missing frames or references to icon artwork) are
skipped and reported instead of aborting the whole generation, and the
studio UI surfaces the skipped count.
2026-09-12 12:46:17 +02:00
openhands 0842788a28 fix(studio): resolve hardcoded color violation in organize imports dialog
CI / check (push) Successful in 2m31s
CI / deploy (push) Successful in 1m27s
CI / publish-container (push) Successful in 52s
2026-09-11 23:57:31 +02:00
openhands fdc7a48ef4 feat(studio): add 'only unplaced items' filter toggle to organize imports dialog
CI / check (push) Failing after 1m6s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 23:49:58 +02:00
openhands 0f1da6c178 feat(studio): add reset all overrides action to organize imports dialog
CI / check (push) Successful in 2m39s
CI / deploy (push) Successful in 1m2s
CI / publish-container (push) Successful in 1m14s
2026-09-11 23:46:37 +02:00
openhands e47bee16bb feat(studio): add visual layout previews, automated unit tests and polish organize imports
CI / check (push) Successful in 2m31s
CI / deploy (push) Successful in 1m23s
CI / publish-container (push) Successful in 57s
2026-09-11 23:41:23 +02:00
openhands eb3dc4e88c feat(studio): add batch actions, group search filter and smart unit category rules
CI / check (push) Failing after 30s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 23:35:13 +02:00
openhands 669e20a35c refactor: add and use isValidCatalogLayout type guard for robust layout assignment
CI / check (push) Successful in 2m35s
CI / deploy (push) Successful in 1m19s
CI / publish-container (push) Successful in 50s
2026-09-11 23:28:22 +02:00
openhands 683fee3bd9 fix: resolve layout type errors in organize-imports-dialog
CI / check (push) Successful in 2m29s
CI / deploy (push) Successful in 18s
CI / publish-container (push) Successful in 1m32s
2026-09-11 23:25:53 +02:00
openhands caeb4eb0b3 feat(studio): allow moving imports into an existing page instead of creating ones
CI / check (push) Successful in 2m31s
CI / deploy (push) Successful in 1m19s
CI / publish-container (push) Successful in 45s
Adds a second mode to the organize-imports dialog: instead of creating
one new page per approved group (which could produce dozens of tiny
pages), the user can pick an existing destination page and have every
approved item moved into it.  No catalog page is created in this mode.

- organizeImportFurni: groups accept destinationPageId; when set, the
  existing page is reused, new offers append after its current highest
  order, moved offers keep their original name, and the real page
  caption is used for logging and results
- OrganizeImportsDialog: mode toggle (create pages / move into page),
  searchable destination picker via /api/admin/catalog/tree?search=,
  name/icon/layout editors hidden in move mode, button shows a move
  count, and the success toast reports moved/added instead of pages
- en + nl translations for the new mode, destination, and move keys
2026-09-11 20:44:26 +02:00
openhands 61c7519bea fix(studio): show all offers in the imported-furniture tree
CI / check (push) Successful in 2m23s
CI / deploy (push) Successful in 1m11s
CI / publish-container (push) Successful in 44s
The organize-imports route defaulted to a 500-item limit, silently
hiding offers beyond the first batch of imported pages.  Remove the
effective cap (limit now means 'all', guarded only by a 50k lint cap)
so every offer already sitting in the import tree is returned and
grouped.
2026-09-11 20:33:27 +02:00
openhands 19dc0347df fix(studio): harden organize-imports against long-running queries and hangs
CI / check (push) Successful in 2m33s
CI / deploy (push) Successful in 1m26s
CI / publish-container (push) Successful in 50s
The original GET route used a correlated NOT EXISTS / FIND_IN_SET
subquery over the entire catalog_items table for every recent import
audit entry, causing server timeouts when the audit log or catalog
grew large.  The per-item host-page validation inside the create
action also issued one SELECT + one UPDATE per moved offer.

Changes:
- GET /api/admin/import/organize: replace the correlated subquery
  with a bounded candidate list and a JS-side placed-set check, then
  resolve all needed base items in a single indexed SELECT.  This
  bounds the query cost regardless of catalog or audit log size.
- organizeImportFurni action: validate mover ids in one SELECT, then
  batch every move per group into a single UPDATE with a CASE
  expression instead of one UPDATE per item.
- OrganizeImportsDialog: add a 45-second abort timeout on the fetch
  and a distinct load-error state so the UI never silently hangs.
- Add 'loadError' translation key (en + nl).
2026-09-11 20:24:38 +02:00
openhands 01a85ebcd0 feat(studio): add organize-imports tool with suggestion review and approval
CI / check (push) Successful in 2m22s
CI / deploy (push) Successful in 1m34s
CI / publish-container (push) Successful in 46s
Adds a Studio 'Organize imports' dialog that groups recently imported
furniture and furniture already sitting in the auto-created import
pages into suggested catalog categories.  Each group is presented with
its suggested name, icon, and layout which can be overridden before
approval; approved groups are turned into real catalog pages in a
single atomic export run.  Offers already inside the import subtree are
moved to the new pages; brand-new furniture gets a fresh offer.

- groupSuggestedCategories: generic pure helper reusing the same
  per-item label heuristic that drives suggestCategoryName; items with
  no label land in a 'Other Furni' remainder bucket
- GET /api/admin/import/organize: returns items from the imported
  furniture tree (catalog_items JOIN items_base via page id set from
  the imported-furniture root) union audit-logged but not-yet-placed
  recent imports; marks alreadyPlaced vs new
- organizeImportFurni server action: validates import-page membership
  before moving any offer, creates pages + inserts/moves items in one
  withCatalogExport snapshot, logs activity
- OrganizeImportsDialog: full-featured Studio dialog with price panel
  (applies to new offers only), parent select, per-group approval,
  editable name/icon/layout with suggestion reset chips, source tags
- import-pages.ts server helper: locates the imported-furniture tree
- Studio nav: 'Organize imports' button with FolderTree icon,
  gated on CATALOG_EDIT, wired next to the catalog manager
- en + nl translations for organizeImports.* keys with ICU plurals
- groupSuggestedCategories unit tests (deterministic grouping,
  remainder handling, size+alpha ordering, label consistency)
2026-09-11 19:38:18 +02:00
openhands f5c2c05f6e feat(studio): surface the Visual Catalog Manager in the Studio nav
CI / check (push) Successful in 2m29s
CI / deploy (push) Successful in 1m39s
CI / publish-container (push) Successful in 45s
The catalog manager (with auto-category wizard) now lives inside the Studio
navigation for teams that manage furniture inline. The button is gated on
CATALOG_EDIT; only users with that permission see the launcher.

- Split server/client Studio layout to derive permissions server-side
- Add optional triggerLabel prop to CatalogManagerDialog for custom labels
- Wire the Catalog manager button in the Studio nav right cluster
- Keep existing /admin/catalog entry points unchanged
2026-09-11 18:54:52 +02:00
openhands f832479e52 feat(catalog): add auto-category wizard with live preview and smart suggestions
CI / check (push) Successful in 3m1s
CI / deploy (push) Successful in 2m7s
CI / publish-container (push) Successful in 45s
- Add AutoCategoryDialog: pick furni (or empty page), suggest caption/icon/layout, live preview
- Add createAutoCategory server action (page + offers in one export) with CatalogKind
- Extend furni search API with interactionType
- Share ShopTile and refactor inline-editor/items-shop-preview to use it
- Add suggestion heuristics (suggestCategoryName/dIcon/layout) with tests
- Add autoCategory translations (en/nl)
2026-09-11 18:47:31 +02:00
Simo baeb54aeb5 feat(devops): separate public page server timing diagnostics
CI / check (push) Successful in 2m23s
CI / deploy (push) Successful in 1m13s
CI / publish-container (push) Successful in 44s
2026-09-11 10:49:08 +02:00
Simo d5091d1a73 fix(hk): protect unsaved editors and await prefix save results
CI / check (push) Successful in 2m34s
CI / deploy (push) Successful in 19s
CI / publish-container (push) Successful in 1m24s
2026-09-11 10:48:34 +02:00
Simo 89af4eb1f6 feat(studio): preserve work position and guide import completion
CI / check (push) Successful in 2m20s
CI / deploy (push) Successful in 18s
CI / publish-container (push) Successful in 1m22s
2026-09-11 10:48:09 +02:00
Simo c5a2b44807 feat(catalog): undo bulk offer edits with guarded history restoration
CI / check (push) Successful in 2m1s
CI / deploy (push) Successful in 18s
CI / publish-container (push) Successful in 1m28s
2026-09-11 10:47:46 +02:00
Simo 13bd3695cb feat(studio): recover matching Nitro sources and persist import phases
CI / check (push) Successful in 2m5s
CI / deploy (push) Successful in 1m8s
CI / publish-container (push) Successful in 1m4s
2026-09-11 10:22:06 +02:00
Simo 00e33623f7 feat(devops): diagnose slow HK requests and dependency timings
CI / check (push) Successful in 2m0s
CI / deploy (push) Successful in 1m35s
CI / publish-container (push) Successful in 46s
2026-09-11 09:48:19 +02:00
Simo 3b76d063a6 perf(studio): defer optional panels and trim validator imports
CI / check (push) Successful in 2m2s
CI / deploy (push) Successful in 1m11s
CI / publish-container (push) Successful in 44s
2026-09-11 09:25:21 +02:00
Simo a45d792563 ci: enforce reviewed Linux visual regression baselines
CI / check (push) Successful in 1m50s
CI / deploy (push) Successful in 1m7s
CI / publish-container (push) Successful in 42s
2026-09-11 09:09:05 +02:00
Simo fe1b358ed2 fix(ui): contain mobile article fields and stabilize history checks
CI / check (push) Successful in 1m51s
CI / deploy (push) Successful in 1m3s
CI / publish-container (push) Successful in 42s
2026-09-11 09:05:19 +02:00
Simo 88790d1a0d feat(cms): recover drafts and failed imports with verified UI workflows
CI / check (push) Successful in 2m3s
CI / deploy (push) Successful in 1m31s
CI / publish-container (push) Successful in 1m41s
2026-09-11 08:58:10 +02:00
Simo 410a1e466c fix(ci): keep optional report extraction non-blocking
CI / check (push) Successful in 58s
CI / deploy (push) Successful in 1m24s
CI / publish-container (push) Successful in 48s
2026-09-11 08:42:33 +02:00
Simo cc714b427a ci: report per-route JavaScript budgets from Docker build
CI / check (push) Failing after 54s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 08:41:31 +02:00
Simo 445ef13846 fix(public): distinguish unavailable data from empty results and missing pages
CI / check (push) Successful in 56s
CI / deploy (push) Successful in 1m30s
CI / publish-container (push) Successful in 44s
2026-09-11 00:39:53 +02:00
Simo db4acbb46e feat(editorial): validate publications and preserve partial event updates
CI / check (push) Successful in 57s
CI / deploy (push) Successful in 18s
CI / publish-container (push) Successful in 1m20s
2026-09-11 00:36:55 +02:00
Simo 76f0420d64 feat(import): run catalog synchronizations as durable jobs
CI / check (push) Successful in 57s
CI / deploy (push) Successful in 18s
CI / publish-container (push) Successful in 1m18s
2026-09-11 00:36:22 +02:00
Simo a2954e4408 feat(diagnostics): correlate staff operations errors and audit records
CI / check (push) Successful in 56s
CI / deploy (push) Successful in 19s
CI / publish-container (push) Successful in 1m15s
2026-09-11 00:34:49 +02:00
Simo 440ce4e556 test(me): use committed translations in dashboard tests
CI / check (push) Successful in 55s
CI / deploy (push) Successful in 19s
CI / publish-container (push) Successful in 1m23s
2026-09-11 00:34:21 +02:00
Simo a647b5451f feat(hk): persist named table views for staff accounts
CI / check (push) Failing after 55s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:32:15 +02:00
Simo 74223984dc feat(profile): add privacy controls and progressive photo gallery
CI / check (push) Failing after 53s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:31:29 +02:00
Simo ba9c61d808 feat(search): search public news events users and open rooms
CI / check (push) Failing after 54s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:29:54 +02:00
Simo 506e14783c test(i18n): validate nested housekeeping translation groups
CI / check (push) Failing after 53s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:28:26 +02:00
Simo 96d3e3f602 feat(events): add weekly browsing and personal registrations
CI / check (push) Failing after 53s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:27:41 +02:00
Simo 25d0a13050 feat(support): filter waiting tickets and staff assignments
CI / check (push) Failing after 53s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:20:54 +02:00
Simo 5d18af932d feat(news): add searchable paginated publication archive
CI / check (push) Failing after 53s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:19:12 +02:00
Simo a537c55793 feat(me): show actionable personal tasks with unavailable states
CI / check (push) Failing after 53s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:15:46 +02:00
Simo d9ea93a2e7 test(docker): derive image contract from pinned Node version
CI / check (push) Successful in 55s
CI / deploy (push) Successful in 19s
CI / publish-container (push) Successful in 2m35s
2026-09-11 00:14:43 +02:00
Simo fec8dd3c5d fix(docker): enforce Node version alignment across build stages
CI / check (push) Failing after 53s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-11 00:11:18 +02:00
openhands bcefb0f8ff build: update node engine range in package.json to match .nvmrc
CI / check (push) Successful in 54s
CI / deploy (push) Successful in 1m18s
CI / publish-container (push) Successful in 1m51s
2026-09-10 21:50:03 +02:00
openhands 8baf151d84 build: update node version in .nvmrc to match active runner version 26.8.2
CI / check (push) Failing after 17s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-10 21:49:12 +02:00
openhands 9a8c721111 fix: add avatar imager cache-buster for instant clothing updates
CI / check (push) Failing after 17s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-10 21:42:30 +02:00
openhands 75eada7a59 Replace DragonflyDB with Valkey throughout codebase
CI / check (push) Failing after 18s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
- Update all DragonflyDB references to Valkey in README and docker-compose.yml
- Update install instructions to use Valkey package repository and .deb download
- Update configuration paths from /etc/dragonfly/ to /etc/valkey/
- Update version requirement to Valkey 8.x+ (successor to Redis OSS)
2026-09-10 17:52:47 +02:00
openhands cea88eaa57 feat(catalog): repair page hierarchy cycles and duplicate sibling page order
CI / check (push) Successful in 1m3s
CI / deploy (push) Successful in 1m23s
CI / publish-container (push) Successful in 47s
The Arcturus errors "page hierarchy contains a cycle page 354 and 357" and
"sibling order 1 is used more than once (111 problems)" come from
catalog_pages, not catalog_items: pages 354/357 point at themselves, and
many parents have child pages sharing the same order_num. Extend the
emulator catalog scan + fix to detect both: pages whose parent chain loops
back get detached (parent_id = 0 on the highest cycle member) and every
affected parent's children are renumbered sequentially, preserving their
current relative order.

Add scripts/diag-emulator.ts to inspect the live catalog state.
2026-09-10 11:50:27 +02:00
openhands acbe54fcb7 style: apply biome lint fixes to catalog files and live repair tests
CI / check (push) Successful in 55s
CI / deploy (push) Successful in 1m23s
CI / publish-container (push) Successful in 45s
2026-09-10 11:32:20 +02:00
openhands 3e69b72513 feat(catalog): prevent and repair Arcturus emulator data errors
CI / check (push) Failing after 26s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
Block invalid catalog_items writes at the API level (points currency
allowlist, non-negative prices, positive amount, limited stack >= sold
count, unique sibling order numbers) and auto-assign unique order numbers
on bulk create. Add a catalog-maintenance scan + transactional repair that
fixes pre-existing rows: resets unsupported points_type, clamps negative
costs, sets amount to 1, raises limited_stack, renumbers duplicate orders
and deletes offers with missing page/item references. Surface the issue
count and a fix button in the admin maintenance panel.

Also: add enabled/retired flag to clone sources, classify poster and
currency furniture in item-kind, and remove the obsolete update-Nitrov3.sh.
2026-09-10 11:29:28 +02:00
Simo ad65d80d41 fix(ci): format catalog repair audit write
CI / check (push) Successful in 52s
CI / deploy (push) Successful in 1m27s
CI / publish-container (push) Successful in 48s
2026-09-09 22:01:40 +02:00
Simo 1ef405be0a feat(cms): add recovery history and operational reliability tools
CI / check (push) Failing after 22s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped
2026-09-09 21:57:56 +02:00