diff options
| author | Christian Cleberg <[email protected]> | 2026-04-26 00:39:28 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-26 00:39:28 -0500 |
| commit | 237a72a03102319638c5b0572ca3ab543238b821 (patch) | |
| tree | 21b34e8b69994ac58ef1c8c49c05bc4a4b65c3b7 /DomainDig/TimelineView.swift | |
| parent | cc69cbd7e589ec4b065ce74d8c5e7714a040cfc5 (diff) | |
| download | domain-dig-237a72a03102319638c5b0572ca3ab543238b821.tar.gz domain-dig-237a72a03102319638c5b0572ca3ab543238b821.tar.bz2 domain-dig-237a72a03102319638c5b0572ca3ab543238b821.zip | |
DomainDig v3.5.0: Expand the Pro+ Data+ intelligence layer with deeper local historical context
and inferred enrichment.
- add derived intelligence fields for provider fingerprinting, classification,
ownership transitions, hosting transitions, subdomain history, risk signals,
and inferred timeline events
- expand DNS history beyond A/NS snapshots to retain A, AAAA, MX, NS, TXT, and
CNAME change state
- persist enriched intelligence in snapshots and history entries so analysis is
local-first and incremental
- add a dedicated Data+ Intelligence panel to current and historical domain
detail views
- surface intelligence events in timeline rows and include Data+ changes in diff
output
- preserve non-blocking inspection behavior by keeping enrichment additive to
the main lookup path
This makes Pro+ materially deeper for investigative workflows by improving
historical ownership visibility, infrastructure context, hosting change
detection, subdomain intelligence, and explainable risk signals.
Diffstat (limited to 'DomainDig/TimelineView.swift')
| -rw-r--r-- | DomainDig/TimelineView.swift | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/DomainDig/TimelineView.swift b/DomainDig/TimelineView.swift index b163c76..8680d15 100644 --- a/DomainDig/TimelineView.swift +++ b/DomainDig/TimelineView.swift @@ -25,7 +25,7 @@ struct TimelineView: View { NavigationLink { HistoryDetailView(viewModel: viewModel, entry: entry) } label: { - TimelineRow(summary: summary) + TimelineRow(summary: summary, entry: entry) } .swipeActions(edge: .trailing, allowsFullSwipe: false) { Button { @@ -102,6 +102,7 @@ struct TimelineView: View { private struct TimelineRow: View { @Environment(\.appDensity) private var appDensity let summary: SnapshotSummary + let entry: HistoryEntry var body: some View { VStack(alignment: .leading, spacing: appDensity.metrics.rowSpacing + 1) { @@ -138,6 +139,17 @@ private struct TimelineRow: View { .font(appDensity.font(.caption2)) .foregroundStyle(.secondary) + if !entry.intelligenceTimeline.isEmpty { + VStack(alignment: .leading, spacing: 4) { + ForEach(Array(entry.intelligenceTimeline.prefix(2))) { event in + Text("\(event.title): \(event.detail)") + .font(appDensity.font(.caption2)) + .foregroundStyle(.secondary) + .lineLimit(1) + } + } + } + HStack(spacing: 8) { if let primaryIP = summary.primaryIP { Text(primaryIP) |
