Commit Graph
4518 Commits
Author SHA1 Message Date
David Taylor e56a4bf03e DEV: Prepare for rename of app/assets/javascripts/ -> frontend/
This commit contains all the code changes. A followup will perform the actual move
2025-10-22 16:24:11 +01:00
Joffrey JAFFEUX 818ba9c941 FIX: fix scroll more chat spec (#35543) 2025-10-22 12:50:28 +02:00
7ecb945ec4 FEATURE: Add full-text search for chat messages (#34704)
## Overview

This PR introduces comprehensive search functionality for chat messages,
enabling users to search through their chat history both globally across
all accessible channels and within specific channels.

### Search Capabilities

**All-Channel Search**: When no channel is specified, users can search
across all channels they have access to. The search respects channel
permissions through `ChannelFetcher.all_secured_channel_ids`, ensuring
users only see results from channels they can view.

**Per-Channel Search**: Users can scope their search to a specific
channel by providing a `channel_id` parameter, useful for finding
messages within a particular conversation context.

**Search Features**:
- Full-text search using PostgreSQL's tsvector/tsquery
- Advanced filters: `@username` to filter by author, `#channel` to
filter by channel slug
- Sort options: relevance (default) or latest
- Pagination support
- Search data weighted by relevance

## Site Setting: `chat_search_enabled`

This feature is gated behind the `chat_search_enabled` site setting,
which is currently:
- **Default**: `false`
- **Hidden**: `true`
- **Client-accessible**: `true`

### Deployment Strategy

Due to the need for chat messages to be indexed before search becomes
useful, we're implementing a two-phase deployment:

**Phase 1 (Initial Merge)**:
- `chat_search_enabled` remains `false` and hidden
- The `register_search_index` uses default (true) instead of `chat_search_enabled` value
- This allows the reindexing infrastructure to begin indexing existing
chat messages even if we don't show the UI yet

**Wait Period**:
- Wait at least one week after Phase 1 deployment
- `Jobs::ReindexSearch` runs every 2 hours and will progressively index
all chat messages
- This ensures most sites have a significant part of their chat history indexed

**Phase 2 (Follow-up Merge)**:
- Set `chat_search_enabled` default to `true` and unhide it
- Update the `register_search_index` enabled proc uses the default
(true) instead of using the `chat_search_enabled` setting
- Users can now access search with pre-indexed data

**Rationale**: Without this phased approach, users would see the search
UI immediately but receive no results until the reindexing job runs,
creating a confusing experience. By pre-indexing while the UI is hidden,
we ensure search works immediately when enabled.

## New Plugin API: `register_search_index`

This PR introduces a new plugin API that allows plugins to register
custom search indexes that integrate seamlessly with Discourse's search
infrastructure.

### API Signature

```ruby
register_search_index(
  model_class:,              # The ActiveRecord model to index
  search_data_class:,        # The model for storing search data
  index_version:,            # Version number for re-indexing
  search_data:,              # Proc that returns weighted search data
  load_unindexed_record_ids:,# Proc that finds records needing indexing
  enabled:                   # Optional proc to enable/disable (default: -> { true })
)
```

### How It Works

**Integration with SearchIndexer**: When `SearchIndexer.index(obj)` is
called, it checks registered search handlers for the object's type. If a
handler matches, it:
1. Calls the `search_data` proc with the object and an `IndexerHelper`
instance
2. Receives weighted search data (`:a_weight`, `:b_weight`, `:c_weight`,
`:d_weight`)
3. Updates the corresponding search data table with PostgreSQL's
tsvector

**Integration with Jobs::ReindexSearch**: The scheduled job (runs every
2 hours) calls `rebuild_registered_search_handlers`, which:
1. Iterates through all registered search handlers
2. Skips handlers where `enabled` proc returns `false`
3. Calls `load_unindexed_record_ids` to find records needing indexing
4. Indexes up to `limit` records per handler (default: 10,000)

### Chat Implementation Example

```ruby
register_search_index(
  model_class: Chat::Message,
  search_data_class: Chat::MessageSearchData,
  index_version: 1,
  search_data: proc { |message, indexer_helper|
    {
      a_weight: message.message,
      d_weight: indexer_helper.scrub_html(message.cooked)[0..600_000]
    }
  },
  load_unindexed_record_ids: proc { |limit:, index_version:|
    Chat::Message
      .joins("LEFT JOIN chat_message_search_data ON chat_message_id = chat_messages.id")
      .where(
        "chat_message_search_data.locale IS NULL OR 
         chat_message_search_data.locale != ? OR 
         chat_message_search_data.version != ?",
        SiteSetting.default_locale,
        index_version
      )
      .order("chat_messages.id ASC")
      .limit(limit)
      .pluck(:id)
  }
)
```

Co-authored-by: Martin Brennan <mjrbrennan@gmail.com>
Co-authored-by: Loïc Guitaut <5648+Flink@users.noreply.github.com>
2025-10-22 11:30:35 +02:00
Jarek Radosz 3428d24ae3 DEV: Update admin path in javascript:update_constants task (#35542)
…and run the command to update constants files

(missed in the admin directory move)
2025-10-22 11:06:51 +02:00
Alan Guo Xiang Tan c9e771157a PERF: Fix N+1 queries due to user custom fields when loading chat DMs (#35516)
In `Chat::ChannelFetcher.secured_direct_message_channels_search`,
`User.preload_custom_fields` is called with `channels.flat_map {
_1.chatable.users }`. However,
the `Chat::DirectMessageSerializer` was getting the users via
`object.direct_message_users.map(&:user)` which uses the
`Chat::DirectMessage.direct_message_users` scope instead of the
`Chat::DirectMessage.users` scope resulting in ActiveRecord returning
new `User` objects that do not have user custom fields preloaded.
2025-10-22 09:39:01 +08:00
Kris f8cc5ce7ee UX: show AI gist toggle on /filter route, fix appearance of gists (#35521)
This fixes the appearance of AI generated gists in the topic list on
/filter, and also includes the gist toggle via a new plugin outlet on
/filter called `after-filter-navigation-menu`.

This shares the state with the discovery route toggle (which is separate
from PM toggle state). I've also added tests to cover gist appearance on
/filter. Before the /filter state was shared with PM state, which was
incorrect.



Before:
<img width="2232" height="424" alt="image"
src="https://github.com/user-attachments/assets/b22ed7a6-388e-4b88-99d4-e9e10af6275a"
/>


After: 
<img width="2272" height="506" alt="image"
src="https://github.com/user-attachments/assets/cae03f12-9153-4bcb-a9d3-52712fb2d945"
/>
2025-10-21 16:08:19 -04:00
David Taylor 7d794f45b6 DEV: Move 'unknown OID' embeddings fix into core (#35519)
Having it in d-ai's plugin.rb file solves it when running plugin tests.
But when running core tests, plugins are not loaded, but the tables
still exist in the database.

Followup to 6247fdc255
2025-10-21 15:23:24 +01:00
Krzysztof Kotlarek 760674cad3 DEV: Add discourse-dev seed for post voting reviewable (#35435)
Add DiscourseDev::ReviewablePostVotingPostVotingComment to generate a
post voting comment reviewable.
2025-10-21 09:57:05 +08:00
Alan Guo Xiang Tan 2baabe5ce6 FIX: Ensure chat service has loaded channel before rendering channel (#35433)
This is a follow up to cf4193e6e1.

When chat is being initialized, we initiate an async request to
`/chat/api/me/channels` via `this.chat.loadChannels` but do not await on the request to be completed.
This is fine when a user is not visiting a chat channel route directly.

However, not awaiting on `this.chat.loadChannels` can cause problems
like a user's thread list or drafts to not be displayed if the
`/chat/api/me/channels` request does not return before rendering
happens. To resolve this, we will now wait for the promise in
`this.chat.loadChannels` to resolve before allowing rendering to happen on the `ChatChannelRoute`.
2025-10-21 09:20:48 +08:00
Gary PendergastandKrzysztof Kotlarek 23e7542f60 DEV: Improve the helper methods for defining reviewable actions (#35406)
This change adds a new `ReviewableActionBuilder#build_bundle` helper for
quickly defining action bundles that can be performed on reviewables.
`ReviewableActionBuilder#build_action` has also been updated to allow
plugin-defined actions to appear correctly.

The core reviewable types have been updated to use this new method, and
I've also added support for reviewable chat messages, to demonstrate
plugin support.

Co-authored-by: Krzysztof Kotlarek <kotlarek.krzysztof@gmail.com>
2025-10-21 11:13:13 +11:00
Joffrey JAFFEUX c2e4cb30af DEV: fix failing specs (#35507)
Since the new modifier has been added, some specs were not using using
the focus check on the composer (included in `fill_composer` method) and
we were actually not focused which was causing these specs to fail.
2025-10-20 23:39:20 +02:00
chapoiandawesomerobot 33e79f6272 UX: Move AI bot PM to navigation menu (#35189)
The header space is becoming very crowded with translations, chat, and
AI bot all enabled.
This commit makes the new default for AI conversations a link in the
community section in the sidebar instead of a header button.


<img width="1412" height="246" alt="CleanShot 2025-10-04 at 15 44 05@2x"
src="https://github.com/user-attachments/assets/45c48607-bbaa-4993-9e92-bb8db2d7f45a"
/>
<img width="478" height="650" alt="CleanShot 2025-10-04 at 15 44 32@2x"
src="https://github.com/user-attachments/assets/67af3afa-6a46-4c79-8aa9-fc789a086056"
/>

There is also a new back-to-forum button added in, conform with other
custom-sidebar pages such as /admin and /docs.
<img width="1966" height="1004" alt="CleanShot 2025-10-04 at 15 45
04@2x"
src="https://github.com/user-attachments/assets/5b167aba-9305-476f-a449-ec4a186bc6f7"
/>

---------

Co-authored-by: awesomerobot <kris.aubuchon@discourse.org>
2025-10-20 09:15:51 -04:00
Joffrey JAFFEUX 0a75c18f57 FIX: prevents body scroll in input focus (#35497)
We had already a workaround for this, but this is supposed to be an even
better one. I never managed to repro the bug with this workaround.

What we are trying to prevent:
<img width="922" height="2000" alt="IMG_8116 2 (1)"
src="https://github.com/user-attachments/assets/28fb3150-1cb6-43b7-9ca6-f0e7e18dcc80"
/>

Example discussion online about this bug:

https://stackoverflow.com/questions/60797340/ios-safari-prevent-or-control-scroll-on-input-focus

This commit also extracts this logic as modifier:
`{{preventScrollOnFocus}}`
2025-10-20 15:04:09 +02:00
David Battersby e30f6b919d UX: mobile lightbox padding and styling improvements (#35494)
Adds a safe inset bottom for lightbox captions on mobile and removes
image padding on small screens. This change also applies bottom
depending on whether caption is being set or not.

How it looks:

<img width="225" height="487" alt="IMG_9334"
src="https://github.com/user-attachments/assets/d92d379a-ad63-44d0-8320-a0861b2a10e4"
/>
2025-10-20 14:59:03 +04:00
Kris e2c701a849 UX: remove total and update backfill message for AI translations (#35479)
This removes the "N posts are ready to translate" message and updates
the backfill estimate text to also reference the date

Before:
<img width="2228" height="430" alt="image"
src="https://github.com/user-attachments/assets/112c933f-0bae-4e87-8949-317a9b6eccb8"
/>


After:
<img width="2194" height="624" alt="image"
src="https://github.com/user-attachments/assets/b4157144-e3c6-481c-beeb-a5d841230b55"
/>
2025-10-17 14:09:28 -04:00
Roman Rizzi 424edb1b4b FIX: Disable AI Problem Checks (#35475)
The underlying problem check system has some issues we need to address
before being able to run these reliably.
2025-10-17 14:07:32 -03:00
Régis Hanol 67f2fbb923 FIX: Job exception: Holidays::InvalidRegion (#35473)
When we updated the list of available/supported holidays regions in
eabbac18cf and in
1983a44812 we left some records with
invalid regions.

This adds a migration to correct old records, as well as adding an error
handling to log an error when a region is invalid, rather than throwing
an exception and breaking the background job.

Ref - https://meta.discourse.org/t/-/384873
2025-10-17 17:53:53 +02:00
Keegan George 85de78b428 DEV: Conditionally show AI image caption button (#35463)
## 🔍 Overview

None of the vision capable LLMs currently support captioning SVGs, and
attempting to caption images results in some odd behavior. On the server
side, we already [only allow specific
extensions](https://github.com/discourse/discourse/blob/e2eb9fe93f8a338df6981bae0b378f9c9eb57555/plugins/discourse-ai/lib/completions/upload_encoder.rb#L13-L19)
before captioning, but the client side we still were showing the image
caption button.

This update hides the image caption button on image extensions that are
not supported for AI image captioning. To achieve this, we also update
the plugin API method: `api.addComposerImageWrapperButton` so that it
supports an optional `includeCondition` param to conditionally show the
button based on the image source URL.

## 📹 Preview


https://github.com/user-attachments/assets/c9507475-ae3d-4356-8586-3fcc5d070b83
2025-10-17 08:16:25 -07:00
Rafael dos Santos Silva 6b7a086644 FEATURE: Add estimated completion time to AI translation backfill (#35474)
## Summary
- Adds estimated completion time (ETA) display for AI translation
backfill progress
- ETA is calculated based on the configured hourly rate and remaining
untranslated posts
- Display format automatically adjusts based on time remaining (minutes,
hours, or days)
- ETA appears inline with the post count for better UX

## Implementation Details
- Backend sends `hourly_rate` from site settings to frontend
- Frontend calculates total remaining posts across all locales
- ETA calculation: `remaining_posts / hourly_rate`
- Format logic:
  - < 1 hour: shows minutes
  - 1-24 hours: shows hours  
  - \> 24 hours: shows days
- Only displays when backfill is enabled and there are posts remaining

<img width="1243" height="242" alt="image"
src="https://github.com/user-attachments/assets/314bc399-9694-43ec-8591-0237c1b902f6"
/>
2025-10-17 11:55:26 -03:00
Rafael dos Santos Silva 34c4621ad4 DEV: Increase max translation backfill rate to 100k (#35472) 2025-10-17 10:55:23 -03:00
David Taylor d9e0a44007 DEV: Fix Zeitwerk reloading in post-voting (#35470)
1. Update `register_preloaded_category_custom_fields` API to be
reload-safe

2. Update post-voting to use this in all cases, and remove the
`respond_to?` checks since this plugin is now bundled with core
2025-10-17 13:58:12 +01:00
Régis Hanol 03629cd561 PERF: N+1 when checking for category moderators when loading channels (#35466)
Avoids an N+1 when loading /chat/api/me/channels and checking for
category moderators.

Internal ref - t/165130
2025-10-17 14:29:28 +02:00
Joffrey JAFFEUX 52e5801e3d FIX: allows check_policy to find mailer class (#35464) 2025-10-17 11:19:33 +02:00
David BattersbyandYuriy Kurant 9fa647390c FIX: add data attrs to quoted images (#35455)
Adds missing data attributes that PhotoSwipe requires for lightboxing
quoted images. This is a follow up to #35442.

In core we handle this within the cooked post processor, but in chat our
message processor is more lightweight and doesn't have the same handling
for lightbox images.

---------

Co-authored-by: Yuriy Kurant <yuriy@discourse.org>
2025-10-17 11:16:39 +04:00
Régis Hanol b99e47cfae FIX: phantom notification when being added to an event in a message... (#35459)
... you don't have access to.

Before creating the notification for an event, we weren't checking
whether the invitee had access to the topic, thus generating phantom
notification (aka. a number in the hamburger menu, but no notification
item in any lists).

Also made sure that creating a private event without any invitees, does
not generate invites for ... everyone 😅
2025-10-17 09:04:21 +02:00
Kris ce9d2d543a UX: Sort AI translations by completion, show decimal between 99 and 100% (#35461)
This will sort the bars of the AI translation chart in descending order
based on completion %.

I've also made an adjustment to show a single decimal of precision
between 99 and 100% so we're not rounding up to 100% when there are
still a small number of remaining posts to translate.
2025-10-16 17:32:39 -04:00
Kris bf4d07a89c UX: additional AI translation chart adjustments (#35454)
Follow-up to be8b2b3, which wasn't quite enough adjustment to get the
desired outcome. At the moment it's correctly showing how many posts
need to be translated (1203), but it's still showing the total of posts
in the default locale (190284), rather than distinguishing the total
number of posts that need translating in that language.

<img width="2222" height="482" alt="image"
src="https://github.com/user-attachments/assets/0e4e1bee-0033-4b98-8f0c-b90d95845203"
/>

This PR further adjusts the chart to show "remaining work" for each
locale, rather than showing the total number of posts. So the outcome
should be more like

<img width="2210" height="638" alt="image"
src="https://github.com/user-attachments/assets/baa099d4-20f0-40bc-8fbb-3d2d5308e97a"
/>


I've also updated the tooltip on the chart to clarify that this is the
number of posts not in the language that need to be translated into it
2025-10-16 14:57:04 -04:00
Keegan George 5dd149079b FEATURE: Append limited search results with semantic search (#35446)
## 🔍 Overview

This update adds AI enhancement to the quick search feature of
Discourse. When the setting:
`ai_embeddings_semantic_quick_search_enabled` is enabled and a search is
made using quick search menu yielding only a few results or none, AI
results will be appended to the result.


## 📹 Preview

### Before


https://github.com/user-attachments/assets/f3880cc3-9e9e-4b1e-8fd2-bb2cc27fd7de

### After

https://github.com/user-attachments/assets/c6975690-2aa3-44a9-b8e8-ad4d42effa9b
2025-10-16 09:27:31 -07:00
Joffrey JAFFEUX 739b36906f FIX: improves input method editor in chat (#35448) 2025-10-16 18:11:17 +02:00
Roman Rizzi 2fd6d69bf1 FIX: Don’t create AI Problem check trackers without a target LLM. (#35447)
We need to define #targets, or the problem check code will create a
tracker without a target when the check passes. This bug causes the
check to ignore the perform_every constraint.
2025-10-16 12:38:06 -03:00
David Battersby 2e5eb80b94 FIX: add lightbox class to chat quoted images (#35442)
Adds the lightbox class to quoted images in chat, allowing better
alignment with how lightbox works in core.
2025-10-16 19:30:13 +04:00
Kris be8b2b3507 UX: show only posts needing translation for default locale in AI translation chart (#35397)
The chart for AI translations included all posts for the default locale,
which would make the rest of the chart fairly disproportionate

<img width="1766" height="1228" alt="image"
src="https://github.com/user-attachments/assets/63298222-ca41-4874-8103-d5c0dae05795"
/>

In this PR I'm only showing the posts in the default locale that need
work done, which will be a much smaller number, resulting in a chart
that better represents actual translation work needed. Worst case is
that there's a very small number of posts to be translated to the
default locale, but overall this should better represent the work to be
done.

(placeholder data shown here) 
<img width="2210" height="730" alt="image"
src="https://github.com/user-attachments/assets/66e9ccb7-19f4-4aa7-addb-1b3f8f6a6dfc"
/>

I've also added a note to explain that we're not showing all the posts
in the default locale, only the ones needing translation.
2025-10-16 10:16:24 -04:00
Régis Hanol c6fc6d9612 FIX: event location field in .ics / google calendar exports (#35355)
When creating an event with a location, the information was missing from
the .ics / google calendar "exports".

Ref - meta/t/378672
2025-10-16 15:53:01 +02:00
Joffrey JAFFEUX c33c0f6019 FIX: ensures user can DM to show start new dm button (#35440)
Followup to https://github.com/discourse/discourse/pull/34820 which
didn't take this case into consideration.
2025-10-16 12:43:09 +02:00
David BattersbyandMartin Brennan b671166ab1 FEATURE: Experimental Photoswipe Lightbox (#35109)
Our current implementation of lightbox uses Magnific Popup, which is now
deprecated and will only receive critical/security bug fixes. Magnific
also relies on jQuery, which we would like to remove where possible
throughout our codebase.

After looking at various options, the general consensus was that
PhotoSwipe was a close match to what we need.

Regular image types that are supported with our current lightbox (jpg,
png etc) will work with their existing cooked markup (no need to rebake
posts). This PR also adds support for SVG images and markup from various
theme components (ie. Discourse Mermaid).

---------

Co-authored-by: Martin Brennan <martin@discourse.org>
2025-10-16 12:24:11 +04:00
Ted Johansson 0dcc602d3c FIX: Broken reviewable link to relevant automation (#35434)
The link to the automation is broken. Probably since we moved discourse-automation into core.
2025-10-16 13:04:42 +08:00
Kelv daac912405 DEV: add api docs for discourse-calendar events index endpoint (#35400)
This creates an overriding `rswag:specs:swaggerize` rake task that also
adds plugin paths, and updates spec helpers to handle plugin paths.

Also adds the spec files for the discourse-calendar events index
endpoint.

### Testing

Running `rake rswag:specs:swaggerize` now generates the same
`openapi/openapi.yaml` file, with `/discourse-post-event/events.ics` and
`/discourse-post-event/events.json` GET documentation.
2025-10-16 07:39:08 +08:00
Chris Alberti 56aef84ac4 FEATURE: Add settings for connect/revoke capability in Login with Amazon (#35387)
Previously manual user connect/revoke in preferences were both enabled
permanently based on the default values in the ManagedAuthenticator
class. This adds settings so either one can be explicitly disabled.
2025-10-15 12:28:20 -05:00
Renato Atilio 2702b73e58 FEATURE: enforce prosemirror-gapcursor on additional block nodes (#35415)
Enforces the gap cursor using the new `createGapCursor: true` node spec
prop to the following block nodes:
- `blockquote`
- `quote`
- `code_block`
- `html_block`
- `spoiler`
2025-10-15 10:14:26 -03:00
Discourse Translator Bot a70793eb07 Update translations (#35316) 2025-10-15 12:05:55 +02:00
Gary Pendergast e0cb29ed4c DEV: Improve validity checking of JSON param values. (#35401)
The validity checking for parameter values being passed in expects them
all to be strings, then casts them to their appropriate type after
confirming that they're valid.

Rather than bypassing these checks, it's safer to convert the values to
strings, then continue with the existing validity checks.
2025-10-15 14:31:12 +11:00
David Taylor 6247fdc255 DEV: Resolve 'unknown OID' warnings for pgvector columns (#35393)
ActiveRecord prints these warnings when loading the db schema into its
internal cache. We don't need to do this for the AI embeddings tables,
since we don't use ActiveRecord models for them.

Reverts the system-spec-specific workaround from 446ff04e
2025-10-14 22:30:06 +01:00
David Taylor 613cf3f969 DEV: Normalize discourse-cakeday route/controller/template names (#35391)
See 6081bc2249 for context
2025-10-14 21:45:13 +01:00
Rafael dos Santos Silva 70ece55d97 FEATURE: Support for newer Gemini Embedding model (#35390) 2025-10-14 17:13:22 -03:00
Rafael dos Santos Silva 78ae5dbc46 FIX: Handle nil @post in CookedProcessorMixin for chat messages (#35386)
Chat::MessageProcessor includes CookedProcessorMixin but only sets
@model, leaving @post as nil. The process_hotlinked_image method was
attempting to access @post.post_hotlinked_media, causing undefined
method errors when processing chat messages with images.
2025-10-14 16:04:25 -03:00
Keegan George 51f323ef37 DEV: Allow seeded models in enumerator (#35385)
With out AI credit system being rolled out, we no longer rely on
allowing/disallowing seeded models in the enumerator. This update allows
seeded models to be selected and used in the `LlmEnumerator`.
2025-10-14 11:05:33 -07:00
Kris 18f9bf787a A11Y: add role to video thumbnail button (#35326)
We markup video thumbnail `div`s in posts with `tabindex="0"` which
makes them tabbable, but without a role it's unclear they're
interactive.

Since on click or keypress these play the video, it should have
`role="button"` as well as an an accessible label.

I also noticed that `onKeyPress` was added here but isn't wired up to
anything... so I've included that and also added the space key as a
trigger in addition to enter.
2025-10-14 11:51:51 -04:00
Keegan George 902fd7494b FEATURE: Hosted LLM credit system (#35162)
## 🔍 Overview
This update adds a credit system under the hood which will be used for
our CDCK Hosted LLM models so we can make our features more accessible
to our hosted customers!

## 📷 Screenshots
<img width="1105" height="268" alt="Screenshot 2025-10-02 at 12 48 58"
src="https://github.com/user-attachments/assets/2a07d89b-7510-4565-82bb-26b46fbcf5c4"
/>

_☝🏽 ` ProblemCheck` notices to inform customers_

<img width="1077" height="472" alt="Screenshot 2025-10-02 at 12 49 41"
src="https://github.com/user-attachments/assets/b72028f7-5df2-45a8-8c71-65cf750755ab"
/>

_☝🏽 AI Usage page for easy monitoring_

<img width="1112" height="1083" alt="Screenshot 2025-10-02 at 18 17 01"
src="https://github.com/user-attachments/assets/a01992d5-15a0-472a-9501-bc3bc9a54ade"
/>

_☝🏽 Credit bars underneath relevant LLM models_

<img width="866" height="267" alt="Screenshot 2025-10-03 at 11 35 19"
src="https://github.com/user-attachments/assets/e7b4c0e7-c93d-4b0f-923d-79ac5d53028b"
/>

_☝🏽 Dialog box when trying to use without available credits_
2025-10-14 07:48:20 -07:00
Keegan George 7d4f756a4f FEATURE: Auto enable AI search (full page) when no regular results (#35336)
## 🔍 Overview

In full page search, when there are no regular results, this update
ensures that AI search gets automatically toggled on with its results.
This update also fixes a minor issue with the checkmark icon in the AI
search toggle being incorrectly overridden by a CSS selector.

No system tests as there is a separate todo pending adding all semantic
search related specs.

## 📹 Screen Recording


https://github.com/user-attachments/assets/86ceee81-6c70-40ac-a0c8-ce67d32373d8


## 📸 Screenshots

Before
<img width="1479" height="152" alt="Screenshot 2025-10-10 at 14 36 32"
src="https://github.com/user-attachments/assets/8bacb549-7422-49ae-9cfd-0518aec78c03"
/>

After
<img width="1491" height="170" alt="Screenshot 2025-10-10 at 14 36 26"
src="https://github.com/user-attachments/assets/1d1c72b5-7aac-45e5-b634-033e344cb385"
/>
2025-10-14 07:17:08 -07:00
Arpit Jalan 0a6b3857c5 FEATURE: Update India Diwali 2025 Holiday (#35354)
https://economictimes.indiatimes.com/news/new-updates/when-is-diwali-in-2025-is-deepawali-on-october-20-or-21-kashi-council-has-cleared-confusion-about-the-real-date/articleshow/124518482.cms
2025-10-14 10:34:02 +05:30