openclaw/extensions
Peter Steinberger 295809df98
feat(geolocation): resolve client addresses to a coarse city via a bundled plugin (#128546)
* feat(geolocation): resolve client addresses to a coarse city via a bundled plugin

The Activity identity card could show a client's IP address but not where it
was, so an operator still had to look the address up by hand.

Add a bundled `geolocation` plugin that owns address-to-place resolution behind
one authenticated route, `GET /plugins/geolocation/lookup?ip=`. It downloads a
MaxMind-format database on first lookup into the state directory, answers from
that local copy, and refreshes it monthly, so a lookup never sends an address
to a third party. The Control UI renders the resolved city on the device row
next to the address and the client-reported time zone.

The default source is DB-IP City Lite under CC BY 4.0. That license requires
attribution, so every response carries the credit and the UI renders it next to
the value; the database is downloaded at runtime and never redistributed.
Plugin code and the `maxmind` reader are MIT. No free city-level IP database is
MIT-licensed, so the obligation lives with the data rather than the code, and
`databaseUrl` plus the attribution fields make the source swappable.

No new core provider kind: with one implementation the plugin owns everything
through the existing HTTP-route seam, keeping core plugin-agnostic. A second
provider is what would justify promoting this to a registry contract.

Availability and lookup failure stay distinguishable: a missing or still
downloading database answers 503, never `found: false`. A failed refresh serves
the cached copy, and a body that does not parse as an MMDB is discarded without
replacing a working database.

* fix(docs): correct geolocation config examples and add zh-CN glossary entries

The config examples used `plugins.<id>` instead of the real
`plugins.entries.<id>.config` shape, which the docs config-example
validator and src/config/docs-config-examples.test.ts both reject.
New doc labels also need zh-CN glossary entries.

* chore(labeler): cover the geolocation extension directory

AGENTS.md requires a labeler entry plus a GitHub label for every new
plugin surface; test/scripts/labeler-extension-coverage.test.ts enforces
the labeler half.

* fix(geolocation): address review findings on caching, download bounds, and scope

Cold-start lookups were permanently suppressed. The loader cached one promise
per address including failures, so the 15s browser deadline expiring against a
first download that takes ~46s cached a blank forever, and a mounted row only
looks up again when its IP changes. Lookups now return a discriminated
located/absent/unavailable result: only definitive answers are cached, and the
element retries an unavailable one on a widening 5s/15s/45s schedule.

Download limits ran after allocation. The size check happened only after
`response.arrayBuffer()` had buffered the whole body, and gunzip had no output
ceiling, so a replaced source or a compression bomb could exhaust Gateway memory
before rejection. The body now streams against a compressed ceiling enforced
per chunk, and inflation uses zlib's maxOutputLength.

Cached placements were not scoped to the Gateway. The cache keyed only by
address while endpoint and credentials come from the shared Gateway context, so
a switch could render the previous Gateway's answer. The shared reset hook now
supports multiple subscribers - a single slot silently dropped whichever
registered first - and the geolocation cache subscribes.

Unresolvable ranges no longer trigger a download. Only loopback suppresses `ip`
at connect, so Tailscale carrier-grade-NAT and LAN addresses are recorded and
displayed. No geolocation database contains them, so a tailnet-only or LAN-only
Gateway was downloading 125 MB to answer nothing. The route now answers those
ranges without loading the database, using the already-public
`isPrivateOrLoopbackHost` seam so the SDK surface budget is unchanged.

The quickstart queried a reserved documentation range while showing a located
response, which cannot happen; it now uses a routable address and documents the
not-found case.

* fix(deps): resync the lockfile after dropping the net-policy dependency

The geolocation plugin briefly depended on @openclaw/net-policy before
switching to the already-public isPrivateOrLoopbackHost SDK seam. The
package.json entry was removed without regenerating the lockfile, so the
frozen-lockfile install failed and every downstream CI job failed with it.
2026-08-24 04:56:03 -07:00
..
acpx chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
active-memory fix(memory): respect provenance in automatic context (#127469) 2026-08-21 18:44:40 -07:00
admin-http-rpc refactor(security): consolidate plugin JSON body reading onto canonical bounded reader (#124944) 2026-08-16 22:01:34 -07:00
alibaba test(extensions): close cached agent databases before removing fixture state dirs (#126352) 2026-08-21 07:22:57 -07:00
amazon-bedrock chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
amazon-bedrock-mantle chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
anthropic fix(deps): align Anthropic Agent SDK lock (#128671) 2026-08-24 03:54:40 -07:00
anthropic-vertex chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
arcee fix(onboard): keep OpenRouter API keys with their provider (#126578) 2026-08-20 00:35:27 -07:00
azure-speech test(azure-speech): make voices timeout proof deterministic (#124694) 2026-08-16 09:55:23 -07:00
baseten feat(lint): enforce import ordering and deduplication (#124730) 2026-08-16 11:44:52 -07:00
beam fix(beam): stop mirroring after service shutdown (#126589) 2026-08-23 15:36:35 -07:00
bonjour chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
brave
browser chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
buzz chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
byteplus feat(lint): enforce import ordering and deduplication (#124730) 2026-08-16 11:44:52 -07:00
canvas chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
cerebras
chutes feat(lint): enforce import ordering and deduplication (#124730) 2026-08-16 11:44:52 -07:00
clawrouter refactor: consolidate coercion ownership (#122299) 2026-08-11 17:14:53 -07:00
clickclack chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
cloudflare-ai-gateway fix(agents): keep guided auth atomic through creation (#126096) 2026-08-18 18:18:53 -07:00
codex chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
cohere refactor(cohere): flatten stream payload wrapper 2026-08-12 08:36:33 -07:00
comfy fix(comfy): forward req.timeoutMs in music generation (#123444) 2026-08-21 03:46:42 -07:00
copilot chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
copilot-proxy
crabbox fix: surface cloud worker enrollment rejection evidence (#128632) 2026-08-24 02:32:24 -07:00
cua-computer chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
deepgram
deepinfra refactor: retire August compat windows (embedding API, pi aliases, target parser, spawning hook, setup exports, WhatsApp inbound aliases) (#124416) 2026-08-15 22:43:47 -07:00
deepseek
device-pair test(extensions): close cached agent databases before removing fixture state dirs (#126352) 2026-08-21 07:22:57 -07:00
diagnostics-otel perf(qa): isolate OTEL model-call test imports (#127420) 2026-08-21 12:33:02 -07:00
diagnostics-prometheus feat(lint): enforce import ordering and deduplication (#124730) 2026-08-16 11:44:52 -07:00
diffs chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
diffs-language-pack fix(diffs-language-pack): serve byte-accurate Content-Length on asset HEAD requests (#120282) 2026-08-24 01:43:55 -07:00
discord fix(discord): preserve distinct super reaction events (#128649) 2026-08-24 03:17:10 -07:00
document-extract chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
duckduckgo test(duckduckgo): move regressions to search boundary (#123188) 2026-08-13 15:07:09 -07:00
elevenlabs fix(talk): keep unused speech secrets from blocking startup (#127687) 2026-08-21 17:03:23 -07:00
exa
fal fix(onboard): activate media-only provider authentication (#126711) 2026-08-20 08:43:40 -07:00
featherless
feishu chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
file-transfer fix(file-transfer): inline bounded text attachment formats (#128656) 2026-08-24 04:33:32 -07:00
firecrawl chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
fireworks refactor(fireworks): flatten Kimi stream wrapper 2026-08-12 08:36:33 -07:00
fish-audio-speech refactor(plugin-sdk): extract stream and SecretRef primitives (#124835) 2026-08-16 14:30:11 -07:00
geolocation feat(geolocation): resolve client addresses to a coarse city via a bundled plugin (#128546) 2026-08-24 04:56:03 -07:00
github-copilot fix(secrets): fail closed for configured references (#127669) 2026-08-21 18:00:28 -07:00
gmi
google chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
google-meet chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
googlechat perf(googlechat): reuse DM metadata for session routes (#128359) 2026-08-23 14:05:27 -07:00
gradium refactor(gradium): consolidate speech requests 2026-08-12 07:58:43 -07:00
groq refactor(types): remove chained type assertions in extensions (#124079) 2026-08-15 01:39:26 -07:00
huggingface refactor(test): remove residual test seams (#123555) 2026-08-14 03:03:15 -07:00
image-generation-core refactor(media): remove orphan runtime facades (#125121) 2026-08-17 00:42:33 -07:00
imessage chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
inworld test(azure-speech): make voices timeout proof deterministic (#124694) 2026-08-16 09:55:23 -07:00
irc improve(irc): reuse transient connection for chunked sends (#128487) 2026-08-23 22:44:16 -07:00
kilocode fix(onboard): cancel cleanly when stdin ends (#124780) 2026-08-17 00:25:46 -07:00
kimi-coding
line chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
linux-node fix(location): reject future-dated cached fixes (#128591) 2026-08-24 00:57:04 -07:00
litellm
llama-cpp chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
llm-task chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
lmstudio fix(lmstudio): redact reflected model-load credentials (#128561) 2026-08-24 00:18:43 -07:00
lobster chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
logbook fix: capture GitHub identity from authenticated sign-in (#126114) 2026-08-19 01:35:52 -07:00
longcat refactor(types): drain chained-assertion ledger — extensions (#124378) 2026-08-15 20:55:01 -07:00
matrix chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
mattermost chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
memory-core chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
memory-lancedb chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
memory-wiki chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
meta refactor(meta): inline response payload patching 2026-08-12 08:36:33 -07:00
microsoft fix(talk): keep unused speech secrets from blocking startup (#127687) 2026-08-21 17:03:23 -07:00
microsoft-foundry fix(claude-cli): apply thinking and keep live sessions warm (#125528) 2026-08-20 06:44:49 -07:00
migrate-claude fix(agents): preserve empty CLI subagent completions (#126379) 2026-08-19 11:30:43 -07:00
migrate-hermes fix(auth): report the database that actually holds an agent's profiles (#126918) 2026-08-20 18:05:50 -07:00
minimax test(providers): remove JSON reader facades (#125956) 2026-08-18 12:18:30 -07:00
mistral test(mistral): wait on delivered transcripts after reconnect (#124935) 2026-08-16 17:45:17 -07:00
moonshot fix(search): preserve provider cache hits across equivalent queries (#126798) 2026-08-20 12:04:19 -07:00
msteams chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
mxc fix(agents): preserve empty CLI subagent completions (#126379) 2026-08-19 11:30:43 -07:00
nextcloud-talk improve(nextcloud-talk): avoid room credential reads on sends (#128344) 2026-08-23 13:07:45 -07:00
nostr chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
novita
nvidia test(mistral): wait on delivered transcripts after reconnect (#124935) 2026-08-16 17:45:17 -07:00
oc-path chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
ollama chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
onepassword chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
openai chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
opencode refactor: share media and process runtime helpers (#126490) 2026-08-19 17:48:49 -07:00
opencode-go feat(lint): enforce import ordering and deduplication (#124730) 2026-08-16 11:44:52 -07:00
openrouter refactor: consolidate meeting and media provider families (#126053) 2026-08-18 19:11:13 -07:00
openshell refactor(sandbox): canonicalize backend ownership (#126828) 2026-08-20 13:52:15 -07:00
parallel fix(parallel): redact x-api-key reflected in web search error bodies (#120205) 2026-08-17 14:19:27 -07:00
perplexity test: trim plugin test duplicates (#126917) 2026-08-20 18:07:27 -07:00
pixverse fix(agents): keep guided auth atomic through creation (#126096) 2026-08-18 18:18:53 -07:00
policy test: trim plugin test duplicates (#126917) 2026-08-20 18:07:27 -07:00
qa-channel chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
qa-lab chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
qianfan
qwen refactor: share media and process runtime helpers (#126490) 2026-08-19 17:48:49 -07:00
raft refactor: share media and process runtime helpers (#126490) 2026-08-19 17:48:49 -07:00
reef chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
runway fix(onboard): enable Runway and Alibaba video provider authentication (#126722) 2026-08-20 09:30:48 -07:00
searxng fix(security): prevent blocked SearXNG refs from using ambient URLs (#126214) 2026-08-19 00:02:58 -07:00
senseaudio
sglang test: remove residual duplicate assertions (#123134) 2026-08-13 04:41:37 -07:00
signal chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
slack chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
sms fix(sessions): preserve committed results across reconnects (#125904) 2026-08-18 19:13:58 -07:00
stepfun
synology-chat refactor(plugins): adopt shared retry runtime (#126065) 2026-08-18 17:46:38 -07:00
synthetic
talk-voice refactor: consolidate coercion ownership (#122299) 2026-08-11 17:14:53 -07:00
tavily chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
teams-meetings chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
telegram chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
tencent
test-support
tlon chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
together refactor: consolidate coercion contracts (#122458) 2026-08-11 23:26:37 -07:00
tokenjuice
tts-local-cli fix(tts): avoid mislabeled local and ElevenLabs audio (#125628) 2026-08-18 03:24:44 -07:00
twitch fix(twitch): retire client managers before disconnect (#127103) 2026-08-21 01:33:26 -07:00
vault perf(cli): build root help from plugin metadata (#124562) 2026-08-16 05:43:35 -07:00
venice
vercel-ai-gateway
vllm
voice-call chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
volcengine fix(talk): keep unused speech secrets from blocking startup (#127687) 2026-08-21 17:03:23 -07:00
voyage refactor: retire August compat windows (embedding API, pi aliases, target parser, spawning hook, setup exports, WhatsApp inbound aliases) (#124416) 2026-08-15 22:43:47 -07:00
vydra fix(onboard): activate media-only provider authentication (#126711) 2026-08-20 08:43:40 -07:00
web-readability
webhooks
whatsapp chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
workboard chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
xai chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
xiaomi fix(talk): keep unused speech secrets from blocking startup (#127687) 2026-08-21 17:03:23 -07:00
zai fix(agents): keep guided auth atomic through creation (#126096) 2026-08-18 18:18:53 -07:00
zalo perf(zalo): reuse prepared media context (#128377) 2026-08-23 14:48:58 -07:00
zalouser chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
zoom-meetings chore: refresh dependencies after seven-day cooldown (#128414) 2026-08-24 03:01:54 -07:00
.npmignore
AGENTS.md
CLAUDE.md
music-generation-providers.live.test.ts
tsconfig.package-boundary.base.json
tsconfig.package-boundary.paths.json fix(discord): resolve realtime voice API key references (#125443) 2026-08-19 15:23:14 -07:00
video-generation-providers.live.test.ts