Commit Graph
100 Commits
Author SHA1 Message Date
M57andGitHub 8b9026b83e Merge pull request #1081 from Hy4ri/refactor/tool-engine-split
refactor(tool): split tool display engine
2026-09-10 23:03:40 +03:00
M57andGitHub 63e2921b36 Merge pull request #1080 from Hy4ri/dependabot/gradle/dev/coil-3.6.2
chore: bump coil from 3.6.1 to 3.6.2
2026-09-08 11:51:27 +03:00
M57andGitHub 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
M57andGitHub 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
M57andGitHub beef8478be Merge branch 'dev' into feat/comprehensive-pr-auto-labeling 2026-09-06 18:34:03 +03:00
M57andGitHub 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
M57andGitHub ae2d0d8494 Merge branch 'dev' into fix/rotation-preserve-connection 2026-09-06 18:21:43 +03:00
M57andGitHub 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
M57andGitHub 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
M57andGitHub 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
M57andGitHub ad34a51846 Merge branch 'dev' into fix/bounded-attachment-dispatch 2026-09-05 16:34:36 +03:00
M57andGitHub 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
M57andGitHub 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
M57andGitHub 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
M57andGitHub 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
M57andGitHub 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
M57andLuna 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
M57andGitHub 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
M57andLuna 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
M57andGitHub 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
M57andLuna 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
M57andGitHub 7ae8977dc3 feat(group-chat): expand tool execution details and terminal output preview (#1058) 2026-09-04 14:52:15 +03:00
M57andGitHub bd0b4c2d55 feat(chat): full approval.request support (#1057) 2026-09-03 22:33:15 +03:00
M57andGitHub 077ad1fa81 feat(chat): full sudo.request support with expire, cancel-unblock, secret fields (#1056) 2026-09-03 22:08:07 +03:00
M57andGitHub 6d2362ba8a feat(chat): support multi-select, batch multi-question clarify prompts, and expiry (fixes #1045) (#1055) 2026-09-03 21:38:57 +03:00
M57andGitHub 50773945f9 fix(theme): disable dynamic colors by default to preserve curated preset aesthetics (#1054) 2026-09-03 20:32:55 +03:00
M57andGitHub 8c2d4216a7 feat(chat): display completion timestamp beside copy button on assistant message (#1053) 2026-09-03 20:21:43 +03:00
M57andGitHub 5a79da96f7 fix(chat): restrict @ bot mention suggestions strictly to group chat (#1052) 2026-09-03 19:46:38 +03:00
M57andGitHub b3439d87c9 feat(chat): support /undo command with transcript reload and composer prefill (#1051) 2026-09-03 19:04:43 +03:00
M57andGitHub efe6fe81cb fix(chat): support confirmation dialog when switching to expensive or data-policy models (#1050) 2026-09-03 16:56:08 +03:00
M57andGitHub 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
M57andGitHub 78e104f432 feat(bots): add horizontal @ mention suggestion chip bar in group chat (#1048) 2026-09-03 14:38:09 +03:00
M57andGitHub cd8c27e62b feat(chat): support dynamic BiDi Arabic input and isolated mixed text in Markdown (#1047) 2026-09-03 13:06:03 +03:00
M57andGitHub 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
M57andGitHub dbd7008ee3 feat(chat): support non-Google speech-to-text providers (fixes #1038) (#1042) 2026-09-02 12:31:42 +03:00
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
M57andGitHub 2d0b6ae1a9 fix(history): resolve session resume profile scoping and history pagination (#1040) 2026-09-02 00:01:19 +03:00
M57andGitHub 7c00f4407d feat(i18n): add comprehensive Arabic localization and RTL layout support (#1039) 2026-09-01 21:34:11 +03:00
M57andGitHub 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
M57andGitHub d8385a2b02 feat(ws): adopt WS ping method for heartbeat and latency tracking (#1036) 2026-09-01 19:44:39 +03:00
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
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
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
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
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
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
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
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
M57andGitHub 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
M57andGitHub 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
M57andGitHub 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
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
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
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
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
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
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
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
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
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
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
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
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
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
M57andGitHub 6bc4e872ca docs: add DESIGN.md design system specification (#1000) 2026-08-28 14:55:53 +03:00
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
M57andGitHub 0cdccad855 fix(bots): create clean profile without cloning default soul and custom skills (#997) 2026-08-27 19:06:58 +03:00
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
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
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
M57andM57 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
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
M57andGitHub 2fed891d78 feat(ui): add Bots and Groups tab strip with GroupCard and disband action (#987) 2026-08-27 01:53:54 +03:00
M57andGitHub 6ca248d28b feat(ui): add EditBotBottomSheet with avatar editor and bot deletion (#983) 2026-08-27 01:53:15 +03:00
M57andGitHub 274120cc86 feat(ui): add CreateGroupChatDialog for multi-bot room creation (#982) 2026-08-27 01:52:34 +03:00
M57andGitHub d4d6a04afc feat(ui): add CreateBotDialog to BotsScreen with avatar customizer (#981) 2026-08-27 01:51:43 +03:00
M57andGitHub b422ead921 feat(chat): add @bot mention autocomplete to ChatComposer (#980) 2026-08-27 01:51:10 +03:00
M57andGitHub 4e666b49a8 feat(chat): intercept /new in canonical Bot Chat sessions to /compact (#979) 2026-08-27 01:50:43 +03:00
M57andGitHub 48c9039e02 feat(ui): add BotsScreen and BotsViewModel with active presence strip (#977) 2026-08-27 01:49:31 +03:00
M57andGitHub 6af349cdf2 feat(ui): add reusable Material3 BotAvatar component (#974) 2026-08-27 01:49:08 +03:00
M57andGitHub c028077647 feat(models): support bot metadata, canonical sessions, and group sync in Profile models (#973) 2026-08-27 01:48:43 +03:00
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
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
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
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
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
M57andGitHub 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
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
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
M57andGitHub 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
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