All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
[1.1.0] - 2026-07-07
Added
- Three AI-assisted features registered via
artisanpack-ui/ai:security.threat_triage—ThreatTriageAgent+ThreatTriagePanelLivewire component (default modelclaude-sonnet-4-6). Plain-language severity and recommended actions for aSecurityEvent. Closes #20.security.anomaly_summary—AnomalySummaryAgent+AnomalySummaryPanelLivewire component (default modelclaude-haiku-4-5-20251001). Periodic digest of unusual events over a configurable window (1–720 hours). Closes #21.security.incident_response—IncidentResponseAgent+IncidentResponsePanelLivewire component (default modelclaude-opus-4-7). Advisory-only next-step suggestions for open incidents. Closes #22.
- Service provider now exposes an
aiFeatures()method so the three features are auto-discovered byartisanpack-ui/ai's boot pass — no manual registration required by the host app. CallsLaravelAitrait wires each agent intolaravel/ai'sPromptable+ structured-output pipeline, invalidates cached provider instances so per-tenant credential injection actually lands, and unwraps single-key envelopes some models add around structured tool call arguments.- Layered prompt overrides now flow through: the resolved
instructions()string (settings-store override →artisanpack.ai.features.{key}.instructionsconfig → class default) is threaded through tolaravel/aion every run. - Three Blade views shipped under
resources/views/livewire/{threat-triage,anomaly-summary,incident-response}-panel.blade.php, registered as Livewire components under the namespaced tagssecurity-analytics.{name}-panel. Overridable via the standardresources/views/vendor/security-analytics/livewire/*.blade.phpshadow. - New
docs/usage/ai-features.mddocumenting the three AI surfaces, override points, and defaults.
Changed
- Minimum PHP requirement bumped from 8.2 to 8.3 to align with
artisanpack-ui/ai's transitivelaravel/aidependency. composer.jsonnow requiresartisanpack-ui/ai ^1.0.0-alpha.1and declares a development-onlypathrepository against../aifor the symlinked dev-app workflow (CI strips this before install so Composer resolves from Packagist, matching the pattern used byartisanpack-ui/visual-editor).- CI test matrix drops PHP 8.2 rows; retains PHP 8.3 / 8.4 × Laravel 12 / 13 × Livewire 3.6 / 4.0.
Security
- Livewire panel target IDs (
$eventId,$incidentIdonThreatTriagePanelandIncidentResponsePanel) are now marked#[Locked]so a user with the coarseview-security-eventscapability cannot rewire the target via the wire protocol to trigger an agent on records they weren't meant to see. CallsLaravelAi::configureProvider()invalidateslaravel/ai'sMultipleInstanceManagercache after mutating credentials so a second agent's key actually lands. Without this, the first key seen by the process was silently reused for every subsequent call — a cross-tenant credential leak in multi-tenant deployments.- The
Throwablecatch on all three Livewire panels now logs the raw exception server-side and surfaces a generic "Check the server logs for details" message; Guzzle/Anthropic exception messages could otherwise leak the upstream URL or, under some debug configs, API-key headers into the browser DOM. ThreatTriageAgent::fetchRelated()returns[]when the event has no correlation keys (fingerprint,ip_address,user_idall null) instead of running an empty closure-wherethat would surface up to 10 arbitrary recent events (including their PII) into the LLM prompt.
Fixed
- Cache fingerprints now hash observable content instead of thin proxies:
IncidentResponseAgenthashes the timeline contents (not justcount($timeline)) so same-length edits / bulk updates invalidate the cache;AnomalySummaryAgenthashes per-anomaly (id, severity, detector) tuples so reclassification invalidates the cached digest. hash('sha256', json_encode(...))calls in all three cache fingerprints now useJSON_INVALID_UTF8_SUBSTITUTEand gracefully handle afalsereturn, so invalid UTF-8 in user-controlled fields (SecurityEvent::details, url, fingerprint) no longer crash the base pipeline with aTypeErrorbeforeexecute()runs.AnomalySummaryAgent::buildStatistics()aggregates severity and detector counts entirely in the database viaselectRaw+groupBy— the previous->get()->groupBy(...)hydrated every row into memory just to bucket-count it, and was unbounded for busy tenants.AnomalySummaryAgent::payload()gained anis_arrayguard on$input['anomalies']/$input['statistics']mirroringIncidentResponseAgent; callers passing a Collection or non-array now get the documentedInvalidArgumentExceptioninstead of a rawTypeErrorfromarray_values.AnomalySummaryAgent::$streamset tofalse— the previoustruewas documented as "streaming on by default" butexecute()used the non-streaming path, so anystreamTo($cb)callback silently dropped every chunk.unwrapStructured()early-return guard removed;array_intersectalone correctly handles Opus's double-wrap under the schema's own parameter name.outputSchema()on each agent is now derived fromschema()viaObjectSchemaon the trait, killing the double-source-of-truth between the array-literal and fluent forms.aiFeatures()labels/descriptions and allabort(403)messages wrapped in__()for i18n. Panelrender()methods gained explicit: Viewreturn types.
[1.0.1] - 2026-06-14
Added
- Laravel 13 support. The
illuminate/supportconstraint now accepts^10.0|^11.0|^12.0|^13.0, and the test toolchain (orchestra/testbench,pestphp/pest,pestphp/pest-plugin-laravel) was widened so the Laravel 13 leg installs cleanly.
Changed
- CI now runs the test suite as a matrix across Laravel 12 and 13 × PHP 8.2-8.4 × Livewire 3.6 and 4.0 (Laravel 13 / PHP 8.2 excluded — Laravel 13 requires PHP 8.3+). CI also triggers on
release/**branches and overridescomposer config platform.phpper matrix row so the Laravel 13 leg resolves correctly despite the repo's PHP 8.2 platform pin.
[1.0.0] - 2026-05-18
Added
- Initial release of the standalone Security Analytics package, extracted from
artisanpack-ui/security1.x as part of the Security 2.0 package split. - Event logging —
SecurityEventLoggerservice,SecurityEventmodel,LogAuthenticationEventslistener, automatic capture of Laravel authentication events. - Anomaly detection (8 pluggable detectors):
BruteForceDetector,CredentialStuffingDetector,GeoVelocityDetector,PrivilegeEscalationDetector,AccessPatternDetector,BehavioralDetector,StatisticalDetector,RuleBasedDetector. PlusAnomalyDetectionServiceorchestrator andBaselineManagerfor per-user behavior profiles. - Threat intelligence (5 pluggable providers):
AbuseIPDBProvider,GoogleSafeBrowsingProvider,IpQualityScoreProvider,VirusTotalProvider,CustomFeedProvider. PlusThreatIntelligenceServiceaggregator. - SIEM export (5 pluggable exporters):
DatadogExporter,ElasticsearchExporter,SplunkExporter,SyslogExporter,WebhookExporter. PlusSiemExportServiceandEventFormatter. - Incident response automation (11 pluggable actions):
BlockIpAction,BlockUserAction,EnableEnhancedLoggingAction,ForcePasswordResetAction,LockAccountAction,LogEventAction,NotifyAdminAction,RateLimitIpAction,RequireTwoFactorAction,RevokeSessionsAction,TerminateSessionAction. PlusIncidentResponderorchestrator andResponsePlaybookmodel for playbook-driven flows. - Alerting (8 pluggable channels):
DatabaseChannel,EmailChannel,OpsGenieChannel,PagerDutyChannel,SlackChannel,SmsChannel,TeamsChannel,WebhookChannel. PlusAlertManager,AlertRulemodel,AlertHistorymodel. - Reports (6 report types):
ExecutiveSummaryReport,IncidentReport,ComplianceReport,ThreatReport,TrendReport,UserActivityReport. PlusReportGeneratorandScheduledReportmodel. - Dashboard surface:
SecurityDashboardControllerwith 10 JSON endpoints (summary, live events, metrics, threats, geographic, timeline, anomalies, incidents, alert acknowledgment) plus 4 Livewire components (SecurityDashboard,SecurityEventList,SecurityStats,SuspiciousActivityList). Bundled routes file consolidates both API + UI under a single configurable prefix. - Eloquent models (11):
SecurityEvent,Anomaly,UserBehaviorProfile,ThreatIndicator,ResponsePlaybook,SecurityIncident,AlertRule,AlertHistory,ScheduledReport,SecurityMetric,SuspiciousActivity. - Migrations (10) and database factories (9) for all models.
- Console commands (11):
security:analytics-process,security:clear-events,security:detect-suspicious,security:export-events,security:generate-report,security:list-events,security:prune-analytics,security:event-stats,security:sync-threat-feeds,security:test-siem,security:update-baselines. - Background jobs (5):
AnalyzeAnomalies,ExportToSiem,GenerateScheduledReport,ProcessSecurityMetrics,SendSecurityAlert. - Events (3):
AnomalyDetected,SecurityEventOccurred,SuspiciousActivityDetected. SecurityAnalyticsFacade andsecurity_analytics()helper.SuspiciousActivityServiceported in from the 1.x security package.- Views published under both
artisanpack-ui-security-analytics::(long-form) andsecurity-analytics::(shorter alias) namespaces.
Fixed
- Livewire view namespace mismatch — the 4 dashboard components were calling
view('security::livewire.*')from the 1.x era. Updated toview('security-analytics::livewire.*'). Without this fix, every Livewire render threwView not foundin production. SuspiciousActivityListreferenced model constants that don't exist (TYPE_UNUSUAL_LOCATION,TYPE_UNUSUAL_DEVICE, etc.). Replaced with the actual constants theSuspiciousActivitymodel defines.- The missing
suspicious-activity-list.blade.phpview file now ships with the package. - Consolidated
routes/security-dashboard.phpandroutes/analytics-dashboard.phpinto a singleroutes/dashboard.phpwith clearly-separated UI and API groups. The two-file split caused the API routes to silently not load (theirdashboard.enabledconfig flag defaulted tofalsewhile the UI flag defaulted totrue). - All 4 dashboard Blade views rewritten in plain HTML + Tailwind. Previously they pulled in
<x-artisanpack-*>components fromartisanpack-ui/livewire-ui-componentswithout declaring the dependency, breaking installs that didn't have that package. - Author email normalized to
support@artisanpackui.dev.
Removed
- This package contains the security event logging / anomaly detection / threat intel / SIEM / incident response / alerting / analytics content previously bundled in
artisanpack-ui/security1.x. See theartisanpack-ui/securityUPGRADE guide for migration instructions from 1.x.

