Commit graph

121 commits

Author SHA1 Message Date
Garfie Chiu
2b41b6f379
Merge pull request #72 from garfiec/feat/issue-68-endpoint-icon-url
Some checks failed
CI / Lint (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build Android App (push) Has been cancelled
CI / Build iOS App (push) Has been cancelled
feat(ui): render custom endpoint iconURL in drawer and conversation list
2026-04-29 22:49:14 -06:00
Garfie
92192498ca feat(ui): render custom endpoint iconURL in drawer and conversation list
Render `EndpointConfig.iconURL` in drawer + conversation list rows with
per-conversation override via `Conversation.iconURL`. Extract shared
`EndpointIcon` composable to `:core:ui`. Eager `/api/config` fetch via
`EndpointConfigFetchSessionTask` so cold-start has icons. Clear config
cache on logout to prevent cross-user leak.

Closes #68.
2026-04-29 20:19:11 -06:00
Garfie Chiu
a7477a9bc7
Merge pull request #67 from garfiec/fix/issue-60-custom-endpoint-payload
fix(chat): wire format for custom and user_provided endpoints (#60)
2026-04-29 00:05:05 -06:00
Garfie
f0d605a932 chore(data): replace normalizeEndpoint shim with Migration(3, 4) (#69)
Pre-#67 builds wrote Conversation.endpoint as the Kotlin enum `.name`
(e.g. "OPENAI"). #67 added a read-side shim in ConversationMapper that
converted those legacy rows back to the wire-format SerialName on read.
Replace the shim with a one-time data migration so the conversion runs
once per user on db upgrade and the read path is plain.

Bump database to v4 and register MIGRATION_3_4 on both Android and iOS
builders. The migration runs nine UPDATE statements per affected column
(conversations.endpoint, conversations.endpointType, presets.endpoint).
The presets table is migrated defensively — PresetDao currently has no
production callers, so the column is empty in the field, but symmetry
is enforced if a future change starts persisting presets.

Schema v4.json is structurally identical to v3.json; identityHash is
unchanged (b4117797915eafc13b5bd956677f83bf). Only the version field
differs.

Pre-#67 ChatPayloadBuilder coerced any unknown endpoint name to
EModelEndpoint.AGENTS, so a legacy "AGENTS" row may have originated
from any custom endpoint. The migration rewrites "AGENTS" -> "agents",
preserving the same lossy outcome the read-side shim already produced.
A dedicated test pins this contract so a future "smart" migration can't
silently change cache/fresh consistency.

Verified via :core:data:connectedDebugAndroidTest (5 tests, all green:
existing v1->v3 helper test, v1->v4 Room API test, v3->v4 endpoint
normalization, v3->v4 lossy AGENTS, v3->v4 preset normalization).
2026-04-28 22:03:36 -06:00
Garfie
2b44937368 fix(chat): wire format for custom and user_provided endpoints (#60)
ChatPayloadBuilder caught EModelEndpoint.valueOf for custom endpoint
names (OpenRouter, Deepseek, etc.) and silently sent endpoint=agents,
producing 403 "Forbidden: Insufficient permissions" on the server.

Type endpoint identity as String end-to-end, add EndpointClassifier to
derive endpointType / key / modelDisplayLabel from /api/config, and
propagate the dispatch fields to all five chat-send sites in
ChatViewModel (doSendMessage, editUserMessage, editAiMessage,
regenerateMessageNow, continueGenerationNow). A normalization shim in
ConversationMapper converts legacy enum-name rows in the Room cache
back to wire format on read.

Verified end-to-end against a docker LibreChat v0.8.5 instance with
OpenRouter user_provided keys; built-in .env Anthropic regression also
passes.
2026-04-28 20:21:28 -06:00
Garfie Chiu
4454324b6e
Merge pull request #65 from garfiec/fix/repo-cache-mutex
fix(data): mutex guard repository caches against suspension races
2026-04-27 22:06:31 -06:00
Garfie Chiu
cb7e7941a5
Merge pull request #64 from garfiec/fix/clearTokens-refresh-mutex
fix(data): mutex guard clearTokens vs refreshAccessToken race
2026-04-27 22:02:58 -06:00
Garfie
ac125bb24c fix(data): mutex guard repository caches against suspension races
AgentRepositoryImpl.cachedAgents and PresetRepositoryImpl.cachedPresets
are read-checked, fetched across a suspension point, then written. With
@Volatile alone, two coroutines can both observe null, both issue the
network request, and both write the cache — a redundant API call per
cold-cache race. Wrap read-check-write in a Mutex so at most one fetch
runs per cold cache; invalidateCache() becomes suspend to match.
2026-04-27 18:32:07 -06:00
Garfie
e2e3423dcb fix(data): mutex guard clearTokens vs refreshAccessToken race
Wraps `CommonTokenDataStore.clearTokens()` in the existing `refreshMutex`,
serializing logout against any in-flight `refreshAccessToken()` call
(which already holds the same mutex for its full HTTP duration). Without
this, a refresh completing successfully after `clearTokens()` would
silently resurrect the just-killed session by writing a fresh token to
disk. A private `clearTokensLocked()` helper holds the inner clear logic
and is called from inside `refreshAccessToken()` to avoid self-deadlock
on the non-reentrant mutex.
2026-04-27 18:32:06 -06:00
Garfie Chiu
f236d97c19
Merge pull request #63 from garfiec/chore/sync-upstream-skill-hardening
chore(skill): add reviewer pass + test-runner dispatch to /sync-upstream
2026-04-27 06:48:05 -06:00
Garfie
07c0f4f8ab chore(skill): add reviewer + auditor passes and test-runner dispatch to /sync-upstream
- New D3: two mandatory independent review passes after the verifier signs
  off — `reviewer` (hasn't seen verifier output) then `auditor` (after any
  fixes land). Two independent passes catch different things; a sync PR is
  too large to ship after a single review. Implementer fixes; reviewers
  do not.
- New D5: dispatch per-section test-runner teammates after presenting the
  report. Section split scales with sync size — small (per-platform) vs.
  medium/large (per-feature-area × platform).
- Existing D3 (Present results) renumbered to D4.

Captures the v0.8.5 sync experience: a single-pass verifier + monolithic
device-test plan are insufficient for syncs that touch dozens of files
across SSE/auth/UI surfaces.
2026-04-27 06:18:36 -06:00
Garfie Chiu
cc49fc6aa8
Merge pull request #62 from garfiec/feat/version-check-patch
feat(common): include patch in backend version compatibility check
2026-04-27 01:18:43 -06:00
Garfie
89eaccb428 feat(common): include patch in backend version compatibility checks
Upstream LibreChat ships breaking API and SSE-shape changes inside patch
releases (e.g. 0.8.4 → 0.8.5 changed the SSE payload contract), so the
mobile compat surface must compare patch as well as major.minor.

- isCompatible: exact (major, minor, patch) equality
- isCompatibleOrNewer: lex compare over (major, minor, patch); fixes a
  silent bug where 0.8.5-only feature gates returned true on 0.8.4
- VERSION_GATES.md updated to reflect patch-aware semantics
- New BackendVersionTest covers parse, isCompatible, isCompatibleOrNewer,
  and extractVersionFromFooter
2026-04-27 01:01:37 -06:00
Garfie Chiu
c7b5b7a365
Merge pull request #61 from garfiec/chore/sync-upstream-v0.8.5
chore(sync): upstream LibreChat v0.8.4 → v0.8.5
2026-04-27 01:00:36 -06:00
Garfie
abde86ca4e chore(sync): sync to upstream LibreChat v0.8.5
Targets upstream tag v0.8.5 (commit 9ccc8d9be). Bumps the supported
backend version constant, advances the upstream submodule pin, and
adds wire-protocol parity for new server features.

Wire protocol
- Add ContentType.SUMMARY enum value and flat sibling fields on
  MessageContentPart (content as JsonElement to absorb array/string/
  legacy-text variants per BaseClient.getSummaryText).
- Add Anthropic effort.xhigh dropdown value, ThinkingDisplay (Opus 4.7
  reasoning visibility), and Message.contextMeta pass-through.
- Add allowAccountDeletion to StartupConfig (defaults to true to
  preserve older-server behavior).
- Drop unused instanceProjectId from StartupConfig and from
  ConfigRepositoryImpl.isValidLibreChatConfig.

New endpoints / features
- Favorites: UserFavorite DTO + FavoritesApi + FavoritesRepository,
  Settings -> Favorites sub-screen (list/unpin), pin icons in chat
  model selector. Repository owns the canonical list as a StateFlow
  guarded by Mutex.withLock so chat-side toggles and settings-side
  bulk-unpin can't drift apart and concurrent writes can't lose each
  other.
- Prompt-group usage telemetry (POST /api/prompts/groups/:id/use,
  fire-and-forget on prompt insertion).
- Summarize SSE events (on_summarize_complete -> StreamEvent.ContextSummary)
  and a collapsible "Summarized earlier messages" card rendered from
  the persisted SUMMARY content part. Forward-compat else-arm preserved
  on both LangGraph and legacy SSE mappers.

Backward compatibility
- BackendVersion.isCompatibleOrNewer helper added; documented fail-open
  contract for callers that have already null-checked
  detectedBackendVersion.
- New VERSION_GATES.md catalog at repo root tracks every code path that
  branches on server version. Initial entries:
  - isCollaborative agent toggle (hidden on v0.8.5+; full-ACL UX deferred)
  - xhigh effort dropdown value (filtered out on <v0.8.5 to avoid
    server-side enum rejection)

Defensive hardening
- ChatApi.startChat asserts Content-Type: application/json before
  decoding ChatStartResponse and catches NoTransformationFoundException
  as a backstop, translating both to a friendly ApiException. Observed
  during testing on v0.8.5-rc1 with summarization enabled, where the
  agents chat-start endpoint returned 200 OK with no Content-Type and
  Ktor leaked a NoTransformationFoundException stack trace into the
  chat surface. Belt-and-suspenders against future backend regressions
  or unsupported-server pointing.

Documentation
- DISCOVERY.md updated for the v0.8.5 surface: /api/endpoints now
  requires JWT, /api/config pre-auth/post-auth split, allowAccountDeletion,
  instanceProjectId removal, favorites endpoints (with all three XOR
  variants: agentId | model+endpoint | spec), prompt-usage endpoint,
  /api/admin/** marked out-of-scope. Plus a new MessageContentPart +
  SUMMARY wire-shape section.

iOS
- Swift SharedFrameworkTest.swift updated for the new
  StreamEvent.ContextSummary variant and Message.contextMeta
  constructor argument.

Out of scope (by design)
- /api/admin/** route family - web-only feature.
- Full ACL migration for agent sharing - replaced by version-gating
  the legacy isCollaborative toggle.
- Spec-pinning UI on mobile - UserFavorite.spec round-trips for
  fidelity with web-authored pins, but mobile does not yet surface
  a spec picker.
2026-04-26 23:48:14 -06:00
Tim Abil
586674b9b0
Merge pull request #58 from garfiec/feat/ios-device-and-simulator-support
feat(ios): support building for both physical devices and simulators
2026-04-25 01:50:46 -04:00
txa5451
86d84a350f feat(ios): support building for both physical devices and simulators
- Replace hardcoded simulator framework path with SDK-conditional paths
  so Xcode automatically resolves iosSimulatorArm64 or iosArm64 based
  on the selected build target
- Fix Compose Resources build script to use \$PLATFORM_NAME instead of
  \$CONFIGURATION for platform detection
- Add CODE_SIGN_IDENTITY override for iphoneos SDK to enable device signing
- Document simulator and physical device build workflows in README
2026-04-25 01:37:39 -04:00
Garfie Chiu
4ec0d70769
Merge pull request #53 from garfiec/dependabot/gradle/ktor-3.4.3
chore(deps): bump ktor from 3.4.2 to 3.4.3
2026-04-25 00:03:34 -05:00
Garfie Chiu
5c83bf67ce
Merge pull request #54 from garfiec/dependabot/gradle/com.android.tools-desugar_jdk_libs-2.1.5
chore(deps): bump com.android.tools:desugar_jdk_libs from 2.1.4 to 2.1.5
2026-04-25 00:03:22 -05:00
Garfie Chiu
ced1871300
Merge pull request #55 from garfiec/dependabot/gradle/ksp-2.3.7
chore(deps): bump ksp from 2.3.6 to 2.3.7
2026-04-25 00:03:12 -05:00
Garfie Chiu
c82b077675
Merge pull request #57 from garfiec/dependabot/gradle/compose-multiplatform-1.11.0-beta03
chore(deps): bump compose-multiplatform from 1.11.0-beta02 to 1.11.0-beta03
2026-04-25 00:02:57 -05:00
Garfie Chiu
89a0dd7bd5
Merge pull request #52 from garfiec/worktree-issue-49-investigation-resume
fix(permissions): gate mobile surfaces on server role permissions (#49)
2026-04-24 23:00:53 -05:00
Garfie
6fde5c55cb fix(permissions): gate mobile surfaces on server role permissions (#49) 2026-04-24 21:21:05 -05:00
dependabot[bot]
fb5c858d3b
chore(deps): bump compose-multiplatform
Bumps `compose-multiplatform` from 1.11.0-beta02 to 1.11.0-beta03.

Updates `org.jetbrains.compose:compose-gradle-plugin` from 1.11.0-beta02 to 1.11.0-beta03
- [Release notes](https://github.com/JetBrains/compose-multiplatform/releases)
- [Changelog](https://github.com/JetBrains/compose-multiplatform/blob/master/CHANGELOG.md)
- [Commits](https://github.com/JetBrains/compose-multiplatform/compare/v1.11.0-beta02...v1.11.0-beta03)

Updates `org.jetbrains.compose` from 1.11.0-beta02 to 1.11.0-beta03
- [Release notes](https://github.com/JetBrains/compose-multiplatform/releases)
- [Changelog](https://github.com/JetBrains/compose-multiplatform/blob/master/CHANGELOG.md)
- [Commits](https://github.com/JetBrains/compose-multiplatform/compare/v1.11.0-beta02...v1.11.0-beta03)

---
updated-dependencies:
- dependency-name: org.jetbrains.compose:compose-gradle-plugin
  dependency-version: 1.11.0-beta03
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jetbrains.compose
  dependency-version: 1.11.0-beta03
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-25 00:41:32 +00:00
dependabot[bot]
d5d76ba61c
chore(deps): bump ksp from 2.3.6 to 2.3.7
Bumps `ksp` from 2.3.6 to 2.3.7.

Updates `com.google.devtools.ksp:symbol-processing-gradle-plugin` from 2.3.6 to 2.3.7
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.3.6...2.3.7)

Updates `com.google.devtools.ksp` from 2.3.6 to 2.3.7
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.3.6...2.3.7)

---
updated-dependencies:
- dependency-name: com.google.devtools.ksp:symbol-processing-gradle-plugin
  dependency-version: 2.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: com.google.devtools.ksp
  dependency-version: 2.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-25 00:33:27 +00:00
dependabot[bot]
a06d93f1d6
chore(deps): bump com.android.tools:desugar_jdk_libs from 2.1.4 to 2.1.5
Bumps [com.android.tools:desugar_jdk_libs](https://github.com/google/desugar_jdk_libs) from 2.1.4 to 2.1.5.
- [Changelog](https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/desugar_jdk_libs/commits)

---
updated-dependencies:
- dependency-name: com.android.tools:desugar_jdk_libs
  dependency-version: 2.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-25 00:33:15 +00:00
dependabot[bot]
5ac846c9c2
chore(deps): bump ktor from 3.4.2 to 3.4.3
Bumps `ktor` from 3.4.2 to 3.4.3.

Updates `io.ktor:ktor-client-core` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

Updates `io.ktor:ktor-client-okhttp` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

Updates `io.ktor:ktor-client-darwin` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

Updates `io.ktor:ktor-client-content-negotiation` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

Updates `io.ktor:ktor-serialization-kotlinx-json` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

Updates `io.ktor:ktor-client-logging` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

Updates `io.ktor:ktor-client-auth` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

Updates `io.ktor:ktor-client-mock` from 3.4.2 to 3.4.3
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.4.2...3.4.3)

---
updated-dependencies:
- dependency-name: io.ktor:ktor-client-core
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.ktor:ktor-client-okhttp
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.ktor:ktor-client-darwin
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.ktor:ktor-client-content-negotiation
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.ktor:ktor-serialization-kotlinx-json
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.ktor:ktor-client-logging
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.ktor:ktor-client-auth
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: io.ktor:ktor-client-mock
  dependency-version: 3.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-25 00:33:04 +00:00
Garfie Chiu
dad37f510e
Merge pull request #50 from garfiec/chore/sync-upstream-skill-fixes
chore(sync-upstream): fix skill bugs and expand upstream scan coverage
2026-04-22 22:35:09 -05:00
Garfie
720bc516e6 chore(sync-upstream): fix skill bugs and expand upstream scan coverage 2026-04-22 22:15:01 -05:00
Garfie Chiu
8f9202ef50
Merge pull request #45 from garfiec/dependabot/gradle/androidx.compose-compose-bom-2026.03.01
chore(deps): bump androidx.compose:compose-bom from 2025.05.00 to 2026.03.01
2026-04-22 20:08:16 -05:00
dependabot[bot]
baa3ec2c10
chore(deps): bump androidx.compose:compose-bom
Bumps androidx.compose:compose-bom from 2025.05.00 to 2026.03.01.

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.03.01
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 01:05:59 +00:00
Garfie Chiu
92d8f63e35
Merge pull request #44 from garfiec/dependabot/gradle/androidx.test-runner-1.7.0
chore(deps): bump androidx.test:runner from 1.6.2 to 1.7.0
2026-04-22 20:05:15 -05:00
Garfie Chiu
9aea3aa725
Merge pull request #46 from garfiec/dependabot/gradle/markdown-renderer-0.40.2
chore(deps): bump markdown-renderer from 0.39.2 to 0.40.2
2026-04-22 20:05:00 -05:00
Garfie Chiu
b6f8f591b3
Merge pull request #47 from garfiec/dependabot/gradle/agp-9.1.1
chore(deps): bump agp from 9.1.0 to 9.1.1
2026-04-22 20:04:51 -05:00
Garfie Chiu
ed01279dae
Merge pull request #48 from garfiec/dependabot/gradle/compose-multiplatform-1.11.0-beta02
chore(deps): bump compose-multiplatform from 1.11.0-beta01 to 1.11.0-beta02
2026-04-22 20:04:41 -05:00
dependabot[bot]
0b74549f9f
chore(deps): bump compose-multiplatform
Bumps `compose-multiplatform` from 1.11.0-beta01 to 1.11.0-beta02.

Updates `org.jetbrains.compose:compose-gradle-plugin` from 1.11.0-beta01 to 1.11.0-beta02
- [Release notes](https://github.com/JetBrains/compose-multiplatform/releases)
- [Changelog](https://github.com/JetBrains/compose-multiplatform/blob/master/CHANGELOG.md)
- [Commits](https://github.com/JetBrains/compose-multiplatform/compare/v1.11.0-beta01...v1.11.0-beta02)

Updates `org.jetbrains.compose` from 1.11.0-beta01 to 1.11.0-beta02
- [Release notes](https://github.com/JetBrains/compose-multiplatform/releases)
- [Changelog](https://github.com/JetBrains/compose-multiplatform/blob/master/CHANGELOG.md)
- [Commits](https://github.com/JetBrains/compose-multiplatform/compare/v1.11.0-beta01...v1.11.0-beta02)

---
updated-dependencies:
- dependency-name: org.jetbrains.compose:compose-gradle-plugin
  dependency-version: 1.11.0-beta02
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jetbrains.compose
  dependency-version: 1.11.0-beta02
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-18 00:33:31 +00:00
dependabot[bot]
f1476121ef
chore(deps): bump agp from 9.1.0 to 9.1.1
Bumps `agp` from 9.1.0 to 9.1.1.

Updates `com.android.tools.build:gradle` from 9.1.0 to 9.1.1

Updates `com.android.application` from 9.1.0 to 9.1.1

Updates `com.android.library` from 9.1.0 to 9.1.1

---
updated-dependencies:
- dependency-name: com.android.tools.build:gradle
  dependency-version: 9.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: com.android.application
  dependency-version: 9.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: com.android.library
  dependency-version: 9.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-18 00:33:15 +00:00
dependabot[bot]
c824d85a50
chore(deps): bump markdown-renderer from 0.39.2 to 0.40.2
Bumps `markdown-renderer` from 0.39.2 to 0.40.2.

Updates `com.mikepenz:multiplatform-markdown-renderer-m3` from 0.39.2 to 0.40.2
- [Release notes](https://github.com/mikepenz/multiplatform-markdown-renderer/releases)
- [Changelog](https://github.com/mikepenz/multiplatform-markdown-renderer/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/mikepenz/multiplatform-markdown-renderer/compare/v0.39.2...v0.40.2)

Updates `com.mikepenz:multiplatform-markdown-renderer-coil3` from 0.39.2 to 0.40.2
- [Release notes](https://github.com/mikepenz/multiplatform-markdown-renderer/releases)
- [Changelog](https://github.com/mikepenz/multiplatform-markdown-renderer/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/mikepenz/multiplatform-markdown-renderer/compare/v0.39.2...v0.40.2)

---
updated-dependencies:
- dependency-name: com.mikepenz:multiplatform-markdown-renderer-m3
  dependency-version: 0.40.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.mikepenz:multiplatform-markdown-renderer-coil3
  dependency-version: 0.40.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-18 00:32:53 +00:00
dependabot[bot]
c8ac23b5b8
chore(deps): bump androidx.test:runner from 1.6.2 to 1.7.0
Bumps androidx.test:runner from 1.6.2 to 1.7.0.

---
updated-dependencies:
- dependency-name: androidx.test:runner
  dependency-version: 1.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-18 00:32:37 +00:00
Garfie Chiu
47b3cb1e96
Merge pull request #43 from garfiec/fix/stop-double-logout
fix(settings): stop double-invoking authRepository.logout on logout/delete
2026-04-15 01:59:57 -05:00
Garfie
ff25ef6f47 fix(settings): stop double-invoking authRepository.logout on logout/delete
SettingsViewModel.logout() and deleteAccount() each called
authRepository.logout() directly before flipping the state flag that
drives the screen's LaunchedEffect -> onLogout callback ->
NavHostViewModel.logout(), which invokes authRepository.logout() again.
Each redundant call fires a POST /api/auth/logout that 401s (tokens
already gone) and re-runs session cleanup; with the planned full-wipe
change that duplication becomes actively harmful.

Collapse SettingsViewModel.logout() to a single state update, and drop
the direct authRepository.logout() call from the deleteAccount success
branch. NavHostViewModel.logout() remains the single source of truth
for the cleanup side of the flow.
2026-04-14 22:52:15 -05:00
Garfie Chiu
8463b1fc9f
Merge pull request #42 from garfiec/fix/conversation-list-state-reset
fix(navigation): fully reset ConversationListStateHolder on logout
2026-04-14 22:31:15 -05:00
Garfie Chiu
a0602228dd
Merge pull request #41 from garfiec/fix/android-temp-files-subdirs
fix(cache): route Android temp files into named subdirs for logout sweep
2026-04-14 22:30:34 -05:00
Garfie
9159bcf62e fix(cache): route Android temp files into named subdirs for logout sweep
Five Android producers wrote temp files directly into cacheDir root,
bypassing CommonSessionCacheCleaner which only sweeps entries listed in
CACHE_SUBDIRECTORIES. Moved each producer to its own named subdir and
registered the new names so logout actually clears them.
2026-04-14 21:30:31 -05:00
Garfie
c613175c6e fix(navigation): fully reset ConversationListStateHolder on logout
reset() now clears pagination cursor, hasMore, isLoadingMore and
isRefreshing state so the next user session does not inherit stuck
spinners or stale cursors from the previous session. Also cancel and
restart the search debounce collector so an in-flight debounced
emission from the previous session cannot land after reset() and
clobber the cleared grouped conversations list.
2026-04-14 21:30:30 -05:00
Garfie Chiu
4814f8a5b5
Merge pull request #40 from garfiec/fix/camera-photos-sweep
fix(data): sweep camera_photos cache dir on logout
2026-04-14 19:57:21 -05:00
Garfie Chiu
7433f75187
Merge pull request #39 from garfiec/fix/volatile-agent-preset-caches
fix(data): mark agent/preset caches @Volatile
2026-04-14 19:56:01 -05:00
Garfie
6f2b397b9a fix(data): mark in-memory repository caches @Volatile for cross-thread visibility 2026-04-14 19:46:59 -05:00
Garfie
5b94495197 fix(data): sweep camera_photos cache dir on logout
The Android camera-capture flow in ChatInput writes temp photos to
cacheDir/camera_photos/ but this subdir was missing from
CACHE_SUBDIRECTORIES, so captured photos leaked across user sessions.
Add it to the sweep list so CommonSessionCacheCleaner clears it on
logout.
2026-04-14 18:11:48 -05:00
Garfie Chiu
77ee9fed1a
Merge pull request #38 from garfiec/fix/ios-sse-streaming-via-nwconnection
fix(ios): stream SSE via NWConnection to bypass NSURLSession text/* buffering
2026-04-14 18:08:09 -05:00