Compare commits

..
4 Commits
Author SHA1 Message Date
swaitsandClaude Opus 4.7 a5a7b29764 feat(channels): listen on #development (KDF-derived PSK)
Add #development to the built-in hashtag channel set; its PSK is
derived from the channel name via the standard MeshCore hashtag KDF.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 13:34:58 -06:00
swaitsandClaude Opus 4.7 e2ecbc747d fix(ai): forbid preamble in response-shortener output
Tighten the system/user prompts so the shortener returns ONLY the
rewritten message — no "Here's a version at N characters:" preamble,
no quotes, no labels. Previously such preamble was being transmitted
on-air and consumed the byte budget, causing the actual content to
truncate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 13:34:29 -06:00
swaits 61cb91c490 fix(meshcore): use correct syncword 2026-05-11 14:46:34 -06:00
swaits d92b6cb950 chore(deps): bump donglora to 1.1.0 for per-board tx_power clamping 2026-04-25 20:46:50 -06:00
6 changed files with 22 additions and 10 deletions

No files matched your search

+11 -1
View File
@@ -50,10 +50,20 @@ def _shorten_with_claude(text: str, max_chars: int) -> str:
model="claude-sonnet-4-6",
max_tokens=256,
timeout=CLAUDE_TIMEOUT_S,
system=(
"You rewrite a message to fit within a strict character budget. "
"Output ONLY the rewritten message — no preamble, no quotes, no "
"explanation, no commentary, no labels, no character count. "
"Preserve the original meaning, tone, and voice. Plain text only."
),
messages=[
{
"role": "user",
"content": f"Shorten this to {max_chars} characters: {text}",
"content": (
f"Rewrite the following message so it is at most "
f"{max_chars} characters. Reply with the rewritten "
f"message only.\n\n{text}"
),
}
],
)
+3 -2
View File
@@ -178,8 +178,9 @@ def connect_and_run(port: str | None) -> None:
boot("Connecting...")
# `dl.connect()` auto-discovers the port, sends GET_INFO, applies
# RADIO_CONFIG via SET_CONFIG, and starts the keepalive daemon —
# no manual Ping/SetConfig/StartRx dance required.
# RADIO_CONFIG via SET_CONFIG (with `tx_power_dbm` auto-clamped to
# the device's PA ceiling — SX1262 caps at 22 dBm, SX1276 PA_BOOST
# at 20), and starts the keepalive daemon.
dongle = dl.connect(port=port, timeout=2, config=RADIO_CONFIG)
boot("Connected")
+5 -5
View File
@@ -52,11 +52,11 @@ RADIO_CONFIG: dl.LoRaConfig = dl.LoRaConfig(
bw=dl.LoRaBandwidth.KHZ_62_5,
sf=7,
cr=dl.LoRaCodingRate.CR_4_5,
sync_word=0x3444,
tx_power_dbm=22, # DongLoRa Protocol v2 removed the "max power" sentinel; 22 dBm
# is the SX1262 chip ceiling and the practical upper bound on every
# current DongLoRa board. If you operate a board with a lower cap,
# lower this (or read `d.info.tx_power_max_dbm` and rebuild the config).
sync_word=0x1424,
tx_power_dbm=22, # Requested max. `connect_and_run` clamps this down to
# `dongle.info.tx_power_max_dbm` at connect time, so each board
# transmits at its own PA ceiling (SX1262: 22 dBm, SX1276 PA_BOOST:
# 20 dBm, …) without needing a per-board config table here.
preamble_len=16,
header_mode=dl.LoRaHeaderMode.EXPLICIT,
payload_crc=True,
+1
View File
@@ -256,6 +256,7 @@ _BUILTIN_HASHTAG_CHANNELS: tuple[str, ...] = (
"#weather",
"#protest",
# --- Dev / testing ---
"#development",
"#devtest",
"#devtestdevtest",
)
+1 -1
View File
@@ -6,7 +6,7 @@ license = "MIT"
requires-python = ">=3.10"
authors = [{ name = "Stephen Waits" }]
dependencies = [
"donglora>=1.0.0,<2.0.0",
"donglora>=1.1.0,<2.0.0",
"anthropic",
"cobs",
"pyserial",
Generated
+1 -1
View File
@@ -178,7 +178,7 @@ wheels = [
[[package]]
name = "donglora"
version = "1.0.0"
version = "1.1.0"
source = { editable = "../client-py" }
dependencies = [
{ name = "cobs" },