- 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>
- Subcategories can now be reordered within their category — up/down arrow
buttons next to "Edytuj" in Admin > Kategorie. The order set there is used
everywhere a subcategory list is shown (pickers, admin listings, etc.).
- 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>
- E-mail intake (IMAP), optional and off by default: clients can create a
ticket or reply to an existing one just by sending/replying to an e-mail.
Configure any number of mailboxes in the new Admin > Poczta page (SMTP +
IMAP together, replacing the old "E-MAIL" tab), each routed to a specific
subcategory or a whole category (new tickets.category_id column). Replies
are matched to their ticket via the number/checksum already in every
notification subject; autoresponders/bounces are detected and rejected;
"restrict tickets to LDAP" is enforced for e-mail like the guest web form.
Manual "Pobierz teraz" per-mailbox fetch button; dedicated
storage/logs/imap-*.log regardless of the app's log level; mail-icon badges
on e-mail-originated tickets/messages in the operator queue and ticket view.
- Operator queue: "select all" checkbox in the table header for every
currently visible ticket under the active filter/tab.
- Fixed: scheduled commands (SLA breach check, automation rules, and now IMAP
fetch) always sent notifications through .env's default mailer instead of
the configured SMTP server, because AppServiceProvider's Settings override
used to skip itself for any console command, not just migrate.
- Fixed: visiting a ticket that no longer exists (deleted mid-session, or a
stale background refresh) showed a raw 404 instead of redirecting back to
the operator queue / client dashboard.
- Docs: README/ARCHITECTURE/CLAUDE/install/wiki updated for all of the above,
including the previously-missing host crontab entry for schedule:run.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Configurable ticket numbering (Admin > Konfiguracja > Ogólne): admin-set
prefix and minimum zero-padded length for the ticket number.
- "Ukryj kolejność zgłoszeń": an opt-in mode that displays a stable,
HMAC-derived checksum instead of the sequential ticket number, so it gives
no indication of ticket volume or creation order. Ticket URLs switch to
the same checksum when this is on, so a link and the number on the page it
points to always match. The REST API is unaffected — pinned to `id`
regardless of this setting. Search now also matches by checksum.
- Fixed: attachments no longer show an inline image thumbnail in the
message thread — every attachment (images included) shows as just its
filename, opening in a new tab on click.
- Docs: README/ARCHITECTURE/wiki updated for all of the above.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Triggers (Admin > Wyzwalacze): event-driven rules that fire immediately on
a ticket lifecycle event (created/updated/status/priority/assignee/team/
category changed, new reply), with AND-conditions and ordered actions
(set status/priority/team/assignee, send e-mail). Ships its own dedicated,
freely add/edit/delete-able e-mail templates, kept separate from the fixed
system templates.
- Ticket watching: operators can star/"Obserwuj" any ticket to follow it
regardless of assignment/team.
- Real-time notification bell (private per-user broadcast channel, 30s
fallback poll) with an opt-in in-tab browser push notification.
- Per-user notification preferences (/settings/notifications): scope
(mine/unassigned/watched/all) and e-mail toggle per event category.
- Admin > Integracje: new tab for LDAP/AD + BookStack config, split out of
Konfiguracja.
- Operator queue: Podkategoria/Zespół/Utworzono columns (off by default).
- Obserwuj button moved next to the auto-refresh countdown; trigger
condition builder shows subcategory/zgłaszający as name dropdowns instead
of raw IDs; /settings/notifications got a back link, full-width push
card, and a bordered table container; admin panel tab and operator queue
view now persist across a plain page refresh.
- Docs: README/ARCHITECTURE/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>
Documentation overhaul (TESTING/CONTRIBUTING/ARCHITECTURE/SECURITY/CLAUDE.md,
CHANGELOG.md, drop unmaintained src/README.md) plus CI-built Docker images:
Gitea Actions now builds and pushes the servicedesk image to the Gitea
container registry on Dockerfile changes, and compose.yaml pulls that image
instead of building locally. No application behavior changes.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>