diff --git a/CHANGELOG.md b/CHANGELOG.md index c599f9345..f278e0de0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +### Breaking +- Identifiers: rename bundle IDs and internal domains to `com.clawdis.*` (macOS: `com.clawdis.mac`, iOS: `com.clawdis.ios`, Android: `com.clawdis.android`) and update the gateway LaunchAgent label to `com.clawdis.gateway`. + ### Features - Gateway: support `gateway.port` + `CLAWDIS_GATEWAY_PORT` across CLI, TUI, and macOS app. diff --git a/apps/android/app/build.gradle.kts b/apps/android/app/build.gradle.kts index db3b17dca..1c7dbaa51 100644 --- a/apps/android/app/build.gradle.kts +++ b/apps/android/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } android { - namespace = "com.steipete.clawdis.node" + namespace = "com.clawdis.android" compileSdk = 36 sourceSets { @@ -16,7 +16,7 @@ android { } defaultConfig { - applicationId = "com.steipete.clawdis.node" + applicationId = "com.clawdis.android" minSdk = 31 targetSdk = 36 versionCode = 1 diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/CameraHudState.kt b/apps/android/app/src/main/java/com/clawdis/android/CameraHudState.kt similarity index 83% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/CameraHudState.kt rename to apps/android/app/src/main/java/com/clawdis/android/CameraHudState.kt index f33e147fb..d664083fa 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/CameraHudState.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/CameraHudState.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android enum class CameraHudKind { Photo, diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/DeviceNames.kt b/apps/android/app/src/main/java/com/clawdis/android/DeviceNames.kt similarity index 94% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/DeviceNames.kt rename to apps/android/app/src/main/java/com/clawdis/android/DeviceNames.kt index 327a4e955..fe886eab2 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/DeviceNames.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/DeviceNames.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.content.Context import android.os.Build diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/MainActivity.kt b/apps/android/app/src/main/java/com/clawdis/android/MainActivity.kt similarity index 96% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/MainActivity.kt rename to apps/android/app/src/main/java/com/clawdis/android/MainActivity.kt index 8be49d36d..cf66b3b1a 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/MainActivity.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/MainActivity.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.Manifest import android.content.pm.ApplicationInfo @@ -18,8 +18,8 @@ import androidx.core.view.WindowInsetsControllerCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle -import com.steipete.clawdis.node.ui.RootScreen -import com.steipete.clawdis.node.ui.ClawdisTheme +import com.clawdis.android.ui.RootScreen +import com.clawdis.android.ui.ClawdisTheme import kotlinx.coroutines.launch class MainActivity : ComponentActivity() { diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/MainViewModel.kt b/apps/android/app/src/main/java/com/clawdis/android/MainViewModel.kt similarity index 93% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/MainViewModel.kt rename to apps/android/app/src/main/java/com/clawdis/android/MainViewModel.kt index e93bd432a..7a1ac83f4 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/MainViewModel.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/MainViewModel.kt @@ -1,12 +1,12 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.app.Application import androidx.lifecycle.AndroidViewModel -import com.steipete.clawdis.node.bridge.BridgeEndpoint -import com.steipete.clawdis.node.chat.OutgoingAttachment -import com.steipete.clawdis.node.node.CameraCaptureManager -import com.steipete.clawdis.node.node.CanvasController -import com.steipete.clawdis.node.node.ScreenRecordManager +import com.clawdis.android.bridge.BridgeEndpoint +import com.clawdis.android.chat.OutgoingAttachment +import com.clawdis.android.node.CameraCaptureManager +import com.clawdis.android.node.CanvasController +import com.clawdis.android.node.ScreenRecordManager import kotlinx.coroutines.flow.StateFlow class MainViewModel(app: Application) : AndroidViewModel(app) { diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeApp.kt b/apps/android/app/src/main/java/com/clawdis/android/NodeApp.kt similarity index 78% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/NodeApp.kt rename to apps/android/app/src/main/java/com/clawdis/android/NodeApp.kt index 36b8616bc..514baac11 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeApp.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/NodeApp.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.app.Application diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeForegroundService.kt b/apps/android/app/src/main/java/com/clawdis/android/NodeForegroundService.kt similarity index 98% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/NodeForegroundService.kt rename to apps/android/app/src/main/java/com/clawdis/android/NodeForegroundService.kt index 64ebc9c74..4fe562c2f 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeForegroundService.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/NodeForegroundService.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.app.Notification import android.app.NotificationChannel @@ -146,7 +146,7 @@ class NodeForegroundService : Service() { private const val CHANNEL_ID = "connection" private const val NOTIFICATION_ID = 1 - private const val ACTION_STOP = "com.steipete.clawdis.node.action.STOP" + private const val ACTION_STOP = "com.clawdis.android.action.STOP" fun start(context: Context) { val intent = Intent(context, NodeForegroundService::class.java) diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeRuntime.kt b/apps/android/app/src/main/java/com/clawdis/android/NodeRuntime.kt similarity index 96% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/NodeRuntime.kt rename to apps/android/app/src/main/java/com/clawdis/android/NodeRuntime.kt index 1b63a4948..46b9b136a 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/NodeRuntime.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/NodeRuntime.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.Manifest import android.content.Context @@ -6,27 +6,27 @@ import android.content.pm.PackageManager import android.os.Build import android.os.SystemClock import androidx.core.content.ContextCompat -import com.steipete.clawdis.node.chat.ChatController -import com.steipete.clawdis.node.chat.ChatMessage -import com.steipete.clawdis.node.chat.ChatPendingToolCall -import com.steipete.clawdis.node.chat.ChatSessionEntry -import com.steipete.clawdis.node.chat.OutgoingAttachment -import com.steipete.clawdis.node.bridge.BridgeDiscovery -import com.steipete.clawdis.node.bridge.BridgeEndpoint -import com.steipete.clawdis.node.bridge.BridgePairingClient -import com.steipete.clawdis.node.bridge.BridgeSession -import com.steipete.clawdis.node.node.CameraCaptureManager -import com.steipete.clawdis.node.BuildConfig -import com.steipete.clawdis.node.node.CanvasController -import com.steipete.clawdis.node.node.ScreenRecordManager -import com.steipete.clawdis.node.protocol.ClawdisCapability -import com.steipete.clawdis.node.protocol.ClawdisCameraCommand -import com.steipete.clawdis.node.protocol.ClawdisCanvasA2UIAction -import com.steipete.clawdis.node.protocol.ClawdisCanvasA2UICommand -import com.steipete.clawdis.node.protocol.ClawdisCanvasCommand -import com.steipete.clawdis.node.protocol.ClawdisScreenCommand -import com.steipete.clawdis.node.voice.TalkModeManager -import com.steipete.clawdis.node.voice.VoiceWakeManager +import com.clawdis.android.chat.ChatController +import com.clawdis.android.chat.ChatMessage +import com.clawdis.android.chat.ChatPendingToolCall +import com.clawdis.android.chat.ChatSessionEntry +import com.clawdis.android.chat.OutgoingAttachment +import com.clawdis.android.bridge.BridgeDiscovery +import com.clawdis.android.bridge.BridgeEndpoint +import com.clawdis.android.bridge.BridgePairingClient +import com.clawdis.android.bridge.BridgeSession +import com.clawdis.android.node.CameraCaptureManager +import com.clawdis.android.BuildConfig +import com.clawdis.android.node.CanvasController +import com.clawdis.android.node.ScreenRecordManager +import com.clawdis.android.protocol.ClawdisCapability +import com.clawdis.android.protocol.ClawdisCameraCommand +import com.clawdis.android.protocol.ClawdisCanvasA2UIAction +import com.clawdis.android.protocol.ClawdisCanvasA2UICommand +import com.clawdis.android.protocol.ClawdisCanvasCommand +import com.clawdis.android.protocol.ClawdisScreenCommand +import com.clawdis.android.voice.TalkModeManager +import com.clawdis.android.voice.VoiceWakeManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/PermissionRequester.kt b/apps/android/app/src/main/java/com/clawdis/android/PermissionRequester.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/PermissionRequester.kt rename to apps/android/app/src/main/java/com/clawdis/android/PermissionRequester.kt index 7879c85d5..33902edc3 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/PermissionRequester.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/PermissionRequester.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.content.pm.PackageManager import android.content.Intent diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ScreenCaptureRequester.kt b/apps/android/app/src/main/java/com/clawdis/android/ScreenCaptureRequester.kt similarity index 98% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ScreenCaptureRequester.kt rename to apps/android/app/src/main/java/com/clawdis/android/ScreenCaptureRequester.kt index 53c9e173c..3cf730100 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ScreenCaptureRequester.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ScreenCaptureRequester.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import android.app.Activity import android.content.Context diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/SecurePrefs.kt b/apps/android/app/src/main/java/com/clawdis/android/SecurePrefs.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/SecurePrefs.kt rename to apps/android/app/src/main/java/com/clawdis/android/SecurePrefs.kt index b288ef29e..8b1b240b3 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/SecurePrefs.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/SecurePrefs.kt @@ -1,6 +1,6 @@ @file:Suppress("DEPRECATION") -package com.steipete.clawdis.node +package com.clawdis.android import android.content.Context import androidx.core.content.edit diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/VoiceWakeMode.kt b/apps/android/app/src/main/java/com/clawdis/android/VoiceWakeMode.kt similarity index 89% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/VoiceWakeMode.kt rename to apps/android/app/src/main/java/com/clawdis/android/VoiceWakeMode.kt index 0b97a85cb..1236c3621 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/VoiceWakeMode.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/VoiceWakeMode.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android enum class VoiceWakeMode(val rawValue: String) { Off("off"), diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/WakeWords.kt b/apps/android/app/src/main/java/com/clawdis/android/WakeWords.kt similarity index 93% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/WakeWords.kt rename to apps/android/app/src/main/java/com/clawdis/android/WakeWords.kt index 175cf07f3..2a4864ad1 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/WakeWords.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/WakeWords.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android object WakeWords { const val maxWords: Int = 32 diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BonjourEscapes.kt b/apps/android/app/src/main/java/com/clawdis/android/bridge/BonjourEscapes.kt similarity index 95% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BonjourEscapes.kt rename to apps/android/app/src/main/java/com/clawdis/android/bridge/BonjourEscapes.kt index c250751a3..8659ee8ba 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BonjourEscapes.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/bridge/BonjourEscapes.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge object BonjourEscapes { fun decode(input: String): String { diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeDiscovery.kt b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeDiscovery.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeDiscovery.kt rename to apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeDiscovery.kt index b33261ccb..18c877909 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeDiscovery.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeDiscovery.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge import android.content.Context import android.net.ConnectivityManager diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeEndpoint.kt b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeEndpoint.kt similarity index 92% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeEndpoint.kt rename to apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeEndpoint.kt index 41c415c4b..b7a39efbe 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeEndpoint.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeEndpoint.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge data class BridgeEndpoint( val stableId: String, diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgePairingClient.kt b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgePairingClient.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgePairingClient.kt rename to apps/android/app/src/main/java/com/clawdis/android/bridge/BridgePairingClient.kt index c7ac303bc..355b13614 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgePairingClient.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgePairingClient.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeSession.kt b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeSession.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeSession.kt rename to apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeSession.kt index 83e2cb744..50346509e 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/bridge/BridgeSession.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/bridge/BridgeSession.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope @@ -11,7 +11,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import com.steipete.clawdis.node.BuildConfig +import com.clawdis.android.BuildConfig import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/chat/ChatController.kt b/apps/android/app/src/main/java/com/clawdis/android/chat/ChatController.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/chat/ChatController.kt rename to apps/android/app/src/main/java/com/clawdis/android/chat/ChatController.kt index 1e7a23dcf..2a01527a0 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/chat/ChatController.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/chat/ChatController.kt @@ -1,6 +1,6 @@ -package com.steipete.clawdis.node.chat +package com.clawdis.android.chat -import com.steipete.clawdis.node.bridge.BridgeSession +import com.clawdis.android.bridge.BridgeSession import java.util.UUID import java.util.concurrent.ConcurrentHashMap import kotlinx.coroutines.CoroutineScope diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/chat/ChatModels.kt b/apps/android/app/src/main/java/com/clawdis/android/chat/ChatModels.kt similarity index 95% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/chat/ChatModels.kt rename to apps/android/app/src/main/java/com/clawdis/android/chat/ChatModels.kt index 8c7f1b3b3..e9cfcbaec 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/chat/ChatModels.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/chat/ChatModels.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.chat +package com.clawdis.android.chat data class ChatMessage( val id: String, diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CameraCaptureManager.kt b/apps/android/app/src/main/java/com/clawdis/android/node/CameraCaptureManager.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/node/CameraCaptureManager.kt rename to apps/android/app/src/main/java/com/clawdis/android/node/CameraCaptureManager.kt index 416690766..f2c32d856 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CameraCaptureManager.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/node/CameraCaptureManager.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.node +package com.clawdis.android.node import android.Manifest import android.content.Context @@ -20,7 +20,7 @@ import androidx.camera.video.VideoRecordEvent import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.checkSelfPermission import androidx.core.graphics.scale -import com.steipete.clawdis.node.PermissionRequester +import com.clawdis.android.PermissionRequester import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeout diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CanvasController.kt b/apps/android/app/src/main/java/com/clawdis/android/node/CanvasController.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/node/CanvasController.kt rename to apps/android/app/src/main/java/com/clawdis/android/node/CanvasController.kt index 685acdcd2..78fca4e4d 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CanvasController.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/node/CanvasController.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.node +package com.clawdis.android.node import android.graphics.Bitmap import android.graphics.Canvas @@ -17,7 +17,7 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive -import com.steipete.clawdis.node.BuildConfig +import com.clawdis.android.BuildConfig import kotlin.coroutines.resume class CanvasController { diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/JpegSizeLimiter.kt b/apps/android/app/src/main/java/com/clawdis/android/node/JpegSizeLimiter.kt similarity index 98% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/node/JpegSizeLimiter.kt rename to apps/android/app/src/main/java/com/clawdis/android/node/JpegSizeLimiter.kt index bb9377231..6790ad70a 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/JpegSizeLimiter.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/node/JpegSizeLimiter.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.node +package com.clawdis.android.node import kotlin.math.max import kotlin.math.min diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/ScreenRecordManager.kt b/apps/android/app/src/main/java/com/clawdis/android/node/ScreenRecordManager.kt similarity index 96% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/node/ScreenRecordManager.kt rename to apps/android/app/src/main/java/com/clawdis/android/node/ScreenRecordManager.kt index 049f43659..78d0bb584 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/ScreenRecordManager.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/node/ScreenRecordManager.kt @@ -1,11 +1,11 @@ -package com.steipete.clawdis.node.node +package com.clawdis.android.node import android.content.Context import android.hardware.display.DisplayManager import android.media.MediaRecorder import android.media.projection.MediaProjectionManager import android.util.Base64 -import com.steipete.clawdis.node.ScreenCaptureRequester +import com.clawdis.android.ScreenCaptureRequester import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.withContext @@ -16,13 +16,13 @@ class ScreenRecordManager(private val context: Context) { data class Payload(val payloadJson: String) @Volatile private var screenCaptureRequester: ScreenCaptureRequester? = null - @Volatile private var permissionRequester: com.steipete.clawdis.node.PermissionRequester? = null + @Volatile private var permissionRequester: com.clawdis.android.PermissionRequester? = null fun attachScreenCaptureRequester(requester: ScreenCaptureRequester) { screenCaptureRequester = requester } - fun attachPermissionRequester(requester: com.steipete.clawdis.node.PermissionRequester) { + fun attachPermissionRequester(requester: com.clawdis.android.PermissionRequester) { permissionRequester = requester } diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/protocol/ClawdisCanvasA2UIAction.kt b/apps/android/app/src/main/java/com/clawdis/android/protocol/ClawdisCanvasA2UIAction.kt similarity index 97% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/protocol/ClawdisCanvasA2UIAction.kt rename to apps/android/app/src/main/java/com/clawdis/android/protocol/ClawdisCanvasA2UIAction.kt index 432a56fc8..d5f8683ea 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/protocol/ClawdisCanvasA2UIAction.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/protocol/ClawdisCanvasA2UIAction.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.protocol +package com.clawdis.android.protocol import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/protocol/ClawdisProtocolConstants.kt b/apps/android/app/src/main/java/com/clawdis/android/protocol/ClawdisProtocolConstants.kt similarity index 95% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/protocol/ClawdisProtocolConstants.kt rename to apps/android/app/src/main/java/com/clawdis/android/protocol/ClawdisProtocolConstants.kt index 4320f548d..ba9d2f3f1 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/protocol/ClawdisProtocolConstants.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/protocol/ClawdisProtocolConstants.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.protocol +package com.clawdis.android.protocol enum class ClawdisCapability(val rawValue: String) { Canvas("canvas"), diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/CameraHudOverlay.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/CameraHudOverlay.kt similarity index 96% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/CameraHudOverlay.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/CameraHudOverlay.kt index 2e1fec0d9..0e135eaeb 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/CameraHudOverlay.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/CameraHudOverlay.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui +package com.clawdis.android.ui import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/ChatSheet.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/ChatSheet.kt similarity index 50% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/ChatSheet.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/ChatSheet.kt index aaffbcd73..8813e62d7 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/ChatSheet.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/ChatSheet.kt @@ -1,8 +1,8 @@ -package com.steipete.clawdis.node.ui +package com.clawdis.android.ui import androidx.compose.runtime.Composable -import com.steipete.clawdis.node.MainViewModel -import com.steipete.clawdis.node.ui.chat.ChatSheetContent +import com.clawdis.android.MainViewModel +import com.clawdis.android.ui.chat.ChatSheetContent @Composable fun ChatSheet(viewModel: MainViewModel) { diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/ClawdisTheme.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/ClawdisTheme.kt similarity index 96% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/ClawdisTheme.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/ClawdisTheme.kt index 6892f277c..3f319b49a 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/ClawdisTheme.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/ClawdisTheme.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui +package com.clawdis.android.ui import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/RootScreen.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/RootScreen.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/RootScreen.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/RootScreen.kt index b81a047f4..55056a713 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/RootScreen.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/RootScreen.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui +package com.clawdis.android.ui import android.annotation.SuppressLint import android.Manifest @@ -65,8 +65,8 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties import androidx.core.content.ContextCompat -import com.steipete.clawdis.node.CameraHudKind -import com.steipete.clawdis.node.MainViewModel +import com.clawdis.android.CameraHudKind +import com.clawdis.android.MainViewModel @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/SettingsSheet.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/SettingsSheet.kt similarity index 98% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/SettingsSheet.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/SettingsSheet.kt index c7d011892..7e4b58f70 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/SettingsSheet.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/SettingsSheet.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui +package com.clawdis.android.ui import android.Manifest import android.content.pm.PackageManager @@ -47,10 +47,10 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat -import com.steipete.clawdis.node.BuildConfig -import com.steipete.clawdis.node.MainViewModel -import com.steipete.clawdis.node.NodeForegroundService -import com.steipete.clawdis.node.VoiceWakeMode +import com.clawdis.android.BuildConfig +import com.clawdis.android.MainViewModel +import com.clawdis.android.NodeForegroundService +import com.clawdis.android.VoiceWakeMode @Composable fun SettingsSheet(viewModel: MainViewModel) { @@ -381,7 +381,7 @@ fun SettingsSheet(viewModel: MainViewModel) { Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { Button( onClick = { - val parsed = com.steipete.clawdis.node.WakeWords.parseCommaSeparated(wakeWordsText) + val parsed = com.clawdis.android.WakeWords.parseCommaSeparated(wakeWordsText) viewModel.setWakeWords(parsed) }, enabled = isConnected, diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/StatusPill.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/StatusPill.kt similarity index 98% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/StatusPill.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/StatusPill.kt index 2efcccae7..ae5e3894e 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/StatusPill.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/StatusPill.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui +package com.clawdis.android.ui import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/TalkOrbOverlay.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/TalkOrbOverlay.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/TalkOrbOverlay.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/TalkOrbOverlay.kt index c36dbf8e4..908809bed 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/TalkOrbOverlay.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/TalkOrbOverlay.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui +package com.clawdis.android.ui import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.RepeatMode diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatComposer.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatComposer.kt similarity index 98% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatComposer.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatComposer.kt index 3bba710cf..8459d3b26 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatComposer.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatComposer.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -38,7 +38,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -import com.steipete.clawdis.node.chat.ChatSessionEntry +import com.clawdis.android.chat.ChatSessionEntry @Composable fun ChatComposer( diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMarkdown.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMarkdown.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMarkdown.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMarkdown.kt index 75dd3b10c..217577013 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMarkdown.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMarkdown.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat import android.graphics.BitmapFactory import android.util.Base64 diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMessageListCard.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMessageListCard.kt similarity index 96% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMessageListCard.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMessageListCard.kt index c1fa737de..5950ce0a5 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMessageListCard.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMessageListCard.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -20,8 +20,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.unit.dp -import com.steipete.clawdis.node.chat.ChatMessage -import com.steipete.clawdis.node.chat.ChatPendingToolCall +import com.clawdis.android.chat.ChatMessage +import com.clawdis.android.chat.ChatPendingToolCall @Composable fun ChatMessageListCard( diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMessageViews.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMessageViews.kt similarity index 97% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMessageViews.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMessageViews.kt index 435bacbdc..a4a1cf2d2 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatMessageViews.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatMessageViews.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat import android.graphics.BitmapFactory import android.util.Base64 @@ -31,9 +31,9 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp import androidx.compose.foundation.Image -import com.steipete.clawdis.node.chat.ChatMessage -import com.steipete.clawdis.node.chat.ChatMessageContent -import com.steipete.clawdis.node.chat.ChatPendingToolCall +import com.clawdis.android.chat.ChatMessage +import com.clawdis.android.chat.ChatMessageContent +import com.clawdis.android.chat.ChatPendingToolCall import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatSessionsDialog.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatSessionsDialog.kt similarity index 96% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatSessionsDialog.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatSessionsDialog.kt index 218cb25f6..69f065cb0 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatSessionsDialog.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatSessionsDialog.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -20,7 +20,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.steipete.clawdis.node.chat.ChatSessionEntry +import com.clawdis.android.chat.ChatSessionEntry @Composable fun ChatSessionsDialog( diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatSheetContent.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatSheetContent.kt similarity index 97% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatSheetContent.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatSheetContent.kt index 40d6c5035..ec42abca5 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/ChatSheetContent.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/ChatSheetContent.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat import android.content.ContentResolver import android.net.Uri @@ -19,8 +19,8 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import com.steipete.clawdis.node.MainViewModel -import com.steipete.clawdis.node.chat.OutgoingAttachment +import com.clawdis.android.MainViewModel +import com.clawdis.android.chat.OutgoingAttachment import java.io.ByteArrayOutputStream import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/SessionFilters.kt b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/SessionFilters.kt similarity index 93% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/SessionFilters.kt rename to apps/android/app/src/main/java/com/clawdis/android/ui/chat/SessionFilters.kt index 5ee51fbe1..df04b7913 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/ui/chat/SessionFilters.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/ui/chat/SessionFilters.kt @@ -1,6 +1,6 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat -import com.steipete.clawdis.node.chat.ChatSessionEntry +import com.clawdis.android.chat.ChatSessionEntry private const val MAIN_SESSION_KEY = "main" private const val RECENT_WINDOW_MS = 24 * 60 * 60 * 1000L diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/StreamingMediaDataSource.kt b/apps/android/app/src/main/java/com/clawdis/android/voice/StreamingMediaDataSource.kt similarity index 98% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/voice/StreamingMediaDataSource.kt rename to apps/android/app/src/main/java/com/clawdis/android/voice/StreamingMediaDataSource.kt index 0be4a016c..4bd84138a 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/StreamingMediaDataSource.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/voice/StreamingMediaDataSource.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.voice +package com.clawdis.android.voice import android.media.MediaDataSource import kotlin.math.min diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/TalkDirectiveParser.kt b/apps/android/app/src/main/java/com/clawdis/android/voice/TalkDirectiveParser.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/voice/TalkDirectiveParser.kt rename to apps/android/app/src/main/java/com/clawdis/android/voice/TalkDirectiveParser.kt index 8dd059279..a7c3c25e3 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/TalkDirectiveParser.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/voice/TalkDirectiveParser.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.voice +package com.clawdis.android.voice import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/TalkModeManager.kt b/apps/android/app/src/main/java/com/clawdis/android/voice/TalkModeManager.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/voice/TalkModeManager.kt rename to apps/android/app/src/main/java/com/clawdis/android/voice/TalkModeManager.kt index e3251601e..f56663bea 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/TalkModeManager.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/voice/TalkModeManager.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.voice +package com.clawdis.android.voice import android.Manifest import android.content.Context @@ -20,7 +20,7 @@ import android.speech.tts.TextToSpeech import android.speech.tts.UtteranceProgressListener import android.util.Log import androidx.core.content.ContextCompat -import com.steipete.clawdis.node.bridge.BridgeSession +import com.clawdis.android.bridge.BridgeSession import java.net.HttpURLConnection import java.net.URL import java.util.UUID diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/VoiceWakeCommandExtractor.kt b/apps/android/app/src/main/java/com/clawdis/android/voice/VoiceWakeCommandExtractor.kt similarity index 97% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/voice/VoiceWakeCommandExtractor.kt rename to apps/android/app/src/main/java/com/clawdis/android/voice/VoiceWakeCommandExtractor.kt index 6564e0e3c..71019f3e7 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/VoiceWakeCommandExtractor.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/voice/VoiceWakeCommandExtractor.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.voice +package com.clawdis.android.voice object VoiceWakeCommandExtractor { fun extractCommand(text: String, triggerWords: List): String? { diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/VoiceWakeManager.kt b/apps/android/app/src/main/java/com/clawdis/android/voice/VoiceWakeManager.kt similarity index 99% rename from apps/android/app/src/main/java/com/steipete/clawdis/node/voice/VoiceWakeManager.kt rename to apps/android/app/src/main/java/com/clawdis/android/voice/VoiceWakeManager.kt index fd9322567..4d69b35d8 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/voice/VoiceWakeManager.kt +++ b/apps/android/app/src/main/java/com/clawdis/android/voice/VoiceWakeManager.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.voice +package com.clawdis.android.voice import android.content.Context import android.content.Intent diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/WakeWordsTest.kt b/apps/android/app/src/test/java/com/clawdis/android/WakeWordsTest.kt similarity index 96% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/WakeWordsTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/WakeWordsTest.kt index d934e95e8..2ecf25093 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/WakeWordsTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/WakeWordsTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node +package com.clawdis.android import org.junit.Assert.assertEquals import org.junit.Test diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BonjourEscapesTest.kt b/apps/android/app/src/test/java/com/clawdis/android/bridge/BonjourEscapesTest.kt similarity index 92% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BonjourEscapesTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/bridge/BonjourEscapesTest.kt index f898b6d19..ff5c4317e 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BonjourEscapesTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/bridge/BonjourEscapesTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge import org.junit.Assert.assertEquals import org.junit.Test diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeEndpointKotestTest.kt b/apps/android/app/src/test/java/com/clawdis/android/bridge/BridgeEndpointKotestTest.kt similarity index 90% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeEndpointKotestTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/bridge/BridgeEndpointKotestTest.kt index 5e1b09490..908831fdf 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeEndpointKotestTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/bridge/BridgeEndpointKotestTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgePairingClientTest.kt b/apps/android/app/src/test/java/com/clawdis/android/bridge/BridgePairingClientTest.kt similarity index 98% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgePairingClientTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/bridge/BridgePairingClientTest.kt index abb79fd36..000b3ba86 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgePairingClientTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/bridge/BridgePairingClientTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeSessionTest.kt b/apps/android/app/src/test/java/com/clawdis/android/bridge/BridgeSessionTest.kt similarity index 99% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeSessionTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/bridge/BridgeSessionTest.kt index ebdc06e3a..67d3d841e 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/bridge/BridgeSessionTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/bridge/BridgeSessionTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.bridge +package com.clawdis.android.bridge import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/node/CanvasControllerSnapshotParamsTest.kt b/apps/android/app/src/test/java/com/clawdis/android/node/CanvasControllerSnapshotParamsTest.kt similarity index 97% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/node/CanvasControllerSnapshotParamsTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/node/CanvasControllerSnapshotParamsTest.kt index b7a135196..de4f422a1 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/node/CanvasControllerSnapshotParamsTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/node/CanvasControllerSnapshotParamsTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.node +package com.clawdis.android.node import org.junit.Assert.assertEquals import org.junit.Assert.assertNull diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/node/JpegSizeLimiterTest.kt b/apps/android/app/src/test/java/com/clawdis/android/node/JpegSizeLimiterTest.kt similarity index 96% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/node/JpegSizeLimiterTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/node/JpegSizeLimiterTest.kt index 457bd189d..4107f81fe 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/node/JpegSizeLimiterTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/node/JpegSizeLimiterTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.node +package com.clawdis.android.node import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/protocol/ClawdisCanvasA2UIActionTest.kt b/apps/android/app/src/test/java/com/clawdis/android/protocol/ClawdisCanvasA2UIActionTest.kt similarity index 97% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/protocol/ClawdisCanvasA2UIActionTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/protocol/ClawdisCanvasA2UIActionTest.kt index 237ccced6..6847feccf 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/protocol/ClawdisCanvasA2UIActionTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/protocol/ClawdisCanvasA2UIActionTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.protocol +package com.clawdis.android.protocol import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/protocol/ClawdisProtocolConstantsTest.kt b/apps/android/app/src/test/java/com/clawdis/android/protocol/ClawdisProtocolConstantsTest.kt similarity index 96% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/protocol/ClawdisProtocolConstantsTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/protocol/ClawdisProtocolConstantsTest.kt index b0de85c6b..82933509d 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/protocol/ClawdisProtocolConstantsTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/protocol/ClawdisProtocolConstantsTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.protocol +package com.clawdis.android.protocol import org.junit.Assert.assertEquals import org.junit.Test diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/ui/chat/SessionFiltersTest.kt b/apps/android/app/src/test/java/com/clawdis/android/ui/chat/SessionFiltersTest.kt similarity index 91% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/ui/chat/SessionFiltersTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/ui/chat/SessionFiltersTest.kt index c88e8b18b..3eb5899e0 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/ui/chat/SessionFiltersTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/ui/chat/SessionFiltersTest.kt @@ -1,6 +1,6 @@ -package com.steipete.clawdis.node.ui.chat +package com.clawdis.android.ui.chat -import com.steipete.clawdis.node.chat.ChatSessionEntry +import com.clawdis.android.chat.ChatSessionEntry import org.junit.Assert.assertEquals import org.junit.Test diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/voice/TalkDirectiveParserTest.kt b/apps/android/app/src/test/java/com/clawdis/android/voice/TalkDirectiveParserTest.kt similarity index 97% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/voice/TalkDirectiveParserTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/voice/TalkDirectiveParserTest.kt index d69d2008f..6e59f53ab 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/voice/TalkDirectiveParserTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/voice/TalkDirectiveParserTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.voice +package com.clawdis.android.voice import org.junit.Assert.assertEquals import org.junit.Assert.assertNull diff --git a/apps/android/app/src/test/java/com/steipete/clawdis/node/voice/VoiceWakeCommandExtractorTest.kt b/apps/android/app/src/test/java/com/clawdis/android/voice/VoiceWakeCommandExtractorTest.kt similarity index 95% rename from apps/android/app/src/test/java/com/steipete/clawdis/node/voice/VoiceWakeCommandExtractorTest.kt rename to apps/android/app/src/test/java/com/clawdis/android/voice/VoiceWakeCommandExtractorTest.kt index b50582397..db634d86b 100644 --- a/apps/android/app/src/test/java/com/steipete/clawdis/node/voice/VoiceWakeCommandExtractorTest.kt +++ b/apps/android/app/src/test/java/com/clawdis/android/voice/VoiceWakeCommandExtractorTest.kt @@ -1,4 +1,4 @@ -package com.steipete.clawdis.node.voice +package com.clawdis.android.voice import org.junit.Assert.assertEquals import org.junit.Assert.assertNull diff --git a/apps/ios/Sources/Bridge/BridgeClient.swift b/apps/ios/Sources/Bridge/BridgeClient.swift index 33401c2f0..a2f3234ab 100644 --- a/apps/ios/Sources/Bridge/BridgeClient.swift +++ b/apps/ios/Sources/Bridge/BridgeClient.swift @@ -14,7 +14,7 @@ actor BridgeClient { { self.lineBuffer = Data() let connection = NWConnection(to: endpoint, using: .tcp) - let queue = DispatchQueue(label: "com.steipete.clawdis.ios.bridge-client") + let queue = DispatchQueue(label: "com.clawdis.ios.bridge-client") defer { connection.cancel() } try await self.withTimeout(seconds: 8, purpose: "connect") { try await self.startAndWaitForReady(connection, queue: queue) diff --git a/apps/ios/Sources/Bridge/BridgeConnectionController.swift b/apps/ios/Sources/Bridge/BridgeConnectionController.swift index facf4f5c6..3c433b573 100644 --- a/apps/ios/Sources/Bridge/BridgeConnectionController.swift +++ b/apps/ios/Sources/Bridge/BridgeConnectionController.swift @@ -99,7 +99,7 @@ final class BridgeConnectionController { guard !instanceId.isEmpty else { return } let token = KeychainStore.loadString( - service: "com.steipete.clawdis.bridge", + service: "com.clawdis.bridge", account: self.keychainAccount(instanceId: instanceId))? .trimmingCharacters(in: .whitespacesAndNewlines) ?? "" guard !token.isEmpty else { return } @@ -189,7 +189,7 @@ final class BridgeConnectionController { if !refreshed.isEmpty, refreshed != token { _ = KeychainStore.saveString( refreshed, - service: "com.steipete.clawdis.bridge", + service: "com.clawdis.bridge", account: self.keychainAccount(instanceId: instanceId)) } appModel.connectToBridge(endpoint: endpoint, hello: self.makeHello(token: resolvedToken)) diff --git a/apps/ios/Sources/Bridge/BridgeDiscoveryModel.swift b/apps/ios/Sources/Bridge/BridgeDiscoveryModel.swift index 45df2a887..c3a08ef6c 100644 --- a/apps/ios/Sources/Bridge/BridgeDiscoveryModel.swift +++ b/apps/ios/Sources/Bridge/BridgeDiscoveryModel.swift @@ -102,7 +102,7 @@ final class BridgeDiscoveryModel { } self.browsers[domain] = browser - browser.start(queue: DispatchQueue(label: "com.steipete.clawdis.ios.bridge-discovery.\(domain)")) + browser.start(queue: DispatchQueue(label: "com.clawdis.ios.bridge-discovery.\(domain)")) } } diff --git a/apps/ios/Sources/Bridge/BridgeSession.swift b/apps/ios/Sources/Bridge/BridgeSession.swift index eaf490be3..f0d52fdcd 100644 --- a/apps/ios/Sources/Bridge/BridgeSession.swift +++ b/apps/ios/Sources/Bridge/BridgeSession.swift @@ -78,7 +78,7 @@ actor BridgeSession { let params = NWParameters.tcp params.includePeerToPeer = true let connection = NWConnection(to: endpoint, using: params) - let queue = DispatchQueue(label: "com.steipete.clawdis.ios.bridge-session") + let queue = DispatchQueue(label: "com.clawdis.ios.bridge-session") self.connection = connection self.queue = queue diff --git a/apps/ios/Sources/Bridge/BridgeSettingsStore.swift b/apps/ios/Sources/Bridge/BridgeSettingsStore.swift index f73a02637..49cd6d151 100644 --- a/apps/ios/Sources/Bridge/BridgeSettingsStore.swift +++ b/apps/ios/Sources/Bridge/BridgeSettingsStore.swift @@ -1,8 +1,8 @@ import Foundation enum BridgeSettingsStore { - private static let bridgeService = "com.steipete.clawdis.bridge" - private static let nodeService = "com.steipete.clawdis.node" + private static let bridgeService = "com.clawdis.bridge" + private static let nodeService = "com.clawdis.node" private static let instanceIdDefaultsKey = "node.instanceId" private static let preferredBridgeStableIDDefaultsKey = "bridge.preferredStableID" diff --git a/apps/ios/Sources/Screen/ScreenRecordService.swift b/apps/ios/Sources/Screen/ScreenRecordService.swift index b5d75b57d..7110fd8eb 100644 --- a/apps/ios/Sources/Screen/ScreenRecordService.swift +++ b/apps/ios/Sources/Screen/ScreenRecordService.swift @@ -68,7 +68,7 @@ final class ScreenRecordService: @unchecked Sendable { try? FileManager.default.removeItem(at: outURL) let state = CaptureState() - let recordQueue = DispatchQueue(label: "com.steipete.clawdis.screenrecord") + let recordQueue = DispatchQueue(label: "com.clawdis.screenrecord") try await withCheckedThrowingContinuation { (cont: CheckedContinuation) in let handler: @Sendable (CMSampleBuffer, RPSampleBufferType, Error?) -> Void = { sample, type, error in diff --git a/apps/ios/Sources/Settings/SettingsTab.swift b/apps/ios/Sources/Settings/SettingsTab.swift index e7e9b8e10..9ad4be859 100644 --- a/apps/ios/Sources/Settings/SettingsTab.swift +++ b/apps/ios/Sources/Settings/SettingsTab.swift @@ -353,7 +353,7 @@ struct SettingsTab: View { do { let statusStore = self.connectStatus let existing = KeychainStore.loadString( - service: "com.steipete.clawdis.bridge", + service: "com.clawdis.bridge", account: self.keychainAccount()) let existingToken = (existing?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false) ? existing : @@ -381,7 +381,7 @@ struct SettingsTab: View { if !token.isEmpty, token != existingToken { _ = KeychainStore.saveString( token, - service: "com.steipete.clawdis.bridge", + service: "com.clawdis.bridge", account: self.keychainAccount()) } @@ -427,7 +427,7 @@ struct SettingsTab: View { do { let statusStore = self.connectStatus let existing = KeychainStore.loadString( - service: "com.steipete.clawdis.bridge", + service: "com.clawdis.bridge", account: self.keychainAccount()) let existingToken = (existing?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false) ? existing : @@ -455,7 +455,7 @@ struct SettingsTab: View { if !token.isEmpty, token != existingToken { _ = KeychainStore.saveString( token, - service: "com.steipete.clawdis.bridge", + service: "com.clawdis.bridge", account: self.keychainAccount()) } diff --git a/apps/ios/Sources/Voice/TalkModeManager.swift b/apps/ios/Sources/Voice/TalkModeManager.swift index 355c67321..60bf53f8c 100644 --- a/apps/ios/Sources/Voice/TalkModeManager.swift +++ b/apps/ios/Sources/Voice/TalkModeManager.swift @@ -47,7 +47,7 @@ final class TalkModeManager: NSObject { private var chatSubscribedSessionKeys = Set() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "TalkMode") + private let logger = Logger(subsystem: "com.clawdis", category: "TalkMode") func attachBridge(_ bridge: BridgeSession) { self.bridge = bridge diff --git a/apps/ios/Tests/BridgeClientTests.swift b/apps/ios/Tests/BridgeClientTests.swift index 565083369..aae2f2e37 100644 --- a/apps/ios/Tests/BridgeClientTests.swift +++ b/apps/ios/Tests/BridgeClientTests.swift @@ -6,7 +6,7 @@ import Testing @Suite struct BridgeClientTests { private final class LineServer: @unchecked Sendable { - private let queue = DispatchQueue(label: "com.steipete.clawdis.tests.bridge-client-server") + private let queue = DispatchQueue(label: "com.clawdis.tests.bridge-client-server") private let listener: NWListener private var connection: NWConnection? private var buffer = Data() diff --git a/apps/ios/Tests/BridgeConnectionControllerTests.swift b/apps/ios/Tests/BridgeConnectionControllerTests.swift index e4eb6ccf2..ae7af7fa1 100644 --- a/apps/ios/Tests/BridgeConnectionControllerTests.swift +++ b/apps/ios/Tests/BridgeConnectionControllerTests.swift @@ -10,8 +10,8 @@ private struct KeychainEntry: Hashable { let account: String } -private let bridgeService = "com.steipete.clawdis.bridge" -private let nodeService = "com.steipete.clawdis.node" +private let bridgeService = "com.clawdis.bridge" +private let nodeService = "com.clawdis.node" private let instanceIdEntry = KeychainEntry(service: nodeService, account: "instanceId") private let preferredBridgeEntry = KeychainEntry(service: bridgeService, account: "preferredStableID") private let lastBridgeEntry = KeychainEntry(service: bridgeService, account: "lastDiscoveredStableID") diff --git a/apps/ios/Tests/BridgeSettingsStoreTests.swift b/apps/ios/Tests/BridgeSettingsStoreTests.swift index f9e064e30..3902ac6cf 100644 --- a/apps/ios/Tests/BridgeSettingsStoreTests.swift +++ b/apps/ios/Tests/BridgeSettingsStoreTests.swift @@ -7,8 +7,8 @@ private struct KeychainEntry: Hashable { let account: String } -private let bridgeService = "com.steipete.clawdis.bridge" -private let nodeService = "com.steipete.clawdis.node" +private let bridgeService = "com.clawdis.bridge" +private let nodeService = "com.clawdis.node" private let instanceIdEntry = KeychainEntry(service: nodeService, account: "instanceId") private let preferredBridgeEntry = KeychainEntry(service: bridgeService, account: "preferredStableID") private let lastBridgeEntry = KeychainEntry(service: bridgeService, account: "lastDiscoveredStableID") diff --git a/apps/ios/Tests/KeychainStoreTests.swift b/apps/ios/Tests/KeychainStoreTests.swift index 06040f7e5..36584307d 100644 --- a/apps/ios/Tests/KeychainStoreTests.swift +++ b/apps/ios/Tests/KeychainStoreTests.swift @@ -4,7 +4,7 @@ import Testing @Suite struct KeychainStoreTests { @Test func saveLoadUpdateDeleteRoundTrip() { - let service = "com.steipete.clawdis.tests.\(UUID().uuidString)" + let service = "com.clawdis.tests.\(UUID().uuidString)" let account = "value" #expect(KeychainStore.delete(service: service, account: account)) diff --git a/apps/ios/fastlane/Appfile b/apps/ios/fastlane/Appfile index 54e7fca4c..345ced433 100644 --- a/apps/ios/fastlane/Appfile +++ b/apps/ios/fastlane/Appfile @@ -1,4 +1,4 @@ -app_identifier("com.steipete.clawdis.ios") +app_identifier("com.clawdis.ios") # Auth is expected via App Store Connect API key. # Provide either: diff --git a/apps/ios/project.yml b/apps/ios/project.yml index e8dac7a20..403985591 100644 --- a/apps/ios/project.yml +++ b/apps/ios/project.yml @@ -1,6 +1,6 @@ name: Clawdis options: - bundleIdPrefix: com.steipete.clawdis + bundleIdPrefix: com.clawdis deploymentTarget: iOS: "17.0" xcodeVersion: "16.0" @@ -65,8 +65,8 @@ targets: CODE_SIGN_IDENTITY: "Apple Development" CODE_SIGN_STYLE: Manual DEVELOPMENT_TEAM: Y5PE65HELJ - PRODUCT_BUNDLE_IDENTIFIER: com.steipete.clawdis.ios - PROVISIONING_PROFILE_SPECIFIER: "com.steipete.clawdis.ios Development" + PRODUCT_BUNDLE_IDENTIFIER: com.clawdis.ios + PROVISIONING_PROFILE_SPECIFIER: "com.clawdis.ios Development" SWIFT_VERSION: "6.0" info: path: Sources/Info.plist @@ -98,7 +98,7 @@ targets: product: SwabbleKit settings: base: - PRODUCT_BUNDLE_IDENTIFIER: com.steipete.clawdis.ios.tests + PRODUCT_BUNDLE_IDENTIFIER: com.clawdis.ios.tests SWIFT_VERSION: "6.0" TEST_HOST: "$(BUILT_PRODUCTS_DIR)/Clawdis.app/Clawdis" BUNDLE_LOADER: "$(TEST_HOST)" diff --git a/apps/macos/Sources/Clawdis/AgentWorkspace.swift b/apps/macos/Sources/Clawdis/AgentWorkspace.swift index 14698881b..5a02ca793 100644 --- a/apps/macos/Sources/Clawdis/AgentWorkspace.swift +++ b/apps/macos/Sources/Clawdis/AgentWorkspace.swift @@ -2,7 +2,7 @@ import Foundation import OSLog enum AgentWorkspace { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "workspace") + private static let logger = Logger(subsystem: "com.clawdis", category: "workspace") static let agentsFilename = "AGENTS.md" static let soulFilename = "SOUL.md" static let identityFilename = "IDENTITY.md" diff --git a/apps/macos/Sources/Clawdis/AnthropicOAuth.swift b/apps/macos/Sources/Clawdis/AnthropicOAuth.swift index 9d107e1d7..161102cdc 100644 --- a/apps/macos/Sources/Clawdis/AnthropicOAuth.swift +++ b/apps/macos/Sources/Clawdis/AnthropicOAuth.swift @@ -58,7 +58,7 @@ enum AnthropicAuthResolver { } enum AnthropicOAuth { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "anthropic-oauth") + private static let logger = Logger(subsystem: "com.clawdis", category: "anthropic-oauth") private static let clientId = "9d1c250a-e61b-44d9-88ed-5944d1962f5e" private static let authorizeURL = URL(string: "https://claude.ai/oauth/authorize")! diff --git a/apps/macos/Sources/Clawdis/Bridge/BridgeConnectionHandler.swift b/apps/macos/Sources/Clawdis/Bridge/BridgeConnectionHandler.swift index b7869597b..8235e4c90 100644 --- a/apps/macos/Sources/Clawdis/Bridge/BridgeConnectionHandler.swift +++ b/apps/macos/Sources/Clawdis/Bridge/BridgeConnectionHandler.swift @@ -19,7 +19,7 @@ actor BridgeConnectionHandler { private let logger: Logger private let decoder = JSONDecoder() private let encoder = JSONEncoder() - private let queue = DispatchQueue(label: "com.steipete.clawdis.bridge.connection") + private let queue = DispatchQueue(label: "com.clawdis.bridge.connection") private var buffer = Data() private var isAuthenticated = false diff --git a/apps/macos/Sources/Clawdis/Bridge/BridgeServer.swift b/apps/macos/Sources/Clawdis/Bridge/BridgeServer.swift index 509522eb5..b5469ae28 100644 --- a/apps/macos/Sources/Clawdis/Bridge/BridgeServer.swift +++ b/apps/macos/Sources/Clawdis/Bridge/BridgeServer.swift @@ -8,7 +8,7 @@ import OSLog actor BridgeServer { static let shared = BridgeServer() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "bridge") + private let logger = Logger(subsystem: "com.clawdis", category: "bridge") private var listener: NWListener? private var isRunning = false private var store: PairedNodesStore? @@ -42,7 +42,7 @@ actor BridgeServer { Task { await self.handleListenerState(state) } } - listener.start(queue: DispatchQueue(label: "com.steipete.clawdis.bridge")) + listener.start(queue: DispatchQueue(label: "com.clawdis.bridge")) self.listener = listener } catch { self.logger.error("bridge start failed: \(error.localizedDescription, privacy: .public)") diff --git a/apps/macos/Sources/Clawdis/CameraCaptureService.swift b/apps/macos/Sources/Clawdis/CameraCaptureService.swift index 6dd37dc8c..24fbca04e 100644 --- a/apps/macos/Sources/Clawdis/CameraCaptureService.swift +++ b/apps/macos/Sources/Clawdis/CameraCaptureService.swift @@ -36,7 +36,7 @@ actor CameraCaptureService { } } - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "camera") + private let logger = Logger(subsystem: "com.clawdis", category: "camera") func listDevices() -> [CameraDeviceInfo] { Self.availableCameras().map { device in diff --git a/apps/macos/Sources/Clawdis/CanvasFileWatcher.swift b/apps/macos/Sources/Clawdis/CanvasFileWatcher.swift index 5053f51f3..930e3887c 100644 --- a/apps/macos/Sources/Clawdis/CanvasFileWatcher.swift +++ b/apps/macos/Sources/Clawdis/CanvasFileWatcher.swift @@ -10,7 +10,7 @@ final class CanvasFileWatcher: @unchecked Sendable { init(url: URL, onChange: @escaping () -> Void) { self.url = url - self.queue = DispatchQueue(label: "com.steipete.clawdis.canvaswatcher") + self.queue = DispatchQueue(label: "com.clawdis.canvaswatcher") self.onChange = onChange } diff --git a/apps/macos/Sources/Clawdis/CanvasManager.swift b/apps/macos/Sources/Clawdis/CanvasManager.swift index cdee59703..fec3286ce 100644 --- a/apps/macos/Sources/Clawdis/CanvasManager.swift +++ b/apps/macos/Sources/Clawdis/CanvasManager.swift @@ -7,7 +7,7 @@ import OSLog final class CanvasManager { static let shared = CanvasManager() - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "CanvasManager") + private static let logger = Logger(subsystem: "com.clawdis", category: "CanvasManager") private var panelController: CanvasWindowController? private var panelSessionKey: String? diff --git a/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift b/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift index 4fe454bec..5086078a2 100644 --- a/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift +++ b/apps/macos/Sources/Clawdis/CanvasSchemeHandler.swift @@ -3,7 +3,7 @@ import Foundation import OSLog import WebKit -private let canvasLogger = Logger(subsystem: "com.steipete.clawdis", category: "Canvas") +private let canvasLogger = Logger(subsystem: "com.clawdis", category: "Canvas") final class CanvasSchemeHandler: NSObject, WKURLSchemeHandler { private let root: URL diff --git a/apps/macos/Sources/Clawdis/CanvasWindow.swift b/apps/macos/Sources/Clawdis/CanvasWindow.swift index e03ba2c42..522fa572c 100644 --- a/apps/macos/Sources/Clawdis/CanvasWindow.swift +++ b/apps/macos/Sources/Clawdis/CanvasWindow.swift @@ -1,6 +1,6 @@ import AppKit -let canvasWindowLogger = Logger(subsystem: "com.steipete.clawdis", category: "Canvas") +let canvasWindowLogger = Logger(subsystem: "com.clawdis", category: "Canvas") enum CanvasLayout { static let panelSize = NSSize(width: 520, height: 680) diff --git a/apps/macos/Sources/Clawdis/ClawdisConfigFile.swift b/apps/macos/Sources/Clawdis/ClawdisConfigFile.swift index e9a262010..31f5d713b 100644 --- a/apps/macos/Sources/Clawdis/ClawdisConfigFile.swift +++ b/apps/macos/Sources/Clawdis/ClawdisConfigFile.swift @@ -1,7 +1,7 @@ import Foundation enum ClawdisConfigFile { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "config") + private static let logger = Logger(subsystem: "com.clawdis", category: "config") static func url() -> URL { ClawdisPaths.configURL diff --git a/apps/macos/Sources/Clawdis/ConnectionModeCoordinator.swift b/apps/macos/Sources/Clawdis/ConnectionModeCoordinator.swift index d9abb5795..7aecbf811 100644 --- a/apps/macos/Sources/Clawdis/ConnectionModeCoordinator.swift +++ b/apps/macos/Sources/Clawdis/ConnectionModeCoordinator.swift @@ -5,7 +5,7 @@ import OSLog final class ConnectionModeCoordinator { static let shared = ConnectionModeCoordinator() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "connection") + private let logger = Logger(subsystem: "com.clawdis", category: "connection") /// Apply the requested connection mode by starting/stopping local gateway, /// managing the control-channel SSH tunnel, and cleaning up chat windows/panels. diff --git a/apps/macos/Sources/Clawdis/Constants.swift b/apps/macos/Sources/Clawdis/Constants.swift index 639d12afc..a896432e6 100644 --- a/apps/macos/Sources/Clawdis/Constants.swift +++ b/apps/macos/Sources/Clawdis/Constants.swift @@ -1,7 +1,7 @@ import Foundation -let launchdLabel = "com.steipete.clawdis" -let gatewayLaunchdLabel = "com.steipete.clawdis.gateway" +let launchdLabel = "com.clawdis.mac" +let gatewayLaunchdLabel = "com.clawdis.gateway" let onboardingVersionKey = "clawdis.onboardingVersion" let currentOnboardingVersion = 7 let pauseDefaultsKey = "clawdis.pauseEnabled" diff --git a/apps/macos/Sources/Clawdis/ControlChannel.swift b/apps/macos/Sources/Clawdis/ControlChannel.swift index 0c5c20bd5..0a95385c4 100644 --- a/apps/macos/Sources/Clawdis/ControlChannel.swift +++ b/apps/macos/Sources/Clawdis/ControlChannel.swift @@ -73,7 +73,7 @@ final class ControlChannel { } private(set) var lastPingMs: Double? - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "control") + private let logger = Logger(subsystem: "com.clawdis", category: "control") private var eventTask: Task? private var recoveryTask: Task? diff --git a/apps/macos/Sources/Clawdis/CronJobsStore.swift b/apps/macos/Sources/Clawdis/CronJobsStore.swift index e48cd6c55..f08e37428 100644 --- a/apps/macos/Sources/Clawdis/CronJobsStore.swift +++ b/apps/macos/Sources/Clawdis/CronJobsStore.swift @@ -21,7 +21,7 @@ final class CronJobsStore { var lastError: String? var statusMessage: String? - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "cron.ui") + private let logger = Logger(subsystem: "com.clawdis", category: "cron.ui") private var refreshTask: Task? private var runsTask: Task? private var eventTask: Task? diff --git a/apps/macos/Sources/Clawdis/DeepLinks.swift b/apps/macos/Sources/Clawdis/DeepLinks.swift index e8bc19c98..68c51f17e 100644 --- a/apps/macos/Sources/Clawdis/DeepLinks.swift +++ b/apps/macos/Sources/Clawdis/DeepLinks.swift @@ -4,7 +4,7 @@ import Foundation import OSLog import Security -private let deepLinkLogger = Logger(subsystem: "com.steipete.clawdis", category: "DeepLink") +private let deepLinkLogger = Logger(subsystem: "com.clawdis", category: "DeepLink") @MainActor final class DeepLinkHandler { diff --git a/apps/macos/Sources/Clawdis/DockIconManager.swift b/apps/macos/Sources/Clawdis/DockIconManager.swift index d0bee9543..f9676d05a 100644 --- a/apps/macos/Sources/Clawdis/DockIconManager.swift +++ b/apps/macos/Sources/Clawdis/DockIconManager.swift @@ -6,7 +6,7 @@ final class DockIconManager: NSObject, @unchecked Sendable { static let shared = DockIconManager() private var windowsObservation: NSKeyValueObservation? - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "DockIconManager") + private let logger = Logger(subsystem: "com.clawdis", category: "DockIconManager") override private init() { super.init() diff --git a/apps/macos/Sources/Clawdis/GatewayChannel.swift b/apps/macos/Sources/Clawdis/GatewayChannel.swift index 7786b30a0..9b8ea6e83 100644 --- a/apps/macos/Sources/Clawdis/GatewayChannel.swift +++ b/apps/macos/Sources/Clawdis/GatewayChannel.swift @@ -58,7 +58,7 @@ struct WebSocketSessionBox: @unchecked Sendable { private typealias ProtoAnyCodable = ClawdisProtocol.AnyCodable actor GatewayChannelActor { - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "gateway") + private let logger = Logger(subsystem: "com.clawdis", category: "gateway") private var task: WebSocketTaskBox? private var pending: [String: CheckedContinuation] = [:] private var connected = false diff --git a/apps/macos/Sources/Clawdis/GatewayConnection.swift b/apps/macos/Sources/Clawdis/GatewayConnection.swift index 55711487f..fc038fa85 100644 --- a/apps/macos/Sources/Clawdis/GatewayConnection.swift +++ b/apps/macos/Sources/Clawdis/GatewayConnection.swift @@ -3,7 +3,7 @@ import ClawdisProtocol import Foundation import OSLog -private let gatewayConnectionLogger = Logger(subsystem: "com.steipete.clawdis", category: "gateway.connection") +private let gatewayConnectionLogger = Logger(subsystem: "com.clawdis", category: "gateway.connection") enum GatewayAgentChannel: String, Codable, CaseIterable, Sendable { case last diff --git a/apps/macos/Sources/Clawdis/GatewayDiscoveryModel.swift b/apps/macos/Sources/Clawdis/GatewayDiscoveryModel.swift index 82a03781c..7f392325c 100644 --- a/apps/macos/Sources/Clawdis/GatewayDiscoveryModel.swift +++ b/apps/macos/Sources/Clawdis/GatewayDiscoveryModel.swift @@ -34,7 +34,7 @@ final class GatewayDiscoveryModel { private var localIdentity: LocalIdentity private var resolvedTXTByID: [String: [String: String]] = [:] private var pendingTXTResolvers: [String: GatewayTXTResolver] = [:] - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "gateway-discovery") + private let logger = Logger(subsystem: "com.clawdis", category: "gateway-discovery") init() { self.localIdentity = Self.buildLocalIdentityFast() @@ -69,7 +69,7 @@ final class GatewayDiscoveryModel { } self.browsers[domain] = browser - browser.start(queue: DispatchQueue(label: "com.steipete.clawdis.macos.gateway-discovery.\(domain)")) + browser.start(queue: DispatchQueue(label: "com.clawdis.macos.gateway-discovery.\(domain)")) } } diff --git a/apps/macos/Sources/Clawdis/GatewayEndpointStore.swift b/apps/macos/Sources/Clawdis/GatewayEndpointStore.swift index 91f9e15b0..891fa5b4d 100644 --- a/apps/macos/Sources/Clawdis/GatewayEndpointStore.swift +++ b/apps/macos/Sources/Clawdis/GatewayEndpointStore.swift @@ -72,7 +72,7 @@ actor GatewayEndpointStore { } private let deps: Deps - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "gateway-endpoint") + private let logger = Logger(subsystem: "com.clawdis", category: "gateway-endpoint") private var state: GatewayEndpointState private var subscribers: [UUID: AsyncStream.Continuation] = [:] diff --git a/apps/macos/Sources/Clawdis/GatewayEnvironment.swift b/apps/macos/Sources/Clawdis/GatewayEnvironment.swift index 67d9b3572..7c34ae202 100644 --- a/apps/macos/Sources/Clawdis/GatewayEnvironment.swift +++ b/apps/macos/Sources/Clawdis/GatewayEnvironment.swift @@ -62,7 +62,7 @@ struct GatewayCommandResolution { } enum GatewayEnvironment { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "gateway.env") + private static let logger = Logger(subsystem: "com.clawdis", category: "gateway.env") private static let supportedBindModes: Set = ["loopback", "tailnet", "lan", "auto"] static func bundledGatewayExecutable() -> String? { diff --git a/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift b/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift index 1bbee4d14..481988eba 100644 --- a/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift +++ b/apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift @@ -1,14 +1,20 @@ import Foundation enum GatewayLaunchAgentManager { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "gateway.launchd") + private static let logger = Logger(subsystem: "com.clawdis", category: "gateway.launchd") private static let supportedBindModes: Set = ["loopback", "tailnet", "lan", "auto"] + private static let legacyGatewayLaunchdLabel = "com.steipete.clawdis.gateway" private static var plistURL: URL { FileManager.default.homeDirectoryForCurrentUser .appendingPathComponent("Library/LaunchAgents/\(gatewayLaunchdLabel).plist") } + private static var legacyPlistURL: URL { + FileManager.default.homeDirectoryForCurrentUser + .appendingPathComponent("Library/LaunchAgents/\(legacyGatewayLaunchdLabel).plist") + } + private static func gatewayExecutablePath(bundlePath: String) -> String { "\(bundlePath)/Contents/Resources/Relay/clawdis" } @@ -45,6 +51,8 @@ enum GatewayLaunchAgentManager { static func set(enabled: Bool, bundlePath: String, port: Int) async -> String? { if enabled { + _ = await self.runLaunchctl(["bootout", "gui/\(getuid())/\(legacyGatewayLaunchdLabel)"]) + try? FileManager.default.removeItem(at: self.legacyPlistURL) let gatewayBin = self.gatewayExecutablePath(bundlePath: bundlePath) guard FileManager.default.isExecutableFile(atPath: gatewayBin) else { self.logger.error("launchd enable failed: gateway missing at \(gatewayBin)") diff --git a/apps/macos/Sources/Clawdis/GatewayProcessManager.swift b/apps/macos/Sources/Clawdis/GatewayProcessManager.swift index cca6cf79b..54d9e8d1d 100644 --- a/apps/macos/Sources/Clawdis/GatewayProcessManager.swift +++ b/apps/macos/Sources/Clawdis/GatewayProcessManager.swift @@ -42,7 +42,7 @@ final class GatewayProcessManager { private var environmentRefreshTask: Task? private var lastEnvironmentRefresh: Date? private var logRefreshTask: Task? - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "gateway.process") + private let logger = Logger(subsystem: "com.clawdis", category: "gateway.process") private let logLimit = 20000 // characters to keep in-memory private let environmentRefreshMinInterval: TimeInterval = 30 diff --git a/apps/macos/Sources/Clawdis/HealthStore.swift b/apps/macos/Sources/Clawdis/HealthStore.swift index dee277f74..1f4a08918 100644 --- a/apps/macos/Sources/Clawdis/HealthStore.swift +++ b/apps/macos/Sources/Clawdis/HealthStore.swift @@ -77,7 +77,7 @@ enum HealthState: Equatable { final class HealthStore { static let shared = HealthStore() - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "health") + private static let logger = Logger(subsystem: "com.clawdis", category: "health") private(set) var snapshot: HealthSnapshot? private(set) var lastSuccess: Date? diff --git a/apps/macos/Sources/Clawdis/InstanceIdentity.swift b/apps/macos/Sources/Clawdis/InstanceIdentity.swift index 143168b14..3ab2e5490 100644 --- a/apps/macos/Sources/Clawdis/InstanceIdentity.swift +++ b/apps/macos/Sources/Clawdis/InstanceIdentity.swift @@ -2,7 +2,7 @@ import Darwin import Foundation enum InstanceIdentity { - private static let suiteName = "com.steipete.clawdis.shared" + private static let suiteName = "com.clawdis.shared" private static let instanceIdKey = "instanceId" private static var defaults: UserDefaults { diff --git a/apps/macos/Sources/Clawdis/InstancesStore.swift b/apps/macos/Sources/Clawdis/InstancesStore.swift index be14e4d18..2f3a5c039 100644 --- a/apps/macos/Sources/Clawdis/InstancesStore.swift +++ b/apps/macos/Sources/Clawdis/InstancesStore.swift @@ -40,7 +40,7 @@ final class InstancesStore { var statusMessage: String? var isLoading = false - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "instances") + private let logger = Logger(subsystem: "com.clawdis", category: "instances") private var task: Task? private let interval: TimeInterval = 30 private var eventTask: Task? diff --git a/apps/macos/Sources/Clawdis/LaunchAgentManager.swift b/apps/macos/Sources/Clawdis/LaunchAgentManager.swift index 67abe06ec..f9d3a74bf 100644 --- a/apps/macos/Sources/Clawdis/LaunchAgentManager.swift +++ b/apps/macos/Sources/Clawdis/LaunchAgentManager.swift @@ -1,9 +1,14 @@ import Foundation enum LaunchAgentManager { + private static let legacyLaunchdLabel = "com.steipete.clawdis" private static var plistURL: URL { FileManager.default.homeDirectoryForCurrentUser - .appendingPathComponent("Library/LaunchAgents/com.steipete.clawdis.plist") + .appendingPathComponent("Library/LaunchAgents/com.clawdis.mac.plist") + } + private static var legacyPlistURL: URL { + FileManager.default.homeDirectoryForCurrentUser + .appendingPathComponent("Library/LaunchAgents/\(legacyLaunchdLabel).plist") } static func status() async -> Bool { @@ -14,6 +19,8 @@ enum LaunchAgentManager { static func set(enabled: Bool, bundlePath: String) async { if enabled { + _ = await self.runLaunchctl(["bootout", "gui/\(getuid())/\(legacyLaunchdLabel)"]) + try? FileManager.default.removeItem(at: self.legacyPlistURL) self.writePlist(bundlePath: bundlePath) _ = await self.runLaunchctl(["bootout", "gui/\(getuid())/\(launchdLabel)"]) _ = await self.runLaunchctl(["bootstrap", "gui/\(getuid())", self.plistURL.path]) @@ -32,7 +39,7 @@ enum LaunchAgentManager { Label - com.steipete.clawdis + com.clawdis.mac ProgramArguments \(bundlePath)/Contents/MacOS/Clawdis diff --git a/apps/macos/Sources/Clawdis/Logging/ClawdisLogging.swift b/apps/macos/Sources/Clawdis/Logging/ClawdisLogging.swift index 5913acdc4..9180d99b6 100644 --- a/apps/macos/Sources/Clawdis/Logging/ClawdisLogging.swift +++ b/apps/macos/Sources/Clawdis/Logging/ClawdisLogging.swift @@ -74,7 +74,7 @@ enum ClawdisLogging { static func parseLabel(_ label: String) -> (String, String) { guard let range = label.range(of: Self.labelSeparator) else { - return ("com.steipete.clawdis", label) + return ("com.clawdis", label) } let subsystem = String(label[.. [ModelChoice] { let expanded = (path as NSString).expandingTildeInPath diff --git a/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgePairingClient.swift b/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgePairingClient.swift index 3a0612834..7104d886a 100644 --- a/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgePairingClient.swift +++ b/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgePairingClient.swift @@ -15,7 +15,7 @@ actor MacNodeBridgePairingClient { { self.lineBuffer = Data() let connection = NWConnection(to: endpoint, using: .tcp) - let queue = DispatchQueue(label: "com.steipete.clawdis.macos.bridge-client") + let queue = DispatchQueue(label: "com.clawdis.macos.bridge-client") defer { connection.cancel() } try await AsyncTimeout.withTimeout( seconds: 8, diff --git a/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgeSession.swift b/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgeSession.swift index 489530490..65fdd5ef4 100644 --- a/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgeSession.swift +++ b/apps/macos/Sources/Clawdis/NodeMode/MacNodeBridgeSession.swift @@ -39,7 +39,7 @@ actor MacNodeBridgeSession { let params = NWParameters.tcp params.includePeerToPeer = true let connection = NWConnection(to: endpoint, using: params) - let queue = DispatchQueue(label: "com.steipete.clawdis.macos.bridge-session") + let queue = DispatchQueue(label: "com.clawdis.macos.bridge-session") self.connection = connection self.queue = queue diff --git a/apps/macos/Sources/Clawdis/NodeMode/MacNodeModeCoordinator.swift b/apps/macos/Sources/Clawdis/NodeMode/MacNodeModeCoordinator.swift index 37357f988..3fe83622e 100644 --- a/apps/macos/Sources/Clawdis/NodeMode/MacNodeModeCoordinator.swift +++ b/apps/macos/Sources/Clawdis/NodeMode/MacNodeModeCoordinator.swift @@ -7,7 +7,7 @@ import OSLog final class MacNodeModeCoordinator { static let shared = MacNodeModeCoordinator() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "mac-node") + private let logger = Logger(subsystem: "com.clawdis", category: "mac-node") private var task: Task? private let runtime = MacNodeRuntime() private let session = MacNodeBridgeSession() @@ -198,7 +198,7 @@ final class MacNodeModeCoordinator { static func probeEndpoint(_ endpoint: NWEndpoint, timeoutSeconds: Double) async -> Bool { let connection = NWConnection(to: endpoint, using: .tcp) let stream = Self.makeStateStream(for: connection) - connection.start(queue: DispatchQueue(label: "com.steipete.clawdis.macos.bridge-loopback-probe")) + connection.start(queue: DispatchQueue(label: "com.clawdis.macos.bridge-loopback-probe")) do { try await Self.waitForReady(stream, timeoutSeconds: timeoutSeconds) connection.cancel() @@ -339,7 +339,7 @@ final class MacNodeModeCoordinator { } } state.browsers.append(browser) - browser.start(queue: DispatchQueue(label: "com.steipete.clawdis.macos.bridge-discovery.\(domain)")) + browser.start(queue: DispatchQueue(label: "com.clawdis.macos.bridge-discovery.\(domain)")) } Task { @@ -351,7 +351,7 @@ final class MacNodeModeCoordinator { } enum MacNodeTokenStore { - private static let suiteName = "com.steipete.clawdis.shared" + private static let suiteName = "com.clawdis.shared" private static let tokenKey = "mac.node.bridge.token" private static var defaults: UserDefaults { diff --git a/apps/macos/Sources/Clawdis/NodePairingApprovalPrompter.swift b/apps/macos/Sources/Clawdis/NodePairingApprovalPrompter.swift index 932f272f6..8c67081fc 100644 --- a/apps/macos/Sources/Clawdis/NodePairingApprovalPrompter.swift +++ b/apps/macos/Sources/Clawdis/NodePairingApprovalPrompter.swift @@ -20,7 +20,7 @@ enum NodePairingReconcilePolicy { final class NodePairingApprovalPrompter { static let shared = NodePairingApprovalPrompter() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "node-pairing") + private let logger = Logger(subsystem: "com.clawdis", category: "node-pairing") private var task: Task? private var reconcileTask: Task? private var reconcileOnceTask: Task? diff --git a/apps/macos/Sources/Clawdis/NodesStore.swift b/apps/macos/Sources/Clawdis/NodesStore.swift index cc647e102..7d98e7dc0 100644 --- a/apps/macos/Sources/Clawdis/NodesStore.swift +++ b/apps/macos/Sources/Clawdis/NodesStore.swift @@ -36,7 +36,7 @@ final class NodesStore { var statusMessage: String? var isLoading = false - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "nodes") + private let logger = Logger(subsystem: "com.clawdis", category: "nodes") private var task: Task? private let interval: TimeInterval = 30 private var startCount = 0 diff --git a/apps/macos/Sources/Clawdis/NotificationManager.swift b/apps/macos/Sources/Clawdis/NotificationManager.swift index 1c0254955..d4428fc55 100644 --- a/apps/macos/Sources/Clawdis/NotificationManager.swift +++ b/apps/macos/Sources/Clawdis/NotificationManager.swift @@ -5,7 +5,7 @@ import UserNotifications @MainActor struct NotificationManager { - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "notifications") + private let logger = Logger(subsystem: "com.clawdis", category: "notifications") private static let hasTimeSensitiveEntitlement: Bool = { guard let task = SecTaskCreateFromSelf(nil) else { return false } diff --git a/apps/macos/Sources/Clawdis/PeekabooBridgeHostCoordinator.swift b/apps/macos/Sources/Clawdis/PeekabooBridgeHostCoordinator.swift index 2fe702aa9..aeb479d43 100644 --- a/apps/macos/Sources/Clawdis/PeekabooBridgeHostCoordinator.swift +++ b/apps/macos/Sources/Clawdis/PeekabooBridgeHostCoordinator.swift @@ -9,7 +9,7 @@ import PeekabooFoundation final class PeekabooBridgeHostCoordinator { static let shared = PeekabooBridgeHostCoordinator() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "PeekabooBridge") + private let logger = Logger(subsystem: "com.clawdis", category: "PeekabooBridge") private var host: PeekabooBridgeHost? private var services: ClawdisPeekabooBridgeServices? @@ -102,7 +102,7 @@ private final class ClawdisPeekabooBridgeServices: PeekabooBridgeServiceProvidin let snapshots: any SnapshotManagerProtocol init() { - let logging = LoggingService(subsystem: "com.steipete.clawdis.peekaboo") + let logging = LoggingService(subsystem: "com.clawdis.peekaboo") let feedbackClient: any AutomationFeedbackClient = NoopAutomationFeedbackClient() let snapshots = InMemorySnapshotManager(options: .init( diff --git a/apps/macos/Sources/Clawdis/PermissionManager.swift b/apps/macos/Sources/Clawdis/PermissionManager.swift index 8afb9745f..155d59ba6 100644 --- a/apps/macos/Sources/Clawdis/PermissionManager.swift +++ b/apps/macos/Sources/Clawdis/PermissionManager.swift @@ -228,7 +228,7 @@ enum CameraPermissionHelper { } enum AppleScriptPermission { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "AppleScriptPermission") + private static let logger = Logger(subsystem: "com.clawdis", category: "AppleScriptPermission") /// Sends a benign AppleScript to Terminal to verify Automation permission. @MainActor diff --git a/apps/macos/Sources/Clawdis/PortGuardian.swift b/apps/macos/Sources/Clawdis/PortGuardian.swift index dae5328ef..c77a8e1af 100644 --- a/apps/macos/Sources/Clawdis/PortGuardian.swift +++ b/apps/macos/Sources/Clawdis/PortGuardian.swift @@ -22,7 +22,7 @@ actor PortGuardian { } private var records: [Record] = [] - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "portguard") + private let logger = Logger(subsystem: "com.clawdis", category: "portguard") private nonisolated static let appSupportDir: URL = { let base = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! return base.appendingPathComponent("Clawdis", isDirectory: true) diff --git a/apps/macos/Sources/Clawdis/PresenceReporter.swift b/apps/macos/Sources/Clawdis/PresenceReporter.swift index 2ec0c9d89..9afbe1bf9 100644 --- a/apps/macos/Sources/Clawdis/PresenceReporter.swift +++ b/apps/macos/Sources/Clawdis/PresenceReporter.swift @@ -7,7 +7,7 @@ import OSLog final class PresenceReporter { static let shared = PresenceReporter() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "presence") + private let logger = Logger(subsystem: "com.clawdis", category: "presence") private var task: Task? private let interval: TimeInterval = 180 // a few minutes private let instanceId: String = InstanceIdentity.instanceId diff --git a/apps/macos/Sources/Clawdis/RemotePortTunnel.swift b/apps/macos/Sources/Clawdis/RemotePortTunnel.swift index 05bb651df..84d92f6ec 100644 --- a/apps/macos/Sources/Clawdis/RemotePortTunnel.swift +++ b/apps/macos/Sources/Clawdis/RemotePortTunnel.swift @@ -9,7 +9,7 @@ import Darwin /// /// Uses `ssh -N -L` to forward the remote gateway ports to localhost. final class RemotePortTunnel { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "remote.tunnel") + private static let logger = Logger(subsystem: "com.clawdis", category: "remote.tunnel") let process: Process let localPort: UInt16? @@ -167,7 +167,7 @@ final class RemotePortTunnel { if let preferred, self.portIsFree(preferred) { return preferred } return try await withCheckedThrowingContinuation { cont in - let queue = DispatchQueue(label: "com.steipete.clawdis.remote.tunnel.port", qos: .utility) + let queue = DispatchQueue(label: "com.clawdis.remote.tunnel.port", qos: .utility) do { let listener = try NWListener(using: .tcp, on: .any) listener.newConnectionHandler = { connection in connection.cancel() } diff --git a/apps/macos/Sources/Clawdis/RemoteTunnelManager.swift b/apps/macos/Sources/Clawdis/RemoteTunnelManager.swift index b5287a6b4..891ffe8ad 100644 --- a/apps/macos/Sources/Clawdis/RemoteTunnelManager.swift +++ b/apps/macos/Sources/Clawdis/RemoteTunnelManager.swift @@ -5,7 +5,7 @@ import OSLog actor RemoteTunnelManager { static let shared = RemoteTunnelManager() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "remote-tunnel") + private let logger = Logger(subsystem: "com.clawdis", category: "remote-tunnel") private var controlTunnel: RemotePortTunnel? func controlTunnelPortIfRunning() async -> UInt16? { diff --git a/apps/macos/Sources/Clawdis/Resources/Info.plist b/apps/macos/Sources/Clawdis/Resources/Info.plist index fa8b65716..31e80842a 100644 --- a/apps/macos/Sources/Clawdis/Resources/Info.plist +++ b/apps/macos/Sources/Clawdis/Resources/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable Clawdis CFBundleIdentifier - com.steipete.clawdis + com.clawdis.mac CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,7 +24,7 @@ CFBundleURLName - com.steipete.clawdis.deeplink + com.clawdis.mac.deeplink CFBundleURLSchemes clawdis diff --git a/apps/macos/Sources/Clawdis/RuntimeLocator.swift b/apps/macos/Sources/Clawdis/RuntimeLocator.swift index 95f764b9b..5a4f51e1f 100644 --- a/apps/macos/Sources/Clawdis/RuntimeLocator.swift +++ b/apps/macos/Sources/Clawdis/RuntimeLocator.swift @@ -51,7 +51,7 @@ enum RuntimeResolutionError: Error { } enum RuntimeLocator { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "runtime") + private static let logger = Logger(subsystem: "com.clawdis", category: "runtime") private static let minNode = RuntimeVersion(major: 22, minor: 0, patch: 0) static func resolve( diff --git a/apps/macos/Sources/Clawdis/ScreenRecordService.swift b/apps/macos/Sources/Clawdis/ScreenRecordService.swift index 724aaa1cf..33e66ea07 100644 --- a/apps/macos/Sources/Clawdis/ScreenRecordService.swift +++ b/apps/macos/Sources/Clawdis/ScreenRecordService.swift @@ -25,7 +25,7 @@ final class ScreenRecordService { } } - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "screenRecord") + private let logger = Logger(subsystem: "com.clawdis", category: "screenRecord") func record( screenIndex: Int?, @@ -110,7 +110,7 @@ final class ScreenRecordService { } private final class StreamRecorder: NSObject, SCStreamOutput, SCStreamDelegate, @unchecked Sendable { - let queue = DispatchQueue(label: "com.steipete.clawdis.screenRecord.writer") + let queue = DispatchQueue(label: "com.clawdis.screenRecord.writer") private let logger: Logger private let writer: AVAssetWriter diff --git a/apps/macos/Sources/Clawdis/SessionMenuPreviewView.swift b/apps/macos/Sources/Clawdis/SessionMenuPreviewView.swift index abc6bdcc7..8fbd9fa54 100644 --- a/apps/macos/Sources/Clawdis/SessionMenuPreviewView.swift +++ b/apps/macos/Sources/Clawdis/SessionMenuPreviewView.swift @@ -53,7 +53,7 @@ private actor SessionPreviewCache { } struct SessionMenuPreviewView: View { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "SessionPreview") + private static let logger = Logger(subsystem: "com.clawdis", category: "SessionPreview") private static let previewTimeoutSeconds: Double = 4 let sessionKey: String diff --git a/apps/macos/Sources/Clawdis/TailscaleService.swift b/apps/macos/Sources/Clawdis/TailscaleService.swift index b9e45b8af..18b1bd8e4 100644 --- a/apps/macos/Sources/Clawdis/TailscaleService.swift +++ b/apps/macos/Sources/Clawdis/TailscaleService.swift @@ -15,7 +15,7 @@ final class TailscaleService { /// API request timeout in seconds. private static let apiTimeoutInterval: TimeInterval = 5.0 - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "tailscale") + private let logger = Logger(subsystem: "com.clawdis", category: "tailscale") /// Indicates if the Tailscale app is installed on the system. private(set) var isInstalled = false diff --git a/apps/macos/Sources/Clawdis/TalkAudioPlayer.swift b/apps/macos/Sources/Clawdis/TalkAudioPlayer.swift index 6a61b5881..cec9242c2 100644 --- a/apps/macos/Sources/Clawdis/TalkAudioPlayer.swift +++ b/apps/macos/Sources/Clawdis/TalkAudioPlayer.swift @@ -6,7 +6,7 @@ import OSLog final class TalkAudioPlayer: NSObject, @preconcurrency AVAudioPlayerDelegate { static let shared = TalkAudioPlayer() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "talk.tts") + private let logger = Logger(subsystem: "com.clawdis", category: "talk.tts") private var player: AVAudioPlayer? private var playback: Playback? diff --git a/apps/macos/Sources/Clawdis/TalkModeController.swift b/apps/macos/Sources/Clawdis/TalkModeController.swift index 388a88475..7ba9b22d0 100644 --- a/apps/macos/Sources/Clawdis/TalkModeController.swift +++ b/apps/macos/Sources/Clawdis/TalkModeController.swift @@ -5,7 +5,7 @@ import Observation final class TalkModeController { static let shared = TalkModeController() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "talk.controller") + private let logger = Logger(subsystem: "com.clawdis", category: "talk.controller") private(set) var phase: TalkModePhase = .idle private(set) var isPaused: Bool = false diff --git a/apps/macos/Sources/Clawdis/TalkModeRuntime.swift b/apps/macos/Sources/Clawdis/TalkModeRuntime.swift index e7866087e..e5f6b6d17 100644 --- a/apps/macos/Sources/Clawdis/TalkModeRuntime.swift +++ b/apps/macos/Sources/Clawdis/TalkModeRuntime.swift @@ -8,8 +8,8 @@ import Speech actor TalkModeRuntime { static let shared = TalkModeRuntime() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "talk.runtime") - private let ttsLogger = Logger(subsystem: "com.steipete.clawdis", category: "talk.tts") + private let logger = Logger(subsystem: "com.clawdis", category: "talk.runtime") + private let ttsLogger = Logger(subsystem: "com.clawdis", category: "talk.tts") private static let defaultModelIdFallback = "eleven_v3" private final class RMSMeter: @unchecked Sendable { diff --git a/apps/macos/Sources/Clawdis/TalkOverlay.swift b/apps/macos/Sources/Clawdis/TalkOverlay.swift index 57dd56c80..50cdc5ba1 100644 --- a/apps/macos/Sources/Clawdis/TalkOverlay.swift +++ b/apps/macos/Sources/Clawdis/TalkOverlay.swift @@ -12,7 +12,7 @@ final class TalkOverlayController { static let orbPadding: CGFloat = 12 static let orbHitSlop: CGFloat = 10 - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "talk.overlay") + private let logger = Logger(subsystem: "com.clawdis", category: "talk.overlay") struct Model { var isVisible: Bool = false diff --git a/apps/macos/Sources/Clawdis/TerminationSignalWatcher.swift b/apps/macos/Sources/Clawdis/TerminationSignalWatcher.swift index 7e889425f..ec52fd4b7 100644 --- a/apps/macos/Sources/Clawdis/TerminationSignalWatcher.swift +++ b/apps/macos/Sources/Clawdis/TerminationSignalWatcher.swift @@ -6,7 +6,7 @@ import OSLog final class TerminationSignalWatcher { static let shared = TerminationSignalWatcher() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "lifecycle") + private let logger = Logger(subsystem: "com.clawdis", category: "lifecycle") private var sources: [DispatchSourceSignal] = [] private var terminationRequested = false diff --git a/apps/macos/Sources/Clawdis/VoicePushToTalk.swift b/apps/macos/Sources/Clawdis/VoicePushToTalk.swift index 9d49861c6..97b08ab53 100644 --- a/apps/macos/Sources/Clawdis/VoicePushToTalk.swift +++ b/apps/macos/Sources/Clawdis/VoicePushToTalk.swift @@ -93,14 +93,14 @@ final class VoicePushToTalkHotkey: @unchecked Sendable { if chordActive, !self.active { self.active = true Task { - Logger(subsystem: "com.steipete.clawdis", category: "voicewake.ptt") + Logger(subsystem: "com.clawdis", category: "voicewake.ptt") .info("ptt hotkey down") await self.beginAction() } } else if !chordActive, self.active { self.active = false Task { - Logger(subsystem: "com.steipete.clawdis", category: "voicewake.ptt") + Logger(subsystem: "com.clawdis", category: "voicewake.ptt") .info("ptt hotkey up") await self.endAction() } @@ -116,7 +116,7 @@ final class VoicePushToTalkHotkey: @unchecked Sendable { actor VoicePushToTalk { static let shared = VoicePushToTalk() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.ptt") + private let logger = Logger(subsystem: "com.clawdis", category: "voicewake.ptt") private var recognizer: SFSpeechRecognizer? // Lazily created on begin() to avoid creating an AVAudioEngine at app launch, which can switch Bluetooth diff --git a/apps/macos/Sources/Clawdis/VoiceSessionCoordinator.swift b/apps/macos/Sources/Clawdis/VoiceSessionCoordinator.swift index 5cd2f79f5..748202f0a 100644 --- a/apps/macos/Sources/Clawdis/VoiceSessionCoordinator.swift +++ b/apps/macos/Sources/Clawdis/VoiceSessionCoordinator.swift @@ -19,7 +19,7 @@ final class VoiceSessionCoordinator { var autoSendDelay: TimeInterval? } - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.coordinator") + private let logger = Logger(subsystem: "com.clawdis", category: "voicewake.coordinator") private var session: Session? // MARK: - API diff --git a/apps/macos/Sources/Clawdis/VoiceWakeChime.swift b/apps/macos/Sources/Clawdis/VoiceWakeChime.swift index 154bc9958..4a4959002 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeChime.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeChime.swift @@ -41,7 +41,7 @@ enum VoiceWakeChimeCatalog { @MainActor enum VoiceWakeChimePlayer { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.chime") + private static let logger = Logger(subsystem: "com.clawdis", category: "voicewake.chime") private static var lastSound: NSSound? static func play(_ chime: VoiceWakeChime, reason: String? = nil) { diff --git a/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift b/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift index e43db035b..71df43898 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift @@ -2,7 +2,7 @@ import Foundation import OSLog enum VoiceWakeForwarder { - private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.forward") + private static let logger = Logger(subsystem: "com.clawdis", category: "voicewake.forward") static func prefixedTranscript(_ transcript: String, machineName: String? = nil) -> String { let resolvedMachine = machineName diff --git a/apps/macos/Sources/Clawdis/VoiceWakeGlobalSettingsSync.swift b/apps/macos/Sources/Clawdis/VoiceWakeGlobalSettingsSync.swift index 44dba830e..0df11807a 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeGlobalSettingsSync.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeGlobalSettingsSync.swift @@ -5,7 +5,7 @@ import OSLog final class VoiceWakeGlobalSettingsSync { static let shared = VoiceWakeGlobalSettingsSync() - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.sync") + private let logger = Logger(subsystem: "com.clawdis", category: "voicewake.sync") private var task: Task? private struct VoiceWakePayload: Codable, Equatable { diff --git a/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift b/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift index f2b818898..b56dc3c66 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift @@ -8,7 +8,7 @@ import SwiftUI final class VoiceWakeOverlayController { static let shared = VoiceWakeOverlayController() - let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.overlay") + let logger = Logger(subsystem: "com.clawdis", category: "voicewake.overlay") let enableUI: Bool /// Keep the voice wake overlay above any other Clawdis windows, but below the system’s pop-up menus. diff --git a/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift b/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift index 230b5e505..c62886c1a 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift @@ -13,7 +13,7 @@ actor VoiceWakeRuntime { enum ListeningState { case idle, voiceWake, pushToTalk } - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake.runtime") + private let logger = Logger(subsystem: "com.clawdis", category: "voicewake.runtime") private var recognizer: SFSpeechRecognizer? // Lazily created on start to avoid creating an AVAudioEngine at app launch, which can switch Bluetooth diff --git a/apps/macos/Sources/Clawdis/VoiceWakeTester.swift b/apps/macos/Sources/Clawdis/VoiceWakeTester.swift index 5d6d77852..0b1c90b58 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeTester.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeTester.swift @@ -22,7 +22,7 @@ final class VoiceWakeTester { private var lastHeard: Date? private var holdingAfterDetect = false private var detectedText: String? - private let logger = Logger(subsystem: "com.steipete.clawdis", category: "voicewake") + private let logger = Logger(subsystem: "com.clawdis", category: "voicewake") private let silenceWindow: TimeInterval = 1.0 init(locale: Locale = .current) { diff --git a/apps/macos/Sources/Clawdis/WebChatSwiftUI.swift b/apps/macos/Sources/Clawdis/WebChatSwiftUI.swift index 8e7af9c4a..98e5ccace 100644 --- a/apps/macos/Sources/Clawdis/WebChatSwiftUI.swift +++ b/apps/macos/Sources/Clawdis/WebChatSwiftUI.swift @@ -6,7 +6,7 @@ import OSLog import QuartzCore import SwiftUI -private let webChatSwiftLogger = Logger(subsystem: "com.steipete.clawdis", category: "WebChatSwiftUI") +private let webChatSwiftLogger = Logger(subsystem: "com.clawdis", category: "WebChatSwiftUI") private enum WebChatSwiftUILayout { static let windowSize = NSSize(width: 500, height: 840) diff --git a/apps/macos/Tests/ClawdisIPCTests/MacNodeBridgeDiscoveryTests.swift b/apps/macos/Tests/ClawdisIPCTests/MacNodeBridgeDiscoveryTests.swift index 67d46b691..af32ff683 100644 --- a/apps/macos/Tests/ClawdisIPCTests/MacNodeBridgeDiscoveryTests.swift +++ b/apps/macos/Tests/ClawdisIPCTests/MacNodeBridgeDiscoveryTests.swift @@ -24,7 +24,7 @@ import Testing listener.newConnectionHandler = { connection in connection.cancel() } - listener.start(queue: DispatchQueue(label: "com.steipete.clawdis.tests.bridge-listener")) + listener.start(queue: DispatchQueue(label: "com.clawdis.tests.bridge-listener")) try await waitForListenerReady(listener, timeoutSeconds: 1.0) guard let port = listener.port else { diff --git a/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatViewModel.swift b/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatViewModel.swift index 010f56046..6acdf9409 100644 --- a/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatViewModel.swift +++ b/apps/shared/ClawdisKit/Sources/ClawdisChatUI/ChatViewModel.swift @@ -10,7 +10,7 @@ import AppKit import UIKit #endif -private let chatUILogger = Logger(subsystem: "com.steipete.clawdis", category: "ClawdisChatUI") +private let chatUILogger = Logger(subsystem: "com.clawdis", category: "ClawdisChatUI") @MainActor @Observable diff --git a/docs/clawdis-mac.md b/docs/clawdis-mac.md index 6117c35fa..949751dc4 100644 --- a/docs/clawdis-mac.md +++ b/docs/clawdis-mac.md @@ -21,7 +21,7 @@ Author: steipete · Status: draft spec · Date: 2025-12-20 - Targets: - `ClawdisIPC` (shared Codable types + helpers for app‑internal actions). - `Clawdis` (LSUIElement MenuBarExtra app; hosts Gateway + node bridge + PeekabooBridgeHost). -- Bundle ID: `com.steipete.clawdis`. +- Bundle ID: `com.clawdis.mac`. - Bundled runtime binaries live under `Contents/Resources/Relay/`: - `clawdis` (bun‑compiled relay: CLI + gateway-daemon) - The app symlinks `clawdis` into `/usr/local/bin` and `/opt/homebrew/bin`. diff --git a/docs/gateway.md b/docs/gateway.md index 1f09e3c23..ca9c2df0e 100644 --- a/docs/gateway.md +++ b/docs/gateway.md @@ -125,7 +125,7 @@ See also: `docs/presence.md` for how presence is produced/deduped and why `insta - On failure, launchd restarts; fatal misconfig should keep exiting so the operator notices. Bundled mac app: -- Clawdis.app can bundle a bun-compiled gateway binary and install a per-user LaunchAgent labeled `com.steipete.clawdis.gateway`. +- Clawdis.app can bundle a bun-compiled gateway binary and install a per-user LaunchAgent labeled `com.clawdis.gateway`. ## Supervision (systemd example) ``` diff --git a/docs/mac/bun.md b/docs/mac/bun.md index f8b6fb0f0..214542a2a 100644 --- a/docs/mac/bun.md +++ b/docs/mac/bun.md @@ -52,10 +52,10 @@ Version injection: ## Launchd (Gateway as LaunchAgent) Label: -- `com.steipete.clawdis.gateway` +- `com.clawdis.gateway` Plist location (per-user): -- `~/Library/LaunchAgents/com.steipete.clawdis.gateway.plist` +- `~/Library/LaunchAgents/com.clawdis.gateway.plist` Manager: - `apps/macos/Sources/Clawdis/GatewayLaunchAgentManager.swift` diff --git a/docs/mac/canvas.md b/docs/mac/canvas.md index 3b712e444..c2c1302ed 100644 --- a/docs/mac/canvas.md +++ b/docs/mac/canvas.md @@ -157,5 +157,5 @@ Recommended defaults: Suggested debugging hooks: - Enable Web Inspector for Canvas builds (same approach as WebChat). -- Log scheme requests + resolution decisions to OSLog (subsystem `com.steipete.clawdis`, category `Canvas`). +- Log scheme requests + resolution decisions to OSLog (subsystem `com.clawdis`, category `Canvas`). - Provide a “copy canvas dir” action in debug settings to quickly reveal the session directory in Finder. diff --git a/docs/mac/dev-setup.md b/docs/mac/dev-setup.md index eb3c0fe37..387bef9e1 100644 --- a/docs/mac/dev-setup.md +++ b/docs/mac/dev-setup.md @@ -68,7 +68,7 @@ If the app crashes when you try to allow **Speech Recognition** or **Microphone* **Fix:** 1. Reset the TCC permissions: ```bash - tccutil reset All com.steipete.clawdis.debug + tccutil reset All com.clawdis.mac.debug ``` 2. If that fails, change the `BUNDLE_ID` temporarily in `scripts/package-mac-app.sh` to force a "clean slate" from macOS. diff --git a/docs/mac/logging.md b/docs/mac/logging.md index 368da20e6..2f66bd4fc 100644 --- a/docs/mac/logging.md +++ b/docs/mac/logging.md @@ -22,11 +22,11 @@ Notes: Unified logging redacts most payloads unless a subsystem opts into `privacy -off`. Per Peter's write-up on macOS [logging privacy shenanigans](https://steipete.me/posts/2025/logging-privacy-shenanigans) (2025) this is controlled by a plist in `/Library/Preferences/Logging/Subsystems/` keyed by the subsystem name. Only new log entries pick up the flag, so enable it before reproducing an issue. -## Enable for Clawdis (`com.steipete.clawdis`) +## Enable for Clawdis (`com.clawdis`) - Write the plist to a temp file first, then install it atomically as root: ```bash -cat <<'EOF' >/tmp/com.steipete.clawdis.plist +cat <<'EOF' >/tmp/com.clawdis.plist @@ -39,13 +39,13 @@ cat <<'EOF' >/tmp/com.steipete.clawdis.plist EOF -sudo install -m 644 -o root -g wheel /tmp/com.steipete.clawdis.plist /Library/Preferences/Logging/Subsystems/com.steipete.clawdis.plist +sudo install -m 644 -o root -g wheel /tmp/com.clawdis.plist /Library/Preferences/Logging/Subsystems/com.clawdis.plist ``` - No reboot is required; logd notices the file quickly, but only new log lines will include private payloads. - View the richer output with the existing helper, e.g. `./scripts/clawlog.sh --category WebChat --last 5m`. ## Disable after debugging -- Remove the override: `sudo rm /Library/Preferences/Logging/Subsystems/com.steipete.clawdis.plist`. +- Remove the override: `sudo rm /Library/Preferences/Logging/Subsystems/com.clawdis.plist`. - Optionally run `sudo log config --reload` to force logd to drop the override immediately. - Remember this surface can include phone numbers and message bodies; keep the plist in place only while you actively need the extra detail. diff --git a/docs/mac/release.md b/docs/mac/release.md index 9d882c7e3..fc0f888c3 100644 --- a/docs/mac/release.md +++ b/docs/mac/release.md @@ -28,7 +28,7 @@ Notes: ```bash # From repo root; set release IDs so Sparkle feed is enabled. # APP_BUILD must be numeric + monotonic for Sparkle compare. -BUNDLE_ID=com.steipete.clawdis \ +BUNDLE_ID=com.clawdis.mac \ APP_VERSION=0.1.0 \ APP_BUILD="$(git rev-list --count HEAD)" \ BUILD_CONFIG=release \ @@ -46,7 +46,7 @@ scripts/create-dmg.sh dist/Clawdis.app dist/Clawdis-0.1.0.dmg # xcrun notarytool store-credentials "clawdis-notary" \ # --apple-id "" --team-id "" --password "" NOTARIZE=1 NOTARYTOOL_PROFILE=clawdis-notary \ -BUNDLE_ID=com.steipete.clawdis \ +BUNDLE_ID=com.clawdis.mac \ APP_VERSION=0.1.0 \ APP_BUILD="$(git rev-list --count HEAD)" \ BUILD_CONFIG=release \ diff --git a/docs/mac/signing.md b/docs/mac/signing.md index 2740eb46c..489c22151 100644 --- a/docs/mac/signing.md +++ b/docs/mac/signing.md @@ -7,7 +7,7 @@ read_when: This app is usually built from `scripts/package-mac-app.sh`, which now: -- sets a stable debug bundle identifier: `com.steipete.clawdis.debug` +- sets a stable debug bundle identifier: `com.clawdis.mac.debug` - writes the Info.plist with that bundle id (override via `BUNDLE_ID=...`) - calls `scripts/codesign-mac-app.sh` to sign the main binary, bundled CLI, and app bundle so macOS treats each rebuild as the same signed bundle and keeps TCC permissions (notifications, accessibility, screen recording, mic, speech). Requires a valid signing identity. - uses `CODESIGN_TIMESTAMP=auto` by default; it enables trusted timestamps for Developer ID signatures. Set `CODESIGN_TIMESTAMP=off` to skip timestamping (offline debug builds). diff --git a/docs/mac/voice-overlay.md b/docs/mac/voice-overlay.md index af79892eb..74d3ae435 100644 --- a/docs/mac/voice-overlay.md +++ b/docs/mac/voice-overlay.md @@ -32,14 +32,14 @@ Audience: macOS app contributors. Goal: keep the voice overlay predictable when - Push-to-talk: no delay; wake-word: optional delay for auto-send. - Apply a short cooldown to the wake runtime after push-to-talk finishes so wake-word doesn’t immediately retrigger. 5. **Logging** - - Coordinator emits `.info` logs in subsystem `com.steipete.clawdis`, categories `voicewake.overlay` and `voicewake.chime`. + - Coordinator emits `.info` logs in subsystem `com.clawdis`, categories `voicewake.overlay` and `voicewake.chime`. - Key events: `session_started`, `adopted_by_push_to_talk`, `partial`, `finalized`, `send`, `dismiss`, `cancel`, `cooldown`. ### Debugging checklist - Stream logs while reproducing a sticky overlay: ```bash - sudo log stream --predicate 'subsystem == "com.steipete.clawdis" AND category CONTAINS "voicewake"' --level info --style compact + sudo log stream --predicate 'subsystem == "com.clawdis" AND category CONTAINS "voicewake"' --level info --style compact ``` - Verify only one active session token; stale callbacks should be dropped by the coordinator. - Ensure push-to-talk release always calls `endCapture` with the active token; if text is empty, expect `dismiss` without chime or send. diff --git a/docs/mac/webchat.md b/docs/mac/webchat.md index d2b825473..f19b7a0c2 100644 --- a/docs/mac/webchat.md +++ b/docs/mac/webchat.md @@ -13,7 +13,7 @@ The macOS menu bar app shows the WebChat UI as a native SwiftUI view and reuses ## Launch & debugging - Manual: Lobster menu → “Open Chat”. - Auto-open for testing: run `dist/Clawdis.app/Contents/MacOS/Clawdis --webchat` (or pass `--webchat` to the binary launched by launchd). The window opens on startup. -- Logs: see `./scripts/clawlog.sh` (subsystem `com.steipete.clawdis`, category `WebChatSwiftUI`). +- Logs: see `./scripts/clawlog.sh` (subsystem `com.clawdis`, category `WebChatSwiftUI`). ## How it’s wired - Implementation: `apps/macos/Sources/Clawdis/WebChatSwiftUI.swift` hosts `ClawdisChatUI` and speaks to the Gateway over `GatewayConnection`. diff --git a/docs/nix.md b/docs/nix.md index 6e8a8cb42..e9c118ee1 100644 --- a/docs/nix.md +++ b/docs/nix.md @@ -17,7 +17,7 @@ On macOS, the GUI app does not automatically inherit shell env vars. You can also enable Nix mode via defaults: ``` -defaults write com.steipete.clawdis clawdis.nixMode -bool true +defaults write com.clawdis.mac clawdis.nixMode -bool true ``` ## Config + state paths diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 3a7d17b61..2f57daff8 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -142,7 +142,7 @@ If the app disappears or shows "Abort trap 6" when you click "Allow" on a privac **Fix 1: Reset TCC Cache** ```bash -tccutil reset All com.steipete.clawdis.debug +tccutil reset All com.clawdis.mac.debug ``` **Fix 2: Force New Bundle ID** diff --git a/scripts/clawlog.sh b/scripts/clawlog.sh index 86852ea18..4e9f820f8 100755 --- a/scripts/clawlog.sh +++ b/scripts/clawlog.sh @@ -6,7 +6,7 @@ set -euo pipefail # Configuration -SUBSYSTEM="com.steipete.clawdis" +SUBSYSTEM="com.clawdis" DEFAULT_LEVEL="info" # Colors for output @@ -58,7 +58,7 @@ DESCRIPTION: Requires sudo access configured for /usr/bin/log command. LOG FLOW ARCHITECTURE: - Clawdis logs flow through the macOS unified log (subsystem: com.steipete.clawdis). + Clawdis logs flow through the macOS unified log (subsystem: com.clawdis). LOG CATEGORIES (examples): • voicewake - Voice wake detection/test harness diff --git a/scripts/package-mac-app.sh b/scripts/package-mac-app.sh index b80de8f76..32825c5e9 100755 --- a/scripts/package-mac-app.sh +++ b/scripts/package-mac-app.sh @@ -8,7 +8,7 @@ ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" APP_ROOT="$ROOT_DIR/dist/Clawdis.app" BUILD_ROOT="$ROOT_DIR/apps/macos/.build" PRODUCT="Clawdis" -BUNDLE_ID="${BUNDLE_ID:-com.steipete.clawdis.debug}" +BUNDLE_ID="${BUNDLE_ID:-com.clawdis.mac.debug}" PKG_VERSION="$(cd "$ROOT_DIR" && node -p "require('./package.json').version" 2>/dev/null || echo "0.0.0")" BUILD_TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ") GIT_COMMIT=$(cd "$ROOT_DIR" && git rev-parse --short HEAD 2>/dev/null || echo "unknown") diff --git a/scripts/restart-mac.sh b/scripts/restart-mac.sh index 35886e71b..668ac483c 100755 --- a/scripts/restart-mac.sh +++ b/scripts/restart-mac.sh @@ -9,7 +9,7 @@ APP_PROCESS_PATTERN="Clawdis.app/Contents/MacOS/Clawdis" DEBUG_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build/debug/Clawdis" LOCAL_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build-local/debug/Clawdis" RELEASE_PROCESS_PATTERN="${ROOT_DIR}/apps/macos/.build/release/Clawdis" -LAUNCH_AGENT="${HOME}/Library/LaunchAgents/com.steipete.clawdis.plist" +LAUNCH_AGENT="${HOME}/Library/LaunchAgents/com.clawdis.mac.plist" LOCK_KEY="$(printf '%s' "${ROOT_DIR}" | shasum -a 256 | cut -c1-8)" LOCK_DIR="${TMPDIR:-/tmp}/clawdis-restart-${LOCK_KEY}" LOCK_PID_FILE="${LOCK_DIR}/pid" @@ -103,7 +103,7 @@ kill_all_clawdis() { } stop_launch_agent() { - launchctl bootout gui/"$UID"/com.steipete.clawdis 2>/dev/null || true + launchctl bootout gui/"$UID"/com.clawdis.mac 2>/dev/null || true } # 1) Kill all running instances first. diff --git a/src/daemon/constants.ts b/src/daemon/constants.ts index 0ce264413..0edef7044 100644 --- a/src/daemon/constants.ts +++ b/src/daemon/constants.ts @@ -1,3 +1,3 @@ -export const GATEWAY_LAUNCH_AGENT_LABEL = "com.steipete.clawdis.gateway"; +export const GATEWAY_LAUNCH_AGENT_LABEL = "com.clawdis.gateway"; export const GATEWAY_SYSTEMD_SERVICE_NAME = "clawdis-gateway"; export const GATEWAY_WINDOWS_TASK_NAME = "Clawdis Gateway"; diff --git a/src/daemon/launchd.ts b/src/daemon/launchd.ts index 257fa7310..bc7ffca3a 100644 --- a/src/daemon/launchd.ts +++ b/src/daemon/launchd.ts @@ -6,6 +6,7 @@ import { promisify } from "node:util"; import { GATEWAY_LAUNCH_AGENT_LABEL } from "./constants.js"; const execFileAsync = promisify(execFile); +const LEGACY_GATEWAY_LAUNCH_AGENT_LABEL = "com.steipete.clawdis.gateway"; function resolveHomeDir(env: Record): string { const home = env.HOME?.trim() || env.USERPROFILE?.trim(); @@ -25,6 +26,18 @@ export function resolveLaunchAgentPlistPath( ); } +function resolveLegacyLaunchAgentPlistPath( + env: Record, +): string { + const home = resolveHomeDir(env); + return path.join( + home, + "Library", + "LaunchAgents", + `${LEGACY_GATEWAY_LAUNCH_AGENT_LABEL}.plist`, + ); +} + export function resolveGatewayLogPaths( env: Record, ): { @@ -246,6 +259,16 @@ export async function installLaunchAgent({ const { logDir, stdoutPath, stderrPath } = resolveGatewayLogPaths(env); await fs.mkdir(logDir, { recursive: true }); + const legacyPlistPath = resolveLegacyLaunchAgentPlistPath(env); + const domain = resolveGuiDomain(); + await execLaunchctl(["bootout", domain, legacyPlistPath]); + await execLaunchctl(["unload", legacyPlistPath]); + try { + await fs.unlink(legacyPlistPath); + } catch { + // ignore + } + const plistPath = resolveLaunchAgentPlistPath(env); await fs.mkdir(path.dirname(plistPath), { recursive: true }); @@ -258,7 +281,6 @@ export async function installLaunchAgent({ }); await fs.writeFile(plistPath, plist, "utf8"); - const domain = resolveGuiDomain(); await execLaunchctl(["bootout", domain, plistPath]); await execLaunchctl(["unload", plistPath]); const boot = await execLaunchctl(["bootstrap", domain, plistPath]); diff --git a/src/infra/restart.ts b/src/infra/restart.ts index 8ae119d5c..926251059 100644 --- a/src/infra/restart.ts +++ b/src/infra/restart.ts @@ -1,6 +1,6 @@ import { spawnSync } from "node:child_process"; -const DEFAULT_LAUNCHD_LABEL = "com.steipete.clawdis"; +const DEFAULT_LAUNCHD_LABEL = "com.clawdis.mac"; const DEFAULT_SYSTEMD_UNIT = "clawdis-gateway.service"; export function triggerClawdisRestart():