iachat/app/javascript/dashboard/i18n/locale/it/integrations.json
Gabriel Jablonski b03dfdb751
Chore/merge upstream 4.8.0 (#150)
* chore: Hide "Learn More" button in feature spotlight for self-hosted (#12675)

* feat: single query for reporting event stats (#12664)

This PR collapses multiple queries fetching stats from a single table to
a single query

```sql
SELECT 
  user_id as user_id,
  COUNT(CASE WHEN name = 'conversation_resolved' THEN 1 END) as resolved_count,
  AVG(CASE WHEN name = 'conversation_resolved' THEN value END) as avg_resolution_time,
  AVG(CASE WHEN name = 'first_response' THEN value END) as avg_first_response_time,
  AVG(CASE WHEN name = 'reply_time' THEN value END) as avg_reply_time 
FROM "reporting_events"
WHERE 
  "reporting_events"."account_id" = <account_id> AND 
  "reporting_events"."created_at" >= '2025-09-14 18:30:00' AND 
  "reporting_events"."created_at" < '2025-10-14 18:29:59'
GROUP BY "reporting_events"."user_id";
```

### Why this works?

Here's why this optimization is faster based on PostgreSQL internals:

- Single Table Scan vs Multiple Scans: Earlier we did 4 sequential scans
(or 4 index scans) of the same data, with the same where clause, now in
a single scan all 4 `CASE` expressions are evaluated in a single pass.
- Shared Buffer Cache Efficiency: PostgreSQL's shared buffer cache
stores recently accessed pages, with this, pages are loaded once and
re-used for all aggregation, earlier with separate queries we were
forced to re-read all from the disk each time
- Reduced planning and network overhead (4 vs 1 query)


### How is it tested

1. The specs all pass without making any changes
2. Verified the reports side by side after generating from report seeder

#### How to test

Generate seed data using the following command

```bash
ACCOUNT_ID=1 ENABLE_ACCOUNT_SEEDING=true bundle exec rake db:seed:reports_data
```

Once done download the reports, checkout to this branch and download the
reports again and compare them

* chore: Update translations (#12625)

* chore: Migrate mailers from the worker to jobs (#12331)

Previously, email replies were handled inside workers. There was no
execution logs. This meant if emails silently failed (as reported by a
customer), we had no way to trace where the issue happened, the only
assumption was “no error = mail sent.”

By moving email handling into jobs, we now have proper execution logs
for each attempt. This makes it easier to debug delivery issues and
would have better visibility when investigating customer reports.

Fixes
https://linear.app/chatwoot/issue/CW-5538/emails-are-not-sentdelivered-to-the-contact

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* chore(deps-dev): bump vite from 5.4.20 to 5.4.21 (#12700)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite)
from 5.4.20 to 5.4.21.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/releases">vite's
releases</a>.</em></p>
<blockquote>
<h2>v5.4.21</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">vite's
changelog</a>.</em></p>
<blockquote>
<h2><!-- raw HTML omitted -->5.4.21 (2025-10-20)<!-- raw HTML omitted
--></h2>
<ul>
<li>fix(dev): trim trailing slash before <code>server.fs.deny</code>
check (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20968">#20968</a>)
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20970">#20970</a>)
(<a
href="cad1d31d06">cad1d31</a>),
closes <a
href="https://redirect.github.com/vitejs/vite/issues/20968">#20968</a>
<a
href="https://redirect.github.com/vitejs/vite/issues/20970">#20970</a></li>
<li>chore: update CHANGELOG (<a
href="ca88ed7398">ca88ed7</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="adce3c22c6"><code>adce3c2</code></a>
release: v5.4.21</li>
<li><a
href="cad1d31d06"><code>cad1d31</code></a>
fix(dev): trim trailing slash before <code>server.fs.deny</code> check
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20968">#20968</a>)
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20970">#20970</a>)</li>
<li><a
href="ca88ed7398"><code>ca88ed7</code></a>
chore: update CHANGELOG</li>
<li>See full diff in <a
href="https://github.com/vitejs/vite/commits/v5.4.21/packages/vite">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=5.4.20&new-version=5.4.21)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/chatwoot/chatwoot/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: Update translations (#12708)

* chore(sidekiq): log ActiveJob class and job_id on dequeue (#12704)

## Context

Sidekiq logs only showed the Sidekiq wrapper class and JID, which wasn’t
helpful when debugging ActiveJobs.

## Changes

- Updated `ChatwootDequeuedLogger` to log the actual `ActiveJob class`
and `job_id` instead of the generic Sidekiq wrapper and JID.

> Example
> ```
> Dequeued ActionMailer::MailDeliveryJob
123e4567-e89b-12d3-a456-426614174000 from default
> ```

- Remove sidekiq worker and unify everything to `ActiveJob`

* chore: Enforce custom role permissions on conversation access (#12583)

## Summary
- ensure conversation lookup uses the permission filter before fetching
records
- add request specs covering custom role access to unassigned
conversations

## Testing
- bundle exec rspec
spec/enterprise/controllers/api/v1/accounts/conversations_controller_spec.rb

------
https://chatgpt.com/codex/tasks/task_e_68de1f62b9b883268a54882e608a8bb8

* fix: parameterize agent name (#12709)

* chore: Remove channel icons from the create inbox page (#12727)

# Pull Request Template

## Description
This PR removes the frame containing all channel icons from the “Create
Inbox” page.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Screenshots

**Before**
<img width="1314" height="1016" alt="image"
src="https://github.com/user-attachments/assets/2b773495-9ddb-48b4-b15d-9aef18259ce1"
/>


**After**
<img width="1314" height="979" alt="image"
src="https://github.com/user-attachments/assets/f4dc64cf-516c-4faf-a45c-2f7de05cc29b"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: Use gap-4 instead of margins to define space between elements (#12728)

We should avoid using margins to define space between elements, instead
use the gap utility.

The problem with this particular instance was that if Google auth was
turned off and SSO is available, there is a weird spacing at the top
caused by the margin from the SSO element.

This PR will fix that. It also introduces a gap between the divider and
the button, but that should be okay.

* feat(ee): Add a service to fetch website content and prepare a persona of Captain Assistant (#12732)

This PR is the first of many to simplify the process of building an
assistant. The new flow will only require the user’s website. We’ll
automatically crawl it, identify the business name and what the business
does, and then generate a suggested assistant persona, complete with a
proposed name and description.

This service returns the following.
Example: tooljet.com
<img width="795" height="217" alt="Screenshot 2025-10-25 at 2 55 04 PM"
src="https://github.com/user-attachments/assets/9cb3594a-9c9c-4970-a0a1-4c9c8869c193"
/>

Example: replit.com
<img width="797" height="176" alt="Screenshot 2025-10-25 at 2 56 42 PM"
src="https://github.com/user-attachments/assets/6a1b4266-aab6-455f-a5e3-696d3a8243c9"
/>

* chore: Adds URL-based search and tab selection (#12663)

# Pull Request Template

## Description

This PR enables URL-based search and tab selection, allowing search
queries and active tabs to persist in the URL for easy sharing.

Fixes
[CW-5766](https://linear.app/chatwoot/issue/CW-5766/cannot-impersonate-an-account),
https://github.com/chatwoot/chatwoot/issues/12623

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video

https://www.loom.com/share/422a1d61f3fe4278a88e352ef98d2b78?sid=35fabee7-652f-4e17-83bd-e066a3bb804c

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* chore: Add tab params for inbox configuration (#12665)

# Pull Request Template

## Description

This PR enables active tabs in inbox settings to persist in the URL for
easy sharing.

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video

https://www.loom.com/share/63820ecb17ea491a9082339f8bb457b6?sid=4fef1acd-b4fd-431f-855c-7647015a330f


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Muhsin <muhsinkeramam@gmail.com>

* feat: Changelog card components (#12673)

# Pull Request Template

## Description

This PR introduces a new changelog component that can be used in the
sidebar.

Fixes
https://linear.app/chatwoot/issue/CW-5776/changelog-card-ui-component

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Screencast



https://github.com/user-attachments/assets/42e77e82-388a-4fc9-9b37-f3d0ea1a9d7f







## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Muhsin <muhsinkeramam@gmail.com>

* chore: Remove linear integration feature flag (#12716)

This PR removes the linear integration feature flag since the
integration is pretty much stable and we do display the Linear CTA for
users who aren't connected.
Fixes
https://linear.app/chatwoot/issue/CW-5819/remove-linear-feature-flag-from-front-end

* chore: Update translations (#12722)

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>

* perf: Add database index on conversations identifier (#12715)

**Problem**
Slack webhook processing was failing with 500 errors due to database
timeouts. The query `Conversation.where(identifier:
params[:event][:thread_ts]).first` was performing full table scans and
hitting PostgreSQL statement timeout.

**Solution**
Added database index on conversations.identifier and account_id.

* fix: Extend phone number normalization to Twilio WhatsApp (#12655)

### Problem
WhatsApp Cloud channels already handle Brazil/Argentina phone number
format mismatches (PRs #12492, #11173), but Twilio WhatsApp channels
were creating duplicate contacts
  when:
  - Template sent to new format: `whatsapp:+5541988887777` (13 digits)
  - User responds from old format: `whatsapp:+554188887777` (12 digits)

### Solution

The solution extends the existing phone number normalization
infrastructure to support both WhatsApp providers while handling their
different payload formats:

  ### Provider Format Differences
  - **WhatsApp Cloud**: `wa_id: "919745786257"` (clean number)
- **Twilio WhatsApp**: `From: "whatsapp:+919745786257"` (prefixed
format)
  
  
 ### Test Coverage

#### Brazil Phone Number Tests
  **Case 1: New Format (13 digits with "9")**
- **Test 1**: No existing contact → Creates new contact with original
format
- **Test 2**: Contact exists in same format → Appends to existing
conversation

  **Case 2: Old Format (12 digits without "9")**
- **Test 3**: Contact exists in old format → Appends to existing
conversation
- **Test 4** *(Critical)*: Contact exists in new format, message in old
format → Finds existing contact, prevents duplicate
- **Test 5**: No contact exists → Creates new contact with incoming
format

#### Argentina Phone Number Tests
  **Case 3: With "9" after country code**
  - **Test 6**: No existing contact → Creates new contact
- **Test 7**: Contact exists in normalized format → Uses existing
contact

  **Case 4: Without "9" after country code**
  - **Test 8**: Contact exists in same format → Appends to existing
  - **Test 9**: No contact exists → Creates new contact

Fixes
https://linear.app/chatwoot/issue/CW-5565/inconsistencies-for-mobile-numbersargentina-brazil-and-mexico-numbers

* fix: Timezone offset reports broken by DST transition (#12747)

## Description

Fixes timezone offset parameter in V2 reports API that was broken by DST
transitions. The issue occurred when UK DST ended on October 26, 2025,
causing the test to fail starting October 27th.

~~**Initial diagnosis:** The root cause was that
`timezone_name_from_offset` used `zone.now.utc_offset` to match
timezones, which changes based on the current date's DST status rather
than the data being queried.~~

**Actual root cause:** The test was accidentally passing before DST
transition. During BST, `timezone_name_from_offset(0)` matched "Azores"
(UTC-1) instead of "Edinburgh" (UTC+0), and the -1 hour offset
coincidentally split midnight data into [1,5]. After DST ended, it
correctly matched "Edinburgh" (UTC+0), but this grouped all
conversations into one day [6], exposing that the test data was flawed.

The real issue: Test data created all 6 conversations starting at
midnight on a single day, which cannot produce a [1,5] split in true
UTC.

Fixes CW-5846

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [ ] This change requires a documentation update

## How Has This Been Tested?

**Test that was failing:**
```bash
bundle exec rspec spec/controllers/api/v2/accounts/reports_controller_spec.rb:25
```

**Changes:**
~~1. Fixed `timezone_name_from_offset` to use January 1st as reference
date instead of current date~~
~~2. Converted timezone string to `ActiveSupport::TimeZone` object for
`group_by_period` compatibility~~

**Revised approach:**
1. Freeze test time to January 2024 using `travel_to`, making timezone
matching deterministic and aligned with test data period
2. Start test conversations at 23:00 instead of midnight to properly
span two days and test timezone boundary grouping
3. Keep `zone.now.utc_offset` (correct behavior for real users during
DST)

**Why this works:**
- Test runs "in January 2024" → `zone.now.utc_offset` returns January
offsets consistently
- Offset `-8` correctly matches Pacific Standard Time (UTC-8 in January)
- Real users in PDT (summer) with offset `-7` → correctly match Pacific
Daylight Time
- No production impact, test is deterministic year-round

**Verification:**
- Test now passes consistently regardless of current DST status
- Timezone matching works correctly for real users during DST periods
- Reports correctly group data by timezone offset across all seasons

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* fix: Captain response builder not getting triggered (#12729)

## Summary
- Fix captain response builder not getting triggered for cases where
responses are created as completed.

## Testing Instructions 
- Test articles with firecrawl
- Test articles without firecrawl
- Test PDF documents

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* chore: Update captain pending FAQ interface (#12752)

# Pull Request Template

## Description

**This PR includes,**
- Added new pending FAQs view with approve/edit/delete actions for each
response.
- Implemented banner notification showing pending FAQ count on main
approved responses page.
- Created dedicated route for pending FAQs review at
/captain/responses/pending.
- Added automatic pending count updates when switching assistants or
routes.
- Modified ResponseCard component to show action buttons instead of
dropdown in pending view.

Fixes
https://linear.app/chatwoot/issue/CW-5833/pending-faqs-in-a-different-ux

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video
https://www.loom.com/share/5fe8f79b04cd4681b9360c48710b9373


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* fix: Exclude authentication templates from WhatsApp template selection (#12753)

This PR add the changes for excluding the authentication templates from
the WhatsApp template selection in the frontend, as these templates are
not supported at the moment. Reference:
https://www.chatwoot.com/hc/user-guide/articles/1754940076-whatsapp-templates#what-is-not-supported

* feat: Template types components (#12714)

# Pull Request Template

## Description

Fixes
https://linear.app/chatwoot/issue/CW-5806/create-the-story-book-components-for-template-typestext-media-list

**Pending**
Need to standardize the structure to match the template/campaigns.


## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Screenshots

<img width="669" height="179" alt="image"
src="https://github.com/user-attachments/assets/42efd292-8520-4b05-81ec-8bc526fc12db"
/>
<img width="646" height="304" alt="image"
src="https://github.com/user-attachments/assets/431dd964-006c-4877-a693-dae39b90df4c"
/>
<img width="646" height="380" alt="image"
src="https://github.com/user-attachments/assets/9052e31f-9292-4afb-8897-13931655fa00"
/>
<img width="646" height="272" alt="image"
src="https://github.com/user-attachments/assets/873d2488-e856-4a0d-8579-cc1bcc61cc8e"
/>
<img width="646" height="490" alt="image"
src="https://github.com/user-attachments/assets/14c2aa42-bf27-475f-aa70-fe59c1d00e9b"
/>
<img width="646" height="281" alt="image"
src="https://github.com/user-attachments/assets/1f42408e-03e8-4863-b4c7-715d13d67686"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* fix: update omniauth to latest to resolve heroku deployment issues (#12749)

# Pull Request Template

## Description

Fixes https://github.com/chatwoot/chatwoot/issues/12553

Heroku build was failing due to `omniauth` version mismatch. Also, added
`NODE_OPTIONS=--max-old-space-size=4096` to handle OOM during Vite
build.

## Type of change

Please delete options that are not relevant.

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Tested on heroku

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

* chore: Improvements in pending FAQs (#12755)

# Pull Request Template

## Description

**This PR includes:**

1. Added URL-based filter persistence for the responses pages, including
page and search parameters.
2. Introduced a new empty state variant for pending FAQs — without a
backdrop and with a “Clear Filters” option.
3. Made the actions, filter, and search row remain fixed at the top
while scrolling.

Fixes
https://linear.app/chatwoot/issue/CW-5852/improvements-in-pending-faqs

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video
https://www.loom.com/share/1d9eee68c0684f0ab05e08b4ca1e0ce9


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: run captain v2 outside the transaction (#12756)

* feat: Always process email content (#12734)

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* feat: Bulk actions for contacts (#12763)

Introduces APIs and UI for bulk actions in contacts table. The initial
action available will be assign labels

Fixes: #8536 #12253 

## Screens

<img width="1350" height="747" alt="Screenshot 2025-10-29 at 4 05 08 PM"
src="https://github.com/user-attachments/assets/0792dff5-0371-4b2e-bdfb-cd32db773402"
/>
<img width="1345" height="717" alt="Screenshot 2025-10-29 at 4 05 19 PM"
src="https://github.com/user-attachments/assets/ae510404-c6de-4c15-a720-f6d10cdac25b"
/>

---------

Co-authored-by: Muhsin <muhsinkeramam@gmail.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>

* feat: Enable opensearch on paid plans automatically (#12770)

- enable `advanced_search feature` on all paid plans automatically

ref: https://github.com/chatwoot/chatwoot/pull/12503

* chore: Make contacts bulk action bar sticky (#12773)

# Pull Request Template

## Description

This PR makes the contacts bulk action bar sticky while scrolling.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Screenshots
<img width="1080" height="300" alt="image"
src="https://github.com/user-attachments/assets/21f8f3c6-813e-4ef6-b40a-8dd14e6ffb26"
/>
<img width="1080" height="300" alt="image"
src="https://github.com/user-attachments/assets/bb939f1d-9a13-4f9f-953d-b9872c984b74"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* chore: Add dependant destroy_async for sla events (#12774)

Added the destroy_async to prevent timeout during SLA policy deletion by
processing SLA events asynchronously.

* chore: Update translations (#12748)

* feat: Add company backfill migration for existing contacts (Part 1) (#12657)

## Description

Implements company backfill migration infrastructure for existing
contacts. This is **Part 1 of 2** for the company model production
rollout as described in
[CW-5726](https://linear.app/chatwoot/issue/CW-5726/company-model-setting-it-up-on-production).

Creates jobs and services to associate existing contacts with companies
based on their email domains, filtering out free email providers (gmail,
yahoo, etc.) and disposable addresses.
 

**What's included:**
- Business email detector service with ValidEmail2 (uses
`disposable_domain?` to avoid DNS lookups)
- Per-account batch job to process contacts for one account
- Orchestrator job to iterate all accounts
- Rake task: `bundle exec rake companies:backfill`

~~*NOTE*: I'm using a hard-coded approach to determine if something is a
"business" email by filtering out emails that are usually personal. I've
also added domains that are common to some of our customers' regions.
This should be simpler. I looked into `Valid_Email2` and I couldn't find
anything to dictate whether an email is a personal email or a business
one. I don't think the approach used in the frontend is valid here.~~
UPDATE: Using `email_provider_info` gem instead.


**Pending - Part 2 (separate PR):** Real-time company creation for new
contacts

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

```bash
# Run all new tests
bundle exec rspec spec/enterprise/services/companies/business_email_detector_service_spec.rb \\
                   spec/enterprise/jobs/migration/company_account_batch_job_spec.rb \\
                   spec/enterprise/jobs/migration/company_backfill_job_spec.rb

# Run RuboCop
bundle exec rubocop enterprise/app/services/companies/business_email_detector_service.rb \\
                     enterprise/app/jobs/migration/company_account_batch_job.rb \\
                     enterprise/app/jobs/migration/company_backfill_job.rb \\
                     lib/tasks/companies.rake
```

**Performance optimization:**
- Uses `disposable_domain?` instead of `disposable?` to avoid DNS MX
lookups (discovered via tcpdump analysis - `disposable?` was making
network calls for every email, causing 100x slowdown)

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>

* feat: Add company auto-association for contacts (CW-5726 Part 2) (#12711)

## Description

Implements real-time company auto-association for contacts based on
email domains. This is **Part 2** of the company model production
rollout (CW-5726).

**Task:**
- When a contact is created with a business email, automatically create
and associate a company from the email domain
- When a contact is updated with an email for the first time (email was
previously nil), associate with a company
- Preserve existing company associations when email changes to avoid
user confusion
- Skip free email providers and disposable domains

**Dependencies:**
⚠️ Requires PR #12657 (Part 1: Backfill migration) to be merged first

**Linear ticket:**
[CW-5726](https://linear.app/chatwoot/issue/CW-5726/company-model-setting-it-up-on-production)

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

- Service specs: Tests business email detection, company creation,
association logic, edge cases (existing companies, free emails, nil
emails)
- Integration specs: Tests full callback flow for contact create/update
scenarios
- All tests passing: 10 examples, 0 failures
- RuboCop: 0 offenses

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules (PR #12657 pending)

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>

* fix: Optimize Message search_data to prevent OpenSearch field explosion (#12786)

## Description

Refactored the `Message#search_data` method to prevent exceeding
OpenSearch's 1000 field limit during reindex operations.

**Problem:** The previous implementation serialized entire ActiveRecord
objects (Inbox, Sender, Conversation) with all their JSONB fields,
causing dynamic field explosion in OpenSearch. This resulted in
`Searchkick::ImportError` with "Limit of total fields [1000] has been
exceeded".

**Solution:** Whitelisted only necessary fields for search and
filtering, and flattened JSONB `custom_attributes` into key-value pair
arrays to prevent unbounded field creation.

Linked to: CW-5861

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [x] This change requires a documentation update

## How Has This Been Tested?

- Verified rubocop passes with no offenses
- Code review of search field usage from
`enterprise/app/services/enterprise/search_service.rb`
- Analyzed actual search queries to determine required indexed fields

**Still needed:**
- Full reindex test on staging/production environment
- Verify search functionality still works after reindex
- Confirm field count is under 1000 limit

## Changes Made

### Before
- Indexed 1000+ fields (entire AR objects with JSONB)
- `inbox` = full Inbox object (23+ fields + JSONB)
- `sender` = full Contact/User/AgentBot object (10+ fields + JSONB)
- `conversation` = full push_event_data
- Dynamic JSONB keys creating unlimited fields

### After
- ~35-40 controlled fields
- Whitelisted search fields: `content`, `attachment_transcribed_text`,
`email_subject`
- Filter fields: `account_id`, `inbox_id`, `conversation_id`,
`sender_id`, `sender_type`, etc.
- Flattened `custom_attributes`: `[{key, value, value_type}]` format
- Helper methods: `search_conversation_data`, `search_inbox_data`,
`search_sender_data`, `search_additional_data`

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

## Post-merge Steps

After merging, the following steps are required:

1. **Reindex all messages:**
   ```bash
   bundle exec rails runner "Message.reindex"
   ```

2. **Verify field count:**
   ```bash
   bundle exec rails runner "
     client = Searchkick.client
     index_name = Message.searchkick_index.name
     mapping = client.indices.get_mapping(index: index_name)
     fields = mapping.dig(index_name, 'mappings', 'properties')
     puts 'Total fields: ' + fields.keys.count.to_s
   "
   ```

3. **Test search functionality** to ensure queries still work as
expected

---------

Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com>
Co-authored-by: Pranav <pranav@chatwoot.com>

* fix: Avoid introducing new attributes in search (#12791)

Fix `Limit of total fields [1000] has been exceeded`


https://linear.app/chatwoot/issue/CW-5861/searchkickimporterror-type-=-illegal-argument-exception-reason-=-limit#comment-6b6e41bd

* fix: Gate Sidekiq dequeue logger behind env (#12790)

## Summary
- wrap the dequeue middleware registration in a boolean env flag
- document the ENABLE_SIDEKIQ_DEQUEUE_LOGGER option in .env.example

* feat: Bulk delete for contacts (#12778)

Introduces a new bulk action `delete` for contacts

ref: https://github.com/chatwoot/chatwoot/pull/12763

## Screens

<img width="1492" height="973" alt="Screenshot 2025-10-31 at 6 27 21 PM"
src="https://github.com/user-attachments/assets/30dab1bb-2c2c-4168-9800-44e0eb5f8e3a"
/>
<img width="1492" height="985" alt="Screenshot 2025-10-31 at 6 27 32 PM"
src="https://github.com/user-attachments/assets/5be610c4-b19e-4614-a164-103b22337382"
/>

* fix: Video bubble click and play issue (#12764)

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* feat: Differentiate bot and user in the summary (#12801)

While generating the summary, use the appropriate sender type for the
message.

* fix: Invalid image URL issue in Help Center articles (#12806)

* feat: allow bots to handle campaigns when sender_id is nil (#12805)

* fix: Add empty line before signature in compose conversation editor (#12702)

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* feat: Enhance button interactions (#12738)

* fix: Remove the same account validation for whatsapp channels (#12811)

## Description

Modified the phone number validation in Whatsapp::ChannelCreationService
to check for duplicate phone numbers across ALL accounts, not just
within the current account.

## Type of change

- [ ] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Added test coverage for cross-account phone number validation
- Using actual UI flow 
<img width="1493" height="532" alt="image"
src="https://github.com/user-attachments/assets/67d2bb99-2eb9-4115-8d56-449e4785e0d8"
/>


## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* feat: Update Captain navigation structure (#12761)

# Pull Request Template

## Description

This PR includes an update to the Captain navigation structure.

## Route Structure

```javascript
1. captain_assistants_responses_index    → /captain/:assistantId/faqs
2. captain_assistants_documents_index    → /captain/:assistantId/documents
3. captain_assistants_scenarios_index    → /captain/:assistantId/scenarios
4. captain_assistants_playground_index   → /captain/:assistantId/playground
5. captain_assistants_inboxes_index      → /captain/:assistantId/inboxes
6. captain_tools_index                   → /captain/tools
7. captain_assistants_settings_index     → /captain/:assistantId/settings
8. captain_assistants_guardrails_index   → /captain/:assistantId/settings/guardrails
9. captain_assistants_guidelines_index   → /captain/:assistantId/settings/guidelines
10. captain_assistants_index             → /captain/:navigationPath
```

**How it works:**

1. User clicks sidebar item → Routes to `captain_assistants_index` with
`navigationPath`
2. `AssistantsIndexPage` validates route and gets last active assistant,
if not redirects to assistant create page.
3. Routes to actual page: `/captain/:assistantId/:page`
4. Page loads with correct assistant context

Fixes
https://linear.app/chatwoot/issue/CW-5832/updating-captain-navigation

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?




## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>

* fix: Handle login when there are no accounts (#12816)

* chore: Update translations (#12794)

* chore(docs): Fix typos in some files (#12817)

This PR fixes typos in the file file using codespell.

* refactor: strategy pattern for mailbox conversation finding (#12766)

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* fix: Issue with processing variables in outgoing email content (#12799)

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>

* fix: hide pdf citations in captain faq responses (#12839)

* fix: Use contact_id instead of sender_id for Instagram message locks (#12841)

Previously, the lock key for Instagram used sender_id, which for echo
messages (outgoing) would be the account's own ID. This caused all
outgoing messages to compete for the same lock, creating a bottleneck
during bulk messaging.

The fix introduces contact_instagram_id method that correctly identifies
the contact's ID regardless of message direction:
- For echo messages (outgoing): uses recipient.id (the contact)
- For incoming messages: uses sender.id (the contact)

This ensures each conversation has a unique lock, allowing parallel
processing of webhooks while maintaining race condition protection
within individual conversations.

Fixes lock acquisition errors in Sidekiq when processing bulk Instagram
messages.

Fixes
https://linear.app/chatwoot/issue/CW-5931/p0-mutexapplicationjoblockacquisitionerror-failed-to-acquire-lock-for

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

* fix: label tags for contactable inboxes (#12838)

* chore: Improve captain layout (#12820)

* feat: allow selecting month range in overview reports (#12701)

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>

* fix: respect status parameter when creating articles via API (#12846)

## Description

The Articles API was ignoring the `status` parameter when creating new
articles. All articles were forced to be drafts due to a hardcoded
`@article.draft!` call in the controller, even when users explicitly
sent `status: 1` (published) in their API request.

This PR removes the hardcoded draft enforcement and allows the status
parameter to be respected while maintaining backward compatibility.

Fixes #12063

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

**Before:**
- API POST with `status: 1` → Created as draft (ignored parameter)
- API POST without status → Created as draft

**After:**
- API POST with `status: 1` → Created as published 
- API POST without status → Created as draft (backward compatible) 
- UI creates articles → Still creates as draft (UI doesn't send status)


**Tests run:**
```bash
bundle exec rspec spec/controllers/api/v1/accounts/articles_controller_spec.rb
# 17 examples, 0 failures
```

Updated tests:
1. Changed 2 existing tests that were verifying the broken behavior
(expecting draft when published was sent)
2. Added new test to verify articles default to draft when status is not
provided
3. All existing tests pass, confirming backward compatibility

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes

Co-authored-by: Sojan Jose <sojan@pepalo.com>

* feat: allow querying reporting events via the API (#12832)

* feat(webhooks): add name to webhook (#12641)

## Description

When working with webhooks, it's easy to lose track of which URL is
which. Adding a `name` (optional) column to the webhook model is a
straight-forward solution to make it significantly easier to identify
webhooks.

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

Model and controller specs, and also running in production over several
months without any issues.

| Before | After |
| --- | --- |
| <img width="949" height="990" alt="image copy 3"
src="https://github.com/user-attachments/assets/6b33c072-7d16-4a9c-a129-f9c0751299f5"
/> | <img width="806" height="941" alt="image"
src="https://github.com/user-attachments/assets/77f3cb3a-2eb0-41ac-95bf-d02915589690"
/> |
| <img width="1231" height="650" alt="image copy 2"
src="https://github.com/user-attachments/assets/583374af-96e0-4436-b026-4ce79b7f9321"
/> | <img width="1252" height="650" alt="image copy"
src="https://github.com/user-attachments/assets/aa81fb31-fd18-4e21-a40e-d8ab0dc76b4e"
/> |


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

* perf: speed up docker builds (#12859)

- Use separate keys to avoid cache overwrites across different
architecture builds


https://linear.app/chatwoot/issue/CW-5945/perf-speed-up-docker-builds

### 25 mins  ---> 5mins


## before

<img width="971" height="452" alt="image"
src="https://github.com/user-attachments/assets/535cebd6-6c16-48d1-a62d-ffb6f2fc9b08"
/>


## after
<img width="940" height="428" alt="image"
src="https://github.com/user-attachments/assets/359eb313-4bb5-4e0e-9492-a8ad48645159"
/>

* chore: Update missing places with new colors (#12862)

# Pull Request Template

## Description

This PR updates the colors in places that were missed during the color
update migration.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: Brand installation name not showing (#12861)

# Pull Request Template

## Description

Fixes
https://linear.app/chatwoot/issue/CW-5946/fix-brand-installation-name-issue-in-dyte

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: migrate from deprecated annotate gem to annotaterb (#12845)

## Description

The `annotate` gem has been deprecated and users are experiencing
annotation errors with the new Rails 7 `serialize` syntax. This PR
migrates to `annotaterb`, the actively maintained fork.

Users reported errors when running `make db`:
```
Unable to annotate app/models/installation_config.rb: no implicit conversion of Hash into String  
Unable to annotate app/models/installation_config.rb: no implicit conversion of nil into Array
```

This PR updates the Gemfile and rake configuration to use `annotaterb`
instead.

Fixes #11673

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Tested locally with the following steps:
1. Run `bundle install` - successfully installed annotaterb 4.20.0
2. Run `RAILS_ENV=development bundle exec rails db:chatwoot_prepare` -
completed without annotation errors
3. Run `RAILS_ENV=development bundle exec rails annotate_rb:models` -
successfully annotated all models including InstallationConfig
4. Verified InstallationConfig model annotations are present and correct

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] New and existing unit tests pass locally with my changes

* chore: disable worker MemoryHigh throttling in systemd unit (#12871)

- set MemoryHigh to infinity in deployment/chatwoot-worker.1.service so
the worker is throttled only by the existing
    MemoryMax hard limit
- prevents cgroup reclaim from slowing Sidekiq under transient spikes
while still keeping the hard stop at 1.5 GB

* chore: Update translations (#12818)

* fix: revert annotaterb migration due to persistent annotation errors (#12881)

## Description

This PR reverts the migration from the `annotate` gem to `annotaterb`
introduced in PR #12845. The annotation errors reported in #11673
persist with both gems, and the old `annotate` gem handles the errors
more gracefully by continuing to process other models instead of
crashing.

**Testing reveals both gems fail with the same underlying issue:**

**Old annotate gem (3.2.0):**
```
Unable to annotate app/models/installation_config.rb: no implicit conversion of Hash into String
Unable to annotate app/models/installation_config.rb: no implicit conversion of nil into Array
Model files unchanged.
```
(Logs error but continues processing)

**New annotaterb gem (4.20.0):**
```
❯ bundle exec annotaterb models
ruby/3.4.4/lib/ruby/gems/3.4.0/gems/reline-0.3.6/lib/reline/terminfo.rb:2: warning: ruby/3.4.4/lib/ruby/3.4.0/fiddle.rb was loaded from the standard library, but will no longer be part of the default gems starting from Ruby 3.5.0.
You can add fiddle to your Gemfile or gemspec to silence this warning.
Also please contact the author of reline-0.3.6 to request adding fiddle into its gemspec.
Annotating models
bundler: failed to load command: annotaterb (ruby/3.4.4/bin/annotaterb)
ruby/3.4.4/lib/ruby/3.4.0/psych/parser.rb:62:in 'Psych::Parser#_native_parse': no implicit conversion of Hash into String (TypeError)

      _native_parse @handler, yaml, path
                    ^^^^^^^^^^^^^^^^^^^^
        from ruby/3.4.4/lib/ruby/3.4.0/psych/parser.rb:62:in 'Psych::Parser#parse'
        from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:457:in 'Psych.parse_stream'
        from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:401:in 'Psych.parse'
        from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:325:in 'Psych.safe_load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/coders/yaml_column.rb:37:in 'ActiveRecord::Coders::YAMLColumn::SafeCoder#load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/coders/column_serializer.rb:37:in 'ActiveRecord::Coders::ColumnSerializer#load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/type/serialized.rb:22:in 'ActiveRecord::Type::Serialized#deserialize'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute.rb:175:in 'ActiveModel::Attribute::FromDatabase#type_cast'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute.rb:43:in 'ActiveModel::Attribute#value'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute_set.rb:37:in 'block in ActiveModel::AttributeSet#to_hash'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'block in Enumerable#index_with'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'Array#each'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'Enumerable#index_with'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute_set.rb:37:in 'ActiveModel::AttributeSet#to_hash'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/model_schema.rb:499:in 'ActiveRecord::ModelSchema::ClassMethods#column_defaults'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:68:in 'AnnotateRb::ModelAnnotator::ModelWrapper#column_defaults'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:139:in 'block in AnnotateRb::ModelAnnotator::ModelWrapper#built_attributes'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:136:in 'Array#map'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:136:in 'AnnotateRb::ModelAnnotator::ModelWrapper#built_attributes'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/column_annotation/annotation_builder.rb:15:in 'AnnotateRb::ModelAnnotator::ColumnAnnotation::AnnotationBuilder#build'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:52:in 'block in AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#columns'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:51:in 'Array#map'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:51:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#columns'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:26:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#body'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:35:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#build'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:71:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder#build'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:43:in 'AnnotateRb::ModelAnnotator::ProjectAnnotator#build_instructions_for_file'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:17:in 'block in AnnotateRb::ModelAnnotator::ProjectAnnotator#annotate'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:13:in 'Array#map'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:13:in 'AnnotateRb::ModelAnnotator::ProjectAnnotator#annotate'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotator.rb:21:in 'AnnotateRb::ModelAnnotator::Annotator#do_annotations'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotator.rb:8:in 'AnnotateRb::ModelAnnotator::Annotator.do_annotations'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/commands/annotate_models.rb:17:in 'AnnotateRb::Commands::AnnotateModels#call'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/runner.rb:38:in 'AnnotateRb::Runner#run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/runner.rb:11:in 'AnnotateRb::Runner.run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/exe/annotaterb:18:in '<top (required)>'
        from ruby/3.4.4/bin/annotaterb:25:in 'Kernel#load'
        from ruby/3.4.4/bin/annotaterb:25:in '<top (required)>'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:58:in 'Kernel.load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:58:in 'Bundler::CLI::Exec#kernel_load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:23:in 'Bundler::CLI::Exec#run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:455:in 'Bundler::CLI#exec'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/command.rb:28:in 'Bundler::Thor::Command#run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in 'Bundler::Thor::Invocation#invoke_command'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor.rb:527:in 'Bundler::Thor.dispatch'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:35:in 'Bundler::CLI.dispatch'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/base.rb:584:in 'Bundler::Thor::Base::ClassMethods#start'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:29:in 'Bundler::CLI.start'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/exe/bundle:28:in 'block in <top (required)>'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/friendly_errors.rb:117:in 'Bundler.with_friendly_errors'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/exe/bundle:20:in '<top (required)>'
        from ruby/3.4.4/bin/bundle:25:in 'Kernel#load'
        from ruby/3.4.4/bin/bundle:25:in '<main>'


```
(Crashes immediately, stops all processing)

**Root cause:** The `InstallationConfig` model uses YAML serialization
(`serialize :serialized_value, coder: YAML`) on a JSONB database column.
When annotation tools read column defaults, PostgreSQL returns JSONB as
a Hash, but YAML expects a String, causing the type error.

The migration to annotaterb doesn't solve the problem - both gems
encounter the same error. The old gem is preferable as it continues
working despite the error.

Reverts #12845
Related to #11673

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

1. Reverted commit 559d1b657
2. Ran `bundle install` to reinstall annotate gem v3.2.0
3. Ran `RAILS_ENV=development bundle exec annotate` 
- Result: Logs errors for InstallationConfig but completes successfully
4. Re-applied the annotaterb changes and tested `bundle exec annotaterb
models`
   - Result: Crashes with full stack trace and stops processing

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] New and existing unit tests pass locally with my changes


---
*Edited to truncate environment-specific info from error dump*

* chore: Hide assistant switcher on paywall screen (#12875)

* feat: Assignment service (v2) (#12320)

## Linear Link

 
## Description

This PR introduces a new robust auto-assignment system for conversations
in Chatwoot. The system replaces the existing round-robin assignment
with a more sophisticated service-based architecture that supports
multiple assignment strategies, rate limiting, and Enterprise features
like capacity-based assignment and balanced distribution.

## Type of change

- [ ] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

- Unit test cases
- Test conversations getting assigned on status change to open
- Test the job directly via rails console

## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds a new service-based auto-assignment system with scheduled jobs,
rate limiting, enterprise capacity/balanced selection, and wiring via
inbox/handler; includes Redis helpers and comprehensive tests.
> 
> - **Auto-assignment v2 (core services)**:
> - Add `AutoAssignment::AssignmentService` with bulk assignment,
configurable conversation priority, RR selection, and per-agent rate
limiting via `AutoAssignment::RateLimiter`.
>   - Add `AutoAssignment::RoundRobinSelector` for agent selection.
> - **Jobs & scheduling**:
> - Add `AutoAssignment::AssignmentJob` (per-inbox bulk assign;
env-based limit) and `AutoAssignment::PeriodicAssignmentJob` (batch over
accounts/inboxes).
> - Schedule periodic run in `config/schedule.yml`
(`periodic_assignment_job`).
> - **Model/concerns wiring**:
> - Include `InboxAgentAvailability` in `Inbox`; add
`Inbox#auto_assignment_v2_enabled?`.
> - Update `AutoAssignmentHandler` to trigger v2 job when
`auto_assignment_v2_enabled?`, else fallback to legacy.
> - **Enterprise extensions**:
> - Add `Enterprise::InboxAgentAvailability` (capacity-aware filtering)
and `Enterprise::Concerns::Inbox` association `inbox_capacity_limits`.
> - Extend service via `Enterprise::AutoAssignment::AssignmentService`
(policy-driven config, capacity filtering, exclusion rules) and add
selectors/services: `BalancedSelector`, `CapacityService`.
> - **Infrastructure**:
> - Enhance `Redis::Alfred` with `expire`, key scan/count, and extended
ZSET helpers (`zadd`, `zcount`, `zcard`, `zrangebyscore`).
> - **Tests**:
> - Add specs for jobs, core service, rate limiter, RR selector, and
enterprise features (capacity, balanced selection, exclusions).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0ebe187c8aea73765b0122a44b18d6f465c2477f. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* fix: Change contact_inboxes.source_id to text column (#12882)

## Description

Fixes CW-5961 where IMAP email processing failed with
`ActiveRecord::RecordInvalid: Validation failed: Source is too long
(maximum is 255 characters)` error.

This changes the `contact_inboxes.source_id` column from `string` (255
character limit) to `text` (unlimited) to accommodate long email message
IDs that were causing validation failures.

Fixes CW-5961

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Added spec test validating `source_id` values longer than 255
characters (300 chars)
- All existing `contact_inbox_spec.rb` tests pass (7 examples, 0
failures)
- Migration applied successfully with reversible up/down methods
- Verified `source_id` column type changed to `text` with `null: false`
constraint preserved

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes

* feat: allow configuring attachment upload limit (#12835)

## Summary
- add a configurable MAXIMUM_FILE_UPLOAD_SIZE installation setting and
surface it through super admin and global config payloads
- apply the configurable limit to attachment validations and shared
upload helpers on dashboard and widget
- introduce a reusable helper with unit tests for parsing the limit and
extend attachment specs for configurability


------
[Codex
Task](https://chatgpt.com/codex/tasks/task_e_6912644786b08326bc8dee9401af6d0a)

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>

* feat: Customizable webhook timeout configuration (#12777)

## Summary
- Ability to configure the webhook timeout for Chatwoot self hosted
installations

fixes: https://github.com/chatwoot/chatwoot/issues/12754

* feat: Control the allowed login methods via Super Admin (#12892)

- Control the allowed authentication methods for a chatwoot installation
via super admin configs. [SAML, Google Auth etc]
------
[Codex
Task](https://chatgpt.com/codex/tasks/task_e_6917d503b6e48326a261672c1de91462)

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>

* chore: Update translations (#12876)

* feat: Backend - Companies API endpoint with pagination and search (#12840)

## Description

Adds API endpoint to list companies with pagination, search, and
sorting.

Fixes
https://linear.app/chatwoot/issue/CW-5930/add-backend-routes-to-get-companies-result
Parent issue:
https://linear.app/chatwoot/issue/CW-5928/add-companies-tab-to-dashboard

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

Added comprehensive specs to
`spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb`:
- Pagination (25 per page, multiple pages)
- Search by name and domain (case-insensitive)
- Counter cache for contacts_count
- Account scoping
- Authorization

To reproduce:
```bash
bundle exec rspec spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb
bundle exec rubocop enterprise/app/controllers/api/v1/accounts/companies_controller.rb
```

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>

* feat: Companies page (#12842)

# Pull Request Template

## Description

This PR introduces a new Companies section in the Chatwoot dashboard. It
lists all companies associated with the account and includes features
such as **search**, **sorting**, and **pagination** to enable easier
navigation and efficient management.

Fixes
https://linear.app/chatwoot/issue/CW-5928/add-companies-tab-to-dashboard

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Screenshot
<img width="1619" height="1200" alt="image"
src="https://github.com/user-attachments/assets/21f0a666-c3d6-4dec-bd02-1e38e0cd9542"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* feat: Add Amazon SES inbound email support (#12893)

## Summary
- add AWS ActionMailbox SES gems
- document SES as incoming email provider
- note SES option in configuration

## Testing
- `bundle exec rubocop config/initializers/mailer.rb
config/environments/production.rb Gemfile`


------
[Codex
Task](https://chatgpt.com/codex/tasks/task_e_68bbb7d482288326b8f04bb795af0322)

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>

* feat: hide email forwarding address if INBOUND_EMAIL_DOMAIN is not configured (#12768)

#### Summary

- Improved email inbox setup flow to handle cases where inbound email
forwarding is not configured on the installation
- Added conditional display of email forwarding address based on
MAILER_INBOUND_EMAIL_DOMAIN environment variable availability
- Enhanced user messaging to guide users toward configuring SMTP/IMAP
settings when forwarding is unavailable

#### Changes

**Backend (app/views/api/v1/models/_inbox.json.jbuilder)**
- Added forwarding_enabled boolean flag to inbox API response based on
MAILER_INBOUND_EMAIL_DOMAIN presence
- Made forward_to_email conditional - only included when forwarding is
enabled

  **Frontend - Inbox Creation Flow**
- Created new EmailInboxFinish.vue component to handle email inbox setup
completion
  - Shows different messages based on whether forwarding is enabled:
- With forwarding: displays forwarding address and encourages SMTP/IMAP
configuration
- Without forwarding: warns that SMTP/IMAP configuration is required for
emails to be processed
- Added link to configuration page for easy access to SMTP/IMAP settings

<img width="988" height="312" alt="Screenshot 2025-11-18 at 3 27 27 PM"
src="https://github.com/user-attachments/assets/928aff78-df73-49fa-9a26-dbbd1297b26a"
/>

<img width="765" height="489" alt="Screenshot 2025-11-18 at 3 24 46 PM"
src="https://github.com/user-attachments/assets/6a182c7d-087f-4e88-92a5-30f147a567a7"
/>


Fixes
https://linear.app/chatwoot/issue/CW-5881/hide-forwaring-email-section-if-inbound-email-domain-is-not-configured


## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

- Tested locally

## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* feat: APIs to assign agents_bots as assignee in conversations (#12836)

## Summary
- add an assignee_agent_bot_id column as an initital step to prototype
this before fully switching to polymorphic assignee
- update assignment APIs and conversation list / show endpoints to
reflect assignee as agent bot
- ensure webhook payloads contains agent bot assignee


[Codex
Task](https://chatgpt.com/codex/tasks/task_e_6912833377e48326b6641b9eee32d50f)

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* Bump version to 4.8.0

* chore: remove migration

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Chatwoot Bot <92152627+chatwoot-bot@users.noreply.github.com>
Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Muhsin <muhsinkeramam@gmail.com>
Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>
Co-authored-by: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Co-authored-by: Lê Nam Khánh <55955273+khanhkhanhlele@users.noreply.github.com>
2025-11-19 16:25:58 -03:00

978 lines
44 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"INTEGRATION_SETTINGS": {
"SHOPIFY": {
"DELETE": {
"TITLE": "Elimina Integrazione Shopify",
"MESSAGE": "Sei sicuro di voler eliminare l'integrazione Shopify?"
},
"STORE_URL": {
"TITLE": "Connetti Store Shopify",
"LABEL": "URL Store",
"PLACEHOLDER": "your-store.myshopify.com",
"HELP": "Inserisci l'URL del tuo store Shopify myshopify.com",
"CANCEL": "Annulla",
"SUBMIT": "Connetti Store"
},
"ERROR": "Si è verificato un errore nella connessione a Shopify. Si prega di riprovare o contattare il supporto se il problema persiste."
},
"HEADER": "Integrazioni",
"DESCRIPTION": "Chatwoot si integra con più strumenti e servizi per migliorare l'efficienza del tuo team. Esplora l'elenco qui sotto per configurare le tue app preferite.",
"LEARN_MORE": "Scopri di più sulle integrazioni",
"LOADING": "Caricamento integrazioni",
"CAPTAIN": {
"DISABLED": "Captain non è abilitato sul tuo account.",
"CLICK_HERE_TO_CONFIGURE": "Clicca qui per configurare",
"LOADING_CONSOLE": "Caricamento Console Captain...",
"FAILED_TO_LOAD_CONSOLE": "Caricamento della Console Captain non riuscito. Aggiorna e riprova."
},
"WEBHOOK": {
"SUBSCRIBED_EVENTS": "Eventi Sottoscritti",
"LEARN_MORE": "Scopri di più sui webhooks",
"FORM": {
"CANCEL": "Annulla",
"DESC": "Gli eventi Webhook ti forniscono le informazioni in tempo reale su ciò che sta accadendo nel tuo account Chatwoot. Per favore inserisci un URL valido per configurare un callback.",
"SUBSCRIPTIONS": {
"LABEL": "Eventi",
"EVENTS": {
"CONVERSATION_CREATED": "Conversazione Creata",
"CONVERSATION_STATUS_CHANGED": "Stato conversazione cambiato",
"CONVERSATION_UPDATED": "Conversazione aggiornata",
"MESSAGE_CREATED": "Messaggio creato",
"MESSAGE_UPDATED": "Messaggio aggiornato",
"WEBWIDGET_TRIGGERED": "Widget live chat aperto dall'utente",
"CONTACT_CREATED": "Contatto creato",
"CONTACT_UPDATED": "Contatto aggiornato",
"CONVERSATION_TYPING_ON": "Digitazione conversazione attiva",
"CONVERSATION_TYPING_OFF": "Digitazione conversazione disattiva"
}
},
"NAME": {
"LABEL": "Nome Webhook",
"PLACEHOLDER": "Inserisci un nome per il webhook"
},
"END_POINT": {
"LABEL": "URL del webhook",
"PLACEHOLDER": "Example: {webhookExampleURL}",
"ERROR": "Inserisci un URL valido"
},
"EDIT_SUBMIT": "Aggiorna webhook",
"ADD_SUBMIT": "Crea webhook"
},
"TITLE": "Webhook",
"CONFIGURE": "Configura",
"HEADER": "Impostazioni Webhook",
"HEADER_BTN_TXT": "Aggiungi nuovo webhook",
"LOADING": "Recupero dei webhooks collegati",
"SEARCH_404": "Non ci sono elementi che corrispondono a questa richiesta",
"SIDEBAR_TXT": "<p><b>Webhooks</b> </p> <p>I Webhooks sono callback HTTP che possono essere definiti per ogni account. Sono innescati da eventi come la creazione di messaggi in Chatwoot. Puoi creare più di un webhook per questo account. <br /><br /> Per creare un <b>webhook</b>, clicca sul pulsante <b>Aggiungi nuovo webhook</b>. Puoi anche rimuovere qualsiasi webhook esistente cliccando sul pulsante Elimina.</p>",
"LIST": {
"404": "Non ci sono webhook configurati per questo account.",
"TITLE": "Gestisci webhook",
"TABLE_HEADER": {
"WEBHOOK_ENDPOINT": "Endpoint Webhook",
"ACTIONS": "Azioni"
}
},
"EDIT": {
"BUTTON_TEXT": "Modifica",
"TITLE": "Modifica webhook",
"API": {
"SUCCESS_MESSAGE": "Configurazione Webhook aggiornata correttamente",
"ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi"
}
},
"ADD": {
"CANCEL": "Annulla",
"TITLE": "Aggiungi nuovo webhook",
"API": {
"SUCCESS_MESSAGE": "Configurazione Webhook aggiunta correttamente",
"ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi"
}
},
"DELETE": {
"BUTTON_TEXT": "Elimina",
"API": {
"SUCCESS_MESSAGE": "Webhook eliminato con successo",
"ERROR_MESSAGE": "Impossibile connettersi al server Woot, riprova più tardi"
},
"CONFIRM": {
"TITLE": "Conferma Eliminazione",
"MESSAGE": "Sei sicuro di voler eliminare il webhook? ({webhookURL})",
"YES": "Sì, Elimina ",
"NO": "No, Conserva"
}
}
},
"SLACK": {
"DELETE": "Elimina",
"DELETE_CONFIRMATION": {
"TITLE": "Elimina l'integrazione",
"MESSAGE": "Sei sicuro di voler eliminare l'integrazione? Così facendo si perderà l'accesso alle conversazioni nel tuo workspace Slack."
},
"HELP_TEXT": {
"TITLE": "Stai utilizzando l'integrazione Slack",
"BODY": "Con questa integrazione, tutte le conversazioni in arrivo verranno sincronizzate nel canale ***{selectedChannelName}*** del tuo workspace Slack. Potrai gestire tutte le conversazioni con i clienti direttamente dal canale e non perderai mai un messaggio.\n\nEcco le principali funzionalità dellintegrazione:\n\n**Rispondi alle conversazioni direttamente da Slack:** Per rispondere a una conversazione nel canale Slack ***{selectedChannelName}***, ti basta scrivere il tuo messaggio e inviarlo come thread. Questo genererà automaticamente una risposta al cliente tramite Chatwoot. Semplice, no?\n\n**Crea note private:** Se vuoi aggiungere note private invece di risposte, inizia il messaggio con ***`note:`***. In questo modo il messaggio resterà privato e non sarà visibile al cliente.\n\n**Associa un profilo operatore:** Se la persona che risponde su Slack ha un profilo operatore in app con lo stesso indirizzo email, le risposte verranno associate automaticamente a quel profilo. In questo modo potrai sapere facilmente chi ha risposto e quando. Se invece chi risponde non ha un profilo operatore associato, le risposte verranno inviate al cliente dal profilo del bot.",
"SELECTED": "selezionato"
},
"SELECT_CHANNEL": {
"OPTION_LABEL": "Seleziona un canale",
"UPDATE": "Aggiorna",
"BUTTON_TEXT": "Connetti canale",
"DESCRIPTION": "Il tuo workspace Slack è ora collegato a Chatwoot. Tuttavia, l'integrazione è attualmente inattiva. Per attivare l'integrazione e collegare un canale a Chatwoot, fare clic sul pulsante qui sotto.\n\n**Nota:** Se stai tentando di collegare un canale privato, aggiungi l'app Chatwoot al canale Slack prima di procedere con questo passaggio.",
"ATTENTION_REQUIRED": "Attenzione richiesta",
"EXPIRED": "La tua integrazione con Slack è scaduta. Per continuare a ricevere messaggi su Slack, elimina l'integrazione e connetti nuovamente il tuo workspace."
},
"UPDATE_ERROR": "Si è verificato un errore durante l'aggiornamento dell'integrazione, riprova",
"UPDATE_SUCCESS": "Il canale è connesso con successo",
"FAILED_TO_FETCH_CHANNELS": "Si è verificato un errore nel recupero dei canali da Slack, per favore riprova"
},
"DYTE": {
"CLICK_HERE_TO_JOIN": "Clicca qui per unirti",
"LEAVE_THE_ROOM": "Lascia la stanza",
"START_VIDEO_CALL_HELP_TEXT": "Avvia una nuova videochiamata con il cliente",
"JOIN_ERROR": "Si è verificato un errore nell'unirsi alla chiamata, riprova",
"CREATE_ERROR": "Si è verificato un errore durante la creazione di un link alla riunione, riprova"
},
"OPEN_AI": {
"AI_ASSIST": "AI Assist",
"WITH_AI": " {option} con l'AI ",
"OPTIONS": {
"REPLY_SUGGESTION": "Suggerimenti di Risposta",
"SUMMARIZE": "Riassumi",
"REPHRASE": "Migliora la Scrittura",
"FIX_SPELLING_GRAMMAR": "Correggi ortografia e grammatica",
"SHORTEN": "Abbrevia",
"EXPAND": "Espandi",
"MAKE_FRIENDLY": "Cambia il tono del messaggio in amichevole",
"MAKE_FORMAL": "Usa un tono formale",
"SIMPLIFY": "Semplifica"
},
"ASSISTANCE_MODAL": {
"DRAFT_TITLE": "Contenuti in bozza",
"GENERATED_TITLE": "Contenuti generati",
"AI_WRITING": "L'AI sta scrivendo",
"BUTTONS": {
"APPLY": "Usa questo suggerimento",
"CANCEL": "Annulla"
}
},
"CTA_MODAL": {
"TITLE": "Integra con OpenAI",
"DESC": "Porta funzionalità AI avanzate nella tua dashboard con i modelli GPT di OpenAI. Per iniziare, inserisci la chiave API dal tuo account OpenAI.",
"KEY_PLACEHOLDER": "Inserisci la tua chiave API OpenAI",
"BUTTONS": {
"NEED_HELP": "Hai bisogno di aiuto?",
"DISMISS": "Ignora",
"FINISH": "Completa Setup"
},
"DISMISS_MESSAGE": "Puoi configurare l'integrazione di OpenAI più tardi quando vuoi.",
"SUCCESS_MESSAGE": "Setup integrazione OpenAI completato con successo"
},
"TITLE": "Migliora con AI",
"SUMMARY_TITLE": "Riassunto con AI",
"REPLY_TITLE": "Suggerimenti di risposta con AI",
"SUBTITLE": "Una risposta migliorata verrà generata utilizzando l'AI, in base alla tua bozza attuale.",
"TONE": {
"TITLE": "Tono",
"OPTIONS": {
"PROFESSIONAL": "Professionale",
"FRIENDLY": "Amichevole"
}
},
"BUTTONS": {
"GENERATE": "Genera",
"GENERATING": "Generazione...",
"CANCEL": "Annulla"
},
"GENERATE_ERROR": "Si è verificato un errore nell'elaborazione del contenuto, verifica la tua chiave API OpenAI e riprova"
},
"DELETE": {
"BUTTON_TEXT": "Elimina",
"API": {
"SUCCESS_MESSAGE": "Integrazione eliminata con successo"
}
},
"CONNECT": {
"BUTTON_TEXT": "Connetti"
},
"DASHBOARD_APPS": {
"TITLE": "App Dashboard",
"HEADER_BTN_TXT": "Aggiungi una nuova App Dashboard",
"SIDEBAR_TXT": "<p><b>App dashboard</b></p><p>Le app dashboard consentono alle organizzazioni di incorporare un'applicazione all'interno di Chatwoot per fornire informazioni aggiuntive agli operatorii. Questa funzione consente di creare un'applicazione in modo indipendente e incorporata all'interno della dashboard per fornire informazioni degli utenti, ad esempio ordini o pagamenti effettuati.</p><p>Quando integri la tua applicazione usando la dashboard Chatwoot, la tua applicazione avrà il context della conversazione e del contatto come evento window. Implementa un listener per l'evento del messaggio sulla tua pagina per ricevere i dati.</p><p>Per aggiungere una nuova app dashboard, clicca sul pulsante 'Aggiungi una nuova app dashboard'.</p>",
"DESCRIPTION": "Le app dashboard consentono alle organizzazioni di incorporare un'applicazione all'interno della dashboard per fornire dati aggiuntivi agli operatori. Questa funzione consente di creare un'applicazione in modo indipendente e incorporarla per fornire informazioni sull'utente, i suoi ordini o la loro cronologia di pagamento precedente.",
"LEARN_MORE": "Scopri di più sulle App Dashboard",
"LIST": {
"404": "Non ci sono ancora app dashboard configurate su questo account",
"LOADING": "Caricamento app dashboard...",
"TABLE_HEADER": {
"NAME": "Nome",
"ENDPOINT": "Endpoint"
},
"EDIT_TOOLTIP": "Modifica app",
"DELETE_TOOLTIP": "Elimina app"
},
"FORM": {
"TITLE_LABEL": "Nome",
"TITLE_PLACEHOLDER": "Inserisci un nome per la tua app dashboard",
"TITLE_ERROR": "È richiesto un nome per l'app dashboard",
"URL_LABEL": "Endpoint",
"URL_PLACEHOLDER": "Inserisci l'URL dell'endpoint dove la tua app è hostata",
"URL_ERROR": "È richiesto un URL valido"
},
"CREATE": {
"HEADER": "Aggiungi una nuova App Dashboard",
"FORM_SUBMIT": "Invia",
"FORM_CANCEL": "Annulla",
"API_SUCCESS": "App dashboard configurata con successo",
"API_ERROR": "Non siamo riusciti a creare un'app. Riprova più tardi"
},
"UPDATE": {
"HEADER": "Modifica app dashboard",
"FORM_SUBMIT": "Aggiorna",
"FORM_CANCEL": "Annulla",
"API_SUCCESS": "App dashboard aggiornata con successo",
"API_ERROR": "Non è stato possibile aggiornare l'app. Riprova più tardi"
},
"DELETE": {
"CONFIRM_YES": "Sì, elimina",
"CONFIRM_NO": "No, mantieni",
"TITLE": "Conferma eliminazione",
"MESSAGE": "Sei sicuro di voler eliminare l'app - {appName}?",
"API_SUCCESS": "App dashboard cancellata con successo",
"API_ERROR": "Non è stato possibile eliminare l'app. Riprova più tardi"
}
},
"LINEAR": {
"ADD_OR_LINK_BUTTON": "Crea/collega issue Linear",
"LOADING": "Caricamento issue Linear...",
"LOADING_ERROR": "Si è verificato un errore nel recupero delle issue Linear, si prega di riprovare",
"CREATE": "Crea",
"LINK": {
"SEARCH": "Cerca issue",
"SELECT": "Seleziona issue",
"TITLE": "Link",
"EMPTY_LIST": "Nessuna issue Linear trovata",
"LOADING": "Caricamento",
"ERROR": "Si è verificato un errore nel recupero delle issue Linear, si prega di riprovare",
"LINK_SUCCESS": "Issue collegata con successo",
"LINK_ERROR": "Si è verificato un errore durante il collegamento della issue, per favore riprova",
"LINK_TITLE": "Conversazione (#{conversationId}) con {name}"
},
"ADD_OR_LINK": {
"TITLE": "Crea/collega issue Linear",
"DESCRIPTION": "Creare issue Linear dalle conversazioni, o collega quelle esistenti per un monitoraggio costante.",
"FORM": {
"TITLE": {
"LABEL": "Titolo",
"PLACEHOLDER": "Inserisci titolo",
"REQUIRED_ERROR": "Titolo richiesto"
},
"DESCRIPTION": {
"LABEL": "Descrizione",
"PLACEHOLDER": "Inserisci descrizione"
},
"TEAM": {
"LABEL": "Team",
"PLACEHOLDER": "Seleziona team",
"SEARCH": "Cerca team",
"REQUIRED_ERROR": "Team richiesto"
},
"ASSIGNEE": {
"LABEL": "Assegnatario",
"PLACEHOLDER": "Seleziona assegnatario",
"SEARCH": "Cerca assegnatario"
},
"PRIORITY": {
"LABEL": "Priorità",
"PLACEHOLDER": "Seleziona priorità",
"SEARCH": "Cerca priorità"
},
"LABEL": {
"LABEL": "Etichetta",
"PLACEHOLDER": "Seleziona etichetta",
"SEARCH": "Cerca etichetta"
},
"STATUS": {
"LABEL": "Stato",
"PLACEHOLDER": "Seleziona stato",
"SEARCH": "Cerca stato"
},
"PROJECT": {
"LABEL": "Progetto",
"PLACEHOLDER": "Seleziona progetto",
"SEARCH": "Cerca progetto"
}
},
"CREATE": "Crea",
"CANCEL": "Annulla",
"CREATE_SUCCESS": "Issue creata con successo",
"CREATE_ERROR": "Si è verificato un errore durante la creazione della issue, per favore riprova",
"LOADING_TEAM_ERROR": "Si è verificato un errore nel caricamento dei team, riprova",
"LOADING_TEAM_ENTITIES_ERROR": "Si è verificato un errore nel caricamento delle entità dei team, riprova"
},
"ISSUE": {
"STATUS": "Stato",
"PRIORITY": "Priorità",
"ASSIGNEE": "Assegnatario",
"LABELS": "Etichette",
"CREATED_AT": "Creato {createdAt}"
},
"UNLINK": {
"TITLE": "Disconnetti",
"SUCCESS": "Issue scollegata con successo",
"ERROR": "Si è verificato un errore durante lo scollegamento della issue, riprova"
},
"NO_LINKED_ISSUES": "Nessuna issue collegata trovata",
"DELETE": {
"TITLE": "Sei sicuro di voler eliminare l'integrazione?",
"MESSAGE": "Sei sicuro di voler eliminare l'integrazione?",
"CONFIRM": "Sì, elimina",
"CANCEL": "Annulla"
},
"CTA": {
"TITLE": "Connetti a Linear",
"AGENT_DESCRIPTION": "Il workspace di Linear non è connesso. Richiedi all'amministratore di connettere un workspace per utilizzare questa integrazione.",
"DESCRIPTION": "Il workspace di Linear non è connesso. Fai clic sul pulsante qui sotto per collegare il workspace per utilizzare questa integrazione.",
"BUTTON_TEXT": "Connetti workspace Linear"
}
},
"NOTION": {
"DELETE": {
"TITLE": "Sei sicuro di voler eliminare l'integrazione di Notion?",
"MESSAGE": "L'eliminazione di questa integrazione rimuoverà l'accesso al tuo workspace Notion e interromperà tutte le funzionalità correlate.",
"CONFIRM": "Sì, elimina",
"CANCEL": "Annulla"
}
}
},
"CAPTAIN": {
"NAME": "Captain",
"HEADER_KNOW_MORE": "Scopri di più",
"ASSISTANT_SWITCHER": {
"ASSISTANTS": "Assistenti",
"SWITCH_ASSISTANT": "Cambia assistenti",
"NEW_ASSISTANT": "Crea Assistente",
"EMPTY_LIST": "No assistants found, please create one to get started"
},
"COPILOT": {
"TITLE": "Copilot",
"TRY_THESE_PROMPTS": "Prova questi prompt",
"PANEL_TITLE": "Inizia a usare Copilot",
"KICK_OFF_MESSAGE": "Hai bisogno di un riassunto rapido, vuoi controllare le conversazioni passate o vuoi scrivere risposte migliori? Copilot è qui per te.",
"SEND_MESSAGE": "Invia messaggio...",
"EMPTY_MESSAGE": "Si è verificato un errore durante la generazione della risposta. Riprova.",
"LOADER": "Captain sta pensando",
"YOU": "Tu",
"USE": "Usa questo",
"RESET": "Reset",
"SHOW_STEPS": "Mostra i passaggi",
"SELECT_ASSISTANT": "Seleziona Assistente",
"PROMPTS": {
"SUMMARIZE": {
"LABEL": "Riassumi questa conversazione",
"CONTENT": "Riassumi i punti chiave discussi tra il cliente e l'operatore, compresi i dubbi, le domande del cliente e le soluzioni o risposte fornite dall'operatore"
},
"SUGGEST": {
"LABEL": "Suggerisci una risposta",
"CONTENT": "Analizzare la richiesta del cliente e prepara una risposta che risponda efficacemente ai suoi dubbi o domande. Assicurati che la risposta sia chiara, concisa e fornisca informazioni utili."
},
"RATE": {
"LABEL": "Valuta questa conversazione",
"CONTENT": "Valuta la conversazione per vedere quanto soddisfa le esigenze del cliente. Dai una valutazione da 1 a 5 in base al tono, alla chiarezza e all'efficacia."
},
"HIGH_PRIORITY": {
"LABEL": "Conversazioni ad alta priorità",
"CONTENT": "Dammi un riassunto di tutte le conversazioni aperte ad alta priorità. Includi l'ID della conversazione, il nome del cliente (se disponibile), il contenuto dell'ultimo messaggio e l'operatore assegnato. Raggruppa per stato se pertinente."
},
"LIST_CONTACTS": {
"LABEL": "Elenca contatti",
"CONTENT": "Mostrami l'elenco dei primi 10 contatti. Includi nome, email o numero di telefono (se disponibile), orario di ultima lettura, tag (se presenti)."
}
}
},
"PLAYGROUND": {
"USER": "Tu",
"ASSISTANT": "Assistente",
"MESSAGE_PLACEHOLDER": "Scrivi il tuo messaggio...",
"HEADER": "Playground",
"DESCRIPTION": "Usa questo playground per inviare messaggi al tuo assistente e controllare se risponde correttamente, rapidamente e con il tono che ti aspetti.",
"CREDIT_NOTE": "I messaggi inviati qui vengono scalati dai crediti Captain."
},
"PAYWALL": {
"TITLE": "Aggiorna per usare Captain AI",
"AVAILABLE_ON": "Captain non è disponibile sul piano gratuito.",
"UPGRADE_PROMPT": "Aggiorna il tuo piano per ottenere l'accesso ai nostri assistenti, copilot e altro ancora.",
"UPGRADE_NOW": "Aggiorna ora",
"CANCEL_ANYTIME": "Puoi modificare o annullare il tuo piano in qualsiasi momento"
},
"ENTERPRISE_PAYWALL": {
"UPGRADE_PROMPT": "Aggiorna il tuo piano per ottenere l'accesso ai nostri assistenti, copilot e altro ancora.",
"ASK_ADMIN": "Contatta il tuo amministratore per l'aggiornamento."
},
"BANNER": {
"RESPONSES": "Hai usato oltre l'80% del tuo limite di risposte. Per continuare a utilizzare Captain AI, per favore aggiorna.",
"DOCUMENTS": "Raggiunto il limite di documenti. Aggiorna per continuare a usare Captain AI."
},
"FORM": {
"CANCEL": "Annulla",
"CREATE": "Crea",
"EDIT": "Aggiorna"
},
"ASSISTANTS": {
"HEADER": "Assistenti",
"NO_ASSISTANTS_AVAILABLE": "Non ci sono assistenti disponibili nel tuo account.",
"ADD_NEW": "Crea un nuovo assistente",
"DELETE": {
"TITLE": "Sei sicuro di voler eliminare l'assistente?",
"DESCRIPTION": "Questa azione è permanente. L'eliminazione di questo assistente la rimuoverà da tutte le inbox connesse e cancellerà definitivamente tutte le knowledge generate.",
"CONFIRM": "Sì, elimina",
"SUCCESS_MESSAGE": "L'assistente è stato eliminato con successo",
"ERROR_MESSAGE": "Si è verificato un errore durante l'eliminazione dell'assistente, riprova."
},
"FORM_DESCRIPTION": "Compila i dettagli qui sotto per dare un nome al tuo assistente, descriverne lo scopo e specificare il prodotto per cui offirà supporto.",
"CREATE": {
"TITLE": "Crea un assistente",
"SUCCESS_MESSAGE": "L'assistente è stato creato correttamente",
"ERROR_MESSAGE": "Si è verificato un errore durante la creazione dell'assistente, riprova."
},
"FORM": {
"UPDATE": "Aggiorna",
"SECTIONS": {
"BASIC_INFO": "Informazioni di Base",
"SYSTEM_MESSAGES": "System Messages",
"INSTRUCTIONS": "Istruzioni",
"FEATURES": "Funzionalità",
"TOOLS": "Strumenti "
},
"NAME": {
"LABEL": "Nome",
"PLACEHOLDER": "Inserisci il nome dell'assistente",
"ERROR": "Il nome è richiesto"
},
"TEMPERATURE": {
"LABEL": "Temperatura della Risposta",
"DESCRIPTION": "Regola quanto dovrebbero essere creative o restrittive le risposte dell'assistente. I valori più bassi producono risposte più mirate e deterministiche, mentre i valori più elevati consentono di ottenere risultati più creativi e variegati."
},
"DESCRIPTION": {
"LABEL": "Descrizione",
"PLACEHOLDER": "Inserisci la descrizione dell'assistente",
"ERROR": "La descrizione è richiesta"
},
"PRODUCT_NAME": {
"LABEL": "Nome Prodotto",
"PLACEHOLDER": "Inserisci il nome del prodotto",
"ERROR": "Il nome del prodotto è richiesto"
},
"WELCOME_MESSAGE": {
"LABEL": "Messaggio di Benvenuto",
"PLACEHOLDER": "Inserisci il messaggio di benvenuto"
},
"HANDOFF_MESSAGE": {
"LABEL": "Messaggio di Handoff",
"PLACEHOLDER": "Inserisci messaggio di handoff"
},
"RESOLUTION_MESSAGE": {
"LABEL": "Messaggio di Risoluzione",
"PLACEHOLDER": "Inserisci il messaggio di risoluzione"
},
"INSTRUCTIONS": {
"LABEL": "Istruzioni",
"PLACEHOLDER": "Inserisci le istruzioni per l'assistente"
},
"FEATURES": {
"TITLE": "Funzionalità",
"ALLOW_CONVERSATION_FAQS": "Genera FAQ dalle conversazioni risolte",
"ALLOW_MEMORIES": "Salva memorie e dettagli chiave dalle interazioni con i clienti.",
"ALLOW_CITATIONS": "Includi citazioni alle fonti nelle risposte"
}
},
"EDIT": {
"TITLE": "Aggiorna l'assistente",
"SUCCESS_MESSAGE": "L'assistente è stato aggiornato correttamente",
"ERROR_MESSAGE": "Si è verificato un errore durante l'aggiornamento dell'assistente, riprova.",
"NOT_FOUND": "Impossibile trovare l'assistente. Riprova."
},
"SETTINGS": {
"HEADER": "Impostazioni",
"BASIC_SETTINGS": {
"TITLE": "Impostazioni di base",
"DESCRIPTION": "Personalizza ciò che l'assistente dice quando termina una conversazione o la trasferisce a un umano."
},
"SYSTEM_SETTINGS": {
"TITLE": "Impostazioni di sistema",
"DESCRIPTION": "Personalizza ciò che l'assistente dice quando termina una conversazione o la trasferisce a un umano."
},
"CONTROL_ITEMS": {
"TITLE": "Impostazioni avanzate",
"DESCRIPTION": "Aggiungi maggiore controllo allassistente. (Funziona come un flusso: guardrails → scenari → output) Incoraggia a sfruttare al meglio queste impostazioni.",
"OPTIONS": {
"GUARDRAILS": {
"TITLE": "Guardrail",
"DESCRIPTION": "Mantieni lassistente concentrato: risponde solo ai tipi di domande che desideri, evitando argomenti fuori tema o non consentiti."
},
"RESPONSE_GUIDELINES": {
"TITLE": "Linee guida per le risposte",
"DESCRIPTION": "Imposta il tono e la struttura delle risposte del tuo assistente: chiare e amichevoli? Brevi e dirette? Dettagliate e formali?"
}
}
},
"DELETE": {
"TITLE": "Elimina Assistente",
"DESCRIPTION": "Questa azione è permanente. L'eliminazione di questo assistente la rimuoverà da tutte le inbox connesse e cancellerà definitivamente tutte le knowledge generate.",
"BUTTON_TEXT": "Elimina {assistantName}"
}
},
"OPTIONS": {
"EDIT_ASSISTANT": "Modifica Assistente",
"DELETE_ASSISTANT": "Elimina Assistente",
"VIEW_CONNECTED_INBOXES": "Visualizza inbox connesse"
},
"EMPTY_STATE": {
"TITLE": "Nessun assistente disponibile",
"SUBTITLE": "Crea un assistente per fornire risposte rapide e accurate agli utenti. Può imparare dagli articoli dell'Help Center e dalle conversazioni passate.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain Assistant",
"NOTE": "Captain Assistant interagisce direttamente con i clienti, impara dai documenti e dalle conversazioni passate e fornisce risposte rapide e accurate. Gestisce le richieste iniziali, fornendo risoluzioni rapide prima di trasferire ad un operatore quando necessario."
}
},
"GUARDRAILS": {
"TITLE": "Guardrail",
"DESCRIPTION": "Mantieni lassistente concentrato: risponde solo ai tipi di domande che desideri, evitando argomenti fuori tema o non consentiti.",
"BULK_ACTION": {
"SELECTED": "{count} elemento selezionato | {count} elementi selezionati",
"SELECT_ALL": "Seleziona tutto ({count})",
"UNSELECT_ALL": "Deseleziona tutto ({count})",
"BULK_DELETE_BUTTON": "Elimina"
},
"ADD": {
"SUGGESTED": {
"TITLE": "Guardrail di esempio",
"ADD": "Aggiungi tutto",
"ADD_SINGLE": "Aggiungi questo",
"SAVE": "Aggiungi e salva (↵)",
"PLACEHOLDER": "Digita un altro guardrail..."
},
"NEW": {
"TITLE": "Aggiungi un guardrail",
"CREATE": "Crea",
"CANCEL": "Annulla",
"PLACEHOLDER": "Digita un altro guardrail...",
"TEST_ALL": "Testa tutto"
}
},
"LIST": {
"SEARCH_PLACEHOLDER": "Cerca..."
},
"EMPTY_MESSAGE": "Nessun guardrail trovato. Crea o aggiungi esempi per iniziare.",
"SEARCH_EMPTY_MESSAGE": "Nessun guardrail trovato per questa ricerca.",
"API": {
"ADD": {
"SUCCESS": "Guardrail aggiunti correttamente",
"ERROR": "Si è verificato un errore nell'aggiunta di guardrail, riprova."
},
"UPDATE": {
"SUCCESS": "Guardrail aggiornati con successo",
"ERROR": "Si è verificato un errore durante l'aggiornamento dei guardrail, riprova."
},
"DELETE": {
"SUCCESS": "Guardrail eliminati con successo",
"ERROR": "Si è verificato un errore nell'eliminazione dei guardrail, riprova."
}
}
},
"RESPONSE_GUIDELINES": {
"TITLE": "Linee Guida per le Risposte",
"DESCRIPTION": "Imposta il tono e la struttura delle risposte del tuo assistente: chiare e amichevoli? Brevi e dirette? Dettagliate e formali?",
"BULK_ACTION": {
"SELECTED": "{count} elemento selezionato | {count} elementi selezionati",
"SELECT_ALL": "Seleziona tutto ({count})",
"UNSELECT_ALL": "Deseleziona tutto ({count})",
"BULK_DELETE_BUTTON": "Elimina"
},
"ADD": {
"SUGGESTED": {
"TITLE": "Esempio di Linee Guida per le Risposte",
"ADD": "Aggiungi tutto",
"ADD_SINGLE": "Aggiungi questo",
"SAVE": "Aggiungi e salva (↵)",
"PLACEHOLDER": "Digita un'altra linea guida di risposta..."
},
"NEW": {
"TITLE": "Aggiungi una linea guida per le risposte",
"CREATE": "Crea",
"CANCEL": "Annulla",
"PLACEHOLDER": "Digita un'altra linea guida di risposta...",
"TEST_ALL": "Testa tutto"
}
},
"LIST": {
"SEARCH_PLACEHOLDER": "Cerca..."
},
"EMPTY_MESSAGE": "Nessuna linea guida per le risposte trovata. Crea o aggiungi esempi per iniziare.",
"SEARCH_EMPTY_MESSAGE": "Nessuna linea guida per le risposte trovata per questa ricerca.",
"API": {
"ADD": {
"SUCCESS": "Linee guida per le risposte aggiunte correttamente",
"ERROR": "Si è verificato un errore nell'aggiunta delle linee guida, riprova."
},
"UPDATE": {
"SUCCESS": "Linee guida aggiornate correttamente",
"ERROR": "Si è verificato un errore durante l'aggiornamento delle linee guida, riprova."
},
"DELETE": {
"SUCCESS": "Linee guida eliminate correttamente",
"ERROR": "Si è verificato un errore durante l'eliminazione delle linee guida, riprova."
}
}
},
"SCENARIOS": {
"TITLE": "Scenari",
"DESCRIPTION": "Fornisci contesto aggiuntivo al tuo assistente, ad esempio “cosa fare quando un utente è bloccato” o “come comportarsi durante una richiesta di rimborso”.",
"BULK_ACTION": {
"SELECTED": "{count} elemento selezionato | {count} elementi selezionati",
"SELECT_ALL": "Seleziona tutto ({count})",
"UNSELECT_ALL": "Deseleziona tutto ({count})",
"BULK_DELETE_BUTTON": "Elimina"
},
"ADD": {
"SUGGESTED": {
"TITLE": "Scenari di esempio",
"ADD": "Aggiungi tutto",
"ADD_SINGLE": "Aggiungi questo",
"TOOLS_USED": "Strumenti utilizzati:"
},
"NEW": {
"CREATE": "Aggiungi uno scenario",
"TITLE": "Crea uno scenario",
"FORM": {
"TITLE": {
"LABEL": "Titolo",
"PLACEHOLDER": "Inserisci un nome per lo scenario",
"ERROR": "Nome dello scenario richiesto"
},
"DESCRIPTION": {
"LABEL": "Descrizione",
"PLACEHOLDER": "Descrivi come e dove questo scenario verrà utilizzato",
"ERROR": "Descrizione dello scenario richiesta"
},
"INSTRUCTION": {
"LABEL": "Come gestire",
"PLACEHOLDER": "Descrivere come e dove sarà gestito questo scenario",
"ERROR": "Il contenuto dello scenario è richiesto"
},
"CREATE": "Crea",
"CANCEL": "Annulla"
}
}
},
"UPDATE": {
"CANCEL": "Annulla",
"UPDATE": "Aggiorna le modifiche"
},
"LIST": {
"SEARCH_PLACEHOLDER": "Cerca..."
},
"EMPTY_MESSAGE": "Nessun scenario trovato. Crea o aggiungi esempi per iniziare.",
"SEARCH_EMPTY_MESSAGE": "Nessun scenario trovato per questa ricerca.",
"API": {
"ADD": {
"SUCCESS": "Scenari aggiunti correttamente",
"ERROR": "Si è verificato un errore durante l'aggiunta degli scenari, riprova."
},
"UPDATE": {
"SUCCESS": "Scenari aggiornati correttamente",
"ERROR": "Si è verificato un errore durante l'aggiornamento degli scenari, riprova."
},
"DELETE": {
"SUCCESS": "Scenari eliminati correttamente",
"ERROR": "Si è verificato un errore durante l'eliminazione degli scenari, riprova."
}
}
}
},
"DOCUMENTS": {
"HEADER": "Documenti",
"ADD_NEW": "Crea un nuovo documento",
"RELATED_RESPONSES": {
"TITLE": "FAQ Correlate",
"DESCRIPTION": "Queste FAQ vengono generate direttamente dai Documenti."
},
"FORM_DESCRIPTION": "Inserisci l'URL del documento per aggiungerlo come fonte e scegli l'assistente con cui associarlo.",
"CREATE": {
"TITLE": "Aggiungi un documento",
"SUCCESS_MESSAGE": "Il documento è stato creato correttamente",
"ERROR_MESSAGE": "Si è verificato un errore durante la creazione del documento, riprova."
},
"FORM": {
"TYPE": {
"LABEL": "Tipo di Documento",
"URL": "URL",
"PDF": "File PDF"
},
"URL": {
"LABEL": "URL",
"PLACEHOLDER": "Inserisci l'URL del documento",
"ERROR": "Inserisci un URL valido per il documento"
},
"PDF_FILE": {
"LABEL": "File PDF",
"CHOOSE_FILE": "Seleziona file PDF",
"ERROR": "Seleziona un file PDF",
"HELP_TEXT": "Dimensione massima del file: 10MB",
"INVALID_TYPE": "Seleziona un file PDF valido",
"TOO_LARGE": "La dimensione del file supera il limite di 10MB"
},
"NAME": {
"LABEL": "Nome Documento (Opzionale)",
"PLACEHOLDER": "Inserisci un nome per il documento"
}
},
"DELETE": {
"TITLE": "Sei sicuro di voler eliminare il documento?",
"DESCRIPTION": "Questa azione è permanente. L'eliminazione di questo documento cancellerà definitivamente tutte le conoscenze generate.",
"CONFIRM": "Sì, elimina",
"SUCCESS_MESSAGE": "Il documento è stato eliminato con successo",
"ERROR_MESSAGE": "Si è verificato un errore durante l'eliminazione del documento, riprova."
},
"OPTIONS": {
"VIEW_RELATED_RESPONSES": "Visualizza FAQ Correlate",
"DELETE_DOCUMENT": "Elimina Documento"
},
"EMPTY_STATE": {
"TITLE": "Nessun documento disponibile",
"SUBTITLE": "I documenti sono utilizzati dal tuo assistente per generare FAQ. Puoi importare documenti per fornire contesto al tuo assistente.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Documento Captain",
"NOTE": "Un documento in Captain serve come risorsa di knowledge base per l'assistente. Collegando documenti help center e guide, Captain può analizzare il contenuto e fornire risposte accurate per le richieste dei clienti."
}
}
},
"CUSTOM_TOOLS": {
"HEADER": "Strumenti",
"ADD_NEW": "Crea un nuovo strumento",
"EMPTY_STATE": {
"TITLE": "Nessuno strumento personalizzato disponibile",
"SUBTITLE": "Crea strumenti personalizzati per collegare il tuo assistente con API e servizi esterni, consentendogli di recuperare dati ed eseguire azioni per tuo conto.",
"FEATURE_SPOTLIGHT": {
"TITLE": "Strumenti Personalizzati",
"NOTE": "Gli strumenti personalizzati consentono all'assistente di interagire con API e servizi esterni. Crea strumenti per recuperare dati, eseguire azioni o integrare con i sistemi esistenti per migliorare le capacità del tuo assistente."
}
},
"FORM_DESCRIPTION": "Configura il tuo strumento personalizzato per connetterti con API esterne",
"OPTIONS": {
"EDIT_TOOL": "Modifica strumento",
"DELETE_TOOL": "Elimina strumento"
},
"CREATE": {
"TITLE": "Crea Strumento Personalizzato",
"SUCCESS_MESSAGE": "Strumento personalizzato creato correttamente",
"ERROR_MESSAGE": "Impossibile creare uno strumento personalizzato"
},
"EDIT": {
"TITLE": "Modifica Strumento Personalizzato",
"SUCCESS_MESSAGE": "Strumento personalizzato aggiornato correttamente",
"ERROR_MESSAGE": "Impossibile aggiornare strumento personalizzato"
},
"DELETE": {
"TITLE": "Elimina Strumento Personalizzato",
"DESCRIPTION": "Sei sicuro di voler eliminare questo strumento personalizzato? Questa azione non può essere annullata.",
"CONFIRM": "Sì, elimina",
"SUCCESS_MESSAGE": "Strumento personalizzato eliminato correttamente",
"ERROR_MESSAGE": "Impossibile eliminare lo strumento personalizzato"
},
"FORM": {
"TITLE": {
"LABEL": "Nome Strumento",
"PLACEHOLDER": "Ricerca Ordini",
"ERROR": "Nome strumento richiesto"
},
"DESCRIPTION": {
"LABEL": "Descrizione",
"PLACEHOLDER": "Cerca i dettagli di un ordine tramite l'ID ordine"
},
"HTTP_METHOD": {
"LABEL": "Metodo"
},
"ENDPOINT_URL": {
"LABEL": "Endpoint URL",
"PLACEHOLDER": "https://api.example.com/orders/{'{{'} order_id {'}}'}",
"ERROR": "È richiesto un URL valido"
},
"AUTH_TYPE": {
"LABEL": "Tipo di Autenticazione"
},
"AUTH_TYPES": {
"NONE": "Nessuno",
"BEARER": "Bearer Token",
"BASIC": "Autenticazione Base",
"API_KEY": "Chiave API"
},
"AUTH_CONFIG": {
"BEARER_TOKEN": "Bearer Token",
"BEARER_TOKEN_PLACEHOLDER": "Inserisci il tuo Bearer Token",
"USERNAME": "Nome Utente",
"USERNAME_PLACEHOLDER": "Inserisci il nome utente",
"PASSWORD": "Password",
"PASSWORD_PLACEHOLDER": "Inserire la password",
"API_KEY": "Nome Header",
"API_KEY_PLACEHOLDER": "X-API-Key",
"API_VALUE": "Valore Header",
"API_VALUE_PLACEHOLDER": "Inserisci valore chiave API"
},
"PARAMETERS": {
"LABEL": "Parametri",
"HELP_TEXT": "Definisci i parametri che verranno estratti dalle query utente"
},
"ADD_PARAMETER": "Aggiungi Parametro",
"PARAM_NAME": {
"PLACEHOLDER": "Nome del parametro (es. order_id)"
},
"PARAM_TYPE": {
"PLACEHOLDER": "Tipo"
},
"PARAM_TYPES": {
"STRING": "Stringa",
"NUMBER": "Numero",
"BOOLEAN": "Boolean",
"ARRAY": "Array",
"OBJECT": "Oggetto"
},
"PARAM_DESCRIPTION": {
"PLACEHOLDER": "Descrizione del parametro"
},
"PARAM_REQUIRED": {
"LABEL": "Richiesto"
},
"REQUEST_TEMPLATE": {
"LABEL": "Request Body Template (Opzionale)",
"PLACEHOLDER": "{'{'}\n \"order_id\": \"{'{{'} order_id {'}}'}\"\n{'}'}"
},
"RESPONSE_TEMPLATE": {
"LABEL": "Response Template (Opzionale)",
"PLACEHOLDER": "Order {'{{'} order_id {'}}'} status: {'{{'} status {'}}'}"
},
"ERRORS": {
"PARAM_NAME_REQUIRED": "Nome del parametro richiesto"
}
}
},
"RESPONSES": {
"HEADER": "FAQ",
"PENDING_FAQS": "FAQ In Attesa",
"ADD_NEW": "Crea nuova FAQ",
"DOCUMENTABLE": {
"CONVERSATION": "Conversazione #{id}"
},
"SELECTED": "{count} selezionate",
"SELECT_ALL": "Seleziona tutto ({count})",
"UNSELECT_ALL": "Deseleziona tutto ({count})",
"SEARCH_PLACEHOLDER": "Cerca FAQ...",
"BULK_APPROVE_BUTTON": "Approva",
"BULK_DELETE_BUTTON": "Elimina",
"BULK_APPROVE": {
"SUCCESS_MESSAGE": "FAQ approvate con successo",
"ERROR_MESSAGE": "Si è verificato un errore nell'approvazione delle FAQ, riprova."
},
"BULK_DELETE": {
"TITLE": "Eliminare FAQ?",
"DESCRIPTION": "Sei sicuro di voler eliminare le FAQ selezionate? Questa azione non può essere annullata.",
"CONFIRM": "Sì, elimina tutte",
"SUCCESS_MESSAGE": "FAQ eliminate con successo",
"ERROR_MESSAGE": "Si è verificato un errore durante l'eliminazione delle FAQ, riprova."
},
"DELETE": {
"TITLE": "Sei sicuro di voler eliminare la FAQ?",
"DESCRIPTION": "",
"CONFIRM": "Sì, elimina",
"SUCCESS_MESSAGE": "FAQ eliminata con successo",
"ERROR_MESSAGE": "Si è verificato un errore durante l'eliminazione della FAQ, riprova."
},
"FILTER": {
"ASSISTANT": "Assistente: {selected}",
"STATUS": "Stato: {selected}",
"ALL_ASSISTANTS": "Tutti"
},
"STATUS": {
"TITLE": "Stato",
"PENDING": "In Sospeso",
"APPROVED": "Approvate",
"ALL": "Tutte"
},
"PENDING_BANNER": {
"TITLE": "Captain ha trovato delle FAQ tra le domande dei tuoi clienti.",
"ACTION": "Clicca qui per rivedere"
},
"FORM_DESCRIPTION": "Aggiungi una domanda e la sua risposta corrispondente alla knowledge base e seleziona l'assistente con cui dovrebbe essere associata.",
"CREATE": {
"TITLE": "Aggiungi una FAQ",
"SUCCESS_MESSAGE": "La risposta è stata aggiunta con successo.",
"ERROR_MESSAGE": "Si è verificato un errore durante l'aggiunta della risposta. Riprova."
},
"FORM": {
"QUESTION": {
"LABEL": "Domanda",
"PLACEHOLDER": "Inserisci qui la domanda",
"ERROR": "Inserisci una domanda valida."
},
"ANSWER": {
"LABEL": "Risposta",
"PLACEHOLDER": "Inserisci qui la risposta",
"ERROR": "Inserisci una risposta valida."
}
},
"EDIT": {
"TITLE": "Aggiorna FAQ",
"SUCCESS_MESSAGE": "Le FAQ sono state aggiornate correttamente",
"ERROR_MESSAGE": "Si è verificato un errore durante l'aggiornamento delle FAQ, riprova",
"APPROVE_SUCCESS_MESSAGE": "La FAQ è stata contrassegnata come approvata"
},
"OPTIONS": {
"APPROVE": "Approva",
"EDIT_RESPONSE": "Modifica",
"DELETE_RESPONSE": "Elimina"
},
"EMPTY_STATE": {
"TITLE": "Nessuna FAQ Trovata",
"NO_PENDING_TITLE": "Non ci sono più FAQ in attesa da rivedere",
"SUBTITLE": "Le FAQ aiutano il tuo assistente a fornire risposte rapide e accurate alle domande dei tuoi clienti. Possono essere generate automaticamente dai tuoi contenuti o possono essere aggiunte manualmente.",
"CLEAR_SEARCH": "Rimuovi filtri attivi",
"FEATURE_SPOTLIGHT": {
"TITLE": "Captain FAQ",
"NOTE": "Captain FAQ rileva le domande più frequenti dei clienti, anche se mancano dalla tua knowledge base, e suggerisce delle FAQ per migliorare il supporto. È possibile rivedere ogni suggerimento e decidere se approvarlo o rifiutarlo."
}
}
},
"INBOXES": {
"HEADER": "Inbox Connesse",
"ADD_NEW": "Collega una nuova inbox",
"OPTIONS": {
"DISCONNECT": "Disconnetti"
},
"DELETE": {
"TITLE": "Sei sicuro di voler disconnettere la inbox?",
"DESCRIPTION": "",
"CONFIRM": "Sì, elimina",
"SUCCESS_MESSAGE": "Inbox disconnessa con successo.",
"ERROR_MESSAGE": "Si è verificato un errore durante la disconnessione della inbox, riprova."
},
"FORM_DESCRIPTION": "Scegli una inbox da connettere all'assistente.",
"CREATE": {
"TITLE": "Connetti una Inbox",
"SUCCESS_MESSAGE": "Inbox connessa con successo.",
"ERROR_MESSAGE": "Si è verificato un errore durante la connessione della inbox. Riprova."
},
"FORM": {
"INBOX": {
"LABEL": "Inbox",
"PLACEHOLDER": "Scegli la inbox in cui deployare l'assistente.",
"ERROR": "È richiesta una inbox."
}
},
"EMPTY_STATE": {
"TITLE": "Nessuna Inbox Connessa",
"SUBTITLE": "Connettendo una inbox, l'assistente potrà gestire le richieste iniziali dei clienti, ed eventualmente trasferirle a voi."
}
}
}
}