> Source: https://docs.nometa.az/changelog/4-4

# SAMURAI 4.4

_Released July 1, 2026._

## Features

- **API:** register gated /api/devices/:id/terminal WS route
- **Changes:** collapse long "Seen on" list behind a Show-more toggle
- **Connectors:** Discord incoming-webhook client
- **Forensics:** animate result row expand/collapse (Collapse height-glide + rotating chevron)
- **Forensics:** EOF-framed per-command SSH collector + classify
- **Forensics:** gated Forensics tab — collect, view, download bundle
- **Forensics:** persist job across refresh + confirm dialog on collect
- **Forensics:** platform-aware command descriptor + output classifier
- **Forensics:** start/status/bundle routes (gated) + collect+download audits + TTL sweeper
- **Forensics:** transient in-memory job store (owner-bound, TTL)
- **Forensics:** zip bundle + manifest with per-file + overall SHA-256
- **Frontend:** add gated Terminal tab to router/switch panels
- **Frontend:** xterm.js read-only device terminal component
- **HA:** /api/cluster status + promote endpoints
- **HA:** add cluster.manage permission
- **HA:** cluster models + collection registration
- **HA:** cluster service — role derivation + heartbeat/refresh loops
- **HA:** cluster store (seed/heartbeat/list/set-active)
- **HA:** gate background sync/compliance/monitor loops on cluster.IsActive
- **HA:** global passive-mode banner
- **HA:** High Availability tab cards default collapsed
- **Handlers:** read-only live SSH terminal WebSocket handler
- **HA:** read NODE_ID (hostname fallback)
- **HA:** remove-node button + DELETE /api/cluster/nodes/:id
- **HA:** RequireActive guard on on-demand device-data writes
- **HA:** Settings High Availability tab (roster + promote)
- **HA:** useCluster status/promote hook
- **Integrations:** add Jira + custom authenticated callback sinks
- **Integrations:** disable config inputs while an integration is off
- **Integrations:** Discord sink with severity-colored embed
- **Integrations:** event spine — domain/events + Sink registry + dispatcher
- **Integrations:** Microsoft Teams notification channel via MessageCard
- **Integrations:** move Email/Telegram transport into Integrations tab
- **Integrations:** phase 1 — route change-email through the event bus
- **Integrations:** phase 2 — Telegram outbound rebuild + unified change producer
- **Integrations:** phase 2 (cont.) — Telegram outbound rebuild + unified producer
- **Integrations:** phase 3 — merge Notifications into Integrations
- **Integrations:** phase 3 (cont.) — Integrations cards + remove Notifications tab
- **Integrations:** register Discord in catalog/settings/allsinks
- **Integrations:** Settings Integrations tab — Slack/TheHive + on-demand trigger
- **Integrations:** show "Configured / Not set" status for secret fields
- **Integrations:** Slack + TheHive connectors/sinks + REST + on-demand trigger
- **Notifications:** add custom notification hook + banner
- **Notifications:** move Custom-notification enable toggle into the card header
- **Notifications:** unified in-flow banner stack + Settings card
- **Rbac:** add device.forensics permission (admin-only, secret trust)
- **Rbac:** add device.terminal permission for live SSH terminal
- **Settings:** animate Integrations rows + a11y-correct trigger + tests
- **Settings:** apply claude.ai/design polish to Integrations tab
- **Settings:** brand logos on Integrations tab cards
- **Settings:** consolidate proxy sections into one Outbound proxy card
- **Settings:** Discord integration logo + status label
- **Settings:** lift section primary controls into card headers
- **Settings:** move LDAP enable toggle into the card header
- **Settings:** redesign Integrations tab as collapsible grouped list
- **Settings:** restyle TabSaveBar to the design mockup floating glass pill
- **Settings:** roll collapsible card design out to General/Sync/Logging
- **Settings:** roll collapsible card design out to License + Access
- **Settings:** roll Integrations card design out to Network & Security
- **Settings:** Sync tab snapshot retention in days, not count
- **Settings:** Users table — email column + sortable headers
- **SSH:** persistent read-only terminal session primitive
- **Sync:** add snapshotCutoff helper for time-based retention
- **Sync:** default snapshot_retention_days to 180
- **Sync:** time-based snapshot retention with always-keep-latest floor
- **Terminal:** adopt usePanelTerminal in router/switch panels
- **Terminal:** compact minimized pill + confirm-on-close for floating window
- **Terminal:** confirm dialog on open (no auto-connect) + align Forensics tab design
- **Terminal:** floating-window geometry helpers + tests
- **Terminal:** FloatingWindow + placement-aware DeviceTerminal + usePanelTerminal host
- **Terminal:** full-height layout, font-size dropdown (persisted), copy + download
- **Terminal:** list candidates on ambiguous Tab via ? fallback
- **Terminal:** polish UI (toolbar, status, history) + fix arrow-key input corruption
- **Terminal:** pop-out / floating window — PanelTerminal component
- **Terminal:** proper Ctrl+C, empty-Enter, copy/paste handling
- **Terminal:** server-mediated Tab completion probe
- **Terminal:** show-prefix guard + replay-based completion parser
- **Terminal:** Tab key requests device completion + applies result
- **Terminal:** WriteRaw primitive + completer capture coordinator
- **VMware vCenter:** attribute changes via event-type allowlist classifier; drop privilege-check recovery
- **VMware vCenter:** Changes tab 'Changed by' summary from per-item stamps, not transaction firehose
- **VMware vCenter:** gate raw audit_admin_batches behind include_audit
- **VMware vCenter:** recover actor from privilege-check audit events when stamping changes
- **VMware vCenter:** remove top 'Changed by' summary block, match Palo/all vendors

## Bug Fixes

- **A11y:** darken light-mode --muted-foreground to meet WCAG AA contrast
- **Changes:** reliable keyframe collapse animation + default-collapsed + per-card consistency
- **Ci:** restore linux optional deps in frontend lockfile (#756 recurrence)
- **Cisco FMC:** show "any" for empty networks instead of injected 0.0.0.0/0
- **Forensics:** don't evict running jobs; bind bundle/status to job's device; doc ctx choice
- **Forensics:** hard per-command wall-clock cap so tech-support can't hang
- **Forensics:** isolated SSH connection per command (IOS-XE closes conn on exit)
- **Forensics:** surface read truncation so partial captures aren't certified complete
- **HA:** gate cluster status polling on cluster.manage to avoid 403 spam
- **Infra:** point nginx SPA root to the D: build path
- **Integrations:** don't leak Teams webhook URL into logs on delivery failure
- **Integrations:** use official full-colour Teams logo in card header
- **Integrations:** use the sticky save bar like every other Settings tab
- **Settings:** collapse every settings card by default
- **Settings:** collapse/expand animation via grid-rows + forceMount
- **Settings:** collapsed-card-shaped loading skeleton
- **Settings:** harden save-bar fill chain to pure flex-grow
- **Settings:** Integrations loading skeleton matches the redesigned layout
- **Settings:** keep save bar Discard/Save visible (disabled) when clean
- **Settings:** lighten card-header icon-box border
- **Settings:** make About section content full width
- **Settings:** make card-header edges clickable for expand/collapse
- **Settings:** make integration card expand/collapse actually animate
- **Settings:** make the floating save bar always visible again
- **Settings:** match collapsible section title size to Integrations
- **Settings:** match Integrations card geometry + convert all proxy sections
- **Settings:** normalize two spacing drifts
- **Settings:** pin the save bar to the page bottom on short tabs
- **Settings:** render header-action dialogs outside the collapsible body
- **Settings:** show syslog listener confirm dialog when card collapsed
- **Settings:** soften field labels to muted color
- **Settings:** space the info tooltip from the header action control
- **Settings:** use the shared Collapse component for card animation
- **Switch:** harden parseVRFNames against device command echo
- **Terminal:** absorb device Ctrl+U redraw so completion isn't clobbered
- **Terminal:** app-level GlobalTerminalHost so floating survives tab switches
- **Terminal:** cursor-aware line editing — Left/Right/Home/End + mid-line insert
- **Terminal:** explicit own-or-default credential handling + clear no-creds error
- **Terminal:** explicit preventDefault on Tab to block browser focus-traversal
- **Terminal:** nginx WS proxy location for /api/devices/&lt;id&gt;/terminal
- **Terminal:** strip device prompt prefix from completion redraw
- **Terminal:** strip device-echoed command from output stream, backend-side
- **Terminal:** Vite dev proxy ws:true for /api/devices/&lt;id&gt;/terminal
- **Terminal:** write geometry refs in effects, not during render
- **UI:** lighten light-theme --input border to match design weight
- **VMware vCenter:** derive timeline header from item stamps, not audit batches[0]
- **VMware vCenter:** explicit audit actor wins over recovered denial actor when stamping
