Files
openclaw/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel+ToolActivity.swift
Colin Johnson 1ca6b6ff67 feat(ios): unify chat and voice experience (#107879)
* feat(ios): unify chat and voice experience

* refactor(ios): finish unified chat ownership

* fix(ios): unify chat and voice capture ownership

* fix(ios): serialize Talk permission hydration

* fix(ios): clear voice CI regressions

* fix(ios): clear remaining unified chat CI failures

* chore(i18n): sync native source inventory

* refactor(ios): defer provider-only realtime voice

* fix(ios): clean unified chat voice PR

* fix(ios): localize unified voice controls

* fix(ios): serialize composer audio controls

* fix(ios): isolate dictation preparation lifecycle

* fix(ios): key chat tab icons by appearance

* fix(ios): preserve talk upgrade handshakes

* fix(ios): refresh native i18n inventory

* fix(ios): reconcile shared locale artifacts

* fix(ios): satisfy chat view lint limit

* fix(ios): reconcile shared composer implementation

* test(apple): avoid XCTest actor deinit crash

* fix(ios): satisfy SwiftFormat scope spacing

* fix(ios): remove duplicate merged helper declarations
2026-07-18 14:30:10 -04:00

26 lines
772 B
Swift

import Foundation
public typealias OpenClawChatToolActivityHandler = @MainActor @Sendable (
_ id: String,
_ name: String,
_ isActive: Bool,
_ sessionKey: String) -> Void
extension OpenClawChatViewModel {
public func endPendingToolActivities() {
self.pendingToolCallsById = [:]
}
func reportToolActivityChanges(
from previous: [String: OpenClawChatPendingToolCall],
to current: [String: OpenClawChatPendingToolCall])
{
for (id, call) in previous where current[id] == nil {
self.onToolActivity?(id, call.name, false, self.sessionKey)
}
for (id, call) in current where previous[id] == nil {
self.onToolActivity?(id, call.name, true, self.sessionKey)
}
}
}