v0.9.0 — AOI geofences become a continuous watch
AOI geofences become a continuous watch: the collector daemon sweeps
every defined area on its interval, and a webhook fires when something
enters or leaves.
Added
- Scheduled AOI sweeps:
aoi_digestis now a collector source
(analysis.aoi.fetch_aoi_sweep, a fetcher-only wrapper that opens
the AOI store on the fetcher's own cache database), so
intel-collector --daemonadvances every defined geofence's change
snapshot on each cycle - the daemon interval is the watch cadence,
and the existing launchd wrapper makes it survive reboots. Newaoi
domain group for--sources aoi. Digests land in the collector log
and the vector store, and in the webhook below when configured. - AOI change notifications: set
WORLD_INTEL_AOI_WEBHOOKand the
sweep POSTs every non-quiet digest (something entered or left a
geofence) to that URL -jsonpayload by default
(title/totals/markdown/timestamp), or raw markdown with aTitle
header viaWORLD_INTEL_AOI_WEBHOOK_FORMAT=textfor ntfy-style
sinks. Quiet sweeps never fire; an unreachable sink or non-2xx
response never fails the sweep (snapshots already advanced) but is
recorded honestly in the digest'snotificationfield. New
Fetcher.post()carries the delivery - deliberately outside the
caching/retry/breaker machinery, since the target is the operator's
own endpoint. Live-verified end-to-end against a local sink: a real
sweep detected a change and the sink received the JSON payload. - Per-source collector timeout overrides (
SOURCE_TIMEOUTS): a live
smoke caught a single 50 km AOI sweep on a cold cache blowing the
flat 45 s budget (the digest fans out to ~8 domains per AOI, several
rate-floored); the sweep now gets 240 s and the override path is
regression-tested.