fix/1140-apple-app-names
main
dev
feat/1109-macos-signing
feat/2069-indicator-tags
fix/1128-channel-key-history
feat/1129-sponsor-prompt
fix/1118-factory-reset-delete-on-send
fix/1122-notify-logging
fix/1896-client-slot0-public
feat/1054-factory-reset
fix/1111-osm-identity
feat/523-land-indicators
feat/1108-macos-artifact
feat/1014-ios-app-review
feat/1013-ios-signed-lane
feat/1068-radio-channel-notify
docs/1091-epic-chain
docs/1053-play-automation
fix/1065-vercode-floors
feat/1012-ios-signing-toolchain
docs/958-ios-appstore-plan
fix/1033-scan-location-message
feat/693-offline-app-settings
fix/1009-release-linux-2404
release/1.7.0
epic/870-console-gating
feat/759-fake-radio-integration
feat/758-fake-radio-ci
feat/757-fake-radio-behaviors
feat/756-fake-radio-core
epic/870-remote-cli-permission
feat/842-sync-is-truth
feat/975-settings-restructure
feat/966-clear-stale-history
feat/965-stale-blob-sweep
docs/962-epic-chain
docs/962-reclamation-plan
fix/943-952-storage-migration
feat/940-isolation-integration
feat/939-scope-key-lifecycle
feat/938-blocked-per-radio
feat/937-storage-service-migration
feat/936-scoping-harness
docs/853-isolation-plan
fix/754-discovery-per-radio
feat/920-message-rows
chore/904-docs-proof
feat/919-blob-isolate
fix/927-ci-spike-flag
feat/917-storage-save-path
chore/904-docs-only-ci
docs/857-interop-plan
feat/844-per-radio-notify
fix/812-land-814-815-on-dev
epic/816-integration
epic/814-discover-regions
epic/813-region-protocol
epic/815-channel-scope
docs/812-region-scoping-plan
release/1.6.0
fix/793-log-composer-budget
feat/703-forced-resync
docs/755-plan-flash-fix
docs/755-fake-radio-plan
docs/750-contact-naming-plan
feat/702-lossless-serial
feat/668-contact-sync-guard
feat/610-contact-card-receive
fix/717-linux-web-mtu
feat/638-top-toast
fix/589-late-reply-log-only
fix/663-triage-internal-actors
fix/652-release-prerelease-flag
feat/619-contact-identity-uri
fix/581-ack-adoption
epic/568-export-import
fix/580-caplog-partial
release/1.5.0-beta.1
task/501-deviceui-logging
chore/542-assets2
chore/542-assets
docs/519-claudemd-web
release/1.4.0
feat/483-button-buzzer-ui
fix/497-mention-verbatim
fix/279-send-width
docs/478-docs-home-research
release/1.3.0
fix/443-battery-optimization-warning
fix/447-close-labeler
fix/445-windows-sqlite3-native-assets
feat/429-companion-sync
fix/395-dm-channel-send-wedge
feat/427-localize-log-share
feat/393-app-log-share
fix/share-icon-android
fix/389-back-nav
feat/385-storage-health
release/1.2.2
feat/367-store-consolidation
chore/365-cut-1.2.1
fix/363-pin-db-path
feat/351-contact-settings-menu
feat/349-window-geometry
feat/355-migration-merge
integration/290-306-335
release/1.1.2-rc.3-allplatforms
fix/309-path-len-decode
chore/298-path-logging
fix/285-ingest-timelog
fix/252-block-outgoing-dm
feat/64-observer-config
feat/batch1-ux
chore/offband-rebrand
v1.8.0
v1.7.0
v1.6.0
v1.5.0-beta.1
v1.4.0
v1.3.0
v1.2.2
v1.2.1
v1.2.0
v1.1.2-rc.3-allplatforms
v1.1.2-rc.3
v1.1.2-rc.2
v1.0.0
observer-g2-rc3
observer-g2-rc4
observer-g2-rc5
observer-g2-rc6
observer-g2-rc7
observer-g2-rc8
observer-g2-rc9
preview-1.8.0-1
v1.1.0-rc.1
v1.1.0-rc.2
v1.1.0-rc.3
v1.1.2-beta.1
v1.1.2-beta.2
v1.1.2-beta.3
v1.1.2-ble-test
v1.1.2-queuediag
v1.1.2-rc.1
v1.1.2-rc.1-b45-nearbyrep
v1.1.2-rc.1-b46-pathhash
v1.1.2-rc.1-b47-tracewidth
v1.1.2-rc.1-b48-repeatertrace
v1.1.2-rc.1-b49-maptrace
v1.1.2-rc.1-b50-tracefix
v1.1.2-rc.1-b51-originstrip
v1.1.2-rc.1-b52-channelqr
v1.1.2-rc.1-b53-viarepeater
v1.1.2-rc.1-b54-rxfed
v1.1.2-rc.1-b55-topology
v1.1.2-rc.1-b57-routeux
v1.1.2-rc.1-b58-toporeadout
v1.1.2-rc.3-b59-pathlen
${ noResults }
7 Commits (83f6360f7ec0bd94cf844e1e4ccbb032ef3c879d)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
3b39a16edd |
chore(#462): remove em-dash characters from test/ (and lib top-up)
Follow-up to #457. Swept the em-dash character (U+2014) out of the test tree (test descriptions and comments) and cleaned 8 em-dashes that landed in lib comments via the #456 refactor after #457 merged, so the tree is back to zero. Same rules: replaced with commas/colons/periods, preserved the lone "no data" glyph placeholders, left non-English ARB untouched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
4 months ago |
|
|
1ecf1ce55d |
fix(#389): Back pops out of a channel; only top-level tabs background
AppShell decided top-level vs detail by `selectedIndex != null`, but pushed detail screens (a channel chat, the LOS map) also set selectedIndex to keep the bottom bar visible. So Back from inside a channel backgrounded/left the app instead of popping to the channel list. Decouple the two concerns: add `isTopLevel` (default true), separate from `selectedIndex`. Detail screens pass `isTopLevel: false` (keep the bar, but Back pops). The decision is extracted into a pure `AppShell.backAction` (drawer -> close; detail with a route below -> pop; else -> background), with an assert that a detail is actually poppable. Unit tests cover the matrix; widget tests exercise the real system-Back -> PopScope -> pop wiring. Follow-up #390 tracks the separate AppBar back-arrow path. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
4 months ago |
|
|
d68c6dfdd8 |
fix(#385): surface storage-init failure with a persistent warning
When the database can't open (e.g. the native sqlite library fails to load), every read/write silently failed and the app opened to an empty, normal-looking screen — the user thinks their history was wiped (SAFELANE §6 violation). Probe the storage layer in main() before any store reads (BlobStore.verifyReadWrite). On failure, a StorageHealthService one-way latch records it, and a persistent, non-dismissable banner is shown above the whole app: history is not lost, storage is unavailable, messages are NOT being saved, restart after fixing. Cross-platform (probe goes through drift, covers web too). Tests: service state/latch + banner show/hide widget test. Gemini-reviewed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
4 months ago |
|
|
ad29ea3f0e |
fix(#238): Enter selects the highlighted emoji/mention in autocomplete
The autocomplete only completed an unambiguous emoji on Enter; ambiguous queries (e.g. `:shrug` with multiple matches) sent the literal text instead of the highlighted glyph, and mentions only selected via Tab. Enter now accepts the highlighted item (emoji or mention) like Tab, then sends; Tab still selects without sending, Esc dismisses to send literal text. Removes the now-dead _emojiQuery field. (#231, emoji + mentions per Ben) Widget tests: Enter inserts the highlighted emoji (ambiguous `:shr`) and the highlighted mention (`@Bo` -> @[Bob]). Part of #231. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
4 months ago |
|
|
d39893f120 |
feat(#235): show the reply-to chip above a reply-gif
A reply prepends `@[Name] `, so a reply-gif renders the gif (prior commit); this adds the `@Name` reply chip above it so it is clear the gif is a reply. Extracts TranslatedMessageContent.mentionChip + leadingReplyName (shared by inline rendering and the reply-gif header); the channel bubble builder renders the chip above the GifMessage. DMs have no reply feature, so channel-only. Part of #232. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
4 months ago |
|
|
edd9530c25 |
fix(#235): render inline @[Name] mention chips + reply-gifs
Two shared-root render gaps (message tokens were only matched at fixed positions): - TranslatedMessageContent: parse @[Name] anywhere (leading, inline, or repeated) and render each as a chip; messages without a mention keep full link support (#233). - GifHelper.parseGif: strip a leading `@[Name] ` reply prefix before matching so a reply-with-gif resolves to the gif instead of literal text; arbitrary text before a gif is still left as text (#232). Tests: parseGif reply/format cases + widget tests for inline/leading/multiple mention chips. Full suite 402 green. Part of #233, #232. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
4 months ago |
|
|
d2d7930858 |
fix(#155): manual path entry honors the configured path-hash width
The "Set Path" dialog parsed, built, and displayed hop prefixes as a fixed 1 byte (substring(0,2)), so on a 2-/3-byte path-hash mesh manual entry produced wrong-width routing paths and the helper text claimed "1 byte". Make it width- aware from connector.pathHashByteWidth. - parsePathPrefixes(text, width, invalid): static + testable; each entry must be EXACTLY width*2 hex chars (wrong-length / malformed go to invalid, never silently truncated); width clamped >= 1. - _updateTextFromContacts / display / maxLength group by the configured width; the display substring is guarded against short keys. - show() takes pathHashByteWidth; the chat + path-management callers pass connector.pathHashByteWidth. - l10n: reworded the path-entry helper / example / instructions to be width- agnostic (dropped the "2 hex / 1 byte / first byte" claims). The 17 non-English locales keep their prior strings, flagged for re-translation (English fixed). analyze clean; 6 parsePathPrefixes tests (incl. exact-length + clamp). Gemini v1 BLOCKER (unguarded substring) + MAJOR (silent truncation) fixed; v2 MAJORs were the pre-existing refresh button (out of scope), v2 MINOR (1-byte example) fixed. Closes #155 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
4 months ago |