Commit Graph
62 Commits
Author SHA1 Message Date
yilsemandClaude Opus 5.5 c2b08ff73e feat(aiturk): pair with AITURK IDE over LAN with a pinned certificate
Adds the phone side of the pairing contract v1: payload parsing, gateway resolve, parallel hello and a single claim, per host:port certificate pinning hooked into OkHttpProvider.base, and no dashboard token refresh for a paired IDE. Adds zxing-android-embedded and okhttp-tls (tests).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B8ppceaR5s6cvMnm7uGRnf
2026-10-04 06:06:31 +03:00
728daa9acd release: promote dev to main for v2.0.0 (#1426)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Lx-204 <15377891490@163.com>
Co-authored-by: AlexDev_ <56083016+alexdev03@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nikhil Nair <32665919+nikhilnair31@users.noreply.github.com>
Co-authored-by: marciodps <95321123+marciodps@users.noreply.github.com>
Co-authored-by: ThomasCrund <39323104+ThomasCrund@users.noreply.github.com>
2026-10-01 11:19:09 +03:00
e4004decb4 release: promote dev to main for v1.30.0 (#1271)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Lx-204 <15377891490@163.com>
Co-authored-by: AlexDev_ <56083016+alexdev03@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nikhil Nair <32665919+nikhilnair31@users.noreply.github.com>
Co-authored-by: marciodps <95321123+marciodps@users.noreply.github.com>
2026-09-25 23:23:12 +03:00
dependabot[bot] 799bb2959e chore: bump coil from 3.6.2 to 3.6.3 (#1225)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-22 09:46:17 +03:00
dependabot[bot] f3023c7493 chore: bump latex from 1.5.4 to 1.5.5
Bumps `latex` from 1.5.4 to 1.5.5.

Updates `io.github.huarangmeng:latex-base` from 1.5.4 to 1.5.5
- [Release notes](https://github.com/huarangmeng/latex/releases)
- [Commits](https://github.com/huarangmeng/latex/compare/release-1.5.4...release-1.5.5)

Updates `io.github.huarangmeng:latex-parser` from 1.5.4 to 1.5.5
- [Release notes](https://github.com/huarangmeng/latex/releases)
- [Commits](https://github.com/huarangmeng/latex/compare/release-1.5.4...release-1.5.5)

Updates `io.github.huarangmeng:latex-renderer` from 1.5.4 to 1.5.5
- [Release notes](https://github.com/huarangmeng/latex/releases)
- [Commits](https://github.com/huarangmeng/latex/compare/release-1.5.4...release-1.5.5)

---
updated-dependencies:
- dependency-name: io.github.huarangmeng:latex-base
  dependency-version: 1.5.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.github.huarangmeng:latex-parser
  dependency-version: 1.5.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.github.huarangmeng:latex-renderer
  dependency-version: 1.5.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-21 06:36:26 +00:00
M57 abce60ad7a feat: unify audio and video attachment playback (#1188) 2026-09-18 20:20:34 +03:00
dependabot[bot] 5a414bacbb chore: bump net.zetetic:sqlcipher-android from 4.18.0 to 4.19.0
Bumps [net.zetetic:sqlcipher-android](https://github.com/sqlcipher/sqlcipher-android) from 4.18.0 to 4.19.0.
- [Release notes](https://github.com/sqlcipher/sqlcipher-android/releases)
- [Commits](https://github.com/sqlcipher/sqlcipher-android/compare/v4.18.0...v4.19.0)

---
updated-dependencies:
- dependency-name: net.zetetic:sqlcipher-android
  dependency-version: 4.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-14 15:55:02 +03:00
dependabot[bot] a2c9a025c6 chore: bump com.google.devtools.ksp from 2.3.11 to 2.3.12
Bumps [com.google.devtools.ksp](https://github.com/google/ksp) from 2.3.11 to 2.3.12.
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.3.11...2.3.12)

---
updated-dependencies:
- dependency-name: com.google.devtools.ksp
  dependency-version: 2.3.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-14 06:36:02 +00:00
dependabot[bot] 3bd9716b30 chore: bump coil from 3.6.1 to 3.6.2
Bumps `coil` from 3.6.1 to 3.6.2.

Updates `io.coil-kt.coil3:coil-compose` from 3.6.1 to 3.6.2
- [Release notes](https://github.com/coil-kt/coil/releases)
- [Changelog](https://github.com/coil-kt/coil/blob/main/CHANGELOG.md)
- [Commits](https://github.com/coil-kt/coil/compare/3.6.1...3.6.2)

Updates `io.coil-kt.coil3:coil-gif` from 3.6.1 to 3.6.2
- [Release notes](https://github.com/coil-kt/coil/releases)
- [Changelog](https://github.com/coil-kt/coil/blob/main/CHANGELOG.md)
- [Commits](https://github.com/coil-kt/coil/compare/3.6.1...3.6.2)

Updates `io.coil-kt.coil3:coil-network-okhttp` from 3.6.1 to 3.6.2
- [Release notes](https://github.com/coil-kt/coil/releases)
- [Changelog](https://github.com/coil-kt/coil/blob/main/CHANGELOG.md)
- [Commits](https://github.com/coil-kt/coil/compare/3.6.1...3.6.2)

---
updated-dependencies:
- dependency-name: io.coil-kt.coil3:coil-compose
  dependency-version: 3.6.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.coil-kt.coil3:coil-gif
  dependency-version: 3.6.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.coil-kt.coil3:coil-network-okhttp
  dependency-version: 3.6.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-08 06:34:38 +00:00
dependabot[bot] 9288883de4 chore: bump coil from 3.6.0 to 3.6.1 (#1059)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-04 14:52:59 +03:00
dependabot[bot] 807c0af381 chore: bump latex from 1.5.3 to 1.5.4
Bumps `latex` from 1.5.3 to 1.5.4.

Updates `io.github.huarangmeng:latex-base` from 1.5.3 to 1.5.4
- [Release notes](https://github.com/huarangmeng/latex/releases)
- [Commits](https://github.com/huarangmeng/latex/compare/release-1.5.3...release-1.5.4)

Updates `io.github.huarangmeng:latex-parser` from 1.5.3 to 1.5.4
- [Release notes](https://github.com/huarangmeng/latex/releases)
- [Commits](https://github.com/huarangmeng/latex/compare/release-1.5.3...release-1.5.4)

Updates `io.github.huarangmeng:latex-renderer` from 1.5.3 to 1.5.4
- [Release notes](https://github.com/huarangmeng/latex/releases)
- [Commits](https://github.com/huarangmeng/latex/compare/release-1.5.3...release-1.5.4)

---
updated-dependencies:
- dependency-name: io.github.huarangmeng:latex-base
  dependency-version: 1.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.github.huarangmeng:latex-parser
  dependency-version: 1.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.github.huarangmeng:latex-renderer
  dependency-version: 1.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-31 06:37:47 +00:00
M57andM57 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
M57andM57 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
M57andM57 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
dependabot[bot]andM57 680b4082ca chore: bump net.zetetic:sqlcipher-android from 4.17.0 to 4.18.0 (#990)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: M57 <41645758+Hy4ri@users.noreply.github.com>
2026-08-27 10:53:14 +03:00
dependabot[bot] 19065f02df chore: bump gradle-wrapper from 9.7.0 to 9.7.1 (#991)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-27 10:23:16 +03:00
M57andHy4ri 59bcbdfe3c build: Android 17 (API 37) + okhttp 5.5.0 + LAN local-network permission gate (#941)
* build: compileSdk 36 -> 37 + okhttp 5.4.0 -> 5.5.0

Take okhttp 5.5.0 (folds in dependabot PR #940) which hard-requires
compileSdk 37 via AAR metadata. targetSdk stays 36 for now.

* build: targetSdk 36 -> 37 (Android 17) + ACCESS_LOCAL_NETWORK gating

Opt into Android 17 runtime behavior. The app connects to a gateway
(default 127.0.0.1:9119, plus LAN + remote), so targeting 37 forces the
new ACCESS_LOCAL_NETWORK permission for LAN hosts.

- AndroidManifest: declare ACCESS_LOCAL_NETWORK (harmless below API 37)
- LocalNetwork.kt: pure detector + needsLocalNetworkPermission(baseUrl)
  (loopback + public remote exempt; RFC1918/link-local/CGNAT gated)
- ConnectViewModel: requestConnect() gates on the permission; screen
  launches the prompt; onLanPermissionResult proceeds or shows a clear error
- flake.nix: android platform 36 -> 37
- Tests: LocalNetworkTest + ConnectPermissionGateTest (SDK_INT / permission
  branching mocked, no device needed)
- Task 8 finding: assistant services (VoiceInteraction*/Recognition) and the
  remoteMessaging ChatNotificationService do NOT hit the Android 17 mic/
  while-in-use foreground hardening, so no change required.

* fix: ktlint + @Composable LocalContext hoist (was blocking CI)

- ConnectScreen: hoist LocalContext.current out of onClick lambda
  (calling a @Composable inside a non-composable lambda broke compileDebugKotlin)
- ktlint --format: multiline-expression-wrapping, function-signature,
  no-empty-first-line-in-class-body, no-unused-imports
- LocalNetwork.kt: merge consecutive KDocs (no-consecutive-comments)

flake.nix buildToolsVersion/platformToolsVersion intentionally stay 36.0.0
— they are decoupled from compileSdk; only platformVersions needs 37.

* fix: suspend mock (coEvery) + flake toolchain pinned to 37.0.0

- ConnectPermissionGateTest: getStatus() is suspend → use coEvery (was
  breaking compileDebugUnitTestKotlin)
- flake.nix: buildToolsVersion/platformToolsVersion/cmdLineToolsVersion
  pinned to 37.0.0 (verified against pinned nixpkgs 241313f — resolves to
  android-sdk-*-37.0.0 derivations; platformVersions already 37)

* fix(flake): revert cmdLineToolsVersion to 11.0 (not API-aligned)

cmdline-tools uses its own versioning (latest = 21.0, never 37.0.0) —
nixpkgs rejects 37.0.0 with 'version missing'. build-tools + platform-tools
stay 37.0.0 (verified resolve to android-sdk-*-37.0.0). flake now evals
clean against pinned nixpkgs 241313f.

* flake: track nixos-unstable + pin toolchain to latest (cmdline 22.0, platform-tools 37.0.1, build-tools 37.0.0, platform 37.1)

- inputs.nixpkgs -> nixos-unstable, flake.lock bumped to rev ffb3c9b7 (2026-08-19)
- cmdLineToolsVersion 11.0 -> 22.0 (own versioning, not API-aligned; v22_0 confirms)
- platformToolsVersion 37.0.0 -> 37.0.1
- buildToolsVersion stays 37.0.0
- platformVersions 37 -> 37.1
- verified: nix flake check --no-build -> all checks passed on hyari

* fix: unit tests — Uri stub + Build.SDK_INT final-field mock

- LocalNetwork.kt: needsLocalNetworkPermission uses java.net.URI instead of
  android.net.Uri (latter is a non-functional stub in JVM unit tests, its host
  returns null -> gate always false). Added pure requiresLocalNetworkPermission(sdkInt, baseUrl).
- ConnectViewModel: inject sdkVersion (package-private) instead of reading the
  final static Build.VERSION.SDK_INT directly; gate via requiresLocalNetworkPermission.
- ConnectPermissionGateTest: drop mockkStatic(Build.VERSION) (MockKException on
  final static field, and against repo convention); inject sdkVersion; add pure
  gate-decision matrix. Fixes 7 red tests.

* fix(test): remove illegal ':' from test function names (compile error)

* fix(test): order getString mocks so specific resources win over wildcard

* fix(flake): include android-37.0 system image so the emulator can boot

Google only publishes the android-37.0 system image (no 37.1 image exists
yet). With platformVersions=["37.1"] composeAndroidPackages found no matching
system image, leaving system-images/ empty and every AVD FATALing with
'Broken AVD system path'. Adding 37.0 pulls the published image so an AVD boots
(verified: hermes37 AVD boots Android 17 / API 37 on hyari). compileSdk/targetSdk
stay 37.

Also bump AGENTS.md SDK note 36 -> 37 (was stale).

* fix(flake): platformVersions 37.1 -> 37.0

Drop 37.1; 37.0 provides both the SDK platform for compileSdk 37 and the
published android-37.0 system image the emulator needs.

* fix(flake): remove stray tool-scratch line leaked into flake.nix (line 116)

A terminal tool's /tmp scratch rename line got appended to flake.nix, making
it invalid Nix. Removed; flake now parses + 'nix flake check' passes on hyari.

* fix(build): pin buildToolsVersion 37.0.0 to match nix SDK

AGP defaulted build-tools to 36.0.0, which isn't in the nix-managed SDK
(only 37.0.0 is provisioned). Local ./gradlew builds then tried to *install*
36.0.0 into the immutable /nix/store and failed. Pin 37.0.0 so the local
nix devShell builds. CI uses its own SDK so unaffected.

---------

Co-authored-by: Hy4ri <Hy4ri@users.noreply.github.com>
2026-08-20 14:35:42 +03:00
AlexDev_ bb4ca6bfa9 feat(chat): render LaTeX formulas natively (#939)
* feat(chat): render LaTeX formulas

Support native inline and display math with accessible Compose rendering.

* perf(chat): reuse LaTeX parsing state

Share one measurer per message and skip redundant math splitting.
2026-08-19 22:41:50 +03:00
M57andM57 0a5eb7a5b0 [chore] bump AGP 9.0.1 → 9.1.1 — fix R8 kotlin metadata warnings (#900)
* chore(build): bump AGP 9.0.1 → 9.1.1 — fix R8 kotlin metadata warnings

Kotlin 2.4.10 emits metadata the R8 bundled in AGP 9.0.1 cannot parse:
'WARNING: R8: An error occurred when parsing kotlin metadata' spam on every
release build (the Kotlin↔R8 compatibility matrix requires R8 ≥ 9.1.29 for
Kotlin 2.4). AGP 9.1.1 bundles R8 9.1.x — release build now warning-free.

Verified locally: assembleRelease green with zero metadata warnings; unit
suite 1029/0; device smoke — app connects with preserved token under R8 9.1.

* fix(chat): removeLast() → removeAt(lastIndex) — API 35 call on minSdk 26

AGP 9.1's lint (newer NewApi check) flags java.util.List#removeLast(),
resolved only as a Kotlin stdlib extension below API 35. Same semantics,
lint-clean.

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-08-13 21:30:02 +03:00
dependabot[bot] f5ce07b196 chore: bump com.google.devtools.ksp from 2.3.10 to 2.3.11 (#895)
Bumps [com.google.devtools.ksp](https://github.com/google/ksp) from 2.3.10 to 2.3.11.
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.3.10...2.3.11)

---
updated-dependencies:
- dependency-name: com.google.devtools.ksp
  dependency-version: 2.3.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-13 10:20:27 +03:00
dependabot[bot] 4479ebbdda chore: bump org.junit.platform:junit-platform-launcher (#894)
Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 6.1.2 to 6.1.3.
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.2...r6.1.3)

---
updated-dependencies:
- dependency-name: org.junit.platform:junit-platform-launcher
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-13 10:08:49 +03:00
dependabot[bot] 2077fda912 chore: bump gradle-wrapper from 9.6.1 to 9.7.0 (#896)
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.6.1 to 9.7.0.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.6.1...v9.7.0)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-13 10:08:06 +03:00
dependabot[bot] 3c0f281276 chore: bump junit5 from 6.1.2 to 6.1.3 (#893)
Bumps `junit5` from 6.1.2 to 6.1.3.

Updates `org.junit.jupiter:junit-jupiter-api` from 6.1.2 to 6.1.3
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.2...r6.1.3)

Updates `org.junit.jupiter:junit-jupiter-engine` from 6.1.2 to 6.1.3
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.2...r6.1.3)

Updates `org.junit.vintage:junit-vintage-engine` from 6.1.2 to 6.1.3
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.2...r6.1.3)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.vintage:junit-vintage-engine
  dependency-version: 6.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-13 10:08:02 +03:00
M57andM57 422bb9f5e6 feat: support hosted OAuth for authenticated HTTP MCP servers (#751) (#752)
* feat: support hosted OAuth for authenticated HTTP MCP servers (#751)

* fix(mcp): import McpOAuthFlowResponse in McpServersViewModel

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-07-31 05:30:51 +03:00
M57 5c1492a80e feat(chat): add animated GIF rendering with tap-to-play animation (#721) (#731)
* feat(chat): add animated GIF rendering with tap-to-play animation

Closes #721

* fix(#721): add missing GifImageThumbnail component and format ktlint

* fix(analytics): resolve ktlint indentation error in itemsIndexed

* feat(chat): add interactive play/pause toggle for animated GIFs

* fix(chat): control GIF playback via Animatable start and stop
2026-07-27 18:32:45 +03:00
dependabot[bot] 45490c82c2 chore: bump com.google.devtools.ksp from 2.3.9 to 2.3.10 (#611)
Bumps [com.google.devtools.ksp](https://github.com/google/ksp) from 2.3.9 to 2.3.10.
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.3.9...2.3.10)

---
updated-dependencies:
- dependency-name: com.google.devtools.ksp
  dependency-version: 2.3.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-16 13:09:15 +03:00
dependabot[bot] 0fc5b0d2ef chore: bump kotlin from 2.4.0 to 2.4.10 (#610)
Bumps `kotlin` from 2.4.0 to 2.4.10.

Updates `org.jetbrains.kotlin.plugin.compose` from 2.4.0 to 2.4.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.0...v2.4.10)

Updates `org.jetbrains.kotlin.plugin.serialization` from 2.4.0 to 2.4.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.0...v2.4.10)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.4.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jetbrains.kotlin.plugin.serialization
  dependency-version: 2.4.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-16 13:08:49 +03:00
dependabot[bot] 2195a3516d chore: bump junit5 from 6.1.1 to 6.1.2 (#609)
Bumps `junit5` from 6.1.1 to 6.1.2.

Updates `org.junit.jupiter:junit-jupiter-api` from 6.1.1 to 6.1.2
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)

Updates `org.junit.jupiter:junit-jupiter-engine` from 6.1.1 to 6.1.2
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)

Updates `org.junit.vintage:junit-vintage-engine` from 6.1.1 to 6.1.2
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-version: 6.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-version: 6.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.junit.vintage:junit-vintage-engine
  dependency-version: 6.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-16 13:08:04 +03:00
dependabot[bot] 650230b644 chore: bump org.junit.platform:junit-platform-launcher (#608)
Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 6.1.1 to 6.1.2.
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)

---
updated-dependencies:
- dependency-name: org.junit.platform:junit-platform-launcher
  dependency-version: 6.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-16 13:06:26 +03:00
dependabot[bot] 5c7363389d chore: bump net.zetetic:sqlcipher-android from 4.16.0 to 4.17.0 (#503)
Bumps [net.zetetic:sqlcipher-android](https://github.com/sqlcipher/sqlcipher-android) from 4.16.0 to 4.17.0.
- [Release notes](https://github.com/sqlcipher/sqlcipher-android/releases)
- [Commits](https://github.com/sqlcipher/sqlcipher-android/compare/v4.16.0...v4.17.0)

---
updated-dependencies:
- dependency-name: net.zetetic:sqlcipher-android
  dependency-version: 4.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 11:33:07 +03:00
dependabot[bot] b24abccb9c chore: bump org.jetbrains.kotlinx:kotlinx-serialization-json (#504)
Bumps [org.jetbrains.kotlinx:kotlinx-serialization-json](https://github.com/Kotlin/kotlinx.serialization) from 1.8.0 to 1.11.0.
- [Release notes](https://github.com/Kotlin/kotlinx.serialization/releases)
- [Changelog](https://github.com/Kotlin/kotlinx.serialization/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Kotlin/kotlinx.serialization/compare/v1.8.0...v1.11.0)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlinx:kotlinx-serialization-json
  dependency-version: 1.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 11:33:03 +03:00
dependabot[bot] 63603fa891 chore: bump app.cash.turbine:turbine from 1.2.0 to 1.2.1 (#505)
Bumps [app.cash.turbine:turbine](https://github.com/cashapp/turbine) from 1.2.0 to 1.2.1.
- [Release notes](https://github.com/cashapp/turbine/releases)
- [Changelog](https://github.com/cashapp/turbine/blob/trunk/CHANGELOG.md)
- [Commits](https://github.com/cashapp/turbine/compare/1.2.0...1.2.1)

---
updated-dependencies:
- dependency-name: app.cash.turbine:turbine
  dependency-version: 1.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 11:32:59 +03:00
M57 430a083647 feat(#471): implement DataStore-based server configuration and self-h… (#477)
* feat(#471): implement DataStore-based server configuration and self-healing

* refactor(#471): address Sourcery feedback on ANR risk and reset method splitting

* refactor(#471): implement synchronous ServerStore initialization to fully remove ANR risk

* feat(#471): show profile name, host and port on add profile, redirect to login on save, and support shortcut login buttons for existing profiles
2026-07-06 22:40:44 +03:00
M57 5697405b19 refactor: migrate Gson serialization to kotlinx.serialization (#475)
* refactor: migrate Gson serialization to kotlinx.serialization

* fix(dto): resolve serializing Any? and Map<String, Any?> with JsonElement

* test(refactor): fix unit test issues under kotlinx.serialization and update nullable DTO defaults

* fix(chat): support flexible numeric and string decoding for message timestamps

* fix(chat): sequentialize cache loading to avoid overwriting network state
2026-07-05 21:30:44 +03:00
M57andM57 1c3a5386f4 fix(#472): refactor ChatViewModelTest — Fakes + Turbine, drop Mockk (#474)
* fix(#472): refactor ChatViewModelTest to use Fake* + Turbine

Replace Mockk-heavy test setup with FakeChatPersistenceRepository (+
in-memory FakeChatMessageDao) and add Turbine for Flow assertions.

Changes:
- Add Turbine v1.2.0 dependency (libs.versions.toml + build.gradle.kts)
- Create FakeChatMessageDao – in-memory DAO with MutableStateFlow
- Create FakeChatPersistenceRepository – delegates to FakeDao
- ChatViewModel: make repo injectable (@VisibleForTesting lateinit var)
- Rewrite ChatViewModelTest (751 lines vs 1,212): clearer helpers,
  Turbine test for streaming Flow sequence, same 29 tests with
  identical assertions, ~38% line reduction

Test: ktlint --format passes clean

* fix(#472): address review — constructor injection, ConcurrentHashMap, MockWebServer tests

Addresses all feedback from Sourcery review on PR #474:

Constructor injection (was lateinit var):
- Move repo to ChatViewModel primary constructor with default
- Remove @VisibleForTesting lateinit var + init block assignment
- Tests pass repo directly via constructor

Simplify FakeChatMessageDao:
- Replace manual synchronized(lock) with ConcurrentHashMap
- Same thread safety, 48% less code, no boilerplate lock object

New MockWebServer tests:
- HermesApiServiceMockWebServerTest: 6 tests covering getStatus,
  getSessions, getSessionMessages + edge cases (null fields,
  empty lists, slash-encoded session IDs)

* fix: CI compilation errors — open class, TestScope receiver, runBlocking

Three compilation errors blocking CI:

- ChatPersistenceRepository was final, but FakeChatPersistenceRepository
  extends it → make it open class
- createViewModelWithSession() called advanceUntilIdle (TestScope ext)
  and emit() (suspend) without a TestScope receiver or coroutine ctx →
  make it fun TestScope.xxx() and use tryEmit() for non-suspend emission
- HermesApiServiceMockWebServerTest called suspend API methods from
  regular @Test methods → wrap each test in runBlocking

* fix: test runtime failures — suspend helper + fix JSON escaping

- Use  so emit()
  (suspend) is valid and events are delivered synchronously instead of
  buffered via tryEmit() which was causing 17 test failures
- Fix MalformedJsonException in MockWebServer test by using plain string
  content instead of unescaped JSON-within-JSON

* fix: correct req-id values in ChatViewModelTest — SESSION_CREATE is req-id-3

* fix(test): correct ChatViewModelTest assertions for Fakes+Turbine refactor

- testMessageStreamingFlow: collect streamingState via Turbine
  (ThinkingDelta/MessageToken mutate streamingState, not uiState)
- testToolExecution_finalizesPreviousStreamingMessage:
  account for messages[0] = "Session created" system message
- testMessageStart_finalizesPreviousStreamingMessage:
  same index offset (messages[1] is the finalized stream)
- testClarifyRequestCustomResponse: options is emptyList(), not null;
  message count is 3 (session-create + user clarify reply)

Fixes CI failures introduced in PR #474.

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-07-05 18:59:36 +03:00
dependabot[bot] b709e6d8da chore: bump junit5 from 6.1.0 to 6.1.1
Bumps JUnit 5 (jupiter-api, jupiter-engine, vintage-engine) from 6.1.0 to 6.1.1.

Patch release — backwards compatible.
2026-07-02 15:40:41 +03:00
dependabot[bot] a21b9abb58 chore: bump gradle-wrapper from 9.6.0 to 9.6.1
Bumps Gradle wrapper from 9.6.0 to 9.6.1.

Patch release — improved config cache hit rates, CLI rendering options, deprecation notices.
2026-07-02 15:38:58 +03:00
dependabot[bot] f0ccc5fc4f chore: bump junitPlatform from 6.1.0 to 6.1.1
Bumps `org.junit.platform:junit-platform-launcher` from 6.1.0 to 6.1.1.

Patch release — backwards compatible.
2026-07-02 15:38:49 +03:00
M57andM57 7811a35d29 feat(#350): pairing login flow with QR scan + manual entry (#421)
* feat(#350): pairing login flow with QR scan + manual entry

Adds PairingCodeEntryScreen with CameraX + ML Kit QR scanning
and manual code entry. The screen parses hermes://connect URIs,
Base64-encoded JSON, and raw token formats, validates via
/api/status, and saves credentials on success.

- New PairingCodeEntryScreen + PairingCodeEntryViewModel
- CameraX 1.4.1 + ML Kit barcode-scanning 17.3.0
- CAMERA permission + proguard rules
- Landing screen Pairing Login button wired correctly

* fix(#350): resolve smart-cast on delegated property for errorMessage

Co-authored-by: Hy4ri <hy4ri@users.noreply.github.com>

* refactor(#421): remove QR scanner from pairing login

- Remove CameraX + ML Kit barcode dependencies
- Drop CAMERA permission and camera feature from manifest
- Strip QrScannerTab, QrCodeScannerView, processFrame composables
- Remove camera permission state/methods from ViewModel
- Purge all QR/camera strings from strings.xml
- Delete ML Kit proguard rules

The pairing login now shows only the manual code entry UI.

---------

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
2026-06-30 10:08:01 +03:00
M57andHermes Agent 4849f4c1c6 feat(#195): chat attachment support for files and images (#418)
* feat(#195): add chat attachment support for files and images

- Add Attachment data model with computed properties (isImage, formattedSize, fileExtension)
- Extend ChatMessage with optional attachments list
- Add Coil 2.7.0 for async image loading in Compose
- Extend ChatViewModel with pending attachment state, addAttachment/removeAttachment/clearAttachments
- Build attachment-prefixed message text (data URIs for images, file refs for others)
- Add paperclip button and file picker launcher (ActivityResultContracts.GetContent) to ChatScreen
- Add animated attachment preview chips with thumbnails before sending
- Render attachments inline in UserBubble (AsyncImage for images, file cards for others)
- Add string resources for attachment UI features

* fix(#195): rewrite attachment upload protocol to match Hermes backend RPC methods

BREAKS: removes old buildAttachmentText() that embedded base64 data URIs in prompt text.

Changes:
- Replace inline data-URI encoding with proper backend RPC flow:
  - image.attach_bytes for images (fire-and-forget, auto-queues to session)
  - file.attach for non-image files (awaited, returns @file: ref text)
- Add CompletableDeferred to PendingRequest so sendMessage can await RPC responses
- Add readContentUriBytes() to read file content from content:// URIs
- Add sendRpcAndAwait() suspend function for sequential RPC calls
- Add RpcCallException for awaited RPC error handling
- Suppress error UI for awaited RPCs (caller handles them directly)
- Keep ChatScreen/ChatBubble UI layer unchanged (file picker, previews, inline images)

* feat(#195): add camera capture support via FileProvider + TakePicture contract

- Creates temporary photo files in cacheDir via FileProvider
- Launches system camera with ActivityResultContracts.TakePicture
- Adds camera icon button (📷) next to the paperclip in ChatInputBar
- Captured photos added as image/jpeg attachments via same addAttachment flow
- FileProvider configured with cache-root path in res/xml/file_paths.xml
- Error handling for launch failures and capture failures with snackbar

* refactor(#195): group camera/image/file into single attach dropdown

- Replaces separate 📷 and 📎 buttons with a single 📎 button
- DropdownMenu opens with three options:
  - 📷 Camera → TakePicture via FileProvider temp URI
  - 🖼️ Image → GetContent("image/*")
  - 📄 File → GetContent("*/*")
- Removes onAttachClick, adds onImageTap/onFileTap callbacks
- Input bar stays clean with one attachment affordance

* fix(#195): add missing imports for CI compilation

ChatScreen.kt:
- android.util.Log
- androidx.compose.animation.core.* (infiniteRepeatable, tween, LinearEasing, RepeatMode, rememberInfiniteTransition)
- androidx.compose.foundation.layout.widthIn
- androidx.compose.material.icons.filled.AttachFile
- androidx.compose.material.icons.filled.InsertDriveFile
- androidx.compose.ui.layout.ContentScale
- coil.compose.AsyncImage

ChatBubble.kt:
- androidx.compose.material.icons.filled.InsertDriveFile

* fix(#195): resolve android-lint LocalContextGetResourceValueCall error

Replace context.getString(R.string.chat_camera_error) with a
composable-level cameraErrorMsg captured via stringResource()
to avoid querying resources via LocalContext.current in a callback.

* fix(#195): migrate InsertDriveFile to AutoMirrored, fix chip double-remove

- Replace deprecated Icons.Filled.InsertDriveFile with
  Icons.AutoMirrored.Filled.InsertDriveFile in ChatBubble.kt
  and ChatScreen.kt
- Remove onClick from AttachmentChip Surface so only the
  dedicated close button triggers removal, not accidental taps
  on the chip body

---------

Co-authored-by: Hermes Agent <hermes@agent.local>
2026-06-29 16:33:12 +03:00
dependabot[bot] 066ceba5b0 chore: bump retrofit from 2.11.0 to 3.0.0 (#382)
Bump Retrofit 2.11.0 → 3.0.0. Forward binary-compatible — same package (retrofit2.*), same API surface, zero code changes needed.
2026-06-26 00:30:46 +03:00
dependabot[bot] 6134ac2ddc chore: bump gradle-wrapper from 9.1.0 to 9.6.0 (#390)
Bump Gradle wrapper 9.1.0 → 9.6.0. All CI green, no code changes needed.
2026-06-26 00:26:06 +03:00
dependabot[bot] 7a6352d41a chore: bump junit5 from 5.11.4 to 6.1.0 (#386)
Bump JUnit Jupiter 5.11.4 → 6.1.0 alongside Platform 6.1.0. No code changes needed.
2026-06-26 00:21:07 +03:00
dependabot[bot] bb18b9a5d4 chore: bump org.junit.platform:junit-platform-launcher (#385)
Bump junit-platform-launcher 1.11.4 → 6.1.0 to match JUnit Jupiter 6.1.0 (aligned versioning in JUnit 6).
2026-06-26 00:19:19 +03:00
M57 07ec453a4b Merge pull request #381 from Hy4ri/dependabot/gradle/okhttp-5.4.0
chore: bump okhttp from 4.12.0 to 5.4.0
2026-06-26 00:02:16 +03:00
M57 35a91478a7 chore: bump kotlin from 2.3.20 to 2.4.0
chore: bump kotlin from 2.3.20 to 2.4.0
2026-06-25 23:29:52 +03:00
M57 938fe5a768 chore: bump coroutines from 1.10.2 to 1.11.0
chore: bump org.jetbrains.kotlinx:kotlinx-coroutines-test from 1.10.2 to 1.11.0
2026-06-25 23:21:34 +03:00
M57 417ec4ce95 chore: bump sqlcipher from 4.9.0 to 4.16.0
chore: bump net.zetetic:sqlcipher-android from 4.9.0 to 4.16.0
2026-06-25 23:18:49 +03:00
M57 55d5dae2c7 chore: bump gson from 2.11.0 to 2.14.0
chore: bump com.google.code.gson:gson from 2.11.0 to 2.14.0
2026-06-25 23:17:01 +03:00
dependabot[bot] fac1001061 chore: bump kotlin from 2.3.20 to 2.4.0
Bumps `kotlin` from 2.3.20 to 2.4.0.

Updates `org.jetbrains.kotlin.plugin.compose` from 2.3.20 to 2.4.0
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.20...v2.4.0)

Updates `org.jetbrains.kotlin.plugin.serialization` from 2.3.20 to 2.4.0
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.20...v2.4.0)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: org.jetbrains.kotlin.plugin.serialization
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-25 19:51:32 +00:00