Commit Graph
100 Commits
Author SHA1 Message Date
bc3ddd626b docs: add GitHub PR template (#227)
Adds a .github/PULL_REQUEST_TEMPLATE.md with sections for summary,
type of change, screenshots, testing steps, and project-specific
checklist items (HermesScaffold, NavigationController, room schema,
screen dedup check).

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-21 10:29:03 +03:00
a5c070b353 ux: swap positions of new chat and search buttons in top bar (Issue #212) (#226)
Swapped the order of the Search toggle and New Chat icon buttons
in the ChatScreen top bar actions slot. Search is now on the left
(right-side outer position) which matches user expectations —
the new chat button was accidentally tapped when reaching for search.

Fixes #212

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-21 10:24:32 +03:00
M57andGitHub 4e8da7b90c fix(security): allow cleartext traffic globally to support LAN IP connections (#200)
* feat(skills): add category and status filters (#111)

* fix(security): allow cleartext traffic globally to support LAN IP connections
2026-06-21 01:09:28 +03:00
M57andGitHub 63575272c9 feat(skills): add category and status filters (#111) (#199) 2026-06-21 00:49:58 +03:00
M57andGitHub 081996d376 refactor: extract entryProvider from MainNavigation (#197)
Extract the overly long `entryProvider` lambda out of `MainNavigation` into a separate `appEntryProvider` function to improve code readability and maintainability.
2026-06-21 00:31:59 +03:00
M57andGitHub f7a334ecfd Refactor CronExpressionFormatter to improve maintainability (#192)
Extract logic from a single long method `cronToHumanReadable` into distinct parser helpers for shortcuts, day of month, days of week, and general time handling. Move repetitive static properties and small format helpers to the object scope.
2026-06-21 00:30:02 +03:00
M57andGitHub 5e90a4d1a7 fix(chat): conditional auto-scroll on new messages (#131) (#193) 2026-06-21 00:29:26 +03:00
M57andGitHub 00c6e75f50 feat(connect): saved connection profiles support (#107) (#191)
* feat(#107): implement saved connection profiles support

* fix(connect): fallback profiles resolution and stubbing in tests
2026-06-21 00:18:35 +03:00
M57andGitHub 0eed12d18e Refactor: Extract hardcoded "todo" to constant in KanbanScreen (#190)
- Extracted the hardcoded string "todo" to a `DEFAULT_COLUMN` constant in `KanbanScreen.kt` to improve code health and readability.
- Replaced the hardcoded string literal in the `viewModel.createTask` call with the new constant.
2026-06-21 00:17:37 +03:00
M57andGitHub 63a927fae2 chore: Update softprops/action-gh-release to v3 to use Node 24 (#189)
Fixes the deprecation warning for Node 20 by bumping the action version.
2026-06-21 00:15:29 +03:00
M57andGitHub 60c4096e9c Performance improvement for chat search filtering (#188) 2026-06-21 00:00:36 +03:00
M57andGitHub 4547861c71 test: Add HermesWsClient test (#187) 2026-06-20 23:56:04 +03:00
M57andGitHub 49fd12ac34 fix(#115): send enabled flag on config save and propagate configuration errors (#186) 2026-06-20 23:54:43 +03:00
M57andGitHub 2b7facb7f4 Add NetworkResult Test for SafeApiCall and Mapping (#185)
* Add tests for NetworkResult and safeApiCall

* Fix ktlint errors formatting
2026-06-20 23:52:23 +03:00
M57andGitHub 045932ca8b Optimize collection creation in Navigation.kt (#180)
* ⚡ Optimize collection creation in Navigation.kt

Replaced uses of `.map { ... }.toSet()` with `.mapTo(mutableSetOf()) { ... }` in Navigation.kt. This avoids the creation of intermediate ArrayList objects, saving unnecessary memory allocations.

* ⚡ Optimize collection creation in Navigation.kt

Replaced uses of `.map { ... }.toSet()` with `.mapTo(mutableSetOf()) { ... }` in Navigation.kt. This avoids the creation of intermediate ArrayList objects, saving unnecessary memory allocations. Fixed ktlint formatting issues causing CI failure.
2026-06-20 23:44:39 +03:00
M57andGitHub 81b2ff3aa5 Add error path coverage for CronExpressionFormatter (#182)
* test: add error path coverage for CronExpressionFormatter

Added a new test case to cover the fallback code path when cron parsing throws an exception. This test ensures the formatting correctly defaults to returning "Raw: <schedule>" when an invalid string like '0 12 1 15 *' or '0 9 * * 8' is passed.

It also introduces mockk integration to mock android.util.Log which prevents RuntimeExceptions from being thrown during local JUnit tests when logging errors in the catch block.

* test: add error path coverage for CronExpressionFormatter and fix ktlint issues

Added a new test case to cover the fallback code path when cron parsing throws an exception. This test ensures the formatting correctly defaults to returning "Raw: <schedule>" when an invalid string like '0 12 1 15 *' or '0 9 * * 8' is passed.

It also introduces mockk integration to mock android.util.Log which prevents RuntimeExceptions from being thrown during local JUnit tests when logging errors in the catch block.

Also removed trailing whitespace and an empty line at the start of the class to fix ktlint checking in CI.
2026-06-20 23:43:46 +03:00
M57andGitHub 34af34af6d perf: avoid intermediate allocation in bottomNavKeys (#184)
Replaces `.map { ... }.toSet()` with `.mapTo(mutableSetOf()) { ... }`
when resolving `bottomNavKeys` to avoid creating and discarding an
intermediate `ArrayList` during recomposition.
2026-06-20 23:42:40 +03:00
M57andGitHub 3eb9e09f86 test: Add tests for malformed Base64 decoding in ConnectViewModel (#183) 2026-06-20 23:41:31 +03:00
M57andGitHub 838b888f9b ⚡ Optimize Set creation in ChatViewModel (#181)
Refactored `chatMessages.map { it.id }.toSet()` to `chatMessages.mapTo(HashSet(chatMessages.size)) { it.id }` to avoid creating and discarding an unnecessary intermediate ArrayList.

Benchmark results show a ~31% performance improvement on 5000 iterations for typical sizes.
2026-06-20 23:38:36 +03:00
M57andGitHub d44df3f339 fix(#102): add EmptyState views for successful empty responses across data screens (#179) 2026-06-20 23:27:17 +03:00
M57andGitHub d1f4e9eb67 fix(#67): restrict cleartext traffic to local subnets and Tailscale range (#178) 2026-06-20 23:17:00 +03:00
M57andGitHub f2e11413cc fix(#66): enable room schema export and configure release migration safe-guards (#177) 2026-06-20 22:57:08 +03:00
M57andGitHub a315c9d3d4 fix(#63): require keystore env variables for release builds (#176)
* fix(#63): require keystore env variables for release builds

* fix(ci): conditionalize signing requirement to release tasks only
2026-06-20 22:47:46 +03:00
M57andGitHub 64a047f095 feat: move session history to a dedicated history screen (#175)
* feat: move session history to a dedicated history screen

Closes #159.

* fix(ci): fix ktlint style issues and unresolved NavigationController reference
2026-06-20 22:27:54 +03:00
M57andGitHub d862172d78 fix(nav): keep NavKey implementation names in proguard (#174)
Avoid obfuscating screen classes/objects since their simpleNames are matched for bottom nav setup.
2026-06-20 17:54:58 +03:00
M57andGitHub 82f2a5142f ci: update release workflow to Node.js 24 and setup-gradle validation (#173)
Closes #171.
2026-06-20 17:49:41 +03:00
M57andGitHub 54a195bd94 fix(auth): initialize AuthManager in custom application class (#172)
Closes #68. Redundant initialization in MainActivity has been removed.
2026-06-20 17:43:40 +03:00
M57andGitHub a50628696f test(#100): add unit test to verify upsert for completion-only message (#170) 2026-06-20 17:38:07 +03:00
M57andGitHub 8763271056 fix(#101): collect events once in init to prevent duplicate collectors on reconnect (#169) 2026-06-20 17:32:24 +03:00
M57andGitHub 74714fc1df fix(#99): gate tool and clarify events by session id to prevent leaks (#168) 2026-06-20 17:27:34 +03:00
M57andGitHub 6cb4e17882 fix(#127): serialize tool event data to JSON for pretty formatting (#167)
* fix(#127): serialize tool event data to JSON for pretty formatting

* fix(test): format tool start test case to satisfy ktlint
2026-06-20 17:22:28 +03:00
3c5fcf504c feat(#154): add word-by-word typing effect toggle and speed slider in settings (#165)
* feat(#154): add word-by-word typing effect toggle and speed slider in settings

* fix(settings): import Slider to fix build failure

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 17:09:42 +03:00
M57andGitHub 8c9c11df23 refactor(#103): centralize navigation mutations through NavigationController.resetTo() (#164)
* refactor(#103): centralize navigation mutations through NavigationController.resetTo()

* fix(chat): fix scroll-to-bottom FAB compilation errors
2026-06-20 17:01:37 +03:00
ff4649b601 fix(#130): fix compilation errors in scroll-to-bottom FAB (#166)
* fix(#130): fix compilation errors in scroll-to-bottom FAB

* fix(#130): add missing R import, context, and string resources

* fix(#130): use stringResource() instead of context.getString() for Compose lint

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 16:45:05 +03:00
03cfcf8504 feat(#125): fix clarify input pre-filling and parse/route clarify_id (#156)
* feat(#125): fix clarification input pre-filling and parse/route clarify_id

* fix(#156): fix ktlint violations in ChatViewModelTest.kt

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 16:35:58 +03:00
4544d88f8d feat(#130): add scroll-to-bottom FAB that appears when user scrolls up (#163)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 14:12:25 +03:00
ca21e22147 ci(#71): change FGS type from dataSync to remoteMessaging for indefinite WebSocket listener (#162)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 14:07:46 +03:00
87392f5e57 fix(#148): prevent chatTitle being overwritten by response handlers (#161)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 14:04:59 +03:00
0ec70beb84 refactor(#104): prune unused ChatMessageDao APIs and stale test stubs (#160)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 13:57:51 +03:00
3f19224228 feat(#123): add primary screens to drawer categorically (#158)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 13:46:08 +03:00
c6d7a45905 fix(#135): guard goBack() against empty back stack (#157)
goBack() now uses ChatScreen as a fallback when the stack has
only one item, preventing the Settings back-button crash.

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 13:29:19 +03:00
M57andGitHub 62b1115924 Merge pull request #155 from Hy4ri/feat/issue-125-clarification-respond-routing
feat(#125): pre-fill clarification input and route response via clarify.respond
2026-06-20 12:57:31 +03:00
M57andGitHub 399691ed34 Merge pull request #153 from Hy4ri/feat/issue-125-clarification-input
feat(#125): add free-form text input and guidelines to ClarifyDialog
2026-06-20 12:33:16 +03:00
M57andGitHub 42f8cfe509 Merge pull request #152 from Hy4ri/fix/issue-146-lost-replies
fix(#146): finalize active streaming message before tool execution or new message start
2026-06-20 12:20:55 +03:00
M57andGitHub 196883b5c1 Merge pull request #151 from Hy4ri/refactor/chat-system-stability
refactor: stabilize chat system streaming, session loading, and connection state
2026-06-20 12:12:26 +03:00
a2d299e136 feat(#129): remove redundant source archive, add About version card in Settings (#149)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 10:30:18 +03:00
f5edf1569c fix(#141): notification tap opens original session instead of new session (#147)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 10:10:10 +03:00
ae62b05e6d fix(#144): add timestamp to tool/command message bubbles (#145)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 10:01:44 +03:00
7248f66abf feat(#136): visible copy button overlay on long-press of message bubbles (#143)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-20 09:46:10 +03:00
113467a99d fix(#140): fix skills content API endpoints — path params to query params (#142)
Co-authored-by: ronia <ronia@m57>
2026-06-20 02:43:26 +03:00
261ee6379a feat(#132): dynamic session title with ellipsis truncation (#139)
Co-authored-by: ronia <ronia@m57>
2026-06-20 02:37:55 +03:00
913c6fa878 fix(#134): remove settings button from chat top bar (#138)
Co-authored-by: ronia <ronia@m57>
2026-06-20 02:28:36 +03:00
27ac4d72a4 fix(#133): only show status dot red when offline, hide when connected (#137)
Co-authored-by: ronia <ronia@m57>
2026-06-20 02:25:29 +03:00
M57andGitHub 61d49d2355 fix(chat): don't reload cached msgs on SESSION_RESUME ack 2026-06-20 00:54:16 +03:00
M57andGitHub 0fabad820d fix(chat): fix old session resume losing server session ID
* fix(chat): reset agent typing status when resuming old sessions

* fix(chat): fix race condition in websocket request registration

* test(chat): update mocks for new send/sendMessage onSent callback

* style(chat): use named onSent param instead of trailing lambda

* style(chat): fix import ordering for ConcurrentHashMap

* test(chat): fix remaining 2-arg verify calls for send()
2026-06-20 00:40:16 +03:00
M57andGitHub 46b24593f9 feat(#58): implement skill markdown/yaml editor UI (#121) 2026-06-19 23:58:34 +03:00
M57andGitHub 022e9de195 Merge pull request #120 from Hy4ri/feat/issue-116-notification-reply
feat(#116): add direct reply action to background notifications
2026-06-19 23:48:55 +03:00
M57andGitHub ad508be0fa Merge pull request #119 from Hy4ri/feat/issue-114-chat-notification
fix(#114): separate notification channels and set service to low priority
2026-06-19 23:41:27 +03:00
M57andGitHub b1c628ee24 Merge pull request #118 from Hy4ri/feat/issue-60-tool-json-parsing
feat(#60): human-readable tool JSON parsing in chat
2026-06-19 23:32:27 +03:00
M57andGitHub 85dc48fcd6 Merge pull request #117 from Hy4ri/revert-pr-42
Revert "Merge pull request #42 from Hy4ri/feat/sessions-screen"
2026-06-19 23:24:36 +03:00
M57andGitHub 7d50b5acd7 Merge pull request #42 from Hy4ri/feat/sessions-screen
feat: dedicated Sessions browser screen (Issue #40)
2026-06-19 23:14:40 +03:00
M57andGitHub ee97be50cb Merge pull request #113 from Hy4ri/refactor/issue-79-retrofit-error-handling
fix(#79): centralize retrofit error handling with NetworkResult
2026-06-19 23:03:21 +03:00
43df3c6e73 fix(#64): call wsClient.disconnect() directly in onCleared() instead of launching on cancelled scope (#94)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 22:18:04 +03:00
abcec14cb5 feat(#76): add testTag identifiers to composable elements for UI test targeting (#98)
Adds testTag modifiers to key interactive elements across the core
composables, enabling Espresso/Compose UI tests to locate them:

Navigation.kt  — 'nav_*' on bottom bar items, 'drawer_*' on drawer items
HermesScaffold — 'back_button', 'menu_button', 'refresh_button'
StateViews.kt  — 'loading_state', 'loading_spinner', 'error_retry_button',
                 'empty_state_action'
ChatScreen.kt  — 'chat_input', 'send_button', 'interrupt_button'

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 22:15:53 +03:00
cc52442be3 fix(#65): request POST_NOTIFICATIONS runtime permission on Android 13+ (#97)
* fix(#65): request POST_NOTIFICATIONS runtime permission on Android 13+

On API 33+ the manifest declaration alone is not enough — the app must
request POST_NOTIFICATIONS via ActivityResultContracts.RequestPermission
at runtime before it can show any notification, including the foreground
service notification from ChatNotificationService.

- Added rememberLauncherForActivityResult for POST_NOTIFICATIONS
- Added LaunchedEffect(Unit) that fires the permission request on first
  composition when running on API 33+ and permission is not yet granted
- The next lifecycle event (ON_STOP → NotificationHelper.start) picks
  up the permission if granted

* fix: add missing import android.os.Build for POST_NOTIFICATIONS permission check

* fix: add missing import for rememberLauncherForActivityResult (androidx.activity.compose)

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 22:15:47 +03:00
27a896c634 docs(#70): sync project structure in README with actual codebase (#96)
- Removed references to HermesControlApp.kt, EmptyState.kt, LoadingState.kt
  (none of these files exist)
- Replaced with StateViews.kt, SharedComponents.kt
- Added data/ws/ (WebSocket TUI Gateway layer)
- Added notification/ (ChatNotificationService foreground service)
- Added util/ (CronExpressionFormatter)
- Added missing theme files: HermesStatusColors.kt, Spacing.kt, Shapes.kt
- Added settings/ and connect/ screen directories

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 22:15:41 +03:00
451412851f fix(#69): replace mipmap launcher icon with proper notification vector drawable (#95)
Notification smallIcon must use a simple mono vector drawable, not a
launcher mipmap. Launcher icons render broken in the status bar on
many devices.

- Added app/src/main/res/drawable/ic_notification.xml (simple info icon)
- Updated both showReplyNotification and buildForegroundNotification to
  reference R.drawable.ic_notification instead of R.mipmap.ic_launcher

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 22:15:36 +03:00
607a1b0439 fix(#73): surface clear errors for malformed pairing strings instead of silent fallback
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 21:09:19 +03:00
6375e3fa1d fix(#74): mark unparseable cron expressions instead of silently returning raw
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 20:52:44 +03:00
11d97a2d5f fix(#75): replace non-null assertion on simpleName with safe mapNotNull
* ci: prevent concurrency cancellation on rapid main merges

The concurrency group used github.ref which is static for main
(refs/heads/main). When multiple PRs merged rapidly (~2 min apart),
each merge commit cancelled the previous CI run before it could finish.

Fix: use github.sha for push events to main (unique per commit) while
keeping the ref-based group for PR branches (cancels on new commits to
the same PR branch).

* refactor(#82): remove dead SkeletonList/SkeletonCard composables

* fix(#72): echo server's WebSocket close code instead of hardcoded 1000

* fix(#75): replace non-null assertion on simpleName with safe mapNotNull

---------

Co-authored-by: ronia <ronia@m57>
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 20:48:48 +03:00
16e5973dc9 fix(#72): echo server's WebSocket close code instead of hardcoded 1000
* ci: prevent concurrency cancellation on rapid main merges

The concurrency group used github.ref which is static for main
(refs/heads/main). When multiple PRs merged rapidly (~2 min apart),
each merge commit cancelled the previous CI run before it could finish.

Fix: use github.sha for push events to main (unique per commit) while
keeping the ref-based group for PR branches (cancels on new commits to
the same PR branch).

* refactor(#82): remove dead SkeletonList/SkeletonCard composables

* fix(#72): echo server's WebSocket close code instead of hardcoded 1000

---------

Co-authored-by: ronia <ronia@m57>
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 20:45:42 +03:00
24847cf0d6 refactor(#82): remove dead SkeletonList/SkeletonCard composables
* ci: prevent concurrency cancellation on rapid main merges

The concurrency group used github.ref which is static for main
(refs/heads/main). When multiple PRs merged rapidly (~2 min apart),
each merge commit cancelled the previous CI run before it could finish.

Fix: use github.sha for push events to main (unique per commit) while
keeping the ref-based group for PR branches (cancels on new commits to
the same PR branch).

* refactor(#82): remove dead SkeletonList/SkeletonCard composables

---------

Co-authored-by: ronia <ronia@m57>
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-19 20:45:37 +03:00
b0ba1b7f00 ci: prevent concurrency cancellation on rapid main merges
The concurrency group used github.ref which is static for main
(refs/heads/main). When multiple PRs merged rapidly (~2 min apart),
each merge commit cancelled the previous CI run before it could finish.

Fix: use github.sha for push events to main (unique per commit) while
keeping the ref-based group for PR branches (cancels on new commits to
the same PR branch).

Co-authored-by: ronia <ronia@m57>
2026-06-19 20:33:36 +03:00
M57andGitHub 8519add306 Merge pull request #87 from Hy4ri/fix/release-source-archive-dir
ci(release): add missing mkdir -p release before source archive
2026-06-19 20:25:32 +03:00
M57andGitHub a026e750f3 Merge pull request #86 from Hy4ri/refactor/issue-81-remove-commandpanel
[refactor] Delete dead CommandPanel component (#81)
2026-06-19 20:21:00 +03:00
M57andGitHub 637cbd73f5 Merge pull request #85 from Hy4ri/refactor/issue-80-proguard-coroutines
[refactor] Remove blanket coroutines keep rule from ProGuard (#80)
2026-06-19 20:19:43 +03:00
a8600668c2 docs: add AGENTS.md with build, style, and workflow guidance for AI coding agents (#84)
Co-authored-by: ronia <ronia@m57>
2026-06-19 20:17:55 +03:00
M57andGitHub 209ce331b8 Merge pull request #83 from Hy4ri/refactor/issue-77-remove-workmanager
[refactor] Remove unused WorkManager dependency (#77)
2026-06-19 20:13:37 +03:00
M57andGitHub 028b490fd3 Merge pull request #62 from Hy4ri/fix/issue-45-ws-stuck
Fix WebSocket connection stuck on subsequent launches (Issue #45)
2026-06-19 20:05:36 +03:00
M57andGitHub 6b9bab9c25 Merge pull request #61 from Hy4ri/fix/issue-59-keyboard-gap
Consume window insets in NavDisplay to eliminate keyboard gaps (Issue #59)
2026-06-19 19:49:56 +03:00
M57andGitHub 379c9e07e7 Merge pull request #57 from Hy4ri/fix/issue-44-chat-search
Fix chat search breaking vertical scrolling and layout (Issue #44)
2026-06-19 19:41:20 +03:00
M57andGitHub 95b6106b4c Merge pull request #55 from Hy4ri/feat/source-archive-release
feat: attach source code archive to release assets (closes #54)
2026-06-19 19:00:48 +03:00
M57andGitHub 77ed9c9120 Merge pull request #56 from Hy4ri/fix/issue-51-cron-human-readable
Implement human-readable cron schedule formatter (Issue #51)
2026-06-19 19:00:40 +03:00
M57andGitHub 3e093aaa72 Merge pull request #53 from Hy4ri/fix/issue-47-reorder-nav-items
feat: add bottom nav reordering in settings (closes #47)
2026-06-19 18:46:09 +03:00
M57andGitHub 9d5e46e769 Merge pull request #52 from Hy4ri/fix/issue-48-chat-input-space
fix: remove space between bottom bar and chat input field (closes #48)
2026-06-19 18:45:07 +03:00
M57andGitHub a7fcfd4088 Merge pull request #50 from Hy4ri/fix/issue-49-always-show-bottom-bar
fix: keep bottom navigation bar always visible (closes #49)
2026-06-19 18:36:26 +03:00
M57andGitHub 2e56e2d9da Merge pull request #46 from Hy4ri/fix/issue-43-bottom-navbar
fix: bottom navbar updates dynamically (closes #43)
2026-06-19 18:29:21 +03:00
M57andGitHub 1b188b6b31 Merge pull request #41 from Hy4ri/fix/release-signing
fix: sign release APKs with stable keystore from secrets
2026-06-19 17:44:19 +03:00
59e0d4f817 feat: search within chat history (Issue #31) (#39)
- Add search icon toggle in top bar with animated search field
- Real-time message filtering on search query match
- Match counter with previous/next navigation arrows
- Case-insensitive text highlighting in user and assistant bubbles
- Dismiss search restores full message list
- Empty state for no search results

Co-authored-by: ronia <ronia@m57>
2026-06-19 16:35:07 +03:00
M57andGitHub fb605d1bc0 feat: clickable URLs and long-press copy in chat bubbles (Issues #29, #30) (#36)
Add clickable URL detection with primary color + underline styling and browser launch via UriHandler. Add long-press to copy raw message text to clipboard for both user and assistant chat bubbles.

Fixes #29, Fixes #30
2026-06-19 14:16:56 +03:00
M57andGitHub 2cfe1f71fc fix: bottom navigation bar customization not reflected in NavigationBar (Issue #37)
fix: bottom navigation bar customization not reflected in NavigationBar (Issue #37)
2026-06-19 13:36:25 +03:00
M57andGitHub 66da56ca24 feat: connection status indicator in drawer (Issue #28)
feat: connection status indicator in drawer (Issue #28)
2026-06-19 12:40:32 +03:00
M57andGitHub 27e513f0a3 feat: show app version in Settings screen (Issue #32)
feat: show app version in Settings screen (Issue #32)
2026-06-19 12:39:20 +03:00
M57andGitHub 0f6625c66e fix: migrate deprecated Compose/Room APIs (Issues #25, #26, #27)
fix: migrate deprecated Compose/Room APIs (Issues #25, #26, #27)
2026-06-19 12:38:16 +03:00
M57 0038606c05 feat: add connection status indicator (Issue #28)
Adds a colored dot next to the '⚡ Hermes' brand header in the
navigation drawer:
  - Green: connected
  - Yellow: connecting / reconnecting
  - Red: disconnected

Uses a StateFlow on HermesWsClient that tracks the WebSocket
connection lifecycle and is collected in the drawer header.
2026-06-19 12:07:44 +03:00
M57 12c60dce16 feat: show app version in Settings screen (Issue #32)
Displays version name and build code at the bottom of the Settings
screen using BuildConfig.VERSION_NAME and VERSION_CODE.
2026-06-19 12:03:37 +03:00
M57 1c1961426a fix: migrate deprecated APIs (Issues #25, #26, #27)
- Icons.Filled.ArrowBack/ListAlt → Icons.AutoMirrored.Filled (Issue #25)
- ScrollableTabRow → PrimaryScrollableTabRow (Issue #26)
- fallbackToDestructiveMigration() → fallbackToDestructiveMigration(false) (Issue #27)
2026-06-19 12:02:07 +03:00
M57andGitHub 0fa61148a3 Create LICENSE 2026-06-18 22:28:27 +03:00
M57andGitHub 34df198c4d feat: configurable bottom navigation bar (Issue #23)
## What
Adds a new Navigation Bar section to Settings where users can customize which items appear in the bottom navigation bar.

## Features
- Pick from any of the 19 drawer screens (max 5 items)
- Remove items with a close/delete button
- Items persist via SharedPreferences (CSV format)
- Invalid names are silently dropped
- Existing screens and auth-aware filtering respected

Closes #23
2026-06-18 21:16:21 +03:00
837678c590 fix(#21): remove double spacing above top bar and below chat input (#22)
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-18 20:36:56 +03:00