- Snipe-IT asset inventory integration (Admin > Integracje), optional and off
by default: connect by API address + personal token (+ SSL-verification
bypass). Three independent toggles: client can pick which of their own
Snipe-IT assets a ticket concerns (scoped to admin-selected subcategories,
empty = never shows), operator sees the requester's assets in a ticket-view
sidebar, operator can search the whole inventory from that same sidebar (not
a separate page) for shared equipment. Assets shown as "numer środka - numer
seryjny - producent model" + category; a linked asset's live status is
fetched fresh on the ticket page, and unlinking stays available to an
operator even with both view/search toggles off.
- AI summary: a "Wygeneruj teraz" button for an immediate on-demand refresh,
plus a new admin toggle to regenerate right after every new reply/note
instead of only on the next scheduled sweep. The transcript sent to the
model now also includes the ticket's own opening body, fixing summaries
missing the original request on long threads.
- Fixed: the status dropdown in the operator ticket view could keep showing
the pre-change status after a status-changing quick action until the next
page load (Livewire/Alpine-morph quirk for wire:change-bound selects).
- Docs: README/ARCHITECTURE/CHANGELOG/install/wiki updated for all of the
above, including correcting the AI-summary refresh description left over
from the 1.2.1 release notes.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 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>
- Real-time updates (Laravel Reverb): live operator queue, live ticket
chat/detail updates for operator and client, periodic fallback refresh
with a visible countdown as a backstop for dropped websocket connections.
- SLA automation rules (Admin > Automatyzacja SLA): act on a ticket after
N minutes of customer silence (change priority/status/team/assignee),
evaluated every 15 minutes, reusing TicketService's own setters so
automated changes get the same history/notification/broadcast a manual
change would.
- New notification: every operator on a matching team gets notified when
a new ticket lands in one of their subcategories.
- BookStack knowledge-base sidebar now also shown on the client's own
ticket view (previously operator-only); suggestions everywhere now load
in after first paint instead of blocking it.
- Client ticket view: shows assigned operator + team; page widened to
match the operator's.
- Notification bell shows unread only; read notifications disappear
instead of just dimming.
- Stats dashboard: sectioned layout, new breakdowns (by subcategory, CSAT
by team/operator, top clients, client x subcategory cross-tab).
- Mobile: nav dropdowns (theme/notifications/profile) now expand full
width instead of overflowing off-screen below 640px.
- Fixed two bugs that silently disabled all real-time updates (missing
CSRF header on Echo's private-channel auth; a script-load-order race
that could miss the livewire:init event) and the mariadb healthcheck
(world-writable credentials file on this stack's NFS mount).
- Assorted test-suite fixes (roles virtual attribute needs the roles
table seeded; a few missing seeds/wrong assertions found along the way).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- In-app notifications: a bell in the top bar backed by Laravel's database
notification channel, alongside existing e-mail notifications (same
per-trigger toggle drives both; ticket links now correctly point into the
recipient's own area instead of always linking to the client view).
- Drag-and-drop attachments on every upload form, plus inline image
thumbnails in the message thread instead of a plain download link.
- Customer satisfaction (CSAT) rating: clients rate a closed ticket 1-5 stars
with an optional comment; shown read-only to operators, surfaced as a KPI
on the stats dashboard, and linked from the "ticket closed" e-mail.
- Saved queue views: operators can save/apply/delete named filter+sort+
column presets in the ticket queue and mark one as their default.
- Full-text search (MySQL FULLTEXT, portable LIKE fallback) across ticket
subject/body and reply message bodies, now also on the client's own ticket
list.
- Stats CSV export for the currently filtered ticket set.
- Optional BookStack knowledge-base integration (off by default): suggests
articles by category/subcategory while creating a ticket and in a separate
sidebar for operators on an existing ticket (with a copy-link button).
Configurable connection/SSL bypass/search-type filter, plus two
independent per-shelf allow-lists so nothing is ever searched until an
admin opts specific shelves in.
- Closed tickets no longer show in "Moje zgłoszenia"/"Nieprzypisane"/team
queue tabs, only under "Zamknięte" (matching how "Otwarte" already worked).
- Wired up the Admin > About "Wersja" field to config('app.version')/VERSION
in .env instead of a stale hardcoded string.
- Fixed: TicketService::setStatus() now checks a status's stage rather than
the literal key 'closed' to decide whether to fire the "ticket closed"
notification/stop the timer.
- Updated README/ARCHITECTURE/CHANGELOG/install/SECURITY docs and all three
wiki/ role guides for the above; documented a root-vs-www-data file
ownership gotcha in CLAUDE.md (running artisan commands via a plain
`docker exec` can leave root-owned Blade cache files that later break
recompilation for the www-data Apache process).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>