Changelog
Release history for AVA, newest first. Version numbers are the contract — release dates are omitted by policy. Every release ships with the full automated test suite green (2,500+ tests as of v1.8.0), plus type-check, lint, and production-build gates.
Feature availability and configuration details for the current release are documented in configuration.md and white-label.md; system requirements in requirements.md.
v1.8.0 — Engineer console
Slash commands, internal notes, and in-chat tools for engineers. The client chat page is unchanged. For a walkthrough with screenshots, see engineer-console.md.
- Slash commands and ⌘K on one command list. Type
/in the reply box for a ranked, keyboard-driven command menu (↑/↓, Enter/Tab, Esc). Built-ins:/draft,/rewrite <tone>,/wrapup,/transfer,/status,/priority,/note,/ticket,/history,/device,/summarize,/help. The ⌘K palette offers the same commands. Commands that can't run right now are greyed out with the reason. - Commands stay out of the conversation. A draft that starts with
/is always handled as a command and never sent to the client; start a message with//to send text that begins with/. - Snippet shortcuts. Canned responses can have a
/shortcut(team-wide or personal; a personal shortcut takes precedence for its owner) and{{placeholders}}such as{{firstName}}and{{ticketNumber}}. A placeholder that can't be filled must be edited before the message sends. - Internal notes. A "Reply | Internal note" toggle (⌘⇧X / Ctrl+Shift+X) switches the composer to an amber Note mode with its own draft. Notes are shown to your team as cards, posted live to the AutoTask ticket as Internal Only notes (
AUTOTASK_NOTE_PUBLISH_INTERNAL, default1; live sync can be turned off withAUTOTASK_SYNC_INTERNAL_NOTES=false), and included, labelled, in the close-time transcript note. Notes are never shown to the client — not in the chat, emails, the client-facing AutoTask note, the resolution field, the time entry, or any AI text written for the client. - Ticket fields in the chat. The context panel's Ticket card shows the live AutoTask status and priority and lets the engineer change them after an explicit confirmation (also via
/statusand/priority), and tells the engineer if the ticket was changed in AutoTask meanwhile. Priority editing requires all fourAUTOTASK_PRIORITY_P1..P4to be set and distinct. The Complete status is reserved for wrap-up (AUTOTASK_COMPLETE_STATUS_ID, default5). Changes are limited per engineer per minute (TICKET_WRITE_RATE_LIMIT_PER_MIN, default10). A new Contact card offers Call, Email and Copy. - Lifecycle header. A progress indicator (Queued → Accepted → Responding → Wrap-up → Closed), time in chat, and a "client waiting" reply clock; an Intake card with the triage summary, possible duplicate tickets and "Find similar resolutions"; compact activity rows (accepted, transferred, status and priority changes).
- AI for engineers.
/draftsuggests a reply,/rewriterephrases your draft (professional, friendly or concise),/summarizeshows a private recap, and wrap-up gains Draft all with AI. Suggestions are always reviewed before sending. AI text written for the client is based only on the conversation the client can see. - AI usage limits. Per-chat and per-engineer-hour limits (
AI_MAX_CALLS_PER_SESSION, default 30;AI_MAX_CALLS_PER_ENGINEER_PER_HOUR, default 60;0disables), one running request per command, and an[ai-usage]log line per call with token counts and no content, so you can track spend. - White-label ticket links. AutoTask ticket links in the dashboard come from
AUTOTASK_WEB_URLor are derived from your zone URL. Without a usable address, ticket numbers render as plain text. - Keyboard. Alt+↑/↓ switches between active chats (Alt+Shift+↓ jumps to the next unread),
/focuses the composer, and?lists every shortcut and command. Reply and note drafts and the Note mode are kept per chat, so nothing typed for one client follows you to another. - Upgrade notes: one additive database column (applied automatically on start). Before go-live, confirm
AUTOTASK_NOTE_PUBLISH_INTERNALis an Internal Only value on your AutoTask instance, and check whether any AutoTask workflow rule emails contacts on status/priority changes or new notes — see autotask-setup.md.
v1.6.3 — Platform hardening
- Dependencies updated across the stack, with automated dependency auditing in CI.
- Uploads: request-size pre-check, verification that a file's content matches its type, a per-instance disk quota, and automatic retention cleanup; the upload budget, quota and retention are configurable (
UPLOAD_*). - Real-time layer: tighter payload-size and rate limits.
- Container and edge: read-only root filesystem with dropped capabilities, log rotation on all services, HSTS, hidden server version headers, and a tighter Content-Security-Policy in the shipped nginx template.
- Configuration: proxy-header trust is opt-in (
NGINX_TRUSTED_PROXY), reCAPTCHA verification always applies in production, startup checks on secret strength and config-file permissions, and outbound support/feedback/ report email addresses must be configured explicitly (SUPPORT_FALLBACK_EMAILis required — no vendor default). - Less client personal information in server logs (identifiers only; device hints removed from page URLs after capture).
v1.6.2 — Inline attachment previews + survey filtering
- Image attachments preview inline on the client chat page.
- Survey results page: clickable rating-distribution bars filter the response list, and the Rating column is sortable.
v1.6.1 — Attachments, device card and enrichment refinements
- Engineers reviewing closed sessions in Archives can open their attachments, and attachments open correctly in a browser that holds both a client chat and an engineer login.
- Upload allowlist extended with zip, txt, csv, and heic (size cap unchanged).
- Device card layout improved: long identity strings (serial, AV product, IPs, OS, last user) render full-width with no truncation; the context rail widens on large screens.
- NinjaOne ticket enrichment (configuration-item attach + device UDF) is now gated behind a single explicit switch,
NINJAONE_ENRICH_TICKETS(default off), with a documented pre-flight check to run against your own AutoTask instance before enabling. - Faster error reporting when AutoTask rejects a request as invalid (no pointless retries).
v1.6.0 — NinjaOne device-at-a-glance
- Read-only device card in the engineer context panel: identity header, stat tiles (last boot, disk, AV, patches, IPs, system, last user), alerts strip, confidence indicator, and an Open-in-NinjaOne deep link.
- Three-layer device resolution (link hints → AutoTask configuration-item lookup → NinjaOne API cross-check) with a strict never-guess, identity-gated matching policy.
- Optional best-effort AutoTask ticket enrichment: attach the matched configuration item and record the device UID, with overwrite guards.
- NinjaOne access is OAuth2 client-credentials, strictly read-only (GET-only client), and fully off when credentials are unset.
v1.5.0 — White-label configuration layer
- Tenant branding module: all client-facing identity (company name, logo, phone, portal link, tagline, welcome message) is environment-driven — see white-label.md.
- Business-hours copy and display timezone (
DISPLAY_TZ) are configurable and flow through the client page, transcripts, greetings, and billing drafts. - AI prompts templated with a configurable company profile, so triage and summaries speak with the deploying MSP's identity.
- Startup validation requires only the AI provider key matching the configured
LLM_FAST/LLM_QUALITYmodels. - Major internal restructuring (socket server, dashboard state, closure flow) for maintainability, plus a rebuilt buyer-facing documentation set.
v1.4.x — Engineer UX overhaul
v1.4.0
- Transcript redesign: message grouping, day dividers, client-presence liveness header, and optimistic send with delivery acknowledgment and retry — a message is never silently dropped.
- Ticket closure moved from a modal into an in-rail wrap-up panel with autosaved drafts; time entries handle sessions that span midnight.
- Queue upgrades: live wait timers, urgency aging, density toggle, and a standby screen; command palette (⌘K) and keyboard-shortcut help; archives search.
- Design-system pass: unified priority and avatar components, consistent type scale, refreshed dark theme, and dashboard toast notifications.
v1.4.1
- Ticketless-session recovery: if ticket creation fails at chat start (for example, an unrecognized email domain with no catch-all company configured), the close flow retries full ticket creation, and engineers get an explicit confirm-to-close-without-sync escape hatch.
- Clear "no ticket" indicators on affected sessions and a gentle nudge on the client form toward business email addresses.
v1.4.2
- Cleanup release: dead routes, components, and dependencies removed; production image significantly smaller; concurrent-session limit made env-tunable (
MAX_ACTIVE_SESSIONS); PII masking in AutoTask lookup logs.
v1.3.x — Dashboard redesign, canned responses, TLS automation
v1.3.0
- Engineer dashboard redesign: icon rail navigation, secondary panel with live queue search and priority filtering, profile menu (availability, theme, feedback, sign-out), and collapsible client-context sections.
- Canned responses: team-wide and per-engineer saved replies, a
/-triggered picker in the reply box, and a dedicated management page.
v1.3.1
- Visual refinements to the new rail (brand gradient, compact monogram tile).
- Server-authoritative chat availability: a public availability endpoint keeps the client page in sync with the server's business-hours gate.
v1.3.2
- Automated TLS certificate renewal: the bundled certbot service runs a continuous renew loop and nginx gracefully reloads to pick up renewed certificates — WebSocket connections survive the reload. No manual certificate maintenance required.
v1.3.3
- Reliability: live chats stay assigned when an engineer has the dashboard open in several tabs, a closure can't be submitted twice, session-ownership checks are stricter, and client chat credentials are kept out of URLs.
- AutoTask: create requests are not retried after a timeout, so a slow AutoTask response cannot produce duplicate tickets, notes or time entries; company matching prefers exact/subdomain matches over substrings.
- Business hours became fully env-configurable (
BUSINESS_HOURS_TZ/OPEN/CLOSE/DAYS) with validate-and-fallback, alongside env-configurable AutoTask role IDs. - Survey submissions are tied to the chat's own session, AI inputs are length-capped, and reCAPTCHA verification has a timeout.
v1.2.0 — Provider-agnostic AI layer
- All AI call sites moved to the Vercel AI SDK behind a single model factory: choose Anthropic, OpenAI, Google Gemini, or OpenRouter per role via
LLM_FAST/LLM_QUALITY. - Triage uses schema-validated structured output — malformed model responses degrade gracefully to a safe fallback instead of failing the chat.
v1.1.0 — Analytics dashboard
- New analytics page: chat volume, pickup / first-reply / resolution times (average, median, p90), CSAT, and per-engineer and per-organization leaderboards.
- Selectable 7-day / 30-day / 90-day / custom date ranges, backed by a query index added for reporting performance.
v1.0.x — Foundation and stabilization series
The initial production line: real-time client chat with queueing, AI triage, AutoTask ticket lifecycle (create, notes, time entries, close), Microsoft Entra ID engineer sign-on, and email fallback. Patch releases v1.0.1–v1.0.12 consolidated it into a stable baseline. Notable items across the series:
- Security and stability pass: input validation and rate limiting on the public chat page and the real-time layer.
- AutoTask resilience: automatic retry on transient 5xx responses, note descriptions truncated to the API field limit, and the note-visibility (
publish) value made configurable — it is a per-instance AutoTask picklist, never a safe hardcode. - Runtime configuration moved fully out of the repository onto the deployment host.
- Triage prompt tuned so the AI summary reads naturally both on the dashboard and inside the engineer's greeting to the client.
Updated 15 days ago