M57
0f6f6d2a67
Merge pull request #1077 from Hy4ri/fix/update-dialog-download-indicator
...
fix(update): bind live download state to dialog and display real-time progress
2026-09-06 21:42:31 +03:00
M57
6edca8180a
revert(test): restore pristine AppUpdateViewModelTest to avoid MockK agent exhaustion
2026-09-06 21:30:07 +03:00
M57
09fbcf9d24
test(update): prevent coroutine leak across AppUpdateViewModel unit tests
2026-09-06 21:21:41 +03:00
M57
850d01ca89
fix(update): bind live download state to dialog and show real-time progress
2026-09-06 20:59:39 +03:00
M57
fb509c3cae
Merge pull request #1075 from Hy4ri/feat/comprehensive-pr-auto-labeling
...
ci(labeler): expand auto-labeler to 100% path coverage and add notification/assistant labels
2026-09-06 18:35:07 +03:00
M57
beef8478be
Merge branch 'dev' into feat/comprehensive-pr-auto-labeling
2026-09-06 18:34:03 +03:00
M57
629a150c28
Merge pull request #1074 from alexdev03/fix/rotation-preserve-connection
...
fix(lifecycle): preserve connection across activity recreation
2026-09-06 18:33:23 +03:00
M57
f7318325c7
ci(labeler): achieve 100% path coverage and add notification/assistant labels
2026-09-06 18:26:53 +03:00
M57
ae2d0d8494
Merge branch 'dev' into fix/rotation-preserve-connection
2026-09-06 18:21:43 +03:00
M57
230a3dac5b
Merge pull request #1073 from alexdev03/fix/notification-promotion-order
...
fix(notification): defer shutdown until foreground promotion
2026-09-06 18:19:11 +03:00
M57
b9ff160ae4
Merge pull request #1071 from alexdev03/feat/history-automation-sections
...
feat(sessions): separate conversation and automation history
2026-09-05 23:27:28 +03:00
M57
114654867f
fix(sessions): use AutoMirrored KeyboardArrowRight to fix Compose deprecation
2026-09-05 23:19:16 +03:00
M57
1135f05011
refactor(sessions): show job name in automation groups and preserve action labels
2026-09-05 23:02:46 +03:00
M57
fd485a6999
Merge pull request #1067 from alexdev03/fix/bounded-attachment-dispatch
...
fix(chat): bound attachment encoding and recover rejected sends
2026-09-05 16:45:25 +03:00
M57
ad34a51846
Merge branch 'dev' into fix/bounded-attachment-dispatch
2026-09-05 16:34:36 +03:00
M57
67d26697b8
Merge pull request #1068 from Hy4ri/fix/approval-runtime-session-id-4001
...
fix(chat): use runtime session ID in approval RPCs to prevent 4001
2026-09-05 14:12:25 +03:00
M57
aff1b7ed3a
fix(chat): use runtime session ID in approval RPCs to prevent 4001 session not found
2026-09-05 13:15:08 +03:00
M57
20b57af770
Merge pull request #1065 from Hy4ri/fix/bidi-arabic-english-word-isolation
...
fix(bidi): isolate leading and inline English words in RTL paragraphs
2026-09-04 23:35:21 +03:00
M57
5ce01e429b
fix(bidi): isolate leading and inline English words in RTL paragraphs
...
- In parseInlineSource, wrap consecutive Latin/LTR tokens in LTR isolates (LRI...PDI)
when rendering inside an RTL block, preventing leading English terms like "Okay"
from flipping paragraph layout direction and causing BiDi line shuffling.
- Switch textDirection from TextDirection.ContentOrRtl to explicit TextDirection.Rtl
when isRtl is true across MarkdownText, ChatBubble, and GroupChatScreen, preventing
first-strong character fallbacks from overriding resolved paragraph direction.
2026-09-04 23:22:22 +03:00
M57
e71745de1f
feat(group-chat): format structured tool outputs with ToolResultSummary ( #1064 )
2026-09-04 22:50:32 +03:00
M57
199771b798
feat(group-chat): format non-string tool outputs using ToolResultSummary
...
When tools return structured JSON payloads (like skill_view, read_file,
web_search), casting event.data["result"] to String evaluates to null.
Fall back to ToolResultSummary.formatToolResultSummary to format structured
tool payloads into readable text when expanded in group chat cards.
2026-09-04 22:23:04 +03:00
M57
eef4d87f3f
Merge pull request #1063 from Hy4ri/feat/group-chat-turn-timeout-and-profile-fallback
...
fix(group-chat): full desktop parity for turn timeout (180s base + 20m adaptive cap) and multi-profile REST fallback
2026-09-04 22:11:21 +03:00
M57
5888acd6ac
Merge pull request #1062 from Hy4ri/feat/group-chat-turn-timeout-and-profile-fallback
...
fix(group-chat): align turn timeout with desktop (180s) and fix multi-profile REST fallback
2026-09-04 21:22:55 +03:00
M57 and Luna
c34701f4e2
fix(group-chat): full desktop parity for turn timeout (180s base + 20m adaptive cap) and multi-profile REST fallback
...
- Match desktop GROUP_TURN_TIMEOUT_MS (180s) and GROUP_TURN_HARD_CAP_MS (20m)
- Implement adaptive deadline extension: actively streaming tokens or running tools within 60s keeps the turn slot alive up to 20m, preventing long research/terminal runs from getting discarded
- Update LEASE_STEP_TTL_MS to 180s
- Add explicit `@Query("profile") profile: String?` support to `HermesApiService.getSessionMessages`
- Pass `bot.name` explicitly in `GroupChatViewModel` REST fallback so multi-profile bot sessions do not hit 404 under `ProfileScopeInterceptor`
Co-authored-by: Luna <luna.m57@agentmail.to >
2026-09-04 21:11:00 +03:00
M57
31e292d7fe
Merge pull request #1061 from Hy4ri/feat/group-chat-bidi-rtl
...
feat(group-chat): support dynamic BiDi Arabic input and RTL message bubbles
2026-09-04 15:50:02 +03:00
M57 and Luna
fd011ac78d
feat(group-chat): support dynamic BiDi Arabic input and RTL message bubbles
...
- Align GroupChatComposer with ChatComposer (PR #1047 ):
- Dynamic BiDi input detection via BidiUtils.resolveLayoutDirection
- Docks cursor to the right edge and sets TextDirection.Rtl for Arabic
- Preserves LTR outer surface and row to keep send/stop button pinned in place
- User message bubbles: dynamic RTL layout direction and TextDirection.ContentOrRtl
- Bot messages: dynamic TextDirection for bot display name, active speaker thinking row, and tool labels
- Tool code/commands preserved as LTR monospace with BiDi-safe output text
Co-authored-by: Luna <luna.m57@agentmail.to >
2026-09-04 15:38:36 +03:00
M57
2d0d749cbe
Merge pull request #1060 from Hy4ri/feat/group-chat-pass-indicator
...
feat(group-chat): add ephemeral visual pass indicator when bot passes turn
2026-09-04 15:37:22 +03:00
M57 and Luna
1126cf1477
feat(group-chat): add ephemeral visual pass indicator when bot passes turn
...
- Display a subtle centered system pill '[⏩ {bot} passed]' when a bot passes
- Style with Material icon (Icons.Filled.FastForward) and surface tokens
- Keep pass indicators strictly ephemeral to avoid polluting LLM prompt context
- Exclude from cross-device snapshot sync so it disappears on restart/rehydrate
- Add English and Arabic localized string resources
- Update GroupChatViewModelTest to verify pass indicator presence and LLM filtering
Co-authored-by: Luna <luna.m57@agentmail.to >
2026-09-04 15:20:56 +03:00
M57
7ae8977dc3
feat(group-chat): expand tool execution details and terminal output preview ( #1058 )
2026-09-04 14:52:15 +03:00
M57
bd0b4c2d55
feat(chat): full approval.request support ( #1057 )
2026-09-03 22:33:15 +03:00
M57
077ad1fa81
feat(chat): full sudo.request support with expire, cancel-unblock, secret fields ( #1056 )
2026-09-03 22:08:07 +03:00
M57
6d2362ba8a
feat(chat): support multi-select, batch multi-question clarify prompts, and expiry ( fixes #1045 ) ( #1055 )
2026-09-03 21:38:57 +03:00
M57
50773945f9
fix(theme): disable dynamic colors by default to preserve curated preset aesthetics ( #1054 )
2026-09-03 20:32:55 +03:00
M57
8c2d4216a7
feat(chat): display completion timestamp beside copy button on assistant message ( #1053 )
2026-09-03 20:21:43 +03:00
M57
5a79da96f7
fix(chat): restrict @ bot mention suggestions strictly to group chat ( #1052 )
2026-09-03 19:46:38 +03:00
M57
b3439d87c9
feat(chat): support /undo command with transcript reload and composer prefill ( #1051 )
2026-09-03 19:04:43 +03:00
M57
efe6fe81cb
fix(chat): support confirmation dialog when switching to expensive or data-policy models ( #1050 )
2026-09-03 16:56:08 +03:00
M57
fb80be04b4
feat(bots): increase group chat limits to 50/20 with warning banner and confirmation dialog ( #1049 )
2026-09-03 15:41:22 +03:00
M57
78e104f432
feat(bots): add horizontal @ mention suggestion chip bar in group chat ( #1048 )
2026-09-03 14:38:09 +03:00
M57
cd8c27e62b
feat(chat): support dynamic BiDi Arabic input and isolated mixed text in Markdown ( #1047 )
2026-09-03 13:06:03 +03:00
M57
fa17c95296
fix(chat): support batch clarify.request payload and route question_id on respond ( fixes #1045 ) ( #1046 )
2026-09-03 12:50:13 +03:00
M57
dbd7008ee3
feat(chat): support non-Google speech-to-text providers ( fixes #1038 ) ( #1042 )
2026-09-02 12:31:42 +03:00
M57 and M57
4668d482ef
feat(i18n): add Weblate component config and translation docs ( #1041 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-09-02 01:02:17 +03:00
M57
2d0b6ae1a9
fix(history): resolve session resume profile scoping and history pagination ( #1040 )
2026-09-02 00:01:19 +03:00
M57
7c00f4407d
feat(i18n): add comprehensive Arabic localization and RTL layout support ( #1039 )
2026-09-01 21:34:11 +03:00
M57
6ec277af8b
feat(mcp): MCP dashboard enhancements — JSON config import, token overhead badges, and batch health testing ( #1037 )
2026-09-01 20:18:45 +03:00
M57
d8385a2b02
feat(ws): adopt WS ping method for heartbeat and latency tracking ( #1036 )
2026-09-01 19:44:39 +03:00
M57 and M57
21db9bfdab
fix(memory): scope memory endpoints to active profile and auto-reload on profile switch ( #1035 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-09-01 19:20:18 +03:00
M57 and M57
11dd1eff92
feat(chat): live subagent steering and cancellation action sheet ( closes #1030 ) ( #1034 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-09-01 18:19:00 +03:00
M57 and M57
908255f5ad
feat: support session-level hidden flag in SessionListResponse and SessionsScreen ( #1033 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-09-01 16:56:28 +03:00
M57 and M57
ceb4813218
feat(chat): support hierarchical nested subtasks in Todos via parent property ( #1018 ) ( #1028 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-31 22:09:15 +03:00
M57 and M57
3fd9ac767f
feat(ws): adopt event replay via session.events.since on reconnect ( #1016 ) ( #1027 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-31 19:32:17 +03:00
M57 and M57
53c8eca714
feat: adopt side-questions via prompt.btw and /btw command in Chat ( fixes #1015 ) ( #1026 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-31 15:54:09 +03:00
M57 and M57
b5c4ba50cd
ci: smart path filtering to skip heavy Android builds on doc-only PRs ( #1025 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-31 12:43:37 +03:00
M57 and M57
cfe3e736fd
chore: upgrade ktlint to 1.8.0 and format codebase ( #1024 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-31 12:27:40 +03:00
M57
3f3b853758
Merge pull request #1023 from Hy4ri/fix/issue-1020-memory-reset
...
fix: memory screen reset actions serialization error (fixes #1020 )
2026-08-31 11:37:17 +03:00
M57
ad838f696e
chore: add missing imports and fix test closing brace
2026-08-31 11:24:45 +03:00
M57
6b2268004f
Merge pull request #1022 from Hy4ri/dependabot/gradle/dev/latex-1.5.4
...
chore: bump latex from 1.5.3 to 1.5.4
2026-08-31 10:54:53 +03:00
M57
80b73bb000
Merge pull request #1021 from Hy4ri/feat/hide-profiles-locally
...
feat(profiles): add local on-device profile hiding and visibility filtering
2026-08-30 21:08:42 +03:00
M57
cdcecb9734
feat(profiles): add local on-device profile hiding and filtering
2026-08-30 20:51:06 +03:00
M57 and M57
5c8ab7ed6c
feat(bots): smart streaming auto-scroll and scroll-to-bottom FAB in group chat ( #1013 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-30 00:21:02 +03:00
M57 and M57
97b6641d84
feat(bots): emergency stop button and /stop slash command in group chat ( #1012 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-30 00:02:16 +03:00
M57 and M57
bd4a73dd48
feat(bots): horizontal swipe between bots and groups tabs with drawer gesture gating ( #1011 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-29 23:48:08 +03:00
M57 and M57
2f3bf5114d
docs: PR template — add Description section + fix rebase target to dev ( #1010 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-29 22:58:21 +03:00
M57 and M57
174f8dee7d
feat(bots): selectable text, timestamps, and copy buttons in group chat ( #1009 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-29 19:24:51 +03:00
M57 and M57
fbe602cb4f
feat(bots): lightweight tool execution indicators in group chat ( #1008 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-29 19:11:14 +03:00
M57 and M57
0d09f43469
feat(bots): reactive multi-agent group chat orchestration with CAS leasing ( #1007 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-29 18:44:08 +03:00
M57 and M57
7e24f5eba3
fix(bots): sync cross-device group chats and roster from desktop projection ( #1006 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-29 13:56:40 +03:00
M57 and M57
5bc6e5f855
feat(settings): in-app chat font size setting ( #1004 ) ( #1005 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-29 11:36:56 +03:00
M57 and M57
db3f8c736e
feat(markdown): support variable-length code fences and nested codeblocks ( #1003 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-28 20:27:17 +03:00
M57 and M57
7a2c453f58
fix(history): guard fluid pagination against infinite network loop on small session lists ( #1002 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-28 19:44:28 +03:00
M57 and M57
2332bdd5d5
feat(nav): root swipe-back on chat with double-back exit and subpage hierarchy ( #1001 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-28 18:38:01 +03:00
M57 and M57
f04d878358
feat(bots): add multi-agent group chat collaboration room ( #998 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-28 17:50:37 +03:00
M57
6bc4e872ca
docs: add DESIGN.md design system specification ( #1000 )
2026-08-28 14:55:53 +03:00
M57 and M57
7bfb6d5c16
ci: support dev staging branch and pre-release tags in release workflow ( #999 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-28 14:14:47 +03:00
M57
0cdccad855
fix(bots): create clean profile without cloning default soul and custom skills ( #997 )
2026-08-27 19:06:58 +03:00
M57 and M57
14fde03083
feat(image): migrate to Coil 3.6.0 with OkHttp network fetcher ( #996 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-27 15:13:18 +03:00
M57 and M57
10d7d473fd
chore: enable dependabot grouping and bump core androidx dependencies ( #995 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-27 14:46:53 +03:00
M57 and M57
4d9dfb99db
feat(db): migrate to androidx.room3 3.0.2 with SQLCipherDriver ( #994 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-27 13:47:32 +03:00
M57
9c91df56f3
fix(theme): replace Color.Gray fallback with Color.Unspecified in palette color pickers
...
Resolves checkColorLiterals hardcoded color guard failure in CreateBotDialog and EditBotBottomSheet.
2026-08-27 02:38:05 +03:00
M57 and M57
140b0f7179
fix(ci): overhaul PR auto-labeler — fork compat + real codebase coverage ( #988 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-27 01:54:55 +03:00
M57
2fed891d78
feat(ui): add Bots and Groups tab strip with GroupCard and disband action ( #987 )
2026-08-27 01:53:54 +03:00
M57
6ca248d28b
feat(ui): add EditBotBottomSheet with avatar editor and bot deletion ( #983 )
2026-08-27 01:53:15 +03:00
M57
274120cc86
feat(ui): add CreateGroupChatDialog for multi-bot room creation ( #982 )
2026-08-27 01:52:34 +03:00
M57
d4d6a04afc
feat(ui): add CreateBotDialog to BotsScreen with avatar customizer ( #981 )
2026-08-27 01:51:43 +03:00
M57
b422ead921
feat(chat): add @bot mention autocomplete to ChatComposer ( #980 )
2026-08-27 01:51:10 +03:00
M57
4e666b49a8
feat(chat): intercept /new in canonical Bot Chat sessions to /compact ( #979 )
2026-08-27 01:50:43 +03:00
M57
48c9039e02
feat(ui): add BotsScreen and BotsViewModel with active presence strip ( #977 )
2026-08-27 01:49:31 +03:00
M57
6af349cdf2
feat(ui): add reusable Material3 BotAvatar component ( #974 )
2026-08-27 01:49:08 +03:00
M57
c028077647
feat(models): support bot metadata, canonical sessions, and group sync in Profile models ( #973 )
2026-08-27 01:48:43 +03:00
M57 and M57
4f3a57e340
chore(metadata): move fastlane directory to project root ( #976 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-26 21:24:19 +03:00
M57 and M57
1f1ebf3597
feat(update): redesign in-app updater with smart cooldown, release notes, and in-place dialog ( #971 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-26 07:42:41 +03:00
M57 and M57
460472f631
fix(chat): queue prompts while session creation is in flight (issue #969 ) ( #970 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-26 06:35:44 +03:00
M57 and M57
14b9c1d1d3
fix(chat): support multi-level nested bullet, task, and ordered markdown lists ( #965 ) ( #968 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-25 17:41:47 +03:00
M57 and M57
9217f9f8b6
fix(sessions): tolerate integer and string boolean formats for pinned field ( #966 ) ( #967 )
...
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-25 17:05:14 +03:00
M57
ece0288ca8
feat(update): surface backend update receipt in action popup ( #958 ) ( #964 )
...
Adopt GET /api/hermes/update/receipt and append its summary to the
end of the hermes-update action progress popup after it finishes.
Additive only: existing checkHermesUpdate + connection-retry polling
is untouched. 404 (old backend) is handled gracefully.
- add UpdateReceiptResponse data model matching backend schema
- add getUpdateReceipt() to HermesApiService
- ActionProgressController gains trailingLines + pushTrailingLines
- ActionProgressDialog renders trailingLines after the log
- SystemViewModel fetches receipt on action finish and formats it
- extract pure formatUpdateReceiptLines for mockk-free testing
2026-08-24 01:35:59 +03:00
M57 and M57
5fd732be9b
fix(chat): preserve ordered list numbering in loose lists ( #959 ) ( #963 )
...
ORDERED_RE only captured item text and discarded the source number, and the
parse loop broke on the first blank line — so loose numbered lists (blank lines
between items) re-indexed every item to 1.
- capture the prefix number and emit it as MdBlock.Ordered.index
- treat a blank line as list-internal when the next non-blank line is another
ordered item, so loose lists stay one ordered list
- keep sequential numbering for tight lists (1,2,3) and honor custom starts
add regression tests in MarkdownTextFeatureTest (loose, custom-start, tight).
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-24 00:16:27 +03:00
M57 and M57
764cb3455f
fix(auth): await cookie scope hydration on cold start ( #961 ) ( #962 )
...
* fix(auth): await cookie scope hydration before ticket mint and request loading (#961 )
* refactor(auth): scope latch activation to active store hydration
---------
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-23 23:57:37 +03:00
M57
913ae1275d
docs(contributing): align contributor docs with real workflow + fix ktlint command ( #960 )
...
- Add "search for dupes first" rule (open/closed PRs + issues) before starting.
- Fix ktlint instructions: the authoritative command is ./gradlew ktlintCheck
/ ktlintFormat, not the standalone ./ktlint binary (hand-fixes fail CI).
- Document rebase-onto-main before squash-merge (stale-branch overwrite trap).
- Add test-storage hygiene rule (no real on-device storage; TemporaryFolder /
in-memory Room) — generic, not tied to any specific test harness or box.
- Add dependency-pinning note (AGP/Kotlin/SDK "SDK not writable" trap).
- Tighten PR template: type-of-change, rebased, ktlintCheck, navigateTo().
2026-08-23 17:32:32 +03:00
M57 and M57
7540f7228a
fix(chat): show send button for attachment-only sends ( #956 ) ( #956 )
...
The AnimatedContent gate on the composer's send button required
inputFieldValue.text.isNotBlank() in addition to canSend, so attaching an
image or file with an empty input hid the button entirely — the attachment
could never be sent on its own. ChatInputPolicy.canSend already allowed
attachment-only sends and ChatViewModel.sendMessage already accepted blank
text with pending attachments, but the button never rendered to trigger it.
Drop the stale text gate so the send affordance tracks canSend (non-empty
text OR pending attachments, plus connection). The backend handles
image-only turns natively: prompt.submit with empty text + queued images
routes through build_native_content_parts, which wraps the pixels with an
[Image attached at: ...] hint.
Add a Compose UI regression test asserting the send button is displayed
with a pending image attachment and an empty input.
Co-authored-by: M57 <hy4ri@users.noreply.github.com >
2026-08-22 21:58:53 +03:00