Commit Graph
948 Commits
Author SHA1 Message Date
openhands 172941c542 perf(import): parallelize ID allocation and raise clone concurrency to 10
CI / check (push) Successful in 27s
CI / release (push) Skipped
CI / deploy (push) Successful in 41s
Replace the serialized SELECT MAX + INSERT id-allocation chains for
items_base and catalog_items with a lazy-seeded in-process counter so
concurrent clone workers no longer queue on a global lock per item.
Re-seeds after 60s idle to avoid colliding with externally added rows.
Raise the clone import concurrency default from 6 to the batch cap of 10.
2026-08-05 11:37:17 +02:00
openhands 742536820a fix(ci): update smoke contract for custom db:migrate runner
CI / check (push) Successful in 29s
CI / deploy (push) Successful in 1m8s
CI / release (push) Skipped
2026-08-05 11:25:18 +02:00
openhands e8209df294 fix(db): restore custom migration runner for db:migrate
drizzle-kit migrate requires a meta/_journal.json in the out folder which
this repo does not use (plain SQL under drizzle/migrations/). Point
db:migrate back at scripts/apply-migrations.ts so CI deploys can apply
CMS DDL again.
2026-08-05 11:23:32 +02:00
openhands 4816d3eebf fix(ci): add missing biome:lint script used by the CI workflow
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Failing after 1m52s
2026-08-05 11:13:55 +02:00
openhands bdcf1451f8 Revert "chore(deps): update dependency tsx to ^4.23.6"
CI / check (push) Failing after 9s
CI / release (push) Skipped
CI / deploy (push) Skipped
This reverts commit b892786ff8.
2026-08-05 11:11:12 +02:00
openhands b7f14ff5e6 Revert "chore(deps): update dependency tsx to ^4.23.7"
This reverts commit ac9b3e3cb5.
2026-08-05 11:11:12 +02:00
openhands dd708a64fb fix(import): make effects and figure/clothing import work on deployment
- resolveGamedataFile: detect Windows drive/UNC paths explicitly instead of
  path.win32.isAbsolute (which is true for any /-prefixed path on Linux), so
  /nitro-assets URLs are no longer returned verbatim; add deployment gamedata
  root fallback (/var/www/Gamedata/config) and keep public/Gamedata/config.
- effect/figure import dirs now resolve via site settings then the gamedata
  root bundled dir, instead of hardcoded public paths.
- effect list falls back to the local EffectMap when the official habbo.com
  endpoint is unreachable, keeping the admin import page usable.
- update staff smoke contract for db:migrate and instant=false (Cache
  Components migration).
2026-08-05 11:10:16 +02:00
openhands 694a24c791 fix(news): resolve null destructuring type errors in article page
.catch(() => null) unioned the query result with null, so destructuring
the first row failed typecheck (TS2488). Return an empty array on failure
instead and drop unused connection/desc imports.
2026-08-05 11:10:16 +02:00
openhands dc8fb8a6ed feat: speed up admin clone import and enable Cache Components
- Clone import: defer FurnitureData.json writes and append all entries in a
  single batched write instead of one read-modify-write per item, removing
  the main serialization bottleneck for large batches.
- Clone import: raise SSE batch concurrency cap from 5 to 10 and bump the
  clone client/route default from 2 to 6.
- Add a flush hook to runSseBatch so callers can batch deferred work before
  batch_complete is emitted, and surface flush errors as an error event.
- Enable Next.js Cache Components (instant: false opt-out) and silence the
  related build warnings in next.config.ts.
- Switch isomorphic-dompurify to dompurify and refresh dependencies.
2026-08-05 11:10:16 +02:00
remco ac9b3e3cb5 chore(deps): update dependency tsx to ^4.23.7
renovate/artifacts Artifact file update failure
CI / check (push) Failing after 7s
CI / release (push) Skipped
CI / deploy (push) Skipped
CI / check (pull_request) Failing after 8s
CI / release (pull_request) Skipped
CI / deploy (pull_request) Skipped
2026-08-05 09:00:31 +00:00
remco b892786ff8 chore(deps): update dependency tsx to ^4.23.6
CI / check (pull_request) Failing after 8s
CI / release (pull_request) Skipped
CI / deploy (pull_request) Skipped
CI / check (push) Failing after 8s
CI / release (push) Skipped
CI / deploy (push) Skipped
2026-08-05 02:00:27 +00:00
openhands 83884ef2e3 fix(news): update slug page types
CI / check (push) Failing after 9s
CI / release (push) Skipped
CI / deploy (push) Skipped
2026-08-04 21:29:13 +02:00
openhands b06f27ef89 chore: update dependencies 2026-08-04 21:27:09 +02:00
openhands a2b0752076 fix: catch FlareSolverr fallback errors in fetchSourceFurnidata
CI / check (push) Successful in 26s
CI / release (push) Skipped
CI / deploy (push) Successful in 47s
Previously, if FlareSolverr itself failed (timeout, connection error),
the error would propagate as generic 'network error'. Now it throws
a descriptive error message.
2026-08-04 19:27:08 +02:00
openhands 1fd6f7146b fix: improve error handling for Cloudflare-protected clone sources
CI / check (push) Successful in 26s
CI / release (push) Skipped
CI / deploy (push) Successful in 54s
- Detect HTML responses from FlareSolverr and throw descriptive error
  instead of letting JSON.parse fail with cryptic 'Unexpected token' error
- Add try/catch to clone/route.ts GET handler to return 502 with
  clear message instead of Internal Server Error 500
- Add FLARESOLVERR_URL to .env
2026-08-04 19:21:31 +02:00
openhands 0abcead359 fix: use /v1 endpoint for FlareSolverr API
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 43s
FlareSolverr v3.x uses /v1 endpoint, not root /.
The previous implementation was hitting the root endpoint which
returned 405 Method Not Allowed.
2026-08-04 19:07:37 +02:00
openhands 3edc987281 feat: integrate FlareSolverr for Cloudflare bypass on clone sources
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 46s
- Add FLARESOLVERR_URL env var to .env.example
- Update fetchSourceFurnidata to fall back to FlareSolverr on CF challenges (403/HTML)
- Add docker-compose.yml with FlareSolverr service
- Add scripts/health-check.sh for FlareSolverr readiness check
- Add health:check script to package.json
- Document FlareSolverr setup in README
2026-08-04 19:00:30 +02:00
openhands 2e87e5bf09 chore: remove test-cf.ts (puppeteer no longer used)
CI / check (push) Successful in 25s
CI / release (push) Skipped
CI / deploy (push) Successful in 56s
2026-08-04 18:46:31 +02:00
openhands b87c9a5b8d chore: remove puppeteer CF bypass (not working for Leet/Hubbly/Habblet)
CI / check (push) Failing after 14s
CI / release (push) Skipped
CI / deploy (push) Skipped
Cloudflare has strengthened protection on these hotels.
Puppeteer-based bypass returns HTML instead of JSON.
cloudscraper has dependency issues with Node.js v26.

Reverted to simple HTTP fetch with clear error messages.
2026-08-04 18:45:10 +02:00
openhands 5c60ce364c chore: remove cf-fetch.ts (puppeteer CF bypass not working for Leet/Hubbly/Habblet)
Cloudflare has strengthened protection on these hotels.
Puppeteer-based bypass returns HTML instead of JSON.
cloudscraper has dependency issues with Node.js v26.

Reverting to simple HTTP fetch with clear error messages.
2026-08-04 18:42:20 +02:00
openhands cef068ff3c fix: remove stealth plugin to eliminate rimraf crash, use plain puppeteer
CI / check (push) Successful in 26s
CI / release (push) Skipped
CI / deploy (push) Successful in 45s
2026-08-04 18:36:52 +02:00
openhands 7137b046d7 fix: improve error handling in CF bypass to prevent server crashes
CI / check (push) Successful in 24s
CI / deploy (push) Successful in 43s
CI / release (push) Skipped
2026-08-04 18:28:35 +02:00
openhands c565351c2f fix: improve CF challenge detection and add timeout in cf-fetch
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m1s
2026-08-04 18:17:20 +02:00
openhands 847febbe64 fix: handle cleanup errors gracefully in cf-fetch
CI / check (push) Successful in 25s
CI / release (push) Skipped
CI / deploy (push) Successful in 46s
2026-08-04 18:13:41 +02:00
openhands 0bf6133775 fix: add puppeteer packages to serverExternalPackages to prevent Next.js build errors
CI / check (push) Successful in 25s
CI / release (push) Skipped
CI / deploy (push) Successful in 49s
2026-08-04 18:09:08 +02:00
openhands af8b59e024 fix: use dynamic imports for puppeteer to prevent Next.js build errors
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 48s
puppeteer-extra cannot be statically imported in Next.js server bundles.
Using dynamic import() so puppeteer is only loaded at runtime, not at build time.
2026-08-04 18:05:01 +02:00
openhands a338f9cb72 feat: add Cloudflare bypass to fetchSourceFurnidata using puppeteer
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Failing after 41s
- Add cf-fetch.ts with puppeteer-extra + stealth plugin for CF bypass
- Modify fetchSourceFurnidata to detect CF challenge and retry with puppeteer
- Restore Leet, Hubbly, and Habblet City to clone sources (now CF-protected)
2026-08-04 18:02:16 +02:00
openhands 624edf751a chore: restore Habbo, Wibbo, Hubba.cc, Hubbly, Soda Ho to clone sources
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 40s
2026-08-04 17:49:33 +02:00
openhands 1258fd8e7b chore: only keep clone sources where all URLs (furnidata, nitro, icons) are verified working
CI / check (push) Successful in 25s
CI / release (push) Skipped
CI / deploy (push) Successful in 45s
Kept only:
- Leet (all 3 URLs working)
- Habblet City (all 3 URLs working)

Removed sources with broken or missing nitro/icon URLs:
- Habbo (no nitro/icons)
- Wibbo (nitro/icons return 403)
- Hubba.cc (nitro returns 404)
- Soda Ho (nitro/icons return 404)
2026-08-04 17:30:46 +02:00
openhands 9fbfd2f51a chore: verify clone sources with Cloudflare bypass test script; remove broken Hubbly URLs
CI / check (push) Successful in 26s
CI / release (push) Skipped
CI / deploy (push) Successful in 55s
Verified working sources via puppeteer Cloudflare bypass test:
- Habbo (GitHub) - 200
- Wibbo - 200 furnidata, 403/403 nitro/icons
- Hubba.cc - 200 furnidata, 404 nitro
- Leet - 200 304 304 (all working)
- Habblet City - 200 200 200 (all working)
- Soda Ho - 200 furnidata, 404 nitro/icons

Cloudflare-blocked sources removed (habba.io, habcrush.pw, fobba.net, etc)
Hubbly URLs removed (all 404) pending verification
Added test-cf.ts script for future source validation
2026-08-04 17:28:01 +02:00
openhands fa7fc75c9a feat: add leet.ws and hubbly.pw clone sources; add retro hotel prefixes to EVENT_PREFIXES
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 46s
2026-08-04 16:50:05 +02:00
openhands 04b84e6055 feat: add organizeSql option for organized catalog_pages with English captions
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 44s
2026-08-04 16:43:53 +02:00
openhands 2ee5ba5c4c feat: group unrepairable legacy items separately in catalog audit
CI / check (push) Successful in 25s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m2s
After a repair attempt, items whose nitro/icon assets cannot be restored
from any source are reclassified from hard errors into a dedicated
'Unrepairable (legacy)' group (info), so a fully repaired catalog can
reach 0 errors while still listing exactly what is not restorable. Adds
an unrepairable summary count and a dedicated tab in the audit UI.
2026-08-04 11:18:37 +02:00
openhands d587749b50 fix: precise item classification in catalog audit and repair
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m3s
Detect badges by items_base.type='b' (authoritative, album gifs as
fallback), recognize pet/animals (a0 pet<N>, pet<N> interaction) and
system items (effects, bots, sticky notes), and resolve asset names for
dot/star classname variants so the audit no longer floods with false
missing nitro/icon errors and repair skips non-furni items.
2026-08-04 11:07:04 +02:00
openhands b1a1e5125c fix: identify badge items by .gif presence in album1584 directory
CI / check (push) Successful in 30s
CI / release (push) Skipped
CI / deploy (push) Successful in 58s
Badge items like HC_Badge, BADGE_SHREK_03 have item_names that don't start
with 'badge_' and interaction_type='default'. Now loads known badge codes
from <gamedataRoot>/album1584/*.gif files and uses that set to exclude
badge items from .nitro and icon audit checks. Also removes incorrect
startsWith('badge_') check that would wrongly skip badge display cases
which DO have .nitro files.
2026-08-03 22:05:49 +02:00
openhands 750973de38 fix: correct badge item detection by checking classname prefix
CI / check (push) Successful in 30s
CI / release (push) Skipped
CI / deploy (push) Successful in 57s
Badge item_names already start with 'badge_' (e.g. badge_citycpa3),
so checking for badge_<item_name>_icon.png produces a double prefix
(badge_badge_citycpa3_icon.png). Now uses item_name.startsWith('badge_')
instead, which correctly identifies badge items without depending on
icon files existing in the directory.
2026-08-03 21:47:10 +02:00
openhands 1167a48344 fix: use badge icon file pattern to exclude badge items from audit and repair
CI / check (push) Successful in 28s
CI / release (push) Skipped
CI / deploy (push) Successful in 55s
Previously identified badge items by interaction_type='badge', but
clone-imported badges have interaction_type='default'. Now checks for
badge_<code>_icon.png file existence instead.
2026-08-03 21:39:27 +02:00
openhands 40da24bd8c Fix badge icon detection in catalog audit and repair
CI / check (push) Successful in 29s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m6s
Badge icons are stored as badge_<code>_icon.png (with badge_ prefix)
instead of <code>_icon.png like regular furni. Update the audit and
icon repair to check for both patterns so badge items are not falsely
flagged as missing icons.
2026-08-03 21:34:11 +02:00
openhands e97213e5d1 Exclude badge items from missing icon check in catalog audit
CI / check (push) Successful in 29s
CI / release (push) Skipped
CI / deploy (push) Successful in 57s
Badge items use .gif icons, not .png icons, so they should not
be flagged as missing icons in the catalog audit.
2026-08-03 21:28:30 +02:00
openhands 86d59195ec Exclude badge items from catalog audit and repair checks
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m5s
Badge items use .gif files, not .nitro bundles, so they should not
be flagged as missing .nitro or missing catalog entries. Also add
badge logicType handling in furni-import.ts so badges get the correct
interaction_type when imported.
2026-08-03 21:23:13 +02:00
openhands 1cbb33a4e2 perf: speed up catalog audit by batching file checks and parallelizing source fetches
CI / check (push) Successful in 38s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m13s
2026-08-03 19:52:09 +02:00
openhands 40a21ba767 fix: wrap SSE state updates in flushSync to resolve React error #418
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m3s
2026-08-03 19:42:20 +02:00
openhands cf89681576 fix: root-safe www-data chown after builds and config sync
CI / check (push) Successful in 29s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m0s
2026-08-03 19:12:22 +02:00
openhands 2fba923a3a feat: browser headers on audit fetches + verified clone furnidata sources
CI / check (push) Successful in 32s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m18s
2026-08-03 19:00:45 +02:00
openhands 080dc34e23 fix: never cache HTML so deploys always serve current chunks
CI / check (push) Successful in 30s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m2s
Anonymous HTML was sent with 'public, max-age=60, s-maxage=300,
stale-while-revalidate=300'. After a rebuild the old chunk URLs (keyed by
deploy id) are deleted, so any browser/CDN holding the stale HTML got 404s
for up to five minutes. Since the deploy id is the git commit, the HTML must
be re-fetched after every deploy; only content-hashed static assets should
be cached. Return no-store for all HTML documents.
2026-08-03 18:39:41 +02:00
openhands 450e7e8d00 fix: suppress hydration warning on html for theme-init class
CI / check (push) Successful in 25s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m6s
theme-init.js adds the 'dark' class to <html> before React hydrates,
causing a hydration mismatch (React #418) for users with a saved dark
theme. Mark the root element with suppressHydrationWarning.
2026-08-03 18:29:22 +02:00
openhands 30ed2b8ce2 refactor: switch password hashing from argon2 to bcrypt
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m0s
- hashPassword now emits bcrypt (cost 12) instead of argon2id
- checkLogin migrates legacy md5/argon2id hashes to bcrypt on sign-in
- keep argon2id verification only as a one-time migration path
- replace ARGON2_* env vars with BCRYPT_COST
2026-08-03 18:08:57 +02:00
openhands 6fc14b9b84 feat: catalog audit can repair orphaned refs and duplicate classnames
- add repairOrphanedCatalog: remove catalog_items rows whose item_ids only
  reference missing items_base entries, strip orphaned ids from mixed rows
- add repairDuplicateClassnames: merge items_base duplicates into one
  canonical row per classname, remap references, delete duplicate rows
- add 'repair structural issues' checkbox + result display in audit UI
2026-08-03 18:08:45 +02:00
openhands bee55e1fd4 fix: skip icon-repair integration test when no DB is configured
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m2s
2026-08-03 17:47:07 +02:00
openhands 613b7502e1 fix: repair updater and migrate configs to JSONC only
- fix emulator git path (repo root vs Maven submodule) and SQL/backup dirs
- auto-detect branch; track real parallel job exit status
- verify vite presence and clean+full install when node_modules is incomplete
- fix health-check label handling and skip jsonc/example files in JSON scan
- stop hardcoding the Nitro client path in chown
- drop JSON5: sync config URLs to .jsonc, remove legacy .json5 files
- bump to v8.0.2
2026-08-03 17:43:19 +02:00