chore: release 1.0.0

Bump version to 1.0.0 and pin the donglora dep to >=1.0.0,<2.0.0 (PyPI), matching the freshly-published donglora 1.0.0 client.


Also knock out two preexisting lint failures surfaced by the release-time `just check` gauntlet:

* orac/crypto.py: drop the redundant int() wrap around round() (RUF046).

* orac/state.py: widen _state value type to include list[list[float]] so heard_positions type-checks under pyright.
This commit is contained in:
swaits committed 2026-04-22 09:58:12 -06:00
1 parent a0a26a32f1
commit 72dd8fefc4
5 files changed
+35 -7

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
# Changelog
## 1.0.0 — 2026-04-22
Initial public release. Orac is a MeshCore chatbot that uses the
`donglora` client to bridge a LoRa dongle to an Anthropic model.
### Added
- `BotRuntime` orchestrating IO, worker, and log threads against a
`donglora.Dongle` instance.
- ADVERT scheduler with IQR-trimmed mean position derived from heard
repeater adverts.
- Typed `TxQueue` with retry / ack tracking against MeshCore message
IDs.
- DM reply pipeline that calls Claude off the IO loop and enqueues
reply packets at the right priority.
- Structured JSONL event log at `~/.donglora/orac-events.jsonl`.
- `just run` / `just check` / `just events` developer ergonomics.
- `donglora>=1.0.0,<2.0.0` declared as the registry dep; local dev
uses the `[tool.uv.sources]` editable-path override.
### Notes
- Not published to PyPI. Installed from a local checkout only; this
1.0.0 tag captures the point at which the bot runs against the
Protocol v2 stack (`donglora` 1.0 / `donglora-mux` 1.0 /
`donglora-protocol` 1.0).
+2 -2
View File
@@ -310,8 +310,8 @@ def build_advert_payload() -> bytes:
timestamp = struct.pack("<I", int(time.time()))
name_bytes = BOT_NAME.encode("utf-8")
if heard_position_count() >= 5 and (avg := average_heard_position()) is not None:
lat_i = int(round(avg[0] * 1_000_000))
lon_i = int(round(avg[1] * 1_000_000))
lat_i = round(avg[0] * 1_000_000)
lon_i = round(avg[1] * 1_000_000)
# flags: has_name (0x80) | has_location (0x10) | chat node (0x01)
app_data = bytes([0x91]) + struct.pack("<ii", lat_i, lon_i) + name_bytes
else:
+1 -1
View File
@@ -17,7 +17,7 @@ log = logging.getLogger("orac")
# ── Persistent state ─────────────────────────────────────────────
_state: dict[str, dict[str, object]] = {
_state: dict[str, dict[str, object] | list[list[float]]] = {
"channel_history": {}, # channel_name -> list of messages
"dm_history": {}, # peer_pubkey_hex -> list of messages
"known_nodes": {}, # pubkey_hex -> {"name": str, "seen": float}
+2 -2
View File
@@ -1,12 +1,12 @@
[project]
name = "donglora-ai-bot"
version = "0.1.0"
version = "1.0.0"
description = "MeshCore AI chatbot — default mesh name 'Orac'"
license = "MIT"
requires-python = ">=3.10"
authors = [{ name = "Stephen Waits" }]
dependencies = [
"donglora",
"donglora>=1.0.0,<2.0.0",
"anthropic",
"cobs",
"pyserial",
Generated
+2 -2
View File
@@ -178,7 +178,7 @@ wheels = [
[[package]]
name = "donglora"
version = "0.2.0"
version = "1.0.0"
source = { editable = "../client-py" }
dependencies = [
{ name = "cobs" },
@@ -206,7 +206,7 @@ dev = [
[[package]]
name = "donglora-ai-bot"
version = "0.1.0"
version = "1.0.0"
source = { virtual = "." }
dependencies = [
{ name = "anthropic" },