Skip to content

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 10:47
dbb5f1e

1.3.0 (2026-09-08)

Features

  • bridge: bound and cancel automatic media downloads (#348) (4c5ed3b), closes #320
  • bridge: cache group rosters in a group_members table (#327) (3f51ce6)
  • bridge: mark a whole chat read without listing message IDs (#304) (ff2745f), closes #291
  • bridge: store mentions and expose the owner identity (#326) (952afc8)
  • mcp: a per-tool latency histogram on /metrics (#359) (0bbb1eb), closes #322
  • mcp: bridge_status reports the published endpoint certificate expiry (#300) (a2e54d7), closes #277
  • mcp: bridge_status reports whether whisper is available (#295) (1a99299), closes #284
  • mcp: chat_jid takes a list, exclude_chat_jid mirrors it, message_stats counts a query (#303) (40320d4), closes #289
  • mcp: coverage reports the voice-note transcription backlog (#363) (42141f4), closes #334
  • mcp: coverage takes a window and lists which chats to backfill (#311) (56c900c)
  • mcp: get_contact_chats includes the groups a contact belongs to (#340) (8aad048), closes #288
  • mcp: mark a chat handled or snoozed so list_unanswered stops repeating it (#328) (52d1213), closes #287
  • mcp: mentions_me filter and group mentions in triage (#330) (d763f48)
  • mcp: notes for chats, contacts and messages (#306) (58319eb)
  • mcp: notes inline in listings, compact for append keys (#308) (b473bf5), closes #286
  • mcp: rank audio hits with an FTS5 index over transcripts (#299) (85b5a73), closes #275
  • mcp: read_media returns the file's bytes, not a server path (#325) (217365f)
  • mcp: read_media(as_text=True) reads PDF, DOCX and XLSX as text (#329) (6f6863c)
  • mcp: return the name a contact gave themselves beside the one you saved (#310) (9ac3ffa), closes #280
  • mcp: sanitise name fields instead of wrapping them (#302) (4cf4c12), closes #273
  • mcp: TRANSCRIBE_ON_INGEST can fetch uncached voice notes (#296) (3f52ae0), closes #276
  • mcp: triage filters on list_unread, min_messages on list_unanswered (#358) (4fb46cc)

Bug fixes

  • bridge: one canonical UTC spelling for every stored timestamp (#297) (2e525da)
  • bridge: one media transfer per destination file (#345) (b9a1a35), closes #319
  • bridge: repair timestamps an older bridge wrote after the migration (#352) (9a651ab), closes #335
  • bridge: the StreamReplaced delay is a Bridge field, and CI runs -race (#365) (a2669e4)
  • mcp: a page size below 1 is refused instead of paging forever (#356) (da8d2e6), closes #309
  • mcp: denying download_media stops the implicit fetches too (#362) (97a9e7e), closes #350
  • mcp: every matching transcript is a candidate, so a scoped count is exact (#343) (ba90a03), closes #316
  • mcp: keep LIDs out of the phone-number fields (#305) (34401ab), closes #281
  • mcp: note searches walk their matches in bounded batches (#353) (5887c24), closes #315
  • mcp: one listing row for a contact known under both spellings (#364) (f056003)
  • mcp: page messages on the full store key so forwarded copies are not skipped (#342) (c0d5c7a), closes #313
  • mcp: sanitise and wrap the group topic and the poll question (#360) (a1540f6), closes #332
  • mcp: shape list_chats, and refuse arguments no tool declares (#307) (15acb59), closes #282
  • mcp: the ingest walk advances past audio it cannot read (#347) (1194e74), closes #314
  • mcp: the ingest worker obeys the tool policy (#349) (d14b249), closes #331

Performance

  • mcp: context windows seek the neighbours instead of ranking the chat (#344) (a5731e7), closes #312
  • mcp: count a media page's copies instead of the whole archive (#354) (81f0379), closes #317
  • mcp: find a transcript's index entry by rowid instead of reading the index (#346) (145bb5b), closes #321
  • mcp: look a cached file up by name instead of scanning the chat (#357) (4dbfd3d), closes #318