125 Commits

Author SHA1 Message Date
Abhinav Raut f6ba29127a fix widget messages vanishing when upload takes over 10 seconds 2026-08-22 11:59:29 +05:30
Abhinav Raut 6ee25df742 show the visitor label on the widget messages tab
The new-conversation button always read the users label, so a visitor saw
the text meant for logged-in contacts. Pick visitors or users the same way
the home screen does. Adds tests for this and for the allow-plus-prevent
combination on the messages tab, both checked against the old code first.
2026-08-21 23:45:08 +05:30
Abhinav Raut 19146541e4 use the country code label and gate the conversations list button too
The country-code length error borrowed the phone number label, so a
too-long country code read as a phone number limit. Adds a countryCode
term for it. ConversationsView also offered the new-conversation button
when prevent_multiple_conversations was set, without checking whether
visitors may start one at all, so it now follows the same rule as the
home screen and the server.
2026-08-21 23:26:40 +05:30
Abhinav Raut a6e7812c68 name the field in pre-chat length errors and hide the start button when blocked
An over-long pre-chat value came back as "Must be at most 128 characters"
with no clue which field it was about, so use the existing fieldTooLong
message. The home screen also offered the start button when the inbox says
visitors cannot start conversations, and the visitor only found out when
the send failed, so the button now follows the same rule as the server.

Adds a browser-level livechat suite that embeds the widget on a host page
the way a customer site does, drives the real widget UI, and covers every
livechat config option that has a visible effect. CI needs the widget rate
limit lifted because the suite makes more than 100 widget requests a minute.
2026-08-21 23:14:34 +05:30
Abhinav Raut 4ddec80ff2 ignore frames from a replaced widget socket
handleMessage had no stale socket guard, so a socket we already threw
away could still push messages into the chat store. Also only call the
HTTP shutdown a drain timeout when the error is context.DeadlineExceeded,
everything else is a plain shutdown error. Adds unit tests for the
socket guards.
2026-08-21 20:27:33 +05:30
Abhinav Raut e324e136f5 drop widget sockets when a livechat inbox reloads
Saving, enabling or disabling a livechat inbox rebuilds the channel,
which calls LiveChat.Close. That only closed each client's outbound
channel. The socket stayed open, so the widget kept exchanging
ping/pong and looked connected while every later agent reply went
nowhere. Only a page reload fixed it.

Calling conn.Close was not enough either. fasthttp makes Close a no-op
on a hijacked conn unless KeepHijackedConns is set, so it returned nil
and the read loop stayed blocked. Client now holds a disconnect func
that expires the read deadline, and the read loop also breaks if its
client was closed.

On the widget side, connect() replaced this.socket without closing the
old one, so a reconnect could leave two live sockets. It now closes the
previous socket and ignores events from it.

Also return input errors from the pre-chat form validation. A blank
required field used to come back as a 500 with no hint about which
field was wrong.

Adds a livechat e2e harness in cypress/support/livechat.js and four
specs: the inbox reload regression, messaging, session and auth, and
settings. 26 tests, and the reload one fails against a binary without
this fix.
2026-08-21 20:11:24 +05:30
Abhinav Raut c865748ca5 switch to Geist and cache help center pages
Geist replaces Instrument Sans and is served from static/ instead of Google
Fonts, so it works on installs with no internet access.

Public help center pages are cached in Redis via fastcache with ETags, and any
admin write clears the group so edits show up on the next load.
2026-08-20 18:01:42 +05:30
Abhinav Raut cf14aa60c5 add remaining form schema tests and document findings 2026-08-19 03:30:02 +05:30
Abhinav Raut 6f2f046910 Merge remote-tracking branch 'origin/main' into help-center 2026-08-08 00:01:50 +05:30
chahat-101 d180bfbedc Merge remote-tracking branch 'upstream/main' into network-status-banner 2026-08-07 20:57:38 +05:30
Abhinav Raut 6aa221a4fc merge origin/main into help-center
Resolved the AI embedding conflicts by keeping this branch's generic embedSource path and layering main's tag indexing on top. Search now covers snippets and help articles, tags stay excluded. Dropped SetContentID since main's link-message-media query stamps content_id itself.
2026-08-01 11:47:59 +05:30
Abhinav Raut 7b69690394 add SEO, localization, and drag reordering to the help center
Public pages were missing most of what a search engine needs. They now serve
a sitemap index at /sitemap.xml plus a robots.txt, and every page carries a
canonical URL, hreflang alternates, an x-default, and JSON-LD. Article pages
also send published and modified times. Search pages and the markdown view
are marked noindex. Requests from bots no longer bump the view counters, so
the insights numbers reflect real readers. Offscreen images in articles are
lazy loaded.

Public page text is now translated per locale instead of always using the
desk language, and pages with more than one translation show a language
switcher.

In the admin, collections and articles can be dragged to reorder, and an
article can be dragged into a different collection. Both save through new
sort order endpoints. Collections can have a lucide icon, picked from a new
icon picker backed by a sprite sheet. The landing page has layout options
for card grid or one per row, cards per row, and which details to show.

The help center list is a data table now, so HelpCenterCard is gone. The
tree page moved into AdminSplitLayout, its actions sit on their own row
below the breadcrumb, and it gained visit site and expand/collapse all.
2026-08-01 10:32:52 +05:30
Abhinav Raut 79da9e8988 Fix live chat image thumbnails 2026-07-31 01:05:32 +05:30
Abhinav Raut 276f19de0a show enabled state as a status badge and stop making checkbox fields required 2026-07-30 00:25:56 +05:30
chahat-101 ee45e87d6b show connection status banner to agents 2026-07-26 00:37:52 +05:30
Abhinav Raut d8b73c5877 retheme UI to the green palette and fix form and search bugs
Colors: the brand color moves from indigo to green in both themes, and the
sidebar, tooltip, card and link styles follow it. Three new tokens replace
hardcoded values: foreground-lighter for idle sidebar items, warning-600 for
warning text that needs 4.5:1 contrast on light backgrounds, and link for
anchors inside rendered email content. DESIGN_SYSTEM.md now lists the real
values from main.scss instead of the old indigo ones.

Forms: every button inside a form that is not the submit button now has an
explicit type. Without it the browser treats it as a submit button, so
clicking Cancel on a contact note posted an empty note, "New holiday" saved
the whole business-hours form, and pressing Enter in an SLA field deleted the
first alert row. The login page also highlights an empty password field on a
failed submit, which a broken condition prevented before, and the two
password fields on the set-password page get their own show and hide toggles.

Search: conversation and contact search now drop responses from an older
query, so clearing the box no longer repopulates the list with stale results.

Permissions: /api/v1/ai/summarize now needs messages:write, since it writes a
private note, and the menu item is hidden for agents without it.
2026-07-25 00:49:26 +05:30
Abhinav Raut b8b2b6c9af standardize frontend design system, fix form validation, and skip continuity/CSAT messages in AI context
Design system:
- add semantic success and warning tokens (light + dark) and wire them into Tailwind
- move all hardcoded status colors (green/amber/red) onto tokens across main app and widget; keep file-type icons as identity colors
- give light mode real surface depth: gray chrome sidebars vs white content, deeper canvas gutter, crisper borders, wider gray spread so selected/hover states show
- unify radius (cards rounded-lg, controls rounded-md) and elevation (card shadow-sm, menu shadow-md)
- make reports overview colors uniform: neutral numbers, green met / red breached
- normalize the two page-title heading outliers to text-xl font-semibold

Form fixes:
- require content on AI snippets
- only include non-checkbox prechat fields when they have a value

AI context:
- skip continuity and CSAT messages in AI history, mining, and previous-conversation tools
2026-07-23 03:37:33 +05:30
Abhinav Raut cf629f34d7 only include checked checkbox fields in prechat form submission 2026-07-22 01:31:37 +05:30
Abhinav Raut ae44e7f4db expand AI tool context and let contacts correct their email
Custom HTTP tools now get more identity context. Each call sends the
contact id, contact type, conversation UUID, and inbox id as headers,
and the contact email is read live per call instead of snapshotting it
at run start.

set_contact_email is no longer blocked once an email is known. A
customer who gives a different email (for example after their account
could not be found) can now correct it. Changing the email clears the
verification flag and any pending code first, so a failed clear can
never leave the conversation verified against an unproven address. The
prompt and tool descriptions were updated to guide this flow.

Also fixes some widget and admin UI issues: prechat form validation
now handles required numbers, checkboxes, and links correctly; tool
header rows keep stable keys so removing a row does not shuffle inputs;
the verification toggle uses form state directly; and the livechat
inbox form shows the inbox UUID with a copy button.
2026-07-22 00:58:41 +05:30
Abhinav Raut dd3465f6bc make the quoted text toggle keyboard accessible 2026-07-19 18:58:36 +05:30
Abhinav Raut b570502a20 remember when a provider needs max_completion_tokens and track token usage
Some OpenAI-compatible endpoints reject max_tokens and want
max_completion_tokens. Before, every request paid a 400 round trip to
learn this. Now we cache the swap per base URL and model, so once one
request adapts, later requests send the right param up front. Only adapt
when the error code is unsupported_parameter, not on any max_tokens error.

Parse the usage block from provider responses into a TokenUsage struct and
log prompt/completion/total tokens. Added debug logging of model content,
tool results, and RAG chunk text to make agent runs easier to trace.

Widget side: clean up chat bubble spacing by moving margins off the text
and onto trailing elements, and drop the bottom margin on the last
paragraph/list in rendered HTML so bubbles don't have extra padding.
2026-07-19 18:47:36 +05:30
Abhinav Raut 34241f7d67 improve AI agent context and disclosure
Pass the conversation subject to the AI agent, show the AI's own expectation in the chat widget while it handles a chat, and label AI messages in continuity emails.
2026-07-12 16:34:36 +05:30
Abhinav Raut a7288e11b0 add AI assistant expectation message shown in the livechat widget 2026-07-12 13:29:59 +05:30
Abhinav Raut 6cb8bceeb9 prefill country code for optional phone fields too in pre-chat form 2026-07-10 01:21:27 +05:30
Abhinav Raut 9c6a6c254d fix widget draft attachments, prechat phone default, and shadow tweaks
Draft attachments now keep url and disposition, so a restored draft can render its attachments correctly instead of losing them.

The prechat phone field now picks a country code from the browser locale when the field is required (falling back to US), so users are not forced to pick one manually. Non-required phone fields still start blank.

Also soften the widget iframe and launcher bubble box shadows to a lighter, tinted look.
2026-07-10 01:09:09 +05:30
Abhinav Raut 8a8d372a70 use one phone field in livechat JWT and fix phone validation 2026-07-09 02:27:08 +05:30
Abhinav Raut 8f658f274d add livechat pre-chat phone field and fix default launcher logo 2026-07-09 01:49:38 +05:30
Abhinav Raut 3bf95aeac1 add novalidate to remaining vee-validate forms 2026-07-08 01:44:29 +05:30
Abhinav Raut cb081b4b38 update font family to Instrument Sans 2026-06-06 19:58:07 +05:30
Abhinav Raut 870f66c229 fix: sanitize invalid UTF-8 in incoming email, fix widget scroll flicker 2026-05-29 21:00:48 +05:30
Abhinav Raut 9159c26d5f fix: clean up widget ws state on close and announce banner to screen readers 2026-05-28 20:40:54 +05:30
Abhinav Raut 8faf06ed99 fix: reliably sync widget missed messages on reconnect
Update connection status banner to show more intermediate connection statuses like connecting.. and connected.
2026-05-27 19:05:01 +05:30
Abhinav Raut e5ffe11394 Fix edge cases in auto scrolling behavior.
Extract sticky scroller to a composable for main & widget apps.
2026-05-26 02:18:48 +05:30
Abhinav Raut 7a8efcde16 fix: widget ping interval, last_active flush, ws ping error, slim new_message payload 2026-05-21 00:13:33 +05:30
Abhinav Raut 43ebed1c3a WS rewrite: per-client subscriptions and perf improvements
Targets broadcasts via per-tab list and open subs (validated at subscribe time)
instead of broadcasting message uuid to all agents. Adds frontend list typing, throttled sound,
and many perf improvements to reduce cpu memory & database queries.
Other fixes: Enforce message-to-conversation binding in handleGetMessage
2026-05-20 23:42:07 +05:30
Abhinav Raut c85cb90bef Merge pull request #317 from jleroy/i18n/update-2026-05-15
Update translations [2026-05-15] and add regions names in languages filenames
2026-05-18 15:24:43 +05:30
Jonathan Leroy d482267ed9 Make browser language detection keep the full locale, including
region code
2026-05-18 02:57:32 +02:00
Abhinav Raut bae4c23b01 hide outlook/hotmail quoted text correctly and fix html email whitespace 2026-05-18 00:30:13 +05:30
Abhinav Raut e048ba5716 improve conversation thread and inbox list ux
Add expand button for long message bubbles, group consecutive same-sender
messages within a minute, and fix the conversation list highlight contrast
(Fixes #321). Also bumps vue-letter to 0.2.1 to allow CSS transforms in email content
2026-05-17 22:54:05 +05:30
Jonathan Leroy 64ccdeae6b Set frontend default locales to "en-US" 2026-05-15 09:18:57 +02:00
Abhinav Raut 9c2483a7c0 Harden attachment paths: drop PDF iframe, noopener/noreferrer everywhere, rename components so they don't confuse me anymore. 2026-05-14 17:06:35 +05:30
Abhinav Raut be7369d64f Update widget unread count style 2026-04-25 12:36:59 +05:30
Abhinav Raut ea4f8d75d3 cap unread message count badge at 9+ since backend caps at 10 2026-04-25 12:30:08 +05:30
Abhinav Raut 189162b61f Clear typing indicator when switching conversations 2026-04-17 00:06:13 +05:30
Abhinav Raut 286d409a74 Cap lengths on JWT/form name/email and restrict JWT user_id to contact or visitor 2026-04-16 03:27:50 +05:30
Abhinav Raut 6ef17eeae6 Make widget /auth/exchange idempotent
Prevent tokens sent twice from widget.js, send only once.
Update doc strings & comments for clarity.
Fix error handling
2026-04-16 01:16:24 +05:30
Abhinav Raut aceecd99b3 Lazy-load emoji picker swap to lighter lib later 2026-04-15 20:50:26 +05:30
Abhinav Raut 300e9b1238 Drop widget secondary color and auto-derive primary foreground for text selection. 2026-04-15 20:17:56 +05:30
Abhinav Raut c61073750e Centralize widget 401 handling in axios response interceptor, clear session and visitor cookies on expiry 2026-04-15 01:10:04 +05:30
Abhinav Raut 508e0a4196 Fix missing border for single conversation in widget 2026-04-14 02:57:40 +05:30