From 815655a73c2fcbf4d4a4eb73c4bfa2ab0aa860ed Mon Sep 17 00:00:00 2001 From: James Magahern Date: Sat, 2 May 2026 18:09:22 -0700 Subject: [PATCH] ios: fix api endpoint change --- ios/AGENTS.md | 2 +- .../Sybil/Sources/Sybil/SybilAPIClient.swift | 4 +++- .../Sources/Sybil/SybilSettingsStore.swift | 5 ----- .../Sybil/Tests/SybilTests/SybilTests.swift | 22 +++++++++++++++++-- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/ios/AGENTS.md b/ios/AGENTS.md index e38cd66..53c322b 100644 --- a/ios/AGENTS.md +++ b/ios/AGENTS.md @@ -35,7 +35,7 @@ Instructions for work under `/Users/buzzert/src/sybil-2/ios`. ## Practical Notes - Default API URL is `http://127.0.0.1:8787` (configurable in-app). -- Previously saved `/api` API roots are normalized to the server root by the iOS client. +- The iOS client preserves an explicit `/api` base path for proxied deployments. - Provider fallback models: - OpenAI: `gpt-4.1-mini` - Anthropic: `claude-3-5-sonnet-latest` diff --git a/ios/Packages/Sybil/Sources/Sybil/SybilAPIClient.swift b/ios/Packages/Sybil/Sources/Sybil/SybilAPIClient.swift index 531cbab..72eccf9 100644 --- a/ios/Packages/Sybil/Sources/Sybil/SybilAPIClient.swift +++ b/ios/Packages/Sybil/Sources/Sybil/SybilAPIClient.swift @@ -21,12 +21,14 @@ actor SybilAPIClient { private let configuration: APIConfiguration private let session: URLSession + @MainActor private static let iso8601FormatterWithFractional: ISO8601DateFormatter = { let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] return formatter }() - + + @MainActor private static let iso8601Formatter: ISO8601DateFormatter = { let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime] diff --git a/ios/Packages/Sybil/Sources/Sybil/SybilSettingsStore.swift b/ios/Packages/Sybil/Sources/Sybil/SybilSettingsStore.swift index 86dbf03..b638bf1 100644 --- a/ios/Packages/Sybil/Sources/Sybil/SybilSettingsStore.swift +++ b/ios/Packages/Sybil/Sources/Sybil/SybilSettingsStore.swift @@ -72,11 +72,6 @@ final class SybilSettingsStore { return nil } - let path = components.path.trimmingCharacters(in: CharacterSet(charactersIn: "/")) - if path.lowercased() == "api" { - components.path = "" - } - return components.url } } diff --git a/ios/Packages/Sybil/Tests/SybilTests/SybilTests.swift b/ios/Packages/Sybil/Tests/SybilTests/SybilTests.swift index 24c6fff..7fe63f6 100644 --- a/ios/Packages/Sybil/Tests/SybilTests/SybilTests.swift +++ b/ios/Packages/Sybil/Tests/SybilTests/SybilTests.swift @@ -1,6 +1,24 @@ import Testing @testable import Sybil -@Test func example() async throws { - // Write your test here and use APIs like `#expect(...)` to check expected conditions. +@MainActor +@Test func normalizedAPIBaseURLPreservesExplicitAPIPath() async throws { + let defaults = UserDefaults(suiteName: #function)! + defaults.removePersistentDomain(forName: #function) + + let settings = SybilSettingsStore(defaults: defaults) + settings.apiBaseURL = "https://sybil.bajor.cloud/api/" + + #expect(settings.normalizedAPIBaseURL?.absoluteString == "https://sybil.bajor.cloud/api") +} + +@MainActor +@Test func normalizedAPIBaseURLTrimsWhitespaceAndTrailingSlashes() async throws { + let defaults = UserDefaults(suiteName: #function)! + defaults.removePersistentDomain(forName: #function) + + let settings = SybilSettingsStore(defaults: defaults) + settings.apiBaseURL = " http://127.0.0.1:8787/// " + + #expect(settings.normalizedAPIBaseURL?.absoluteString == "http://127.0.0.1:8787") }