Commit Graph
1777 Commits
Author SHA1 Message Date
openhands 05c2706eaf chore(deps): bump runtime and dev dependencies
next 16.4.0 -> 16.4.1, react/react-dom 19.3.0 -> 19.3.1,
@tanstack/react-query 5.104.2 -> 5.104.3,
@tanstack/react-virtual 3.14.17 -> 3.14.19, lucide-react 1.55.0 -> 1.57.0,
motion 14.1.0 -> 14.2.0, mysql2 3.24.5 -> 3.24.6, resend 6.32.1 -> 6.33.0,
tinymce 8.9.3 -> 8.10.0, music-metadata 12.1.1 -> 12.2.1,
@playwright/test 1.64.0 -> 1.64.1, postcss 8.5.29 -> 8.5.30,
testcontainers 12.2.0 -> 12.2.1.
2026-10-15 15:59:54 +02:00
openhands ac23d7d1d9 fix(ops): treat a CI-managed host as a skip, not a failed updater run
Commit 3c8abb6f made docker-update.sh exit 0 (SKIP) on a host owned by CI so
the cron does not report a failed deployment. The tests still expected a
nonzero exit for the ci-active/ci-green/ci-upstream scenarios, so five cases
failed.

- docker-update.test.ts: move the CI scenarios out of the non-zero group and
  assert the skip: exit 0, 'This host is managed by CI' in the output and no
  'compose up'. All three CI scenarios (both slot containers and the nginx
  upstream) now share one test.
- README.md: document the exit-0 skip.
2026-10-14 21:59:42 +02:00
openhands 3c8abb6fbf feat(assets): choose furniture bundle ext via FURNI_BUNDLE_EXT
Bundle the remaining imaging hardening and the host/CI fixes from the
"Doe alles" pass into one release.

Furniture:
- Resolve the local bundle extension from FURNI_BUNDLE_EXT (".hab" default,
  ".nitro" for a stock Nitro client). The configured extension is written by
  imports/repairs and preferred on lookup; the other stays a legacy fallback.

Imaging:
- Avatar proxy sends s-maxage=86400 + stale-while-revalidate (300/3600 for the
  fallback path) so the edge can hold a render a day.
- Cloudflare cache rule now covers /api/imaging/ (verified MISS->HIT live).
- Document that bare /imaging is shadowed by the edge proxy to the renderer.

Ops/CI:
- docker-update.sh skips a CI-managed host (exit 0) instead of failing cron.
- ci-deploy.sh runs the cross-browser imaging gate (chromium+firefox+webkit)
  against the candidate before cutover; DEPLOY_SKIP_CROSS_BROWSER=1 as escape.
- scripts/imager-health-alert.sh alerts (Discord) on imager up/down transitions;
  runs from cron every 5 minutes.

Tests:
- Furniture bundle-ext resolver + FURNI_BUNDLE_EXT wiring.
- Imaging performance budget (bytes + warm latency).
- classifyDdos: /api/imaging/* stays in the api bucket.
2026-10-14 21:46:56 +02:00
openhands 640e5a5dd0 test(imaging): broaden coverage across contract, transcode, routing and pixels
Environment-independent contract tests (cache headers + source, CORS, OPTIONS
preflight, negative figure/badge tables, concurrency burst) run in both the
deploy gate and the cross-browser job.

CMS-only /imaging assertions (webp/avif transcode, animated-APNG passthrough,
s-maxage edge caching) live in cms-imaging.spec.ts and are skipped behind the
edge proxy; the public topology has its own public-routing.spec.ts smoke that
fails if the edge ever stops fronting the imager or starts shadowing the CMS
endpoints. A committed per-engine visual baseline pins the static render.

The cross-browser imaging job is now blocking (IMAGING_EDGE=1), so avatar
imaging on chromium/firefox/webkit is a required signal.
2026-10-14 21:19:18 +02:00
openhands 3fa643828d test(imaging): drop /imaging e2e assertion shadowed by the edge proxy
In production the edge proxy fronts /imaging to the imager container, so the
CMS route only answers when reached directly. Asserting it in the shared spec
failed against the public site in all three engines. Its behaviour is covered
by src/lib/imaging-route.test.ts; the e2e spec now only checks the endpoints
that are identical in both topologies (/api/imaging/avatar and the badge).
2026-10-14 21:05:36 +02:00
openhands 888765c47f test(imaging): add endpoint contract e2e and cross-browser render checks
The deploy gate only installs chromium, so imaging had no browser-level
coverage. Add two Playwright specs:

- e2e/imaging/avatar-endpoint.spec.ts: HTTP contract for the avatar
  (/api/imaging/avatar), default (/imaging) and badge endpoints — animated
  APNG for a figure with an effect, the trailing-`.0` regression figure,
  ETag/304 revalidation, and a 400 for a malformed figure. Runs in the
  deploy gate automatically via the default Playwright config.
- e2e/imaging/avatar-render.spec.ts: loads the avatar in a real browser and
  asserts it decodes at a non-zero size and animates. Navigates to the image
  URL directly so production CSP `upgrade-insecure-requests` cannot rewrite
  the request over a plain-HTTP host.

Add playwright.imaging.config.ts running both across chromium, firefox and
webkit, a `test:imaging` script, and a non-blocking CI job that installs all
three engines and checks the live site.
2026-10-14 21:00:27 +02:00
openhands f3407ebfdf fix(imaging): support .hab assets, cache avatars/badges, harden routes
The hotel moved from .nitro to .hab bundles, so the imager must treat .hab
like .nitro and the public avatar endpoints must accept the figure strings
the client sends (including extra trailing segments such as `.0`, which the
old FIGURE_RE rejected with a 400).

- imager-upstream: relax FIGURE_RE, extend parseAvatarQuery test coverage
- api/imaging/avatar + /imaging: shared validation, placeholder and ETag/304
- api/imaging/badge: single-flight upstream fetch and conditional responses
- imager-http/imager-png: strong ETag helpers and APNG passthrough guard
- csp + next/image: unoptimized external images, tightened CSP
- deps: override postcss-selector-parser to ^7.1.6
- also fold in the pending drizzle draft snapshot and stray test cleanup
2026-10-14 20:40:50 +02:00
openhands 56676effc3 feat(studio): localize catalog studio UI and polish responsive layout
Route all Catalog Studio strings through the admin.studio namespace
(workspace, filters, review, inspector, quality, sync, scale32, organize
imports and page titles/subtitles) with English fallback, and add shared
StudioPage chrome plus a loading skeleton. Tighten mobile padding on the
header and sub-bars.
2026-10-13 20:31:26 +02:00
openhands d7d6382b60 chore: upgrade msw to v3 and update typescript 2026-10-12 20:20:27 +02:00
openhands 007818b03f chore: upgrade pnpm version via corepack 2026-10-12 20:18:32 +02:00
openhands b24045812b chore: update dependencies (vitest, drizzle, zod, lucide) 2026-10-12 20:16:24 +02:00
openhands 0d943fe3dc fix(ci): use runs-on: ubuntu-latest (non-empty) for Gitea Actions v5 2026-10-12 20:05:56 +02:00
openhands 6e82a02e64 fix(ci): rewrite ci.yaml with correct Gitea Actions syntax 2026-10-12 20:04:13 +02:00
openhands 08ff14d0ac test: trigger CI run for monitoring 2026-10-12 20:01:17 +02:00
openhands b17da6ab25 fix(gitea): use runs-on: [] so host runner picks up jobs (contract test aligned) 2026-10-12 19:43:34 +02:00
openhands 56ca775405 fix(gitea): runner label ubuntu-latest (remove GITEA_TOKEN drop-in conflict) 2026-10-12 19:38:08 +02:00
openhands 8ee99e8ce8 test: ubuntu-latest only label 2026-10-12 19:26:16 +02:00
openhands 5ea1d50ad1 test: add ubuntu-latest label test 2026-10-12 19:24:54 +02:00
openhands 6ef7486ca4 test: clean v5 install via Docker approach 2026-10-12 19:21:39 +02:00
openhands 7c15cfd26d test: clean v5 install test 2026-10-12 19:19:31 +02:00
openhands 2ca277d858 test: final CI test after clean install 2026-10-12 19:17:52 +02:00
openhands 758e25452d test: try different label approach 2026-10-12 19:13:19 +02:00
openhands 60d375144d test: final CI trigger test 2026-10-12 19:12:03 +02:00
openhands 1c816019b1 test: final CI verification 2026-10-12 19:09:59 +02:00
openhands ceff6f98d9 test: add test-ci file for CI trigger 2026-10-12 19:09:01 +02:00
openhands 8395e60f87 test: fourth verification after token fix 2026-10-12 19:07:43 +02:00
openhands a92b951540 test: token sync fix verification 2026-10-12 19:06:50 +02:00
openhands d5938f94ed test: second verification 2026-10-12 19:05:45 +02:00
openhands 991328ff0e test: verify runner picks up Gitea CI 2026-10-12 19:02:45 +02:00
openhands 1835221096 fix: remove .gitlab-ci.yml (using Gitea CI instead) 2026-10-12 19:00:45 +02:00
openhands e7a6245ac2 test: add test line to README 2026-10-12 18:49:25 +02:00
openhands da43b6c80c fix: use explicit runner label self-hosted:host to match registered v5-runner 2026-10-12 18:28:31 +02:00
openhands eb67424a1c test: add verification comment to .gitlab-ci.yml, triggering workflow run 2026-10-12 18:25:05 +02:00
openhands 3776475db4 fix: ci-workflow-contract test expectations updated to runs-on: [] 2026-10-12 18:18:24 +02:00
openhands 54b9186e52 fix: test.yml runs-on ubuntu-latest → [] for host runner compatibility 2026-10-12 18:15:58 +02:00
openhands fe684faf70 fix: change Gitea Actions runner from self-hosted to host runner, preventing stuck jobs when self-hosted runners are offline 2026-10-12 18:08:08 +02:00
openhands 22f834ef45 fix: add explicit runner tags to .gitlab-ci.yml jobs, ensuring shared runners are used and 'no matching online runner' error is prevented 2026-10-12 17:46:36 +02:00
openhands 7b249a7222 P1-P3 admin cleanup: rank guard, SSRF guard, count caching, dead code removal, pagination rewrite
- P1: new src/lib/admin/rank-guard.ts with tryGuardRank/guardRank + RankGuardTarget/Result; extracted from users.ts; applied to admin-bans (create/lift + rank redirect) and admin-badges (caps + rank guard + error surfacing); import-url-safety.ts SSRF guard wired into clone save+icon fetch; logAudit await in help-tickets; antiddos mutations SETTINGS_EDIT; markAllAlertsRead NOTIFICATIONS_EDIT; rankError/saveError in all 25 message files; tests rew/new for bans/badges/rank-guard/import-url-safety

- P2: ticket-inbox merged pagination reworked to single UNION ALL SQL with LIMIT/OFFSET (avoids O(offset) materialization); getCachedAdminCount with cacheFiltered option applied to devops/errors/photos/items/guilds/help-tickets/moderation pages; admin-theme catches→?error=1+banner+25 locales; logger in silent catches (rare-values/writeable-boxes); catalog-items-loader CAST→plain equality; count caching helper extended with opt-in cacheFiltered

- P3: removed dead modules is-staff/notice/recent-furni-resync/log-filters plus load-user-sanctions/user-sanction-timeline; removed orphaned CATALOG_PAGE_COLUMNS re-export; removed getFurniIconUrl from studio-furni-icons

Build: lint 0, typecheck 0, 3480 tests pass, i18n:check exit 0, colors exit 0. Circular chunk warning (9452/10535/66463) is webpack code-splitting artifact; build succeeds.
2026-10-12 17:42:19 +02:00
openhands 57529fd1ea Fix: badge API now reads from Gamedata/c_images/album1584
The badge GIF files exist at /var/www/Gamedata/c_images/album1584/ but the
/api/imaging/badge endpoint only looked in /swf/c_images/album1584/ (relative
to process.cwd()). Added GEDATA_IMAGES_BASE candidate and fetchCandidate
handler so badges render correctly in the admin UI and on the site.
2026-10-11 21:14:10 +02:00
openhands acbb833eca Fix: make live test describe blocks conditional on RUN env vars (skip when not set) 2026-10-11 20:49:53 +02:00
openhands 6912669754 Remove skip directives from live test files 2026-10-11 20:26:27 +02:00
openhands 7388ad3451 Fix: admin badges formatting (biome) 2026-10-11 20:05:27 +02:00
openhands b13c9f47be Fix admin-badges: handle non-positive userId, truncate badge code to 32 chars, only revalidate on grant 2026-10-11 20:04:06 +02:00
openhands f14a0e5fe7 Fix i18n type errors: add colIcon to Dutch locale and type casts 2026-10-11 19:56:05 +02:00
openhands 505ed2bfe2 fix(lint): remove duplicate colIcon key in en.json 2026-10-11 19:40:32 +02:00
openhands 548ae541b2 fix(i18n): add colIcon keys for badges and rareValues 2026-10-11 19:40:03 +02:00
openhands 05883b1ee6 chore: make workflow file anonymous and secure 2026-10-11 19:38:22 +02:00
openhands ad015e1e9c fix(lint): remove duplicate i18n key and cleanup unused biome suppressions 2026-10-11 19:36:57 +02:00
openhands 62e3e49ad1 fix(i18n): add colIcon translation to en.json 2026-10-11 19:36:02 +02:00
openhands 338591691f chore: schone start test-workflow voor v5 runner 2026-10-11 19:34:04 +02:00