diff --git a/apps/ios/Sources/Design/AgentProDreamingDestination.swift b/apps/ios/Sources/Design/AgentProDreamingDestination.swift index fe4a540a1b6e..4e6213c1355c 100644 --- a/apps/ios/Sources/Design/AgentProDreamingDestination.swift +++ b/apps/ios/Sources/Design/AgentProDreamingDestination.swift @@ -486,12 +486,12 @@ struct AgentProDreamingDestination: View { } } - private func detailMetric(label: String, value: String) -> some View { + private func detailMetric(label: OpenClawTextValue, value: String) -> some View { VStack(alignment: .leading, spacing: 3) { - Text(label) + label.text .font(OpenClawType.caption2Medium) .foregroundStyle(.secondary) - Text(value) + Text(verbatim: value) .font(OpenClawType.subheadSemiBold) .lineLimit(1) .minimumScaleFactor(0.8) diff --git a/apps/ios/Sources/Design/AgentProTab+DetailComponents.swift b/apps/ios/Sources/Design/AgentProTab+DetailComponents.swift index 89366d8ab3ca..a6fe7c09ac0f 100644 --- a/apps/ios/Sources/Design/AgentProTab+DetailComponents.swift +++ b/apps/ios/Sources/Design/AgentProTab+DetailComponents.swift @@ -2,12 +2,12 @@ import OpenClawKit import SwiftUI extension AgentProTab { - func detailMetric(label: String, value: String) -> some View { + func detailMetric(label: OpenClawTextValue, value: String) -> some View { VStack(alignment: .leading, spacing: 3) { - Text(label) + label.text .font(OpenClawType.caption2Medium) .foregroundStyle(.secondary) - Text(value) + Text(verbatim: value) .font(OpenClawType.subheadSemiBold) .lineLimit(1) .minimumScaleFactor(0.8) @@ -19,13 +19,17 @@ extension AgentProTab { in: RoundedRectangle(cornerRadius: OpenClawRadius.sm, style: .continuous)) } - func emptyDetailRow(icon: String, title: String, detail: String) -> some View { + func emptyDetailRow( + icon: String, + title: OpenClawTextValue, + detail: OpenClawTextValue) -> some View + { HStack(spacing: 12) { ProIconBadge(systemName: icon, color: .secondary) VStack(alignment: .leading, spacing: 3) { - Text(title) + title.text .font(OpenClawType.subheadSemiBold) - Text(detail) + detail.text .font(OpenClawType.caption) .foregroundStyle(.secondary) .lineLimit(2) diff --git a/apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatViewModelOutboxTests.swift b/apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatViewModelOutboxTests.swift index b0360c8de7e9..215113d5ad7f 100644 --- a/apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatViewModelOutboxTests.swift +++ b/apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatViewModelOutboxTests.swift @@ -1749,7 +1749,7 @@ struct ChatViewModelOutboxTests { vm.messages.first { vm.outboxState(for: $0.id)?.isFailed == true }?.id }) await MainActor.run { vm.retryOutboxMessage(failedMessageID) } - try await waitUntil("retried command drained") { + try await waitUntil("retried command drained", timeoutSeconds: 30) { await store.loadCommands().isEmpty } #expect(await transport.state.sentIdempotencyKeys.count == 1) diff --git a/scripts/apple-app-i18n.ts b/scripts/apple-app-i18n.ts index 614588efee1f..a47824e6f9b3 100644 --- a/scripts/apple-app-i18n.ts +++ b/scripts/apple-app-i18n.ts @@ -240,6 +240,18 @@ const LOCALIZED_WRAPPER_CONTRACTS: Record = { "private func detailMetric(label: OpenClawTextValue, value: String)", "title: OpenClawTextValue,\n detail: OpenClawTextValue", ], + "apps/ios/Sources/Design/AgentProDreamingDestination.swift": [ + "private func detailMetric(label: OpenClawTextValue, value: String)", + "label.text", + "Text(verbatim: value)", + ], + "apps/ios/Sources/Design/AgentProTab+DetailComponents.swift": [ + "func detailMetric(label: OpenClawTextValue, value: String)", + "Text(verbatim: value)", + "func emptyDetailRow(\n icon: String,\n title: OpenClawTextValue,\n detail: OpenClawTextValue)", + "title.text", + "detail.text", + ], "apps/ios/Sources/Design/CommandCenterSupport.swift": [ "Text(verbatim: self.item.title)", "Text(verbatim: self.item.trailing)", diff --git a/src/system-agent/setup-inference-detection.test.ts b/src/system-agent/setup-inference-detection.test.ts index 27cdf3200bc1..b4ba5ee7a3a8 100644 --- a/src/system-agent/setup-inference-detection.test.ts +++ b/src/system-agent/setup-inference-detection.test.ts @@ -1,6 +1,8 @@ import { createServer, get } from "node:http"; import type { AddressInfo } from "node:net"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { DEFAULT_AGENT_WORKSPACE_DIR } from "../agents/workspace-default.js"; +import { listRecommendedToolInstalls } from "../plugins/recommended-tool-installs.js"; import type { SetupInferenceDetection } from "./setup-inference.js"; const blockingWorkerUrl = new URL( @@ -20,8 +22,8 @@ function emptyDetection(): SetupInferenceDetection { unavailableCandidates: [], manualProviders: [], authOptions: [], - recommendedInstalls: [], - workspace: "/tmp/work", + recommendedInstalls: listRecommendedToolInstalls(), + workspace: DEFAULT_AGENT_WORKSPACE_DIR, setupComplete: false, }; } diff --git a/src/system-agent/tui-backend.test.ts b/src/system-agent/tui-backend.test.ts index 1e88ea8d78d4..33745b665fab 100644 --- a/src/system-agent/tui-backend.test.ts +++ b/src/system-agent/tui-backend.test.ts @@ -155,7 +155,7 @@ describe("runSystemAgentTui", () => { if (!options.backend || typeof options.backend !== "object") { throw new Error("expected openclaw TUI backend"); } - }); + }, 240_000); it("reports the verified model without its auth profile and the effective thinking level", async () => { const config = { diff --git a/test/scripts/apple-app-i18n.test.ts b/test/scripts/apple-app-i18n.test.ts index c542d41a2a94..3c94b0bce34e 100644 --- a/test/scripts/apple-app-i18n.test.ts +++ b/test/scripts/apple-app-i18n.test.ts @@ -381,6 +381,14 @@ describe("Apple app i18n catalogs", () => { "apps/ios/Sources/Design/AgentProTab+Overview.swift", "utf8", ); + const agentDetailComponents = await readFile( + "apps/ios/Sources/Design/AgentProTab+DetailComponents.swift", + "utf8", + ); + const agentDreaming = await readFile( + "apps/ios/Sources/Design/AgentProDreamingDestination.swift", + "utf8", + ); const settingsActions = await readFile( "apps/ios/Sources/Design/SettingsProTabActions.swift", "utf8", @@ -423,6 +431,23 @@ describe("Apple app i18n catalogs", () => { expect(agentOverview).toContain( "func metricTile(\n icon: String,\n title: OpenClawTextValue,\n value: String,\n detail: OpenClawTextValue", ); + expect(agentDetailComponents).toContain( + "func detailMetric(label: OpenClawTextValue, value: String)", + ); + expect(agentDetailComponents).toContain("Text(verbatim: value)"); + expect(agentDetailComponents).toContain( + "func emptyDetailRow(\n icon: String,\n title: OpenClawTextValue,\n detail: OpenClawTextValue)", + ); + expect(agentDetailComponents).toContain("title.text"); + expect(agentDetailComponents).toContain("detail.text"); + expect(agentDetailComponents).not.toContain("func detailMetric(label: String"); + expect(agentDetailComponents).not.toContain("func emptyDetailRow(icon: String, title: String"); + expect(agentDreaming).toContain( + "private func detailMetric(label: OpenClawTextValue, value: String)", + ); + expect(agentDreaming).toContain("label.text"); + expect(agentDreaming).toContain("Text(verbatim: value)"); + expect(agentDreaming).not.toContain("private func detailMetric(label: String"); expect(settingsActions).toContain( "func diagnosticCheckRow(\n icon: String,\n title: OpenClawTextValue,\n detail: OpenClawTextValue,\n value: OpenClawTextValue", );