v1.2.1
- Generic AI integration (Admin > Integracje > "Integracja AI"), optional and off by default: an OpenAI-compatible /chat/completions client (Groq, OpenAI, or a self-hosted Ollama instance) configured by base URL, optional API key, model, and an SSL-verification toggle. Foundation for the two AI features below and anything else that wants an LLM call in the future. - BookStack automatic content tagging (AI): "Otaguj nową treść"/"Otaguj wszystko ponownie" buttons plus `php artisan bookstack:tag-content` (--dry-run/--force/--limit=N) tag every book/chapter/page with matching helpdesk subcategory names, idempotent by default. - BookStack search refinement: "Przeszukuj" is now three independent checkboxes (Książki/Strony/Rozdziały) instead of a single dropdown, plus a new "Szukaj po" setting (nazwa/tagi/oba) — tag matching uses the bare subcategory name, matching what auto-tagging writes. - AI-driven ticket triage + summary (Admin > Integracje > "Automatyzacja AI dla zgłoszeń", via new scheduled ai:run-ticket-automation): five toggles auto-assign/correct category+subcategory, rewrite an unclear subject, and set priority from content, once per ticket in the background; every change is logged in the ticket's history. Separately, an AI summary + suggested action for every ticket, shown to operators only, with an admin-editable prompt. - Operators can now reassign a ticket to any team, not just one they belong to. - The auto-refresh countdown badges (ticket view, operator queue) are now clickable — fetch immediately and reset the countdown. - All 7 "cyclical" intervals (3 browser refresh countdowns, the notification bell poll, and the 4 background scheduled commands) are now configurable from Admin > Konfiguracja instead of fixed in code. - Fixed: an operator viewing a ticket that's deleted or moved outside their team scope mid-session is now redirected to the operator queue instead of hitting an error. - Docs: README/ARCHITECTURE/CLAUDE/install/wiki updated for all of the above. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
46
README.md
46
README.md
@@ -40,13 +40,17 @@ and **[wiki/admin](wiki/admin/README.md)** for role-specific how-to guides.
|
||||
(operator and client) update live over WebSockets (Laravel Reverb): new
|
||||
tickets, status/priority/team/assignee changes, and new replies ("live chat")
|
||||
all show up without a manual refresh. A periodic fallback refresh (with a
|
||||
visible countdown) covers a dropped websocket connection.
|
||||
visible, clickable countdown badge — click it to fetch immediately and reset
|
||||
the countdown) covers a dropped websocket connection. All of the refresh/poll
|
||||
intervals in the app, browser-side and the background scheduled commands
|
||||
alike, are configurable from Admin > Konfiguracja (see below).
|
||||
- **Categories & custom fields** — admin-defined categories/subcategories, each with
|
||||
its own set of custom fields (text/textarea/select/checkbox/date/number) and an
|
||||
optional default priority.
|
||||
- **Teams** — subcategories auto-route to a team; operators only see their own
|
||||
team's queue (plus unrouted tickets and anything assigned to them) unless they're
|
||||
an admin.
|
||||
an admin. Reassigning a ticket to a team, though, is unrestricted — an operator
|
||||
can route a ticket to any team, not just one they belong to.
|
||||
- **Templates** — canned response snippets for the reply box, admin-configurable
|
||||
"quick actions" (send + transition status in one click), and HTML e-mail
|
||||
templates for every ticket lifecycle event (created, status/priority/category/
|
||||
@@ -133,10 +137,33 @@ and **[wiki/admin](wiki/admin/README.md)** for role-specific how-to guides.
|
||||
both operators and clients (with a copy-link button for operators). Loads in
|
||||
after the page's first paint rather than blocking it. Configured entirely
|
||||
from Admin > Integracje: connection + API token, optional SSL-verification
|
||||
bypass for self-signed instances, page/book search-type filter, and two
|
||||
independent per-shelf allow-lists (nothing is searched until an admin opts
|
||||
specific shelves in, separately for ticket-creation suggestions vs. the
|
||||
operator/client ticket-view sidebar).
|
||||
bypass for self-signed instances, a content-type filter (books/pages/
|
||||
chapters, independently toggleable) and a "search by" mode (name / tags /
|
||||
both), and two independent per-shelf allow-lists (nothing is searched until
|
||||
an admin opts specific shelves in, separately for ticket-creation
|
||||
suggestions vs. the operator/client ticket-view sidebar). A pair of
|
||||
"Otaguj nową treść"/"Otaguj wszystko ponownie" buttons (also available as
|
||||
`php artisan bookstack:tag-content`) use the AI integration below to
|
||||
auto-tag every book/chapter/page with matching subcategory names, so the
|
||||
tag-based search mode has something to find.
|
||||
- **Generic AI integration** (Admin > Integracje > "Integracja AI") *(optional,
|
||||
off by default)* — an OpenAI-compatible chat-completions client (Groq,
|
||||
OpenAI, or a self-hosted Ollama instance) configured by base URL, optional
|
||||
API key, model, and an SSL-verification toggle. Not tied to a single
|
||||
feature — it backs the BookStack auto-tagging above and the AI ticket
|
||||
triage/summary below, and is meant to be reused by anything that needs an
|
||||
LLM call in the future.
|
||||
- **AI-driven ticket triage + summary** (Admin > Integracje >
|
||||
"Automatyzacja AI dla zgłoszeń") *(optional, off by default, requires the AI
|
||||
integration above)* — five independent toggles run once per new ticket, in
|
||||
the background (`ai:run-ticket-automation`, never synchronously at
|
||||
submission): assign a category/subcategory when missing, pick a
|
||||
subcategory when only a category is set, recheck/correct an
|
||||
already-categorized ticket, rewrite an unclear subject, and set a priority
|
||||
from the ticket's content. Every applied change is logged in the ticket's
|
||||
history. Separately, an AI-generated summary + suggested next action for
|
||||
every ticket, shown to operators only, refreshed as the thread grows, with
|
||||
an admin-editable prompt (reset-to-default button included).
|
||||
|
||||
## Tech stack
|
||||
|
||||
@@ -192,9 +219,12 @@ src/ Laravel application
|
||||
app/Livewire/ Client/Operator/Admin Livewire components
|
||||
app/Models/ Eloquent models
|
||||
app/Events/ Broadcast events (TicketQueueChanged, TicketMessagePosted)
|
||||
app/Console/Commands/ Scheduled commands (SLA breach check, automation rules, IMAP fetch)
|
||||
app/Console/Commands/ Scheduled commands (SLA breach check, automation rules, IMAP fetch,
|
||||
AI ticket triage/summary) + bookstack:tag-content
|
||||
app/Services/ TicketService (ticket lifecycle + notifications), BookStackClient,
|
||||
ImapMailboxFetcher (I/O) + ImapMessageClassifier (pure logic)
|
||||
ImapMailboxFetcher (I/O) + ImapMessageClassifier (pure logic),
|
||||
AiClient (generic LLM client), BookStackContentTagger,
|
||||
TicketAiTriageService, TicketAiSummaryService
|
||||
app/Ldap/ LDAP user model + sync handlers
|
||||
database/migrations/ Schema (one file per table group, final shape)
|
||||
database/seeders/ DatabaseSeeder — reference data, no ticket data
|
||||
|
||||
Reference in New Issue
Block a user