Commit Graph
62676 Commits
Author SHA1 Message Date
Régis Hanol 67985bff52 PERF: optimize GitHub PR onebox rebaking (#36739)
Previously, when rebaking posts containing GitHub PR oneboxes, we passed
`invalidate_oneboxes: true` to `rebake!` which would re-fetch the onebox
during cooking. This meant each post independently fetched the same PR
data from GitHub.

Now we:

1. Fetch and cache the onebox once upfront via `Oneboxer.preview`
2. Use the new `skip_publish_rebaked_changes` parameter to prevent
publishing intermediate states, without triggering onebox re-fetches
3. Filter posts by `cooked LIKE '%githubpullrequest%'` in SQL rather
than fetching all linked posts and filtering in Ruby

The new `skip_publish_rebaked_changes` parameter on `Post#rebake!`
allows callers to skip the `:rebaked` publish without triggering onebox
invalidation, which is useful when the caller has already refreshed the
cache separately.
2025-12-17 12:06:16 +01:00
Discourse Translator Bot dcd58c419d Update translations (#36751) 2025-12-17 11:08:55 +01:00
Martin Brennan e080ff92f1 FIX: Add version number to Rewind cache key (#36745)
This will allow us to invalidate the Rewind cache when making
changes to reports, in case of security or other fixes.

Also refactors the shared logic in FetchReport and FetchReports
into a helper module.
2025-12-17 15:38:19 +10:00
Sam 2b40b2396d DEV: clear plugin document title counters (#36743)
Previously we were not clearing title counter notification callbacks on
cleanup in test
this could lead to getting flakes (and progressively slower acceptance
tests) as we keep adding
adding more and more Title counters.

The title counter is an interface that lets plugins add counts to title.
2025-12-17 12:07:52 +11:00
Sérgio Saquetim 04d95b5b83 FIX: Address race condition in PostStream while loading posts (#36744)
Convert `findPostsByIds` and `loadIntoIdentityMap` to async functions in
`PostStream` to resolve a race condition when loading posts. This
ensures proper sequencing of asynchronous operations and improves
reliability in loading post data.

This PR addresses the issue reported in
https://meta.discourse.org/t/the-web-page-continuously-loads-previous-posts-and-automatically-scrolls-up-quickly/391192

There are no tests added because I can't find a way to reliably
reproduce the issue in tests and verify it's properly fixed.
2025-12-16 22:06:16 -03:00
Kris 705f47f5d6 FIX: Rewind: replace currentUser with user (#36742)
We had a few places where we were referring to `currentUser` instead of
the user being viewed. This was resulting in some wrong info being shown
when viewing someone else's rewind.
2025-12-16 19:59:33 -05:00
Kris e39d4027d9 UX: AI settings: add missing button classes, update button name (#36741)
Adding a few missing button classes and updating the AI features buttons
from "edit" to "settings" — as it's actually a list of settings rather
than an editing experience.
2025-12-16 19:31:07 -05:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> ec7c662d93 Build(deps): Bump @rollup/browser from 4.53.4 to 4.53.5 (#36732)
Bumps [@rollup/browser](https://github.com/rollup/rollup) from 4.53.4 to
4.53.5.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.53.4...v4.53.5)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-17 00:28:55 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1795d3008b Build(deps-dev): Bump vitest from 4.0.15 to 4.0.16 (#36733)
Bumps
[vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)
from 4.0.15 to 4.0.16.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
-
[Commits](https://github.com/vitest-dev/vitest/commits/v4.0.16/packages/vitest)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-17 00:27:33 +01:00
Sérgio Saquetim 26a619e508 DEV: Use importSync for setupDeprecationCounter in bootstrap (#36734)
Refactor `discourse-bootstrap.js` to use `importSync` when loading
`setupDeprecationCounter`, improving module dependency handling. This
ensures the code gracefully handles environments where the deprecation
counter module is unavailable.
2025-12-16 20:14:47 -03:00
Kris b6480f2fd1 UX: update header language switcher style (#36738)
This updates the language switcher to use the locale code instead of a
generic icon.

Before:
<img width="320" alt="image"
src="https://github.com/user-attachments/assets/6fc7a572-ed26-4ff9-a251-34d50651cca2"
/> <img width="250" alt="image"
src="https://github.com/user-attachments/assets/cf3d9eec-0b85-44da-be8c-b25f26a4bc31"
/>


After: 

<img width="250" alt="image"
src="https://github.com/user-attachments/assets/93007330-fbb6-474d-afec-1ca144c004c8"
/>

<img width="250" alt="image"
src="https://github.com/user-attachments/assets/e0e64b21-d86e-4c7a-bd3b-f49b1e6d4b9d"
/>
2025-12-16 18:08:56 -05:00
Joffrey JAFFEUX 4689abf46c FIX: ensures scrollable-list is passing scroller element (#36736)
Following idle pane refactoring we incorrectly were expecting the
scroller from the scrollable-list when we now expect the component
(chat-channel/chat-thread) to pass it down.

We have tests for this behavior generally but testing the exact
scrolling moment is generally brittle, I won't add another test for now.
2025-12-17 00:08:47 +01:00
726fc21187 DEV: Enforce deprecation-free tests for preinstalled plugins/themes (#36445)
This PR implements stricter deprecation handling that enforces
deprecation-free tests for core and preinstalled plugins, while allowing
custom (non-preinstalled) plugins and themes to have deprecations
without causing test failures.

### Key Changes

#### CI Workflow Improvements
- Split plugin system tests into separate CI targets: `core-plugins`,
`official-plugins`, and `chat`
- Enhance `bin/turbo_rspec` to accept comma-separated exclude patterns
via `--exclude-pattern`
- Simplify workflow configuration with default `shell: bash` and
consolidated environment variables

#### Plugin Classification & Detection
- Centralize official plugins list in `config/official_plugins.json` for
unified backend and frontend access
- Detect preinstalled plugins by checking for absence of `.git`
directory
- Add `isOfficial` and `isPreinstalled` metadata flags to plugin info
- Add `data-preinstalled` and `data-official` attributes to all plugin
and theme script tags for runtime identification

#### Deprecation Source Tracking
- Track deprecation sources (core, plugin, or theme) through template
map and resolver to attribute deprecations correctly
- Improve `source-identifier.js` to detect admin UI plugin files in both
development and production environments
- Add source information to deprecation messages for better debugging

#### Test Infrastructure
- Modify `raise-on-deprecation` test helper to skip errors for custom
(non-preinstalled) plugins and themes
- Add `EMBER_RAISE_ON_DEPRECATION` environment variable to control
deprecation throwing behavior in Rails tests
- Automatically set `EMBER_RAISE_ON_DEPRECATION` for core and
preinstalled plugin/theme specs in `rails_helper.rb`
- Improve deprecation summary output for system specs with test/spec
origin tracking

#### Deprecation Workflow Enhancements
- Add `dont-throw` handler for selective deprecation bypassing in test
fixtures without raising errors
- Add `dont-count` handler for preventing deprecation counting in
specific scenarios (e.g., test fixtures)

#### Deprecation Fixes
- Fix pending deprecations across core plugins (chat, data-explorer,
discourse-subscriptions, gamification, house-ads, reactions,
rss-polling, styleguide)
- Update import paths and remove deprecated patterns
- Migrate deprecated Handlebars templates to JavaScript API

### Testing Strategy

With these changes:
- **Core and preinstalled plugins** must pass all tests without any
deprecations
- **Custom plugins and themes** can have deprecations without failing
tests
- Test fixtures can use `dont-throw` and `dont-count` handlers when
testing deprecation behavior itself
- System specs automatically configure deprecation enforcement based on
test file location

---------

Co-authored-by: David Taylor <david@taylorhq.com>
Co-authored-by: Jarek Radosz <jradosz@gmail.com>
2025-12-16 17:48:29 -03:00
moin-Jana 52802b3a90 UX: localize badge form section titles (#36729)
Adds missing localization keys for badge form section titles reported in
https://meta.discourse.org/t/badges-form-section-titles-are-not-translatable/342200



### Before:
<img width="977" height="834" alt="before_not_key"
src="https://github.com/user-attachments/assets/257b4ec4-3e0c-4b0d-b91f-376822932e0c"
/>

### After:
<img width="977" height="834" alt="after_with_key"
src="https://github.com/user-attachments/assets/a9cba2d6-93bc-444f-b43c-c9de8f231432"
/>
2025-12-16 21:27:43 +01:00
Keegan George 0cc96ccc9f DEV: Make sure AI credit errors always use UTC time (#36730) 2025-12-16 11:46:51 -08:00
chapoi 38ad240540 UX: add ids to badge section titles (#36725) 2025-12-16 20:10:22 +01:00
Régis Hanol b9e6c29871 FIX: use event timezone for Google Calendar export (#36727)
When clicking "Add to Google Calendar" for an event with a specific
timezone, the generated UTC times were incorrect. The code was parsing
the date string using the user's local timezone instead of the event's
timezone.

For example, an event at 18:30 in a UTC+2 timezone would be incorrectly
converted as if it were 18:30 in the user's local timezone (e.g.,
UTC-4), resulting in a 6-hour error in the Google Calendar URL.

The fix passes the event's timezone to `_formatDateForGoogleApi` and
uses `moment.tz()` to parse dates in the correct timezone before
converting to UTC. Also cleaned up the date formatting to use moment's
format() method instead of regex replacement.

Internal ref - t/162288
2025-12-16 19:05:55 +01:00
Penar Musaraj fd8fd1674a DEV: Ensure new-feature-item renders without a title (#36728)
This is used in a private plugin to show a preview. That plugin's tests
regressed due to this change.
2025-12-16 12:51:12 -05:00
Jordan Vidrine 4b521fee48 UX: Animate new topic alert (#36726) 2025-12-16 10:27:28 -06:00
Kris f6e08ec9af FEATURE: create tags inline on the /tags route (#36645)
This adds an auto-expanding input to the /tags route that allows admins
to create new tags and creates a new bulk_create tag service

<img width="2240" height="528" alt="image"
src="https://github.com/user-attachments/assets/7e6de5cf-0f35-4869-a677-a9fac8845b60"
/>

<img width="2210" height="784" alt="image"
src="https://github.com/user-attachments/assets/b6207679-85f5-4683-966f-578710666c1a"
/>
2025-12-16 11:25:14 -05:00
Roman Rizzi 71c1cbffaf FEATURE: Format eval comparison results into a table (#36724)
Personas comparison:

```

┌──────────────────────┬───────────────────────────────┬───────────────────────────────┬───────────────────────────────┐
│ input                │ default                       │ topic_summary_eval            │ judge                         │
├──────────────────────┼───────────────────────────────┼───────────────────────────────┼───────────────────────────────┤
│ simple_summarization │ [PASS]                        │ [PASS]                        │ [TIE]                         │
│                      │ 9/10 — Candidate 1 provides a │ 9/10 — Candidate 2            │ Tie — Both candidates         │
│                      │ comprehensive summary that    │ effectively summarizes the    │ effectively summarize the     │
│                      │ captures the central idea and │ conversation, highlighting    │ conversation, capturing the   │
│                      │ key attributes of dogs,       │ the loyalty, intelligence,    │ central idea and key          │
│                      │ including their roles as      │ and roles of dogs as service  │ attributes of dogs, including │
│                      │ service and therapy animals.  │ and therapy animals. The      │ their loyalty, intelligence,  │
│                      │ The response is clear and     │ response is concise and meets │ and roles as service and      │
│                      │ concise, meeting all rubric   │ all rubric criteria.          │ therapy animals. Both         │
│                      │ criteria.                     │                               │ responses meet the rubric     │
│                      │                               │                               │ criteria equally well.        │
└──────────────────────┴───────────────────────────────┴───────────────────────────────┴───────────────────────────────┘
Summary: default: 1/1 pass | topic_summary_eval: 1/1 pass | judge: 1/1 pass
Legend: [PASS]=pass, [FAIL]=fail, [SKIP]=skipped, [TIE]=tie
```

LLMs comparison against dataset:

```
┌──────────────────────────────┬────────┬─────────────┐
│ input                        │ GPT-4o │ GPT-4o-mini │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-1  │ [PASS] │ [PASS]      │
│                              │ true   │ true        │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-2  │ [PASS] │ [PASS]      │
│                              │ false  │ false       │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-3  │ [PASS] │ [PASS]      │
│                              │ true   │ true        │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-4  │ [PASS] │ [PASS]      │
│                              │ false  │ false       │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-5  │ [PASS] │ [PASS]      │
│                              │ true   │ true        │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-6  │ [PASS] │ [PASS]      │
│                              │ false  │ false       │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-7  │ [PASS] │ [PASS]      │
│                              │ true   │ true        │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-8  │ [PASS] │ [PASS]      │
│                              │ false  │ false       │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-9  │ [PASS] │ [PASS]      │
│                              │ true   │ true        │
├──────────────────────────────┼────────┼─────────────┤
│ dataset-spam_eval_dataset-10 │ [PASS] │ [PASS]      │
│                              │ false  │ false       │
└──────────────────────────────┴────────┴─────────────┘
Summary: GPT-4o: 10/10 pass | GPT-4o-mini: 10/10 pass
Legend: [PASS]=pass, [FAIL]=fail, [SKIP]=skipped, [TIE]=tie
```
2025-12-16 12:58:43 -03:00
Isaac Janzen 27f3bda4c6 DEV: Revert Object Setting upload changes (#36708) 2025-12-16 09:40:44 -06:00
Michael Brown 3a7af5a04f FIX: do not use public IP address space for tests
RFC5735 prescribes networks for use in tests and documentation and we should
use those instead of sending connection attempts to Australia every time our
test suite runs.
2025-12-16 09:35:01 -05:00
Michael Brown de0f5be9f9 FIX: various SMTP timeouts should be used as floats
Without this, these variables when set in the environment would be passed as
strings, causing an error:

```
NoMethodError: undefined method `zero?' for an instance of String (NoMethodError)

    return yield(sec) if sec == nil or sec.zero?
                                          ^^^^^^
from …/ruby-3.3.6@discourse/gems/timeout-0.5.0/lib/timeout.rb:203:in `timeout'
```
2025-12-16 09:35:01 -05:00
Michael Brown 6f8cc76a3d FIX: SMTP: explicitly disable STARTTLS when TLS is enabled
The mail gem upgrade to 2.9.0 picked up a gem change that causes it to error
when both `tls` and `starttls_auto` are set, despite this being a valid
configuration.

This change causes the `enable_starttls_auto` setting to only be true if `tls`
is not set.

Functionality demonstration:

```
→ DISCOURSE_USE_SMTP_ENVIRONMENT_IN_DEVELOPMENT=true \
  DISCOURSE_SMTP_ADDRESS=localhost \
  DISCOURSE_SMTP_USER_NAME=bilbo \
  DISCOURSE_SMTP_PASSWORD=ring \
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE=none \
  DISCOURSE_SMTP_PORT=5465 \
  DISCOURSE_SMTP_FORCE_TLS=true \
  rake 'emails:test[frodo@shire.net]'
Testing sending to frodo@shire.net using localhost:5465, username:bilbo with plain auth.
SMTP server connection successful.
Sending to frodo@shire.net…
Mail accepted by SMTP server.
Message-ID: 79e7aafd-e2e7-4667-9b29-b01aa2d28bcf@localhost
```

```
→ DISCOURSE_USE_SMTP_ENVIRONMENT_IN_DEVELOPMENT=true \
  DISCOURSE_SMTP_ADDRESS=localhost \
  DISCOURSE_SMTP_USER_NAME=bilbo \
  DISCOURSE_SMTP_PASSWORD=ring \
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE=none \
  DISCOURSE_SMTP_PORT=5587 \
  rake 'emails:test[frodo@shire.net]'
Testing sending to frodo@shire.net using localhost:5587, username:bilbo with plain auth.
SMTP server connection successful.
Sending to frodo@shire.net…
Mail accepted by SMTP server.
Message-ID: 40568ecb-ce4e-4373-aa2e-6cdf59ead158@localhost
```
2025-12-16 09:35:01 -05:00
Régis Hanol 870ddc956c DEV: Remove deprecated showFooter usage in reactions routes (#36720)
The PostList component already handles footer visibility internally via
the {{hideApplicationFooter}} helper based on its own canLoadMore state.
Setting showFooter on the application controller was redundant and
triggered a deprecation warning.

Also removes the unused `@controller` application injection.
2025-12-16 15:06:55 +01:00
Discourse Translator Bot 59d7c14041 Update translations (#36721) 2025-12-16 14:26:08 +01:00
David Battersby fa1a0f88af DEV: remove chat channel icon upload id (#36693)
Follow up to #36690 to remove the unused column
2025-12-16 16:00:56 +04:00
Régis Hanol 8797245e7f UX: Show reorder buttons on touch devices for emoji-list settings (#36695)
Previously, emoji-value-list had its own CSS rule using `.desktop-view`
to hide reorder buttons. This meant buttons were hidden on tablets even
though they support touch (where hover isn't available).

This removes the duplicate `.desktop-view .emoji-value-list` CSS block
and lets emoji-value-list inherit the shift button behavior from
`.value-list`, which already uses `.discourse-no-touch` to properly
detect touch capability (added in #34102).

This ensures reorder buttons are:
- Hidden until hover on non-touch devices
- Always visible on touch devices (including tablets in desktop view)

Also adds system specs to verify reorder button visibility for both
simple-list and emoji-list settings on touch and non-touch devices.

Ref - https://meta.discourse.org/t/391181
2025-12-16 12:39:06 +01:00
David Battersby 9685a97786 FIX: prevent unread threads notification on non threaded channels (#36719)
Prevents stuck thread notifications for AI bot channels that force
thread creation (ie. `forced: true`). Even when a channel has set
threading disabled, bots will still create threads. Those threads won't
appear within the unread thread list page/tab, but they do result in a
blue dot on the sidebar/drawer tab etc.

This change just prevents the blue dot notification as there is no way
to clear it otherwise.
2025-12-16 15:35:20 +04:00
chapoi 0e2b28d59c UX: change code font-size to REM (#36559)
+ add exception for sizing within the small tag
2025-12-16 11:50:41 +01:00
Joffrey JAFFEUX 07e797fc41 UX: makes rewind private by default (#36717)
We think it's a better default to let people decide if they want to show
the info.
2025-12-16 11:07:59 +01:00
Joffrey JAFFEUX 633daf25b4 SECURITY: private category channels are not included (#36716)
We don't want the rewind report to potentially leak private channel
names.
2025-12-16 11:07:40 +01:00
Alan Guo Xiang Tan 63fea13f35 UX: Prevent HorizontalOverflowNav component from scrolling viewport (#36715)
Whenever the `HorizontalOverflowNav` component is rendered, we call
`scrollIntoView` on the current active element to ensure that the link
which is currently active will be shown to the user. However, we were
calling `scrollIntoView` with the `container` option defaulting to `all`
which impacts all scrollable containers.

Per mozilla docs,

> All scrollable containers are impacted (including the viewport).

This is not ideal as it can cause unintended scrolls on the viewport
thus resulting in a bad UX. To resolve this, this commit adds the
`container:
"nearest"` option when we call `scrollIntoView` which ensures that only
the nearest scrollable container to the active element is impacted.

This problem was discovered while I was looking at review queue index
page and noticed that my scroll position was always lost when new
reviewable items are added to the page. It turns out that the review
queue index page renders the `reviewable-refresh/item.gjs` component
which then renders the `horizontal-overflow-nav.gjs` component.
2025-12-16 16:51:19 +08:00
Martin Brennan deafbcdad9 FIX: More Rewind visibility fixes (#36713)
Followup 5ec959c72c

Since Rewinds can be public, we also need to limit the following:

* Do not show tags in restricted groups for Most Vierwed Tags. Instead,
  only show tags that anon will be able to see, so tags with no or
  low permissions.
* Do not show Most Viewed Categories that are restricted categories
* Do not show whispers in Best Posts
2025-12-16 18:16:29 +10:00
Natalie Tay 5fc02bb8a0 DEV: Full-ish spec coverage of basic tag features (#36714)
This is a system spec commit that covers the following core user journeys
surrounding tags:
- covers main routes (`/latest`, `/tag/tag-name`, `/c/category`,
`/tags/c/cat-slug/cat-id/tag-name`)
  - tag-drop component
  - sidebar nav
- topic and PM creation with tags
  - mini-tag-chooser component

Also noting that some assertions (only a handful) might already exist,
but it is a good central place to ensure basic tag features are
functional. Prior to this spec, there have been edits made to
implementation with zero tests failing.

I've chosen to merge 2 long flows instead of separating them into
several, as the tests run much faster (11s vs 18s) without multiple
`it`.
2025-12-16 15:53:52 +08:00
d85becccef FEATURE: respect user presence when chat is on screen (#36652)
Handle, timeout of user so we stop reading and scrolling when user is in
background or no longer active

---------

Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
Co-authored-by: David Taylor <david@taylorhq.com>
2025-12-16 17:23:32 +11:00
Krzysztof Kotlarek 5e46fd35f9 UX: enable refreshed review page (#36711)
This is a small PR just enabling the refreshed review page for everyone.
At this stage, I don't want to remove the site setting so we can
potentially quickly revert that change.

I will create a follow-up PR that will remove the hidden site setting
and all legacy code.

Some tests were irrelevant. For example, in the old layout, long posts
were collapsed. In the new layout, we have an inline scroll.

<img width="1143" height="679" alt="Screenshot 2025-12-16 at 12 37
37 pm"
src="https://github.com/user-attachments/assets/3020dfd1-f84b-44ca-906f-385536bdce3d"
/>
2025-12-16 13:51:48 +08:00
David Battersby fde576d8ec DEV: remove chat channel icon (#36690)
Removes the chat channel `icon_upload_id` that was added in #29566 - the
removal from the database table will happen in a followup PR.
2025-12-16 09:37:08 +04:00
Anthony Veaudry d435a1813b Add image optimization and utility tools to Brewfile (#35940)
When I was running the dev localy on mac I was getting errors that these
were missing.

I followed this:

https://meta.discourse.org/t/install-discourse-on-macos-for-development/15772?tl=en
2025-12-16 16:35:19 +11:00
Martin Brennan 5ec959c72c FIX: Do not use private categories for Rewind best posts or topics (#36712)
Followup c4d4ed890f

We already excluded PMs, but we should also exclude private categories
for Rewind best posts and topics.
2025-12-16 12:33:23 +10:00
Kris 21a628ac06 UX: prevent title edit icon from wrapping onto its own line (#36709)
This prevents the edit icon from wrapping onto its own line, which is
extra bothersome on desktop because it's invisible until hover! I've
removed the whitespace from the template between the icon and title, and
added a new span, which has `white-space: nowrap;`

Before:
<img width="700" alt="image"
src="https://github.com/user-attachments/assets/212a2262-a281-45d8-8ad5-6103e4e73f1c"
/>

(on hover)
<img width="700" height="326" alt="image"
src="https://github.com/user-attachments/assets/17fff736-923c-4a44-b561-36f6e5804d69"
/>



After (pencil will always wrap with the last word): 
<img width="700" alt="image"
src="https://github.com/user-attachments/assets/2690c1f6-7262-4189-bf34-49407f78b5d9"
/>
<img width="700" alt="image"
src="https://github.com/user-attachments/assets/ae2c4aca-f39c-4e2a-8612-9cc22f697dbc"
/>
2025-12-15 18:41:56 -05:00
Martin Brennan c4d4ed890f FEATURE: Share Rewind reports publicly by default and allow for making them private (#36587)
This commit introduces a toggle which is enabled by default
to share the Discourse Rewind report publicly.

**IMPORTANT NOTES**:

*  Users with "Hide my public profile" enabled
**will not** have their Rewind shared publicly by default,
and will not be able to unless they disable "Hide my public
profile" first.
* This commit also excludes personal messages from best
   posts and best topics reports so sensitive message data
   will never be shown, but other report data like reaction
   counts may still be based off of PM data

Other users who cannot see the rewind will see an error.

We always show a message saying which  user you are looking
at when viewing another user's Rewind.

Users can also unshare their rewind from Rewind preferences.
2025-12-16 09:29:35 +10:00
Bryce Huhtala 373dffd82e UX: Remove background and adjust position (#36710)
Removes the border behind the bulk select checkboxes in the search page.

Relates to internal t/-/169989

### Before / After

<img width="774" height="924" alt="image"
src="https://github.com/user-attachments/assets/5a55277f-af4d-4a13-b3ca-1276647adb9f"
/>
2025-12-15 18:04:22 -05:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 5c634f6e96 Build(deps): Bump @rollup/browser from 4.53.3 to 4.53.4 (#36703)
Bumps [@rollup/browser](https://github.com/rollup/rollup) from 4.53.3 to
4.53.4.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.53.3...v4.53.4)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-15 23:09:25 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 080ea67804 Build(deps-dev): Bump lefthook from 2.0.11 to 2.0.12 (#36701)
Bumps [lefthook](https://github.com/evilmartians/lefthook) from 2.0.11
to 2.0.12.
- [Release notes](https://github.com/evilmartians/lefthook/releases)
-
[Changelog](https://github.com/evilmartians/lefthook/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/evilmartians/lefthook/compare/v2.0.11...v2.0.12)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-15 23:08:07 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> c06dcc3cf3 Build(deps-dev): Bump @swc/core from 1.15.4 to 1.15.5 (#36702)
Bumps [@swc/core](https://github.com/swc-project/swc) from 1.15.4 to
1.15.5.
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/swc-project/swc/compare/v1.15.4...v1.15.5)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-15 23:07:51 +01:00
SamandKeegan George 42cc2daf4f FEATURE: add thinking animation when thinking blocks are in progress (#36673)
1. Add a ... animation to the thinking blocks so you can tell llm is
thinking
2. Improve design of native tool vs xml tool handling which was uneven
across providers
3. Exit chains and stop asking for tools when we are out of tool budget

---------

Co-authored-by: Keegan George <kgeorge13@gmail.com>
2025-12-16 08:07:25 +11:00
Régis Hanol 65346ec7db FIX: False permission change logs in non-English forums (#36676)
When saving a category with default "everyone" permissions in
non-English forums, staff action logs incorrectly showed a permission
change even when nothing changed.

The issue occurred because the backend fallback for empty permissions
used the hardcoded English string "everyone", but the frontend sends the
localized group name (e.g., "jeder" in German). This mismatch triggered
false log entries.

Changed the fallback in categories_controller.rb to use
Group[:everyone].name which returns the actual localized group name from
the database.

Ref - https://meta.discoure.org/t/335600/14
2025-12-15 21:13:42 +01:00
zogstrip a1cc09d22d FIX: preserve model/feature dropdown options when filtering on AI usage page
When selecting a model or feature filter on the LLM Usage page, the dropdown
would lose its options and display incorrect values (like "0") because
fetchData() was clearing the cached dropdown options on every request.

The filtered API response only contains models/features matching the filter,
so rebuilding the dropdown options from filtered data caused other options
to disappear.

Added a `clearCache` parameter to fetchData():
- Initial load and date range changes pass `clearCache: true` to refresh options
- Filter changes use the default `clearCache: false` to preserve all options

Ref - https://meta.discourse.org/t/391273
2025-12-15 21:13:01 +01:00