From d0081b064e1ce80775b76caeb31c995a599e39d9 Mon Sep 17 00:00:00 2001 From: inscape Date: Thu, 19 Mar 2026 17:32:42 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Klawty=20v1.0.0=20=E2=80=94=20Security-hard?= =?UTF-8?q?ened=20OpenClaw=20fork?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fork of OpenClaw v2026.3.14 (302K+ stars, MIT) with: Rebrand: - CLI: openclaw → klawty - Config: openclaw.json → klawty.json - State: ~/.openclaw → ~/.klawty - Default port: 18789 → 2508 - Version: 1.0.0 (Klawty semver) Security modules (src/security/, 2,758 lines): - policy-enforcer.js — deny-by-default YAML policy engine - exec-sandbox.js — Docker container for shell commands - privacy-router.js — PII detection + local model routing - credential-monitor.js — 6h API key health checks - integrity-check.js — SHA-256 boot verification - auto-update.js — version check + rollback - tui-dashboard.js — full-screen terminal dashboard - klawty-boot.js — boot hook for all modules Security policy: - klawty-policy.yaml — network allowlist, filesystem restrictions, exec blocked patterns, resource limits, PII config Scripts: - scripts/install.sh — one-command installer - scripts/onboard.sh — interactive setup wizard Workspace (demo agent): - 1 agent (Atlas) with read-only tools - Minimal klawty.json (1 model, no routing) - 1 demo skill (web-research) OpenClaw MIT license preserved. Built by dcode technologies S.A., Luxembourg. Co-Authored-By: Claude Opus 4.6 (1M context) --- .agent/workflows/update_clawdbot.md | 14 +- .agents/maintainers.md | 2 +- .../skills/openclaw-ghsa-maintainer/SKILL.md | 18 +- .../skills/openclaw-parallels-smoke/SKILL.md | 16 +- .../skills/openclaw-pr-maintainer/SKILL.md | 14 +- .../openclaw-release-maintainer/SKILL.md | 18 +- .../parallels-discord-roundtrip/SKILL.md | 12 +- .github/ISSUE_TEMPLATE/bug_report.yml | 14 +- .github/ISSUE_TEMPLATE/config.yml | 4 +- .../codeql/codeql-javascript-typescript.yml | 2 +- .github/instructions/copilot.instructions.md | 4 +- .github/workflows/auto-response.yml | 6 +- .github/workflows/ci.yml | 26 +- .github/workflows/codeql.yml | 4 +- .github/workflows/docker-release.yml | 4 +- .github/workflows/install-smoke.yml | 24 +- ...npm-release.yml => klawty-npm-release.yml} | 36 +- .github/workflows/sandbox-common-smoke.yml | 8 +- .github/workflows/stale.yml | 4 +- .gitignore | 12 + .pre-commit-config.yaml | 10 +- .swiftlint.yml | 4 +- 2026-03-19T12-25-44.486Z-klawty-backup.tar.gz | Bin 0 -> 3372 bytes AGENTS.md | 74 +- CHANGELOG.md | 2 +- CONTRIBUTING.md | 36 +- Dockerfile | 110 +- Dockerfile.sandbox | 4 +- Dockerfile.sandbox-browser | 8 +- Dockerfile.sandbox-common | 6 +- KLAWTY-CHANGELOG.md | 81 + README.md | 647 +--- SECURITY.md | 94 +- VISION.md | 22 +- apps/android/README.md | 38 +- apps/android/app/build.gradle.kts | 22 +- apps/android/app/src/main/AndroidManifest.xml | 2 +- .../app/CameraHudState.kt | 2 +- .../{openclaw => klawty}/app/DeviceNames.kt | 2 +- .../{openclaw => klawty}/app/LocationMode.kt | 2 +- .../{openclaw => klawty}/app/MainActivity.kt | 8 +- .../{openclaw => klawty}/app/MainViewModel.kt | 20 +- .../ai/{openclaw => klawty}/app/NodeApp.kt | 2 +- .../app/NodeForegroundService.kt | 10 +- .../{openclaw => klawty}/app/NodeRuntime.kt | 46 +- .../app/PermissionRequester.kt | 4 +- .../{openclaw => klawty}/app/SecurePrefs.kt | 8 +- .../ai/{openclaw => klawty}/app/SessionKey.kt | 2 +- .../{openclaw => klawty}/app/VoiceWakeMode.kt | 2 +- .../ai/{openclaw => klawty}/app/WakeWords.kt | 2 +- .../app/chat/ChatController.kt | 4 +- .../app/chat/ChatModels.kt | 2 +- .../app/gateway/BonjourEscapes.kt | 2 +- .../app/gateway/DeviceAuthPayload.kt | 2 +- .../app/gateway/DeviceAuthStore.kt | 4 +- .../app/gateway/DeviceIdentityStore.kt | 4 +- .../app/gateway/GatewayDiscovery.kt | 8 +- .../app/gateway/GatewayEndpoint.kt | 2 +- .../app/gateway/GatewayProtocol.kt | 2 +- .../app/gateway/GatewaySession.kt | 18 +- .../app/gateway/GatewayTls.kt | 2 +- .../app/gateway/InvokeErrorParser.kt | 2 +- .../app/node/A2UIHandler.kt | 16 +- .../app/node/CalendarHandler.kt | 4 +- .../app/node/CallLogHandler.kt | 4 +- .../app/node/CameraCaptureManager.kt | 8 +- .../app/node/CameraHandler.kt | 12 +- .../app/node/CanvasController.kt | 12 +- .../app/node/ConnectionManager.kt | 24 +- .../app/node/ContactsHandler.kt | 4 +- .../app/node/DebugHandler.kt | 8 +- .../app/node/DeviceHandler.kt | 6 +- .../node/DeviceNotificationListenerService.kt | 2 +- .../app/node/GatewayEventHandler.kt | 6 +- .../app/node/InvokeCommandRegistry.kt | 114 +- .../app/node/InvokeDispatcher.kt | 84 +- .../app/node/JpegSizeLimiter.kt | 2 +- .../app/node/LocationCaptureManager.kt | 2 +- .../app/node/LocationHandler.kt | 6 +- .../app/node/MotionHandler.kt | 4 +- .../app/node/NodeUtils.kt | 4 +- .../app/node/NotificationsHandler.kt | 4 +- .../app/node/PhotosHandler.kt | 4 +- .../app/node/SmsHandler.kt | 4 +- .../app/node/SmsManager.kt | 4 +- .../app/node/SystemHandler.kt | 12 +- .../app/protocol/KlawtyCanvasA2UIAction.kt} | 6 +- .../app/protocol/KlawtyProtocolConstants.kt} | 30 +- .../app/tools/ToolDisplay.kt | 2 +- .../app/ui/CameraHudOverlay.kt | 2 +- .../app/ui/CanvasScreen.kt | 18 +- .../{openclaw => klawty}/app/ui/ChatSheet.kt | 6 +- .../app/ui/ConnectTabScreen.kt | 12 +- .../app/ui/GatewayConfigResolver.kt | 2 +- .../app/ui/GatewayDiagnostics.kt | 12 +- .../app/ui/KlawtyTheme.kt} | 4 +- .../app/ui/MobileUiTokens.kt | 4 +- .../app/ui/OnboardingFlow.kt | 22 +- .../app/ui/PostOnboardingTabs.kt | 6 +- .../{openclaw => klawty}/app/ui/RootScreen.kt | 4 +- .../app/ui/SettingsSheet.kt | 12 +- .../app/ui/TalkOrbOverlay.kt | 2 +- .../app/ui/VoiceTabScreen.kt | 12 +- .../app/ui/chat/Base64ImageState.kt | 2 +- .../app/ui/chat/ChatComposer.kt | 32 +- .../app/ui/chat/ChatImageCodec.kt | 4 +- .../app/ui/chat/ChatMarkdown.kt | 14 +- .../app/ui/chat/ChatMessageListCard.kt | 18 +- .../app/ui/chat/ChatMessageViews.kt | 46 +- .../app/ui/chat/ChatSheetContent.kt | 32 +- .../app/ui/chat/SessionFilters.kt | 4 +- .../app/voice/ElevenLabsStreamingTts.kt | 2 +- .../app/voice/MicCaptureManager.kt | 2 +- .../app/voice/StreamingMediaDataSource.kt | 2 +- .../app/voice/TalkDefaults.kt | 2 +- .../app/voice/TalkDirectiveParser.kt | 2 +- .../app/voice/TalkModeGatewayConfig.kt | 4 +- .../app/voice/TalkModeManager.kt | 8 +- .../app/voice/TalkModeVoiceResolver.kt | 2 +- .../app/voice/VoiceWakeCommandExtractor.kt | 2 +- .../app/voice/VoiceWakeManager.kt | 2 +- .../app/src/main/res/values-night/themes.xml | 2 +- .../app/src/main/res/values/strings.xml | 2 +- .../app/src/main/res/values/themes.xml | 2 +- .../main/res/xml/network_security_config.xml | 2 +- .../app/NodeForegroundServiceTest.kt | 2 +- .../app/SecurePrefsTest.kt | 6 +- .../{openclaw => klawty}/app/WakeWordsTest.kt | 18 +- .../chat/ChatControllerMessageIdentityTest.kt | 2 +- .../app/gateway/BonjourEscapesTest.kt | 4 +- .../app/gateway/DeviceAuthPayloadTest.kt | 6 +- .../app/gateway/GatewaySessionInvokeTest.kt | 8 +- .../GatewaySessionInvokeTimeoutTest.kt | 10 +- .../app/gateway/InvokeErrorParserTest.kt | 2 +- .../app/node/CalendarHandlerTest.kt | 2 +- .../app/node/CallLogHandlerTest.kt | 2 +- .../app/node/CameraHandlerTest.kt | 2 +- .../CanvasControllerSnapshotParamsTest.kt | 2 +- .../app/node/ConnectionManagerTest.kt | 8 +- .../app/node/ContactsHandlerTest.kt | 2 +- .../app/node/DeviceHandlerTest.kt | 2 +- .../app/node/InvokeCommandRegistryTest.kt | 112 +- .../app/node/JpegSizeLimiterTest.kt | 2 +- .../app/node/MotionHandlerTest.kt | 2 +- .../app/node/NodeHandlerRobolectricTest.kt | 2 +- .../app/node/NotificationsHandlerTest.kt | 4 +- .../app/node/PhotosHandlerTest.kt | 2 +- .../app/node/SmsManagerTest.kt | 2 +- .../app/node/SystemHandlerTest.kt | 10 +- .../protocol/KlawtyCanvasA2UIActionTest.kt} | 16 +- .../protocol/KlawtyProtocolConstantsTest.kt | 98 + .../app/ui/GatewayConfigResolverTest.kt | 2 +- .../app/ui/chat/ChatImageCodecTest.kt | 2 +- .../app/ui/chat/SessionFiltersTest.kt | 4 +- .../app/voice/TalkDirectiveParserTest.kt | 2 +- .../app/voice/TalkModeConfigContractTest.kt | 2 +- .../app/voice/TalkModeConfigParsingTest.kt | 2 +- .../app/voice/TalkModeVoiceResolverTest.kt | 2 +- .../voice/VoiceWakeCommandExtractorTest.kt | 6 +- .../protocol/OpenClawProtocolConstantsTest.kt | 98 - apps/android/benchmark/build.gradle.kts | 2 +- .../app/benchmark/StartupMacrobenchmark.kt | 4 +- apps/android/settings.gradle.kts | 2 +- apps/android/style.md | 12 +- apps/ios/ActivityWidget/Info.plist | 6 +- .../KlawtyActivityWidgetBundle.swift | 9 + ...ctivity.swift => KlawtyLiveActivity.swift} | 14 +- .../OpenClawActivityWidgetBundle.swift | 9 - apps/ios/README.md | 26 +- apps/ios/ShareExtension/Info.plist | 6 +- .../ShareExtension/ShareViewController.swift | 28 +- .../Sources/Calendar/CalendarService.swift | 14 +- .../ios/Sources/Camera/CameraController.swift | 12 +- .../Capabilities/NodeCapabilityRouter.swift | 2 +- apps/ios/Sources/Chat/ChatSheet.swift | 10 +- .../Chat/IOSGatewayChatTransport.swift | 34 +- .../Sources/Contacts/ContactsService.swift | 16 +- .../Sources/Device/DeviceStatusService.swift | 26 +- .../Sources/Device/NetworkStatusService.swift | 18 +- .../Gateway/DeepLinkAgentPromptAlert.swift | 2 +- .../Gateway/GatewayConnectConfig.swift | 2 +- .../Gateway/GatewayConnectionController.swift | 110 +- .../Gateway/GatewayDiscoveryModel.swift | 10 +- .../Gateway/GatewayHealthMonitor.swift | 2 +- .../Gateway/GatewayServiceResolver.swift | 2 +- .../Gateway/GatewaySettingsStore.swift | 12 +- apps/ios/Sources/Gateway/KeychainStore.swift | 2 +- apps/ios/Sources/Info.plist | 46 +- ...nClaw.entitlements => Klawty.entitlements} | 0 .../{OpenClawApp.swift => KlawtyApp.swift} | 54 +- ...s.swift => KlawtyActivityAttributes.swift} | 14 +- .../LiveActivity/LiveActivityManager.swift | 22 +- .../Sources/Location/LocationService.swift | 10 +- .../Location/SignificantLocationMonitor.swift | 4 +- .../Sources/Media/PhotoLibraryService.swift | 12 +- .../Sources/Model/NodeAppModel+Canvas.swift | 6 +- ...odeAppModel+WatchNotifyNormalization.swift | 36 +- apps/ios/Sources/Model/NodeAppModel.swift | 328 +- apps/ios/Sources/Motion/MotionService.swift | 16 +- .../Onboarding/OnboardingWizardView.swift | 42 +- .../Sources/Onboarding/QRScannerView.swift | 4 +- apps/ios/Sources/Push/PushBuildConfig.swift | 8 +- .../Push/PushRegistrationManager.swift | 4 +- .../Sources/Push/PushRelayKeychainStore.swift | 2 +- .../Sources/Reminders/RemindersService.swift | 16 +- apps/ios/Sources/RootCanvas.swift | 6 +- .../ios/Sources/Screen/ScreenController.swift | 12 +- .../Sources/Screen/ScreenRecordService.swift | 6 +- apps/ios/Sources/Screen/ScreenTab.swift | 2 +- apps/ios/Sources/Screen/ScreenWebView.swift | 10 +- .../Services/NodeServiceProtocols.swift | 42 +- .../Services/WatchMessagingService.swift | 10 +- apps/ios/Sources/Settings/SettingsTab.swift | 32 +- .../Settings/VoiceWakeWordsSettingsView.swift | 2 +- .../Sources/Voice/TalkModeGatewayConfig.swift | 2 +- apps/ios/Sources/Voice/TalkModeManager.swift | 44 +- apps/ios/Sources/Voice/VoiceWakeManager.swift | 2 +- .../Sources/Voice/VoiceWakePreferences.swift | 2 +- apps/ios/Tests/AppCoverageTests.swift | 2 +- .../Tests/CameraControllerClampTests.swift | 2 +- .../Tests/CameraControllerErrorTests.swift | 2 +- apps/ios/Tests/DeepLinkParserTests.swift | 24 +- .../GatewayConnectionControllerTests.swift | 48 +- .../Tests/GatewayConnectionIssueTests.swift | 2 +- .../GatewayConnectionSecurityTests.swift | 10 +- .../Tests/GatewayDiscoveryModelTests.swift | 2 +- apps/ios/Tests/GatewayEndpointIDTests.swift | 14 +- .../ios/Tests/GatewaySettingsStoreTests.swift | 8 +- .../Tests/IOSGatewayChatTransportTests.swift | 4 +- apps/ios/Tests/Info.plist | 6 +- apps/ios/Tests/KeychainStoreTests.swift | 4 +- .../Tests/Logic/TalkConfigParsingTests.swift | 2 +- apps/ios/Tests/NodeAppModelInvokeTests.swift | 92 +- .../ios/Tests/OnboardingStateStoreTests.swift | 2 +- .../Tests/RootCanvasPresentationTests.swift | 2 +- apps/ios/Tests/ScreenControllerTests.swift | 4 +- apps/ios/Tests/ScreenRecordServiceTests.swift | 2 +- .../SettingsNetworkingHelpersTests.swift | 2 +- .../ios/Tests/ShareToAgentDeepLinkTests.swift | 4 +- apps/ios/Tests/SwiftUIRenderSmokeTests.swift | 6 +- .../Tests/TalkModeConfigParsingTests.swift | 2 +- ...TalkModeIncrementalSpeechBufferTests.swift | 2 +- .../ios/Tests/VoiceWakeGatewaySyncTests.swift | 6 +- .../VoiceWakeManagerExtractCommandTests.swift | 36 +- .../Tests/VoiceWakeManagerStateTests.swift | 10 +- .../ios/Tests/VoiceWakePreferencesTests.swift | 6 +- apps/ios/WatchApp/Info.plist | 8 +- apps/ios/WatchExtension/Info.plist | 8 +- ...lawWatchApp.swift => KlawtyWatchApp.swift} | 2 +- .../Sources/WatchInboxStore.swift | 6 +- apps/ios/fastlane/SETUP.md | 10 +- apps/ios/fastlane/metadata/README.md | 4 +- apps/ios/project.yml | 198 +- .../{openclaw-mac.png => klawty-mac.png} | Bin apps/macos/Icon.icon/icon.json | 4 +- apps/macos/Package.swift | 56 +- apps/macos/README.md | 4 +- .../{OpenClaw => Klawty}/AboutSettings.swift | 16 +- .../{OpenClaw => Klawty}/AgeFormatting.swift | 0 .../AgentEventStore.swift | 0 .../AgentEventsWindow.swift | 8 +- .../{OpenClaw => Klawty}/AgentWorkspace.swift | 8 +- .../AgentWorkspaceConfig.swift | 0 .../Sources/Klawty/AnyCodable+Helpers.swift | 6 + .../{OpenClaw => Klawty}/AppState.swift | 12 +- .../AudioInputDeviceObserver.swift | 2 +- .../CLIInstallPrompter.swift | 6 +- .../{OpenClaw => Klawty}/CLIInstaller.swift | 10 +- .../CameraCaptureService.swift | 10 +- .../CanvasA2UIActionMessageHandler.swift | 18 +- .../CanvasChromeContainerView.swift | 0 .../CanvasFileWatcher.swift | 2 +- .../{OpenClaw => Klawty}/CanvasManager.swift | 10 +- .../{OpenClaw => Klawty}/CanvasScheme.swift | 2 +- .../CanvasSchemeHandler.swift | 6 +- .../{OpenClaw => Klawty}/CanvasWindow.swift | 2 +- .../CanvasWindowController+Helpers.swift | 2 +- .../CanvasWindowController+Navigation.swift | 2 +- .../CanvasWindowController+Testing.swift | 0 .../CanvasWindowController+Window.swift | 4 +- .../CanvasWindowController.swift | 16 +- .../ChannelConfigForm.swift | 0 .../ChannelsSettings+ChannelSections.swift | 0 .../ChannelsSettings+ChannelState.swift | 2 +- .../ChannelsSettings+Helpers.swift | 0 .../ChannelsSettings+View.swift | 0 .../ChannelsSettings.swift | 0 .../ChannelsStore+Config.swift | 4 +- .../ChannelsStore+Lifecycle.swift | 2 +- .../{OpenClaw => Klawty}/ChannelsStore.swift | 2 +- .../CoalescingFSEventsWatcher.swift | 0 .../ColorHexSupport.swift | 0 .../CommandResolver.swift | 88 +- .../ConfigFileWatcher.swift | 2 +- .../ConfigSchemaSupport.swift | 0 .../{OpenClaw => Klawty}/ConfigSettings.swift | 2 +- .../{OpenClaw => Klawty}/ConfigStore.swift | 6 +- .../ConnectionModeCoordinator.swift | 2 +- .../ConnectionModeResolver.swift | 2 +- apps/macos/Sources/Klawty/Constants.swift | 48 + .../ContextMenuCardView.swift | 0 .../ContextUsageBar.swift | 0 .../{OpenClaw => Klawty}/ControlChannel.swift | 26 +- .../CostUsageMenuView.swift | 0 .../CritterIconRenderer.swift | 0 .../CritterStatusLabel+Behavior.swift | 0 .../CritterStatusLabel.swift | 0 .../CronJobEditor+Helpers.swift | 2 +- .../CronJobEditor+Testing.swift | 0 .../{OpenClaw => Klawty}/CronJobEditor.swift | 6 +- .../{OpenClaw => Klawty}/CronJobsStore.swift | 6 +- .../{OpenClaw => Klawty}/CronModels.swift | 0 .../CronSettings+Actions.swift | 2 +- .../CronSettings+Helpers.swift | 0 .../CronSettings+Layout.swift | 0 .../CronSettings+Rows.swift | 0 .../CronSettings+Testing.swift | 2 +- .../{OpenClaw => Klawty}/CronSettings.swift | 0 .../{OpenClaw => Klawty}/DebugActions.swift | 10 +- .../{OpenClaw => Klawty}/DebugSettings.swift | 26 +- .../{OpenClaw => Klawty}/DeepLinks.swift | 8 +- .../DeviceModelCatalog.swift | 0 .../DevicePairingApprovalPrompter.swift | 6 +- .../DiagnosticsFileLog.swift | 2 +- .../DockIconManager.swift | 2 +- .../DurationFormattingSupport.swift | 0 .../ExecAllowlistMatcher.swift | 0 .../ExecApprovalEvaluation.swift | 0 .../{OpenClaw => Klawty}/ExecApprovals.swift | 8 +- .../ExecApprovalsGatewayPrompter.swift | 6 +- .../ExecApprovalsSocket.swift | 4 +- .../ExecCommandResolution.swift | 0 .../ExecEnvInvocationUnwrapper.swift | 0 .../{OpenClaw => Klawty}/ExecEnvOptions.swift | 0 .../ExecHostRequestEvaluator.swift | 0 .../ExecShellWrapperParser.swift | 0 .../ExecSystemRunCommandValidator.swift | 0 .../FileHandle+SafeRead.swift | 0 .../GatewayAutostartPolicy.swift | 0 .../GatewayConnection.swift | 22 +- .../GatewayConnectivityCoordinator.swift | 2 +- .../GatewayDiscoveryHelpers.swift | 2 +- .../GatewayDiscoveryMenu.swift | 4 +- .../GatewayDiscoveryPreferences.swift | 0 .../GatewayDiscoverySelectionSupport.swift | 6 +- .../GatewayEndpointStore.swift | 46 +- .../GatewayEnvironment.swift | 30 +- .../GatewayLaunchAgentManager.swift | 6 +- .../GatewayProcessManager.swift | 2 +- .../GatewayPushSubscription.swift | 2 +- .../GatewayRemoteConfig.swift | 2 +- .../GeneralSettings.swift | 30 +- .../{OpenClaw => Klawty}/HealthStore.swift | 10 +- .../{OpenClaw => Klawty}/HeartbeatStore.swift | 0 .../HostEnvSanitizer.swift | 0 .../HostEnvSecurityPolicy.generated.swift | 0 .../{OpenClaw => Klawty}/HoverHUD.swift | 0 .../{OpenClaw => Klawty}/IconState.swift | 0 .../InstancesSettings.swift | 2 +- .../{OpenClaw => Klawty}/InstancesStore.swift | 8 +- .../JSONObjectExtractionSupport.swift | 0 .../KlawtyConfigFile.swift} | 14 +- .../KlawtyPaths.swift} | 18 +- .../LaunchAgentManager.swift | 6 +- .../{OpenClaw => Klawty}/Launchctl.swift | 4 +- .../{OpenClaw => Klawty}/LaunchdManager.swift | 4 +- .../{OpenClaw => Klawty}/LogLocator.swift | 12 +- .../Logging/KlawtyLogging.swift} | 18 +- .../{OpenClaw => Klawty}/MenuBar.swift | 8 +- .../MenuContentView.swift | 12 +- .../MenuContextCardInjector.swift | 0 .../{OpenClaw => Klawty}/MenuHeaderCard.swift | 0 .../MenuHighlightedHostView.swift | 0 .../{OpenClaw => Klawty}/MenuHostedItem.swift | 0 .../MenuItemHighlightColors.swift | 0 .../MenuSessionsHeaderView.swift | 0 .../MenuSessionsInjector.swift | 0 .../MenuUsageHeaderView.swift | 0 .../MicLevelMonitor.swift | 2 +- .../MicRefreshSupport.swift | 0 .../ModelCatalogLoader.swift | 4 +- .../NSAttributedString+VoiceWake.swift | 0 .../NodeMode/MacNodeBrowserProxy.swift | 8 +- .../NodeMode/MacNodeLocationService.swift | 4 +- .../NodeMode/MacNodeModeCoordinator.swift | 64 +- .../NodeMode/MacNodeRuntime.swift | 150 +- .../MacNodeRuntimeMainActorServices.swift | 6 +- .../NodeMode/MacNodeScreenCommands.swift | 0 .../NodePairingApprovalPrompter.swift | 10 +- .../NodeServiceManager.swift | 4 +- .../{OpenClaw => Klawty}/NodesMenu.swift | 0 .../{OpenClaw => Klawty}/NodesStore.swift | 2 +- .../NotificationManager.swift | 4 +- .../{OpenClaw => Klawty}/NotifyOverlay.swift | 0 .../{OpenClaw => Klawty}/Onboarding.swift | 16 +- .../OnboardingView+Actions.swift | 8 +- .../OnboardingView+Chat.swift | 2 +- .../OnboardingView+Layout.swift | 2 +- .../OnboardingView+Monitoring.swift | 4 +- .../OnboardingView+Pages.swift | 40 +- .../OnboardingView+Testing.swift | 10 +- .../OnboardingView+Wizard.swift | 2 +- .../OnboardingView+Workspace.swift | 4 +- .../OnboardingWidgets.swift | 2 +- .../OnboardingWizard.swift | 12 +- .../OverlayPanelFactory.swift | 0 .../PairingAlertSupport.swift | 2 +- .../PeekabooBridgeHostCoordinator.swift | 22 +- .../PermissionManager.swift | 6 +- .../PermissionMonitoringSupport.swift | 0 .../PermissionsSettings.swift | 24 +- .../PlatformLabelFormatter.swift | 0 .../PointingHandCursor.swift | 0 .../{OpenClaw => Klawty}/PortGuardian.swift | 10 +- .../PresenceReporter.swift | 2 +- .../Process+PipeRead.swift | 0 .../ProcessInfo+Klawty.swift} | 8 +- .../RemoteGatewayProbe.swift | 22 +- .../RemotePortTunnel.swift | 10 +- .../RemoteTunnelManager.swift | 4 +- .../LICENSE.apple-device-identifiers.txt | 0 .../Resources/DeviceModels/NOTICE.md | 0 .../DeviceModels/ios-device-identifiers.json | 0 .../DeviceModels/mac-device-identifiers.json | 0 .../{OpenClaw => Klawty}/Resources/Info.plist | 36 +- .../Resources/Klawty.icns} | Bin .../{OpenClaw => Klawty}/RuntimeLocator.swift | 6 +- .../ScreenRecordService.swift | 8 +- .../{OpenClaw => Klawty}/ScreenshotSize.swift | 0 .../{OpenClaw => Klawty}/SelectableRow.swift | 0 .../{OpenClaw => Klawty}/SessionActions.swift | 2 +- .../{OpenClaw => Klawty}/SessionData.swift | 2 +- .../SessionMenuLabelView.swift | 0 .../SessionMenuPreviewView.swift | 32 +- .../SessionsSettings.swift | 0 .../SettingsComponents.swift | 0 .../SettingsRefreshButton.swift | 0 .../SettingsRootView.swift | 8 +- .../SettingsSidebarCard.swift | 0 .../SettingsSidebarScroll.swift | 0 .../SettingsWindowOpener.swift | 0 .../{OpenClaw => Klawty}/ShellExecutor.swift | 2 +- .../SimpleFileWatcher.swift | 0 .../SimpleFileWatcherOwner.swift | 0 .../SimpleTaskSupport.swift | 0 .../{OpenClaw => Klawty}/SkillsModels.swift | 2 +- .../{OpenClaw => Klawty}/SkillsSettings.swift | 14 +- .../{OpenClaw => Klawty}/SoundEffects.swift | 0 .../{OpenClaw => Klawty}/StatusPill.swift | 0 .../String+NonEmpty.swift | 0 .../SystemPresenceInfo.swift | 2 +- .../SystemRunSettingsView.swift | 0 .../SystemSettingsURLSupport.swift | 0 .../TailscaleIntegrationSection.swift | 6 +- .../TailscaleService.swift | 4 +- .../TalkAudioPlayer.swift | 2 +- .../{OpenClaw => Klawty}/TalkDefaults.swift | 0 .../TalkModeController.swift | 2 +- .../TalkModeGatewayConfig.swift | 2 +- .../TalkModeRuntime.swift | 12 +- .../{OpenClaw => Klawty}/TalkModeTypes.swift | 0 .../{OpenClaw => Klawty}/TalkOverlay.swift | 2 +- .../TalkOverlayView.swift | 0 .../TerminationSignalWatcher.swift | 2 +- .../TextSummarySupport.swift | 0 .../TrackingAreaSupport.swift | 0 .../{OpenClaw => Klawty}/UsageCostData.swift | 0 .../{OpenClaw => Klawty}/UsageData.swift | 0 .../UsageMenuLabelView.swift | 0 .../UserDefaultsMigration.swift | 4 +- .../{OpenClaw => Klawty}/ViewMetrics.swift | 0 .../VisualEffectView.swift | 0 .../VoiceOverlayTextFormatting.swift | 0 .../VoicePushToTalk.swift | 6 +- .../VoiceSessionCoordinator.swift | 2 +- .../{OpenClaw => Klawty}/VoiceWakeChime.swift | 2 +- .../VoiceWakeForwarder.swift | 2 +- .../VoiceWakeGlobalSettingsSync.swift | 4 +- .../VoiceWakeHelpers.swift | 0 .../VoiceWakeOverlay.swift | 4 +- .../VoiceWakeOverlayController+Session.swift | 0 .../VoiceWakeOverlayController+Testing.swift | 0 .../VoiceWakeOverlayController+Window.swift | 0 .../VoiceWakeOverlayTextViews.swift | 0 .../VoiceWakeOverlayView.swift | 0 .../VoiceWakeRecognitionDebugSupport.swift | 0 .../VoiceWakeRuntime.swift | 2 +- .../VoiceWakeSettings.swift | 2 +- .../VoiceWakeTestCard.swift | 0 .../VoiceWakeTester.swift | 2 +- .../VoiceWakeTextUtils.swift | 0 .../{OpenClaw => Klawty}/WebChatManager.swift | 0 .../{OpenClaw => Klawty}/WebChatSwiftUI.swift | 56 +- .../WindowPlacement.swift | 0 .../WorkActivityStore.swift | 16 +- .../GatewayDiscoveryModel.swift | 20 +- .../TailscaleNetwork.swift | 2 +- .../TailscaleServeGatewayDiscovery.swift | 2 +- .../WideAreaGatewayDiscovery.swift | 12 +- .../{OpenClawIPC => KlawtyIPC}/IPC.swift | 4 +- .../CLIArgParsingSupport.swift | 0 .../ConnectCommand.swift | 18 +- .../DiscoverCommand.swift | 6 +- .../EntryPoint.swift | 20 +- .../GatewayConfig.swift | 2 +- .../GatewayScopes.swift | 0 .../Sources/KlawtyMacCLI/TypeAliases.swift | 5 + .../WizardCommand.swift | 12 +- .../GatewayModels.swift | 0 .../Sources/OpenClaw/AnyCodable+Helpers.swift | 6 - apps/macos/Sources/OpenClaw/Constants.swift | 48 - .../Sources/OpenClawMacCLI/TypeAliases.swift | 5 - .../AgentEventStoreTests.swift | 8 +- .../AgentWorkspaceTests.swift | 12 +- .../AnyCodableEncodingTests.swift | 8 +- .../AppStateRemoteConfigTests.swift | 2 +- .../AudioInputDeviceObserverTests.swift | 2 +- .../CLIInstallerTests.swift | 6 +- .../CameraCaptureServiceTests.swift | 2 +- .../CameraIPCTests.swift | 2 +- .../CanvasFileWatcherTests.swift | 4 +- .../CanvasIPCTests.swift | 2 +- .../CanvasWindowSmokeTests.swift | 8 +- .../ChannelsSettingsSmokeTests.swift | 8 +- .../CommandResolverTests.swift | 60 +- .../ConfigStoreTests.swift | 2 +- .../CoverageDumpTests.swift | 0 .../CritterIconRendererTests.swift | 2 +- .../CronJobEditorSmokeTests.swift | 2 +- .../CronModelsTests.swift | 2 +- .../DeepLinkAgentPolicyTests.swift | 4 +- .../DeviceModelCatalogTests.swift | 2 +- .../ExecAllowlistTests.swift | 32 +- .../ExecApprovalHelpersTests.swift | 2 +- .../ExecApprovalsGatewayPrompterTests.swift | 2 +- .../ExecApprovalsSocketAuthTests.swift | 2 +- .../ExecApprovalsSocketPathGuardTests.swift | 8 +- .../ExecApprovalsStoreRefactorTests.swift | 6 +- .../ExecHostRequestEvaluatorTests.swift | 2 +- .../ExecSkillBinTrustTests.swift | 4 +- .../ExecSystemRunCommandValidatorTests.swift | 2 +- .../FileHandleLegacyAPIGuardTests.swift | 2 +- .../FileHandleSafeReadTests.swift | 2 +- .../GatewayAgentChannelTests.swift | 2 +- .../GatewayAutostartPolicyTests.swift | 2 +- .../GatewayChannelConfigureTests.swift | 4 +- .../GatewayChannelConnectTests.swift | 4 +- .../GatewayChannelRequestTests.swift | 4 +- .../GatewayChannelShutdownTests.swift | 4 +- .../GatewayConnectionControlTests.swift | 6 +- .../GatewayDiscoveryHelpersTests.swift | 6 +- .../GatewayDiscoveryModelTests.swift | 14 +- ...atewayDiscoverySelectionSupportTests.swift | 12 +- .../GatewayEndpointStoreTests.swift | 10 +- .../GatewayEnvironmentTests.swift | 4 +- .../GatewayFrameDecodeTests.swift | 2 +- .../GatewayLaunchAgentManagerTests.swift | 14 +- .../GatewayProcessManagerTests.swift | 4 +- .../GatewayWebSocketTestSupport.swift | 2 +- .../HealthDecodeTests.swift | 2 +- .../HealthStoreStateTests.swift | 2 +- .../HostEnvSanitizerTests.swift | 14 +- .../HoverHUDControllerTests.swift | 2 +- .../InstancesSettingsSmokeTests.swift | 2 +- .../InstancesStoreTests.swift | 12 +- .../KlawtyConfigFileTests.swift} | 62 +- .../LaunchAgentManagerTests.swift | 6 +- .../LogLocatorTests.swift | 8 +- .../LowCoverageHelperTests.swift | 6 +- .../LowCoverageViewSmokeTests.swift | 4 +- .../MacGatewayChatTransportMappingTests.swift | 20 +- .../MacNodeBrowserProxyTests.swift | 2 +- .../MacNodeRuntimeTests.swift | 28 +- .../MasterDiscoveryMenuSmokeTests.swift | 4 +- .../MenuContentSmokeTests.swift | 2 +- .../MenuSessionsInjectorTests.swift | 2 +- .../ModelCatalogLoaderTests.swift | 2 +- .../NixModeStableSuiteTests.swift | 6 +- .../NodeManagerPathsTests.swift | 2 +- .../NodePairingApprovalPrompterTests.swift | 2 +- .../NodePairingReconcilePolicyTests.swift | 2 +- .../NodeServiceManagerTests.swift | 10 +- .../OnboardingCoverageTests.swift | 2 +- .../OnboardingRemoteAuthPromptTests.swift | 6 +- .../OnboardingViewSmokeTests.swift | 12 +- .../OnboardingWizardStepViewTests.swift | 6 +- .../PermissionManagerLocationTests.swift | 2 +- .../PermissionManagerTests.swift | 4 +- .../Placeholder.swift | 0 .../RemotePortTunnelTests.swift | 2 +- .../RuntimeLocatorTests.swift | 2 +- .../ScreenshotSizeTests.swift | 2 +- .../SemverTests.swift | 2 +- .../SessionDataTests.swift | 2 +- .../SessionMenuPreviewTests.swift | 2 +- .../SettingsViewSmokeTests.swift | 4 +- .../SkillsSettingsSmokeTests.swift | 12 +- .../TailscaleIntegrationSectionTests.swift | 4 +- .../TailscaleServeGatewayDiscoveryTests.swift | 2 +- .../TalkAudioPlayerTests.swift | 2 +- .../TalkModeConfigParsingTests.swift | 4 +- .../TalkModeRuntimeSpeechTests.swift | 2 +- .../TestFSHelpers.swift | 0 .../TestIsolation.swift | 2 +- .../UtilitiesTests.swift | 10 +- .../VoicePushToTalkHotkeyTests.swift | 2 +- .../VoicePushToTalkTests.swift | 2 +- .../VoiceWakeForwarderTests.swift | 2 +- .../VoiceWakeGlobalSettingsSyncTests.swift | 14 +- .../VoiceWakeHelpersTests.swift | 2 +- .../VoiceWakeOverlayControllerTests.swift | 2 +- .../VoiceWakeOverlayTests.swift | 2 +- .../VoiceWakeOverlayViewSmokeTests.swift | 2 +- .../VoiceWakeRuntimeTests.swift | 28 +- .../VoiceWakeTestSupport.swift | 0 .../VoiceWakeTesterTests.swift | 0 .../WebChatMainSessionKeyTests.swift | 6 +- .../WebChatManagerTests.swift | 2 +- .../WebChatSwiftUISmokeTests.swift | 16 +- .../WideAreaGatewayDiscoveryTests.swift | 14 +- .../WindowPlacementTests.swift | 2 +- .../WorkActivityStoreTests.swift | 6 +- .../{OpenClawKit => KlawtyKit}/Package.swift | 30 +- .../KlawtyChatUI}/AssistantTextParser.swift | 0 .../Sources/KlawtyChatUI}/ChatComposer.swift | 36 +- .../ChatMarkdownPreprocessor.swift | 4 +- .../KlawtyChatUI}/ChatMarkdownRenderer.swift | 2 +- .../KlawtyChatUI}/ChatMessageViews.swift | 48 +- .../Sources/KlawtyChatUI}/ChatModels.swift | 64 +- .../KlawtyChatUI}/ChatPayloadDecoding.swift | 2 +- .../Sources/KlawtyChatUI}/ChatSessions.swift | 16 +- .../Sources/KlawtyChatUI}/ChatSheets.swift | 2 +- .../Sources/KlawtyChatUI}/ChatTheme.swift | 10 +- .../Sources/KlawtyChatUI}/ChatTransport.swift | 36 +- .../Sources/KlawtyChatUI}/ChatView.swift | 42 +- .../Sources/KlawtyChatUI}/ChatViewModel.swift | 88 +- .../ToolResultTextFormatter.swift | 0 .../KlawtyKit}/AnyCodable+Helpers.swift | 0 .../Sources/KlawtyKit/AnyCodable.swift | 4 + .../Sources/KlawtyKit}/AsyncTimeout.swift | 0 .../KlawtyKit}/AudioStreamingProtocols.swift | 0 .../Sources/KlawtyKit}/BonjourEscapes.swift | 0 .../BonjourServiceResolverSupport.swift | 0 .../Sources/KlawtyKit}/BonjourTypes.swift | 6 +- .../Sources/KlawtyKit}/BridgeFrames.swift | 4 +- .../Sources/KlawtyKit/BrowserCommands.swift | 5 + .../Sources/KlawtyKit}/CalendarCommands.swift | 20 +- .../KlawtyKit}/CameraAuthorization.swift | 0 .../CameraCapturePipelineSupport.swift | 0 .../Sources/KlawtyKit}/CameraCommands.swift | 28 +- .../CameraSessionConfiguration.swift | 0 .../Sources/KlawtyKit}/CanvasA2UIAction.swift | 4 +- .../KlawtyKit}/CanvasA2UICommands.swift | 6 +- .../Sources/KlawtyKit}/CanvasA2UIJSONL.swift | 2 +- .../KlawtyKit}/CanvasCommandParams.swift | 20 +- .../Sources/KlawtyKit}/CanvasCommands.swift | 2 +- .../Sources/KlawtyKit}/Capabilities.swift | 2 +- .../KlawtyKit}/CaptureRateLimits.swift | 0 .../Sources/KlawtyKit}/ChatCommands.swift | 6 +- .../Sources/KlawtyKit}/ContactsCommands.swift | 20 +- .../Sources/KlawtyKit}/DeepLinks.swift | 2 +- .../KlawtyKit}/DeviceAuthPayload.swift | 14 +- .../Sources/KlawtyKit}/DeviceAuthStore.swift | 0 .../Sources/KlawtyKit}/DeviceCommands.swift | 54 +- .../Sources/KlawtyKit}/DeviceIdentity.swift | 6 +- .../KlawtyKit}/ElevenLabsKitShim.swift | 0 .../Sources/KlawtyKit}/GatewayChannel.swift | 8 +- .../GatewayConnectChallengeSupport.swift | 4 +- .../GatewayDiscoveryBrowserSupport.swift | 0 .../GatewayDiscoveryStatusText.swift | 0 .../KlawtyKit}/GatewayEndpointID.swift | 0 .../Sources/KlawtyKit}/GatewayErrors.swift | 2 +- .../KlawtyKit}/GatewayNodeSession.swift | 12 +- .../KlawtyKit}/GatewayPayloadDecoding.swift | 2 +- .../Sources/KlawtyKit}/GatewayPush.swift | 2 +- .../KlawtyKit}/GatewayTLSPinning.swift | 4 +- .../GenericPasswordKeychainStore.swift | 0 .../Sources/KlawtyKit}/InstanceIdentity.swift | 6 +- .../Sources/KlawtyKit}/JPEGTranscoder.swift | 0 .../KlawtyDateRangeLimitParams.swift} | 2 +- .../KlawtyKit/KlawtyKitResources.swift} | 6 +- .../KlawtyKit}/LocalNetworkURLSupport.swift | 0 .../Sources/KlawtyKit}/LocationCommands.swift | 12 +- .../KlawtyKit}/LocationCurrentRequest.swift | 4 +- .../KlawtyKit}/LocationServiceSupport.swift | 0 .../Sources/KlawtyKit/LocationSettings.swift | 7 + .../Sources/KlawtyKit}/LoopbackHost.swift | 0 .../Sources/KlawtyKit}/MotionCommands.swift | 16 +- .../KlawtyKit}/NetworkInterfaceIPv4.swift | 0 .../KlawtyKit}/NetworkInterfaces.swift | 0 .../Sources/KlawtyKit}/NodeError.swift | 8 +- .../Sources/KlawtyKit}/PhotoCapture.swift | 0 .../Sources/KlawtyKit}/PhotosCommands.swift | 12 +- .../KlawtyKit}/RemindersCommands.swift | 26 +- .../Resources/CanvasScaffold/scaffold.html | 0 .../KlawtyKit}/Resources/tool-display.json | 0 .../Sources/KlawtyKit}/ScreenCommands.swift | 4 +- .../ShareGatewayRelaySettings.swift | 2 +- .../KlawtyKit}/ShareToAgentDeepLink.swift | 2 +- .../KlawtyKit}/ShareToAgentSettings.swift | 2 +- .../Sources/KlawtyKit}/StoragePaths.swift | 10 +- .../Sources/KlawtyKit}/SystemCommands.swift | 20 +- .../Sources/KlawtyKit}/TalkCommands.swift | 6 +- .../KlawtyKit}/TalkConfigParsing.swift | 0 .../Sources/KlawtyKit}/TalkDirective.swift | 0 .../KlawtyKit}/TalkHistoryTimestamp.swift | 0 .../KlawtyKit}/TalkPromptBuilder.swift | 0 .../TalkSystemSpeechSynthesizer.swift | 0 .../ThrowingContinuationSupport.swift | 0 .../Sources/KlawtyKit}/ToolDisplay.swift | 2 +- .../Sources/KlawtyKit}/WatchCommands.swift | 24 +- .../KlawtyKit}/WebViewJavaScriptSupport.swift | 2 +- .../Sources/KlawtyProtocol}/AnyCodable.swift | 0 .../KlawtyProtocol}/GatewayModels.swift | 0 .../KlawtyProtocol}/WizardHelpers.swift | 0 .../KlawtyKitTests}/AnyCodableTests.swift | 2 +- .../AssistantTextParserTests.swift | 2 +- .../KlawtyKitTests}/BonjourEscapesTests.swift | 4 +- .../CanvasA2UIActionTests.swift | 20 +- .../KlawtyKitTests}/CanvasA2UITests.swift | 14 +- .../CanvasSnapshotFormatTests.swift | 4 +- .../ChatComposerPasteSupportTests.swift | 2 +- .../ChatMarkdownPreprocessorTests.swift | 4 +- .../KlawtyKitTests}/ChatThemeTests.swift | 6 +- .../KlawtyKitTests}/ChatViewModelTests.swift | 152 +- .../DeepLinksSecurityTests.swift | 8 +- .../DeviceAuthPayloadTests.swift | 6 +- .../ElevenLabsTTSValidationTests.swift | 2 +- .../KlawtyKitTests}/GatewayErrorsTests.swift | 2 +- .../GatewayNodeSessionTests.swift | 14 +- .../KlawtyKitTests}/JPEGTranscoderTests.swift | 2 +- .../TalkConfigContractTests.swift | 2 +- .../TalkConfigParsingTests.swift | 2 +- .../KlawtyKitTests}/TalkDirectiveTests.swift | 2 +- .../TalkHistoryTimestampTests.swift | 2 +- .../TalkPromptBuilderTests.swift | 2 +- .../KlawtyKitTests}/TestAsyncHelpers.swift | 0 .../ToolDisplayRegistryTests.swift | 4 +- .../ToolResultTextFormatterTests.swift | 2 +- .../Tools/CanvasA2UI/bootstrap.js | 42 +- .../Tools/CanvasA2UI/rolldown.config.mjs | 2 +- .../Sources/OpenClawKit/AnyCodable.swift | 4 - .../Sources/OpenClawKit/BrowserCommands.swift | 5 - .../OpenClawKit/LocationSettings.swift | 7 - docker-compose.yml | 46 +- docker-setup.sh | 2 +- docs.acp.md | 52 +- docs/.generated/README.md | 2 +- docs/.generated/config-baseline.json | 562 ++-- docs/.i18n/README.md | 2 +- docs/.i18n/glossary.ja-JP.json | 2 +- docs/.i18n/glossary.zh-CN.json | 4 +- ...ext-dark.png => klawty-logo-text-dark.png} | Bin ...ext-dark.svg => klawty-logo-text-dark.svg} | 0 ...law-logo-text.png => klawty-logo-text.png} | Bin ...law-logo-text.svg => klawty-logo-text.svg} | 0 docs/automation/auth-monitoring.md | 14 +- docs/automation/cron-jobs.md | 76 +- docs/automation/cron-vs-heartbeat.md | 14 +- docs/automation/gmail-pubsub.md | 54 +- docs/automation/hooks.md | 130 +- docs/automation/poll.md | 18 +- docs/automation/troubleshooting.md | 50 +- docs/automation/webhook.md | 24 +- docs/brave-search.md | 4 +- docs/channels/bluebubbles.md | 26 +- docs/channels/broadcast-groups.md | 12 +- docs/channels/channel-routing.md | 14 +- docs/channels/discord.md | 82 +- docs/channels/feishu.md | 70 +- docs/channels/googlechat.md | 48 +- docs/channels/group-messages.md | 12 +- docs/channels/groups.md | 10 +- docs/channels/imessage.md | 30 +- docs/channels/index.md | 8 +- docs/channels/irc.md | 16 +- docs/channels/line.md | 14 +- docs/channels/location.md | 2 +- docs/channels/matrix.md | 132 +- docs/channels/mattermost.md | 42 +- docs/channels/msteams.md | 52 +- docs/channels/nextcloud-talk.md | 14 +- docs/channels/nostr.md | 22 +- docs/channels/pairing.md | 22 +- docs/channels/signal.md | 50 +- docs/channels/slack.md | 40 +- docs/channels/synology-chat.md | 28 +- docs/channels/telegram.md | 74 +- docs/channels/tlon.md | 20 +- docs/channels/troubleshooting.md | 36 +- docs/channels/twitch.md | 28 +- docs/channels/whatsapp.md | 42 +- docs/channels/zalo.md | 20 +- docs/channels/zalouser.md | 36 +- docs/ci.md | 2 +- docs/cli/acp.md | 96 +- docs/cli/agent.md | 14 +- docs/cli/agents.md | 50 +- docs/cli/approvals.md | 28 +- docs/cli/backup.md | 48 +- docs/cli/browser.md | 54 +- docs/cli/channels.md | 54 +- docs/cli/clawbot.md | 10 +- docs/cli/completion.md | 22 +- docs/cli/config.md | 86 +- docs/cli/configure.md | 12 +- docs/cli/cron.md | 22 +- docs/cli/daemon.md | 22 +- docs/cli/dashboard.md | 8 +- docs/cli/devices.md | 58 +- docs/cli/directory.md | 24 +- docs/cli/dns.md | 10 +- docs/cli/docs.md | 10 +- docs/cli/doctor.md | 28 +- docs/cli/gateway.md | 60 +- docs/cli/health.md | 10 +- docs/cli/hooks.md | 76 +- docs/cli/index.md | 104 +- docs/cli/logs.md | 16 +- docs/cli/memory.md | 24 +- docs/cli/message.md | 32 +- docs/cli/models.md | 34 +- docs/cli/node.md | 36 +- docs/cli/nodes.md | 28 +- docs/cli/onboard.md | 38 +- docs/cli/pairing.md | 14 +- docs/cli/plugins.md | 78 +- docs/cli/qr.md | 18 +- docs/cli/reset.md | 14 +- docs/cli/sandbox.md | 62 +- docs/cli/secrets.md | 72 +- docs/cli/security.md | 26 +- docs/cli/sessions.md | 44 +- docs/cli/setup.md | 12 +- docs/cli/skills.md | 12 +- docs/cli/status.md | 14 +- docs/cli/system.md | 12 +- docs/cli/tui.md | 12 +- docs/cli/uninstall.md | 14 +- docs/cli/update.md | 46 +- docs/cli/voicecall.md | 18 +- docs/cli/webhooks.md | 10 +- docs/concepts/agent-loop.md | 10 +- docs/concepts/agent-workspace.md | 54 +- docs/concepts/agent.md | 24 +- docs/concepts/architecture.md | 14 +- docs/concepts/compaction.md | 24 +- docs/concepts/context-engine.md | 46 +- docs/concepts/context.md | 18 +- docs/concepts/features.md | 4 +- docs/concepts/markdown-formatting.md | 6 +- docs/concepts/memory.md | 70 +- docs/concepts/messages.md | 8 +- docs/concepts/model-failover.md | 28 +- docs/concepts/model-providers.md | 78 +- docs/concepts/models.md | 58 +- docs/concepts/multi-agent.md | 92 +- docs/concepts/oauth.md | 46 +- docs/concepts/presence.md | 4 +- docs/concepts/retry.md | 2 +- docs/concepts/session-pruning.md | 2 +- docs/concepts/session-tool.md | 12 +- docs/concepts/session.md | 46 +- docs/concepts/streaming.md | 4 +- docs/concepts/system-prompt.md | 24 +- docs/concepts/timezone.md | 4 +- docs/concepts/typebox.md | 8 +- docs/concepts/typing-indicators.md | 4 +- docs/concepts/usage-tracking.md | 6 +- docs/date-time.md | 4 +- docs/debug/node-issue.md | 12 +- docs/diagnostics/flags.md | 14 +- docs/docs.json | 16 +- docs/gateway/authentication.md | 48 +- docs/gateway/background-process.md | 6 +- docs/gateway/bonjour.md | 44 +- docs/gateway/bridge-protocol.md | 4 +- docs/gateway/cli-backends.md | 24 +- docs/gateway/configuration-examples.md | 54 +- docs/gateway/configuration-reference.md | 230 +- docs/gateway/configuration.md | 74 +- docs/gateway/discovery.md | 24 +- docs/gateway/doctor.md | 62 +- docs/gateway/gateway-lock.md | 4 +- docs/gateway/health.md | 22 +- docs/gateway/heartbeat.md | 10 +- docs/gateway/index.md | 80 +- docs/gateway/local-models.md | 6 +- docs/gateway/logging.md | 16 +- docs/gateway/multiple-gateways.md | 52 +- docs/gateway/network-model.md | 10 +- docs/gateway/openai-http-api.md | 30 +- docs/gateway/openresponses-http-api.md | 20 +- docs/gateway/openshell.md | 52 +- docs/gateway/pairing.md | 18 +- docs/gateway/protocol.md | 8 +- docs/gateway/remote-gateway-readme.md | 40 +- docs/gateway/remote.md | 32 +- .../sandbox-vs-tool-policy-vs-elevated.md | 14 +- docs/gateway/sandboxing.md | 74 +- docs/gateway/secrets-plan-contract.md | 18 +- docs/gateway/secrets.md | 58 +- docs/gateway/security/index.md | 162 +- docs/gateway/tailscale.md | 26 +- docs/gateway/tools-invoke-http-api.md | 12 +- docs/gateway/troubleshooting.md | 132 +- docs/gateway/trusted-proxy-auth.md | 30 +- docs/help/debugging.md | 38 +- docs/help/environment.md | 50 +- docs/help/faq.md | 730 ++--- docs/help/scripts.md | 2 +- docs/help/testing.md | 144 +- docs/help/troubleshooting.md | 124 +- docs/index.md | 44 +- docs/install/ansible.md | 70 +- docs/install/bun.md | 2 +- docs/install/development-channels.md | 38 +- docs/install/docker-vm-runtime.md | 32 +- docs/install/docker.md | 228 +- docs/install/exe-dev.md | 38 +- docs/install/fly.md | 68 +- docs/install/gcp.md | 102 +- docs/install/hetzner.md | 70 +- docs/install/index.md | 66 +- docs/install/installer.md | 146 +- docs/install/kubernetes.md | 48 +- docs/install/macos-vm.md | 54 +- docs/install/migrating-matrix.md | 172 +- docs/install/migrating.md | 72 +- docs/install/nix.md | 40 +- docs/install/node.md | 12 +- docs/install/podman.md | 80 +- docs/install/uninstall.md | 62 +- docs/install/updating.md | 112 +- docs/ja-JP/index.md | 42 +- docs/ja-JP/start/getting-started.md | 20 +- docs/ja-JP/start/wizard.md | 16 +- docs/logging.md | 120 +- docs/network.md | 2 +- docs/nodes/audio.md | 12 +- docs/nodes/camera.md | 36 +- docs/nodes/images.md | 8 +- docs/nodes/index.md | 136 +- docs/nodes/location-command.md | 6 +- docs/nodes/media-understanding.md | 18 +- docs/nodes/talk.md | 2 +- docs/nodes/troubleshooting.md | 38 +- docs/nodes/voicewake.md | 6 +- docs/perplexity.md | 10 +- docs/pi-dev.md | 10 +- docs/pi.md | 42 +- docs/platforms/android.md | 36 +- docs/platforms/digitalocean.md | 60 +- docs/platforms/index.md | 16 +- docs/platforms/ios.md | 42 +- docs/platforms/linux.md | 26 +- docs/platforms/mac/bundled-gateway.md | 32 +- docs/platforms/mac/canvas.md | 28 +- docs/platforms/mac/child-process.md | 18 +- docs/platforms/mac/dev-setup.md | 24 +- docs/platforms/mac/health.md | 4 +- docs/platforms/mac/icon.md | 2 +- docs/platforms/mac/logging.md | 14 +- docs/platforms/mac/menu-bar.md | 2 +- docs/platforms/mac/peekaboo.md | 18 +- docs/platforms/mac/permissions.md | 8 +- docs/platforms/mac/remote.md | 30 +- docs/platforms/mac/signing.md | 14 +- docs/platforms/mac/skills.md | 8 +- docs/platforms/mac/voice-overlay.md | 4 +- docs/platforms/mac/webchat.md | 4 +- docs/platforms/mac/xpc.md | 8 +- docs/platforms/macos.md | 48 +- docs/platforms/oracle.md | 76 +- docs/platforms/raspberry-pi.md | 72 +- docs/platforms/windows.md | 50 +- docs/plugins/agent-tools.md | 2 +- docs/plugins/architecture.md | 220 +- docs/plugins/building-extensions.md | 54 +- docs/plugins/bundles.md | 100 +- docs/plugins/community.md | 16 +- docs/plugins/manifest.md | 24 +- docs/plugins/voice-call.md | 28 +- docs/plugins/zalouser.md | 18 +- docs/prose.md | 18 +- docs/providers/anthropic.md | 48 +- docs/providers/bedrock.md | 20 +- docs/providers/claude-max-api-proxy.md | 8 +- docs/providers/cloudflare-ai-gateway.md | 10 +- docs/providers/deepgram.md | 4 +- docs/providers/github-copilot.md | 22 +- docs/providers/glm.md | 14 +- docs/providers/google.md | 12 +- docs/providers/huggingface.md | 14 +- docs/providers/index.md | 6 +- docs/providers/kilocode.md | 8 +- docs/providers/litellm.md | 30 +- docs/providers/minimax.md | 26 +- docs/providers/mistral.md | 10 +- docs/providers/models.md | 6 +- docs/providers/modelstudio.md | 6 +- docs/providers/moonshot.md | 8 +- docs/providers/nvidia.md | 8 +- docs/providers/ollama.md | 42 +- docs/providers/openai.md | 44 +- docs/providers/opencode-go.md | 6 +- docs/providers/opencode.md | 14 +- docs/providers/openrouter.md | 6 +- docs/providers/perplexity-provider.md | 4 +- docs/providers/qianfan.md | 10 +- docs/providers/qwen.md | 12 +- docs/providers/sglang.md | 12 +- docs/providers/synthetic.md | 8 +- docs/providers/together.md | 8 +- docs/providers/venice.md | 42 +- docs/providers/vercel-ai-gateway.md | 12 +- docs/providers/vllm.md | 10 +- docs/providers/volcengine.md | 8 +- docs/providers/xai.md | 18 +- docs/providers/xiaomi.md | 10 +- docs/providers/zai.md | 14 +- docs/reference/AGENTS.default.md | 34 +- docs/reference/RELEASING.md | 8 +- docs/reference/api-usage-costs.md | 12 +- docs/reference/credits.md | 2 +- docs/reference/device-models.md | 14 +- docs/reference/prompt-caching.md | 20 +- docs/reference/rpc.md | 6 +- .../reference/secretref-credential-surface.md | 6 +- ...tref-user-supplied-credentials-matrix.json | 148 +- .../session-management-compaction.md | 46 +- docs/reference/templates/AGENTS.dev.md | 2 +- docs/reference/templates/BOOT.md | 2 +- docs/reference/templates/IDENTITY.md | 2 +- docs/reference/templates/TOOLS.dev.md | 2 +- docs/reference/templates/USER.dev.md | 4 +- docs/reference/test.md | 16 +- docs/reference/token-use.md | 20 +- docs/reference/transcript-hygiene.md | 6 +- docs/reference/wizard.md | 44 +- docs/security/CONTRIBUTING-THREAT-MODEL.md | 20 +- docs/security/THREAT-MODEL-ATLAS.md | 24 +- docs/security/formal-verification.md | 14 +- docs/start/bootstrapping.md | 6 +- docs/start/docs-directory.md | 4 +- docs/start/getting-started.md | 32 +- docs/start/hubs.md | 8 +- docs/start/{openclaw.md => klawty.md} | 60 +- docs/start/lore.md | 40 +- docs/start/onboarding-overview.md | 10 +- docs/start/onboarding.md | 8 +- docs/start/quickstart.md | 2 +- docs/start/setup.md | 52 +- docs/start/showcase.md | 66 +- docs/start/wizard-cli-automation.md | 64 +- docs/start/wizard-cli-reference.md | 34 +- docs/start/wizard.md | 24 +- docs/tools/acp-agents.md | 54 +- docs/tools/agent-send.md | 20 +- docs/tools/browser-linux-troubleshooting.md | 30 +- docs/tools/browser-login.md | 14 +- ...wsl2-windows-remote-cdp-troubleshooting.md | 38 +- docs/tools/browser.md | 288 +- docs/tools/btw.md | 6 +- docs/tools/capability-cookbook.md | 4 +- docs/tools/clawhub.md | 22 +- docs/tools/creating-skills.md | 12 +- docs/tools/diffs.md | 8 +- docs/tools/exec-approvals.md | 24 +- docs/tools/exec.md | 12 +- docs/tools/firecrawl.md | 6 +- docs/tools/index.md | 44 +- docs/tools/llm-task.md | 6 +- docs/tools/lobster.md | 26 +- docs/tools/loop-detection.md | 4 +- docs/tools/multi-agent-sandbox-tools.md | 28 +- docs/tools/pdf.md | 2 +- docs/tools/plugin.md | 106 +- docs/tools/skills-config.md | 4 +- docs/tools/skills.md | 64 +- docs/tools/slash-commands.md | 24 +- docs/tools/subagents.md | 8 +- docs/tools/thinking.md | 8 +- docs/tools/web.md | 18 +- docs/tts.md | 22 +- docs/vps.md | 22 +- docs/web/control-ui.md | 38 +- docs/web/dashboard.md | 22 +- docs/web/index.md | 14 +- docs/web/tui.md | 20 +- ...aw-ai-zh.jpg => whatsapp-klawty-ai-zh.jpg} | Bin ...tsapp-openclaw.jpg => whatsapp-klawty.jpg} | Bin docs/zh-CN/AGENTS.md | 2 +- docs/zh-CN/automation/auth-monitoring.md | 12 +- docs/zh-CN/automation/cron-jobs.md | 50 +- docs/zh-CN/automation/cron-vs-heartbeat.md | 14 +- docs/zh-CN/automation/gmail-pubsub.md | 52 +- docs/zh-CN/automation/hooks.md | 130 +- docs/zh-CN/automation/poll.md | 14 +- docs/zh-CN/automation/webhook.md | 18 +- docs/zh-CN/brave-search.md | 2 +- docs/zh-CN/channels/bluebubbles.md | 26 +- docs/zh-CN/channels/broadcast-groups.md | 12 +- docs/zh-CN/channels/channel-routing.md | 10 +- docs/zh-CN/channels/discord.md | 32 +- docs/zh-CN/channels/feishu.md | 70 +- docs/zh-CN/channels/googlechat.md | 46 +- docs/zh-CN/channels/group-messages.md | 14 +- docs/zh-CN/channels/groups.md | 8 +- docs/zh-CN/channels/imessage.md | 26 +- docs/zh-CN/channels/index.md | 8 +- docs/zh-CN/channels/line.md | 12 +- docs/zh-CN/channels/location.md | 2 +- docs/zh-CN/channels/matrix.md | 26 +- docs/zh-CN/channels/mattermost.md | 16 +- docs/zh-CN/channels/msteams.md | 52 +- docs/zh-CN/channels/nextcloud-talk.md | 14 +- docs/zh-CN/channels/nostr.md | 22 +- docs/zh-CN/channels/pairing.md | 20 +- docs/zh-CN/channels/signal.md | 18 +- docs/zh-CN/channels/slack.md | 32 +- docs/zh-CN/channels/synology-chat.md | 28 +- docs/zh-CN/channels/telegram.md | 48 +- docs/zh-CN/channels/tlon.md | 10 +- docs/zh-CN/channels/troubleshooting.md | 4 +- docs/zh-CN/channels/twitch.md | 28 +- docs/zh-CN/channels/whatsapp.md | 50 +- docs/zh-CN/channels/zalo.md | 16 +- docs/zh-CN/channels/zalouser.md | 24 +- docs/zh-CN/cli/acp.md | 50 +- docs/zh-CN/cli/agent.md | 12 +- docs/zh-CN/cli/agents.md | 24 +- docs/zh-CN/cli/approvals.md | 28 +- docs/zh-CN/cli/browser.md | 48 +- docs/zh-CN/cli/channels.md | 42 +- docs/zh-CN/cli/config.md | 30 +- docs/zh-CN/cli/configure.md | 10 +- docs/zh-CN/cli/cron.md | 10 +- docs/zh-CN/cli/dashboard.md | 8 +- docs/zh-CN/cli/devices.md | 26 +- docs/zh-CN/cli/directory.md | 24 +- docs/zh-CN/cli/dns.md | 10 +- docs/zh-CN/cli/docs.md | 10 +- docs/zh-CN/cli/doctor.md | 22 +- docs/zh-CN/cli/gateway.md | 56 +- docs/zh-CN/cli/health.md | 10 +- docs/zh-CN/cli/hooks.md | 68 +- docs/zh-CN/cli/index.md | 100 +- docs/zh-CN/cli/logs.md | 12 +- docs/zh-CN/cli/memory.md | 22 +- docs/zh-CN/cli/message.md | 22 +- docs/zh-CN/cli/models.md | 34 +- docs/zh-CN/cli/node.md | 32 +- docs/zh-CN/cli/nodes.md | 28 +- docs/zh-CN/cli/onboard.md | 38 +- docs/zh-CN/cli/pairing.md | 8 +- docs/zh-CN/cli/plugins.md | 32 +- docs/zh-CN/cli/reset.md | 10 +- docs/zh-CN/cli/sandbox.md | 56 +- docs/zh-CN/cli/security.md | 10 +- docs/zh-CN/cli/sessions.md | 10 +- docs/zh-CN/cli/setup.md | 12 +- docs/zh-CN/cli/skills.md | 12 +- docs/zh-CN/cli/status.md | 14 +- docs/zh-CN/cli/system.md | 12 +- docs/zh-CN/cli/tui.md | 10 +- docs/zh-CN/cli/uninstall.md | 10 +- docs/zh-CN/cli/update.md | 40 +- docs/zh-CN/cli/voicecall.md | 18 +- docs/zh-CN/cli/webhooks.md | 10 +- docs/zh-CN/concepts/agent-loop.md | 10 +- docs/zh-CN/concepts/agent-workspace.md | 54 +- docs/zh-CN/concepts/agent.md | 24 +- docs/zh-CN/concepts/architecture.md | 8 +- docs/zh-CN/concepts/compaction.md | 10 +- docs/zh-CN/concepts/context.md | 12 +- docs/zh-CN/concepts/features.md | 4 +- docs/zh-CN/concepts/markdown-formatting.md | 6 +- docs/zh-CN/concepts/memory.md | 30 +- docs/zh-CN/concepts/messages.md | 8 +- docs/zh-CN/concepts/model-failover.md | 26 +- docs/zh-CN/concepts/model-providers.md | 78 +- docs/zh-CN/concepts/models.md | 58 +- docs/zh-CN/concepts/multi-agent.md | 62 +- docs/zh-CN/concepts/oauth.md | 46 +- docs/zh-CN/concepts/presence.md | 4 +- docs/zh-CN/concepts/retry.md | 2 +- docs/zh-CN/concepts/session-pruning.md | 2 +- docs/zh-CN/concepts/session-tool.md | 8 +- docs/zh-CN/concepts/session.md | 28 +- docs/zh-CN/concepts/streaming.md | 6 +- docs/zh-CN/concepts/system-prompt.md | 18 +- docs/zh-CN/concepts/timezone.md | 4 +- docs/zh-CN/concepts/typebox.md | 8 +- docs/zh-CN/concepts/typing-indicators.md | 4 +- docs/zh-CN/concepts/usage-tracking.md | 6 +- docs/zh-CN/date-time.md | 4 +- docs/zh-CN/debug/node-issue.md | 12 +- docs/zh-CN/diagnostics/flags.md | 14 +- docs/zh-CN/gateway/authentication.md | 48 +- docs/zh-CN/gateway/background-process.md | 4 +- docs/zh-CN/gateway/bonjour.md | 44 +- docs/zh-CN/gateway/bridge-protocol.md | 4 +- docs/zh-CN/gateway/cli-backends.md | 22 +- docs/zh-CN/gateway/configuration-examples.md | 54 +- docs/zh-CN/gateway/configuration-reference.md | 230 +- docs/zh-CN/gateway/configuration.md | 74 +- docs/zh-CN/gateway/discovery.md | 26 +- docs/zh-CN/gateway/doctor.md | 56 +- docs/zh-CN/gateway/gateway-lock.md | 4 +- docs/zh-CN/gateway/health.md | 22 +- docs/zh-CN/gateway/heartbeat.md | 10 +- docs/zh-CN/gateway/index.md | 132 +- docs/zh-CN/gateway/local-models.md | 6 +- docs/zh-CN/gateway/logging.md | 16 +- docs/zh-CN/gateway/multiple-gateways.md | 52 +- docs/zh-CN/gateway/network-model.md | 6 +- docs/zh-CN/gateway/openai-http-api.md | 28 +- docs/zh-CN/gateway/openresponses-http-api.md | 28 +- docs/zh-CN/gateway/pairing.md | 18 +- docs/zh-CN/gateway/protocol.md | 8 +- docs/zh-CN/gateway/remote-gateway-readme.md | 28 +- docs/zh-CN/gateway/remote.md | 18 +- .../sandbox-vs-tool-policy-vs-elevated.md | 14 +- docs/zh-CN/gateway/sandboxing.md | 12 +- docs/zh-CN/gateway/security/index.md | 112 +- docs/zh-CN/gateway/tailscale.md | 26 +- docs/zh-CN/gateway/tools-invoke-http-api.md | 12 +- docs/zh-CN/gateway/troubleshooting.md | 238 +- docs/zh-CN/help/debugging.md | 36 +- docs/zh-CN/help/environment.md | 14 +- docs/zh-CN/help/faq.md | 680 ++--- docs/zh-CN/help/scripts.md | 2 +- docs/zh-CN/help/testing.md | 112 +- docs/zh-CN/help/troubleshooting.md | 32 +- docs/zh-CN/index.md | 42 +- docs/zh-CN/install/ansible.md | 70 +- docs/zh-CN/install/development-channels.md | 20 +- docs/zh-CN/install/docker.md | 110 +- docs/zh-CN/install/exe-dev.md | 38 +- docs/zh-CN/install/fly.md | 64 +- docs/zh-CN/install/gcp.md | 120 +- docs/zh-CN/install/hetzner.md | 96 +- docs/zh-CN/install/index.md | 66 +- docs/zh-CN/install/installer.md | 146 +- docs/zh-CN/install/macos-vm.md | 54 +- docs/zh-CN/install/migrating.md | 72 +- docs/zh-CN/install/nix.md | 36 +- docs/zh-CN/install/node.md | 2 +- docs/zh-CN/install/uninstall.md | 58 +- docs/zh-CN/install/updating.md | 100 +- docs/zh-CN/logging.md | 88 +- docs/zh-CN/network.md | 2 +- docs/zh-CN/nodes/audio.md | 4 +- docs/zh-CN/nodes/camera.md | 36 +- docs/zh-CN/nodes/images.md | 8 +- docs/zh-CN/nodes/index.md | 126 +- docs/zh-CN/nodes/location-command.md | 4 +- docs/zh-CN/nodes/media-understanding.md | 10 +- docs/zh-CN/nodes/talk.md | 2 +- docs/zh-CN/nodes/voicewake.md | 6 +- docs/zh-CN/perplexity.md | 4 +- docs/zh-CN/pi-dev.md | 12 +- docs/zh-CN/pi.md | 42 +- docs/zh-CN/platforms/android.md | 30 +- docs/zh-CN/platforms/digitalocean.md | 60 +- docs/zh-CN/platforms/index.md | 16 +- docs/zh-CN/platforms/ios.md | 28 +- docs/zh-CN/platforms/linux.md | 26 +- docs/zh-CN/platforms/mac/bundled-gateway.md | 26 +- docs/zh-CN/platforms/mac/canvas.md | 28 +- docs/zh-CN/platforms/mac/child-process.md | 10 +- docs/zh-CN/platforms/mac/dev-setup.md | 22 +- docs/zh-CN/platforms/mac/health.md | 4 +- docs/zh-CN/platforms/mac/icon.md | 2 +- docs/zh-CN/platforms/mac/logging.md | 8 +- docs/zh-CN/platforms/mac/menu-bar.md | 2 +- docs/zh-CN/platforms/mac/peekaboo.md | 18 +- docs/zh-CN/platforms/mac/permissions.md | 2 +- docs/zh-CN/platforms/mac/remote.md | 30 +- docs/zh-CN/platforms/mac/signing.md | 14 +- docs/zh-CN/platforms/mac/skills.md | 8 +- docs/zh-CN/platforms/mac/webchat.md | 2 +- docs/zh-CN/platforms/mac/xpc.md | 8 +- docs/zh-CN/platforms/macos.md | 34 +- docs/zh-CN/platforms/oracle.md | 76 +- docs/zh-CN/platforms/raspberry-pi.md | 72 +- docs/zh-CN/platforms/windows.md | 50 +- docs/zh-CN/plugins/agent-tools.md | 2 +- docs/zh-CN/plugins/manifest.md | 6 +- docs/zh-CN/plugins/voice-call.md | 24 +- docs/zh-CN/plugins/zalouser.md | 18 +- docs/zh-CN/prose.md | 18 +- docs/zh-CN/providers/anthropic.md | 48 +- docs/zh-CN/providers/bedrock.md | 18 +- docs/zh-CN/providers/claude-max-api-proxy.md | 8 +- docs/zh-CN/providers/cloudflare-ai-gateway.md | 10 +- docs/zh-CN/providers/deepgram.md | 4 +- docs/zh-CN/providers/github-copilot.md | 22 +- docs/zh-CN/providers/glm.md | 14 +- docs/zh-CN/providers/huggingface.md | 14 +- docs/zh-CN/providers/index.md | 6 +- docs/zh-CN/providers/kilocode.md | 8 +- docs/zh-CN/providers/litellm.md | 30 +- docs/zh-CN/providers/minimax.md | 26 +- docs/zh-CN/providers/mistral.md | 10 +- docs/zh-CN/providers/models.md | 6 +- docs/zh-CN/providers/moonshot.md | 8 +- docs/zh-CN/providers/nvidia.md | 8 +- docs/zh-CN/providers/ollama.md | 42 +- docs/zh-CN/providers/openai.md | 44 +- docs/zh-CN/providers/opencode-go.md | 6 +- docs/zh-CN/providers/opencode.md | 14 +- docs/zh-CN/providers/openrouter.md | 6 +- docs/zh-CN/providers/qianfan.md | 10 +- docs/zh-CN/providers/qwen.md | 12 +- docs/zh-CN/providers/sglang.md | 12 +- docs/zh-CN/providers/synthetic.md | 8 +- docs/zh-CN/providers/together.md | 8 +- docs/zh-CN/providers/venice.md | 42 +- docs/zh-CN/providers/vercel-ai-gateway.md | 12 +- docs/zh-CN/providers/xiaomi.md | 10 +- docs/zh-CN/providers/zai.md | 14 +- docs/zh-CN/reference/AGENTS.default.md | 34 +- docs/zh-CN/reference/RELEASING.md | 8 +- docs/zh-CN/reference/api-usage-costs.md | 12 +- docs/zh-CN/reference/credits.md | 2 +- docs/zh-CN/reference/device-models.md | 14 +- docs/zh-CN/reference/rpc.md | 6 +- .../session-management-compaction.md | 38 +- docs/zh-CN/reference/templates/AGENTS.dev.md | 2 +- docs/zh-CN/reference/templates/BOOT.md | 2 +- docs/zh-CN/reference/templates/IDENTITY.md | 2 +- docs/zh-CN/reference/templates/TOOLS.dev.md | 2 +- docs/zh-CN/reference/templates/USER.dev.md | 4 +- docs/zh-CN/reference/test.md | 6 +- docs/zh-CN/reference/token-use.md | 14 +- docs/zh-CN/reference/transcript-hygiene.md | 2 +- docs/zh-CN/reference/wizard.md | 44 +- docs/zh-CN/security/formal-verification.md | 14 +- docs/zh-CN/start/docs-directory.md | 4 +- docs/zh-CN/start/getting-started.md | 32 +- docs/zh-CN/start/hubs.md | 8 +- docs/zh-CN/start/{openclaw.md => klawty.md} | 70 +- docs/zh-CN/start/lore.md | 42 +- docs/zh-CN/start/onboarding-overview.md | 10 +- docs/zh-CN/start/onboarding.md | 14 +- docs/zh-CN/start/quickstart.md | 34 +- docs/zh-CN/start/setup.md | 46 +- docs/zh-CN/start/showcase.md | 64 +- docs/zh-CN/start/wizard-cli-automation.md | 64 +- docs/zh-CN/start/wizard-cli-reference.md | 34 +- docs/zh-CN/start/wizard.md | 24 +- docs/zh-CN/tools/agent-send.md | 20 +- .../tools/browser-linux-troubleshooting.md | 32 +- docs/zh-CN/tools/browser-login.md | 12 +- docs/zh-CN/tools/browser.md | 258 +- docs/zh-CN/tools/chrome-extension.md | 34 +- docs/zh-CN/tools/clawhub.md | 14 +- docs/zh-CN/tools/creating-skills.md | 12 +- docs/zh-CN/tools/exec-approvals.md | 10 +- docs/zh-CN/tools/exec.md | 8 +- docs/zh-CN/tools/firecrawl.md | 4 +- docs/zh-CN/tools/index.md | 28 +- docs/zh-CN/tools/llm-task.md | 4 +- docs/zh-CN/tools/lobster.md | 26 +- docs/zh-CN/tools/multi-agent-sandbox-tools.md | 30 +- docs/zh-CN/tools/plugin.md | 302 +- docs/zh-CN/tools/skills-config.md | 4 +- docs/zh-CN/tools/skills.md | 58 +- docs/zh-CN/tools/slash-commands.md | 16 +- docs/zh-CN/tools/web.md | 12 +- docs/zh-CN/tts.md | 20 +- docs/zh-CN/vps.md | 2 +- docs/zh-CN/web/control-ui.md | 36 +- docs/zh-CN/web/dashboard.md | 14 +- docs/zh-CN/web/index.md | 14 +- docs/zh-CN/web/tui.md | 14 +- extensions/acpx/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 2 +- extensions/acpx/package.json | 8 +- extensions/acpx/runtime-api.ts | 2 +- extensions/acpx/skills/acp-router/SKILL.md | 14 +- extensions/acpx/src/config.test.ts | 12 +- extensions/acpx/src/config.ts | 6 +- .../src/runtime-internals/mcp-proxy.test.ts | 2 +- .../src/runtime-internals/process.test.ts | 20 +- .../acpx/src/runtime-internals/process.ts | 2 +- extensions/acpx/src/runtime.test.ts | 4 +- extensions/acpx/src/service.test.ts | 6 +- extensions/acpx/src/service.ts | 10 +- .../acpx/src/test-utils/runtime-fixtures.ts | 8 +- extensions/amazon-bedrock/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/amazon-bedrock/package.json | 8 +- extensions/anthropic/index.ts | 14 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../anthropic/media-understanding-provider.ts | 2 +- extensions/anthropic/package.json | 8 +- extensions/bluebubbles/README.md | 4 +- extensions/bluebubbles/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/bluebubbles/package.json | 10 +- extensions/bluebubbles/setup-entry.ts | 2 +- extensions/bluebubbles/src/account-resolve.ts | 4 +- extensions/bluebubbles/src/accounts.ts | 14 +- extensions/bluebubbles/src/actions.test.ts | 46 +- extensions/bluebubbles/src/actions.ts | 2 +- .../bluebubbles/src/attachments.test.ts | 2 +- extensions/bluebubbles/src/attachments.ts | 4 +- extensions/bluebubbles/src/channel.setup.ts | 8 +- extensions/bluebubbles/src/channel.ts | 12 +- extensions/bluebubbles/src/chat.ts | 4 +- extensions/bluebubbles/src/config-apply.ts | 8 +- extensions/bluebubbles/src/config-schema.ts | 2 +- extensions/bluebubbles/src/group-policy.ts | 6 +- extensions/bluebubbles/src/history.ts | 4 +- extensions/bluebubbles/src/media-send.test.ts | 14 +- extensions/bluebubbles/src/media-send.ts | 6 +- .../bluebubbles/src/monitor-debounce.ts | 4 +- .../bluebubbles/src/monitor-processing.ts | 6 +- extensions/bluebubbles/src/monitor-shared.ts | 6 +- extensions/bluebubbles/src/monitor.test.ts | 116 +- .../src/monitor.webhook-auth.test.ts | 6 +- .../src/monitor.webhook-route.test.ts | 4 +- extensions/bluebubbles/src/reactions.ts | 4 +- extensions/bluebubbles/src/runtime-api.ts | 2 +- extensions/bluebubbles/src/runtime.ts | 2 +- extensions/bluebubbles/src/secret-input.ts | 2 +- extensions/bluebubbles/src/send.test.ts | 2 +- extensions/bluebubbles/src/send.ts | 4 +- extensions/bluebubbles/src/session-route.ts | 2 +- extensions/bluebubbles/src/setup-core.ts | 10 +- extensions/bluebubbles/src/setup-surface.ts | 18 +- extensions/bluebubbles/src/targets.ts | 4 +- extensions/bluebubbles/src/types.ts | 4 +- extensions/bluebubbles/src/webhook-shared.ts | 2 +- extensions/brave/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/brave/package.json | 8 +- .../brave/src/brave-web-search-provider.ts | 28 +- extensions/byteplus/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/byteplus/package.json | 8 +- extensions/byteplus/provider-catalog.ts | 2 +- extensions/chutes/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/chutes/onboard.ts | 12 +- extensions/chutes/package.json | 8 +- extensions/chutes/provider-catalog.ts | 2 +- extensions/cloudflare-ai-gateway/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/cloudflare-ai-gateway/onboard.ts | 14 +- extensions/cloudflare-ai-gateway/package.json | 8 +- extensions/copilot-proxy/README.md | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/copilot-proxy/package.json | 8 +- extensions/copilot-proxy/runtime-api.ts | 6 +- extensions/device-pair/api.ts | 2 +- extensions/device-pair/index.ts | 24 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/device-pair/notify.ts | 12 +- extensions/diagnostics-otel/api.ts | 2 +- extensions/diagnostics-otel/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/diagnostics-otel/package.json | 8 +- .../diagnostics-otel/src/service.test.ts | 42 +- extensions/diagnostics-otel/src/service.ts | 164 +- extensions/diffs/README.md | 12 +- extensions/diffs/api.ts | 2 +- extensions/diffs/assets/viewer-runtime.js | 4 +- extensions/diffs/index.test.ts | 10 +- extensions/diffs/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/diffs/package.json | 8 +- extensions/diffs/src/browser.test.ts | 8 +- extensions/diffs/src/browser.ts | 20 +- extensions/diffs/src/config.test.ts | 2 +- extensions/diffs/src/config.ts | 4 +- extensions/diffs/src/http.test.ts | 4 +- extensions/diffs/src/render.test.ts | 2 +- extensions/diffs/src/render.ts | 10 +- extensions/diffs/src/store.test.ts | 2 +- extensions/diffs/src/tool.test.ts | 12 +- extensions/diffs/src/tool.ts | 8 +- extensions/diffs/src/url.test.ts | 4 +- extensions/diffs/src/url.ts | 6 +- extensions/diffs/src/viewer-assets.test.ts | 2 +- extensions/diffs/src/viewer-client.ts | 8 +- extensions/discord/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/discord/package.json | 10 +- extensions/discord/setup-entry.ts | 2 +- .../discord/src/account-inspect.test.ts | 6 +- extensions/discord/src/account-inspect.ts | 4 +- extensions/discord/src/accounts.ts | 14 +- .../src/actions/handle-action.guild-admin.ts | 4 +- .../discord/src/actions/handle-action.ts | 10 +- .../discord/src/actions/runtime.messaging.ts | 4 +- .../discord/src/actions/runtime.test.ts | 16 +- extensions/discord/src/actions/runtime.ts | 4 +- extensions/discord/src/api.ts | 4 +- extensions/discord/src/audit.test.ts | 8 +- extensions/discord/src/audit.ts | 8 +- extensions/discord/src/channel-actions.ts | 6 +- extensions/discord/src/channel.test.ts | 14 +- extensions/discord/src/channel.ts | 24 +- extensions/discord/src/chunk.ts | 2 +- extensions/discord/src/client.test.ts | 8 +- extensions/discord/src/client.ts | 8 +- extensions/discord/src/components.ts | 2 +- extensions/discord/src/config-schema.ts | 2 +- extensions/discord/src/directory-cache.ts | 2 +- extensions/discord/src/directory-config.ts | 2 +- extensions/discord/src/directory-live.test.ts | 6 +- extensions/discord/src/directory-live.ts | 4 +- extensions/discord/src/draft-chunking.ts | 10 +- extensions/discord/src/draft-stream.ts | 2 +- extensions/discord/src/exec-approvals.ts | 10 +- extensions/discord/src/gateway-logging.ts | 4 +- extensions/discord/src/group-policy.ts | 6 +- extensions/discord/src/message-tool-schema.ts | 2 +- extensions/discord/src/monitor.test.ts | 34 +- ...messages-mentionpatterns-match.e2e.test.ts | 18 +- ...ends-status-replies-responseprefix.test.ts | 4 +- .../src/monitor.tool-result.test-harness.ts | 16 +- .../src/monitor/agent-components-helpers.ts | 24 +- .../discord/src/monitor/agent-components.ts | 58 +- extensions/discord/src/monitor/allow-list.ts | 6 +- .../discord/src/monitor/auto-presence.ts | 6 +- extensions/discord/src/monitor/commands.ts | 2 +- .../discord/src/monitor/dm-command-auth.ts | 4 +- .../src/monitor/dm-command-decision.ts | 4 +- .../src/monitor/exec-approvals.test.ts | 18 +- .../discord/src/monitor/exec-approvals.ts | 40 +- .../discord/src/monitor/gateway-plugin.ts | 8 +- .../discord/src/monitor/inbound-context.ts | 2 +- .../discord/src/monitor/inbound-worker.ts | 8 +- extensions/discord/src/monitor/listeners.ts | 22 +- .../message-handler.module-test-helpers.ts | 2 +- ...age-handler.preflight.acp-bindings.test.ts | 8 +- .../message-handler.preflight.test-helpers.ts | 12 +- .../monitor/message-handler.preflight.test.ts | 24 +- .../src/monitor/message-handler.preflight.ts | 40 +- .../message-handler.preflight.types.ts | 14 +- .../monitor/message-handler.process.test.ts | 14 +- .../src/monitor/message-handler.process.ts | 52 +- .../monitor/message-handler.test-harness.ts | 2 +- .../monitor/message-handler.test-helpers.ts | 4 +- .../discord/src/monitor/message-handler.ts | 6 +- .../discord/src/monitor/message-utils.ts | 10 +- .../monitor/model-picker-preferences.test.ts | 6 +- .../src/monitor/model-picker-preferences.ts | 12 +- .../src/monitor/model-picker.test-utils.ts | 2 +- .../discord/src/monitor/model-picker.test.ts | 4 +- .../discord/src/monitor/model-picker.ts | 8 +- .../discord/src/monitor/monitor.test.ts | 66 +- .../src/monitor/native-command-context.ts | 4 +- .../discord/src/monitor/native-command-ui.ts | 18 +- .../native-command.commands-allowfrom.test.ts | 10 +- .../native-command.model-picker.test.ts | 4 +- .../monitor/native-command.options.test.ts | 4 +- .../native-command.plugin-dispatch.test.ts | 32 +- .../discord/src/monitor/native-command.ts | 44 +- .../src/monitor/preflight-audio.runtime.ts | 4 +- .../discord/src/monitor/preflight-audio.ts | 6 +- extensions/discord/src/monitor/presence.ts | 2 +- .../discord/src/monitor/provider.allowlist.ts | 10 +- .../discord/src/monitor/provider.lifecycle.ts | 10 +- .../discord/src/monitor/provider.test.ts | 16 +- extensions/discord/src/monitor/provider.ts | 44 +- .../src/monitor/reply-delivery.test.ts | 4 +- .../discord/src/monitor/reply-delivery.ts | 24 +- extensions/discord/src/monitor/rest-fetch.ts | 6 +- .../src/monitor/route-resolution.test.ts | 4 +- .../discord/src/monitor/route-resolution.ts | 10 +- .../src/monitor/thread-bindings.config.ts | 10 +- .../thread-bindings.discord-api.test.ts | 6 +- .../monitor/thread-bindings.discord-api.ts | 14 +- .../monitor/thread-bindings.lifecycle.test.ts | 72 +- .../src/monitor/thread-bindings.lifecycle.ts | 12 +- .../src/monitor/thread-bindings.manager.ts | 12 +- .../src/monitor/thread-bindings.messages.ts | 2 +- .../src/monitor/thread-bindings.persona.ts | 2 +- .../src/monitor/thread-bindings.state.ts | 8 +- .../src/monitor/thread-session-close.test.ts | 8 +- .../src/monitor/thread-session-close.ts | 6 +- extensions/discord/src/monitor/threading.ts | 10 +- extensions/discord/src/outbound-adapter.ts | 14 +- extensions/discord/src/pluralkit.ts | 2 +- extensions/discord/src/probe.ts | 6 +- extensions/discord/src/retry.ts | 2 +- extensions/discord/src/runtime-api.ts | 28 +- extensions/discord/src/runtime.ts | 4 +- extensions/discord/src/send.components.ts | 8 +- .../discord/src/send.creates-thread.test.ts | 12 +- .../discord/src/send.emojis-stickers.ts | 2 +- extensions/discord/src/send.outbound.ts | 32 +- extensions/discord/src/send.reactions.ts | 2 +- .../send.sends-basic-channel-messages.test.ts | 4 +- extensions/discord/src/send.shared.ts | 16 +- extensions/discord/src/send.test-harness.ts | 2 +- extensions/discord/src/send.types.ts | 6 +- .../discord/src/session-key-normalization.ts | 4 +- extensions/discord/src/setup-core.ts | 26 +- extensions/discord/src/setup-surface.ts | 14 +- extensions/discord/src/shared-interactive.ts | 4 +- extensions/discord/src/shared.ts | 4 +- extensions/discord/src/status-issues.ts | 4 +- extensions/discord/src/subagent-hooks.test.ts | 4 +- extensions/discord/src/subagent-hooks.ts | 4 +- extensions/discord/src/targets.test.ts | 4 +- extensions/discord/src/targets.ts | 4 +- extensions/discord/src/token.test.ts | 16 +- extensions/discord/src/token.ts | 10 +- extensions/discord/src/ui.ts | 6 +- extensions/discord/src/voice-message.test.ts | 4 +- extensions/discord/src/voice-message.ts | 14 +- extensions/discord/src/voice/command.ts | 10 +- .../discord/src/voice/manager.e2e.test.ts | 8 +- extensions/discord/src/voice/manager.ts | 40 +- extensions/elevenlabs/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/elevenlabs/package.json | 8 +- extensions/fal/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/fal/onboard.ts | 4 +- extensions/fal/package.json | 8 +- extensions/feishu/index.test.ts | 4 +- extensions/feishu/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/feishu/package.json | 10 +- extensions/feishu/runtime-api.ts | 2 +- extensions/feishu/setup-entry.ts | 2 +- extensions/feishu/src/accounts.ts | 2 +- extensions/feishu/src/bitable.ts | 4 +- .../feishu/src/bot.checkBotMentioned.test.ts | 4 +- extensions/feishu/src/bot.test.ts | 4 +- extensions/feishu/src/bot.ts | 8 +- extensions/feishu/src/channel.test.ts | 10 +- extensions/feishu/src/channel.ts | 12 +- extensions/feishu/src/chat.ts | 4 +- extensions/feishu/src/client.ts | 2 +- extensions/feishu/src/config-schema.ts | 2 +- extensions/feishu/src/dedup.ts | 6 +- extensions/feishu/src/directory.static.ts | 2 +- .../feishu/src/docx.account-selection.test.ts | 6 +- extensions/feishu/src/docx.ts | 4 +- extensions/feishu/src/drive.ts | 4 +- extensions/feishu/src/dynamic-agent.ts | 14 +- extensions/feishu/src/media.test.ts | 6 +- extensions/feishu/src/media.ts | 6 +- .../feishu/src/monitor.reaction.test.ts | 6 +- extensions/feishu/src/outbound.test.ts | 2 +- extensions/feishu/src/outbound.ts | 2 +- extensions/feishu/src/perm.ts | 4 +- extensions/feishu/src/reply-dispatcher.ts | 2 +- extensions/feishu/src/runtime.ts | 2 +- extensions/feishu/src/secret-input.ts | 2 +- extensions/feishu/src/session-route.ts | 2 +- extensions/feishu/src/setup-core.ts | 8 +- extensions/feishu/src/setup-status.test.ts | 4 +- extensions/feishu/src/setup-surface.ts | 26 +- extensions/feishu/src/subagent-hooks.test.ts | 4 +- extensions/feishu/src/subagent-hooks.ts | 4 +- extensions/feishu/src/thread-bindings.test.ts | 4 +- extensions/feishu/src/thread-bindings.ts | 16 +- .../feishu/src/tool-account-routing.test.ts | 6 +- extensions/feishu/src/tool-account.ts | 8 +- .../feishu/src/tool-factory-test-harness.ts | 8 +- extensions/feishu/src/wiki.ts | 4 +- extensions/firecrawl/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/firecrawl/package.json | 8 +- extensions/firecrawl/src/config.ts | 28 +- extensions/firecrawl/src/firecrawl-client.ts | 14 +- .../firecrawl/src/firecrawl-scrape-tool.ts | 8 +- .../src/firecrawl-search-provider.ts | 4 +- .../firecrawl/src/firecrawl-search-tool.ts | 6 +- extensions/github-copilot/index.ts | 10 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/github-copilot/package.json | 8 +- extensions/github-copilot/token.test.ts | 2 +- extensions/github-copilot/token.ts | 4 +- extensions/github-copilot/usage.ts | 2 +- extensions/google/gemini-cli-provider.ts | 14 +- extensions/google/index.ts | 10 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../google/media-understanding-provider.ts | 2 +- extensions/google/oauth.flow.ts | 4 +- extensions/google/oauth.http.ts | 2 +- extensions/google/oauth.shared.ts | 4 +- extensions/google/oauth.test.ts | 12 +- extensions/google/package.json | 8 +- extensions/google/provider-models.ts | 4 +- extensions/google/runtime-api.ts | 2 +- .../google/src/gemini-web-search-provider.ts | 8 +- extensions/googlechat/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/googlechat/package.json | 14 +- extensions/googlechat/setup-entry.ts | 2 +- extensions/googlechat/src/accounts.test.ts | 12 +- extensions/googlechat/src/accounts.ts | 14 +- extensions/googlechat/src/actions.ts | 6 +- extensions/googlechat/src/api.ts | 2 +- .../googlechat/src/channel.directory.test.ts | 4 +- .../googlechat/src/channel.outbound.test.ts | 4 +- extensions/googlechat/src/channel.ts | 18 +- extensions/googlechat/src/group-policy.ts | 6 +- extensions/googlechat/src/monitor-access.ts | 4 +- extensions/googlechat/src/monitor-types.ts | 6 +- extensions/googlechat/src/monitor.ts | 14 +- .../src/monitor.webhook-routing.test.ts | 8 +- .../googlechat/src/resolve-target.test.ts | 2 +- extensions/googlechat/src/runtime.ts | 2 +- extensions/googlechat/src/setup-core.ts | 2 +- .../googlechat/src/setup-surface.test.ts | 4 +- extensions/googlechat/src/setup-surface.ts | 8 +- extensions/huggingface/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/huggingface/onboard.ts | 12 +- extensions/huggingface/package.json | 8 +- extensions/huggingface/provider-catalog.ts | 2 +- extensions/imessage/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/imessage/package.json | 8 +- extensions/imessage/runtime-api.ts | 2 +- extensions/imessage/setup-entry.ts | 2 +- extensions/imessage/src/accounts.ts | 12 +- extensions/imessage/src/channel.runtime.ts | 2 +- extensions/imessage/src/channel.ts | 12 +- extensions/imessage/src/client.ts | 4 +- extensions/imessage/src/config-schema.ts | 2 +- extensions/imessage/src/group-policy.ts | 6 +- .../imessage/src/monitor.gating.test.ts | 40 +- extensions/imessage/src/monitor/deliver.ts | 14 +- .../src/monitor/inbound-processing.test.ts | 8 +- .../src/monitor/inbound-processing.ts | 30 +- .../imessage/src/monitor/monitor-provider.ts | 44 +- .../imessage/src/monitor/reflection-guard.ts | 2 +- extensions/imessage/src/monitor/runtime.ts | 4 +- .../imessage/src/monitor/sanitize-outbound.ts | 2 +- extensions/imessage/src/monitor/types.ts | 6 +- extensions/imessage/src/outbound-adapter.ts | 4 +- extensions/imessage/src/probe.ts | 10 +- extensions/imessage/src/runtime.ts | 4 +- extensions/imessage/src/send.ts | 10 +- extensions/imessage/src/setup-core.ts | 24 +- extensions/imessage/src/setup-surface.ts | 4 +- extensions/imessage/src/shared.ts | 6 +- .../imessage/src/target-parsing-helpers.ts | 2 +- extensions/imessage/src/targets.ts | 2 +- extensions/irc/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/irc/package.json | 8 +- extensions/irc/setup-entry.ts | 2 +- extensions/irc/src/accounts.test.ts | 2 +- extensions/irc/src/accounts.ts | 14 +- extensions/irc/src/channel.startup.test.ts | 6 +- extensions/irc/src/channel.ts | 10 +- extensions/irc/src/client.ts | 2 +- extensions/irc/src/config-schema.ts | 2 +- extensions/irc/src/inbound.ts | 14 +- extensions/irc/src/monitor.test.ts | 16 +- extensions/irc/src/monitor.ts | 2 +- extensions/irc/src/normalize.test.ts | 2 +- extensions/irc/src/protocol.test.ts | 2 +- extensions/irc/src/runtime-api.ts | 2 +- extensions/irc/src/runtime.ts | 2 +- extensions/irc/src/send.test.ts | 2 +- extensions/irc/src/setup-core.ts | 10 +- extensions/irc/src/setup-surface.test.ts | 18 +- extensions/irc/src/setup-surface.ts | 24 +- extensions/irc/src/types.ts | 6 +- extensions/kilocode/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/kilocode/onboard.ts | 10 +- extensions/kilocode/package.json | 8 +- extensions/kilocode/provider-catalog.ts | 2 +- extensions/kimi-coding/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/kimi-coding/onboard.ts | 10 +- extensions/kimi-coding/package.json | 8 +- extensions/kimi-coding/provider-catalog.ts | 2 +- extensions/line/api.ts | 2 +- extensions/line/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/line/package.json | 10 +- extensions/line/runtime-api.ts | 2 +- extensions/line/setup-entry.ts | 2 +- extensions/line/src/card-command.ts | 4 +- extensions/line/src/channel.logout.test.ts | 16 +- .../line/src/channel.sendPayload.test.ts | 18 +- extensions/line/src/channel.startup.test.ts | 4 +- extensions/line/src/channel.ts | 16 +- extensions/line/src/config-adapter.ts | 6 +- extensions/line/src/group-policy.ts | 6 +- extensions/line/src/runtime.ts | 2 +- extensions/line/src/setup-core.ts | 8 +- extensions/line/src/setup-surface.test.ts | 6 +- extensions/line/src/setup-surface.ts | 2 +- extensions/llm-task/README.md | 8 +- extensions/llm-task/api.ts | 2 +- extensions/llm-task/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/llm-task/package.json | 8 +- extensions/llm-task/src/llm-task-tool.test.ts | 2 +- extensions/llm-task/src/llm-task-tool.ts | 10 +- extensions/lobster/README.md | 14 +- extensions/lobster/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/lobster/package.json | 6 +- extensions/lobster/runtime-api.ts | 2 +- extensions/lobster/src/lobster-tool.test.ts | 10 +- extensions/lobster/src/lobster-tool.ts | 4 +- extensions/lobster/src/test-helpers.ts | 2 +- extensions/lobster/src/windows-spawn.test.ts | 2 +- extensions/matrix/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/matrix/package.json | 10 +- extensions/matrix/runtime-api.ts | 2 +- extensions/matrix/setup-entry.ts | 2 +- extensions/matrix/src/account-selection.ts | 14 +- .../src/actions.account-propagation.test.ts | 6 +- extensions/matrix/src/actions.test.ts | 4 +- extensions/matrix/src/auth-precedence.ts | 2 +- .../matrix/src/channel.directory.test.ts | 2 +- extensions/matrix/src/channel.setup.test.ts | 2 +- extensions/matrix/src/channel.ts | 8 +- extensions/matrix/src/cli.test.ts | 40 +- extensions/matrix/src/cli.ts | 26 +- extensions/matrix/src/config-schema.ts | 2 +- extensions/matrix/src/env-vars.ts | 2 +- .../matrix/src/matrix/account-config.ts | 2 +- .../matrix/src/matrix/actions/client.test.ts | 2 +- .../matrix/src/matrix/actions/devices.test.ts | 14 +- .../matrix/src/matrix/actions/devices.ts | 2 +- extensions/matrix/src/matrix/active-client.ts | 2 +- extensions/matrix/src/matrix/client.test.ts | 4 +- extensions/matrix/src/matrix/client/config.ts | 2 +- .../matrix/src/matrix/client/create-client.ts | 2 +- .../src/matrix/client/file-sync-store.test.ts | 14 +- extensions/matrix/src/matrix/client/shared.ts | 2 +- .../matrix/src/matrix/client/storage.test.ts | 16 +- extensions/matrix/src/matrix/config-update.ts | 2 +- .../matrix/src/matrix/credentials.test.ts | 2 +- extensions/matrix/src/matrix/credentials.ts | 2 +- .../matrix/src/matrix/device-health.test.ts | 24 +- extensions/matrix/src/matrix/device-health.ts | 18 +- .../matrix/src/matrix/encryption-guidance.ts | 2 +- .../matrix/src/matrix/monitor/ack-config.ts | 4 +- .../src/matrix/monitor/auto-join.test.ts | 18 +- .../matrix/src/matrix/monitor/config.test.ts | 2 +- .../matrix/src/matrix/monitor/events.test.ts | 2 +- .../matrix/src/matrix/monitor/events.ts | 4 +- .../monitor/handler.media-failure.test.ts | 4 +- .../monitor/handler.thread-root-media.test.ts | 4 +- .../matrix/src/matrix/monitor/index.test.ts | 4 +- .../monitor/legacy-crypto-restore.test.ts | 14 +- .../matrix/src/matrix/monitor/media.test.ts | 2 +- .../matrix/src/matrix/monitor/replies.test.ts | 8 +- .../matrix/src/matrix/monitor/replies.ts | 4 +- .../matrix/src/matrix/monitor/route.test.ts | 14 +- .../matrix/src/matrix/monitor/startup.test.ts | 10 +- .../matrix/src/matrix/monitor/startup.ts | 6 +- extensions/matrix/src/matrix/sdk.test.ts | 8 +- extensions/matrix/src/matrix/sdk.ts | 2 +- .../src/matrix/sdk/idb-persistence.test.ts | 6 +- .../matrix/src/matrix/sdk/idb-persistence.ts | 4 +- .../src/matrix/sdk/recovery-key-store.test.ts | 2 +- extensions/matrix/src/matrix/send.test.ts | 6 +- .../matrix/src/matrix/send/client.test.ts | 2 +- .../matrix/src/matrix/thread-bindings.test.ts | 8 +- .../matrix/src/onboarding.resolve.test.ts | 2 +- extensions/matrix/src/onboarding.test.ts | 2 +- extensions/matrix/src/onboarding.ts | 6 +- extensions/matrix/src/outbound.test.ts | 14 +- extensions/matrix/src/plugin-entry.runtime.ts | 2 +- extensions/matrix/src/resolve-targets.test.ts | 2 +- extensions/matrix/src/runtime.ts | 2 +- extensions/matrix/src/session-route.ts | 2 +- extensions/matrix/src/setup-core.ts | 2 +- extensions/matrix/src/storage-paths.ts | 2 +- extensions/matrix/src/tool-actions.test.ts | 12 +- extensions/mattermost/index.test.ts | 8 +- extensions/mattermost/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/mattermost/package.json | 10 +- extensions/mattermost/runtime-api.ts | 2 +- extensions/mattermost/setup-entry.ts | 2 +- extensions/mattermost/src/channel.test.ts | 22 +- extensions/mattermost/src/channel.ts | 10 +- extensions/mattermost/src/config-schema.ts | 2 +- .../mattermost/src/group-mentions.test.ts | 8 +- extensions/mattermost/src/group-mentions.ts | 2 +- .../src/mattermost/accounts.test.ts | 12 +- .../mattermost/src/mattermost/accounts.ts | 12 +- .../mattermost/src/mattermost/directory.ts | 6 +- .../src/mattermost/interactions.test.ts | 6 +- .../mattermost/src/mattermost/interactions.ts | 8 +- .../src/mattermost/model-picker.test.ts | 4 +- .../mattermost/src/mattermost/model-picker.ts | 4 +- .../mattermost/src/mattermost/monitor-auth.ts | 4 +- .../src/mattermost/monitor-gating.ts | 6 +- .../src/mattermost/monitor-helpers.ts | 10 +- .../src/mattermost/monitor-slash.ts | 8 +- .../mattermost/src/mattermost/monitor.test.ts | 10 +- .../mattermost/src/mattermost/monitor.ts | 6 +- .../src/mattermost/reactions.test-helpers.ts | 4 +- .../mattermost/src/mattermost/reactions.ts | 8 +- .../src/mattermost/reply-delivery.test.ts | 16 +- .../src/mattermost/reply-delivery.ts | 6 +- extensions/mattermost/src/mattermost/send.ts | 6 +- .../src/mattermost/slash-commands.ts | 8 +- .../src/mattermost/slash-http.test.ts | 10 +- .../mattermost/src/mattermost/slash-http.ts | 8 +- .../mattermost/src/mattermost/slash-state.ts | 6 +- .../src/mattermost/target-resolution.ts | 4 +- extensions/mattermost/src/runtime.ts | 2 +- extensions/mattermost/src/secret-input.ts | 4 +- extensions/mattermost/src/session-route.ts | 2 +- extensions/mattermost/src/setup-core.ts | 6 +- .../mattermost/src/setup-status.test.ts | 4 +- extensions/mattermost/src/setup-surface.ts | 8 +- extensions/memory-core/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/memory-core/package.json | 12 +- extensions/memory-lancedb/api.ts | 2 +- extensions/memory-lancedb/config.ts | 4 +- extensions/memory-lancedb/index.test.ts | 6 +- extensions/memory-lancedb/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 2 +- extensions/memory-lancedb/package.json | 10 +- extensions/microsoft/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/microsoft/package.json | 8 +- extensions/minimax/README.md | 10 +- extensions/minimax/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../minimax/media-understanding-provider.ts | 2 +- extensions/minimax/model-definitions.ts | 2 +- extensions/minimax/oauth.ts | 2 +- extensions/minimax/onboard.ts | 28 +- extensions/minimax/package.json | 8 +- extensions/minimax/provider-catalog.ts | 2 +- extensions/mistral/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../mistral/media-understanding-provider.ts | 2 +- extensions/mistral/model-definitions.ts | 2 +- extensions/mistral/onboard.ts | 10 +- extensions/mistral/package.json | 8 +- extensions/modelstudio/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/modelstudio/model-definitions.ts | 2 +- extensions/modelstudio/onboard.ts | 16 +- extensions/modelstudio/package.json | 8 +- extensions/modelstudio/provider-catalog.ts | 2 +- extensions/moonshot/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../moonshot/media-understanding-provider.ts | 2 +- extensions/moonshot/onboard.ts | 16 +- extensions/moonshot/package.json | 8 +- extensions/moonshot/provider-catalog.ts | 2 +- .../moonshot/src/kimi-web-search-provider.ts | 8 +- extensions/msteams/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/msteams/package.json | 10 +- extensions/msteams/runtime-api.ts | 2 +- extensions/msteams/setup-entry.ts | 2 +- .../msteams/src/channel.directory.test.ts | 4 +- extensions/msteams/src/channel.ts | 22 +- .../msteams/src/conversation-store-fs.test.ts | 4 +- extensions/msteams/src/graph-upload.test.ts | 4 +- extensions/msteams/src/graph-upload.ts | 8 +- extensions/msteams/src/media-helpers.test.ts | 2 +- extensions/msteams/src/messenger.test.ts | 4 +- .../src/monitor-handler.file-consent.test.ts | 4 +- extensions/msteams/src/monitor-handler.ts | 4 +- .../message-handler.authz.test.ts | 8 +- .../msteams/src/monitor.lifecycle.test.ts | 6 +- extensions/msteams/src/monitor.ts | 4 +- extensions/msteams/src/outbound.test.ts | 8 +- extensions/msteams/src/outbound.ts | 4 +- extensions/msteams/src/polls-store.test.ts | 2 +- extensions/msteams/src/polls.test.ts | 4 +- extensions/msteams/src/polls.ts | 16 +- extensions/msteams/src/reply-dispatcher.ts | 4 +- extensions/msteams/src/resolve-allowlist.ts | 2 +- extensions/msteams/src/runtime.ts | 2 +- extensions/msteams/src/send-context.ts | 4 +- extensions/msteams/src/send.test.ts | 4 +- extensions/msteams/src/send.ts | 8 +- extensions/msteams/src/session-route.ts | 2 +- extensions/msteams/src/setup-core.ts | 2 +- extensions/msteams/src/setup-surface.ts | 16 +- extensions/msteams/src/test-runtime.ts | 4 +- extensions/nextcloud-talk/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/nextcloud-talk/package.json | 10 +- extensions/nextcloud-talk/setup-entry.ts | 2 +- .../nextcloud-talk/src/accounts.test.ts | 2 +- extensions/nextcloud-talk/src/accounts.ts | 4 +- extensions/nextcloud-talk/src/channel.ts | 18 +- .../nextcloud-talk/src/config-schema.ts | 2 +- .../nextcloud-talk/src/inbound.authz.test.ts | 4 +- extensions/nextcloud-talk/src/inbound.ts | 16 +- extensions/nextcloud-talk/src/monitor.ts | 2 +- extensions/nextcloud-talk/src/runtime.ts | 2 +- extensions/nextcloud-talk/src/secret-input.ts | 2 +- .../nextcloud-talk/src/session-route.ts | 2 +- extensions/nextcloud-talk/src/setup-core.ts | 24 +- .../nextcloud-talk/src/setup-surface.ts | 16 +- extensions/nostr/README.md | 10 +- extensions/nostr/api.ts | 2 +- extensions/nostr/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/nostr/package.json | 10 +- extensions/nostr/runtime-api.ts | 2 +- extensions/nostr/setup-entry.ts | 2 +- extensions/nostr/src/channel.ts | 8 +- extensions/nostr/src/config-schema.ts | 2 +- .../nostr/src/nostr-state-store.test.ts | 14 +- extensions/nostr/src/runtime.ts | 2 +- extensions/nostr/src/session-route.ts | 2 +- extensions/nostr/src/setup-surface.test.ts | 4 +- extensions/nostr/src/setup-surface.ts | 20 +- extensions/nostr/src/types.ts | 12 +- extensions/nvidia/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/nvidia/package.json | 8 +- extensions/nvidia/provider-catalog.ts | 2 +- extensions/ollama/index.test.ts | 2 +- extensions/ollama/index.ts | 10 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/ollama/package.json | 8 +- extensions/open-prose/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/open-prose/package.json | 6 +- extensions/open-prose/runtime-api.ts | 4 +- extensions/open-prose/skills/prose/SKILL.md | 10 +- extensions/open-prose/skills/prose/prose.md | 8 +- extensions/openai/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../openai/media-understanding-provider.ts | 2 +- extensions/openai/openai-codex-catalog.ts | 2 +- extensions/openai/openai-codex-provider.ts | 14 +- extensions/openai/openai-provider.ts | 8 +- extensions/openai/package.json | 8 +- extensions/openai/shared.ts | 4 +- extensions/opencode-go/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/opencode-go/onboard.ts | 10 +- extensions/opencode-go/package.json | 8 +- extensions/opencode/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/opencode/onboard.ts | 10 +- extensions/opencode/package.json | 8 +- extensions/openrouter/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/openrouter/onboard.ts | 8 +- extensions/openrouter/package.json | 8 +- extensions/openrouter/provider-catalog.ts | 2 +- extensions/openshell/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 2 +- extensions/openshell/package.json | 8 +- extensions/openshell/src/backend.test.ts | 22 +- extensions/openshell/src/backend.ts | 18 +- extensions/openshell/src/cli.ts | 4 +- extensions/openshell/src/config.test.ts | 2 +- extensions/openshell/src/config.ts | 6 +- extensions/openshell/src/fs-bridge.test.ts | 2 +- extensions/openshell/src/fs-bridge.ts | 4 +- .../openshell/src/remote-fs-bridge.test.ts | 6 +- extensions/openshell/src/remote-fs-bridge.ts | 2 +- extensions/perplexity/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/perplexity/package.json | 8 +- .../src/perplexity-web-search-provider.ts | 42 +- extensions/phone-control/index.test.ts | 16 +- extensions/phone-control/index.ts | 18 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/phone-control/runtime-api.ts | 10 +- extensions/qianfan/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/qianfan/onboard.ts | 12 +- extensions/qianfan/package.json | 8 +- extensions/qianfan/provider-catalog.ts | 2 +- extensions/qwen-portal-auth/README.md | 6 +- extensions/qwen-portal-auth/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../qwen-portal-auth/provider-catalog.ts | 2 +- extensions/qwen-portal-auth/runtime-api.ts | 2 +- extensions/sglang/index.ts | 10 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/sglang/package.json | 8 +- extensions/shared/passive-monitor.ts | 2 +- extensions/shared/runtime.ts | 2 +- extensions/signal/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/signal/package.json | 8 +- extensions/signal/setup-entry.ts | 2 +- extensions/signal/src/accounts.ts | 14 +- extensions/signal/src/channel.ts | 14 +- extensions/signal/src/client.ts | 6 +- extensions/signal/src/config-schema.ts | 2 +- extensions/signal/src/daemon.ts | 2 +- extensions/signal/src/format.ts | 4 +- extensions/signal/src/identity.ts | 4 +- extensions/signal/src/message-actions.ts | 2 +- ...ends-tool-summaries-responseprefix.test.ts | 8 +- .../src/monitor.tool-result.test-harness.ts | 28 +- extensions/signal/src/monitor.ts | 30 +- .../signal/src/monitor/access-policy.ts | 6 +- .../event-handler.mention-gating.test.ts | 4 +- .../signal/src/monitor/event-handler.ts | 46 +- .../signal/src/monitor/event-handler.types.ts | 12 +- extensions/signal/src/outbound-adapter.ts | 12 +- extensions/signal/src/probe.ts | 2 +- extensions/signal/src/reaction-level.ts | 6 +- extensions/signal/src/rpc-context.ts | 2 +- extensions/signal/src/runtime-api.ts | 2 +- extensions/signal/src/runtime.ts | 4 +- extensions/signal/src/send-reactions.test.ts | 4 +- extensions/signal/src/send-reactions.ts | 6 +- extensions/signal/src/send.ts | 10 +- extensions/signal/src/setup-core.ts | 24 +- extensions/signal/src/setup-surface.ts | 4 +- extensions/signal/src/shared.ts | 6 +- extensions/signal/src/sse-reconnect.ts | 8 +- extensions/slack/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/slack/package.json | 8 +- extensions/slack/setup-entry.ts | 2 +- extensions/slack/src/account-inspect.ts | 8 +- .../slack/src/account-surface-fields.ts | 2 +- extensions/slack/src/accounts.ts | 12 +- extensions/slack/src/action-runtime.test.ts | 16 +- extensions/slack/src/action-runtime.ts | 4 +- extensions/slack/src/actions.ts | 4 +- extensions/slack/src/blocks-render.ts | 12 +- extensions/slack/src/blocks.test-helpers.ts | 4 +- extensions/slack/src/channel-actions.ts | 2 +- extensions/slack/src/channel-migration.ts | 10 +- extensions/slack/src/channel.test.ts | 12 +- extensions/slack/src/channel.ts | 24 +- extensions/slack/src/config-schema.ts | 2 +- extensions/slack/src/directory-config.ts | 2 +- extensions/slack/src/directory-live.ts | 4 +- extensions/slack/src/draft-stream.ts | 2 +- extensions/slack/src/format.ts | 6 +- extensions/slack/src/group-policy.ts | 6 +- .../slack/src/interactive-replies.test.ts | 6 +- extensions/slack/src/interactive-replies.ts | 4 +- .../slack/src/message-action-dispatch.ts | 6 +- extensions/slack/src/message-actions.test.ts | 4 +- extensions/slack/src/message-actions.ts | 8 +- extensions/slack/src/monitor.test-helpers.ts | 14 +- extensions/slack/src/monitor.test.ts | 12 +- .../slack/src/monitor.tool-result.test.ts | 6 +- extensions/slack/src/monitor/allow-list.ts | 4 +- extensions/slack/src/monitor/auth.test.ts | 8 +- extensions/slack/src/monitor/auth.ts | 4 +- .../slack/src/monitor/channel-config.ts | 4 +- extensions/slack/src/monitor/commands.ts | 6 +- extensions/slack/src/monitor/context.test.ts | 6 +- extensions/slack/src/monitor/context.ts | 28 +- extensions/slack/src/monitor/dm-auth.ts | 6 +- .../slack/src/monitor/events/channels.ts | 8 +- .../events/interactions.block-actions.ts | 6 +- .../src/monitor/events/interactions.modal.ts | 2 +- .../src/monitor/events/interactions.test.ts | 88 +- .../slack/src/monitor/events/interactions.ts | 8 +- .../slack/src/monitor/events/members.ts | 4 +- .../slack/src/monitor/events/messages.ts | 4 +- extensions/slack/src/monitor/events/pins.ts | 4 +- .../slack/src/monitor/events/reactions.ts | 4 +- .../monitor/events/system-event-context.ts | 2 +- .../src/monitor/external-arg-menu-store.ts | 4 +- extensions/slack/src/monitor/media.ts | 10 +- .../slack/src/monitor/message-handler.ts | 2 +- .../src/monitor/message-handler/dispatch.ts | 26 +- .../message-handler/prepare-content.ts | 2 +- .../message-handler/prepare-thread-context.ts | 8 +- .../message-handler/prepare.test-helpers.ts | 8 +- .../monitor/message-handler/prepare.test.ts | 28 +- .../prepare.thread-session-key.test.ts | 4 +- .../src/monitor/message-handler/prepare.ts | 40 +- .../src/monitor/message-handler/types.ts | 4 +- extensions/slack/src/monitor/monitor.test.ts | 6 +- extensions/slack/src/monitor/policy.ts | 2 +- extensions/slack/src/monitor/provider.ts | 30 +- extensions/slack/src/monitor/replies.test.ts | 2 +- extensions/slack/src/monitor/replies.ts | 16 +- extensions/slack/src/monitor/room-context.ts | 2 +- .../src/monitor/slash-commands.runtime.ts | 12 +- .../src/monitor/slash-dispatch.runtime.ts | 22 +- .../monitor/slash-skill-commands.runtime.ts | 4 +- .../slack/src/monitor/slash.test-harness.ts | 22 +- extensions/slack/src/monitor/slash.test.ts | 30 +- extensions/slack/src/monitor/slash.ts | 18 +- .../slack/src/monitor/thread-resolution.ts | 4 +- extensions/slack/src/monitor/types.ts | 6 +- extensions/slack/src/outbound-adapter.ts | 14 +- extensions/slack/src/probe.test.ts | 8 +- extensions/slack/src/probe.ts | 4 +- extensions/slack/src/runtime-api.ts | 6 +- extensions/slack/src/runtime.ts | 4 +- extensions/slack/src/scopes.ts | 2 +- extensions/slack/src/send.ts | 18 +- extensions/slack/src/send.upload.test.ts | 2 +- extensions/slack/src/sent-thread-cache.ts | 4 +- extensions/slack/src/setup-core.ts | 26 +- extensions/slack/src/setup-surface.ts | 14 +- .../slack/src/shared-interactive.test.ts | 8 +- extensions/slack/src/shared.ts | 24 +- extensions/slack/src/stream-mode.ts | 2 +- extensions/slack/src/streaming.ts | 2 +- extensions/slack/src/targets.ts | 2 +- .../slack/src/threading-tool-context.test.ts | 12 +- .../slack/src/threading-tool-context.ts | 6 +- extensions/slack/src/threading.ts | 2 +- extensions/slack/src/token.ts | 2 +- extensions/synology-chat/api.ts | 2 +- extensions/synology-chat/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/synology-chat/package.json | 12 +- extensions/synology-chat/setup-entry.ts | 2 +- extensions/synology-chat/src/accounts.test.ts | 6 +- extensions/synology-chat/src/accounts.ts | 4 +- extensions/synology-chat/src/channel.ts | 14 +- extensions/synology-chat/src/runtime.ts | 2 +- extensions/synology-chat/src/security.ts | 2 +- .../synology-chat/src/setup-surface.test.ts | 6 +- extensions/synology-chat/src/setup-surface.ts | 18 +- extensions/synology-chat/src/types.ts | 2 +- .../synology-chat/src/webhook-handler.ts | 2 +- extensions/synthetic/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/synthetic/onboard.ts | 12 +- extensions/synthetic/package.json | 8 +- extensions/synthetic/provider-catalog.ts | 2 +- extensions/talk-voice/api.ts | 4 +- extensions/talk-voice/index.test.ts | 6 +- extensions/talk-voice/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/telegram/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/telegram/package.json | 8 +- extensions/telegram/runtime-api.ts | 20 +- extensions/telegram/setup-entry.ts | 2 +- .../telegram/src/account-inspect.test.ts | 12 +- extensions/telegram/src/account-inspect.ts | 20 +- extensions/telegram/src/accounts.test.ts | 28 +- extensions/telegram/src/accounts.ts | 32 +- .../telegram/src/action-runtime.test.ts | 40 +- extensions/telegram/src/action-runtime.ts | 8 +- extensions/telegram/src/api-logging.ts | 8 +- extensions/telegram/src/approval-buttons.ts | 2 +- .../telegram/src/audit-membership-runtime.ts | 4 +- extensions/telegram/src/audit.ts | 4 +- extensions/telegram/src/bot-access.ts | 6 +- extensions/telegram/src/bot-deps.ts | 10 +- .../telegram/src/bot-handlers.buffers.ts | 10 +- extensions/telegram/src/bot-handlers.media.ts | 2 +- .../telegram/src/bot-handlers.runtime.ts | 38 +- .../bot-message-context.acp-bindings.test.ts | 12 +- ...t-message-context.audio-transcript.test.ts | 2 +- .../telegram/src/bot-message-context.body.ts | 30 +- .../bot-message-context.dm-threads.test.ts | 2 +- ...t-message-context.implicit-mention.test.ts | 2 +- ...t-message-context.named-account-dm.test.ts | 6 +- .../src/bot-message-context.session.ts | 30 +- .../src/bot-message-context.test-harness.ts | 2 +- .../telegram/src/bot-message-context.ts | 22 +- .../telegram/src/bot-message-context.types.ts | 12 +- .../telegram/src/bot-message-dispatch.test.ts | 4 +- .../telegram/src/bot-message-dispatch.ts | 40 +- extensions/telegram/src/bot-message.ts | 8 +- .../telegram/src/bot-native-command-menu.ts | 10 +- ...ot-native-commands.fixture-test-support.ts | 8 +- .../bot-native-commands.group-auth.test.ts | 14 +- .../bot-native-commands.menu-test-support.ts | 14 +- .../bot-native-commands.plugin-auth.test.ts | 6 +- .../src/bot-native-commands.registry.test.ts | 4 +- .../bot-native-commands.session-meta.test.ts | 32 +- ...t-native-commands.skills-allowlist.test.ts | 6 +- .../src/bot-native-commands.test-helpers.ts | 44 +- .../telegram/src/bot-native-commands.test.ts | 18 +- .../telegram/src/bot-native-commands.ts | 56 +- extensions/telegram/src/bot-updates.ts | 2 +- .../bot.create-telegram-bot.test-harness.ts | 64 +- .../src/bot.create-telegram-bot.test.ts | 100 +- ...dia-file-path-no-file-download.e2e.test.ts | 14 +- .../telegram/src/bot.media.e2e-harness.ts | 32 +- ...t.media.stickers-and-fragments.e2e.test.ts | 10 +- .../telegram/src/bot.media.test-utils.ts | 4 +- extensions/telegram/src/bot.test.ts | 64 +- extensions/telegram/src/bot.ts | 28 +- .../telegram/src/bot/delivery.replies.ts | 28 +- .../bot/delivery.resolve-media-retry.test.ts | 8 +- .../src/bot/delivery.resolve-media.ts | 10 +- extensions/telegram/src/bot/delivery.send.ts | 4 +- extensions/telegram/src/bot/delivery.test.ts | 2 +- extensions/telegram/src/bot/helpers.ts | 10 +- .../telegram/src/bot/reply-threading.ts | 2 +- extensions/telegram/src/button-types.ts | 4 +- extensions/telegram/src/channel-actions.ts | 6 +- extensions/telegram/src/channel.test.ts | 14 +- extensions/telegram/src/channel.ts | 30 +- extensions/telegram/src/config-schema.ts | 2 +- ...onversation-route.base-session-key.test.ts | 6 +- extensions/telegram/src/conversation-route.ts | 18 +- extensions/telegram/src/directory-config.ts | 4 +- extensions/telegram/src/dm-access.ts | 8 +- .../telegram/src/draft-chunking.test.ts | 6 +- extensions/telegram/src/draft-chunking.ts | 10 +- extensions/telegram/src/draft-stream.ts | 6 +- .../src/exec-approvals-handler.test.ts | 10 +- .../telegram/src/exec-approvals-handler.ts | 34 +- .../telegram/src/exec-approvals.test.ts | 12 +- extensions/telegram/src/exec-approvals.ts | 26 +- extensions/telegram/src/fetch.test.ts | 2 +- extensions/telegram/src/fetch.ts | 6 +- extensions/telegram/src/format.ts | 6 +- .../telegram/src/format.wrap-md.test.ts | 6 +- .../src/group-access.policy-access.test.ts | 4 +- extensions/telegram/src/group-access.ts | 12 +- .../telegram/src/group-config-helpers.ts | 2 +- extensions/telegram/src/group-migration.ts | 10 +- extensions/telegram/src/group-policy.ts | 4 +- extensions/telegram/src/inline-buttons.ts | 8 +- .../src/lane-delivery-text-deliverer.ts | 4 +- .../src/media-understanding.runtime.ts | 6 +- extensions/telegram/src/monitor.test.ts | 16 +- extensions/telegram/src/monitor.ts | 18 +- .../telegram/src/network-config.test.ts | 34 +- extensions/telegram/src/network-config.ts | 14 +- extensions/telegram/src/network-errors.ts | 4 +- extensions/telegram/src/outbound-adapter.ts | 12 +- .../telegram/src/polling-session.test.ts | 4 +- extensions/telegram/src/polling-session.ts | 6 +- extensions/telegram/src/probe.ts | 4 +- extensions/telegram/src/proxy.ts | 2 +- .../telegram/src/reaction-level.test.ts | 16 +- extensions/telegram/src/reaction-level.ts | 6 +- .../src/reasoning-lane-coordinator.ts | 8 +- extensions/telegram/src/runtime.ts | 4 +- extensions/telegram/src/send.test-harness.ts | 8 +- extensions/telegram/src/send.ts | 30 +- .../src/sendchataction-401-backoff.ts | 4 +- extensions/telegram/src/sent-message-cache.ts | 4 +- .../telegram/src/sequential-key.test.ts | 4 +- extensions/telegram/src/sequential-key.ts | 4 +- extensions/telegram/src/setup-core.ts | 16 +- extensions/telegram/src/setup-surface.ts | 6 +- extensions/telegram/src/shared.ts | 10 +- extensions/telegram/src/status-issues.ts | 4 +- .../telegram/src/status-reaction-variants.ts | 2 +- extensions/telegram/src/sticker-cache.test.ts | 16 +- extensions/telegram/src/sticker-cache.ts | 24 +- .../telegram/src/target-writeback.test.ts | 18 +- extensions/telegram/src/target-writeback.ts | 12 +- .../telegram/src/thread-bindings.test.ts | 12 +- extensions/telegram/src/thread-bindings.ts | 18 +- extensions/telegram/src/token.test.ts | 32 +- extensions/telegram/src/token.ts | 12 +- .../telegram/src/update-offset-store.test.ts | 14 +- .../telegram/src/update-offset-store.ts | 4 +- extensions/telegram/src/voice.ts | 2 +- extensions/telegram/src/webhook.ts | 16 +- extensions/thread-ownership/api.ts | 2 +- extensions/thread-ownership/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/tlon/README.md | 6 +- extensions/tlon/api.ts | 2 +- extensions/tlon/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/tlon/package.json | 10 +- extensions/tlon/setup-entry.ts | 2 +- extensions/tlon/src/channel.runtime.ts | 10 +- extensions/tlon/src/channel.test.ts | 6 +- extensions/tlon/src/channel.ts | 12 +- extensions/tlon/src/config-schema.ts | 2 +- extensions/tlon/src/monitor/authorization.ts | 4 +- extensions/tlon/src/monitor/index.ts | 10 +- extensions/tlon/src/monitor/media.ts | 8 +- extensions/tlon/src/runtime.ts | 4 +- extensions/tlon/src/session-route.ts | 2 +- extensions/tlon/src/setup-core.ts | 16 +- extensions/tlon/src/setup-surface.test.ts | 4 +- extensions/tlon/src/setup-surface.ts | 2 +- extensions/tlon/src/types.ts | 6 +- extensions/tlon/src/urbit/base-url.ts | 2 +- extensions/tlon/src/urbit/fetch.ts | 2 +- extensions/tlon/src/urbit/upload.test.ts | 6 +- extensions/tlon/src/urbit/upload.ts | 2 +- extensions/together/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/together/onboard.ts | 12 +- extensions/together/package.json | 8 +- extensions/together/provider-catalog.ts | 2 +- extensions/twitch/README.md | 16 +- extensions/twitch/api.ts | 2 +- extensions/twitch/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/twitch/package.json | 8 +- extensions/twitch/runtime-api.ts | 2 +- extensions/twitch/src/actions.ts | 2 +- extensions/twitch/src/config.ts | 6 +- extensions/twitch/src/monitor.ts | 6 +- extensions/twitch/src/outbound.ts | 4 +- extensions/twitch/src/plugin.test.ts | 4 +- extensions/twitch/src/plugin.ts | 20 +- extensions/twitch/src/runtime.ts | 2 +- extensions/twitch/src/send.ts | 10 +- extensions/twitch/src/setup-surface.ts | 56 +- extensions/twitch/src/test-fixtures.ts | 6 +- extensions/twitch/src/token.test.ts | 24 +- extensions/twitch/src/token.ts | 14 +- extensions/twitch/src/twitch-client.ts | 8 +- extensions/twitch/src/types.ts | 6 +- extensions/twitch/src/utils/markdown.ts | 2 +- extensions/venice/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/venice/onboard.ts | 12 +- extensions/venice/package.json | 8 +- extensions/venice/provider-catalog.ts | 2 +- extensions/vercel-ai-gateway/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/vercel-ai-gateway/onboard.ts | 8 +- extensions/vercel-ai-gateway/package.json | 8 +- .../vercel-ai-gateway/provider-catalog.ts | 2 +- extensions/vllm/index.ts | 10 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/vllm/package.json | 8 +- extensions/voice-call/README.md | 38 +- extensions/voice-call/api.ts | 2 +- extensions/voice-call/index.ts | 4 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/voice-call/package.json | 8 +- extensions/voice-call/src/cli.ts | 4 +- extensions/voice-call/src/core-bridge.ts | 4 +- .../voice-call/src/manager.test-harness.ts | 2 +- extensions/voice-call/src/manager.ts | 2 +- .../voice-call/src/manager/events.test.ts | 2 +- .../voice-call/src/response-generator.ts | 2 +- extensions/volcengine/index.ts | 6 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/volcengine/package.json | 8 +- extensions/volcengine/provider-catalog.ts | 2 +- extensions/whatsapp/api.ts | 2 +- extensions/whatsapp/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/whatsapp/package.json | 10 +- extensions/whatsapp/setup-entry.ts | 2 +- extensions/whatsapp/src/accounts.ts | 18 +- .../src/accounts.whatsapp-auth.test.ts | 8 +- .../src/action-runtime-target-auth.ts | 4 +- .../whatsapp/src/action-runtime.test.ts | 10 +- extensions/whatsapp/src/action-runtime.ts | 4 +- extensions/whatsapp/src/active-listener.ts | 14 +- extensions/whatsapp/src/agent-tools-login.ts | 4 +- extensions/whatsapp/src/auth-store.ts | 18 +- ...to-reply.broadcast-groups.combined.test.ts | 10 +- extensions/whatsapp/src/auto-reply.impl.ts | 4 +- .../whatsapp/src/auto-reply.test-harness.ts | 14 +- ...o-reply.connection-and-logging.e2e.test.ts | 12 +- ...to-reply.web-auto-reply.last-route.test.ts | 6 +- .../whatsapp/src/auto-reply/deliver-reply.ts | 16 +- .../src/auto-reply/heartbeat-runner.test.ts | 14 +- .../src/auto-reply/heartbeat-runner.ts | 28 +- extensions/whatsapp/src/auto-reply/loggers.ts | 2 +- .../whatsapp/src/auto-reply/mentions.ts | 6 +- extensions/whatsapp/src/auto-reply/monitor.ts | 34 +- .../src/auto-reply/monitor/ack-reaction.ts | 6 +- .../src/auto-reply/monitor/broadcast.ts | 8 +- .../auto-reply/monitor/group-activation.ts | 8 +- .../src/auto-reply/monitor/group-gating.ts | 12 +- .../src/auto-reply/monitor/group-members.ts | 2 +- .../src/auto-reply/monitor/last-route.ts | 6 +- .../src/auto-reply/monitor/message-line.ts | 6 +- .../src/auto-reply/monitor/on-message.ts | 16 +- .../whatsapp/src/auto-reply/monitor/peer.ts | 2 +- .../process-message.inbound-context.test.ts | 4 +- .../src/auto-reply/monitor/process-message.ts | 44 +- .../src/auto-reply/session-snapshot.ts | 6 +- .../auto-reply/web-auto-reply-monitor.test.ts | 6 +- .../auto-reply/web-auto-reply-utils.test.ts | 20 +- .../whatsapp/src/channel.directory.test.ts | 4 +- extensions/whatsapp/src/channel.setup.ts | 2 +- extensions/whatsapp/src/channel.ts | 2 +- extensions/whatsapp/src/config-schema.ts | 2 +- extensions/whatsapp/src/directory-config.ts | 2 +- extensions/whatsapp/src/group-policy.ts | 6 +- extensions/whatsapp/src/inbound.media.test.ts | 2 +- .../inbound/access-control.test-harness.ts | 12 +- .../whatsapp/src/inbound/access-control.ts | 14 +- extensions/whatsapp/src/inbound/dedupe.ts | 2 +- extensions/whatsapp/src/inbound/extract.ts | 6 +- extensions/whatsapp/src/inbound/media.ts | 2 +- extensions/whatsapp/src/inbound/monitor.ts | 16 +- extensions/whatsapp/src/inbound/send-api.ts | 4 +- extensions/whatsapp/src/inbound/types.ts | 2 +- extensions/whatsapp/src/login-qr.ts | 8 +- extensions/whatsapp/src/login.test.ts | 2 +- extensions/whatsapp/src/login.ts | 12 +- extensions/whatsapp/src/logout.test.ts | 2 +- extensions/whatsapp/src/media.test.ts | 22 +- extensions/whatsapp/src/media.ts | 20 +- ...captures-media-path-image-messages.test.ts | 2 +- .../src/monitor-inbox.test-harness.ts | 20 +- extensions/whatsapp/src/normalize.ts | 2 +- .../src/outbound-adapter.poll.test.ts | 4 +- extensions/whatsapp/src/outbound-adapter.ts | 14 +- extensions/whatsapp/src/qr-image.ts | 2 +- extensions/whatsapp/src/reconnect.test.ts | 4 +- extensions/whatsapp/src/reconnect.ts | 12 +- .../whatsapp/src/resolve-target.test.ts | 8 +- extensions/whatsapp/src/runtime-api.ts | 6 +- extensions/whatsapp/src/runtime.ts | 4 +- extensions/whatsapp/src/send.test.ts | 6 +- extensions/whatsapp/src/send.ts | 24 +- extensions/whatsapp/src/session-route.ts | 2 +- extensions/whatsapp/src/session.test.ts | 4 +- extensions/whatsapp/src/session.ts | 14 +- extensions/whatsapp/src/setup-core.ts | 2 +- extensions/whatsapp/src/setup-surface.test.ts | 8 +- extensions/whatsapp/src/setup-surface.ts | 36 +- extensions/whatsapp/src/shared.ts | 10 +- extensions/whatsapp/src/status-issues.ts | 10 +- extensions/whatsapp/src/test-helpers.ts | 24 +- extensions/xai/index.ts | 10 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/xai/model-definitions.ts | 2 +- extensions/xai/onboard.ts | 14 +- extensions/xai/package.json | 8 +- extensions/xai/provider-catalog.ts | 2 +- extensions/xai/provider-models.ts | 4 +- .../xai/src/grok-web-search-provider.ts | 8 +- extensions/xai/web-search.test.ts | 2 +- extensions/xai/web-search.ts | 6 +- extensions/xiaomi/index.ts | 8 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/xiaomi/onboard.ts | 8 +- extensions/xiaomi/package.json | 8 +- extensions/xiaomi/provider-catalog.ts | 2 +- extensions/zai/index.ts | 10 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 .../zai/media-understanding-provider.ts | 2 +- extensions/zai/model-definitions.ts | 2 +- extensions/zai/onboard.ts | 18 +- extensions/zai/package.json | 8 +- extensions/zai/runtime-api.ts | 2 +- extensions/zalo/README.md | 8 +- extensions/zalo/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/zalo/package.json | 10 +- extensions/zalo/runtime-api.ts | 2 +- extensions/zalo/setup-entry.ts | 2 +- extensions/zalo/src/accounts.ts | 14 +- extensions/zalo/src/actions.ts | 6 +- extensions/zalo/src/channel.directory.test.ts | 4 +- extensions/zalo/src/channel.runtime.ts | 6 +- extensions/zalo/src/channel.ts | 14 +- extensions/zalo/src/config-schema.ts | 2 +- extensions/zalo/src/monitor.lifecycle.test.ts | 4 +- extensions/zalo/src/monitor.ts | 10 +- extensions/zalo/src/monitor.webhook.test.ts | 8 +- extensions/zalo/src/monitor.webhook.ts | 4 +- extensions/zalo/src/runtime.ts | 2 +- extensions/zalo/src/secret-input.ts | 2 +- extensions/zalo/src/send.ts | 4 +- extensions/zalo/src/session-route.ts | 2 +- extensions/zalo/src/setup-core.ts | 2 +- extensions/zalo/src/setup-status.test.ts | 4 +- extensions/zalo/src/setup-surface.test.ts | 4 +- extensions/zalo/src/setup-surface.ts | 34 +- extensions/zalo/src/status-issues.ts | 2 +- extensions/zalo/src/token.test.ts | 2 +- extensions/zalo/src/token.ts | 4 +- extensions/zalouser/README.md | 36 +- extensions/zalouser/index.ts | 2 +- ...penclaw.plugin.json => klawty.plugin.json} | 0 extensions/zalouser/package.json | 10 +- extensions/zalouser/runtime-api.ts | 2 +- extensions/zalouser/setup-entry.ts | 2 +- extensions/zalouser/src/accounts.test.ts | 8 +- extensions/zalouser/src/accounts.ts | 18 +- extensions/zalouser/src/channel.setup.test.ts | 4 +- extensions/zalouser/src/channel.ts | 14 +- extensions/zalouser/src/config-schema.ts | 2 +- .../src/monitor.account-scope.test.ts | 4 +- .../zalouser/src/monitor.group-gating.test.ts | 8 +- extensions/zalouser/src/monitor.ts | 22 +- extensions/zalouser/src/qr-temp-file.ts | 6 +- extensions/zalouser/src/runtime.ts | 2 +- extensions/zalouser/src/send.test.ts | 4 +- extensions/zalouser/src/session-route.ts | 2 +- extensions/zalouser/src/setup-core.ts | 2 +- extensions/zalouser/src/setup-surface.test.ts | 14 +- extensions/zalouser/src/setup-surface.ts | 44 +- extensions/zalouser/src/shared.ts | 2 +- extensions/zalouser/src/status-issues.ts | 4 +- extensions/zalouser/src/tool.test.ts | 4 +- extensions/zalouser/src/zalo-js.ts | 2 +- fly.private.toml | 10 +- fly.toml | 10 +- klawty-policy.yaml | 340 +++ openclaw.mjs => klawty.mjs | 8 +- openclaw.podman.env => klawty.podman.env | 0 knip.config.ts | 4 +- package.json | 58 +- packages/clawdbot/index.js | 2 +- packages/clawdbot/package.json | 4 +- packages/clawdbot/scripts/postinstall.js | 2 +- packages/moltbot/index.js | 2 +- packages/moltbot/package.json | 4 +- packages/moltbot/scripts/postinstall.js | 2 +- pnpm-lock.yaml | 745 +---- render.yaml | 12 +- scripts/audit-plugin-sdk-seams.mjs | 6 +- scripts/bench-cli-startup.ts | 2 +- scripts/canvas-a2ui-copy.ts | 8 +- scripts/check-cli-startup-memory.mjs | 20 +- .../check-extension-plugin-sdk-boundary.mjs | 2 +- scripts/check-gateway-watch-regression.mjs | 8 +- scripts/check-no-extension-src-imports.ts | 2 +- .../check-no-extension-test-core-imports.ts | 12 +- ...-no-monolithic-plugin-sdk-entry-imports.ts | 14 +- scripts/check-no-random-messaging-tmp.mjs | 2 +- scripts/check-plugin-sdk-exports.mjs | 2 +- scripts/check-plugin-sdk-subpath-exports.mjs | 8 +- scripts/ci-changed-scope.mjs | 6 +- scripts/copy-bundled-plugin-metadata.mjs | 16 +- scripts/copy-export-html-templates.ts | 2 +- scripts/copy-hook-metadata.ts | 2 +- scripts/debug-claude-usage.ts | 6 +- .../dev/discord-acp-plain-language-smoke.ts | 112 +- scripts/dev/gateway-smoke.ts | 12 +- scripts/dev/ios-node-e2e.ts | 14 +- scripts/dev/test-device-pair-telegram.ts | 4 +- scripts/docker/cleanup-smoke/Dockerfile | 10 +- scripts/docker/install-sh-e2e/Dockerfile | 8 +- scripts/docker/install-sh-e2e/run.sh | 2 +- scripts/docker/install-sh-nonroot/Dockerfile | 8 +- scripts/docker/install-sh-smoke/Dockerfile | 8 +- scripts/e2e/Dockerfile | 10 +- scripts/e2e/Dockerfile.qr-import | 2 +- scripts/e2e/gateway-network-docker.sh | 2 +- scripts/e2e/onboard-docker.sh | 12 +- scripts/e2e/parallels-linux-smoke.sh | 2 +- scripts/e2e/parallels-macos-smoke.sh | 2 +- scripts/e2e/parallels-windows-smoke.sh | 2 +- ...enerate-bundled-provider-auth-env-vars.mjs | 2 +- ...enerate-host-env-security-policy-swift.mjs | 2 +- scripts/ghsa-patch.mjs | 4 +- scripts/install.sh | 2714 ++--------------- scripts/k8s/deploy.sh | 4 +- scripts/k8s/manifests/configmap.yaml | 16 +- scripts/k8s/manifests/deployment.yaml | 54 +- scripts/k8s/manifests/pvc.yaml | 4 +- scripts/k8s/manifests/service.yaml | 10 +- ...w-npm-publish.sh => klawty-npm-publish.sh} | 0 ...e-check.ts => klawty-npm-release-check.ts} | 14 +- scripts/label-open-issues.ts | 6 +- scripts/lib/bundled-extension-manifest.ts | 6 +- scripts/lib/optional-bundled-clusters.d.ts | 2 +- scripts/lib/optional-bundled-clusters.mjs | 2 +- scripts/lib/plugin-npm-release.ts | 20 +- scripts/lib/plugin-sdk-entries.mjs | 2 +- scripts/load-channel-config-surface.ts | 2 +- scripts/onboard.sh | 529 ++++ ...nclaw.container.in => klawty.container.in} | 0 scripts/profile-extension-memory.mjs | 8 +- scripts/protocol-gen-swift.ts | 6 +- scripts/protocol-gen.ts | 4 +- scripts/release-check.ts | 4 +- scripts/restart-mac.sh | 4 +- ...penclaw-podman.sh => run-klawty-podman.sh} | 6 +- scripts/run-node.mjs | 16 +- scripts/shell-helpers/README.md | 22 +- scripts/stage-bundled-plugin-runtime-deps.mjs | 2 +- scripts/stage-bundled-plugin-runtime.mjs | 2 +- scripts/sync-plugin-versions.ts | 10 +- ...or.service => klawty-auth-monitor.service} | 0 ...onitor.timer => klawty-auth-monitor.timer} | 0 scripts/test-built-plugin-singleton.mjs | 20 +- scripts/test-extension.mjs | 2 +- scripts/test-force.ts | 8 +- scripts/test-hotspots.mjs | 2 +- scripts/test-parallel.mjs | 46 +- scripts/test-perf-budget.mjs | 8 +- scripts/test-shell-completion.ts | 10 +- scripts/test-update-timings.mjs | 2 +- scripts/tsdown-build.mjs | 2 +- scripts/update-clawtributors.ts | 2 +- scripts/watch-node.mjs | 6 +- scripts/write-cli-compat.ts | 2 +- scripts/write-cli-startup-metadata.ts | 8 +- scripts/zai-fallback-repro.ts | 14 +- skills/1password/SKILL.md | 6 +- skills/apple-notes/SKILL.md | 4 +- skills/apple-reminders/SKILL.md | 10 +- skills/bear-notes/SKILL.md | 2 +- skills/blogwatcher/SKILL.md | 2 +- skills/blucli/SKILL.md | 2 +- skills/bluebubbles/SKILL.md | 6 +- skills/camsnap/SKILL.md | 2 +- skills/canvas/SKILL.md | 30 +- skills/clawhub/SKILL.md | 4 +- skills/coding-agent/SKILL.md | 14 +- skills/discord/SKILL.md | 2 +- skills/eightctl/SKILL.md | 2 +- skills/gemini/SKILL.md | 2 +- skills/gh-issues/SKILL.md | 26 +- skills/gifgrep/SKILL.md | 2 +- skills/github/SKILL.md | 2 +- skills/gog/SKILL.md | 2 +- skills/goplaces/SKILL.md | 2 +- skills/healthcheck/SKILL.md | 72 +- skills/himalaya/SKILL.md | 2 +- skills/imsg/SKILL.md | 4 +- skills/mcporter/SKILL.md | 2 +- skills/model-usage/SKILL.md | 2 +- skills/nano-pdf/SKILL.md | 2 +- skills/node-connect/SKILL.md | 44 +- skills/notion/SKILL.md | 2 +- skills/obsidian/SKILL.md | 2 +- skills/openai-image-gen/SKILL.md | 4 +- skills/openai-whisper-api/SKILL.md | 4 +- skills/openai-whisper/SKILL.md | 2 +- skills/openhue/SKILL.md | 2 +- skills/oracle/SKILL.md | 2 +- skills/ordercli/SKILL.md | 2 +- skills/peekaboo/SKILL.md | 2 +- skills/sag/SKILL.md | 2 +- skills/session-logs/SKILL.md | 14 +- skills/sherpa-onnx-tts/SKILL.md | 12 +- skills/slack/SKILL.md | 8 +- skills/songsee/SKILL.md | 2 +- skills/sonoscli/SKILL.md | 2 +- skills/spotify-player/SKILL.md | 2 +- skills/summarize/SKILL.md | 2 +- skills/things-mac/SKILL.md | 6 +- skills/tmux/SKILL.md | 2 +- skills/trello/SKILL.md | 4 +- skills/video-frames/SKILL.md | 2 +- skills/voice-call/SKILL.md | 8 +- skills/wacli/SKILL.md | 4 +- skills/weather/SKILL.md | 2 +- skills/xurl/SKILL.md | 2 +- src/acp/client.test.ts | 74 +- src/acp/client.ts | 14 +- src/acp/control-plane/manager.core.ts | 34 +- .../manager.identity-reconcile.ts | 6 +- src/acp/control-plane/manager.test.ts | 14 +- src/acp/control-plane/manager.types.ts | 8 +- src/acp/control-plane/manager.utils.ts | 6 +- src/acp/control-plane/session-actor-queue.ts | 2 +- src/acp/control-plane/spawn.ts | 4 +- src/acp/persistent-bindings.lifecycle.test.ts | 4 +- src/acp/persistent-bindings.lifecycle.ts | 10 +- src/acp/persistent-bindings.resolve.ts | 8 +- src/acp/persistent-bindings.test.ts | 24 +- src/acp/persistent-bindings.types.ts | 2 +- src/acp/policy.test.ts | 10 +- src/acp/policy.ts | 16 +- src/acp/runtime/registry.ts | 2 +- src/acp/runtime/session-meta.test.ts | 6 +- src/acp/runtime/session-meta.ts | 14 +- src/acp/server.startup.test.ts | 2 +- src/acp/server.ts | 8 +- src/acp/translator.prompt-prefix.test.ts | 26 +- src/acp/translator.ts | 12 +- src/acp/types.ts | 4 +- src/agents/acp-spawn-parent-stream.test.ts | 10 +- src/agents/acp-spawn.test.ts | 6 +- src/agents/acp-spawn.ts | 18 +- src/agents/agent-command.ts | 6 +- src/agents/agent-paths.test.ts | 36 +- src/agents/agent-paths.ts | 12 +- src/agents/agent-scope.test.ts | 98 +- src/agents/agent-scope.ts | 42 +- src/agents/anthropic-payload-log.test.ts | 2 +- src/agents/anthropic-payload-log.ts | 4 +- src/agents/anthropic.setup-token.live.test.ts | 24 +- src/agents/apply-patch.test.ts | 8 +- src/agents/auth-health.ts | 6 +- src/agents/auth-profiles.chutes.test.ts | 6 +- ...th-profiles.ensureauthprofilestore.test.ts | 18 +- ...th-profiles.markauthprofilefailure.test.ts | 6 +- .../auth-profiles.readonly-sync.test.ts | 2 +- ...les.resolve-auth-profile-order.fixtures.ts | 4 +- ...uth-profiles.runtime-snapshot-save.test.ts | 2 +- src/agents/auth-profiles.store.save.test.ts | 2 +- src/agents/auth-profiles/display.ts | 4 +- src/agents/auth-profiles/doctor.ts | 4 +- .../oauth.fallback-to-main-agent.test.ts | 10 +- ...auth.openai-codex-refresh-fallback.test.ts | 10 +- src/agents/auth-profiles/oauth.test.ts | 4 +- src/agents/auth-profiles/oauth.ts | 10 +- src/agents/auth-profiles/order.ts | 6 +- src/agents/auth-profiles/paths.ts | 6 +- src/agents/auth-profiles/repair.ts | 8 +- .../auth-profiles/session-override.test.ts | 6 +- src/agents/auth-profiles/session-override.ts | 4 +- src/agents/auth-profiles/store.ts | 6 +- src/agents/auth-profiles/types.ts | 6 +- src/agents/auth-profiles/usage.test.ts | 2 +- src/agents/auth-profiles/usage.ts | 6 +- .../bash-tools.build-docker-exec-args.test.ts | 12 +- src/agents/bash-tools.exec-runtime.ts | 4 +- .../bash-tools.exec.approval-id.test.ts | 16 +- src/agents/bash-tools.exec.path.test.ts | 12 +- src/agents/bash-tools.exec.pty.test.ts | 6 +- .../bash-tools.exec.script-preflight.test.ts | 8 +- src/agents/bash-tools.shared.test.ts | 2 +- src/agents/bash-tools.shared.ts | 6 +- src/agents/bash-tools.test.ts | 2 +- src/agents/bootstrap-budget.test.ts | 2 +- src/agents/bootstrap-files.test.ts | 10 +- src/agents/bootstrap-files.ts | 6 +- src/agents/bootstrap-hooks.ts | 4 +- src/agents/btw.test.ts | 6 +- src/agents/btw.ts | 10 +- src/agents/cache-trace.test.ts | 10 +- src/agents/cache-trace.ts | 14 +- src/agents/channel-tools.test.ts | 10 +- src/agents/channel-tools.ts | 12 +- src/agents/claude-cli-runner.test.ts | 4 +- src/agents/cli-backends.test.ts | 10 +- src/agents/cli-backends.ts | 6 +- src/agents/cli-credentials.test.ts | 6 +- src/agents/cli-runner.bundle-mcp.e2e.test.ts | 8 +- src/agents/cli-runner.test.ts | 8 +- src/agents/cli-runner.ts | 12 +- src/agents/cli-runner/bundle-mcp.test.ts | 8 +- src/agents/cli-runner/bundle-mcp.ts | 6 +- src/agents/cli-runner/helpers.ts | 10 +- src/agents/command/delivery.ts | 4 +- src/agents/command/session-store.ts | 4 +- src/agents/command/session.ts | 6 +- src/agents/context-window-guard.test.ts | 8 +- src/agents/context-window-guard.ts | 4 +- src/agents/context.lookup.test.ts | 14 +- src/agents/context.ts | 20 +- src/agents/custom-api-registry.ts | 2 +- src/agents/docs-path.ts | 6 +- src/agents/embedded-pi-lsp.ts | 4 +- src/agents/embedded-pi-mcp.ts | 6 +- src/agents/failover-error.test.ts | 4 +- src/agents/fast-mode.ts | 8 +- src/agents/identity-avatar.test.ts | 18 +- src/agents/identity-avatar.ts | 6 +- src/agents/identity-file.test.ts | 4 +- src/agents/identity.human-delay.test.ts | 6 +- .../identity.per-channel-prefix.test.ts | 46 +- src/agents/identity.test.ts | 14 +- src/agents/identity.ts | 22 +- src/agents/image-sanitization.test.ts | 6 +- src/agents/image-sanitization.ts | 4 +- src/agents/internal-events.ts | 2 +- src/agents/kilocode-models.ts | 4 +- ...ol.test.ts => klawty-gateway-tool.test.ts} | 12 +- ...ts.test.ts => klawty-tools.agents.test.ts} | 6 +- ...ra.test.ts => klawty-tools.camera.test.ts} | 4 +- ... => klawty-tools.image-generation.test.ts} | 22 +- ... klawty-tools.owner-authorization.test.ts} | 6 +- ... => klawty-tools.pdf-registration.test.ts} | 12 +- ...ts => klawty-tools.plugin-context.test.ts} | 14 +- ...ts => klawty-tools.session-status.test.ts} | 6 +- ... klawty-tools.sessions-visibility.test.ts} | 6 +- ....test.ts => klawty-tools.sessions.test.ts} | 46 +- ...s => klawty-tools.subagents.scope.test.ts} | 6 +- ...ns-spawn-applies-thinking-default.test.ts} | 2 +- ...ions-spawn-default-timeout-absent.test.ts} | 2 +- ...ts.sessions-spawn-default-timeout.test.ts} | 2 +- ...gents.sessions-spawn-depth-limits.test.ts} | 2 +- ...ubagents.sessions-spawn.allowlist.test.ts} | 4 +- ...ubagents.sessions-spawn.cron-note.test.ts} | 2 +- ...ubagents.sessions-spawn.lifecycle.test.ts} | 12 +- ...ls.subagents.sessions-spawn.model.test.ts} | 4 +- ....subagents.sessions-spawn.test-harness.ts} | 8 +- ....steer-failure-clears-suppression.test.ts} | 6 +- ...=> klawty-tools.subagents.test-harness.ts} | 2 +- .../{openclaw-tools.ts => klawty-tools.ts} | 6 +- ...st.ts => klawty-tools.web-runtime.test.ts} | 18 +- src/agents/live-auth-keys.ts | 10 +- src/agents/memory-search.test.ts | 6 +- src/agents/memory-search.ts | 4 +- src/agents/minimax-vlm.ts | 2 +- src/agents/model-alias-lines.ts | 4 +- src/agents/model-auth-label.ts | 4 +- src/agents/model-auth.profiles.test.ts | 16 +- src/agents/model-auth.ts | 24 +- src/agents/model-catalog.test-harness.ts | 4 +- src/agents/model-catalog.test.ts | 18 +- src/agents/model-catalog.ts | 16 +- src/agents/model-fallback.probe.test.ts | 16 +- .../model-fallback.run-embedded.e2e.test.ts | 10 +- src/agents/model-fallback.test.ts | 20 +- src/agents/model-fallback.ts | 10 +- src/agents/model-id-normalization.ts | 2 +- src/agents/model-selection.test.ts | 54 +- src/agents/model-selection.ts | 30 +- ...els-config.applies-config-env-vars.test.ts | 14 +- ...s-github-copilot-provider-token-is.test.ts | 6 +- src/agents/models-config.e2e-harness.ts | 8 +- ...fault-baseurl-token-exchange-fails.test.ts | 6 +- src/agents/models-config.file-mode.test.ts | 14 +- ...ssing-provider-apikey-from-env-var.test.ts | 34 +- ...ini-3-ids-preview-google-providers.test.ts | 10 +- src/agents/models-config.plan.ts | 14 +- ...serves-explicit-reasoning-override.test.ts | 12 +- ...s-config.providers.auth-provenance.test.ts | 6 +- .../models-config.providers.chutes.test.ts | 12 +- ...ig.providers.cloudflare-ai-gateway.test.ts | 8 +- ...ls-config.providers.discovery-auth.test.ts | 2 +- .../models-config.providers.discovery.ts | 4 +- ...onfig.providers.google-antigravity.test.ts | 8 +- .../models-config.providers.kilocode.test.ts | 4 +- ...odels-config.providers.kimi-coding.test.ts | 8 +- .../models-config.providers.matrix.test.ts | 6 +- .../models-config.providers.minimax.test.ts | 2 +- .../models-config.providers.moonshot.test.ts | 6 +- ...ls-config.providers.normalize-keys.test.ts | 22 +- .../models-config.providers.nvidia.test.ts | 14 +- ...fig.providers.ollama-autodiscovery.test.ts | 6 +- .../models-config.providers.ollama.test.ts | 4 +- ...dels-config.providers.openai-codex.test.ts | 14 +- ....providers.plugin-allowlist-compat.test.ts | 4 +- .../models-config.providers.qianfan.test.ts | 2 +- src/agents/models-config.providers.ts | 8 +- ...config.providers.vercel-ai-gateway.test.ts | 6 +- ...nfig.providers.volcengine-byteplus.test.ts | 6 +- ...els-config.runtime-source-snapshot.test.ts | 40 +- ...s-writing-models-json-no-env-token.test.ts | 16 +- src/agents/models-config.test-utils.ts | 4 +- src/agents/models-config.ts | 20 +- ...-github-copilot-profile-env-tokens.test.ts | 12 +- .../models-config.write-serialization.test.ts | 4 +- src/agents/models.profiles.live.test.ts | 26 +- src/agents/openai-ws-connection.test.ts | 6 +- src/agents/owner-display.test.ts | 12 +- src/agents/owner-display.ts | 8 +- src/agents/path-policy.test.ts | 6 +- src/agents/pi-auth-json.test.ts | 2 +- src/agents/pi-auth-json.ts | 4 +- src/agents/pi-bundle-lsp-runtime.ts | 4 +- src/agents/pi-bundle-mcp-tools.test.ts | 10 +- src/agents/pi-bundle-mcp-tools.ts | 6 +- ...helpers.buildbootstrapcontextfiles.test.ts | 14 +- ...dded-helpers.isbillingerrormessage.test.ts | 4 +- src/agents/pi-embedded-helpers/bootstrap.ts | 8 +- src/agents/pi-embedded-helpers/errors.ts | 6 +- src/agents/pi-embedded-helpers/openai.ts | 2 +- ...i-embedded-runner-extraparams.live.test.ts | 4 +- .../pi-embedded-runner-extraparams.test.ts | 4 +- ...ed-runner.buildembeddedsandboxinfo.test.ts | 20 +- .../pi-embedded-runner.bundle-mcp.e2e.test.ts | 2 +- src/agents/pi-embedded-runner.e2e.test.ts | 2 +- ...s-back-provider-default-per-dm-not.test.ts | 12 +- ...-undefined-sessionkey-is-undefined.test.ts | 34 +- ...ner.history-limit-from-session-key.test.ts | 8 +- ...dded-runner.resolvesessionagentids.test.ts | 4 +- ...pi-agent.auth-profile-rotation.e2e.test.ts | 38 +- ...embedded-runner.sessions-yield.e2e.test.ts | 4 +- .../anthropic-stream-wrappers.ts | 4 +- src/agents/pi-embedded-runner/cache-ttl.ts | 2 +- .../compact.hooks.harness.ts | 14 +- .../pi-embedded-runner/compact.hooks.test.ts | 4 +- src/agents/pi-embedded-runner/compact.ts | 32 +- .../compaction-runtime-context.test.ts | 4 +- .../compaction-runtime-context.ts | 6 +- .../compaction-safety-timeout.ts | 4 +- .../pi-embedded-runner/extensions.test.ts | 10 +- src/agents/pi-embedded-runner/extensions.ts | 10 +- .../extra-params.kilocode.test.ts | 14 +- .../extra-params.openai.test.ts | 22 +- .../extra-params.test-support.ts | 4 +- src/agents/pi-embedded-runner/extra-params.ts | 6 +- .../extra-params.zai-tool-stream.test.ts | 4 +- src/agents/pi-embedded-runner/google.ts | 4 +- src/agents/pi-embedded-runner/history.ts | 6 +- src/agents/pi-embedded-runner/lanes.test.ts | 2 +- .../message-action-discovery-input.ts | 4 +- src/agents/pi-embedded-runner/model.test.ts | 50 +- src/agents/pi-embedded-runner/model.ts | 30 +- .../openrouter-model-capabilities.test.ts | 6 +- .../proxy-stream-wrappers.test.ts | 4 +- .../proxy-stream-wrappers.ts | 2 +- .../run.overflow-compaction.harness.ts | 4 +- src/agents/pi-embedded-runner/run.ts | 10 +- .../run/attempt.spawn-workspace.test.ts | 24 +- .../pi-embedded-runner/run/attempt.test.ts | 18 +- src/agents/pi-embedded-runner/run/attempt.ts | 32 +- .../pi-embedded-runner/run/images.test.ts | 10 +- src/agents/pi-embedded-runner/run/params.ts | 4 +- .../run/payloads.errors.test.ts | 2 +- src/agents/pi-embedded-runner/run/payloads.ts | 6 +- src/agents/pi-embedded-runner/runs.ts | 2 +- .../session-manager-cache.ts | 2 +- .../skills-runtime.integration.test.ts | 16 +- .../pi-embedded-runner/skills-runtime.test.ts | 8 +- .../pi-embedded-runner/skills-runtime.ts | 4 +- src/agents/pi-embedded-runner/utils.ts | 2 +- ...pi-embedded-subscribe.handlers.messages.ts | 2 +- .../pi-embedded-subscribe.raw-stream.ts | 4 +- .../pi-embedded-subscribe.tools.media.test.ts | 2 +- src/agents/pi-embedded-subscribe.tools.ts | 4 +- src/agents/pi-embedded-subscribe.types.ts | 4 +- ...d-utils.strip-model-special-tokens.test.ts | 2 +- src/agents/pi-embedded-utils.test.ts | 2 +- src/agents/pi-embedded-utils.ts | 2 +- .../compaction-safeguard.test.ts | 12 +- src/agents/pi-model-discovery.auth.test.ts | 10 +- src/agents/pi-model-discovery.ts | 2 +- src/agents/pi-project-settings.bundle.test.ts | 10 +- src/agents/pi-project-settings.ts | 10 +- src/agents/pi-settings.ts | 6 +- src/agents/pi-tools-agent-config.test.ts | 98 +- ...liases-schemas-without-dropping-b.test.ts} | 24 +- ...liases-schemas-without-dropping-d.test.ts} | 14 +- ...liases-schemas-without-dropping-f.test.ts} | 16 +- ...-aliases-schemas-without-dropping.test.ts} | 48 +- .../pi-tools.message-provider-policy.test.ts | 8 +- src/agents/pi-tools.policy.test.ts | 30 +- src/agents/pi-tools.policy.ts | 14 +- .../pi-tools.read.host-edit-access.test.ts | 2 +- .../pi-tools.read.host-edit-recovery.test.ts | 6 +- src/agents/pi-tools.read.ts | 10 +- src/agents/pi-tools.safe-bins.test.ts | 28 +- ...ndbox-mounted-paths.workspace-only.test.ts | 20 +- src/agents/pi-tools.ts | 20 +- .../pi-tools.whatsapp-login-gating.test.ts | 10 +- .../pi-tools.workspace-only-false.test.ts | 8 +- src/agents/pi-tools.workspace-paths.test.ts | 48 +- src/agents/prompt-composition-scenarios.ts | 12 +- src/agents/provider-attribution.test.ts | 52 +- src/agents/provider-attribution.ts | 18 +- src/agents/provider-capabilities.test.ts | 2 +- src/agents/provider-capabilities.ts | 8 +- src/agents/runtime-plugins.ts | 8 +- ....agent-specific-sandbox-config.e2e.test.ts | 44 +- src/agents/sandbox-create-args.test.ts | 70 +- src/agents/sandbox-explain.test.ts | 14 +- src/agents/sandbox-paths.test.ts | 60 +- src/agents/sandbox-paths.ts | 8 +- src/agents/sandbox-skills.test.ts | 12 +- .../sandbox.resolveSandboxContext.test.ts | 24 +- src/agents/sandbox/backend.ts | 6 +- src/agents/sandbox/browser.create.test.ts | 22 +- src/agents/sandbox/browser.ts | 40 +- src/agents/sandbox/config-hash.test.ts | 4 +- src/agents/sandbox/config.ts | 6 +- src/agents/sandbox/constants.ts | 12 +- src/agents/sandbox/context.ts | 10 +- .../sandbox/context.user-fallback.test.ts | 2 +- .../docker.config-hash-recreate.test.ts | 16 +- src/agents/sandbox/docker.ts | 20 +- src/agents/sandbox/docker.windows.test.ts | 2 +- .../sandbox/fs-bridge-mutation-helper.test.ts | 14 +- .../sandbox/fs-bridge-mutation-helper.ts | 4 +- .../fs-bridge-mutation-python-source.ts | 2 +- .../sandbox/fs-bridge.anchored-ops.test.ts | 8 +- src/agents/sandbox/fs-bridge.boundary.test.ts | 6 +- .../sandbox/fs-bridge.e2e-docker.test.ts | 6 +- src/agents/sandbox/fs-bridge.shell.test.ts | 10 +- src/agents/sandbox/fs-bridge.test-helpers.ts | 4 +- src/agents/sandbox/host-paths.test.ts | 2 +- src/agents/sandbox/novnc-auth.ts | 2 +- src/agents/sandbox/registry.test.ts | 8 +- src/agents/sandbox/runtime-status.ts | 12 +- src/agents/sandbox/sanitize-env-vars.ts | 2 +- src/agents/sandbox/ssh-backend.test.ts | 44 +- src/agents/sandbox/ssh-backend.ts | 12 +- src/agents/sandbox/ssh.test.ts | 2 +- src/agents/sandbox/ssh.ts | 12 +- src/agents/sandbox/test-fixtures.ts | 10 +- src/agents/sandbox/tool-policy.ts | 4 +- .../sandbox/validate-sandbox-security.test.ts | 14 +- .../sandbox/validate-sandbox-security.ts | 2 +- src/agents/sandbox/workspace.test.ts | 2 +- src/agents/session-file-repair.test.ts | 2 +- ...ult-guard.tool-result-persist-hook.test.ts | 16 +- ...ool-result-guard.transcript-events.test.ts | 2 +- ...sion-transcript-repair.attachments.test.ts | 6 +- src/agents/session-transcript-repair.test.ts | 2 +- src/agents/session-transcript-repair.ts | 6 +- src/agents/session-write-lock.test.ts | 16 +- src/agents/session-write-lock.ts | 6 +- src/agents/sessions-spawn-hooks.test.ts | 2 +- src/agents/sessions-spawn-threadid.test.ts | 2 +- src/agents/shell-utils.test.ts | 18 +- src/agents/skills-install-download.ts | 2 +- src/agents/skills-install-fallback.test.ts | 4 +- .../skills-install.download-test-utils.ts | 8 +- src/agents/skills-install.download.test.ts | 4 +- src/agents/skills-install.test.ts | 6 +- src/agents/skills-install.ts | 8 +- src/agents/skills-status.ts | 8 +- .../skills.agents-skills-directory.test.ts | 4 +- ...without-affecting-workspace-skills.test.ts | 2 +- ...rs-workspace-skills-managed-skills.test.ts | 14 +- ...erged-skills-into-target-workspace.test.ts | 4 +- ...skills.buildworkspaceskillsnapshot.test.ts | 2 +- .../skills.buildworkspaceskillstatus.test.ts | 4 +- src/agents/skills.compact-skill-paths.test.ts | 2 +- src/agents/skills.e2e-test-helpers.test.ts | 6 +- .../skills.loadworkspaceskillentries.test.ts | 6 +- .../skills.resolveskillspromptforrun.test.ts | 6 +- src/agents/skills.test.ts | 14 +- src/agents/skills.ts | 6 +- src/agents/skills/bundled-context.ts | 2 +- src/agents/skills/bundled-dir.test.ts | 14 +- src/agents/skills/bundled-dir.ts | 6 +- src/agents/skills/compact-format.test.ts | 4 +- src/agents/skills/config.ts | 12 +- src/agents/skills/env-overrides.ts | 8 +- src/agents/skills/frontmatter.test.ts | 16 +- src/agents/skills/frontmatter.ts | 30 +- src/agents/skills/plugin-skills.test.ts | 34 +- src/agents/skills/plugin-skills.ts | 4 +- src/agents/skills/refresh.ts | 8 +- src/agents/skills/types.ts | 4 +- src/agents/skills/workspace.ts | 38 +- src/agents/spawned-context.ts | 4 +- src/agents/subagent-announce-queue.test.ts | 8 +- ...-announce.capture-completion-reply.test.ts | 8 +- .../subagent-announce.format.e2e.test.ts | 20 +- src/agents/subagent-announce.ts | 8 +- src/agents/subagent-attachments.ts | 10 +- src/agents/subagent-capabilities.ts | 6 +- src/agents/subagent-control.test.ts | 10 +- src/agents/subagent-control.ts | 24 +- src/agents/subagent-depth.test.ts | 2 +- src/agents/subagent-depth.ts | 8 +- src/agents/subagent-orphan-recovery.test.ts | 2 +- src/agents/subagent-orphan-recovery.ts | 6 +- .../subagent-registry.persistence.test.ts | 28 +- src/agents/subagent-registry.store.ts | 4 +- src/agents/subagent-spawn.attachments.test.ts | 16 +- src/agents/system-prompt-params.test.ts | 10 +- src/agents/system-prompt-params.ts | 6 +- src/agents/system-prompt-stability.test.ts | 2 +- src/agents/system-prompt.test.ts | 110 +- src/agents/system-prompt.ts | 46 +- .../model-fallback-config-fixture.ts | 6 +- .../pi-embedded-runner-e2e-fixtures.ts | 4 +- .../pi-tools-sandbox-context.test.ts | 6 +- .../test-helpers/pi-tools-sandbox-context.ts | 10 +- .../sandbox-agent-config-fixtures.ts | 10 +- src/agents/test-helpers/session-config.ts | 6 +- .../test-helpers/skill-plugin-fixtures.ts | 2 +- .../test-helpers/unsafe-mounted-sandbox.ts | 2 +- src/agents/timeout.ts | 6 +- src/agents/tool-catalog.ts | 48 +- src/agents/tool-display-common.ts | 6 +- src/agents/tool-display.test.ts | 16 +- src/agents/tool-display.ts | 2 +- src/agents/tool-fs-policy.test.ts | 8 +- src/agents/tool-fs-policy.ts | 6 +- src/agents/tool-images.ts | 2 +- src/agents/tool-policy.test.ts | 12 +- src/agents/tools/agents-list-tool.ts | 2 +- src/agents/tools/browser-tool.test.ts | 8 +- src/agents/tools/browser-tool.ts | 6 +- src/agents/tools/canvas-tool.ts | 4 +- src/agents/tools/cron-tool.ts | 2 +- src/agents/tools/gateway-tool.ts | 4 +- src/agents/tools/gateway.test.ts | 30 +- src/agents/tools/gateway.ts | 2 +- src/agents/tools/image-generate-tool.ts | 12 +- src/agents/tools/image-tool.helpers.ts | 6 +- src/agents/tools/image-tool.test.ts | 48 +- src/agents/tools/image-tool.ts | 12 +- src/agents/tools/media-tool-shared.ts | 16 +- .../tools/memory-tool.citations.test.ts | 8 +- src/agents/tools/memory-tool.test-helpers.ts | 16 +- src/agents/tools/memory-tool.ts | 16 +- src/agents/tools/message-tool.ts | 14 +- src/agents/tools/model-config.helpers.ts | 4 +- src/agents/tools/nodes-tool.ts | 4 +- src/agents/tools/pdf-tool.helpers.ts | 4 +- src/agents/tools/pdf-tool.test.ts | 30 +- src/agents/tools/pdf-tool.ts | 12 +- src/agents/tools/session-status-tool.ts | 8 +- src/agents/tools/sessions-access.test.ts | 26 +- src/agents/tools/sessions-access.ts | 12 +- src/agents/tools/sessions-helpers.ts | 4 +- src/agents/tools/sessions-history-tool.ts | 4 +- src/agents/tools/sessions-list-tool.ts | 4 +- src/agents/tools/sessions-resolution.test.ts | 8 +- src/agents/tools/sessions-resolution.ts | 4 +- src/agents/tools/sessions-send-helpers.ts | 4 +- src/agents/tools/sessions-send-tool.ts | 4 +- src/agents/tools/sessions.test.ts | 12 +- src/agents/tools/tool-runtime.helpers.ts | 2 +- src/agents/tools/tts-tool.ts | 4 +- src/agents/tools/web-fetch.ts | 8 +- .../tools/web-search-provider-common.ts | 6 +- .../tools/web-search-provider-config.ts | 16 +- src/agents/tools/web-search.ts | 4 +- .../tools/web-tools.enabled-defaults.test.ts | 10 +- src/agents/venice-models.ts | 2 +- src/agents/workspace-dirs.ts | 4 +- src/agents/workspace-run.test.ts | 10 +- src/agents/workspace-run.ts | 6 +- src/agents/workspace-templates.test.ts | 6 +- src/agents/workspace-templates.ts | 4 +- src/agents/workspace.bootstrap-cache.test.ts | 6 +- src/agents/workspace.defaults.test.ts | 8 +- ...rkspace.load-extra-bootstrap-files.test.ts | 2 +- src/agents/workspace.test.ts | 32 +- src/agents/workspace.ts | 8 +- src/agents/xai.live.test.ts | 2 +- src/auto-reply/chunk.ts | 6 +- .../command-auth.owner-default.test.ts | 14 +- src/auto-reply/command-auth.ts | 16 +- src/auto-reply/command-control.test.ts | 40 +- src/auto-reply/command-detection.ts | 8 +- src/auto-reply/commands-registry.data.ts | 4 +- src/auto-reply/commands-registry.test.ts | 12 +- src/auto-reply/commands-registry.ts | 22 +- src/auto-reply/commands-registry.types.ts | 6 +- src/auto-reply/dispatch.test.ts | 4 +- src/auto-reply/dispatch.ts | 8 +- src/auto-reply/envelope.ts | 4 +- src/auto-reply/heartbeat-reply-payload.ts | 2 +- src/auto-reply/inbound-debounce.ts | 4 +- src/auto-reply/inbound.test.ts | 32 +- src/auto-reply/reply.block-streaming.test.ts | 14 +- ...ng-mixed-messages-acks-immediately.test.ts | 2 +- ...irective.directive-behavior.e2e-harness.ts | 10 +- ...tches-fuzzy-selection-is-ambiguous.test.ts | 16 +- ...rrent-verbose-level-verbose-has-no.test.ts | 6 +- src/auto-reply/reply.heartbeat-typing.test.ts | 8 +- src/auto-reply/reply.media-note.test.ts | 10 +- src/auto-reply/reply.raw-body.test.ts | 8 +- ...tage-sandbox-media.scp-remote-path.test.ts | 6 +- src/auto-reply/reply.test-harness.ts | 18 +- ...ge-summary-current-model-provider.cases.ts | 4 +- ...bound-media-into-sandbox-workspace.test.ts | 10 +- ...ets-active-session-native-stop.e2e.test.ts | 10 +- ....triggers.trigger-handling.test-harness.ts | 30 +- src/auto-reply/reply/abort.test.ts | 28 +- src/auto-reply/reply/abort.ts | 12 +- src/auto-reply/reply/acp-projector.ts | 4 +- src/auto-reply/reply/acp-reset-target.ts | 4 +- src/auto-reply/reply/acp-stream-settings.ts | 10 +- .../reply/agent-runner-execution.ts | 6 +- src/auto-reply/reply/agent-runner-helpers.ts | 2 +- src/auto-reply/reply/agent-runner-memory.ts | 4 +- src/auto-reply/reply/agent-runner-payloads.ts | 2 +- src/auto-reply/reply/agent-runner-utils.ts | 4 +- .../agent-runner.misc.runreplyagent.test.ts | 20 +- .../agent-runner.runreplyagent.e2e.test.ts | 6 +- src/auto-reply/reply/bash-command.ts | 10 +- src/auto-reply/reply/block-reply-coalescer.ts | 2 +- src/auto-reply/reply/block-reply-pipeline.ts | 2 +- src/auto-reply/reply/block-streaming.test.ts | 6 +- src/auto-reply/reply/block-streaming.ts | 12 +- src/auto-reply/reply/commands-acp.test.ts | 32 +- .../reply/commands-acp/context.test.ts | 4 +- .../reply/commands-acp/diagnostics.ts | 4 +- .../reply/commands-acp/install-hints.test.ts | 14 +- .../reply/commands-acp/install-hints.ts | 10 +- .../reply/commands-acp/lifecycle.ts | 8 +- src/auto-reply/reply/commands-acp/shared.ts | 2 +- src/auto-reply/reply/commands-allowlist.ts | 8 +- src/auto-reply/reply/commands-approve.ts | 2 +- src/auto-reply/reply/commands-btw.test.ts | 4 +- src/auto-reply/reply/commands-compact.ts | 4 +- src/auto-reply/reply/commands-context.ts | 4 +- src/auto-reply/reply/commands-core.test.ts | 8 +- .../reply/commands-export-session.ts | 2 +- src/auto-reply/reply/commands-mcp.test.ts | 12 +- src/auto-reply/reply/commands-models.ts | 12 +- src/auto-reply/reply/commands-plugins.test.ts | 14 +- src/auto-reply/reply/commands-plugins.ts | 12 +- .../reply/commands-session-lifecycle.test.ts | 4 +- src/auto-reply/reply/commands-session.ts | 8 +- .../reply/commands-spawn.test-harness.ts | 4 +- src/auto-reply/reply/commands-status.ts | 4 +- .../reply/commands-subagents-focus.test.ts | 4 +- .../reply/commands-subagents-spawn.test.ts | 4 +- .../reply/commands-system-prompt.test.ts | 12 +- .../reply/commands-system-prompt.ts | 4 +- src/auto-reply/reply/commands-types.ts | 4 +- src/auto-reply/reply/commands.test-harness.ts | 4 +- src/auto-reply/reply/commands.test.ts | 150 +- .../reply/config-write-authorization.ts | 4 +- .../reply/directive-handling.auth.test.ts | 4 +- .../reply/directive-handling.auth.ts | 6 +- .../reply/directive-handling.impl.ts | 4 +- .../reply/directive-handling.model-picker.ts | 4 +- .../reply/directive-handling.model.test.ts | 12 +- .../reply/directive-handling.model.ts | 10 +- .../reply/directive-handling.params.ts | 6 +- .../reply/directive-handling.parse.ts | 4 +- .../reply/directive-handling.persist.ts | 8 +- .../directive-handling.queue-validation.ts | 4 +- .../reply/directive-handling.shared.ts | 2 +- src/auto-reply/reply/dispatch-acp-delivery.ts | 6 +- src/auto-reply/reply/dispatch-acp.test.ts | 22 +- src/auto-reply/reply/dispatch-acp.ts | 6 +- .../reply/dispatch-from-config.test.ts | 118 +- src/auto-reply/reply/dispatch-from-config.ts | 8 +- src/auto-reply/reply/elevated-unavailable.ts | 2 +- src/auto-reply/reply/followup-runner.test.ts | 10 +- src/auto-reply/reply/followup-runner.ts | 2 +- .../reply/get-reply-directives-apply.ts | 6 +- src/auto-reply/reply/get-reply-directives.ts | 6 +- .../reply/get-reply-inline-actions.ts | 8 +- src/auto-reply/reply/get-reply-run.ts | 10 +- .../reply/get-reply.message-hooks.test.ts | 4 +- src/auto-reply/reply/get-reply.ts | 6 +- src/auto-reply/reply/groups.ts | 8 +- src/auto-reply/reply/inbound-dedupe.ts | 2 +- src/auto-reply/reply/inbound-meta.test.ts | 8 +- src/auto-reply/reply/inbound-meta.ts | 4 +- src/auto-reply/reply/memory-flush.test.ts | 4 +- src/auto-reply/reply/memory-flush.ts | 8 +- src/auto-reply/reply/mentions.ts | 8 +- .../reply/message-preprocess-hooks.test.ts | 10 +- .../reply/message-preprocess-hooks.ts | 4 +- src/auto-reply/reply/model-selection.test.ts | 22 +- src/auto-reply/reply/model-selection.ts | 8 +- .../reply/post-compaction-context.test.ts | 18 +- .../reply/post-compaction-context.ts | 4 +- src/auto-reply/reply/provider-dispatcher.ts | 6 +- src/auto-reply/reply/queue/drain.ts | 2 +- src/auto-reply/reply/queue/enqueue.ts | 2 +- src/auto-reply/reply/queue/state.ts | 2 +- src/auto-reply/reply/queue/types.ts | 6 +- src/auto-reply/reply/reply-delivery.ts | 2 +- src/auto-reply/reply/reply-elevated.test.ts | 6 +- src/auto-reply/reply/reply-elevated.ts | 6 +- src/auto-reply/reply/reply-flow.test.ts | 16 +- src/auto-reply/reply/reply-media-paths.ts | 6 +- src/auto-reply/reply/reply-plumbing.test.ts | 6 +- src/auto-reply/reply/reply-state.test.ts | 2 +- src/auto-reply/reply/reply-threading.ts | 4 +- src/auto-reply/reply/reply-utils.test.ts | 18 +- src/auto-reply/reply/route-reply.test.ts | 18 +- src/auto-reply/reply/route-reply.ts | 4 +- src/auto-reply/reply/session-delivery.ts | 2 +- src/auto-reply/reply/session-fork.ts | 4 +- .../reply/session-hooks-context.test.ts | 10 +- src/auto-reply/reply/session-hooks.ts | 8 +- src/auto-reply/reply/session-reset-model.ts | 4 +- .../reply/session-reset-prompt.test.ts | 4 +- src/auto-reply/reply/session-reset-prompt.ts | 4 +- src/auto-reply/reply/session-updates.ts | 12 +- src/auto-reply/reply/session-usage.ts | 6 +- src/auto-reply/reply/session.test.ts | 180 +- src/auto-reply/reply/session.ts | 8 +- src/auto-reply/reply/stage-sandbox-media.ts | 10 +- src/auto-reply/reply/streaming-directives.ts | 2 +- src/auto-reply/reply/strip-inbound-meta.ts | 4 +- .../reply/test-fixtures/acp-runtime.ts | 6 +- src/auto-reply/skill-commands.test.ts | 16 +- src/auto-reply/skill-commands.ts | 6 +- .../stage-sandbox-media.test-harness.ts | 8 +- src/auto-reply/status.test.ts | 32 +- src/auto-reply/status.ts | 24 +- src/auto-reply/templating.ts | 4 +- src/browser/bridge-server.auth.test.ts | 16 +- src/browser/bridge-server.ts | 2 +- src/browser/browser-utils.test.ts | 18 +- src/browser/cdp-proxy-bypass.ts | 2 +- src/browser/chrome-mcp.test.ts | 6 +- src/browser/chrome-mcp.ts | 4 +- .../chrome-user-data-dir.test-harness.ts | 2 +- src/browser/chrome.profile-decoration.ts | 12 +- src/browser/chrome.test.ts | 40 +- src/browser/chrome.ts | 28 +- .../client-fetch.loopback-auth.test.ts | 4 +- src/browser/client-fetch.ts | 12 +- src/browser/client.ts | 6 +- src/browser/config.test.ts | 60 +- src/browser/config.ts | 30 +- src/browser/constants.ts | 8 +- src/browser/control-auth.auto-token.test.ts | 18 +- src/browser/control-auth.test.ts | 18 +- src/browser/control-auth.ts | 6 +- src/browser/http-auth.ts | 2 +- src/browser/output-atomic.ts | 2 +- src/browser/paths.test.ts | 2 +- src/browser/paths.ts | 4 +- src/browser/profiles-service.test.ts | 24 +- src/browser/profiles-service.ts | 14 +- src/browser/profiles.test.ts | 10 +- src/browser/profiles.ts | 4 +- src/browser/proxy-files.test.ts | 6 +- .../pw-session.browserless.live.test.ts | 4 +- src/browser/pw-tools-core.downloads.ts | 4 +- ...-core.interactions.set-input-files.test.ts | 16 +- src/browser/pw-tools-core.interactions.ts | 10 +- src/browser/pw-tools-core.responses.ts | 2 +- ...-core.waits-next-download-saves-it.test.ts | 24 +- src/browser/routes/agent.act.hooks.ts | 4 +- src/browser/routes/agent.act.ts | 2 +- .../routes/agent.snapshot.plan.test.ts | 2 +- src/browser/routes/agent.snapshot.ts | 2 +- src/browser/routes/basic.ts | 8 +- src/browser/server-context.availability.ts | 20 +- .../server-context.chrome-test-harness.ts | 8 +- ...wser-available.waits-for-cdp-ready.test.ts | 34 +- .../server-context.existing-session.test.ts | 10 +- ...server-context.hot-reload-profiles.test.ts | 26 +- .../server-context.loopback-direct-ws.test.ts | 30 +- ...er-context.remote-profile-tab-ops.suite.ts | 18 +- .../server-context.remote-tab-ops.harness.ts | 4 +- src/browser/server-context.reset.test.ts | 30 +- src/browser/server-context.reset.ts | 6 +- ...erver-context.tab-selection-state.suite.ts | 34 +- src/browser/server-context.ts | 4 +- src/browser/server-lifecycle.test.ts | 20 +- src/browser/server-lifecycle.ts | 6 +- ...-contract-form-layout-act-commands.test.ts | 2 +- .../server.control-server.test-harness.ts | 42 +- ...te-disabled-does-not-block-storage.test.ts | 28 +- ...s-open-profile-unknown-returns-404.test.ts | 6 +- src/browser/server.ts | 2 +- src/browser/session-tab-registry.test.ts | 8 +- src/canvas-host/a2ui.ts | 22 +- src/canvas-host/server.state-dir.test.ts | 6 +- src/canvas-host/server.test.ts | 20 +- src/canvas-host/server.ts | 26 +- src/channels/account-summary.ts | 10 +- src/channels/allowlists/resolve-utils.ts | 2 +- src/channels/config-presence.test.ts | 4 +- src/channels/config-presence.ts | 6 +- src/channels/inbound-debounce-policy.ts | 6 +- src/channels/model-overrides.test.ts | 8 +- src/channels/model-overrides.ts | 4 +- src/channels/plugins/account-helpers.test.ts | 16 +- src/channels/plugins/account-helpers.ts | 10 +- .../acp-configured-binding-consumer.ts | 8 +- .../plugins/acp-stateful-target-driver.ts | 10 +- src/channels/plugins/actions/actions.test.ts | 74 +- src/channels/plugins/binding-routing.ts | 6 +- src/channels/plugins/binding-targets.ts | 8 +- src/channels/plugins/catalog.ts | 18 +- src/channels/plugins/config-helpers.ts | 22 +- src/channels/plugins/config-writes.ts | 6 +- .../plugins/configured-binding-compiler.ts | 12 +- .../plugins/configured-binding-consumers.ts | 4 +- .../plugins/configured-binding-registry.ts | 12 +- .../contracts/inbound.contract.test.ts | 14 +- src/channels/plugins/contracts/registry.ts | 52 +- src/channels/plugins/contracts/suites.ts | 34 +- .../plugins/directory-config-helpers.ts | 10 +- src/channels/plugins/directory-types.ts | 4 +- src/channels/plugins/exec-approval-local.ts | 4 +- src/channels/plugins/group-policy-warnings.ts | 36 +- src/channels/plugins/helpers.test.ts | 10 +- src/channels/plugins/helpers.ts | 10 +- src/channels/plugins/media-limits.ts | 6 +- .../plugins/message-action-discovery.ts | 18 +- .../plugins/message-actions.security.test.ts | 8 +- src/channels/plugins/message-actions.test.ts | 42 +- .../plugins/message-capability-matrix.test.ts | 26 +- .../plugins/outbound/direct-text-media.ts | 16 +- .../plugins/outbound/imessage.test.ts | 4 +- src/channels/plugins/outbound/signal.test.ts | 4 +- src/channels/plugins/outbound/slack.test.ts | 8 +- src/channels/plugins/pairing-message.ts | 2 +- src/channels/plugins/pairing.ts | 4 +- src/channels/plugins/plugins-channel.test.ts | 6 +- src/channels/plugins/plugins-core.test.ts | 64 +- .../setup-group-access-configure.test.ts | 36 +- .../plugins/setup-group-access-configure.ts | 12 +- src/channels/plugins/setup-helpers.test.ts | 6 +- src/channels/plugins/setup-helpers.ts | 44 +- src/channels/plugins/setup-wizard-binary.ts | 6 +- .../plugins/setup-wizard-helpers.test.ts | 58 +- src/channels/plugins/setup-wizard-helpers.ts | 146 +- src/channels/plugins/setup-wizard-proxy.ts | 4 +- src/channels/plugins/setup-wizard-types.ts | 30 +- src/channels/plugins/setup-wizard.ts | 92 +- .../plugins/stateful-target-drivers.ts | 12 +- .../plugins/status-issues/bluebubbles.ts | 2 +- src/channels/plugins/status.ts | 10 +- .../plugins/threading-helpers.test.ts | 14 +- src/channels/plugins/threading-helpers.ts | 4 +- src/channels/plugins/types.adapters.ts | 120 +- src/channels/plugins/types.core.ts | 40 +- .../plugins/whatsapp-heartbeat.test.ts | 10 +- src/channels/plugins/whatsapp-heartbeat.ts | 6 +- ...ad-only-account-inspect.discord.runtime.ts | 6 +- ...read-only-account-inspect.slack.runtime.ts | 6 +- ...d-only-account-inspect.telegram.runtime.ts | 6 +- src/channels/read-only-account-inspect.ts | 4 +- src/channels/registry.helpers.test.ts | 2 +- src/channels/registry.ts | 4 +- src/channels/reply-prefix.ts | 6 +- src/channels/session-envelope.ts | 4 +- src/channels/session-meta.ts | 4 +- src/channels/session.test.ts | 8 +- src/channels/thread-bindings-policy.ts | 12 +- src/cli/acp-cli.option-collisions.test.ts | 8 +- src/cli/acp-cli.ts | 4 +- src/cli/argv.test.ts | 168 +- src/cli/argv.ts | 4 +- src/cli/banner.test.ts | 6 +- src/cli/banner.ts | 8 +- .../register.files-downloads.ts | 6 +- src/cli/browser-cli-debug.ts | 2 +- src/cli/browser-cli-examples.ts | 58 +- src/cli/browser-cli-manage.test.ts | 2 +- .../browser-cli-manage.timeout-option.test.ts | 2 +- src/cli/browser-cli-manage.ts | 12 +- src/cli/browser-cli.ts | 6 +- src/cli/channel-auth.test.ts | 4 +- src/cli/channel-auth.ts | 8 +- src/cli/channel-options.test.ts | 4 +- src/cli/channels-cli.ts | 10 +- src/cli/clawbot-cli.ts | 2 +- src/cli/cli-name.ts | 4 +- src/cli/cli-utils.test.ts | 10 +- src/cli/command-format.ts | 4 +- src/cli/command-secret-gateway.test.ts | 36 +- src/cli/command-secret-gateway.ts | 22 +- src/cli/command-secret-targets.ts | 4 +- src/cli/completion-cli.test.ts | 16 +- src/cli/completion-cli.ts | 22 +- src/cli/completion-fish.test.ts | 12 +- src/cli/config-cli.integration.test.ts | 52 +- src/cli/config-cli.test.ts | 160 +- src/cli/config-cli.ts | 28 +- src/cli/config-set-input.test.ts | 4 +- src/cli/cron-cli/register.ts | 2 +- src/cli/daemon-cli.coverage.test.ts | 36 +- .../daemon-cli/gateway-token-drift.test.ts | 14 +- src/cli/daemon-cli/gateway-token-drift.ts | 4 +- .../daemon-cli/install.integration.test.ts | 22 +- src/cli/daemon-cli/install.test.ts | 20 +- src/cli/daemon-cli/install.ts | 2 +- src/cli/daemon-cli/lifecycle-core.test.ts | 10 +- src/cli/daemon-cli/lifecycle-core.ts | 6 +- src/cli/daemon-cli/lifecycle.test.ts | 22 +- src/cli/daemon-cli/lifecycle.ts | 14 +- src/cli/daemon-cli/register.ts | 2 +- src/cli/daemon-cli/restart-health.test.ts | 26 +- src/cli/daemon-cli/restart-health.ts | 4 +- src/cli/daemon-cli/shared.ts | 22 +- src/cli/daemon-cli/status.gather.test.ts | 46 +- src/cli/daemon-cli/status.gather.ts | 10 +- src/cli/daemon-cli/status.print.test.ts | 18 +- src/cli/daemon-cli/status.print.ts | 16 +- src/cli/daemon-cli/status.test.ts | 4 +- .../test-helpers/lifecycle-core-harness.ts | 4 +- src/cli/devices-cli.test.ts | 6 +- src/cli/directory-cli.ts | 10 +- src/cli/dns-cli.ts | 10 +- src/cli/docs-cli.ts | 4 +- src/cli/exec-approvals-cli.ts | 12 +- src/cli/gateway-cli.coverage.test.ts | 16 +- src/cli/gateway-cli/call.ts | 4 +- src/cli/gateway-cli/dev.ts | 4 +- src/cli/gateway-cli/discover.ts | 6 +- .../register.option-collisions.test.ts | 4 +- src/cli/gateway-cli/register.ts | 10 +- src/cli/gateway-cli/run-loop.test.ts | 16 +- src/cli/gateway-cli/run-loop.ts | 2 +- .../gateway-cli/run.option-collisions.test.ts | 32 +- src/cli/gateway-cli/run.ts | 24 +- src/cli/gateway-cli/shared.ts | 10 +- src/cli/hooks-cli.test.ts | 6 +- src/cli/hooks-cli.ts | 18 +- src/cli/logs-cli.test.ts | 6 +- src/cli/logs-cli.ts | 6 +- src/cli/mcp-cli.test.ts | 6 +- src/cli/mcp-cli.ts | 2 +- src/cli/memory-cli.test.ts | 8 +- src/cli/memory-cli.ts | 14 +- src/cli/models-cli.ts | 6 +- src/cli/node-cli/daemon.ts | 12 +- src/cli/node-cli/register.ts | 12 +- src/cli/nodes-camera.test.ts | 10 +- src/cli/nodes-cli/register.canvas.ts | 2 +- ....invoke.nodes-run-approval-timeout.test.ts | 2 +- src/cli/nodes-cli/register.push.ts | 4 +- src/cli/nodes-cli/register.ts | 10 +- src/cli/nodes-media-utils.ts | 4 +- src/cli/nodes-screen.ts | 2 +- src/cli/npm-resolution.test.ts | 68 +- src/cli/pairing-cli.ts | 6 +- src/cli/plugin-install-plan.test.ts | 20 +- src/cli/plugin-registry.test.ts | 12 +- src/cli/plugin-registry.ts | 4 +- src/cli/plugins-cli.test.ts | 62 +- src/cli/plugins-cli.ts | 26 +- src/cli/plugins-config.test.ts | 8 +- src/cli/profile.test.ts | 102 +- src/cli/profile.ts | 18 +- src/cli/program.force.test.ts | 42 +- src/cli/program.nodes-media.e2e.test.ts | 12 +- src/cli/program/action-reparse.test.ts | 24 +- src/cli/program/build-program.test.ts | 2 +- .../build-program.version-alias.test.ts | 4 +- src/cli/program/command-registry.test.ts | 12 +- src/cli/program/command-registry.ts | 4 +- src/cli/program/config-guard.test.ts | 2 +- src/cli/program/config-guard.ts | 10 +- src/cli/program/core-command-descriptors.ts | 4 +- src/cli/program/help.test.ts | 16 +- src/cli/program/help.ts | 26 +- src/cli/program/preaction.test.ts | 40 +- src/cli/program/preaction.ts | 4 +- src/cli/program/program-context.ts | 2 +- src/cli/program/register.agent.test.ts | 8 +- src/cli/program/register.agent.ts | 24 +- src/cli/program/register.backup.test.ts | 4 +- src/cli/program/register.backup.ts | 20 +- src/cli/program/register.configure.ts | 2 +- src/cli/program/register.maintenance.ts | 8 +- src/cli/program/register.message.ts | 10 +- src/cli/program/register.onboard.test.ts | 8 +- src/cli/program/register.onboard.ts | 6 +- src/cli/program/register.setup.ts | 6 +- .../register.status-health-sessions.ts | 42 +- src/cli/program/register.subclis.test.ts | 18 +- src/cli/program/register.subclis.ts | 14 +- src/cli/program/routes.test.ts | 72 +- src/cli/program/subcli-descriptors.ts | 6 +- src/cli/qr-cli.test.ts | 14 +- src/cli/qr-cli.ts | 8 +- src/cli/qr-dashboard.integration.test.ts | 24 +- src/cli/route.test.ts | 14 +- src/cli/route.ts | 2 +- src/cli/run-main.exit.test.ts | 8 +- src/cli/run-main.profile-env.test.ts | 32 +- src/cli/run-main.test.ts | 50 +- src/cli/run-main.ts | 6 +- src/cli/sandbox-cli.ts | 38 +- src/cli/secrets-cli.test.ts | 18 +- src/cli/secrets-cli.ts | 2 +- src/cli/security-cli.test.ts | 4 +- src/cli/security-cli.ts | 20 +- src/cli/send-runtime/discord.ts | 4 +- src/cli/send-runtime/slack.ts | 4 +- src/cli/send-runtime/telegram.ts | 4 +- src/cli/skills-cli.format.ts | 4 +- src/cli/skills-cli.formatting.test.ts | 10 +- src/cli/skills-cli.ts | 2 +- src/cli/system-cli.ts | 2 +- src/cli/tagline.test.ts | 4 +- src/cli/tagline.ts | 6 +- src/cli/tui-cli.ts | 2 +- src/cli/update-cli.test.ts | 102 +- src/cli/update-cli.ts | 38 +- src/cli/update-cli/progress.test.ts | 2 +- src/cli/update-cli/progress.ts | 8 +- src/cli/update-cli/restart-helper.test.ts | 72 +- src/cli/update-cli/restart-helper.ts | 18 +- .../update-cli/shared.command-runner.test.ts | 8 +- src/cli/update-cli/shared.ts | 22 +- src/cli/update-cli/status.ts | 2 +- src/cli/update-cli/update-command.ts | 26 +- src/cli/update-cli/wizard.ts | 6 +- src/cli/webhooks-cli.ts | 12 +- src/commands/agent-via-gateway.test.ts | 8 +- src/commands/agent-via-gateway.ts | 4 +- src/commands/agent.acp.test.ts | 18 +- src/commands/agent.delivery.test.ts | 4 +- src/commands/agent.test.ts | 30 +- src/commands/agent/session-store.test.ts | 4 +- src/commands/agent/session.test.ts | 4 +- src/commands/agents.bindings.ts | 18 +- src/commands/agents.command-shared.ts | 4 +- src/commands/agents.commands.add.ts | 4 +- src/commands/agents.commands.list.ts | 2 +- src/commands/agents.config.ts | 18 +- src/commands/agents.identity.test.ts | 14 +- src/commands/agents.providers.ts | 12 +- src/commands/agents.test.ts | 16 +- src/commands/auth-choice-options.ts | 12 +- src/commands/auth-choice-prompt.ts | 4 +- .../auth-choice.apply.plugin-provider.test.ts | 4 +- src/commands/auth-choice.apply.ts | 6 +- src/commands/auth-choice.default-model.ts | 10 +- src/commands/auth-choice.model-check.ts | 4 +- src/commands/auth-choice.moonshot.test.ts | 10 +- src/commands/auth-choice.test.ts | 14 +- src/commands/backup-shared.ts | 4 +- src/commands/backup-verify.test.ts | 46 +- src/commands/backup.atomic.test.ts | 20 +- src/commands/backup.test.ts | 70 +- src/commands/channel-account-context.test.ts | 12 +- src/commands/channel-account-context.ts | 4 +- .../channel-plugin-resolution.ts | 12 +- src/commands/channel-setup/discovery.ts | 10 +- .../channel-setup/plugin-install.test.ts | 80 +- src/commands/channel-setup/plugin-install.ts | 22 +- src/commands/channels.add.test.ts | 18 +- ....adds-non-default-telegram-account.test.ts | 6 +- src/commands/channels.remove.test.ts | 8 +- src/commands/channels/add-mutators.ts | 10 +- src/commands/channels/add.ts | 6 +- src/commands/channels/capabilities.test.ts | 4 +- src/commands/channels/capabilities.ts | 4 +- src/commands/channels/remove.ts | 4 +- src/commands/channels/shared.ts | 4 +- src/commands/channels/status.ts | 8 +- src/commands/chutes-oauth.ts | 2 +- src/commands/cleanup-plan.ts | 4 +- src/commands/cleanup-utils.test.ts | 38 +- src/commands/cleanup-utils.ts | 6 +- src/commands/config-validation.ts | 8 +- src/commands/configure.channels.ts | 12 +- src/commands/configure.daemon.test.ts | 14 +- src/commands/configure.gateway-auth.test.ts | 2 +- src/commands/configure.gateway-auth.ts | 8 +- src/commands/configure.gateway.test.ts | 38 +- src/commands/configure.gateway.ts | 18 +- src/commands/configure.wizard.test.ts | 14 +- src/commands/configure.wizard.ts | 46 +- src/commands/daemon-install-helpers.test.ts | 28 +- src/commands/daemon-install-helpers.ts | 8 +- .../daemon-install-plan.shared.test.ts | 6 +- src/commands/dashboard.links.test.ts | 30 +- src/commands/dashboard.test.ts | 14 +- src/commands/dashboard.ts | 8 +- src/commands/docs.ts | 10 +- ...octor-auth.deprecated-cli-profiles.test.ts | 10 +- src/commands/doctor-auth.ts | 18 +- src/commands/doctor-bootstrap-size.test.ts | 6 +- src/commands/doctor-bootstrap-size.ts | 4 +- src/commands/doctor-browser.test.ts | 2 +- src/commands/doctor-browser.ts | 14 +- src/commands/doctor-completion.ts | 12 +- src/commands/doctor-config-analysis.ts | 12 +- ...w.missing-default-account-bindings.test.ts | 12 +- ...w.missing-explicit-default-account.test.ts | 16 +- .../doctor-config-flow.safe-bins.test.ts | 4 +- src/commands/doctor-config-flow.test-utils.ts | 4 +- src/commands/doctor-config-flow.test.ts | 8 +- src/commands/doctor-config-flow.ts | 76 +- src/commands/doctor-config-preflight.ts | 8 +- src/commands/doctor-cron.test.ts | 6 +- src/commands/doctor-cron.ts | 6 +- src/commands/doctor-format.ts | 10 +- .../doctor-gateway-auth-token.test.ts | 38 +- src/commands/doctor-gateway-auth-token.ts | 4 +- .../doctor-gateway-daemon-flow.test.ts | 8 +- src/commands/doctor-gateway-daemon-flow.ts | 10 +- src/commands/doctor-gateway-health.ts | 6 +- src/commands/doctor-gateway-services.test.ts | 80 +- src/commands/doctor-gateway-services.ts | 10 +- .../doctor-legacy-config.migrations.test.ts | 12 +- src/commands/doctor-legacy-config.ts | 20 +- src/commands/doctor-memory-search.test.ts | 12 +- src/commands/doctor-memory-search.ts | 30 +- ...form-notes.launchctl-env-overrides.test.ts | 24 +- ...latform-notes.startup-optimization.test.ts | 20 +- src/commands/doctor-platform-notes.ts | 30 +- src/commands/doctor-sandbox.ts | 20 +- ...rns-sandbox-enabled-without-docker.test.ts | 4 +- src/commands/doctor-security.test.ts | 50 +- src/commands/doctor-security.ts | 28 +- src/commands/doctor-session-locks.test.ts | 6 +- src/commands/doctor-session-locks.ts | 2 +- ...ctor-state-integrity.cloud-storage.test.ts | 36 +- ...ctor-state-integrity.linux-storage.test.ts | 20 +- src/commands/doctor-state-integrity.test.ts | 58 +- src/commands/doctor-state-integrity.ts | 28 +- src/commands/doctor-state-migrations.test.ts | 42 +- src/commands/doctor-ui.ts | 4 +- src/commands/doctor-update.ts | 10 +- src/commands/doctor-workspace-status.test.ts | 10 +- src/commands/doctor-workspace-status.ts | 8 +- src/commands/doctor-workspace.ts | 4 +- src/commands/doctor.e2e-harness.ts | 38 +- ...owfrom-channels-whatsapp-allowfrom.test.ts | 10 +- ...es-slack-discord-dm-policy-aliases.test.ts | 2 +- src/commands/doctor.ts | 24 +- ...t-sandbox-docker-browser-prune.e2e.test.ts | 8 +- ...rns-state-directory-is-missing.e2e.test.ts | 28 +- src/commands/gateway-install-token.test.ts | 38 +- src/commands/gateway-install-token.ts | 6 +- src/commands/gateway-status.test.ts | 34 +- src/commands/gateway-status.ts | 2 +- src/commands/gateway-status/helpers.test.ts | 26 +- src/commands/gateway-status/helpers.ts | 8 +- src/commands/health.snapshot.test.ts | 2 +- src/commands/health.test.ts | 4 +- src/commands/health.ts | 12 +- src/commands/model-picker.test.ts | 18 +- src/commands/model-picker.ts | 22 +- .../models.auth.provider-resolution.test.ts | 2 +- src/commands/models.list.auth-sync.test.ts | 10 +- src/commands/models.list.e2e.test.ts | 22 +- src/commands/models.set.e2e.test.ts | 4 +- src/commands/models/auth.test.ts | 24 +- src/commands/models/auth.ts | 12 +- src/commands/models/fallbacks-shared.ts | 8 +- src/commands/models/list.auth-overview.ts | 4 +- src/commands/models/list.configured.ts | 4 +- src/commands/models/list.list-command.ts | 4 +- .../models/list.probe.targets.test.ts | 6 +- src/commands/models/list.probe.ts | 18 +- src/commands/models/list.registry.ts | 14 +- src/commands/models/list.rows.ts | 8 +- src/commands/models/list.status-command.ts | 4 +- src/commands/models/list.status.test.ts | 22 +- src/commands/models/load-config.ts | 10 +- src/commands/models/shared.test.ts | 10 +- src/commands/models/shared.ts | 22 +- .../node-daemon-install-helpers.test.ts | 10 +- src/commands/node-daemon-install-helpers.ts | 2 +- .../oauth-tls-preflight.doctor.test.ts | 4 +- .../onboard-auth.config-core.kilocode.test.ts | 10 +- src/commands/onboard-auth.config-litellm.ts | 6 +- .../onboard-auth.config-shared.test.ts | 6 +- src/commands/onboard-auth.credentials.test.ts | 22 +- src/commands/onboard-auth.test.ts | 44 +- src/commands/onboard-channels.e2e.test.ts | 70 +- .../onboard-channels.post-write.test.ts | 14 +- src/commands/onboard-channels.ts | 32 +- src/commands/onboard-config.test.ts | 10 +- src/commands/onboard-config.ts | 6 +- src/commands/onboard-custom.test.ts | 8 +- src/commands/onboard-custom.ts | 18 +- src/commands/onboard-helpers.test.ts | 24 +- src/commands/onboard-helpers.ts | 14 +- src/commands/onboard-hooks.test.ts | 14 +- src/commands/onboard-hooks.ts | 16 +- .../onboard-non-interactive.gateway.test.ts | 86 +- ...oard-non-interactive.provider-auth.test.ts | 92 +- src/commands/onboard-non-interactive.ts | 6 +- .../onboard-non-interactive/api-keys.ts | 6 +- src/commands/onboard-non-interactive/local.ts | 16 +- .../local/auth-choice.api-key-providers.ts | 10 +- .../auth-choice.plugin-providers.test.ts | 6 +- .../local/auth-choice.plugin-providers.ts | 12 +- .../local/auth-choice.test.ts | 6 +- .../local/auth-choice.ts | 8 +- .../local/daemon-install.test.ts | 18 +- .../local/daemon-install.ts | 6 +- .../local/gateway-config.ts | 10 +- .../local/skills-config.ts | 4 +- .../local/workspace.ts | 4 +- .../onboard-non-interactive/remote.ts | 8 +- src/commands/onboard-remote.test.ts | 48 +- src/commands/onboard-remote.ts | 36 +- src/commands/onboard-search.test.ts | 36 +- src/commands/onboard-search.ts | 38 +- src/commands/onboard-skills.test.ts | 8 +- src/commands/onboard-skills.ts | 16 +- src/commands/onboard.test.ts | 10 +- src/commands/onboard.ts | 8 +- src/commands/openai-codex-oauth.test.ts | 2 +- src/commands/openai-model-default.test.ts | 38 +- src/commands/provider-auth-guidance.ts | 12 +- src/commands/reset.test.ts | 14 +- src/commands/reset.ts | 8 +- src/commands/sandbox-display.ts | 2 +- src/commands/sandbox-explain.test.ts | 4 +- src/commands/sandbox-explain.ts | 12 +- src/commands/sandbox.test.ts | 8 +- src/commands/session-store-targets.ts | 4 +- src/commands/sessions-table.ts | 6 +- src/commands/setup.test.ts | 6 +- src/commands/setup.ts | 8 +- src/commands/signal-install.test.ts | 2 +- src/commands/status-all.ts | 12 +- src/commands/status-all/agents.ts | 4 +- src/commands/status-all/channels.ts | 16 +- src/commands/status-all/diagnosis.ts | 2 +- src/commands/status-all/report-lines.test.ts | 2 +- src/commands/status-all/report-lines.ts | 2 +- src/commands/status.agent-local.ts | 4 +- src/commands/status.command.ts | 28 +- src/commands/status.daemon.ts | 4 +- src/commands/status.link-channel.test.ts | 6 +- src/commands/status.link-channel.ts | 4 +- src/commands/status.scan.deps.runtime.ts | 4 +- src/commands/status.scan.fast-json.ts | 10 +- src/commands/status.scan.shared.ts | 14 +- src/commands/status.scan.test.ts | 24 +- src/commands/status.scan.ts | 10 +- src/commands/status.service-summary.test.ts | 22 +- src/commands/status.service-summary.ts | 12 +- src/commands/status.summary.redaction.test.ts | 4 +- src/commands/status.summary.ts | 8 +- src/commands/status.test.ts | 34 +- src/commands/status.update.test.ts | 2 +- src/commands/status.update.ts | 6 +- src/commands/test-runtime-config-helpers.ts | 2 +- src/commands/text-format.test.ts | 4 +- src/commands/uninstall.test.ts | 12 +- src/commands/uninstall.ts | 10 +- src/compat/legacy-names.ts | 4 +- src/config/agent-dirs.test.ts | 14 +- src/config/agent-dirs.ts | 8 +- src/config/agent-limits.ts | 6 +- src/config/backup-rotation.ts | 2 +- src/config/bindings.ts | 8 +- src/config/channel-capabilities.test.ts | 14 +- src/config/channel-capabilities.ts | 4 +- src/config/config-misc.test.ts | 48 +- src/config/config.acp-binding-cutover.test.ts | 26 +- .../config.agent-concurrency-defaults.test.ts | 8 +- .../config.backup-rotation.test-helpers.ts | 6 +- src/config/config.backup-rotation.test.ts | 6 +- src/config/config.discord-presence.test.ts | 2 +- src/config/config.discord.test.ts | 8 +- src/config/config.env-vars.test.ts | 28 +- src/config/config.identity-avatar.test.ts | 8 +- src/config/config.identity-defaults.test.ts | 24 +- src/config/config.irc.test.ts | 6 +- ...etection.accepts-imessage-dmpolicy.test.ts | 6 +- ...etection.rejects-routing-allowfrom.test.ts | 18 +- ...ig.multi-agent-agentdir-validation.test.ts | 6 +- .../config.nix-integration-u3-u5-u9.test.ts | 88 +- src/config/config.plugin-validation.test.ts | 14 +- src/config/config.pruning-defaults.test.ts | 4 +- src/config/config.sandbox-docker.test.ts | 8 +- src/config/config.schema-regressions.test.ts | 2 +- src/config/config.secrets-schema.test.ts | 6 +- .../config.skills-entries-config.test.ts | 6 +- .../config.telegram-audio-preflight.test.ts | 6 +- .../config.telegram-custom-commands.test.ts | 6 +- .../config.telegram-topic-agentid.test.ts | 12 +- src/config/dangerous-name-matching.ts | 4 +- src/config/defaults.ts | 26 +- src/config/doc-baseline.test.ts | 2 +- src/config/doc-baseline.ts | 16 +- src/config/env-preserve-io.test.ts | 8 +- src/config/env-substitution.test.ts | 4 +- src/config/env-vars.ts | 16 +- src/config/gateway-control-ui-origins.ts | 6 +- src/config/group-policy.test.ts | 16 +- src/config/group-policy.ts | 14 +- src/config/includes.test.ts | 32 +- src/config/io.compat.test.ts | 36 +- src/config/io.eacces.test.ts | 4 +- src/config/io.owner-display-secret.test.ts | 4 +- src/config/io.runtime-snapshot-write.test.ts | 36 +- src/config/io.ts | 94 +- src/config/io.write-config.test.ts | 42 +- src/config/legacy-migrate.test.ts | 16 +- src/config/legacy-migrate.ts | 4 +- src/config/legacy-web-search.ts | 4 +- .../load-channel-config-surface.test.ts | 4 +- src/config/logging.test.ts | 6 +- src/config/markdown-tables.ts | 4 +- src/config/mcp-config.ts | 6 +- src/config/merge-config.ts | 6 +- src/config/model-alias-defaults.test.ts | 12 +- src/config/normalize-exec-safe-bin.ts | 4 +- src/config/normalize-paths.test.ts | 16 +- src/config/normalize-paths.ts | 4 +- src/config/paths.test.ts | 76 +- src/config/paths.ts | 56 +- src/config/plugin-auto-enable.test.ts | 30 +- src/config/plugin-auto-enable.ts | 34 +- src/config/plugins-allowlist.ts | 4 +- src/config/plugins-runtime-boundary.test.ts | 6 +- src/config/redact-snapshot.test.ts | 26 +- src/config/redact-snapshot.ts | 4 +- src/config/runtime-overrides.test.ts | 12 +- src/config/runtime-overrides.ts | 6 +- src/config/schema.help.quality.test.ts | 4 +- src/config/schema.help.ts | 56 +- src/config/schema.hints.test.ts | 8 +- src/config/schema.hints.ts | 6 +- src/config/schema.ts | 10 +- src/config/sessions.cache.test.ts | 8 +- src/config/sessions.test.ts | 16 +- src/config/sessions/disk-budget.test.ts | 4 +- src/config/sessions/sessions.test.ts | 16 +- src/config/sessions/store-maintenance.ts | 2 +- .../store.pruning.integration.test.ts | 16 +- src/config/sessions/store.pruning.test.ts | 2 +- .../store.session-key-normalization.test.ts | 2 +- src/config/sessions/store.ts | 2 +- src/config/sessions/targets.test.ts | 34 +- src/config/sessions/targets.ts | 12 +- src/config/sessions/transcript.ts | 2 +- src/config/talk-defaults.test.ts | 4 +- src/config/talk.normalize.test.ts | 4 +- src/config/talk.ts | 4 +- src/config/test-helpers.ts | 12 +- src/config/types.acp.ts | 2 +- src/config/types.base.ts | 2 +- src/config/types.browser.ts | 6 +- src/config/types.discord.ts | 4 +- src/config/types.gateway.ts | 10 +- src/config/types.hooks.ts | 2 +- src/config/types.irc.ts | 4 +- .../{types.openclaw.ts => types.klawty.ts} | 10 +- src/config/types.mcp.ts | 2 +- src/config/types.messages.ts | 2 +- src/config/types.sandbox.ts | 2 +- src/config/types.slack.ts | 2 +- src/config/types.ts | 2 +- src/config/validation.ts | 28 +- src/config/version.ts | 10 +- src/config/zod-schema.cron-retention.test.ts | 10 +- src/config/zod-schema.logging-levels.test.ts | 10 +- src/config/zod-schema.talk.test.ts | 12 +- src/config/zod-schema.ts | 4 +- src/context-engine/delegate.ts | 2 +- src/context-engine/registry.ts | 8 +- src/cron/delivery.ts | 4 +- src/cron/heartbeat-policy.ts | 2 +- ...ted-agent.auth-profile-propagation.test.ts | 6 +- ...onse-has-heartbeat-ok-but-includes.test.ts | 2 +- ...ent.delivery-target-thread-session.test.ts | 4 +- ...p-recipient-besteffortdeliver-true.test.ts | 8 +- .../isolated-agent.subagent-model.test.ts | 28 +- src/cron/isolated-agent.test-harness.ts | 16 +- src/cron/isolated-agent.test-setup.ts | 2 +- ....uses-last-non-empty-agent-text-as.test.ts | 4 +- .../delivery-dispatch.double-announce.test.ts | 6 +- src/cron/isolated-agent/delivery-dispatch.ts | 12 +- .../isolated-agent/delivery-target.test.ts | 12 +- src/cron/isolated-agent/delivery-target.ts | 6 +- src/cron/isolated-agent/helpers.ts | 2 +- .../isolated-agent/run.owner-auth.test.ts | 4 +- .../run.sandbox-config-preserved.test.ts | 8 +- src/cron/isolated-agent/run.test-harness.ts | 8 +- src/cron/isolated-agent/run.ts | 18 +- src/cron/isolated-agent/session.test.ts | 4 +- src/cron/isolated-agent/session.ts | 4 +- src/cron/isolated-agent/skills-snapshot.ts | 4 +- .../isolated-agent/subagent-followup.test.ts | 2 +- src/cron/isolated-agent/subagent-followup.ts | 2 +- src/cron/run-log.test.ts | 16 +- src/cron/service.armtimer-tight-loop.test.ts | 2 +- src/cron/service.delivery-plan.test.ts | 2 +- src/cron/service.failure-alert.test.ts | 2 +- src/cron/service.get-job.test.ts | 2 +- ...ervice.issue-16156-list-skips-cron.test.ts | 2 +- .../service.issue-35195-backup-timing.test.ts | 2 +- src/cron/service.issue-regressions.test.ts | 2 +- .../service.prevents-duplicate-timers.test.ts | 2 +- src/cron/service.read-ops-nonblocking.test.ts | 2 +- src/cron/service.restart-catchup.test.ts | 2 +- ...runs-one-shot-main-job-disables-it.test.ts | 2 +- .../service.session-reaper-in-finally.test.ts | 2 +- ...ervice.store-load-invalid-main-job.test.ts | 2 +- src/cron/service.store-migration.test.ts | 2 +- src/cron/service.store.migration.test.ts | 2 +- src/cron/service.test-harness.ts | 2 +- src/cron/service/state.ts | 6 +- src/cron/service/timer.ts | 4 +- src/cron/store.test.ts | 8 +- src/daemon/constants.test.ts | 28 +- src/daemon/constants.ts | 34 +- src/daemon/inspect.test.ts | 6 +- src/daemon/inspect.ts | 34 +- src/daemon/launchd-restart-handoff.test.ts | 4 +- src/daemon/launchd-restart-handoff.ts | 8 +- src/daemon/launchd.integration.e2e.test.ts | 6 +- src/daemon/launchd.test.ts | 50 +- src/daemon/launchd.ts | 18 +- src/daemon/node-service.ts | 28 +- src/daemon/paths.ts | 6 +- src/daemon/program-args.test.ts | 30 +- src/daemon/program-args.ts | 2 +- src/daemon/runtime-hints.test.ts | 56 +- .../runtime-hints.windows-paths.test.ts | 12 +- src/daemon/runtime-paths.ts | 2 +- src/daemon/schtasks.install.test.ts | 10 +- src/daemon/schtasks.startup-fallback.test.ts | 34 +- src/daemon/schtasks.stop.test.ts | 8 +- src/daemon/schtasks.test.ts | 58 +- src/daemon/schtasks.ts | 12 +- src/daemon/service-audit.test.ts | 4 +- src/daemon/service-audit.ts | 12 +- src/daemon/service-env.test.ts | 90 +- src/daemon/service-env.ts | 46 +- src/daemon/systemd-hints.test.ts | 2 +- src/daemon/systemd-hints.ts | 2 +- src/daemon/systemd-unit.test.ts | 14 +- src/daemon/systemd-unit.ts | 2 +- src/daemon/systemd.test.ts | 146 +- src/daemon/systemd.ts | 8 +- src/daemon/test-helpers/schtasks-fixtures.ts | 10 +- src/docker-build-cache.test.ts | 4 +- src/docker-setup.e2e.test.ts | 132 +- src/dockerfile.test.ts | 18 +- src/entry.test.ts | 4 +- src/entry.ts | 30 +- src/entry.version-fast-path.test.ts | 6 +- src/gateway/agent-list.ts | 6 +- .../android-node.capabilities.live.test.ts | 20 +- src/gateway/assistant-identity.test.ts | 12 +- src/gateway/assistant-identity.ts | 4 +- src/gateway/auth-config-utils.ts | 8 +- src/gateway/auth-install-policy.ts | 6 +- src/gateway/auth-mode-policy.test.ts | 12 +- src/gateway/auth-mode-policy.ts | 6 +- src/gateway/auth.test.ts | 22 +- src/gateway/auth.ts | 4 +- src/gateway/boot.test.ts | 2 +- src/gateway/boot.ts | 6 +- src/gateway/call.test.ts | 166 +- src/gateway/call.ts | 46 +- src/gateway/canvas-capability.ts | 2 +- src/gateway/client.test.ts | 48 +- src/gateway/client.ts | 14 +- src/gateway/config-reload.test.ts | 4 +- src/gateway/config-reload.ts | 14 +- src/gateway/connection-auth.test.ts | 26 +- src/gateway/connection-auth.ts | 8 +- src/gateway/control-ui-contract.ts | 2 +- src/gateway/control-ui-csp.ts | 2 +- src/gateway/control-ui-routing.test.ts | 12 +- src/gateway/control-ui.auto-root.http.test.ts | 2 +- src/gateway/control-ui.http.test.ts | 38 +- src/gateway/control-ui.ts | 4 +- src/gateway/credential-planner.ts | 12 +- .../credential-precedence.parity.test.ts | 34 +- src/gateway/credentials.test.ts | 50 +- src/gateway/credentials.ts | 12 +- src/gateway/device-auth.test.ts | 12 +- src/gateway/gateway-cli-backend.live.test.ts | 88 +- src/gateway/gateway-config-prompts.shared.ts | 10 +- src/gateway/gateway-misc.test.ts | 2 +- .../gateway-models.profiles.live.test.ts | 152 +- src/gateway/gateway.test.ts | 70 +- src/gateway/hooks-mapping.test.ts | 40 +- src/gateway/hooks-test-helpers.ts | 2 +- src/gateway/hooks.test.ts | 28 +- src/gateway/hooks.ts | 12 +- .../http-utils.request-context.test.ts | 12 +- src/gateway/http-utils.ts | 10 +- src/gateway/live-tool-probe-utils.test.ts | 6 +- src/gateway/live-tool-probe-utils.ts | 6 +- src/gateway/model-pricing-cache.test.ts | 6 +- src/gateway/model-pricing-cache.ts | 10 +- src/gateway/net.test.ts | 96 +- src/gateway/node-command-policy.ts | 4 +- .../openai-http.message-channel.test.ts | 6 +- src/gateway/openai-http.test.ts | 62 +- src/gateway/openai-http.ts | 6 +- src/gateway/openresponses-http.test.ts | 66 +- src/gateway/openresponses-http.ts | 8 +- src/gateway/operator-approvals-client.ts | 6 +- src/gateway/origin-check.test.ts | 24 +- src/gateway/probe-auth.test.ts | 14 +- src/gateway/probe-auth.ts | 10 +- src/gateway/probe.test.ts | 8 +- src/gateway/protocol/client-info.ts | 10 +- src/gateway/protocol/push.test.ts | 2 +- ...lve-configured-secret-input-string.test.ts | 6 +- .../resolve-configured-secret-input-string.ts | 8 +- src/gateway/server-browser.ts | 4 +- src/gateway/server-channels.ts | 4 +- src/gateway/server-constants.ts | 4 +- src/gateway/server-cron.test.ts | 8 +- src/gateway/server-cron.ts | 2 +- src/gateway/server-discovery-runtime.ts | 4 +- src/gateway/server-discovery.test.ts | 10 +- src/gateway/server-discovery.ts | 14 +- src/gateway/server-http.test-harness.ts | 4 +- src/gateway/server-http.ts | 4 +- ...r-methods.control-plane-rate-limit.test.ts | 2 +- src/gateway/server-methods/agent-timestamp.ts | 6 +- .../server-methods/agent.create-event.test.ts | 2 +- src/gateway/server-methods/channels.ts | 4 +- .../server-methods/chat-transcript-inject.ts | 4 +- .../chat.abort-persistence.test.ts | 14 +- .../chat.directive-tags.test.ts | 68 +- .../chat.inject.parentid.test.ts | 2 +- src/gateway/server-methods/chat.ts | 2 +- src/gateway/server-methods/config.ts | 10 +- src/gateway/server-methods/doctor.test.ts | 4 +- src/gateway/server-methods/logs.ts | 2 +- .../nodes.canvas-capability-refresh.test.ts | 4 +- .../server-methods/nodes.invoke-wake.test.ts | 10 +- src/gateway/server-methods/nodes.ts | 8 +- src/gateway/server-methods/push.test.ts | 6 +- src/gateway/server-methods/push.ts | 2 +- src/gateway/server-methods/send.test.ts | 8 +- src/gateway/server-methods/send.ts | 2 +- .../server-methods/server-methods.test.ts | 8 +- src/gateway/server-methods/skills.ts | 4 +- src/gateway/server-methods/update.test.ts | 4 +- src/gateway/server-methods/update.ts | 4 +- .../usage.sessions-usage.test.ts | 4 +- src/gateway/server-methods/usage.test.ts | 4 +- src/gateway/server-node-events.test.ts | 16 +- src/gateway/server-plugins.test.ts | 26 +- src/gateway/server-plugins.ts | 10 +- src/gateway/server-reload-handlers.ts | 8 +- src/gateway/server-runtime-config.test.ts | 24 +- src/gateway/server-runtime-config.ts | 6 +- src/gateway/server-runtime-state.ts | 2 +- src/gateway/server-session-key.test.ts | 8 +- src/gateway/server-startup-log.test.ts | 10 +- src/gateway/server-startup-log.ts | 2 +- .../server-startup-matrix-migration.test.ts | 8 +- .../server-startup-matrix-migration.ts | 4 +- src/gateway/server-startup-memory.test.ts | 8 +- src/gateway/server-startup-memory.ts | 4 +- src/gateway/server-startup.ts | 14 +- ...erver.agent.gateway-server-agent-a.test.ts | 2 +- ...erver.agent.gateway-server-agent-b.test.ts | 2 +- .../server.auth.browser-hardening.test.ts | 2 +- .../server.auth.compat-baseline.test.ts | 14 +- src/gateway/server.auth.control-ui.suite.ts | 26 +- .../server.auth.default-token.suite.ts | 22 +- src/gateway/server.auth.modes.suite.ts | 8 +- src/gateway/server.auth.shared.ts | 10 +- src/gateway/server.canvas-auth.test.ts | 2 +- .../server.chat.gateway-server-chat-b.test.ts | 2 +- .../server.chat.gateway-server-chat.test.ts | 18 +- src/gateway/server.config-patch.test.ts | 2 +- src/gateway/server.control-ui-root.test.ts | 8 +- src/gateway/server.cron.test.ts | 26 +- .../server.device-pair-approve-authz.test.ts | 2 +- .../server.device-token-rotate-authz.test.ts | 2 +- src/gateway/server.e2e-ws-harness.ts | 4 +- src/gateway/server.hooks.test.ts | 4 +- src/gateway/server.impl.ts | 42 +- src/gateway/server.ios-client-id.test.ts | 2 +- .../server.models-voicewake-misc.test.ts | 24 +- src/gateway/server.plugin-http-auth.test.ts | 40 +- src/gateway/server.preauth-hardening.test.ts | 8 +- src/gateway/server.reload.test.ts | 64 +- .../server.roles-allowlist-update.test.ts | 10 +- src/gateway/server.sessions-send.test.ts | 20 +- ...sessions.gateway-server-sessions-a.test.ts | 6 +- src/gateway/server.skills-status.test.ts | 2 +- src/gateway/server.talk-config.test.ts | 4 +- src/gateway/server/hooks.ts | 4 +- src/gateway/server/http-listen.test.ts | 6 +- src/gateway/server/plugins-http.test.ts | 10 +- src/gateway/session-kill-http.test.ts | 4 +- src/gateway/session-kill-http.ts | 2 +- src/gateway/session-message-events.test.ts | 6 +- src/gateway/session-utils.fs.test.ts | 42 +- src/gateway/session-utils.fs.ts | 16 +- src/gateway/session-utils.test.ts | 68 +- src/gateway/session-utils.ts | 44 +- src/gateway/sessions-history-http.test.ts | 22 +- src/gateway/sessions-history-http.ts | 6 +- src/gateway/sessions-patch.test.ts | 16 +- src/gateway/sessions-patch.ts | 4 +- src/gateway/sessions-resolve.ts | 4 +- src/gateway/startup-auth.test.ts | 32 +- src/gateway/startup-auth.ts | 22 +- src/gateway/startup-control-ui-origins.ts | 8 +- src/gateway/test-helpers.e2e.ts | 4 +- src/gateway/test-helpers.mocks.ts | 26 +- src/gateway/test-helpers.server.ts | 68 +- src/gateway/test-temp-config.ts | 20 +- .../tools-invoke-http.cron-regression.test.ts | 4 +- src/gateway/tools-invoke-http.test.ts | 26 +- src/gateway/tools-invoke-http.ts | 12 +- src/gateway/ws-log.ts | 2 +- src/hooks/bundled-dir.ts | 4 +- src/hooks/bundled/README.md | 38 +- src/hooks/bundled/boot-md/HOOK.md | 6 +- ...andler.gateway-startup.integration.test.ts | 4 +- .../bundled/bootstrap-extra-files/HOOK.md | 6 +- .../bootstrap-extra-files/handler.test.ts | 10 +- src/hooks/bundled/command-logger/HOOK.md | 24 +- src/hooks/bundled/session-memory/HOOK.md | 10 +- .../bundled/session-memory/handler.test.ts | 18 +- src/hooks/bundled/session-memory/handler.ts | 8 +- src/hooks/config.ts | 12 +- src/hooks/frontmatter.test.ts | 80 +- src/hooks/frontmatter.ts | 30 +- src/hooks/gmail-ops.ts | 6 +- src/hooks/gmail-setup-utils.test.ts | 2 +- src/hooks/gmail-watcher-lifecycle.test.ts | 6 +- src/hooks/gmail-watcher-lifecycle.ts | 6 +- src/hooks/gmail-watcher.ts | 6 +- src/hooks/gmail.test.ts | 14 +- src/hooks/gmail.ts | 4 +- src/hooks/hooks-install.test.ts | 6 +- src/hooks/hooks-status.ts | 10 +- src/hooks/import-url.test.ts | 18 +- src/hooks/import-url.ts | 2 +- src/hooks/install.test.ts | 38 +- src/hooks/install.ts | 16 +- src/hooks/installs.ts | 4 +- src/hooks/internal-hooks.test.ts | 6 +- src/hooks/internal-hooks.ts | 12 +- src/hooks/llm-slug-generator.ts | 6 +- src/hooks/loader.test.ts | 20 +- src/hooks/loader.ts | 12 +- src/hooks/message-hook-mappers.test.ts | 4 +- src/hooks/message-hook-mappers.ts | 10 +- src/hooks/plugin-hooks.test.ts | 24 +- src/hooks/plugin-hooks.ts | 4 +- src/hooks/types.ts | 6 +- src/hooks/workspace.test.ts | 18 +- src/hooks/workspace.ts | 26 +- .../live-test-helpers.test.ts | 4 +- src/image-generation/live-test-helpers.ts | 4 +- src/image-generation/provider-registry.ts | 14 +- src/image-generation/runtime.live.test.ts | 18 +- src/image-generation/runtime.test.ts | 4 +- src/image-generation/runtime.ts | 8 +- src/image-generation/types.ts | 4 +- src/index.ts | 4 +- src/infra/archive-helpers.test.ts | 2 +- src/infra/archive-staging.test.ts | 12 +- src/infra/archive-staging.ts | 2 +- src/infra/archive.test.ts | 2 +- src/infra/backup-create.test.ts | 28 +- src/infra/backup-create.ts | 6 +- src/infra/bonjour-discovery.test.ts | 36 +- src/infra/bonjour-discovery.ts | 6 +- src/infra/bonjour.test.ts | 38 +- src/infra/bonjour.ts | 16 +- src/infra/boundary-path.test.ts | 10 +- src/infra/brew.test.ts | 2 +- src/infra/canvas-host-url.test.ts | 10 +- src/infra/canvas-host-url.ts | 4 +- src/infra/channel-summary.ts | 10 +- src/infra/control-ui-assets.test.ts | 44 +- src/infra/control-ui-assets.ts | 16 +- src/infra/detect-package-manager.test.ts | 10 +- src/infra/device-auth-store.test.ts | 10 +- src/infra/device-bootstrap.test.ts | 2 +- src/infra/device-identity.state-dir.test.ts | 10 +- src/infra/device-identity.test.ts | 2 +- src/infra/device-pairing.test.ts | 28 +- src/infra/diagnostic-events.ts | 12 +- src/infra/diagnostic-flags.test.ts | 14 +- src/infra/diagnostic-flags.ts | 8 +- src/infra/dotenv.test.ts | 6 +- src/infra/dotenv.ts | 2 +- src/infra/env.test.ts | 16 +- src/infra/exec-allowlist-pattern.test.ts | 14 +- src/infra/exec-approval-forwarder.test.ts | 24 +- src/infra/exec-approval-forwarder.ts | 20 +- .../exec-approval-session-target.test.ts | 8 +- src/infra/exec-approval-session-target.ts | 4 +- src/infra/exec-approval-surface.ts | 6 +- src/infra/exec-approvals-allow-always.test.ts | 4 +- src/infra/exec-approvals-analysis.test.ts | 2 +- src/infra/exec-approvals-config.test.ts | 12 +- src/infra/exec-approvals-store.test.ts | 16 +- src/infra/exec-approvals-test-helpers.ts | 2 +- src/infra/exec-approvals.ts | 4 +- src/infra/exec-obfuscation-detect.ts | 2 +- .../exec-safe-bin-runtime-policy.test.ts | 2 +- src/infra/exec-safe-bin-trust.test.ts | 4 +- src/infra/exec-safety.test.ts | 4 +- src/infra/executable-path.test.ts | 6 +- src/infra/fetch.ts | 2 +- src/infra/fs-pinned-write-helper.test.ts | 10 +- src/infra/fs-safe.test.ts | 64 +- src/infra/fs-safe.ts | 2 +- src/infra/gateway-lock.test.ts | 14 +- src/infra/gateway-lock.ts | 2 +- src/infra/gateway-process-argv.test.ts | 28 +- src/infra/gateway-process-argv.ts | 8 +- src/infra/gateway-processes.test.ts | 8 +- src/infra/gaxios-fetch-compat.test.ts | 2 +- src/infra/gaxios-fetch-compat.ts | 2 +- src/infra/git-commit.test.ts | 8 +- src/infra/git-commit.ts | 4 +- src/infra/git-root.test.ts | 2 +- src/infra/hardlink-guards.test.ts | 4 +- src/infra/heartbeat-active-hours.test.ts | 4 +- src/infra/heartbeat-active-hours.ts | 6 +- .../heartbeat-runner.ghost-reminder.test.ts | 18 +- .../heartbeat-runner.model-override.test.ts | 14 +- ...espects-ackmaxchars-heartbeat-acks.test.ts | 12 +- ...tbeat-runner.returns-default-unset.test.ts | 54 +- src/infra/heartbeat-runner.scheduler.test.ts | 18 +- ...ner.sender-prefers-delivery-target.test.ts | 6 +- src/infra/heartbeat-runner.test-utils.ts | 6 +- .../heartbeat-runner.transcript-prune.test.ts | 6 +- src/infra/heartbeat-runner.ts | 28 +- src/infra/heartbeat-summary.ts | 10 +- src/infra/heartbeat-visibility.test.ts | 28 +- src/infra/heartbeat-visibility.ts | 4 +- src/infra/home-dir.test.ts | 32 +- src/infra/home-dir.ts | 2 +- .../host-env-security.policy-parity.test.ts | 4 +- src/infra/host-env-security.test.ts | 28 +- src/infra/host-env-security.ts | 6 +- src/infra/infra-store.test.ts | 4 +- src/infra/install-flow.test.ts | 12 +- src/infra/install-from-npm-spec.test.ts | 10 +- src/infra/install-package-dir.test.ts | 22 +- src/infra/install-package-dir.ts | 4 +- src/infra/install-safe-path.test.ts | 20 +- src/infra/install-source-utils.test.ts | 62 +- src/infra/install-source-utils.ts | 2 +- src/infra/install-target.test.ts | 6 +- src/infra/is-main.test.ts | 14 +- src/infra/json-file.test.ts | 8 +- src/infra/json-files.test.ts | 6 +- src/infra/jsonl-socket.test.ts | 4 +- src/infra/klawty-exec-env.test.ts | 46 + src/infra/klawty-exec-env.ts | 16 + ...nclaw-root.test.ts => klawty-root.test.ts} | 82 +- .../{openclaw-root.ts => klawty-root.ts} | 6 +- src/infra/machine-name.test.ts | 2 +- src/infra/machine-name.ts | 2 +- src/infra/matrix-account-selection.test.ts | 16 +- src/infra/matrix-legacy-crypto.test.ts | 44 +- src/infra/matrix-legacy-crypto.ts | 22 +- src/infra/matrix-legacy-state.test.ts | 26 +- src/infra/matrix-legacy-state.ts | 8 +- src/infra/matrix-migration-config.test.ts | 24 +- src/infra/matrix-migration-config.ts | 18 +- src/infra/matrix-migration-snapshot.test.ts | 24 +- src/infra/matrix-migration-snapshot.ts | 8 +- src/infra/matrix-plugin-helper.test.ts | 10 +- src/infra/matrix-plugin-helper.ts | 16 +- src/infra/net/fetch-guard.ssrf.test.ts | 4 +- src/infra/net/proxy-fetch.ts | 2 +- src/infra/node-pairing.test.ts | 8 +- src/infra/npm-integrity.test.ts | 28 +- src/infra/npm-pack-install.test.ts | 56 +- src/infra/npm-registry-spec.test.ts | 56 +- src/infra/openclaw-exec-env.test.ts | 46 - src/infra/openclaw-exec-env.ts | 16 - src/infra/outbound/agent-delivery.test.ts | 6 +- src/infra/outbound/agent-delivery.ts | 6 +- src/infra/outbound/base-session-key.ts | 4 +- src/infra/outbound/channel-adapters.ts | 4 +- src/infra/outbound/channel-resolution.test.ts | 20 +- src/infra/outbound/channel-resolution.ts | 10 +- src/infra/outbound/channel-selection.ts | 10 +- src/infra/outbound/deliver.lifecycle.test.ts | 4 +- src/infra/outbound/deliver.test-helpers.ts | 6 +- src/infra/outbound/deliver.test.ts | 50 +- src/infra/outbound/deliver.ts | 10 +- src/infra/outbound/delivery-queue.test.ts | 2 +- src/infra/outbound/delivery-queue.ts | 6 +- src/infra/outbound/directory-cache.test.ts | 8 +- src/infra/outbound/directory-cache.ts | 12 +- src/infra/outbound/identity.ts | 4 +- .../outbound/message-action-params.test.ts | 4 +- src/infra/outbound/message-action-params.ts | 10 +- .../message-action-runner.context.test.ts | 16 +- .../message-action-runner.media.test.ts | 18 +- ...sage-action-runner.plugin-dispatch.test.ts | 24 +- .../message-action-runner.poll.test.ts | 6 +- .../message-action-runner.test-helpers.ts | 6 +- src/infra/outbound/message-action-runner.ts | 14 +- src/infra/outbound/message.test.ts | 10 +- src/infra/outbound/message.ts | 12 +- src/infra/outbound/outbound-policy.test.ts | 10 +- src/infra/outbound/outbound-policy.ts | 6 +- .../outbound/outbound-send-service.test.ts | 8 +- src/infra/outbound/outbound-send-service.ts | 4 +- src/infra/outbound/outbound-session.test.ts | 18 +- src/infra/outbound/outbound-session.ts | 10 +- src/infra/outbound/outbound.test.ts | 28 +- src/infra/outbound/payloads.ts | 2 +- src/infra/outbound/sanitize-text.ts | 4 +- src/infra/outbound/session-context.ts | 4 +- src/infra/outbound/target-resolver.test.ts | 4 +- src/infra/outbound/target-resolver.ts | 16 +- .../targets.channel-resolution.test.ts | 14 +- src/infra/outbound/targets.test.ts | 14 +- src/infra/outbound/targets.ts | 14 +- src/infra/package-json.test.ts | 10 +- src/infra/package-tag.test.ts | 14 +- src/infra/pairing-files.test.ts | 8 +- src/infra/path-alias-guards.test.ts | 6 +- src/infra/path-env.test.ts | 44 +- src/infra/path-env.ts | 20 +- .../plugin-install-path-warnings.test.ts | 26 +- src/infra/ports-format.test.ts | 36 +- src/infra/ports-format.ts | 4 +- src/infra/ports-inspect.ts | 4 +- src/infra/ports.test.ts | 12 +- src/infra/ports.ts | 4 +- src/infra/process-respawn.test.ts | 76 +- src/infra/process-respawn.ts | 8 +- ...rovider-usage.auth.normalizes-keys.test.ts | 20 +- src/infra/provider-usage.auth.ts | 6 +- src/infra/provider-usage.fetch.claude.ts | 2 +- .../provider-usage.fetch.minimax.test.ts | 2 +- src/infra/provider-usage.fetch.minimax.ts | 2 +- src/infra/provider-usage.load.ts | 6 +- src/infra/provider-usage.shared.test.ts | 4 +- src/infra/provider-usage.test-support.ts | 6 +- src/infra/provider-usage.test.ts | 6 +- src/infra/push-apns.auth.test.ts | 44 +- src/infra/push-apns.relay.test.ts | 24 +- src/infra/push-apns.relay.ts | 20 +- src/infra/push-apns.store.test.ts | 42 +- src/infra/push-apns.test.ts | 14 +- src/infra/push-apns.ts | 20 +- src/infra/restart-sentinel.test.ts | 12 +- src/infra/restart-sentinel.ts | 2 +- src/infra/restart-stale-pids.test.ts | 114 +- src/infra/restart-stale-pids.ts | 10 +- src/infra/restart.test.ts | 20 +- src/infra/restart.ts | 10 +- src/infra/run-node.test.ts | 96 +- src/infra/runtime-guard.ts | 4 +- src/infra/runtime-status.test.ts | 8 +- src/infra/safe-open-sync.test.ts | 10 +- src/infra/secret-file.test.ts | 2 +- src/infra/session-cost-usage.test.ts | 24 +- src/infra/session-cost-usage.ts | 14 +- src/infra/session-maintenance-warning.ts | 4 +- src/infra/shell-env.test.ts | 12 +- src/infra/shell-env.ts | 8 +- src/infra/skills-remote.ts | 6 +- src/infra/stable-node-path.test.ts | 4 +- src/infra/state-migrations.fs.test.ts | 6 +- src/infra/state-migrations.state-dir.test.ts | 8 +- src/infra/state-migrations.test.ts | 14 +- src/infra/state-migrations.ts | 16 +- src/infra/supervisor-markers.test.ts | 24 +- src/infra/supervisor-markers.ts | 14 +- src/infra/system-events.test.ts | 4 +- src/infra/system-presence.test.ts | 4 +- src/infra/system-presence.version.test.ts | 26 +- src/infra/system-run-normalize.ts | 2 +- src/infra/tailscale.test.ts | 4 +- src/infra/tailscale.ts | 4 +- src/infra/tls/gateway.test.ts | 2 +- src/infra/tls/gateway.ts | 2 +- ...law-dir.test.ts => tmp-klawty-dir.test.ts} | 72 +- ...{tmp-openclaw-dir.ts => tmp-klawty-dir.ts} | 36 +- ...handled-rejections.fatal-detection.test.ts | 10 +- src/infra/unhandled-rejections.ts | 12 +- src/infra/update-check.test.ts | 4 +- src/infra/update-check.ts | 2 +- src/infra/update-global.test.ts | 92 +- src/infra/update-global.ts | 12 +- src/infra/update-runner.test.ts | 74 +- src/infra/update-runner.ts | 14 +- src/infra/update-startup.test.ts | 30 +- src/infra/update-startup.ts | 10 +- src/infra/voicewake.test.ts | 6 +- src/infra/voicewake.ts | 2 +- src/infra/warning-filter.test.ts | 8 +- src/infra/warning-filter.ts | 2 +- src/infra/watch-node.test.ts | 14 +- src/infra/widearea-dns.test.ts | 70 +- src/infra/widearea-dns.ts | 18 +- src/infra/windows-task-restart.test.ts | 32 +- src/infra/windows-task-restart.ts | 10 +- src/install-sh-version.test.ts | 32 +- src/line/accounts.test.ts | 30 +- src/line/accounts.ts | 8 +- src/line/auto-reply-delivery.ts | 2 +- src/line/bot-handlers.ts | 8 +- src/line/bot-message-context.test.ts | 10 +- src/line/bot-message-context.ts | 10 +- src/line/bot.ts | 4 +- src/line/download.test.ts | 4 +- src/line/group-keys.ts | 6 +- src/line/monitor.fail-closed.test.ts | 6 +- src/line/monitor.lifecycle.test.ts | 8 +- src/line/monitor.ts | 4 +- src/line/probe.test.ts | 4 +- src/line/send.ts | 4 +- src/link-understanding/apply.ts | 4 +- src/link-understanding/runner.ts | 4 +- src/logger.test.ts | 6 +- src/logging/config.ts | 4 +- src/logging/console-capture.test.ts | 2 +- src/logging/console-settings.test.ts | 12 +- src/logging/console.ts | 12 +- src/logging/diagnostic.ts | 6 +- src/logging/env-log-level.ts | 4 +- src/logging/log-file-size-cap.test.ts | 2 +- src/logging/logger-env.test.ts | 20 +- src/logging/logger-settings.test.ts | 22 +- src/logging/logger-timestamp.test.ts | 2 +- src/logging/logger.browser-import.test.ts | 36 +- src/logging/logger.settings.test.ts | 8 +- src/logging/logger.ts | 28 +- src/logging/redact.ts | 6 +- src/markdown/frontmatter.test.ts | 16 +- .../apply.echo-transcript.test.ts | 12 +- src/media-understanding/apply.test.ts | 50 +- src/media-understanding/apply.ts | 6 +- src/media-understanding/attachments.cache.ts | 2 +- src/media-understanding/audio-preflight.ts | 4 +- .../audio-transcription-runner.ts | 4 +- src/media-understanding/echo-transcript.ts | 4 +- .../media-understanding-misc.test.ts | 6 +- .../providers/deepgram/audio.live.test.ts | 2 +- .../providers/image.test.ts | 14 +- src/media-understanding/providers/image.ts | 4 +- src/media-understanding/providers/index.ts | 8 +- src/media-understanding/resolve.test.ts | 16 +- src/media-understanding/resolve.ts | 14 +- .../runner.auto-audio.test.ts | 18 +- .../runner.deepgram.test.ts | 6 +- src/media-understanding/runner.entries.ts | 16 +- src/media-understanding/runner.proxy.test.ts | 12 +- .../runner.skip-tiny-audio.test.ts | 10 +- src/media-understanding/runner.ts | 20 +- src/media-understanding/runner.video.test.ts | 14 +- .../runner.vision-skip.test.ts | 4 +- src/media-understanding/runtime.test.ts | 10 +- src/media-understanding/runtime.ts | 12 +- .../transcribe-audio.test.ts | 10 +- src/media-understanding/types.ts | 4 +- src/media/host.ts | 2 +- src/media/image-ops.ts | 6 +- src/media/inbound-path-policy.test.ts | 6 +- src/media/inbound-path-policy.ts | 8 +- src/media/input-files.ts | 2 +- src/media/local-roots.ts | 8 +- src/media/server.outside-workspace.test.ts | 2 +- src/media/server.test.ts | 2 +- src/media/store.outside-workspace.test.ts | 2 +- src/media/store.redirect.test.ts | 6 +- src/media/store.test.ts | 4 +- src/media/web-media.ts | 2 +- src/memory/backend-config.test.ts | 16 +- src/memory/backend-config.ts | 4 +- src/memory/batch-gemini.ts | 2 +- src/memory/batch-openai.ts | 2 +- src/memory/embedding-manager.test-harness.ts | 4 +- src/memory/embeddings-debug.ts | 2 +- src/memory/embeddings-ollama.test.ts | 10 +- src/memory/embeddings.ts | 6 +- src/memory/index.test.ts | 44 +- src/memory/manager-sync-ops.ts | 12 +- src/memory/manager.async-search.test.ts | 8 +- src/memory/manager.atomic-reindex.test.ts | 8 +- src/memory/manager.batch.test.ts | 8 +- src/memory/manager.embedding-batches.test.ts | 2 +- src/memory/manager.get-concurrency.test.ts | 8 +- src/memory/manager.mistral-provider.test.ts | 8 +- src/memory/manager.read-file.test.ts | 8 +- src/memory/manager.readonly-recovery.test.ts | 8 +- .../manager.sync-errors-do-not-crash.test.ts | 6 +- src/memory/manager.ts | 8 +- src/memory/manager.vector-dedupe.test.ts | 6 +- src/memory/manager.watcher-config.test.ts | 12 +- src/memory/qmd-manager.test.ts | 104 +- src/memory/qmd-manager.ts | 24 +- src/memory/qmd-process.test.ts | 2 +- src/memory/search-manager.test.ts | 4 +- src/memory/search-manager.ts | 4 +- src/memory/session-files.test.ts | 2 +- src/memory/temporal-decay.test.ts | 2 +- src/memory/test-manager-helpers.ts | 4 +- src/memory/test-manager.ts | 4 +- src/node-host/invoke-browser.test.ts | 10 +- src/node-host/invoke-system-run-plan.test.ts | 32 +- src/node-host/invoke-system-run.test.ts | 46 +- src/node-host/invoke.ts | 4 +- src/node-host/runner.credentials.test.ts | 40 +- src/node-host/runner.ts | 12 +- src/pairing/pairing-messages.test.ts | 8 +- src/pairing/pairing-messages.ts | 4 +- src/pairing/pairing-store.test.ts | 4 +- src/pairing/setup-code.test.ts | 14 +- src/pairing/setup-code.ts | 30 +- src/plugin-sdk/account-resolution.ts | 2 +- src/plugin-sdk/acpx.ts | 8 +- src/plugin-sdk/allowlist-config-edit.ts | 8 +- src/plugin-sdk/bluebubbles.ts | 4 +- src/plugin-sdk/channel-config-helpers.test.ts | 2 +- src/plugin-sdk/channel-config-helpers.ts | 34 +- .../channel-import-guardrails.test.ts | 22 +- src/plugin-sdk/channel-plugin-common.ts | 2 +- src/plugin-sdk/channel-setup.test.ts | 6 +- src/plugin-sdk/command-auth.test.ts | 4 +- src/plugin-sdk/command-auth.ts | 8 +- src/plugin-sdk/compat.ts | 6 +- src/plugin-sdk/config-paths.ts | 4 +- src/plugin-sdk/copilot-proxy.ts | 2 +- src/plugin-sdk/core.ts | 44 +- src/plugin-sdk/device-pair.ts | 2 +- src/plugin-sdk/diagnostics-otel.ts | 6 +- src/plugin-sdk/diffs.ts | 10 +- src/plugin-sdk/discord-core.ts | 2 +- src/plugin-sdk/discord.ts | 4 +- src/plugin-sdk/entrypoints.ts | 2 +- src/plugin-sdk/feishu.ts | 4 +- src/plugin-sdk/file-lock.ts | 2 +- src/plugin-sdk/googlechat.ts | 8 +- src/plugin-sdk/imessage.ts | 4 +- src/plugin-sdk/inbound-reply-dispatch.ts | 8 +- src/plugin-sdk/index.test.ts | 10 +- src/plugin-sdk/index.ts | 10 +- src/plugin-sdk/infra-runtime.ts | 2 +- src/plugin-sdk/irc.ts | 4 +- src/plugin-sdk/line-core.ts | 2 +- src/plugin-sdk/line.ts | 4 +- src/plugin-sdk/llm-task.ts | 4 +- src/plugin-sdk/lobster.ts | 6 +- src/plugin-sdk/matrix.ts | 6 +- src/plugin-sdk/mattermost.ts | 4 +- src/plugin-sdk/memory-core.ts | 2 +- src/plugin-sdk/memory-lancedb.ts | 2 +- src/plugin-sdk/minimax-portal-auth.ts | 2 +- src/plugin-sdk/msteams.ts | 6 +- src/plugin-sdk/nextcloud-talk.ts | 4 +- src/plugin-sdk/nostr.ts | 6 +- src/plugin-sdk/ollama-setup.ts | 2 +- src/plugin-sdk/open-prose.ts | 2 +- .../package-contract-guardrails.test.ts | 4 +- src/plugin-sdk/persistent-dedupe.test.ts | 2 +- src/plugin-sdk/phone-control.ts | 6 +- src/plugin-sdk/plugin-entry.ts | 36 +- src/plugin-sdk/provider-auth-api-key.ts | 2 +- src/plugin-sdk/provider-auth-result.ts | 6 +- src/plugin-sdk/provider-auth.ts | 2 +- src/plugin-sdk/provider-onboard.ts | 2 +- src/plugin-sdk/provider-setup.ts | 2 +- src/plugin-sdk/qwen-portal-auth.ts | 2 +- src/plugin-sdk/runtime-api-guardrails.test.ts | 18 +- src/plugin-sdk/sandbox.ts | 4 +- src/plugin-sdk/self-hosted-provider-setup.ts | 2 +- src/plugin-sdk/setup.ts | 2 +- src/plugin-sdk/signal.ts | 4 +- src/plugin-sdk/slack-core.ts | 2 +- src/plugin-sdk/slack.ts | 4 +- src/plugin-sdk/subpaths.test.ts | 76 +- src/plugin-sdk/synology-chat.ts | 4 +- src/plugin-sdk/talk-voice.ts | 2 +- src/plugin-sdk/telegram-core.ts | 2 +- src/plugin-sdk/telegram.ts | 4 +- src/plugin-sdk/temp-path.test.ts | 8 +- src/plugin-sdk/temp-path.ts | 4 +- src/plugin-sdk/test-utils.ts | 2 +- src/plugin-sdk/testing.ts | 2 +- src/plugin-sdk/thread-ownership.ts | 4 +- src/plugin-sdk/tlon.ts | 6 +- src/plugin-sdk/twitch.ts | 6 +- src/plugin-sdk/voice-call.ts | 2 +- src/plugin-sdk/whatsapp-core.ts | 2 +- src/plugin-sdk/whatsapp.ts | 4 +- src/plugin-sdk/zalo.ts | 4 +- src/plugin-sdk/zalouser.ts | 8 +- src/plugins/build-smoke-entry.ts | 2 +- src/plugins/bundle-claude-inspect.test.ts | 2 +- src/plugins/bundle-lsp.ts | 4 +- src/plugins/bundle-manifest.test.ts | 2 +- src/plugins/bundle-manifest.ts | 2 +- src/plugins/bundle-mcp.test-support.ts | 2 +- src/plugins/bundle-mcp.test.ts | 42 +- src/plugins/bundle-mcp.ts | 4 +- src/plugins/bundled-dir.test.ts | 22 +- src/plugins/bundled-dir.ts | 8 +- .../bundled-provider-auth-env-vars.test.ts | 4 +- src/plugins/bundled-sources.test.ts | 58 +- src/plugins/bundled-sources.ts | 4 +- src/plugins/captured-registration.ts | 8 +- src/plugins/channel-plugin-ids.ts | 8 +- src/plugins/cli.test.ts | 16 +- src/plugins/cli.ts | 8 +- src/plugins/commands.ts | 18 +- src/plugins/config-schema.ts | 4 +- src/plugins/config-state.ts | 20 +- .../contracts/auth-choice.contract.test.ts | 12 +- src/plugins/contracts/auth.contract.test.ts | 20 +- .../contracts/discovery.contract.test.ts | 18 +- .../contracts/runtime.contract.test.ts | 8 +- src/plugins/contracts/shape.contract.test.ts | 10 +- src/plugins/contracts/suites.ts | 4 +- src/plugins/conversation-binding.test.ts | 10 +- src/plugins/conversation-binding.ts | 10 +- .../copy-bundled-plugin-metadata.test.ts | 66 +- src/plugins/discovery.test.ts | 88 +- src/plugins/discovery.ts | 14 +- src/plugins/enable.test.ts | 14 +- src/plugins/enable.ts | 6 +- src/plugins/hook-runner-global.ts | 2 +- src/plugins/hooks.test-helpers.ts | 2 +- src/plugins/http-route-overlap.ts | 6 +- src/plugins/install.test.ts | 108 +- src/plugins/install.ts | 34 +- src/plugins/installs.test.ts | 8 +- src/plugins/installs.ts | 6 +- src/plugins/loader.test.ts | 402 +-- src/plugins/loader.ts | 46 +- src/plugins/manifest-registry.test.ts | 22 +- src/plugins/manifest-registry.ts | 20 +- src/plugins/manifest.ts | 14 +- src/plugins/marketplace.test.ts | 2 +- src/plugins/marketplace.ts | 4 +- src/plugins/provider-api-key-auth.ts | 6 +- src/plugins/provider-auth-choice-helpers.ts | 4 +- .../provider-auth-choice-preference.ts | 4 +- src/plugins/provider-auth-choice.ts | 22 +- src/plugins/provider-auth-choices.ts | 10 +- src/plugins/provider-auth-helpers.ts | 10 +- src/plugins/provider-auth-input.ts | 16 +- src/plugins/provider-auth-storage.ts | 4 +- src/plugins/provider-catalog.test.ts | 4 +- src/plugins/provider-discovery.ts | 6 +- src/plugins/provider-model-allowlist.ts | 6 +- src/plugins/provider-model-defaults.ts | 18 +- src/plugins/provider-model-primary.ts | 8 +- src/plugins/provider-ollama-setup.ts | 16 +- src/plugins/provider-onboarding-config.ts | 40 +- .../provider-openai-codex-oauth-tls.ts | 10 +- src/plugins/provider-openai-codex-oauth.ts | 2 +- src/plugins/provider-runtime.ts | 56 +- src/plugins/provider-self-hosted-setup.ts | 14 +- src/plugins/provider-vllm-setup.ts | 6 +- src/plugins/provider-wizard.test.ts | 2 +- src/plugins/provider-wizard.ts | 8 +- src/plugins/providers.test.ts | 24 +- src/plugins/providers.ts | 4 +- src/plugins/registry.ts | 70 +- src/plugins/roots.ts | 2 +- src/plugins/runtime.ts | 2 +- src/plugins/runtime/gateway-request-scope.ts | 2 +- src/plugins/runtime/index.ts | 2 +- .../runtime/runtime-discord-ops.runtime.ts | 14 +- src/plugins/runtime/runtime-discord.ts | 4 +- src/plugins/runtime/runtime-imessage.ts | 2 +- .../runtime/runtime-slack-ops.runtime.ts | 14 +- .../runtime/runtime-telegram-ops.runtime.ts | 8 +- .../runtime/runtime-telegram-typing.ts | 6 +- src/plugins/runtime/runtime-telegram.ts | 8 +- .../runtime/runtime-whatsapp-boundary.ts | 2 +- src/plugins/runtime/types-channel.ts | 2 +- src/plugins/runtime/types-core.ts | 4 +- src/plugins/sdk-alias.ts | 26 +- src/plugins/services.test.ts | 12 +- src/plugins/services.ts | 10 +- src/plugins/signal-cli-install.ts | 4 +- src/plugins/slots.test.ts | 8 +- src/plugins/slots.ts | 6 +- src/plugins/source-display.test.ts | 18 +- .../stage-bundled-plugin-runtime.test.ts | 34 +- src/plugins/status.test.ts | 26 +- src/plugins/status.ts | 4 +- src/plugins/toggle-config.ts | 8 +- src/plugins/tools.optional.test.ts | 14 +- src/plugins/tools.ts | 8 +- src/plugins/types.ts | 174 +- src/plugins/uninstall.test.ts | 40 +- src/plugins/uninstall.ts | 12 +- src/plugins/update.test.ts | 76 +- src/plugins/update.ts | 12 +- src/plugins/web-search-providers.test.ts | 12 +- src/plugins/web-search-providers.ts | 4 +- src/plugins/wired-hooks-gateway.test.ts | 8 +- src/process/command-queue.ts | 2 +- src/process/exec.test.ts | 16 +- src/process/exec.ts | 4 +- src/process/supervisor/adapters/child.test.ts | 10 +- src/process/supervisor/adapters/child.ts | 2 +- src/providers/qwen-portal-oauth.ts | 2 +- src/routing/bindings.ts | 10 +- src/routing/resolve-route.test.ts | 68 +- src/routing/resolve-route.ts | 34 +- src/runtime.ts | 2 +- src/scripts/canvas-a2ui-copy.test.ts | 12 +- src/scripts/ci-changed-scope.test.ts | 6 +- src/secrets/apply.test.ts | 10 +- src/secrets/apply.ts | 22 +- src/secrets/audit.test.ts | 14 +- src/secrets/audit.ts | 10 +- src/secrets/auth-store-paths.ts | 6 +- src/secrets/command-config.test.ts | 14 +- src/secrets/command-config.ts | 10 +- src/secrets/configure-plan.test.ts | 20 +- src/secrets/configure-plan.ts | 28 +- src/secrets/configure.ts | 24 +- src/secrets/credential-matrix.ts | 6 +- src/secrets/exec-resolution-policy.ts | 4 +- src/secrets/exec-secret-ref-id-parity.test.ts | 2 +- src/secrets/path-utils.test.ts | 8 +- src/secrets/path-utils.ts | 8 +- src/secrets/plan.ts | 2 +- src/secrets/provider-env-vars.test.ts | 6 +- src/secrets/provider-env-vars.ts | 2 +- src/secrets/resolve-secret-input-string.ts | 6 +- src/secrets/resolve.test.ts | 6 +- src/secrets/resolve.ts | 8 +- .../runtime-config-collectors-channels.ts | 26 +- src/secrets/runtime-config-collectors-core.ts | 16 +- src/secrets/runtime-config-collectors.ts | 4 +- .../runtime-gateway-auth-surfaces.test.ts | 28 +- src/secrets/runtime-gateway-auth-surfaces.ts | 4 +- src/secrets/runtime-shared.ts | 8 +- src/secrets/runtime-web-tools.test.ts | 14 +- src/secrets/runtime-web-tools.ts | 14 +- src/secrets/runtime.coverage.test.ts | 22 +- src/secrets/runtime.test.ts | 158 +- src/secrets/runtime.ts | 16 +- src/secrets/storage-scan.ts | 8 +- src/secrets/target-registry-data.ts | 146 +- src/secrets/target-registry-query.ts | 20 +- src/secrets/target-registry-types.ts | 2 +- src/secrets/target-registry.test.ts | 4 +- src/security/audit-channel.runtime.ts | 2 +- src/security/audit-channel.ts | 14 +- src/security/audit-extra.async.ts | 44 +- src/security/audit-extra.sync.test.ts | 8 +- src/security/audit-extra.sync.ts | 76 +- src/security/audit.test.ts | 310 +- src/security/audit.ts | 44 +- src/security/auto-update.js | 470 +++ src/security/credential-monitor.js | 448 +++ src/security/dangerous-config-flags.ts | 4 +- src/security/dm-policy-shared.ts | 2 +- src/security/exec-sandbox.js | 229 ++ src/security/fix.test.ts | 20 +- src/security/fix.ts | 14 +- src/security/integrity-check.js | 188 ++ src/security/klawty-boot.js | 95 + src/security/policy-enforcer.js | 493 +++ src/security/privacy-router.js | 211 ++ src/security/temp-path-guard.test.ts | 10 +- src/security/tui-dashboard.js | 624 ++++ src/security/windows-acl.test.ts | 4 +- src/sessions/send-policy.test.ts | 12 +- src/sessions/send-policy.ts | 4 +- src/shared/assistant-identity-values.test.ts | 10 +- src/shared/avatar-policy.test.ts | 10 +- src/shared/entry-metadata.test.ts | 16 +- src/shared/entry-status.test.ts | 16 +- src/shared/frontmatter.test.ts | 56 +- src/shared/frontmatter.ts | 24 +- src/shared/gateway-bind-url.test.ts | 14 +- src/terminal/ansi.test.ts | 2 +- src/terminal/links.ts | 2 +- src/terminal/note.ts | 2 +- src/terminal/table.test.ts | 8 +- src/test-helpers/state-dir-env.test.ts | 24 +- src/test-helpers/state-dir-env.ts | 4 +- src/test-helpers/whatsapp-outbound.ts | 6 +- src/test-helpers/workspace.ts | 2 +- src/test-utils/auth-token-assertions.ts | 4 +- src/test-utils/env.test.ts | 18 +- src/test-utils/exec-assertions.ts | 2 +- src/test-utils/plugin-registration.ts | 6 +- src/test-utils/temp-home.test.ts | 8 +- src/test-utils/temp-home.ts | 6 +- src/tts/provider-registry.ts | 14 +- src/tts/provider-types.ts | 10 +- src/tts/providers/microsoft.ts | 4 +- src/tts/tts-core.ts | 6 +- src/tts/tts.test.ts | 30 +- src/tts/tts.ts | 30 +- src/tui/commands.ts | 4 +- src/tui/gateway-chat.test.ts | 28 +- src/tui/gateway-chat.ts | 8 +- src/tui/theme/theme.test.ts | 48 +- src/tui/theme/theme.ts | 2 +- src/tui/tui-local-shell.test.ts | 4 +- src/tui/tui-local-shell.ts | 2 +- src/tui/tui.test.ts | 16 +- src/tui/tui.ts | 10 +- src/utils.test.ts | 62 +- src/utils.ts | 10 +- src/utils/message-channel.ts | 2 +- src/utils/queue-helpers.ts | 2 +- src/utils/usage-format.test.ts | 22 +- src/utils/usage-format.ts | 10 +- src/version.test.ts | 28 +- src/version.ts | 14 +- src/web-search/runtime.ts | 14 +- src/wizard/setup.completion.test.ts | 8 +- src/wizard/setup.finalize.test.ts | 26 +- src/wizard/setup.finalize.ts | 58 +- src/wizard/setup.gateway-config.test.ts | 50 +- src/wizard/setup.gateway-config.ts | 22 +- src/wizard/setup.secret-input.test.ts | 14 +- src/wizard/setup.secret-input.ts | 6 +- src/wizard/setup.test.ts | 34 +- src/wizard/setup.ts | 36 +- test/cli-json-stdout.e2e.test.ts | 12 +- .../exec-allowlist-shell-parser-parity.json | 2 +- test/fixtures/test-timings.unit.json | 2 +- test/gateway.multi.e2e.test.ts | 4 +- test/git-hooks-pre-commit.test.ts | 2 +- test/helpers/auth-wizard.ts | 12 +- test/helpers/extensions/directory.ts | 2 +- .../discord-provider.test-support.ts | 42 +- test/helpers/extensions/plugin-api.ts | 8 +- test/helpers/extensions/plugin-command.ts | 2 +- .../helpers/extensions/plugin-runtime-mock.ts | 8 +- test/helpers/extensions/runtime-env.ts | 2 +- .../extensions/start-account-context.ts | 6 +- .../extensions/start-account-lifecycle.ts | 2 +- .../extensions/telegram-plugin-command.ts | 2 +- test/helpers/gateway-e2e-harness.ts | 28 +- test/helpers/temp-home.ts | 20 +- ...2e.test.ts => klawty-launcher.e2e.test.ts} | 20 +- ...st.ts => klawty-npm-release-check.test.ts} | 14 +- test/openshell-sandbox.e2e.test.ts | 48 +- test/plugin-npm-release.test.ts | 30 +- test/release-check.test.ts | 18 +- test/scripts/check-no-raw-window-open.test.ts | 4 +- test/scripts/ios-team-id.test.ts | 2 +- test/scripts/ui.test.ts | 2 +- test/setup.ts | 12 +- test/test-env.ts | 44 +- tsconfig.json | 6 +- tsdown.config.ts | 16 +- ui/index.html | 6 +- ui/package.json | 2 +- ui/src/i18n/lib/translate.ts | 4 +- ui/src/i18n/locales/de.ts | 4 +- ui/src/i18n/locales/en.ts | 4 +- ui/src/i18n/locales/es.ts | 4 +- ui/src/i18n/locales/pt-BR.ts | 4 +- ui/src/i18n/locales/zh-CN.ts | 4 +- ui/src/i18n/locales/zh-TW.ts | 4 +- ui/src/i18n/test/translate.test.ts | 2 +- ui/src/ui/app-channels.ts | 30 +- ui/src/ui/app-chat.test.ts | 4 +- ui/src/ui/app-chat.ts | 12 +- ui/src/ui/app-gateway.node.test.ts | 10 +- ui/src/ui/app-gateway.sessions.node.test.ts | 2 +- ui/src/ui/app-gateway.ts | 28 +- ui/src/ui/app-lifecycle-connect.node.test.ts | 2 +- ui/src/ui/app-lifecycle.node.test.ts | 2 +- ui/src/ui/app-polling.ts | 8 +- ui/src/ui/app-render.helpers.ts | 16 +- ui/src/ui/app-render.ts | 8 +- ui/src/ui/app-scroll.ts | 2 +- ui/src/ui/app-settings.test.ts | 10 +- ui/src/ui/app-settings.ts | 56 +- ui/src/ui/app.ts | 6 +- ui/src/ui/chat/deleted-messages.ts | 2 +- ui/src/ui/chat/grouped-render.ts | 2 +- ui/src/ui/chat/pinned-messages.ts | 2 +- ui/src/ui/components/dashboard-header.ts | 2 +- ui/src/ui/controllers/chat.ts | 2 +- ui/src/ui/controllers/config.test.ts | 4 +- .../controllers/control-ui-bootstrap.test.ts | 10 +- ui/src/ui/controllers/usage.ts | 2 +- ui/src/ui/device-auth.ts | 2 +- ui/src/ui/device-identity.ts | 2 +- ui/src/ui/navigation.browser.test.ts | 46 +- ui/src/ui/navigation.test.ts | 10 +- ui/src/ui/open-external-url.test.ts | 10 +- ui/src/ui/storage.node.test.ts | 34 +- ui/src/ui/storage.ts | 14 +- ui/src/ui/test-helpers/app-mount.ts | 8 +- ui/src/ui/tool-display.ts | 2 +- ui/src/ui/views/agents-panels-status-files.ts | 2 +- ui/src/ui/views/agents-utils.test.ts | 2 +- ui/src/ui/views/chat.browser.test.ts | 2 +- ui/src/ui/views/chat.test.ts | 14 +- ui/src/ui/views/chat.ts | 4 +- ui/src/ui/views/config.browser.test.ts | 2 +- ui/src/ui/views/debug.ts | 2 +- ui/src/ui/views/login-gate.ts | 12 +- ui/src/ui/views/overview.ts | 30 +- ui/src/ui/views/skills-grouping.ts | 8 +- ui/src/ui/views/skills.ts | 2 +- ui/src/ui/views/usage.ts | 6 +- ui/vite.config.ts | 4 +- vitest.config.ts | 8 +- vitest.e2e.config.ts | 6 +- vitest.unit-paths.mjs | 2 +- workspace/.env.example | 22 + workspace/AGENTS.md | 7 + workspace/HEARTBEAT.md | 3 + workspace/MEMORY.md | 17 + workspace/SOUL.md | 15 + workspace/TOOLS.md | 11 + workspace/agents/main/AGENT.md | 28 + workspace/klawty.json | 33 + workspace/skills/web-research/SKILL.md | 28 + 5066 files changed, 40177 insertions(+), 39683 deletions(-) rename .github/workflows/{openclaw-npm-release.yml => klawty-npm-release.yml} (84%) create mode 100644 2026-03-19T12-25-44.486Z-klawty-backup.tar.gz create mode 100644 KLAWTY-CHANGELOG.md rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/CameraHudState.kt (87%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/DeviceNames.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/LocationMode.kt (93%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/MainActivity.kt (94%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/MainViewModel.kt (95%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/NodeApp.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/NodeForegroundService.kt (93%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/NodeRuntime.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/PermissionRequester.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/SecurePrefs.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/SessionKey.kt (93%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/VoiceWakeMode.kt (92%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/WakeWords.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/chat/ChatController.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/chat/ChatModels.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/BonjourEscapes.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/DeviceAuthPayload.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/DeviceAuthStore.kt (93%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/DeviceIdentityStore.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/GatewayDiscovery.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/GatewayEndpoint.kt (95%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/GatewayProtocol.kt (55%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/GatewaySession.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/GatewayTls.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/gateway/InvokeErrorParser.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/A2UIHandler.kt (90%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/CalendarHandler.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/CallLogHandler.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/CameraCaptureManager.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/CameraHandler.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/CanvasController.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/ConnectionManager.kt (88%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/ContactsHandler.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/DebugHandler.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/DeviceHandler.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/DeviceNotificationListenerService.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/GatewayEventHandler.kt (94%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/InvokeCommandRegistry.kt (63%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/InvokeDispatcher.kt (72%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/JpegSizeLimiter.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/LocationCaptureManager.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/LocationHandler.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/MotionHandler.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/NodeUtils.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/NotificationsHandler.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/PhotosHandler.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/SmsHandler.kt (92%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/SmsManager.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/node/SystemHandler.kt (95%) rename apps/android/app/src/main/java/ai/{openclaw/app/protocol/OpenClawCanvasA2UIAction.kt => klawty/app/protocol/KlawtyCanvasA2UIAction.kt} (89%) rename apps/android/app/src/main/java/ai/{openclaw/app/protocol/OpenClawProtocolConstants.kt => klawty/app/protocol/KlawtyProtocolConstants.kt} (72%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/tools/ToolDisplay.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/CameraHudOverlay.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/CanvasScreen.kt (91%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/ChatSheet.kt (56%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/ConnectTabScreen.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/GatewayConfigResolver.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/GatewayDiagnostics.kt (85%) rename apps/android/app/src/main/java/ai/{openclaw/app/ui/OpenClawTheme.kt => klawty/app/ui/KlawtyTheme.kt} (94%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/MobileUiTokens.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/OnboardingFlow.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/PostOnboardingTabs.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/RootScreen.kt (89%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/SettingsSheet.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/TalkOrbOverlay.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/VoiceTabScreen.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/Base64ImageState.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/ChatComposer.kt (94%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/ChatImageCodec.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/ChatMarkdown.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/ChatMessageListCard.kt (90%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/ChatMessageViews.kt (89%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/ChatSheetContent.kt (91%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/ui/chat/SessionFilters.kt (96%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/ElevenLabsStreamingTts.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/MicCaptureManager.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/StreamingMediaDataSource.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/TalkDefaults.kt (71%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/TalkDirectiveParser.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/TalkModeGatewayConfig.kt (98%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/TalkModeManager.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/TalkModeVoiceResolver.kt (99%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/VoiceWakeCommandExtractor.kt (97%) rename apps/android/app/src/main/java/ai/{openclaw => klawty}/app/voice/VoiceWakeManager.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/NodeForegroundServiceTest.kt (98%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/SecurePrefsTest.kt (84%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/WakeWordsTest.kt (67%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/chat/ChatControllerMessageIdentityTest.kt (98%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/gateway/BonjourEscapesTest.kt (78%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/gateway/DeviceAuthPayloadTest.kt (81%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/gateway/GatewaySessionInvokeTest.kt (98%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/gateway/GatewaySessionInvokeTimeoutTest.kt (80%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/gateway/InvokeErrorParserTest.kt (97%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/CalendarHandlerTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/CallLogHandlerTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/CameraHandlerTest.kt (96%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/CanvasControllerSnapshotParamsTest.kt (97%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/ConnectionManagerTest.kt (90%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/ContactsHandlerTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/DeviceHandlerTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/InvokeCommandRegistryTest.kt (60%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/JpegSizeLimiterTest.kt (97%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/MotionHandlerTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/NodeHandlerRobolectricTest.kt (91%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/NotificationsHandlerTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/PhotosHandlerTest.kt (98%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/SmsManagerTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/node/SystemHandlerTest.kt (83%) rename apps/android/app/src/test/java/ai/{openclaw/app/protocol/OpenClawCanvasA2UIActionTest.kt => klawty/app/protocol/KlawtyCanvasA2UIActionTest.kt} (64%) create mode 100644 apps/android/app/src/test/java/ai/klawty/app/protocol/KlawtyProtocolConstantsTest.kt rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/ui/GatewayConfigResolverTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/ui/chat/ChatImageCodecTest.kt (94%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/ui/chat/SessionFiltersTest.kt (93%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/voice/TalkDirectiveParserTest.kt (98%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/voice/TalkModeConfigContractTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/voice/TalkModeConfigParsingTest.kt (99%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/voice/TalkModeVoiceResolverTest.kt (98%) rename apps/android/app/src/test/java/ai/{openclaw => klawty}/app/voice/VoiceWakeCommandExtractorTest.kt (76%) delete mode 100644 apps/android/app/src/test/java/ai/openclaw/app/protocol/OpenClawProtocolConstantsTest.kt rename apps/android/benchmark/src/main/java/ai/{openclaw => klawty}/app/benchmark/StartupMacrobenchmark.kt (96%) create mode 100644 apps/ios/ActivityWidget/KlawtyActivityWidgetBundle.swift rename apps/ios/ActivityWidget/{OpenClawLiveActivity.swift => KlawtyLiveActivity.swift} (82%) delete mode 100644 apps/ios/ActivityWidget/OpenClawActivityWidgetBundle.swift rename apps/ios/Sources/{OpenClaw.entitlements => Klawty.entitlements} (100%) rename apps/ios/Sources/{OpenClawApp.swift => KlawtyApp.swift} (92%) rename apps/ios/Sources/LiveActivity/{OpenClawActivityAttributes.swift => KlawtyActivityAttributes.swift} (65%) rename apps/ios/WatchExtension/Sources/{OpenClawWatchApp.swift => KlawtyWatchApp.swift} (96%) rename apps/macos/Icon.icon/Assets/{openclaw-mac.png => klawty-mac.png} (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/AboutSettings.swift (92%) rename apps/macos/Sources/{OpenClaw => Klawty}/AgeFormatting.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/AgentEventStore.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/AgentEventsWindow.swift (93%) rename apps/macos/Sources/{OpenClaw => Klawty}/AgentWorkspace.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/AgentWorkspaceConfig.swift (100%) create mode 100644 apps/macos/Sources/Klawty/AnyCodable+Helpers.swift rename apps/macos/Sources/{OpenClaw => Klawty}/AppState.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/AudioInputDeviceObserver.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/CLIInstallPrompter.swift (91%) rename apps/macos/Sources/{OpenClaw => Klawty}/CLIInstaller.swift (91%) rename apps/macos/Sources/{OpenClaw => Klawty}/CameraCaptureService.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasA2UIActionMessageHandler.swift (90%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasChromeContainerView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasFileWatcher.swift (85%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasManager.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasScheme.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasSchemeHandler.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasWindow.swift (89%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasWindowController+Helpers.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasWindowController+Navigation.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasWindowController+Testing.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasWindowController+Window.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/CanvasWindowController.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelConfigForm.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsSettings+ChannelSections.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsSettings+ChannelState.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsSettings+Helpers.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsSettings+View.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsSettings.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsStore+Config.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsStore+Lifecycle.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/ChannelsStore.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/CoalescingFSEventsWatcher.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ColorHexSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CommandResolver.swift (88%) rename apps/macos/Sources/{OpenClaw => Klawty}/ConfigFileWatcher.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/ConfigSchemaSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ConfigSettings.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/ConfigStore.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/ConnectionModeCoordinator.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/ConnectionModeResolver.swift (96%) create mode 100644 apps/macos/Sources/Klawty/Constants.swift rename apps/macos/Sources/{OpenClaw => Klawty}/ContextMenuCardView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ContextUsageBar.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ControlChannel.swift (94%) rename apps/macos/Sources/{OpenClaw => Klawty}/CostUsageMenuView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CritterIconRenderer.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CritterStatusLabel+Behavior.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CritterStatusLabel.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronJobEditor+Helpers.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronJobEditor+Testing.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronJobEditor.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronJobsStore.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronModels.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronSettings+Actions.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronSettings+Helpers.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronSettings+Layout.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronSettings+Rows.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronSettings+Testing.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/CronSettings.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/DebugActions.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/DebugSettings.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/DeepLinks.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/DeviceModelCatalog.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/DevicePairingApprovalPrompter.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/DiagnosticsFileLog.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/DockIconManager.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/DurationFormattingSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecAllowlistMatcher.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecApprovalEvaluation.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecApprovals.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecApprovalsGatewayPrompter.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecApprovalsSocket.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecCommandResolution.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecEnvInvocationUnwrapper.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecEnvOptions.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecHostRequestEvaluator.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecShellWrapperParser.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ExecSystemRunCommandValidator.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/FileHandle+SafeRead.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayAutostartPolicy.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayConnection.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayConnectivityCoordinator.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayDiscoveryHelpers.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayDiscoveryMenu.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayDiscoveryPreferences.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayDiscoverySelectionSupport.swift (92%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayEndpointStore.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayEnvironment.swift (92%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayLaunchAgentManager.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayProcessManager.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayPushSubscription.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/GatewayRemoteConfig.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/GeneralSettings.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/HealthStore.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/HeartbeatStore.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/HostEnvSanitizer.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/HostEnvSecurityPolicy.generated.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/HoverHUD.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/IconState.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/InstancesSettings.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/InstancesStore.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/JSONObjectExtractionSupport.swift (100%) rename apps/macos/Sources/{OpenClaw/OpenClawConfigFile.swift => Klawty/KlawtyConfigFile.swift} (97%) rename apps/macos/Sources/{OpenClaw/OpenClawPaths.swift => Klawty/KlawtyPaths.swift} (72%) rename apps/macos/Sources/{OpenClaw => Klawty}/LaunchAgentManager.swift (93%) rename apps/macos/Sources/{OpenClaw => Klawty}/Launchctl.swift (93%) rename apps/macos/Sources/{OpenClaw => Klawty}/LaunchdManager.swift (87%) rename apps/macos/Sources/{OpenClaw => Klawty}/LogLocator.swift (79%) rename apps/macos/Sources/{OpenClaw/Logging/OpenClawLogging.swift => Klawty/Logging/KlawtyLogging.swift} (91%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuBar.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuContentView.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuContextCardInjector.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuHeaderCard.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuHighlightedHostView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuHostedItem.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuItemHighlightColors.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuSessionsHeaderView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuSessionsInjector.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MenuUsageHeaderView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/MicLevelMonitor.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/MicRefreshSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ModelCatalogLoader.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/NSAttributedString+VoiceWake.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodeMode/MacNodeBrowserProxy.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodeMode/MacNodeLocationService.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodeMode/MacNodeModeCoordinator.swift (75%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodeMode/MacNodeRuntime.swift (89%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodeMode/MacNodeRuntimeMainActorServices.swift (93%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodeMode/MacNodeScreenCommands.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodePairingApprovalPrompter.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodeServiceManager.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodesMenu.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/NodesStore.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/NotificationManager.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/NotifyOverlay.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/Onboarding.swift (93%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Actions.swift (90%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Chat.swift (92%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Layout.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Monitoring.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Pages.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Testing.swift (91%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Wizard.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingView+Workspace.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingWidgets.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/OnboardingWizard.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/OverlayPanelFactory.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/PairingAlertSupport.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/PeekabooBridgeHostCoordinator.swift (90%) rename apps/macos/Sources/{OpenClaw => Klawty}/PermissionManager.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/PermissionMonitoringSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/PermissionsSettings.swift (92%) rename apps/macos/Sources/{OpenClaw => Klawty}/PlatformLabelFormatter.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/PointingHandCursor.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/PortGuardian.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/PresenceReporter.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/Process+PipeRead.swift (100%) rename apps/macos/Sources/{OpenClaw/ProcessInfo+OpenClaw.swift => Klawty/ProcessInfo+Klawty.swift} (89%) rename apps/macos/Sources/{OpenClaw => Klawty}/RemoteGatewayProbe.swift (89%) rename apps/macos/Sources/{OpenClaw => Klawty}/RemotePortTunnel.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/RemoteTunnelManager.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/Resources/DeviceModels/LICENSE.apple-device-identifiers.txt (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/Resources/DeviceModels/NOTICE.md (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/Resources/DeviceModels/ios-device-identifiers.json (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/Resources/DeviceModels/mac-device-identifiers.json (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/Resources/Info.plist (60%) rename apps/macos/Sources/{OpenClaw/Resources/OpenClaw.icns => Klawty/Resources/Klawty.icns} (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/RuntimeLocator.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/ScreenRecordService.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/ScreenshotSize.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SelectableRow.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SessionActions.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/SessionData.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/SessionMenuLabelView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SessionMenuPreviewView.swift (94%) rename apps/macos/Sources/{OpenClaw => Klawty}/SessionsSettings.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SettingsComponents.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SettingsRefreshButton.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SettingsRootView.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/SettingsSidebarCard.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SettingsSidebarScroll.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SettingsWindowOpener.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/ShellExecutor.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/SimpleFileWatcher.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SimpleFileWatcherOwner.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SimpleTaskSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SkillsModels.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/SkillsSettings.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/SoundEffects.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/StatusPill.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/String+NonEmpty.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SystemPresenceInfo.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/SystemRunSettingsView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/SystemSettingsURLSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/TailscaleIntegrationSection.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/TailscaleService.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkAudioPlayer.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkDefaults.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkModeController.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkModeGatewayConfig.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkModeRuntime.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkModeTypes.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkOverlay.swift (97%) rename apps/macos/Sources/{OpenClaw => Klawty}/TalkOverlayView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/TerminationSignalWatcher.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/TextSummarySupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/TrackingAreaSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/UsageCostData.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/UsageData.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/UsageMenuLabelView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/UserDefaultsMigration.swift (83%) rename apps/macos/Sources/{OpenClaw => Klawty}/ViewMetrics.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VisualEffectView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceOverlayTextFormatting.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoicePushToTalk.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceSessionCoordinator.swift (98%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeChime.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeForwarder.swift (96%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeGlobalSettingsSync.swift (95%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeHelpers.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeOverlay.swift (90%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeOverlayController+Session.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeOverlayController+Testing.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeOverlayController+Window.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeOverlayTextViews.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeOverlayView.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeRecognitionDebugSupport.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeRuntime.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeSettings.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeTestCard.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeTester.swift (99%) rename apps/macos/Sources/{OpenClaw => Klawty}/VoiceWakeTextUtils.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/WebChatManager.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/WebChatSwiftUI.swift (90%) rename apps/macos/Sources/{OpenClaw => Klawty}/WindowPlacement.swift (100%) rename apps/macos/Sources/{OpenClaw => Klawty}/WorkActivityStore.swift (94%) rename apps/macos/Sources/{OpenClawDiscovery => KlawtyDiscovery}/GatewayDiscoveryModel.swift (97%) rename apps/macos/Sources/{OpenClawDiscovery => KlawtyDiscovery}/TailscaleNetwork.swift (97%) rename apps/macos/Sources/{OpenClawDiscovery => KlawtyDiscovery}/TailscaleServeGatewayDiscovery.swift (99%) rename apps/macos/Sources/{OpenClawDiscovery => KlawtyDiscovery}/WideAreaGatewayDiscovery.swift (97%) rename apps/macos/Sources/{OpenClawIPC => KlawtyIPC}/IPC.swift (99%) rename apps/macos/Sources/{OpenClawMacCLI => KlawtyMacCLI}/CLIArgParsingSupport.swift (100%) rename apps/macos/Sources/{OpenClawMacCLI => KlawtyMacCLI}/ConnectCommand.swift (96%) rename apps/macos/Sources/{OpenClawMacCLI => KlawtyMacCLI}/DiscoverCommand.swift (97%) rename apps/macos/Sources/{OpenClawMacCLI => KlawtyMacCLI}/EntryPoint.swift (70%) rename apps/macos/Sources/{OpenClawMacCLI => KlawtyMacCLI}/GatewayConfig.swift (96%) rename apps/macos/Sources/{OpenClawMacCLI => KlawtyMacCLI}/GatewayScopes.swift (100%) create mode 100644 apps/macos/Sources/KlawtyMacCLI/TypeAliases.swift rename apps/macos/Sources/{OpenClawMacCLI => KlawtyMacCLI}/WizardCommand.swift (98%) rename apps/macos/Sources/{OpenClawProtocol => KlawtyProtocol}/GatewayModels.swift (100%) delete mode 100644 apps/macos/Sources/OpenClaw/AnyCodable+Helpers.swift delete mode 100644 apps/macos/Sources/OpenClaw/Constants.swift delete mode 100644 apps/macos/Sources/OpenClawMacCLI/TypeAliases.swift rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/AgentEventStoreTests.swift (83%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/AgentWorkspaceTests.swift (90%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/AnyCodableEncodingTests.swift (83%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/AppStateRemoteConfigTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/AudioInputDeviceObserverTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CLIInstallerTests.swift (88%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CameraCaptureServiceTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CameraIPCTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CanvasFileWatcherTests.swift (95%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CanvasIPCTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CanvasWindowSmokeTests.swift (89%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ChannelsSettingsSmokeTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CommandResolverTests.swift (76%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ConfigStoreTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CoverageDumpTests.swift (100%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CritterIconRendererTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CronJobEditorSmokeTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/CronModelsTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/DeepLinkAgentPolicyTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/DeviceModelCatalogTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecAllowlistTests.swift (91%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecApprovalHelpersTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecApprovalsGatewayPrompterTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecApprovalsSocketAuthTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecApprovalsSocketPathGuardTests.swift (90%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecApprovalsStoreRefactorTests.swift (94%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecHostRequestEvaluatorTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecSkillBinTrustTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ExecSystemRunCommandValidatorTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/FileHandleLegacyAPIGuardTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/FileHandleSafeReadTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayAgentChannelTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayAutostartPolicyTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayChannelConfigureTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayChannelConnectTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayChannelRequestTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayChannelShutdownTests.swift (95%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayConnectionControlTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayDiscoveryHelpersTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayDiscoveryModelTests.swift (95%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayDiscoverySelectionSupportTests.swift (89%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayEndpointStoreTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayEnvironmentTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayFrameDecodeTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayLaunchAgentManagerTests.swift (73%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayProcessManagerTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/GatewayWebSocketTestSupport.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/HealthDecodeTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/HealthStoreStateTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/HostEnvSanitizerTests.swift (71%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/HoverHUDControllerTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/InstancesSettingsSmokeTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/InstancesStoreTests.swift (75%) rename apps/macos/Tests/{OpenClawIPCTests/OpenClawConfigFileTests.swift => KlawtyIPCTests/KlawtyConfigFileTests.swift} (62%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/LaunchAgentManagerTests.swift (81%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/LogLocatorTests.swift (71%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/LowCoverageHelperTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/LowCoverageViewSmokeTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/MacGatewayChatTransportMappingTests.swift (83%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/MacNodeBrowserProxyTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/MacNodeRuntimeTests.swift (83%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/MasterDiscoveryMenuSmokeTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/MenuContentSmokeTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/MenuSessionsInjectorTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ModelCatalogLoaderTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/NixModeStableSuiteTests.swift (93%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/NodeManagerPathsTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/NodePairingApprovalPrompterTests.swift (89%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/NodePairingReconcilePolicyTests.swift (95%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/NodeServiceManagerTests.swift (58%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/OnboardingCoverageTests.swift (87%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/OnboardingRemoteAuthPromptTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/OnboardingViewSmokeTests.swift (86%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/OnboardingWizardStepViewTests.swift (92%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/PermissionManagerLocationTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/PermissionManagerTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/Placeholder.swift (100%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/RemotePortTunnelTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/RuntimeLocatorTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/ScreenshotSizeTests.swift (95%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/SemverTests.swift (95%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/SessionDataTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/SessionMenuPreviewTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/SettingsViewSmokeTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/SkillsSettingsSmokeTests.swift (94%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/TailscaleIntegrationSectionTests.swift (95%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/TailscaleServeGatewayDiscoveryTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/TalkAudioPlayerTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/TalkModeConfigParsingTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/TalkModeRuntimeSpeechTests.swift (93%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/TestFSHelpers.swift (100%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/TestIsolation.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/UtilitiesTests.swift (91%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoicePushToTalkHotkeyTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoicePushToTalkTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeForwarderTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeGlobalSettingsSyncTests.swift (78%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeHelpersTests.swift (98%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeOverlayControllerTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeOverlayTests.swift (96%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeOverlayViewSmokeTests.swift (97%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeRuntimeTests.swift (81%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeTestSupport.swift (100%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/VoiceWakeTesterTests.swift (100%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/WebChatMainSessionKeyTests.swift (93%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/WebChatManagerTests.swift (91%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/WebChatSwiftUISmokeTests.swift (75%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/WideAreaGatewayDiscoveryTests.swift (71%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/WindowPlacementTests.swift (99%) rename apps/macos/Tests/{OpenClawIPCTests => KlawtyIPCTests}/WorkActivityStoreTests.swift (96%) rename apps/shared/{OpenClawKit => KlawtyKit}/Package.swift (66%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/AssistantTextParser.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatComposer.swift (95%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatMarkdownPreprocessor.swift (98%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatMarkdownRenderer.swift (97%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatMessageViews.swift (93%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatModels.swift (82%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatPayloadDecoding.swift (93%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatSessions.swift (82%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatSheets.swift (97%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatTheme.swift (94%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatTransport.swift (64%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatView.swift (93%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ChatViewModel.swift (93%) rename apps/shared/{OpenClawKit/Sources/OpenClawChatUI => KlawtyKit/Sources/KlawtyChatUI}/ToolResultTextFormatter.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/AnyCodable+Helpers.swift (100%) create mode 100644 apps/shared/KlawtyKit/Sources/KlawtyKit/AnyCodable.swift rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/AsyncTimeout.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/AudioStreamingProtocols.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/BonjourEscapes.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/BonjourServiceResolverSupport.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/BonjourTypes.swift (88%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/BridgeFrames.swift (98%) create mode 100644 apps/shared/KlawtyKit/Sources/KlawtyKit/BrowserCommands.swift rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CalendarCommands.swift (71%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CameraAuthorization.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CameraCapturePipelineSupport.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CameraCommands.swift (57%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CameraSessionConfiguration.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CanvasA2UIAction.swift (96%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CanvasA2UICommands.swift (69%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CanvasA2UIJSONL.swift (98%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CanvasCommandParams.swift (69%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CanvasCommands.swift (75%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/Capabilities.swift (80%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/CaptureRateLimits.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ChatCommands.swift (63%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ContactsCommands.swift (74%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/DeepLinks.swift (99%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/DeviceAuthPayload.swift (84%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/DeviceAuthStore.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/DeviceCommands.swift (58%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/DeviceIdentity.swift (95%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ElevenLabsKitShim.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayChannel.swift (99%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayConnectChallengeSupport.swift (87%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayDiscoveryBrowserSupport.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayDiscoveryStatusText.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayEndpointID.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayErrors.swift (99%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayNodeSession.swift (98%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayPayloadDecoding.swift (95%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayPush.swift (94%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GatewayTLSPinning.swift (97%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/GenericPasswordKeychainStore.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/InstanceIdentity.swift (96%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/JPEGTranscoder.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit/OpenClawDateRangeLimitParams.swift => KlawtyKit/Sources/KlawtyKit/KlawtyDateRangeLimitParams.swift} (79%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit/OpenClawKitResources.swift => KlawtyKit/Sources/KlawtyKit/KlawtyKitResources.swift} (95%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/LocalNetworkURLSupport.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/LocationCommands.swift (77%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/LocationCurrentRequest.swift (88%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/LocationServiceSupport.swift (100%) create mode 100644 apps/shared/KlawtyKit/Sources/KlawtyKit/LocationSettings.swift rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/LoopbackHost.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/MotionCommands.swift (77%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/NetworkInterfaceIPv4.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/NetworkInterfaces.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/NodeError.swift (73%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/PhotoCapture.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/PhotosCommands.swift (67%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/RemindersCommands.swift (60%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/Resources/CanvasScaffold/scaffold.html (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/Resources/tool-display.json (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ScreenCommands.swift (80%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ShareGatewayRelaySettings.swift (97%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ShareToAgentDeepLink.swift (98%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ShareToAgentSettings.swift (94%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/StoragePaths.swift (80%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/SystemCommands.swift (74%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/TalkCommands.swift (73%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/TalkConfigParsing.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/TalkDirective.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/TalkHistoryTimestamp.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/TalkPromptBuilder.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/TalkSystemSpeechSynthesizer.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ThrowingContinuationSupport.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/ToolDisplay.swift (98%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/WatchCommands.swift (74%) rename apps/shared/{OpenClawKit/Sources/OpenClawKit => KlawtyKit/Sources/KlawtyKit}/WebViewJavaScriptSupport.swift (97%) rename apps/shared/{OpenClawKit/Sources/OpenClawProtocol => KlawtyKit/Sources/KlawtyProtocol}/AnyCodable.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawProtocol => KlawtyKit/Sources/KlawtyProtocol}/GatewayModels.swift (100%) rename apps/shared/{OpenClawKit/Sources/OpenClawProtocol => KlawtyKit/Sources/KlawtyProtocol}/WizardHelpers.swift (100%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/AnyCodableTests.swift (98%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/AssistantTextParserTests.swift (98%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/BonjourEscapesTests.swift (87%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/CanvasA2UIActionTests.swift (53%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/CanvasA2UITests.swift (61%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/CanvasSnapshotFormatTests.swift (83%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/ChatComposerPasteSupportTests.swift (98%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/ChatMarkdownPreprocessorTests.swift (98%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/ChatThemeTests.swift (76%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/ChatViewModelTests.swift (91%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/DeepLinksSecurityTests.swift (88%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/DeviceAuthPayloadTests.swift (82%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/ElevenLabsTTSValidationTests.swift (96%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/GatewayErrorsTests.swift (95%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/GatewayNodeSessionTests.swift (97%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/JPEGTranscoderTests.swift (99%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/TalkConfigContractTests.swift (99%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/TalkConfigParsingTests.swift (99%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/TalkDirectiveTests.swift (98%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/TalkHistoryTimestampTests.swift (95%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/TalkPromptBuilderTests.swift (97%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/TestAsyncHelpers.swift (100%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/ToolDisplayRegistryTests.swift (75%) rename apps/shared/{OpenClawKit/Tests/OpenClawKitTests => KlawtyKit/Tests/KlawtyKitTests}/ToolResultTextFormatterTests.swift (97%) rename apps/shared/{OpenClawKit => KlawtyKit}/Tools/CanvasA2UI/bootstrap.js (92%) rename apps/shared/{OpenClawKit => KlawtyKit}/Tools/CanvasA2UI/rolldown.config.mjs (97%) delete mode 100644 apps/shared/OpenClawKit/Sources/OpenClawKit/AnyCodable.swift delete mode 100644 apps/shared/OpenClawKit/Sources/OpenClawKit/BrowserCommands.swift delete mode 100644 apps/shared/OpenClawKit/Sources/OpenClawKit/LocationSettings.swift rename docs/assets/{openclaw-logo-text-dark.png => klawty-logo-text-dark.png} (100%) rename docs/assets/{openclaw-logo-text-dark.svg => klawty-logo-text-dark.svg} (100%) rename docs/assets/{openclaw-logo-text.png => klawty-logo-text.png} (100%) rename docs/assets/{openclaw-logo-text.svg => klawty-logo-text.svg} (100%) rename docs/start/{openclaw.md => klawty.md} (62%) rename docs/{whatsapp-openclaw-ai-zh.jpg => whatsapp-klawty-ai-zh.jpg} (100%) rename docs/{whatsapp-openclaw.jpg => whatsapp-klawty.jpg} (100%) rename docs/zh-CN/start/{openclaw.md => klawty.md} (66%) rename extensions/acpx/{openclaw.plugin.json => klawty.plugin.json} (97%) rename extensions/amazon-bedrock/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/anthropic/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/bluebubbles/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/brave/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/byteplus/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/chutes/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/cloudflare-ai-gateway/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/copilot-proxy/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/device-pair/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/diagnostics-otel/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/diffs/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/discord/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/elevenlabs/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/fal/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/feishu/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/firecrawl/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/github-copilot/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/google/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/googlechat/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/huggingface/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/imessage/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/irc/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/kilocode/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/kimi-coding/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/line/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/llm-task/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/lobster/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/matrix/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/mattermost/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/memory-core/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/memory-lancedb/{openclaw.plugin.json => klawty.plugin.json} (97%) rename extensions/microsoft/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/minimax/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/mistral/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/modelstudio/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/moonshot/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/msteams/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/nextcloud-talk/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/nostr/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/nvidia/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/ollama/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/open-prose/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/openai/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/opencode-go/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/opencode/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/openrouter/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/openshell/{openclaw.plugin.json => klawty.plugin.json} (99%) rename extensions/perplexity/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/phone-control/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/qianfan/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/qwen-portal-auth/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/sglang/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/signal/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/slack/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/synology-chat/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/synthetic/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/talk-voice/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/telegram/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/thread-ownership/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/tlon/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/together/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/twitch/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/venice/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/vercel-ai-gateway/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/vllm/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/voice-call/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/volcengine/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/whatsapp/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/xai/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/xiaomi/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/zai/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/zalo/{openclaw.plugin.json => klawty.plugin.json} (100%) rename extensions/zalouser/{openclaw.plugin.json => klawty.plugin.json} (100%) create mode 100644 klawty-policy.yaml rename openclaw.mjs => klawty.mjs (90%) rename openclaw.podman.env => klawty.podman.env (100%) rename scripts/{openclaw-npm-publish.sh => klawty-npm-publish.sh} (100%) rename scripts/{openclaw-npm-release-check.ts => klawty-npm-release-check.ts} (94%) create mode 100755 scripts/onboard.sh rename scripts/podman/{openclaw.container.in => klawty.container.in} (100%) rename scripts/{run-openclaw-podman.sh => run-klawty-podman.sh} (98%) rename scripts/systemd/{openclaw-auth-monitor.service => klawty-auth-monitor.service} (100%) rename scripts/systemd/{openclaw-auth-monitor.timer => klawty-auth-monitor.timer} (100%) rename src/agents/{openclaw-gateway-tool.test.ts => klawty-gateway-tool.test.ts} (93%) rename src/agents/{openclaw-tools.agents.test.ts => klawty-tools.agents.test.ts} (96%) rename src/agents/{openclaw-tools.camera.test.ts => klawty-tools.camera.test.ts} (99%) rename src/agents/{openclaw-tools.image-generation.test.ts => klawty-tools.image-generation.test.ts} (78%) rename src/agents/{openclaw-tools.owner-authorization.test.ts => klawty-tools.owner-authorization.test.ts} (75%) rename src/agents/{openclaw-tools.pdf-registration.test.ts => klawty-tools.pdf-registration.test.ts} (66%) rename src/agents/{openclaw-tools.plugin-context.test.ts => klawty-tools.plugin-context.test.ts} (87%) rename src/agents/{openclaw-tools.session-status.test.ts => klawty-tools.session-status.test.ts} (98%) rename src/agents/{openclaw-tools.sessions-visibility.test.ts => klawty-tools.sessions-visibility.test.ts} (96%) rename src/agents/{openclaw-tools.sessions.test.ts => klawty-tools.sessions.test.ts} (96%) rename src/agents/{openclaw-tools.subagents.scope.test.ts => klawty-tools.subagents.scope.test.ts} (96%) rename src/agents/{openclaw-tools.subagents.sessions-spawn-applies-thinking-default.test.ts => klawty-tools.subagents.sessions-spawn-applies-thinking-default.test.ts} (96%) rename src/agents/{openclaw-tools.subagents.sessions-spawn-default-timeout-absent.test.ts => klawty-tools.subagents.sessions-spawn-default-timeout-absent.test.ts} (96%) rename src/agents/{openclaw-tools.subagents.sessions-spawn-default-timeout.test.ts => klawty-tools.subagents.sessions-spawn-default-timeout.test.ts} (95%) rename src/agents/{openclaw-tools.subagents.sessions-spawn-depth-limits.test.ts => klawty-tools.subagents.sessions-spawn-depth-limits.test.ts} (98%) rename src/agents/{openclaw-tools.subagents.sessions-spawn.allowlist.test.ts => klawty-tools.subagents.sessions-spawn.allowlist.test.ts} (98%) rename src/agents/{openclaw-tools.subagents.sessions-spawn.cron-note.test.ts => klawty-tools.subagents.sessions-spawn.cron-note.test.ts} (97%) rename src/agents/{openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts => klawty-tools.subagents.sessions-spawn.lifecycle.test.ts} (97%) rename src/agents/{openclaw-tools.subagents.sessions-spawn.model.test.ts => klawty-tools.subagents.sessions-spawn.model.test.ts} (98%) rename src/agents/{openclaw-tools.subagents.sessions-spawn.test-harness.ts => klawty-tools.subagents.sessions-spawn.test-harness.ts} (95%) rename src/agents/{openclaw-tools.subagents.steer-failure-clears-suppression.test.ts => klawty-tools.subagents.steer-failure-clears-suppression.test.ts} (91%) rename src/agents/{openclaw-tools.subagents.test-harness.ts => klawty-tools.subagents.test-harness.ts} (95%) rename src/agents/{openclaw-tools.ts => klawty-tools.ts} (98%) rename src/agents/{openclaw-tools.web-runtime.test.ts => klawty-tools.web-runtime.test.ts} (87%) rename src/agents/{pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-b.test.ts => pi-tools.create-klawty-coding-tools.adds-claude-style-aliases-schemas-without-dropping-b.test.ts} (85%) rename src/agents/{pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.test.ts => pi-tools.create-klawty-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.test.ts} (89%) rename src/agents/{pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-f.test.ts => pi-tools.create-klawty-coding-tools.adds-claude-style-aliases-schemas-without-dropping-f.test.ts} (82%) rename src/agents/{pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping.test.ts => pi-tools.create-klawty-coding-tools.adds-claude-style-aliases-schemas-without-dropping.test.ts} (92%) rename src/config/{types.openclaw.ts => types.klawty.ts} (96%) create mode 100644 src/infra/klawty-exec-env.test.ts create mode 100644 src/infra/klawty-exec-env.ts rename src/infra/{openclaw-root.test.ts => klawty-root.test.ts} (68%) rename src/infra/{openclaw-root.ts => klawty-root.ts} (95%) delete mode 100644 src/infra/openclaw-exec-env.test.ts delete mode 100644 src/infra/openclaw-exec-env.ts rename src/infra/{tmp-openclaw-dir.test.ts => tmp-klawty-dir.test.ts} (82%) rename src/infra/{tmp-openclaw-dir.ts => tmp-klawty-dir.ts} (79%) create mode 100644 src/security/auto-update.js create mode 100644 src/security/credential-monitor.js create mode 100644 src/security/exec-sandbox.js create mode 100644 src/security/integrity-check.js create mode 100644 src/security/klawty-boot.js create mode 100644 src/security/policy-enforcer.js create mode 100644 src/security/privacy-router.js create mode 100644 src/security/tui-dashboard.js rename test/{openclaw-launcher.e2e.test.ts => klawty-launcher.e2e.test.ts} (81%) rename test/{openclaw-npm-release-check.test.ts => klawty-npm-release-check.test.ts} (92%) create mode 100644 workspace/.env.example create mode 100644 workspace/AGENTS.md create mode 100644 workspace/HEARTBEAT.md create mode 100644 workspace/MEMORY.md create mode 100644 workspace/SOUL.md create mode 100644 workspace/TOOLS.md create mode 100644 workspace/agents/main/AGENT.md create mode 100644 workspace/klawty.json create mode 100644 workspace/skills/web-research/SKILL.md diff --git a/.agent/workflows/update_clawdbot.md b/.agent/workflows/update_clawdbot.md index 0543e7c2a6..7dd1f9b5c0 100644 --- a/.agent/workflows/update_clawdbot.md +++ b/.agent/workflows/update_clawdbot.md @@ -1,8 +1,8 @@ --- -description: Update OpenClaw from upstream when branch has diverged (ahead/behind) +description: Update Klawty from upstream when branch has diverged (ahead/behind) --- -# OpenClaw Upstream Sync Workflow +# Klawty Upstream Sync Workflow Use this workflow when your fork has diverged from upstream (e.g., "18 commits ahead, 29 commits behind"). @@ -132,16 +132,16 @@ pnpm mac:package ```bash # Kill running app -pkill -x "OpenClaw" || true +pkill -x "Klawty" || true # Move old version -mv /Applications/OpenClaw.app /tmp/OpenClaw-backup.app +mv /Applications/Klawty.app /tmp/Klawty-backup.app # Install new build -cp -R dist/OpenClaw.app /Applications/ +cp -R dist/Klawty.app /Applications/ # Launch -open /Applications/OpenClaw.app +open /Applications/Klawty.app ``` --- @@ -235,7 +235,7 @@ If upstream introduced new model configurations: # Check for OpenRouter API key requirements grep -r "openrouter\|OPENROUTER" src/ --include="*.ts" --include="*.js" -# Update openclaw.json with fallback chains +# Update klawty.json with fallback chains # Add model fallback configurations as needed ``` diff --git a/.agents/maintainers.md b/.agents/maintainers.md index 2bbb9c6203..602fd90a5b 100644 --- a/.agents/maintainers.md +++ b/.agents/maintainers.md @@ -1 +1 @@ -Maintainer skills now live in [`openclaw/maintainers`](https://github.com/openclaw/maintainers/). +Maintainer skills now live in [`klawty/maintainers`](https://github.com/klawty/maintainers/). diff --git a/.agents/skills/openclaw-ghsa-maintainer/SKILL.md b/.agents/skills/openclaw-ghsa-maintainer/SKILL.md index 4458197484..d6a359a95e 100644 --- a/.agents/skills/openclaw-ghsa-maintainer/SKILL.md +++ b/.agents/skills/openclaw-ghsa-maintainer/SKILL.md @@ -1,11 +1,11 @@ --- -name: openclaw-ghsa-maintainer -description: Maintainer workflow for OpenClaw GitHub Security Advisories (GHSA). Use when Codex needs to inspect, patch, validate, or publish a repo advisory, verify private-fork state, prepare advisory Markdown or JSON payloads safely, handle GHSA API-specific publish constraints, or confirm advisory publish success. +name: klawty-ghsa-maintainer +description: Maintainer workflow for Klawty GitHub Security Advisories (GHSA). Use when Codex needs to inspect, patch, validate, or publish a repo advisory, verify private-fork state, prepare advisory Markdown or JSON payloads safely, handle GHSA API-specific publish constraints, or confirm advisory publish success. --- -# OpenClaw GHSA Maintainer +# Klawty GHSA Maintainer -Use this skill for repo security advisory workflow only. Keep general release work in `openclaw-release-maintainer`. +Use this skill for repo security advisory workflow only. Keep general release work in `klawty-release-maintainer`. ## Respect advisory guardrails @@ -18,8 +18,8 @@ Use this skill for repo security advisory workflow only. Keep general release wo Fetch the current advisory and the latest published npm version: ```bash -gh api /repos/openclaw/openclaw/security-advisories/ -npm view openclaw version --userconfig "$(mktemp)" +gh api /repos/klawty/klawty/security-advisories/ +npm view klawty version --userconfig "$(mktemp)" ``` Use the fetch output to confirm the advisory state, linked private fork, and vulnerability payload shape before patching. @@ -29,7 +29,7 @@ Use the fetch output to confirm the advisory state, linked private fork, and vul Before publishing, verify that the advisory's private fork has no open PRs: ```bash -fork=$(gh api /repos/openclaw/openclaw/security-advisories/ | jq -r .private_fork.full_name) +fork=$(gh api /repos/klawty/klawty/security-advisories/ | jq -r .private_fork.full_name) gh pr list -R "$fork" --state open ``` @@ -61,7 +61,7 @@ jq -n --rawfile desc /tmp/ghsa.desc.md \ Example shape: ```bash -gh api -X PATCH /repos/openclaw/openclaw/security-advisories/ \ +gh api -X PATCH /repos/klawty/klawty/security-advisories/ \ --input /tmp/ghsa.patch.json ``` @@ -76,7 +76,7 @@ After publish, re-fetch the advisory and confirm: Verification pattern: ```bash -gh api /repos/openclaw/openclaw/security-advisories/ +gh api /repos/klawty/klawty/security-advisories/ jq -r .description < /tmp/ghsa.refetch.json | rg '\\\\n' ``` diff --git a/.agents/skills/openclaw-parallels-smoke/SKILL.md b/.agents/skills/openclaw-parallels-smoke/SKILL.md index db12afa48a..5f23de42e0 100644 --- a/.agents/skills/openclaw-parallels-smoke/SKILL.md +++ b/.agents/skills/openclaw-parallels-smoke/SKILL.md @@ -1,20 +1,20 @@ --- -name: openclaw-parallels-smoke -description: End-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels. +name: klawty-parallels-smoke +description: End-to-end Parallels smoke, upgrade, and rerun workflow for Klawty across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels. --- -# OpenClaw Parallels Smoke +# Klawty Parallels Smoke Use this skill for Parallels guest workflows and smoke interpretation. Do not load it for normal repo work. ## Global rules - Use the snapshot most closely matching the requested fresh baseline. -- Gateway verification in smoke runs should use `openclaw gateway status --deep --require-rpc` unless the stable version being checked does not support it yet. +- Gateway verification in smoke runs should use `klawty gateway status --deep --require-rpc` unless the stable version being checked does not support it yet. - Stable `2026.3.12` pre-upgrade diagnostics may require a plain `gateway status --deep` fallback. - Treat `precheck=latest-ref-fail` on that stable pre-upgrade lane as baseline, not automatically a regression. - Pass `--json` for machine-readable summaries. -- Per-phase logs land under `/tmp/openclaw-parallels-*`. +- Per-phase logs land under `/tmp/klawty-parallels-*`. - Do not run local and gateway agent turns in parallel on the same fresh workspace or session. ## macOS flow @@ -29,9 +29,9 @@ Use this skill for Parallels guest workflows and smoke interpretation. Do not lo ## Windows flow - Preferred entrypoint: `pnpm test:parallels:windows` -- Use the snapshot closest to `pre-openclaw-native-e2e-2026-03-12`. +- Use the snapshot closest to `pre-klawty-native-e2e-2026-03-12`. - Always use `prlctl exec --current-user`; plain `prlctl exec` lands in `NT AUTHORITY\\SYSTEM`. -- Prefer explicit `npm.cmd` and `openclaw.cmd`. +- Prefer explicit `npm.cmd` and `klawty.cmd`. - Use PowerShell only as the transport with `-ExecutionPolicy Bypass`, then call the `.cmd` shims from inside it. - Keep onboarding and status output ASCII-clean in logs; fancy punctuation becomes mojibake in current capture paths. @@ -52,7 +52,7 @@ Use this skill for Parallels guest workflows and smoke interpretation. Do not lo - `--discord-guild-id` - `--discord-channel-id` - Keep the Discord token only in a host env var. -- Use installed `openclaw message send/read`, not `node openclaw.mjs message ...`. +- Use installed `klawty message send/read`, not `node klawty.mjs message ...`. - Set `channels.discord.guilds` as one JSON object, not dotted config paths with snowflakes. - Avoid long `prlctl enter` or expect-driven Discord config scripts; prefer `prlctl exec --current-user /bin/sh -lc ...` with short commands. - For a narrower macOS-only Discord proof run, the existing `parallels-discord-roundtrip` skill is the deep-dive companion. diff --git a/.agents/skills/openclaw-pr-maintainer/SKILL.md b/.agents/skills/openclaw-pr-maintainer/SKILL.md index 0bcba736e1..d84fefb78d 100644 --- a/.agents/skills/openclaw-pr-maintainer/SKILL.md +++ b/.agents/skills/openclaw-pr-maintainer/SKILL.md @@ -1,9 +1,9 @@ --- -name: openclaw-pr-maintainer -description: Maintainer workflow for reviewing, triaging, preparing, closing, or landing OpenClaw pull requests and related issues. Use when Codex needs to validate bug-fix claims, search for related issues or PRs, apply or recommend close/reason labels, prepare GitHub comments safely, check review-thread follow-up, or perform maintainer-style PR decision making before merge or closure. +name: klawty-pr-maintainer +description: Maintainer workflow for reviewing, triaging, preparing, closing, or landing Klawty pull requests and related issues. Use when Codex needs to validate bug-fix claims, search for related issues or PRs, apply or recommend close/reason labels, prepare GitHub comments safely, check review-thread follow-up, or perform maintainer-style PR decision making before merge or closure. --- -# OpenClaw PR Maintainer +# Klawty PR Maintainer Use this skill for maintainer-facing GitHub workflow, not for ordinary code changes. @@ -45,16 +45,16 @@ Use this skill for maintainer-facing GitHub workflow, not for ordinary code chan ## Search broadly before deciding - Prefer targeted keyword search before proposing new work or closing something as duplicate. -- Use `--repo openclaw/openclaw` with `--match title,body` first. +- Use `--repo klawty/klawty` with `--match title,body` first. - Add `--match comments` when triaging follow-up discussion. - Do not stop at the first 500 results when the task requires a full search. Examples: ```bash -gh search prs --repo openclaw/openclaw --match title,body --limit 50 -- "auto-update" -gh search issues --repo openclaw/openclaw --match title,body --limit 50 -- "auto-update" -gh search issues --repo openclaw/openclaw --match title,body --limit 50 \ +gh search prs --repo klawty/klawty --match title,body --limit 50 -- "auto-update" +gh search issues --repo klawty/klawty --match title,body --limit 50 -- "auto-update" +gh search issues --repo klawty/klawty --match title,body --limit 50 \ --json number,title,state,url,updatedAt -- "auto update" \ --jq '.[] | "\(.number) | \(.state) | \(.title) | \(.url)"' ``` diff --git a/.agents/skills/openclaw-release-maintainer/SKILL.md b/.agents/skills/openclaw-release-maintainer/SKILL.md index fc7674a774..8aa495cd01 100644 --- a/.agents/skills/openclaw-release-maintainer/SKILL.md +++ b/.agents/skills/openclaw-release-maintainer/SKILL.md @@ -1,9 +1,9 @@ --- -name: openclaw-release-maintainer -description: Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts. +name: klawty-release-maintainer +description: Maintainer workflow for Klawty releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts. --- -# OpenClaw Release Maintainer +# Klawty Release Maintainer Use this skill for release and publish-time workflow. Keep ordinary development changes and GHSA-specific advisory work outside this skill. @@ -28,7 +28,7 @@ Use this skill for release and publish-time workflow. Keep ordinary development - `apps/android/app/build.gradle.kts` - `apps/ios/Sources/Info.plist` - `apps/ios/Tests/Info.plist` - - `apps/macos/Sources/OpenClaw/Resources/Info.plist` + - `apps/macos/Sources/Klawty/Resources/Info.plist` - `docs/install/updating.md` - Peekaboo Xcode project and plist version fields - “Bump version everywhere” means all version locations above except `appcast.xml`. @@ -39,7 +39,7 @@ Use this skill for release and publish-time workflow. Keep ordinary development - Changelog entries should be user-facing, not internal release-process notes. - When cutting a mac release with a beta GitHub prerelease: - tag `vYYYY.M.D-beta.N` from the release commit - - create a prerelease titled `openclaw YYYY.M.D-beta.N` + - create a prerelease titled `klawty YYYY.M.D-beta.N` - use release notes from the matching `CHANGELOG.md` version section - attach at least the zip and dSYM zip, plus dmg if available - Keep the top version entries in `CHANGELOG.md` sorted by impact: @@ -59,16 +59,16 @@ pnpm test:install:smoke For a non-root smoke path: ```bash -OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke +KLAWTY_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke ``` ## Use the right auth flow -- Core `openclaw` publish uses GitHub trusted publishing. +- Core `klawty` publish uses GitHub trusted publishing. - Do not use `NPM_TOKEN` or the plugin OTP flow for core releases. -- `@openclaw/*` plugin publishes use a separate maintainer-only flow. +- `@klawty/*` plugin publishes use a separate maintainer-only flow. - Only publish plugins that already exist on npm; bundled disk-tree-only plugins stay unpublished. ## GHSA advisory work -- Use `openclaw-ghsa-maintainer` for GHSA advisory inspection, patch/publish flow, private-fork validation, and GHSA API-specific publish checks. +- Use `klawty-ghsa-maintainer` for GHSA advisory inspection, patch/publish flow, private-fork validation, and GHSA API-specific publish checks. diff --git a/.agents/skills/parallels-discord-roundtrip/SKILL.md b/.agents/skills/parallels-discord-roundtrip/SKILL.md index cbfffc2144..d6be993874 100644 --- a/.agents/skills/parallels-discord-roundtrip/SKILL.md +++ b/.agents/skills/parallels-discord-roundtrip/SKILL.md @@ -28,12 +28,12 @@ Cover: ## Preferred run ```bash -export OPENCLAW_PARALLELS_DISCORD_TOKEN="$( - ssh peters-mac-studio-1 'jq -r ".channels.discord.token" ~/.openclaw/openclaw.json' | tr -d '\n' +export KLAWTY_PARALLELS_DISCORD_TOKEN="$( + ssh peters-mac-studio-1 'jq -r ".channels.discord.token" ~/.klawty/klawty.json' | tr -d '\n' )" pnpm test:parallels:macos \ - --discord-token-env OPENCLAW_PARALLELS_DISCORD_TOKEN \ + --discord-token-env KLAWTY_PARALLELS_DISCORD_TOKEN \ --discord-guild-id 1456350064065904867 \ --discord-channel-id 1456744319972282449 \ --json @@ -45,12 +45,12 @@ pnpm test:parallels:macos \ - Snapshot resolver now prefers matching `*-poweroff*` clones when the base hint also matches. That lets the harness reuse disk-only recovery snapshots without passing a longer hint. - If Windows/Linux snapshot restore logs show `PET_QUESTION_SNAPSHOT_STATE_INCOMPATIBLE_CPU`, drop the suspended state once, create a `*-poweroff*` replacement snapshot, and rerun. The smoke scripts now auto-start restored power-off snapshots. - Harness configures Discord inside the guest; no checked-in token/config. -- Use the `openclaw` wrapper for guest `message send/read`; `node openclaw.mjs message ...` does not expose the lazy message subcommands the same way. +- Use the `klawty` wrapper for guest `message send/read`; `node klawty.mjs message ...` does not expose the lazy message subcommands the same way. - Write `channels.discord.guilds` in one JSON object (`--strict-json`), not dotted `config set channels.discord.guilds....` paths; numeric snowflakes get treated like array indexes. - Avoid `prlctl enter` / expect for long Discord setup scripts; it line-wraps/corrupts long commands. Use `prlctl exec --current-user /bin/sh -lc ...` for the Discord config phase. - Full 3-OS sweeps: the shared build lock is safe in parallel, but snapshot restore is still a Parallels bottleneck. Prefer serialized Windows/Linux restore-heavy reruns if the host is already under load. - Harness cleanup deletes the temporary Discord smoke messages at exit. -- Per-phase logs: `/tmp/openclaw-parallels-smoke.*` +- Per-phase logs: `/tmp/klawty-parallels-smoke.*` - Machine summary: pass `--json` - If roundtrip flakes, inspect `fresh.discord-roundtrip.log` and `discord-last-readback.json` in the run dir first. @@ -59,4 +59,4 @@ pnpm test:parallels:macos \ - fresh lane or upgrade lane requested passes - summary reports `discord=pass` for that lane - guest outbound nonce appears in channel history -- host inbound nonce appears in `openclaw message read` output +- host inbound nonce appears in `klawty message read` output diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 25fdcc0c80..9d29ad4c0c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -34,7 +34,7 @@ body: label: Steps to reproduce description: Provide the shortest deterministic repro path supported by direct observation. If the repro path cannot be grounded from the evidence, respond with exactly `NOT_ENOUGH_INFO`. placeholder: | - 1. Start OpenClaw 2026.2.17 with the attached config. + 1. Start Klawty 2026.2.17 with the attached config. 2. Send a Telegram thread reply in the affected chat. 3. Observe no reply and confirm the attached `reply target not found` log line. validations: @@ -58,7 +58,7 @@ body: - type: input id: version attributes: - label: OpenClaw version + label: Klawty version description: Exact version/build tested. placeholder: validations: @@ -75,7 +75,7 @@ body: id: install_method attributes: label: Install method - description: How OpenClaw was installed or launched. + description: How Klawty was installed or launched. placeholder: npm global / pnpm dev / docker / mac app - type: input id: model @@ -90,7 +90,7 @@ body: attributes: label: Provider / routing chain description: Effective request path through gateways, proxies, providers, or model routers. - placeholder: openclaw -> cloudflare-ai-gateway -> minimax + placeholder: klawty -> cloudflare-ai-gateway -> minimax validations: required: true - type: textarea @@ -99,9 +99,9 @@ body: label: Additional provider/model setup details description: Optional. Include redacted routing details, per-agent overrides, auth-profile interactions, env/config context, or anything else needed to explain the effective provider/model setup. Do not include API keys, tokens, or passwords. placeholder: | - Default route is openclaw -> cloudflare-ai-gateway -> minimax. - Previous setup was openclaw -> cloudflare-ai-gateway -> openrouter -> minimax. - Relevant config lives in ~/.openclaw/openclaw.json under models.providers.minimax and models.providers.cloudflare-ai-gateway. + Default route is klawty -> cloudflare-ai-gateway -> minimax. + Previous setup was klawty -> cloudflare-ai-gateway -> openrouter -> minimax. + Relevant config lives in ~/.klawty/klawty.json under models.providers.minimax and models.providers.cloudflare-ai-gateway. - type: textarea id: logs attributes: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 4c1b977559..9489b3d34c 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,7 +2,7 @@ blank_issues_enabled: false contact_links: - name: Onboarding url: https://discord.gg/clawd - about: "New to OpenClaw? Join Discord for setup guidance in #help." + about: "New to Klawty? Join Discord for setup guidance in #help." - name: Support url: https://discord.gg/clawd - about: "Get help from the OpenClaw community on Discord in #help." + about: "Get help from the Klawty community on Discord in #help." diff --git a/.github/codeql/codeql-javascript-typescript.yml b/.github/codeql/codeql-javascript-typescript.yml index 5a765db539..a660ea810b 100644 --- a/.github/codeql/codeql-javascript-typescript.yml +++ b/.github/codeql/codeql-javascript-typescript.yml @@ -1,4 +1,4 @@ -name: openclaw-codeql-javascript-typescript +name: klawty-codeql-javascript-typescript paths: - src diff --git a/.github/instructions/copilot.instructions.md b/.github/instructions/copilot.instructions.md index 8686521cfc..b2021cf122 100644 --- a/.github/instructions/copilot.instructions.md +++ b/.github/instructions/copilot.instructions.md @@ -1,4 +1,4 @@ -# OpenClaw Codebase Patterns +# Klawty Codebase Patterns **Always reuse existing code - no redundancy!** @@ -55,7 +55,7 @@ ## Stack & Commands - **Package manager**: pnpm (`pnpm install`) -- **Dev**: `pnpm openclaw ...` or `pnpm dev` +- **Dev**: `pnpm klawty ...` or `pnpm dev` - **Type-check**: `pnpm tsgo` - **Lint/format**: `pnpm check` - **Tests**: `pnpm test` diff --git a/.github/workflows/auto-response.yml b/.github/workflows/auto-response.yml index 69dff002c7..713ff49d68 100644 --- a/.github/workflows/auto-response.yml +++ b/.github/workflows/auto-response.yml @@ -50,7 +50,7 @@ jobs: label: "r: support", close: true, message: - "Please use [our support server](https://discord.gg/clawd) and ask in #help or #users-helping-users to resolve this, or follow the stuck FAQ at https://docs.openclaw.ai/help/faq#im-stuck-whats-the-fastest-way-to-get-unstuck.", + "Please use [our support server](https://discord.gg/clawd) and ask in #help or #users-helping-users to resolve this, or follow the stuck FAQ at https://docs.klawty.ai/help/faq#im-stuck-whats-the-fastest-way-to-get-unstuck.", }, { label: "r: no-ci-pr", @@ -77,7 +77,7 @@ jobs: label: "r: third-party-extension", close: true, message: - "Please make this as a third-party plugin that you maintain yourself in your own repo. Docs: https://docs.openclaw.ai/plugin. Feel free to open a PR after to add it to our community plugins page: https://docs.openclaw.ai/plugins/community", + "Please make this as a third-party plugin that you maintain yourself in your own repo. Docs: https://docs.klawty.ai/plugin. Feel free to open a PR after to add it to our community plugins page: https://docs.klawty.ai/plugins/community", }, { label: "r: moltbook", @@ -86,7 +86,7 @@ jobs: lockReason: "off-topic", commentTriggers: ["moltbook"], message: - "OpenClaw is not affiliated with Moltbook, and issues related to Moltbook should not be submitted here.", + "Klawty is not affiliated with Moltbook, and issues related to Moltbook should not be submitted here.", }, ]; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 96ab35a297..c94bcf1ccc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -241,11 +241,11 @@ jobs: run: | # `pnpm test` runs `scripts/test-parallel.mjs`, which spawns multiple Node processes. # Default heap limits have been too low on Linux CI (V8 OOM near 4GB). - echo "OPENCLAW_TEST_WORKERS=2" >> "$GITHUB_ENV" - echo "OPENCLAW_TEST_MAX_OLD_SPACE_SIZE_MB=6144" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_WORKERS=2" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_MAX_OLD_SPACE_SIZE_MB=6144" >> "$GITHUB_ENV" if [ -n "$SHARD_COUNT" ] && [ -n "$SHARD_INDEX" ]; then - echo "OPENCLAW_TEST_SHARDS=$SHARD_COUNT" >> "$GITHUB_ENV" - echo "OPENCLAW_TEST_SHARD_INDEX=$SHARD_INDEX" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_SHARDS=$SHARD_COUNT" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_SHARD_INDEX=$SHARD_INDEX" >> "$GITHUB_ENV" fi - name: Run ${{ matrix.task }} (${{ matrix.runtime }}) @@ -274,8 +274,8 @@ jobs: - name: Run changed extension tests env: - OPENCLAW_CHANGED_EXTENSION: ${{ matrix.extension }} - run: pnpm test:extension "$OPENCLAW_CHANGED_EXTENSION" + KLAWTY_CHANGED_EXTENSION: ${{ matrix.extension }} + run: pnpm test:extension "$KLAWTY_CHANGED_EXTENSION" # Types, lint, and format check. check: @@ -405,10 +405,10 @@ jobs: run: pnpm build - name: Smoke test CLI launcher help - run: node openclaw.mjs --help + run: node klawty.mjs --help - name: Smoke test CLI launcher status json - run: node openclaw.mjs status --json --timeout 1 + run: node klawty.mjs status --json --timeout 1 - name: Smoke test built bundled plugin singleton run: pnpm test:build:singleton @@ -486,8 +486,8 @@ jobs: - name: Configure Node 22 test resources run: | # Keep the compatibility lane aligned with the default Node test lane. - echo "OPENCLAW_TEST_WORKERS=2" >> "$GITHUB_ENV" - echo "OPENCLAW_TEST_MAX_OLD_SPACE_SIZE_MB=6144" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_WORKERS=2" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_MAX_OLD_SPACE_SIZE_MB=6144" >> "$GITHUB_ENV" - name: Build under Node 22 run: pnpm build @@ -609,7 +609,7 @@ jobs: NODE_OPTIONS: --max-old-space-size=6144 # Keep total concurrency predictable on the 32 vCPU runner. # Windows shard 2 has shown intermittent instability at 2 workers. - OPENCLAW_TEST_WORKERS: 1 + KLAWTY_TEST_WORKERS: 1 defaults: run: shell: bash @@ -715,8 +715,8 @@ jobs: - name: Configure test shard (Windows) if: matrix.task == 'test' run: | - echo "OPENCLAW_TEST_SHARDS=${{ matrix.shard_count }}" >> "$GITHUB_ENV" - echo "OPENCLAW_TEST_SHARD_INDEX=${{ matrix.shard_index }}" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_SHARDS=${{ matrix.shard_count }}" >> "$GITHUB_ENV" + echo "KLAWTY_TEST_SHARD_INDEX=${{ matrix.shard_index }}" >> "$GITHUB_ENV" - name: Build A2UI bundle (Windows) if: matrix.task == 'test' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 79c041ef72..6be3b849e5 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -126,8 +126,8 @@ jobs: cd apps/ios xcodegen generate xcodebuild build \ - -project OpenClaw.xcodeproj \ - -scheme OpenClaw \ + -project Klawty.xcodeproj \ + -scheme Klawty \ -destination "generic/platform=iOS Simulator" \ CODE_SIGNING_ALLOWED=NO diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index 5eaba45995..245b7e7a8f 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -172,7 +172,7 @@ jobs: context: . platforms: linux/amd64 build-args: | - OPENCLAW_VARIANT=slim + KLAWTY_VARIANT=slim tags: ${{ steps.tags.outputs.slim }} labels: ${{ steps.labels.outputs.value }} provenance: false @@ -285,7 +285,7 @@ jobs: context: . platforms: linux/arm64 build-args: | - OPENCLAW_VARIANT=slim + KLAWTY_VARIANT=slim tags: ${{ steps.tags.outputs.slim }} labels: ${{ steps.labels.outputs.value }} provenance: false diff --git a/.github/workflows/install-smoke.yml b/.github/workflows/install-smoke.yml index a8115f1644..4cea6a61f2 100644 --- a/.github/workflows/install-smoke.yml +++ b/.github/workflows/install-smoke.yml @@ -53,14 +53,14 @@ jobs: with: context: . file: ./Dockerfile - tags: openclaw-dockerfile-smoke:local + tags: klawty-dockerfile-smoke:local load: true push: false provenance: false - name: Run root Dockerfile CLI smoke run: | - docker run --rm --entrypoint sh openclaw-dockerfile-smoke:local -lc 'which openclaw && openclaw --version' + docker run --rm --entrypoint sh klawty-dockerfile-smoke:local -lc 'which klawty && klawty --version' # This smoke validates that the build-arg path preinstalls selected # extension deps and that matrix plugin discovery stays healthy in the @@ -71,24 +71,24 @@ jobs: context: . file: ./Dockerfile build-args: | - OPENCLAW_EXTENSIONS=matrix - tags: openclaw-ext-smoke:local + KLAWTY_EXTENSIONS=matrix + tags: klawty-ext-smoke:local load: true push: false provenance: false - name: Smoke test Dockerfile with matrix extension build arg run: | - docker run --rm --entrypoint sh openclaw-ext-smoke:local -lc ' - which openclaw && - openclaw --version && + docker run --rm --entrypoint sh klawty-ext-smoke:local -lc ' + which klawty && + klawty --version && node -e " const Module = require(\"node:module\"); const requireFromMatrix = Module.createRequire(\"/app/extensions/matrix/package.json\"); requireFromMatrix.resolve(\"@vector-im/matrix-bot-sdk/package.json\"); requireFromMatrix.resolve(\"@matrix-org/matrix-sdk-crypto-nodejs/package.json\"); const { spawnSync } = require(\"node:child_process\"); - const run = spawnSync(\"openclaw\", [\"plugins\", \"list\", \"--json\"], { encoding: \"utf8\" }); + const run = spawnSync(\"klawty\", [\"plugins\", \"list\", \"--json\"], { encoding: \"utf8\" }); if (run.status !== 0) { process.stderr.write(run.stderr || run.stdout || \"plugins list failed\\n\"); process.exit(run.status ?? 1); @@ -119,7 +119,7 @@ jobs: with: context: ./scripts/docker file: ./scripts/docker/install-sh-smoke/Dockerfile - tags: openclaw-install-smoke:local + tags: klawty-install-smoke:local load: true push: false provenance: false @@ -130,15 +130,15 @@ jobs: with: context: ./scripts/docker file: ./scripts/docker/install-sh-nonroot/Dockerfile - tags: openclaw-install-nonroot:local + tags: klawty-install-nonroot:local load: true push: false provenance: false - name: Run installer docker tests env: - CLAWDBOT_INSTALL_URL: https://openclaw.ai/install.sh - CLAWDBOT_INSTALL_CLI_URL: https://openclaw.ai/install-cli.sh + CLAWDBOT_INSTALL_URL: https://klawty.ai/install.sh + CLAWDBOT_INSTALL_CLI_URL: https://klawty.ai/install-cli.sh CLAWDBOT_NO_ONBOARD: "1" CLAWDBOT_INSTALL_SMOKE_SKIP_CLI: "1" CLAWDBOT_INSTALL_SMOKE_SKIP_IMAGE_BUILD: "1" diff --git a/.github/workflows/openclaw-npm-release.yml b/.github/workflows/klawty-npm-release.yml similarity index 84% rename from .github/workflows/openclaw-npm-release.yml rename to .github/workflows/klawty-npm-release.yml index c7f5356761..d79aa088d1 100644 --- a/.github/workflows/openclaw-npm-release.yml +++ b/.github/workflows/klawty-npm-release.yml @@ -1,4 +1,4 @@ -name: OpenClaw NPM Release +name: Klawty NPM Release on: push: @@ -12,7 +12,7 @@ on: type: string concurrency: - group: openclaw-npm-release-${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }} + group: klawty-npm-release-${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }} cancel-in-progress: false env: @@ -21,7 +21,7 @@ env: PNPM_VERSION: "10.23.0" jobs: - preview_openclaw_npm: + preview_klawty_npm: if: github.event_name == 'push' runs-on: ubuntu-latest permissions: @@ -60,8 +60,8 @@ jobs: echo "Correction tag note: npm version remains ${PACKAGE_VERSION}" fi echo "Would run: git fetch --no-tags origin +refs/heads/main:refs/remotes/origin/main" - echo "Would run with env: RELEASE_SHA=${RELEASE_SHA} RELEASE_TAG=${RELEASE_TAG} RELEASE_MAIN_REF=origin/main pnpm release:openclaw:npm:check" - echo "Would run: npm view openclaw@${PACKAGE_VERSION} version" + echo "Would run with env: RELEASE_SHA=${RELEASE_SHA} RELEASE_TAG=${RELEASE_TAG} RELEASE_MAIN_REF=origin/main pnpm release:klawty:npm:check" + echo "Would run: npm view klawty@${PACKAGE_VERSION} version" echo "Would run: pnpm check" echo "Would run: pnpm build" echo "Would run: pnpm release:check" @@ -77,7 +77,7 @@ jobs: # Fetch the full main ref so merge-base ancestry checks keep working # for older tagged commits that are still contained in main. git fetch --no-tags origin +refs/heads/main:refs/remotes/origin/main - pnpm release:openclaw:npm:check + pnpm release:klawty:npm:check - name: Ensure version is not already published env: @@ -90,20 +90,20 @@ jobs: IS_CORRECTION_TAG=1 fi - if npm view "openclaw@${PACKAGE_VERSION}" version >/dev/null 2>&1; then + if npm view "klawty@${PACKAGE_VERSION}" version >/dev/null 2>&1; then if [[ "${IS_CORRECTION_TAG}" == "1" ]]; then - echo "openclaw@${PACKAGE_VERSION} is already published on npm." + echo "klawty@${PACKAGE_VERSION} is already published on npm." echo "Correction tag ${RELEASE_TAG} is allowed as a fallback release tag, so preview will continue without treating this as an error." exit 0 fi - echo "openclaw@${PACKAGE_VERSION} is already published on npm." + echo "klawty@${PACKAGE_VERSION} is already published on npm." exit 1 fi if [[ "${IS_CORRECTION_TAG}" == "1" ]]; then - echo "Previewing fallback correction tag ${RELEASE_TAG} for npm version openclaw@${PACKAGE_VERSION}" + echo "Previewing fallback correction tag ${RELEASE_TAG} for npm version klawty@${PACKAGE_VERSION}" else - echo "Previewing openclaw@${PACKAGE_VERSION}" + echo "Previewing klawty@${PACKAGE_VERSION}" fi - name: Check @@ -122,9 +122,9 @@ jobs: pnpm release:check - name: Preview publish command - run: bash scripts/openclaw-npm-publish.sh --dry-run + run: bash scripts/klawty-npm-publish.sh --dry-run - publish_openclaw_npm: + publish_klawty_npm: if: github.event_name == 'workflow_dispatch' # npm trusted publishing + provenance requires a GitHub-hosted runner. runs-on: ubuntu-latest @@ -168,19 +168,19 @@ jobs: # Fetch the full main ref so merge-base ancestry checks keep working # for older tagged commits that are still contained in main. git fetch --no-tags origin +refs/heads/main:refs/remotes/origin/main - pnpm release:openclaw:npm:check + pnpm release:klawty:npm:check - name: Ensure version is not already published run: | set -euo pipefail PACKAGE_VERSION=$(node -p "require('./package.json').version") - if npm view "openclaw@${PACKAGE_VERSION}" version >/dev/null 2>&1; then - echo "openclaw@${PACKAGE_VERSION} is already published on npm." + if npm view "klawty@${PACKAGE_VERSION}" version >/dev/null 2>&1; then + echo "klawty@${PACKAGE_VERSION} is already published on npm." exit 1 fi - echo "Publishing openclaw@${PACKAGE_VERSION}" + echo "Publishing klawty@${PACKAGE_VERSION}" - name: Check run: pnpm check @@ -192,4 +192,4 @@ jobs: run: pnpm release:check - name: Publish - run: bash scripts/openclaw-npm-publish.sh --publish + run: bash scripts/klawty-npm-publish.sh --publish diff --git a/.github/workflows/sandbox-common-smoke.yml b/.github/workflows/sandbox-common-smoke.yml index 4a839b4d87..e7817799c1 100644 --- a/.github/workflows/sandbox-common-smoke.yml +++ b/.github/workflows/sandbox-common-smoke.yml @@ -37,7 +37,7 @@ jobs: run: | set -euo pipefail - docker build -t openclaw-sandbox-smoke-base:bookworm-slim - <<'EOF' + docker build -t klawty-sandbox-smoke-base:bookworm-slim - <<'EOF' FROM debian:bookworm-slim RUN useradd --create-home --shell /bin/bash sandbox USER sandbox @@ -49,8 +49,8 @@ jobs: run: | set -euo pipefail - BASE_IMAGE="openclaw-sandbox-smoke-base:bookworm-slim" \ - TARGET_IMAGE="openclaw-sandbox-common-smoke:bookworm-slim" \ + BASE_IMAGE="klawty-sandbox-smoke-base:bookworm-slim" \ + TARGET_IMAGE="klawty-sandbox-common-smoke:bookworm-slim" \ PACKAGES="ca-certificates" \ INSTALL_PNPM=0 \ INSTALL_BUN=0 \ @@ -58,5 +58,5 @@ jobs: FINAL_USER=sandbox \ scripts/sandbox-common-setup.sh - u="$(docker run --rm openclaw-sandbox-common-smoke:bookworm-slim sh -lc 'id -un')" + u="$(docker run --rm klawty-sandbox-common-smoke:bookworm-slim sh -lc 'id -un')" test "$u" = "sandbox" diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 95dc406da4..333dd37a47 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -55,7 +55,7 @@ jobs: Please add updates or it will be closed. close-issue-message: | Closing due to inactivity. - If this is still an issue, please retry on the latest OpenClaw release and share updated details. + If this is still an issue, please retry on the latest Klawty release and share updated details. If you are absolutely sure it still happens on the latest release, open a new issue with fresh repro steps. close-issue-reason: not_planned close-pr-message: | @@ -111,7 +111,7 @@ jobs: Please add updates or it will be closed. close-issue-message: | Closing due to inactivity. - If this is still an issue, please retry on the latest OpenClaw release and share updated details. + If this is still an issue, please retry on the latest Klawty release and share updated details. If you are absolutely sure it still happens on the latest release, open a new issue with fresh repro steps. close-issue-reason: not_planned close-pr-message: | diff --git a/.gitignore b/.gitignore index 0e1812f0a1..7e924f7409 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,15 @@ docs/superpowers # Deprecated changelog fragment workflow changelog/fragments/ + +# Klawty +workspace/.env +workspace/.session +workspace/data/ +workspace/backups/ +workspace/observability/logs/ +workspace/credentials/ +*.db +*.db-shm +*.db-wal +runtime-manifest.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2f9d299a5b..edf022b356 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# Pre-commit hooks for openclaw +# Pre-commit hooks for klawty # Install: prek install # Run manually: prek run --all-files # @@ -48,21 +48,21 @@ repos: - --exclude-lines - 'typeof remote\?\.password === "string"' - --exclude-lines - - "OPENCLAW_DOCKER_GPG_FINGERPRINT=" + - "KLAWTY_DOCKER_GPG_FINGERPRINT=" - --exclude-lines - '"secretShape": "(secret_input|sibling_ref)"' - --exclude-lines - 'API key rotation \(provider-specific\): set `\*_API_KEYS`' - --exclude-lines - - 'password: `OPENCLAW_GATEWAY_PASSWORD` -> `gateway\.auth\.password` -> `gateway\.remote\.password`' + - 'password: `KLAWTY_GATEWAY_PASSWORD` -> `gateway\.auth\.password` -> `gateway\.remote\.password`' - --exclude-lines - - 'password: `OPENCLAW_GATEWAY_PASSWORD` -> `gateway\.remote\.password` -> `gateway\.auth\.password`' + - 'password: `KLAWTY_GATEWAY_PASSWORD` -> `gateway\.remote\.password` -> `gateway\.auth\.password`' - --exclude-files - '^src/gateway/client\.watchdog\.test\.ts$' - --exclude-lines - 'export CUSTOM_API_K[E]Y="your-key"' - --exclude-lines - - 'grep -q ''N[O]DE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache'' ~/.bashrc \|\| cat >> ~/.bashrc <<''EOF''' + - 'grep -q ''N[O]DE_COMPILE_CACHE=/var/tmp/klawty-compile-cache'' ~/.bashrc \|\| cat >> ~/.bashrc <<''EOF''' - --exclude-lines - 'env: \{ MISTRAL_API_K[E]Y: "sk-\.\.\." \},' - --exclude-lines diff --git a/.swiftlint.yml b/.swiftlint.yml index 567b1a1683..58a79e5bda 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -18,9 +18,9 @@ excluded: - coverage - "*.playground" # Generated (protocol-gen-swift.ts) - - apps/macos/Sources/OpenClawProtocol/GatewayModels.swift + - apps/macos/Sources/KlawtyProtocol/GatewayModels.swift # Generated (generate-host-env-security-policy-swift.mjs) - - apps/macos/Sources/OpenClaw/HostEnvSecurityPolicy.generated.swift + - apps/macos/Sources/Klawty/HostEnvSecurityPolicy.generated.swift analyzer_rules: - unused_declaration diff --git a/2026-03-19T12-25-44.486Z-klawty-backup.tar.gz b/2026-03-19T12-25-44.486Z-klawty-backup.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b3e04fc54cbc5c621fe63e553cacd92faab3fa62 GIT binary patch literal 3372 zcmV+{4b$=;iwFP!00000|Lq%VbK5pDpZzNk-drP1C5mr~vgMBLIE|Y)P2;4Qrp?@d z1Slb*2!#*HYUKo&+q&(zj&1AO z0{}U;fgWg|%joyCJk4+dqWn=h#bi)@{hPE;I|wOhFr;JrBTZ7qW2J}mmVgEc#Tg|B z89)?c*-v_g-7Eb>k*GKchHOe-aeftfqf-?_lRVDYm@b$rx~i#K(K(557V=~)zyv2V z78mfCljRXp!&V(tFZ%c-18@p(F*g9PIEZpW-|}RXPH;e>CrfhLDtdVw&5w8-vH`$D z9HkWC7X^2m4VUPEqh$0kO9aQxn-ti0SeyoULOW_PF{Pv#NO~_}_-5QraghO4jpI1a zhSzfFfKdnqje(%ms97~J7%9a4S%T3<5;eXe5#QJI#c4{j1%*!)oe_(P5J@Vaf&2e?~z`on5u5bV6>;K)^ zzZ2kiiqkbbg#B&UdgCA6zNME!S7{M(LM)ql3DYc|;5GHiES|J_HE_1~Cgcv0s>IL%)3 z9BM+cwklgixmq6TJyYxHrfQi`9@fQ0z{g`8lcjnp#u*d@VlzhdCXZPPwc=b1NbqdIbpRF1Ou|d1W2hVjR>T7wRdhw!Rii8+Wqd^AMYdo3 z1UL;`$IwGP=yq)zTdq&su5MZ()d}%k64;?-YJnN}E_Op->n^H-i@#b`@aM$8>f_OZ z#|`msY4+v#w_(IK{_mrG`pd>r_*f3=9b-*$)bAMwGu>hE{v|MoWj zyN`B<_Rl8-BDxJ>7mQZ2z#G%UkqkA&GaE|{jNdQKM> z%!@BA@V4D)yYu^h04DTY9cJUG;-Ovp{Li(FmH5|1{F|n>jsN>-dk+Z@viXD}VX^(4 zJ&|ppV2G2HW_=~k!gg0dovI_oW7=1yjLs$;l06jgIHNHj&KSvteL|-!pl$i1g;>nQ zgQ_;TNksd4K_+8aME9RbmqAC;W%fD+aAz;g=HiN^FfHVBGDn}#kg~xr>mgm!{<(|B zI2o|GhqPTJoO6)yJSIK#577E9$P@7deuQDTi$V|%Mmdx7j;>m$jVF_cw$pi<(QykM zMl2qk;^0jFege2HRP?oT)K*w>~hFD<0 zOjLL3EWr~Hc+BGVs?em!fqQ6>FtUr_JE(~Pue65(P#{eJhzViwpoa`=a$XV)a6*8f zRA^7oZMcRuId4g_%~cH~10OdG+iq3=kPLMs6F$2t;*u-^&=$7qA@N!HSUcka zrJk&xXBm%y5;zjY3629`6LT@K+v(W4*<#WTD_*?Nza~^K6>!;55-8_BE8WhK(U2#p zAT;5uaIwWKdN>fZ984yIiKOBod$0H!K@#^<118cewZ}(*Rf%L+RO{lh$H!!;D-7+x z4$3Yl25Q?b>v73mUAqoZqYTlUwZ}Z>@+m8X;FDAM(SAh-d4!V|I;C+0aR@*h!1aj7 zplY19kn)`QG{NGzzvzXU6xC#Q(QF8QD18XbHA!f@u<;c`Xf64tn)YpjM(Z{&*=K`k zE_U`h<=VDK*c1gIb_$Co2%?DPZW$;-UIJIaGSEsm^bGaOYbZdf&ZS`xCCdJZuzqRq z4C-`{c|cJ^l<)0?ij5u782b?=&Ako`F1Z(9uSf#Xw2-5W2}b&gpNUm3iny}>R9yBt zMdv15aqL6ce+{2EVNQmy04w`1#pNbk0(;F!*?%l9tGHL@BZi1G4SA|8s|!g>^_3Op z6}DCOm$g$-08g)ni|_ldC?<2YMlHWomo!M&B-`IDFyfM&-L6<-hMC!`^XH+O6NLh|c}l(SnJCE~J=8sl_OurJuE89mRAioG1V&$0wO zS|Wk(?(Wp1hd4d?{!9=Mqop1mK5Uehm_g>pXX=dlBbK4BzFG%X$23jB`JUpKM36+@ z60J-z3s*ld-kcl+BG~27rOAPK2Qf)FMC*DH8zqT4 z_mL9jvFuTrYea*fn9!t>Y%PZ~8WWLRm-4LA6vQf{t1OOb^7QrTbJQ0(zRfm=6}QjLYudZ-eBsNf)gt9&D*1PS>_c9d@a@F9UcuUTNyB;g52*-()D zDiKR?Q%J2erIjVy(w49x98V#Vo-@cM!AuRMux<|A5S3Hh_e&YEH%MG)OfgL=Vtu~Lr(t%M+GzFOXq;y7Ir%o9mi>&P&DWH zBe;lU9;S`5Axl9R1U>+^?NotO?lR)U9V#k3wOCI?OK6rS@oxQiqh6aX`SH%?pt{!O z>u~($x=5FXT*wj=5Um?%qUG?$w(}%Fc>nfq5grVoTpdvFNQx zmbf?4EVlklG>hJfW{JDIbJ1+TCoFO0zWk*N@_TM~eEz5Nf&1y@BLFwu|FyKs_kS$M z*gpTimnQH3PA{GO7Dg23XWwsc_x`W9KjHjWr??BaSOso~e`hKF9ry+D?`WpEjsN>- zYvaE#;E6mfuVLLIHnxc4o74(jNAm;Eb-`A??ga+%ZNu_4EpRpB(9rZPNB2YBa%^n- zq33wziyXNRTk*(NzgIb=$qm$#47v$-akAshS9+)4`pT*sG2j2~! znC??2J@tm~el?zdI2*jme)Y#6pDfFBg}Ac%n$4+Lb9L7>J>4_9me)1z;b_7gKmYF( zufDW#PFV4>SaehTo95N?KaOQ?pa0%V`=p3Bem0zt(cdYp^4%D~DNV~DF;}RlZ)=!3 zOPF{wXywJHTfO(BOc<;(U01UW_+J0efz*twp}{85>_(NK2 zM5vKw@L8UDQpW|O;-u4i(C0Y~4oX?uZNgG)NercV|M(ordnSq<9K9`IV$cj{ z!SGZbnvyTBm5?)<7OQ!jM^OnoDo%J+FnZ3?EIp(lPZonG2`u|OPoLscn2(yi7Fd?y zb;Cdpbj!n`A6h}z^PJH449jpawRCDZmgjq>6=2J=Jx}-Du5I{T+lJ}IP#c%jG$-(= z4LxS4W83t6&Ct5k$HcKMo0?rhbl0G6S2IJ0nzl#WFzkA|ZHIwpQW7W&`3~n9O{R=^GL);LPh1STM&so!bd)uZYjD4 z?TZIj;Z&Dm>kgt}DYkIvg_=ce!=*0Kx?NMGWMS9pcAY>Rs0y)Vg|-$1y5>?FW9T9{ z)J@l-lsblYHMV3ZErpip-afR73EwiZ>InKn!S$s#(QVtdZQHiLVf!yrtu;OXL;wIU C)rJuO literal 0 HcmV?d00001 diff --git a/AGENTS.md b/AGENTS.md index 488bc0678f..311a3b6ffd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # Repository Guidelines -- Repo: https://github.com/openclaw/openclaw +- Repo: https://github.com/klawty/klawty - In chat replies, file references must be repo-root relative only (example: `extensions/bluebubbles/src/channel.ts:80`); never absolute paths or `~/...`. - Do not edit files covered by security-focused `CODEOWNERS` rules unless a listed owner explicitly asked for the change or is already reviewing it with you. Treat those paths as restricted surfaces, not drive-by cleanup. @@ -10,9 +10,9 @@ - Tests: colocated `*.test.ts`. - Docs: `docs/` (images, queue, Pi config). Built output lives in `dist/`. - Plugins/extensions: live under `extensions/*` (workspace packages). Keep plugin-only deps in the extension `package.json`; do not add them to the root `package.json` unless core uses them. -- Plugins: install runs `npm install --omit=dev` in plugin dir; runtime deps must live in `dependencies`. Avoid `workspace:*` in `dependencies` (npm install breaks); put `openclaw` in `devDependencies` or `peerDependencies` instead (runtime resolves `openclaw/plugin-sdk` via jiti alias). -- Import boundaries: extension production code should treat `openclaw/plugin-sdk/*` plus local `api.ts` / `runtime-api.ts` barrels as the public surface. Do not import core `src/**`, `src/plugin-sdk-internal/**`, or another extension's `src/**` directly. -- Installers served from `https://openclaw.ai/*`: live in the sibling repo `../openclaw.ai` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`). +- Plugins: install runs `npm install --omit=dev` in plugin dir; runtime deps must live in `dependencies`. Avoid `workspace:*` in `dependencies` (npm install breaks); put `klawty` in `devDependencies` or `peerDependencies` instead (runtime resolves `klawty/plugin-sdk` via jiti alias). +- Import boundaries: extension production code should treat `klawty/plugin-sdk/*` plus local `api.ts` / `runtime-api.ts` barrels as the public surface. Do not import core `src/**`, `src/plugin-sdk-internal/**`, or another extension's `src/**` directly. +- Installers served from `https://klawty.ai/*`: live in the sibling repo `../klawty.ai` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`). - Messaging channels: always consider **all** built-in + extension channels when refactoring shared logic (routing, allowlists, pairing, command gating, onboarding, docs). - Core channel docs: `docs/channels/` - Core channel code: `src/telegram`, `src/discord`, `src/slack`, `src/signal`, `src/imessage`, `src/web` (WhatsApp web), `src/channels`, `src/routing` @@ -21,15 +21,15 @@ ## Docs Linking (Mintlify) -- Docs are hosted on Mintlify (docs.openclaw.ai). +- Docs are hosted on Mintlify (docs.klawty.ai). - Internal doc links in `docs/**/*.md`: root-relative, no `.md`/`.mdx` (example: `[Config](/configuration)`). - When working with documentation, read the mintlify skill. - For docs, UI copy, and picker lists, order services/providers alphabetically unless the section is explicitly describing runtime behavior (for example auto-detection or execution order). - Section cross-references: use anchors on root-relative paths (example: `[Hooks](/configuration#hooks)`). - Doc headings and anchors: avoid em dashes and apostrophes in headings because they break Mintlify anchor links. -- When Peter asks for links, reply with full `https://docs.openclaw.ai/...` URLs (not root-relative). -- When you touch docs, end the reply with the `https://docs.openclaw.ai/...` URLs you referenced. -- README (GitHub): keep absolute docs URLs (`https://docs.openclaw.ai/...`) so links work on GitHub. +- When Peter asks for links, reply with full `https://docs.klawty.ai/...` URLs (not root-relative). +- When you touch docs, end the reply with the `https://docs.klawty.ai/...` URLs you referenced. +- README (GitHub): keep absolute docs URLs (`https://docs.klawty.ai/...`) so links work on GitHub. - Docs content must be generic: no personal device names/hostnames/paths; use placeholders like `user@gateway-host` and “gateway host”. ## Docs i18n (zh-CN) @@ -46,12 +46,12 @@ - Access: stable path is `ssh exe.dev` then `ssh vm-name` (assume SSH key already set). - SSH flaky: use exe.dev web terminal or Shelley (web agent); keep a tmux session for long ops. -- Update: `sudo npm i -g openclaw@latest` (global install needs root on `/usr/lib/node_modules`). -- Config: use `openclaw config set ...`; ensure `gateway.mode=local` is set. +- Update: `sudo npm i -g klawty@latest` (global install needs root on `/usr/lib/node_modules`). +- Config: use `klawty config set ...`; ensure `gateway.mode=local` is set. - Discord: store raw token only (no `DISCORD_BOT_TOKEN=` prefix). - Restart: stop old gateway and run: - `pkill -9 -f openclaw-gateway || true; nohup openclaw gateway run --bind loopback --port 18789 --force > /tmp/openclaw-gateway.log 2>&1 &` -- Verify: `openclaw channels status --probe`, `ss -ltnp | rg 18789`, `tail -n 120 /tmp/openclaw-gateway.log`. + `pkill -9 -f klawty-gateway || true; nohup klawty gateway run --bind loopback --port 2508 --force > /tmp/klawty-gateway.log 2>&1 &` +- Verify: `klawty channels status --probe`, `ss -ltnp | rg 2508`, `tail -n 120 /tmp/klawty-gateway.log`. ## Build, Test, and Development Commands @@ -61,7 +61,7 @@ - Pre-commit hooks: `prek install` (runs same checks as CI) - Also supported: `bun install` (keep `pnpm-lock.yaml` + Bun patching in sync when touching deps/patches). - Prefer Bun for TypeScript execution (scripts, dev, tests): `bun ` / `bunx `. -- Run CLI in dev: `pnpm openclaw ...` (bun) or `pnpm dev`. +- Run CLI in dev: `pnpm klawty ...` (bun) or `pnpm dev`. - Node remains supported for running built output (`dist/*`) and production installs. - Mac packaging (dev): `scripts/package-mac-app.sh` defaults to current arch. - Type-check/build: `pnpm build` @@ -82,22 +82,22 @@ - Never add `@ts-nocheck` and do not disable `no-explicit-any`; fix root causes and update Oxlint/Oxfmt config only when required. - Dynamic import guardrail: do not mix `await import("x")` and static `import ... from "x"` for the same module in production code paths. If you need lazy loading, create a dedicated `*.runtime.ts` boundary (that re-exports from `x`) and dynamically import that boundary from lazy callers only. - Dynamic import verification: after refactors that touch lazy-loading/module boundaries, run `pnpm build` and check for `[INEFFECTIVE_DYNAMIC_IMPORT]` warnings before submitting. -- Extension SDK self-import guardrail: inside an extension package, do not import that same extension via `openclaw/plugin-sdk/` from production files. Route internal imports through a local barrel such as `./api.ts` or `./runtime-api.ts`, and keep the `plugin-sdk/` path as the external contract only. -- Extension package boundary guardrail: inside `extensions//**`, do not use relative imports/exports that resolve outside that same `extensions/` package root. If shared code belongs in the plugin SDK, import `openclaw/plugin-sdk/` instead of reaching into `src/plugin-sdk/**` or other repo paths via `../`. -- Extension API surface rule: `openclaw/plugin-sdk/` is the only public cross-package contract for extension-facing SDK code. If an extension needs a new seam, add a public subpath first; do not reach into `src/plugin-sdk/**` by relative path. +- Extension SDK self-import guardrail: inside an extension package, do not import that same extension via `klawty/plugin-sdk/` from production files. Route internal imports through a local barrel such as `./api.ts` or `./runtime-api.ts`, and keep the `plugin-sdk/` path as the external contract only. +- Extension package boundary guardrail: inside `extensions//**`, do not use relative imports/exports that resolve outside that same `extensions/` package root. If shared code belongs in the plugin SDK, import `klawty/plugin-sdk/` instead of reaching into `src/plugin-sdk/**` or other repo paths via `../`. +- Extension API surface rule: `klawty/plugin-sdk/` is the only public cross-package contract for extension-facing SDK code. If an extension needs a new seam, add a public subpath first; do not reach into `src/plugin-sdk/**` by relative path. - Never share class behavior via prototype mutation (`applyPrototypeMixins`, `Object.defineProperty` on `.prototype`, or exporting `Class.prototype` for merges). Use explicit inheritance/composition (`A extends B extends C`) or helper composition so TypeScript can typecheck. - If this pattern is needed, stop and get explicit approval before shipping; default behavior is to split/refactor into an explicit class hierarchy and keep members strongly typed. - In tests, prefer per-instance stubs over prototype mutation (`SomeClass.prototype.method = ...`) unless a test explicitly documents why prototype-level patching is required. - Add brief code comments for tricky or non-obvious logic. - Keep files concise; extract helpers instead of “V2” copies. Use existing patterns for CLI options and dependency injection via `createDefaultDeps`. - Aim to keep files under ~700 LOC; guideline only (not a hard guardrail). Split/refactor when it improves clarity or testability. -- Naming: use **OpenClaw** for product/app/docs headings; use `openclaw` for CLI command, package/binary, paths, and config keys. +- Naming: use **Klawty** for product/app/docs headings; use `klawty` for CLI command, package/binary, paths, and config keys. - Written English: use American spelling and grammar in code, comments, docs, and UI strings (e.g. "color" not "colour", "behavior" not "behaviour", "analyze" not "analyse"). ## Release / Advisory Workflows -- Use `$openclaw-release-maintainer` at `.agents/skills/openclaw-release-maintainer/SKILL.md` for release naming, version coordination, release auth, and changelog-backed release-note workflows. -- Use `$openclaw-ghsa-maintainer` at `.agents/skills/openclaw-ghsa-maintainer/SKILL.md` for GHSA advisory inspection, patch/publish flow, private-fork checks, and GHSA API validation. +- Use `$klawty-release-maintainer` at `.agents/skills/klawty-release-maintainer/SKILL.md` for release naming, version coordination, release auth, and changelog-backed release-note workflows. +- Use `$klawty-ghsa-maintainer` at `.agents/skills/klawty-ghsa-maintainer/SKILL.md` for GHSA advisory inspection, patch/publish flow, private-fork checks, and GHSA API validation. - Release and publish remain explicit-approval actions even when using the skill. ## Testing Guidelines @@ -108,8 +108,8 @@ - Agents MUST NOT modify baseline, inventory, ignore, snapshot, or expected-failure files to silence failing checks without explicit approval in this chat. - For targeted/local debugging, keep using the wrapper: `pnpm test -- [vitest args...]` (for example `pnpm test -- src/commands/onboard-search.test.ts -t "shows registered plugin providers"`); do not default to raw `pnpm vitest run ...` because it bypasses wrapper config/profile/pool routing. - Do not set test workers above 16; tried already. -- If local Vitest runs cause memory pressure (common on non-Mac-Studio hosts), use `OPENCLAW_TEST_PROFILE=low OPENCLAW_TEST_SERIAL_GATEWAY=1 pnpm test` for land/gate runs. -- Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (OpenClaw-only) or `LIVE=1 pnpm test:live` (includes provider live tests). Docker: `pnpm test:docker:live-models`, `pnpm test:docker:live-gateway`. Onboarding Docker E2E: `pnpm test:docker:onboard`. +- If local Vitest runs cause memory pressure (common on non-Mac-Studio hosts), use `KLAWTY_TEST_PROFILE=low KLAWTY_TEST_SERIAL_GATEWAY=1 pnpm test` for land/gate runs. +- Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (Klawty-only) or `LIVE=1 pnpm test:live` (includes provider live tests). Docker: `pnpm test:docker:live-models`, `pnpm test:docker:live-gateway`. Onboarding Docker E2E: `pnpm test:docker:onboard`. - Full kit + what’s covered: `docs/help/testing.md`. - Changelog: user-facing changes only; no internal/meta notes (version alignment, appcast reminders, release process). - Changelog placement: in the active version block, append new entries to the end of the target section (`### Changes` or `### Fixes`); do not insert new entries at the top of a section. @@ -119,9 +119,9 @@ ## Commit & Pull Request Guidelines -- Use `$openclaw-pr-maintainer` at `.agents/skills/openclaw-pr-maintainer/SKILL.md` for maintainer PR triage, review, close, search, and landing workflows. +- Use `$klawty-pr-maintainer` at `.agents/skills/klawty-pr-maintainer/SKILL.md` for maintainer PR triage, review, close, search, and landing workflows. - This includes auto-close labels, bug-fix evidence gates, GitHub comment/search footguns, and maintainer PR decision flow. -- For the repo's end-to-end maintainer PR workflow, use `$openclaw-pr-maintainer` at `.agents/skills/openclaw-pr-maintainer/SKILL.md`. +- For the repo's end-to-end maintainer PR workflow, use `$klawty-pr-maintainer` at `.agents/skills/klawty-pr-maintainer/SKILL.md`. - `/landpr` lives in the global Codex prompts (`~/.codex/prompts/landpr.md`); when landing or merging any PR, always follow that `/landpr` process. - Create commits with `scripts/committer "" `; avoid manual `git add`/`git commit` so staging stays scoped. @@ -138,42 +138,42 @@ ## Security & Configuration Tips -- Web provider stores creds at `~/.openclaw/credentials/`; rerun `openclaw login` if logged out. -- Pi sessions live under `~/.openclaw/sessions/` by default; the base directory is not configurable. +- Web provider stores creds at `~/.klawty/credentials/`; rerun `klawty login` if logged out. +- Pi sessions live under `~/.klawty/sessions/` by default; the base directory is not configurable. - Environment variables: see `~/.profile`. - Never commit or publish real phone numbers, videos, or live configuration values. Use obviously fake placeholders in docs, tests, and examples. -- Release flow: use the private [maintainer release docs](https://github.com/openclaw/maintainers/blob/main/release/README.md) for the actual runbook, `docs/reference/RELEASING.md` for the public release policy, and `$openclaw-release-maintainer` for the maintainership workflow. +- Release flow: use the private [maintainer release docs](https://github.com/klawty/maintainers/blob/main/release/README.md) for the actual runbook, `docs/reference/RELEASING.md` for the public release policy, and `$klawty-release-maintainer` for the maintainership workflow. ## Local Runtime / Platform Notes - Vocabulary: "makeup" = "mac app". -- Rebrand/migration issues or legacy config/service warnings: run `openclaw doctor` (see `docs/gateway/doctor.md`). -- Use `$openclaw-parallels-smoke` at `.agents/skills/openclaw-parallels-smoke/SKILL.md` for Parallels smoke, rerun, upgrade, debug, and result-interpretation workflows across macOS, Windows, and Linux guests. +- Rebrand/migration issues or legacy config/service warnings: run `klawty doctor` (see `docs/gateway/doctor.md`). +- Use `$klawty-parallels-smoke` at `.agents/skills/klawty-parallels-smoke/SKILL.md` for Parallels smoke, rerun, upgrade, debug, and result-interpretation workflows across macOS, Windows, and Linux guests. - For the macOS Discord roundtrip deep dive, use the narrower `.agents/skills/parallels-discord-roundtrip/SKILL.md` companion skill. - Never edit `node_modules` (global/Homebrew/npm/git installs too). Updates overwrite. Skill notes go in `tools.md` or `AGENTS.md`. - If you need local-only `.agents` ignores, use `.git/info/exclude` instead of repo `.gitignore`. - When adding a new `AGENTS.md` anywhere in the repo, also add a `CLAUDE.md` symlink pointing to it (example: `ln -s AGENTS.md CLAUDE.md`). -- Signal: "update fly" => `fly ssh console -a flawd-bot -C "bash -lc 'cd /data/clawd/openclaw && git pull --rebase origin main'"` then `fly machines restart e825232f34d058 -a flawd-bot`. +- Signal: "update fly" => `fly ssh console -a flawd-bot -C "bash -lc 'cd /data/clawd/klawty && git pull --rebase origin main'"` then `fly machines restart e825232f34d058 -a flawd-bot`. - CLI progress: use `src/cli/progress.ts` (`osc-progress` + `@clack/prompts` spinner); don’t hand-roll spinners/bars. - Status output: keep tables + ANSI-safe wrapping (`src/terminal/table.ts`); `status --all` = read-only/pasteable, `status --deep` = probes. -- Gateway currently runs only as the menubar app; there is no separate LaunchAgent/helper label installed. Restart via the OpenClaw Mac app or `scripts/restart-mac.sh`; to verify/kill use `launchctl print gui/$UID | grep openclaw` rather than assuming a fixed label. **When debugging on macOS, start/stop the gateway via the app, not ad-hoc tmux sessions; kill any temporary tunnels before handoff.** -- macOS logs: use `./scripts/clawlog.sh` to query unified logs for the OpenClaw subsystem; it supports follow/tail/category filters and expects passwordless sudo for `/usr/bin/log`. +- Gateway currently runs only as the menubar app; there is no separate LaunchAgent/helper label installed. Restart via the Klawty Mac app or `scripts/restart-mac.sh`; to verify/kill use `launchctl print gui/$UID | grep klawty` rather than assuming a fixed label. **When debugging on macOS, start/stop the gateway via the app, not ad-hoc tmux sessions; kill any temporary tunnels before handoff.** +- macOS logs: use `./scripts/clawlog.sh` to query unified logs for the Klawty subsystem; it supports follow/tail/category filters and expects passwordless sudo for `/usr/bin/log`. - If shared guardrails are available locally, review them; otherwise follow this repo's guidance. - SwiftUI state management (iOS/macOS): prefer the `Observation` framework (`@Observable`, `@Bindable`) over `ObservableObject`/`@StateObject`; don’t introduce new `ObservableObject` unless required for compatibility, and migrate existing usages when touching related code. - Connection providers: when adding a new connection, update every UI surface and docs (macOS app, web UI, mobile if applicable, onboarding/overview docs) and add matching status + configuration forms so provider lists and settings stay in sync. -- Version locations: `package.json` (CLI), `apps/android/app/build.gradle.kts` (versionName/versionCode), `apps/ios/Sources/Info.plist` + `apps/ios/Tests/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `apps/macos/Sources/OpenClaw/Resources/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `docs/install/updating.md` (pinned npm version), and Peekaboo Xcode projects/Info.plists (MARKETING_VERSION/CURRENT_PROJECT_VERSION). +- Version locations: `package.json` (CLI), `apps/android/app/build.gradle.kts` (versionName/versionCode), `apps/ios/Sources/Info.plist` + `apps/ios/Tests/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `apps/macos/Sources/Klawty/Resources/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `docs/install/updating.md` (pinned npm version), and Peekaboo Xcode projects/Info.plists (MARKETING_VERSION/CURRENT_PROJECT_VERSION). - "Bump version everywhere" means all version locations above **except** `appcast.xml` (only touch appcast when cutting a new macOS Sparkle release). - **Restart apps:** “restart iOS/Android apps” means rebuild (recompile/install) and relaunch, not just kill/launch. - **Device checks:** before testing, verify connected real devices (iOS/Android) before reaching for simulators/emulators. - iOS Team ID lookup: `security find-identity -p codesigning -v` → use Apple Development (…) TEAMID. Fallback: `defaults read com.apple.dt.Xcode IDEProvisioningTeamIdentifiers`. - A2UI bundle hash: `src/canvas-host/a2ui/.bundle.hash` is auto-generated; ignore unexpected changes, and only regenerate via `pnpm canvas:a2ui:bundle` (or `scripts/bundle-a2ui.sh`) when needed. Commit the hash as a separate commit. -- Release signing/notary credentials are managed outside the repo; maintainers keep that setup in the private [maintainer release docs](https://github.com/openclaw/maintainers/tree/main/release). +- Release signing/notary credentials are managed outside the repo; maintainers keep that setup in the private [maintainer release docs](https://github.com/klawty/maintainers/tree/main/release). - Lobster palette: use the shared CLI palette in `src/terminal/palette.ts` (no hardcoded colors); apply palette to onboarding/config prompts and other TTY UI output as needed. -- When asked to open a “session” file, open the Pi session logs under `~/.openclaw/agents//sessions/*.jsonl` (use the `agent=` value in the Runtime line of the system prompt; newest unless a specific ID is given), not the default `sessions.json`. If logs are needed from another machine, SSH via Tailscale and read the same path there. +- When asked to open a “session” file, open the Pi session logs under `~/.klawty/agents//sessions/*.jsonl` (use the `agent=` value in the Runtime line of the system prompt; newest unless a specific ID is given), not the default `sessions.json`. If logs are needed from another machine, SSH via Tailscale and read the same path there. - Do not rebuild the macOS app over SSH; rebuilds must be run directly on the Mac. - Voice wake forwarding tips: - - Command template should stay `openclaw-mac agent --message "${text}" --thinking low`; `VoiceWakeForwarder` already shell-escapes `${text}`. Don’t add extra quotes. - - launchd PATH is minimal; ensure the app’s launch agent PATH includes standard system paths plus your pnpm bin (typically `$HOME/Library/pnpm`) so `pnpm`/`openclaw` binaries resolve when invoked via `openclaw-mac`. + - Command template should stay `klawty-mac agent --message "${text}" --thinking low`; `VoiceWakeForwarder` already shell-escapes `${text}`. Don’t add extra quotes. + - launchd PATH is minimal; ensure the app’s launch agent PATH includes standard system paths plus your pnpm bin (typically `$HOME/Library/pnpm`) so `pnpm`/`klawty` binaries resolve when invoked via `klawty-mac`. ## Collaboration / Safety Notes @@ -198,6 +198,6 @@ - Tool schema guardrails (google-antigravity): avoid `Type.Union` in tool input schemas; no `anyOf`/`oneOf`/`allOf`. Use `stringEnum`/`optionalStringEnum` (Type.Unsafe enum) for string lists, and `Type.Optional(...)` instead of `... | null`. Keep top-level tool schema as `type: "object"` with `properties`. - Tool schema guardrails: avoid raw `format` property names in tool schemas; some validators treat `format` as a reserved keyword and reject the schema. - Never send streaming/partial replies to external messaging surfaces (WhatsApp, Telegram); only final replies should be delivered there. Streaming/tool events may still go to internal UIs/control channel. -- For manual `openclaw message send` messages that include `!`, use the heredoc pattern noted below to avoid the Bash tool’s escaping. +- For manual `klawty message send` messages that include `!`, use the heredoc pattern noted below to avoid the Bash tool’s escaping. - Release guardrails: do not change version numbers without operator’s explicit consent; always ask permission before running any npm publish/release step. - Beta release guardrail: when using a beta Git tag (for example `vYYYY.M.D-beta.N`), publish npm with a matching beta version suffix (for example `YYYY.M.D-beta.N`) rather than a plain version on `--tag beta`; otherwise the plain version name gets consumed/blocked. diff --git a/CHANGELOG.md b/CHANGELOG.md index c5a376f35b..aa3ec03069 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3444,7 +3444,7 @@ Docs: https://docs.openclaw.ai - Gateway: clarify Control UI/WebChat auth error hints for missing tokens. (#1690) - Gateway: listen on IPv6 loopback when bound to 127.0.0.1 so localhost webhooks work. - Gateway: store lock files in the temp directory to avoid stale locks on persistent volumes. (#1676) -- macOS: default direct-transport `ws://` URLs to port 18789; document `gateway.remote.transport`. (#1603) Thanks @ngutman. +- macOS: default direct-transport `ws://` URLs to port 2508; document `gateway.remote.transport`. (#1603) Thanks @ngutman. - Tests: cap Vitest workers on CI macOS to reduce timeouts. (#1597) Thanks @rohannagpal. - Tests: avoid fake-timer dependency in embedded runner stream mock to reduce CI flakes. (#1597) Thanks @rohannagpal. - Tests: increase embedded runner ordering test timeout to reduce CI flakes. (#1597) Thanks @rohannagpal. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8914ffc1f3..1adae32859 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,13 +1,13 @@ -# Contributing to OpenClaw +# Contributing to Klawty Welcome to the lobster tank! 🦞 ## Quick Links -- **GitHub:** https://github.com/openclaw/openclaw +- **GitHub:** https://github.com/klawty/klawty - **Vision:** [`VISION.md`](VISION.md) - **Discord:** https://discord.gg/qkhbAGHRBT -- **X/Twitter:** [@steipete](https://x.com/steipete) / [@openclaw](https://x.com/openclaw) +- **X/Twitter:** [@steipete](https://x.com/steipete) / [@klawty](https://x.com/klawty) ## Maintainers @@ -82,13 +82,13 @@ Welcome to the lobster tank! 🦞 ## How to Contribute 1. **Bugs & small fixes** → Open a PR! -2. **New features / architecture** → Start a [GitHub Discussion](https://github.com/openclaw/openclaw/discussions) or ask in Discord first +2. **New features / architecture** → Start a [GitHub Discussion](https://github.com/klawty/klawty/discussions) or ask in Discord first 3. **Test/CI-only PRs for known `main` failures** → Don't open a PR, the Maintainer team is already tracking it and such PRs will be closed automatically. If you've spotted a _new_ regression not yet shown in main CI, report it as an issue first. 4. **Questions** → Discord [#help](https://discord.com/channels/1456350064065904867/1459642797895319552) / [#users-helping-users](https://discord.com/channels/1456350064065904867/1459007081603403828) ## Before You PR -- Test locally with your OpenClaw instance +- Test locally with your Klawty instance - Run tests: `pnpm build && pnpm check && pnpm test` - For extension/plugin changes, run the fast local lane first: - `pnpm test:extension ` @@ -97,7 +97,7 @@ Welcome to the lobster tank! 🦞 - For targeted shared-surface work, use `pnpm test:contracts:channels` or `pnpm test:contracts:plugins` - If you changed broader runtime behavior, still run the relevant wider lanes (`pnpm test:extensions`, `pnpm test:channels`, or `pnpm test`) before asking for review - If you have access to Codex, run `codex review --base origin/main` locally before opening or updating your PR. Treat this as the current highest standard of AI review, even if GitHub Codex review also runs. -- Do not submit test or CI-config fixes for failures already red on `main` CI. If a failure is already visible in the [main branch CI runs](https://github.com/openclaw/openclaw/actions), it's a known issue the Maintainer team is tracking, and a PR that only addresses those failures will be closed automatically. If you spot a _new_ regression not yet shown in main CI, report it as an issue first. +- Do not submit test or CI-config fixes for failures already red on `main` CI. If a failure is already visible in the [main branch CI runs](https://github.com/klawty/klawty/actions), it's a known issue the Maintainer team is tracking, and a PR that only addresses those failures will be closed automatically. If you spot a _new_ regression not yet shown in main CI, report it as an issue first. - Ensure CI checks pass - Keep PRs focused (one thing per PR; do not mix unrelated concerns) - Describe what & why @@ -154,21 +154,21 @@ We are currently prioritizing: - **Stability**: Fixing edge cases in channel connections (WhatsApp/Telegram). - **UX**: Improving the onboarding wizard and error messages. -- **Skills**: For skill contributions, head to [ClawHub](https://clawhub.ai/) — the community hub for OpenClaw skills. +- **Skills**: For skill contributions, head to [ClawHub](https://clawhub.ai/) — the community hub for Klawty skills. - **Performance**: Optimizing token usage and compaction logic. -Check the [GitHub Issues](https://github.com/openclaw/openclaw/issues) for "good first issue" labels! +Check the [GitHub Issues](https://github.com/klawty/klawty/issues) for "good first issue" labels! ## Maintainers We're selectively expanding the maintainer team. -If you're an experienced contributor who wants to help shape OpenClaw's direction — whether through code, docs, or community — we'd like to hear from you. +If you're an experienced contributor who wants to help shape Klawty's direction — whether through code, docs, or community — we'd like to hear from you. Being a maintainer is a responsibility, not an honorary title. We expect active, consistent involvement — triaging issues, reviewing PRs, and helping move the project forward. -Still interested? Email contributing@openclaw.ai with: +Still interested? Email contributing@klawty.ai with: -- Links to your PRs on OpenClaw (if you don't have any, start there first) +- Links to your PRs on Klawty (if you don't have any, start there first) - Links to open source projects you maintain or actively contribute to - Your GitHub, Discord, and X/Twitter handles - A brief intro: background, experience, and areas of interest @@ -183,14 +183,14 @@ Please allow a few weeks for a response. We take security reports seriously. Report vulnerabilities directly to the repository where the issue lives: -- **Core CLI and gateway** — [openclaw/openclaw](https://github.com/openclaw/openclaw) -- **macOS desktop app** — [openclaw/openclaw](https://github.com/openclaw/openclaw) (apps/macos) -- **iOS app** — [openclaw/openclaw](https://github.com/openclaw/openclaw) (apps/ios) -- **Android app** — [openclaw/openclaw](https://github.com/openclaw/openclaw) (apps/android) -- **ClawHub** — [openclaw/clawhub](https://github.com/openclaw/clawhub) -- **Trust and threat model** — [openclaw/trust](https://github.com/openclaw/trust) +- **Core CLI and gateway** — [klawty/klawty](https://github.com/klawty/klawty) +- **macOS desktop app** — [klawty/klawty](https://github.com/klawty/klawty) (apps/macos) +- **iOS app** — [klawty/klawty](https://github.com/klawty/klawty) (apps/ios) +- **Android app** — [klawty/klawty](https://github.com/klawty/klawty) (apps/android) +- **ClawHub** — [klawty/clawhub](https://github.com/klawty/clawhub) +- **Trust and threat model** — [klawty/trust](https://github.com/klawty/trust) -For issues that don't fit a specific repo, or if you're unsure, email **security@openclaw.ai** and we'll route it. +For issues that don't fit a specific repo, or if you're unsure, email **security@klawty.ai** and we'll route it. ### Required in Reports diff --git a/Dockerfile b/Dockerfile index fa97f83323..474d4393cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1.7 # Opt-in extension dependencies at build time (space-separated directory names). -# Example: docker build --build-arg OPENCLAW_EXTENSIONS="diagnostics-otel matrix" . +# Example: docker build --build-arg KLAWTY_EXTENSIONS="diagnostics-otel matrix" . # # Multi-stage build produces a minimal runtime image without build tools, # source code, or Bun. Works with Docker, Buildx, and Podman. @@ -11,25 +11,25 @@ # # Two runtime variants: # Default (bookworm): docker build . -# Slim (bookworm-slim): docker build --build-arg OPENCLAW_VARIANT=slim . -ARG OPENCLAW_EXTENSIONS="" -ARG OPENCLAW_VARIANT=default -ARG OPENCLAW_NODE_BOOKWORM_IMAGE="node:24-bookworm@sha256:3a09aa6354567619221ef6c45a5051b671f953f0a1924d1f819ffb236e520e6b" -ARG OPENCLAW_NODE_BOOKWORM_DIGEST="sha256:3a09aa6354567619221ef6c45a5051b671f953f0a1924d1f819ffb236e520e6b" -ARG OPENCLAW_NODE_BOOKWORM_SLIM_IMAGE="node:24-bookworm-slim@sha256:e8e2e91b1378f83c5b2dd15f0247f34110e2fe895f6ca7719dbb780f929368eb" -ARG OPENCLAW_NODE_BOOKWORM_SLIM_DIGEST="sha256:e8e2e91b1378f83c5b2dd15f0247f34110e2fe895f6ca7719dbb780f929368eb" +# Slim (bookworm-slim): docker build --build-arg KLAWTY_VARIANT=slim . +ARG KLAWTY_EXTENSIONS="" +ARG KLAWTY_VARIANT=default +ARG KLAWTY_NODE_BOOKWORM_IMAGE="node:24-bookworm@sha256:3a09aa6354567619221ef6c45a5051b671f953f0a1924d1f819ffb236e520e6b" +ARG KLAWTY_NODE_BOOKWORM_DIGEST="sha256:3a09aa6354567619221ef6c45a5051b671f953f0a1924d1f819ffb236e520e6b" +ARG KLAWTY_NODE_BOOKWORM_SLIM_IMAGE="node:24-bookworm-slim@sha256:e8e2e91b1378f83c5b2dd15f0247f34110e2fe895f6ca7719dbb780f929368eb" +ARG KLAWTY_NODE_BOOKWORM_SLIM_DIGEST="sha256:e8e2e91b1378f83c5b2dd15f0247f34110e2fe895f6ca7719dbb780f929368eb" # Base images are pinned to SHA256 digests for reproducible builds. # Trade-off: digests must be updated manually when upstream tags move. # To update, run: docker buildx imagetools inspect node:24-bookworm (or podman) # and replace the digest below with the current multi-arch manifest list entry. -FROM ${OPENCLAW_NODE_BOOKWORM_IMAGE} AS ext-deps -ARG OPENCLAW_EXTENSIONS +FROM ${KLAWTY_NODE_BOOKWORM_IMAGE} AS ext-deps +ARG KLAWTY_EXTENSIONS COPY extensions /tmp/extensions # Copy package.json for opted-in extensions so pnpm resolves their deps. RUN mkdir -p /out && \ - for ext in $OPENCLAW_EXTENSIONS; do \ + for ext in $KLAWTY_EXTENSIONS; do \ if [ -f "/tmp/extensions/$ext/package.json" ]; then \ mkdir -p "/out/$ext" && \ cp "/tmp/extensions/$ext/package.json" "/out/$ext/package.json"; \ @@ -37,7 +37,7 @@ RUN mkdir -p /out && \ done # ── Stage 2: Build ────────────────────────────────────────────── -FROM ${OPENCLAW_NODE_BOOKWORM_IMAGE} AS build +FROM ${KLAWTY_NODE_BOOKWORM_IMAGE} AS build # Install Bun (required for build scripts). Retry the whole bootstrap flow to # tolerate transient 5xx failures from bun.sh/GitHub during CI image builds. @@ -65,7 +65,7 @@ COPY --from=ext-deps /out/ ./extensions/ # Reduce OOM risk on low-memory hosts during dependency installation. # Docker builds on small VMs may otherwise fail with "Killed" (exit 137). -RUN --mount=type=cache,id=openclaw-pnpm-store,target=/root/.local/share/pnpm/store,sharing=locked \ +RUN --mount=type=cache,id=klawty-pnpm-store,target=/root/.local/share/pnpm/store,sharing=locked \ NODE_OPTIONS=--max-old-space-size=2048 pnpm install --frozen-lockfile COPY . . @@ -87,10 +87,10 @@ RUN pnpm canvas:a2ui:bundle || \ mkdir -p src/canvas-host/a2ui && \ echo "/* A2UI bundle unavailable in this build */" > src/canvas-host/a2ui/a2ui.bundle.js && \ echo "stub" > src/canvas-host/a2ui/.bundle.hash && \ - rm -rf vendor/a2ui apps/shared/OpenClawKit/Tools/CanvasA2UI) + rm -rf vendor/a2ui apps/shared/KlawtyKit/Tools/CanvasA2UI) RUN pnpm build:docker # Force pnpm for UI build (Bun may fail on ARM/Synology architectures) -ENV OPENCLAW_PREFER_PNPM=1 +ENV KLAWTY_PREFER_PNPM=1 RUN pnpm ui:build # Prune dev dependencies and strip build-only metadata before copying @@ -100,37 +100,37 @@ RUN CI=true pnpm prune --prod && \ find dist -type f \( -name '*.d.ts' -o -name '*.d.mts' -o -name '*.d.cts' -o -name '*.map' \) -delete # ── Runtime base images ───────────────────────────────────────── -FROM ${OPENCLAW_NODE_BOOKWORM_IMAGE} AS base-default -ARG OPENCLAW_NODE_BOOKWORM_DIGEST +FROM ${KLAWTY_NODE_BOOKWORM_IMAGE} AS base-default +ARG KLAWTY_NODE_BOOKWORM_DIGEST LABEL org.opencontainers.image.base.name="docker.io/library/node:24-bookworm" \ - org.opencontainers.image.base.digest="${OPENCLAW_NODE_BOOKWORM_DIGEST}" + org.opencontainers.image.base.digest="${KLAWTY_NODE_BOOKWORM_DIGEST}" -FROM ${OPENCLAW_NODE_BOOKWORM_SLIM_IMAGE} AS base-slim -ARG OPENCLAW_NODE_BOOKWORM_SLIM_DIGEST +FROM ${KLAWTY_NODE_BOOKWORM_SLIM_IMAGE} AS base-slim +ARG KLAWTY_NODE_BOOKWORM_SLIM_DIGEST LABEL org.opencontainers.image.base.name="docker.io/library/node:24-bookworm-slim" \ - org.opencontainers.image.base.digest="${OPENCLAW_NODE_BOOKWORM_SLIM_DIGEST}" + org.opencontainers.image.base.digest="${KLAWTY_NODE_BOOKWORM_SLIM_DIGEST}" # ── Stage 3: Runtime ──────────────────────────────────────────── -FROM base-${OPENCLAW_VARIANT} -ARG OPENCLAW_VARIANT +FROM base-${KLAWTY_VARIANT} +ARG KLAWTY_VARIANT # OCI base-image metadata for downstream image consumers. # If you change these annotations, also update: # - docs/install/docker.md ("Base image metadata" section) -# - https://docs.openclaw.ai/install/docker -LABEL org.opencontainers.image.source="https://github.com/openclaw/openclaw" \ - org.opencontainers.image.url="https://openclaw.ai" \ - org.opencontainers.image.documentation="https://docs.openclaw.ai/install/docker" \ +# - https://docs.klawty.ai/install/docker +LABEL org.opencontainers.image.source="https://github.com/klawty/klawty" \ + org.opencontainers.image.url="https://klawty.ai" \ + org.opencontainers.image.documentation="https://docs.klawty.ai/install/docker" \ org.opencontainers.image.licenses="MIT" \ - org.opencontainers.image.title="OpenClaw" \ - org.opencontainers.image.description="OpenClaw gateway and CLI runtime container image" + org.opencontainers.image.title="Klawty" \ + org.opencontainers.image.description="Klawty gateway and CLI runtime container image" WORKDIR /app # Install system utilities present in bookworm but missing in bookworm-slim. # On the full bookworm image these are already installed (apt-get is a no-op). -RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=openclaw-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ +RUN --mount=type=cache,id=klawty-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=klawty-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ @@ -141,14 +141,14 @@ RUN chown node:node /app COPY --from=runtime-assets --chown=node:node /app/dist ./dist COPY --from=runtime-assets --chown=node:node /app/node_modules ./node_modules COPY --from=runtime-assets --chown=node:node /app/package.json . -COPY --from=runtime-assets --chown=node:node /app/openclaw.mjs . +COPY --from=runtime-assets --chown=node:node /app/klawty.mjs . COPY --from=runtime-assets --chown=node:node /app/extensions ./extensions COPY --from=runtime-assets --chown=node:node /app/skills ./skills COPY --from=runtime-assets --chown=node:node /app/docs ./docs # In npm-installed Docker images, prefer the copied source extension tree for # bundled discovery so package metadata that points at source entries stays valid. -ENV OPENCLAW_BUNDLED_PLUGINS_DIR=/app/extensions +ENV KLAWTY_BUNDLED_PLUGINS_DIR=/app/extensions # Keep pnpm available in the runtime image for container-local workflows. # Use a shared Corepack home so the non-root `node` user does not need a @@ -168,23 +168,23 @@ RUN install -d -m 0755 "$COREPACK_HOME" && \ chmod -R a+rX "$COREPACK_HOME" # Install additional system packages needed by your skills or extensions. -# Example: docker build --build-arg OPENCLAW_DOCKER_APT_PACKAGES="python3 wget" . -ARG OPENCLAW_DOCKER_APT_PACKAGES="" -RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=openclaw-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ - if [ -n "$OPENCLAW_DOCKER_APT_PACKAGES" ]; then \ +# Example: docker build --build-arg KLAWTY_DOCKER_APT_PACKAGES="python3 wget" . +ARG KLAWTY_DOCKER_APT_PACKAGES="" +RUN --mount=type=cache,id=klawty-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=klawty-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ + if [ -n "$KLAWTY_DOCKER_APT_PACKAGES" ]; then \ apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends $OPENCLAW_DOCKER_APT_PACKAGES; \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends $KLAWTY_DOCKER_APT_PACKAGES; \ fi # Optionally install Chromium and Xvfb for browser automation. -# Build with: docker build --build-arg OPENCLAW_INSTALL_BROWSER=1 ... +# Build with: docker build --build-arg KLAWTY_INSTALL_BROWSER=1 ... # Adds ~300MB but eliminates the 60-90s Playwright install on every container start. # Must run after node_modules COPY so playwright-core is available. -ARG OPENCLAW_INSTALL_BROWSER="" -RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=openclaw-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ - if [ -n "$OPENCLAW_INSTALL_BROWSER" ]; then \ +ARG KLAWTY_INSTALL_BROWSER="" +RUN --mount=type=cache,id=klawty-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=klawty-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ + if [ -n "$KLAWTY_INSTALL_BROWSER" ]; then \ apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends xvfb && \ mkdir -p /home/node/.cache/ms-playwright && \ @@ -194,22 +194,22 @@ RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,shar fi # Optionally install Docker CLI for sandbox container management. -# Build with: docker build --build-arg OPENCLAW_INSTALL_DOCKER_CLI=1 ... +# Build with: docker build --build-arg KLAWTY_INSTALL_DOCKER_CLI=1 ... # Adds ~50MB. Only the CLI is installed — no Docker daemon. # Required for agents.defaults.sandbox to function in Docker deployments. -ARG OPENCLAW_INSTALL_DOCKER_CLI="" -ARG OPENCLAW_DOCKER_GPG_FINGERPRINT="9DC858229FC7DD38854AE2D88D81803C0EBFCD88" -RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=openclaw-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ - if [ -n "$OPENCLAW_INSTALL_DOCKER_CLI" ]; then \ +ARG KLAWTY_INSTALL_DOCKER_CLI="" +ARG KLAWTY_DOCKER_GPG_FINGERPRINT="9DC858229FC7DD38854AE2D88D81803C0EBFCD88" +RUN --mount=type=cache,id=klawty-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=klawty-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ + if [ -n "$KLAWTY_INSTALL_DOCKER_CLI" ]; then \ apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ ca-certificates curl gnupg && \ install -m 0755 -d /etc/apt/keyrings && \ # Verify Docker apt signing key fingerprint before trusting it as a root key. - # Update OPENCLAW_DOCKER_GPG_FINGERPRINT when Docker rotates release keys. + # Update KLAWTY_DOCKER_GPG_FINGERPRINT when Docker rotates release keys. curl -fsSL https://download.docker.com/linux/debian/gpg -o /tmp/docker.gpg.asc && \ - expected_fingerprint="$(printf '%s' "$OPENCLAW_DOCKER_GPG_FINGERPRINT" | tr '[:lower:]' '[:upper:]' | tr -d '[:space:]')" && \ + expected_fingerprint="$(printf '%s' "$KLAWTY_DOCKER_GPG_FINGERPRINT" | tr '[:lower:]' '[:upper:]' | tr -d '[:space:]')" && \ actual_fingerprint="$(gpg --batch --show-keys --with-colons /tmp/docker.gpg.asc | awk -F: '$1 == "fpr" { print toupper($10); exit }')" && \ if [ -z "$actual_fingerprint" ] || [ "$actual_fingerprint" != "$expected_fingerprint" ]; then \ echo "ERROR: Docker apt key fingerprint mismatch (expected $expected_fingerprint, got ${actual_fingerprint:-})" >&2; \ @@ -226,8 +226,8 @@ RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,shar fi # Expose the CLI binary without requiring npm global writes as non-root. -RUN ln -sf /app/openclaw.mjs /usr/local/bin/openclaw \ - && chmod 755 /app/openclaw.mjs +RUN ln -sf /app/klawty.mjs /usr/local/bin/klawty \ + && chmod 755 /app/klawty.mjs ENV NODE_ENV=production @@ -250,4 +250,4 @@ USER node # For external access from host/ingress, override bind to "lan" and set auth. HEALTHCHECK --interval=3m --timeout=10s --start-period=15s --retries=3 \ CMD node -e "fetch('http://127.0.0.1:18789/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" -CMD ["node", "openclaw.mjs", "gateway", "--allow-unconfigured"] +CMD ["node", "klawty.mjs", "gateway", "--allow-unconfigured"] diff --git a/Dockerfile.sandbox b/Dockerfile.sandbox index 37cdab5fcd..bcc79e1211 100644 --- a/Dockerfile.sandbox +++ b/Dockerfile.sandbox @@ -4,8 +4,8 @@ FROM debian:bookworm-slim@sha256:98f4b71de414932439ac6ac690d7060df1f27161073c503 ENV DEBIAN_FRONTEND=noninteractive -RUN --mount=type=cache,id=openclaw-sandbox-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=openclaw-sandbox-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ +RUN --mount=type=cache,id=klawty-sandbox-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=klawty-sandbox-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ apt-get update \ && apt-get upgrade -y --no-install-recommends \ && apt-get install -y --no-install-recommends \ diff --git a/Dockerfile.sandbox-browser b/Dockerfile.sandbox-browser index e8e8bb59f8..00ec2222e8 100644 --- a/Dockerfile.sandbox-browser +++ b/Dockerfile.sandbox-browser @@ -4,8 +4,8 @@ FROM debian:bookworm-slim@sha256:98f4b71de414932439ac6ac690d7060df1f27161073c503 ENV DEBIAN_FRONTEND=noninteractive -RUN --mount=type=cache,id=openclaw-sandbox-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=openclaw-sandbox-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ +RUN --mount=type=cache,id=klawty-sandbox-bookworm-apt-cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=klawty-sandbox-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ apt-get update \ && apt-get upgrade -y --no-install-recommends \ && apt-get install -y --no-install-recommends \ @@ -24,7 +24,7 @@ RUN --mount=type=cache,id=openclaw-sandbox-bookworm-apt-cache,target=/var/cache/ x11vnc \ xvfb -COPY --chmod=755 scripts/sandbox-browser-entrypoint.sh /usr/local/bin/openclaw-sandbox-browser +COPY --chmod=755 scripts/sandbox-browser-entrypoint.sh /usr/local/bin/klawty-sandbox-browser RUN useradd --create-home --shell /bin/bash sandbox USER sandbox @@ -32,4 +32,4 @@ WORKDIR /home/sandbox EXPOSE 9222 5900 6080 -CMD ["openclaw-sandbox-browser"] +CMD ["klawty-sandbox-browser"] diff --git a/Dockerfile.sandbox-common b/Dockerfile.sandbox-common index fba29a5df3..4fce30fe6b 100644 --- a/Dockerfile.sandbox-common +++ b/Dockerfile.sandbox-common @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.7 -ARG BASE_IMAGE=openclaw-sandbox:bookworm-slim +ARG BASE_IMAGE=klawty-sandbox:bookworm-slim FROM ${BASE_IMAGE} USER root @@ -21,8 +21,8 @@ ENV HOMEBREW_CELLAR=${BREW_INSTALL_DIR}/Cellar ENV HOMEBREW_REPOSITORY=${BREW_INSTALL_DIR}/Homebrew ENV PATH=${BUN_INSTALL_DIR}/bin:${BREW_INSTALL_DIR}/bin:${BREW_INSTALL_DIR}/sbin:${PATH} -RUN --mount=type=cache,id=openclaw-sandbox-common-apt-cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=openclaw-sandbox-common-apt-lists,target=/var/lib/apt,sharing=locked \ +RUN --mount=type=cache,id=klawty-sandbox-common-apt-cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=klawty-sandbox-common-apt-lists,target=/var/lib/apt,sharing=locked \ apt-get update \ && apt-get upgrade -y --no-install-recommends \ && apt-get install -y --no-install-recommends ${PACKAGES} diff --git a/KLAWTY-CHANGELOG.md b/KLAWTY-CHANGELOG.md new file mode 100644 index 0000000000..08a2552502 --- /dev/null +++ b/KLAWTY-CHANGELOG.md @@ -0,0 +1,81 @@ +# Klawty Changelog + +All notable changes to the Klawty fork. + +For OpenClaw upstream changes, see [OpenClaw CHANGELOG](./CHANGELOG.md). + +--- + +## [1.0.0] — 2026-03-19 — Initial Release + +### Fork + +- Forked from [OpenClaw](https://github.com/openclaw/openclaw) v2026.3.14 (302K+ stars, MIT license) +- Rebranded: CLI binary `openclaw` → `klawty`, config `openclaw.json` → `klawty.json`, state dir `~/.openclaw` → `~/.klawty` +- Default gateway port changed from 18789 to 2508 +- Version reset to 1.0.0 (Klawty's own semver, independent of OpenClaw's date-based versioning) +- OpenClaw MIT license preserved in all distributions + +### Security Modules (src/security/) — 2,758 lines + +| Module | Lines | Feature | +|--------|-------|---------| +| `policy-enforcer.js` | 493 | Reads `klawty-policy.yaml` at runtime. Enforces deny-by-default rules for network endpoints, filesystem paths, and shell commands before any tool execution | +| `exec-sandbox.js` | 229 | Wraps the `exec` tool in Docker containers: `--network none`, read-only root, 512MB memory limit, 30s timeout. Falls back to native + policy checks without Docker | +| `privacy-router.js` | 211 | Regex-based PII detection (email, phone, credit card, SSN, IBAN) + configurable keyword matching. Routes sensitive tasks to local models, redacts PII, or blocks execution | +| `credential-monitor.js` | 448 | Validates OpenRouter, Discord, Telegram, Slack API keys against their endpoints every 6 hours. Alerts on expiry, revocation, or low balance (OpenRouter: $5 warn, $1 critical) | +| `integrity-check.js` | 188 | Generates SHA-256 manifest of all runtime .js files. Verifies on every boot. Tampered critical files trigger read-only degradation | +| `auto-update.js` | 470 | Checks for new versions via license API. Downloads update bundles, creates pre-update backup, verifies integrity post-update, rollback on failure | +| `tui-dashboard.js` | 624 | Full-screen ANSI terminal dashboard: agent status table, task stats, health indicators, cost progress bar, activity log. Keyboard navigation. 5s auto-refresh | +| `klawty-boot.js` | 95 | Boot hook that initializes all security modules when the gateway starts. Non-blocking — gateway runs even if modules fail | + +### Security Policy + +- `klawty-policy.yaml` — deny-by-default configuration file: + - Network: only allowlisted endpoints reachable (OpenRouter, Qdrant localhost, license server) + - Filesystem: write only to workspace/, data/, backups/, observability/. Runtime/ and skills/ are read-only + - Execution: blocked dangerous patterns (rm -rf, sudo, curl|bash, fork bombs). Allowed: node, npm, git, docker, sqlite3 + - Resources: 10MB max file size, 5GB max disk, 30s exec timeout + - Privacy: PII regex patterns + keywords, configurable action (local_inference, redact, block) + - Rate limits: channel posts, task creation, API calls per window + +### Scripts + +- `scripts/install.sh` (258 lines) — one-command installer: OS detection, Node.js/Docker/pnpm check, Klawty download, runs onboard +- `scripts/onboard.sh` (529 lines) — interactive setup wizard: license key, OpenRouter API validation, industry selection (7 verticals), channel setup, Docker/Qdrant, .env + klawty.json generation + +### Workspace (Demo Agent) + +- 1 agent: Atlas 🦞 (orchestrator) with read-only tools (file_read, web_search, web_fetch, recall_memory, store_memory) +- Minimal `klawty.json`: 1 model, no routing, no dedup, no cost caps — demonstrates architecture without revealing premium features +- `SOUL.md`: 5 operating principles + boundaries +- 1 demo skill: `web-research/SKILL.md` +- `.env.example` with OpenRouter key template + +### What's NOT Included (Premium) + +These features exist in the premium product at [ai-agent-builder.ai](https://ai-agent-builder.ai), not in this free version: + +- Multi-agent coordination (up to 8 agents) +- 5-tier LLM routing with pattern matching +- 4-tier memory with Qdrant vector search +- 27 domain skills + auto-matching +- Reflection engine + skill gap detection +- Proposal lifecycle with rollback +- 4-layer deduplication +- Health monitor + automated backups +- Agent scorecard + cost tracker +- Management dashboard (web portal) +- Industry-specific pre-fitting (6 verticals) +- Managed hosting (all-inclusive from 79€/month) +- License protection + +--- + +## Attribution + +Klawty is built on [OpenClaw](https://github.com/openclaw/openclaw), created by Peter Steinberger and the OpenClaw community. MIT license. 302K+ GitHub stars. + +All OpenClaw features (CLI, channels, plugins, gateway, memory, native apps) are inherited. Klawty's additions are the security modules in `src/security/`, the workspace configuration, and the install/onboard scripts. + +Built by [dcode technologies S.A.](https://d-code.lu) — Luxembourg. diff --git a/README.md b/README.md index e483bcc944..a577f8ffe9 100644 --- a/README.md +++ b/README.md @@ -1,559 +1,216 @@ -# 🦞 OpenClaw — Personal AI Assistant +
-

- - - OpenClaw - -

+# 🦞 Klawty -

- EXFOLIATE! EXFOLIATE! -

+### The AI Agent Operating System -

- CI status - GitHub release - Discord - MIT License -

+**Autonomous AI agents that run 24/7, learn from every task, and coordinate with each other.** -**OpenClaw** is a _personal AI assistant_ you run on your own devices. -It answers you on the channels you already use (WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, BlueBubbles, IRC, Microsoft Teams, Matrix, Feishu, LINE, Mattermost, Nextcloud Talk, Nostr, Synology Chat, Tlon, Twitch, Zalo, Zalo Personal, WebChat). It can speak and listen on macOS/iOS/Android, and can render a live Canvas you control. The Gateway is just the control plane — the product is the assistant. +Security-hardened fork of [OpenClaw](https://github.com/openclaw/openclaw) · Open source · MIT -If you want a personal, single-user assistant that feels local, fast, and always-on, this is it. +[![Version](https://img.shields.io/badge/version-1.0.0-blue?style=for-the-badge)](https://github.com/dcode-tec/Klawty/releases) +[![License](https://img.shields.io/badge/license-MIT-green?style=for-the-badge)](LICENSE) +[![Node](https://img.shields.io/badge/node-22%2B-brightgreen?style=for-the-badge)](https://nodejs.org) +[![Docker](https://img.shields.io/badge/docker-ready-2496ED?style=for-the-badge&logo=docker&logoColor=white)](docker-compose.yml) +[![Channels](https://img.shields.io/badge/channels-20%2B-purple?style=for-the-badge)](https://docs.klawty.ai/channels) -[Website](https://openclaw.ai) · [Docs](https://docs.openclaw.ai) · [Vision](VISION.md) · [DeepWiki](https://deepwiki.com/openclaw/openclaw) · [Getting Started](https://docs.openclaw.ai/start/getting-started) · [Updating](https://docs.openclaw.ai/install/updating) · [Showcase](https://docs.openclaw.ai/start/showcase) · [FAQ](https://docs.openclaw.ai/help/faq) · [Onboarding](https://docs.openclaw.ai/start/wizard) · [Nix](https://github.com/openclaw/nix-openclaw) · [Docker](https://docs.openclaw.ai/install/docker) · [Discord](https://discord.gg/clawd) +[Website](https://klawty.ai) · [Documentation](https://klawty.ai/docs) · [Quick Start](#quick-start) · [Premium](https://ai-agent-builder.ai) · [GitHub](https://github.com/dcode-tec/Klawty) -Preferred setup: run `openclaw onboard` in your terminal. -OpenClaw Onboard guides you step by step through setting up the gateway, workspace, channels, and skills. It is the recommended CLI setup path and works on **macOS, Linux, and Windows (via WSL2; strongly recommended)**. -Works with npm, pnpm, or bun. -New install? Start here: [Getting started](https://docs.openclaw.ai/start/getting-started) +
-## Sponsors +--- -| OpenAI | Vercel | Blacksmith | Convex | -| ----------------------------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------- | -| [![OpenAI](docs/assets/sponsors/openai.svg)](https://openai.com/) | [![Vercel](docs/assets/sponsors/vercel.svg)](https://vercel.com/) | [![Blacksmith](docs/assets/sponsors/blacksmith.svg)](https://blacksmith.sh/) | [![Convex](docs/assets/sponsors/convex.svg)](https://www.convex.dev/) | +## What is Klawty? -**Subscriptions (OAuth):** +Klawty is an **operating system for AI agents**. It's a security-hardened fork of [OpenClaw](https://github.com/openclaw/openclaw) (302K+ stars, MIT) with custom security modules built by [dcode technologies](https://d-code.lu). -- **[OpenAI](https://openai.com/)** (ChatGPT/Codex) +The free version gives you **1 agent** with the full OpenClaw platform (40+ CLI commands, 20+ channels, 52 skills, plugin SDK) plus Klawty's security layer (policy engine, exec sandbox, PII detection, credential monitoring, runtime integrity). -Model note: while many providers/models are supported, for the best experience and lower prompt-injection risk use the strongest latest-generation model available to you. See [Onboarding](https://docs.openclaw.ai/start/onboarding). - -## Models (selection + auth) - -- Models config + CLI: [Models](https://docs.openclaw.ai/concepts/models) -- Auth profile rotation (OAuth vs API keys) + fallbacks: [Model failover](https://docs.openclaw.ai/concepts/model-failover) - -## Install (recommended) - -Runtime: **Node ≥22**. +For multi-agent teams, smart routing, industry skills, and managed hosting, see the [premium version](https://ai-agent-builder.ai). ```bash -npm install -g openclaw@latest -# or: pnpm add -g openclaw@latest - -openclaw onboard --install-daemon +curl -fsSL https://klawty.ai/install.sh | bash ``` -OpenClaw Onboard installs the Gateway daemon (launchd/systemd user service) so it stays running. - -## Quick start (TL;DR) +--- -Runtime: **Node ≥22**. - -Full beginner guide (auth, pairing, channels): [Getting started](https://docs.openclaw.ai/start/getting-started) +## Quick Start ```bash -openclaw onboard --install-daemon - -openclaw gateway --port 18789 --verbose - -# Send a message -openclaw message send --to +1234567890 --message "Hello from OpenClaw" - -# Talk to the assistant (optionally deliver back to any connected channel: WhatsApp/Telegram/Slack/Discord/Google Chat/Signal/iMessage/BlueBubbles/IRC/Microsoft Teams/Matrix/Feishu/LINE/Mattermost/Nextcloud Talk/Nostr/Synology Chat/Tlon/Twitch/Zalo/Zalo Personal/WebChat) -openclaw agent --message "Ship checklist" --thinking high -``` - -Upgrading? [Updating guide](https://docs.openclaw.ai/install/updating) (and run `openclaw doctor`). - -## Development channels - -- **stable**: tagged releases (`vYYYY.M.D` or `vYYYY.M.D-`), npm dist-tag `latest`. -- **beta**: prerelease tags (`vYYYY.M.D-beta.N`), npm dist-tag `beta` (macOS app may be missing). -- **dev**: moving head of `main`, npm dist-tag `dev` (when published). - -Switch channels (git + npm): `openclaw update --channel stable|beta|dev`. -Details: [Development channels](https://docs.openclaw.ai/install/development-channels). - -## From source (development) - -Prefer `pnpm` for builds from source. Bun is optional for running TypeScript directly. - -```bash -git clone https://github.com/openclaw/openclaw.git -cd openclaw - -pnpm install -pnpm ui:build # auto-installs UI deps on first run -pnpm build - -pnpm openclaw onboard --install-daemon - -# Dev loop (auto-reload on source/config changes) -pnpm gateway:watch +# Option 1: One-command install +curl -fsSL https://klawty.ai/install.sh | bash + +# Option 2: From source +git clone https://github.com/dcode-tec/Klawty.git +cd Klawty && pnpm install && pnpm build +klawty onboard # interactive setup +klawty run # start your agent + +# Option 3: Docker +git clone https://github.com/dcode-tec/Klawty.git +cd Klawty && docker compose up -d ``` -Note: `pnpm openclaw ...` runs TypeScript directly (via `tsx`). `pnpm build` produces `dist/` for running via Node / the packaged `openclaw` binary. - -## Security defaults (DM access) - -OpenClaw connects to real messaging surfaces. Treat inbound DMs as **untrusted input**. - -Full security guide: [Security](https://docs.openclaw.ai/gateway/security) - -Default behavior on Telegram/WhatsApp/Signal/iMessage/Microsoft Teams/Discord/Google Chat/Slack: - -- **DM pairing** (`dmPolicy="pairing"` / `channels.discord.dmPolicy="pairing"` / `channels.slack.dmPolicy="pairing"`; legacy: `channels.discord.dm.policy`, `channels.slack.dm.policy`): unknown senders receive a short pairing code and the bot does not process their message. -- Approve with: `openclaw pairing approve ` (then the sender is added to a local allowlist store). -- Public inbound DMs require an explicit opt-in: set `dmPolicy="open"` and include `"*"` in the channel allowlist (`allowFrom` / `channels.discord.allowFrom` / `channels.slack.allowFrom`; legacy: `channels.discord.dm.allowFrom`, `channels.slack.dm.allowFrom`). - -Run `openclaw doctor` to surface risky/misconfigured DM policies. - -## Highlights - -- **[Local-first Gateway](https://docs.openclaw.ai/gateway)** — single control plane for sessions, channels, tools, and events. -- **[Multi-channel inbox](https://docs.openclaw.ai/channels)** — WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, BlueBubbles (iMessage), iMessage (legacy), IRC, Microsoft Teams, Matrix, Feishu, LINE, Mattermost, Nextcloud Talk, Nostr, Synology Chat, Tlon, Twitch, Zalo, Zalo Personal, WebChat, macOS, iOS/Android. -- **[Multi-agent routing](https://docs.openclaw.ai/gateway/configuration)** — route inbound channels/accounts/peers to isolated agents (workspaces + per-agent sessions). -- **[Voice Wake](https://docs.openclaw.ai/nodes/voicewake) + [Talk Mode](https://docs.openclaw.ai/nodes/talk)** — wake words on macOS/iOS and continuous voice on Android (ElevenLabs + system TTS fallback). -- **[Live Canvas](https://docs.openclaw.ai/platforms/mac/canvas)** — agent-driven visual workspace with [A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui). -- **[First-class tools](https://docs.openclaw.ai/tools)** — browser, canvas, nodes, cron, sessions, and Discord/Slack actions. -- **[Companion apps](https://docs.openclaw.ai/platforms/macos)** — macOS menu bar app + iOS/Android [nodes](https://docs.openclaw.ai/nodes). -- **[Onboarding](https://docs.openclaw.ai/start/wizard) + [skills](https://docs.openclaw.ai/tools/skills)** — onboarding-driven setup with bundled/managed/workspace skills. - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=openclaw/openclaw&type=date&legend=top-left)](https://www.star-history.com/#openclaw/openclaw&type=date&legend=top-left) +**Requirements:** Node.js 22+ · [OpenRouter](https://openrouter.ai) API key (recommended) -## Everything we built so far +--- -### Core platform +## Architecture -- [Gateway WS control plane](https://docs.openclaw.ai/gateway) with sessions, presence, config, cron, webhooks, [Control UI](https://docs.openclaw.ai/web), and [Canvas host](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui). -- [CLI surface](https://docs.openclaw.ai/tools/agent-send): gateway, agent, send, [onboarding](https://docs.openclaw.ai/start/wizard), and [doctor](https://docs.openclaw.ai/gateway/doctor). -- [Pi agent runtime](https://docs.openclaw.ai/concepts/agent) in RPC mode with tool streaming and block streaming. -- [Session model](https://docs.openclaw.ai/concepts/session): `main` for direct chats, group isolation, activation modes, queue modes, reply-back. Group rules: [Groups](https://docs.openclaw.ai/channels/groups). -- [Media pipeline](https://docs.openclaw.ai/nodes/images): images/audio/video, transcription hooks, size caps, temp file lifecycle. Audio details: [Audio](https://docs.openclaw.ai/nodes/audio). +| Layer | Source | What it provides | +|-------|--------|-----------------| +| **Platform** | [OpenClaw](https://github.com/openclaw/openclaw) (MIT) | CLI, 20+ channels, plugin SDK, gateway, memory, native apps, 52 skills | +| **Security** | dcode technologies | Policy engine, Docker exec sandbox, PII detection, credential monitoring, integrity checks | +| **Agent Runtime** | Klawty (premium) | 5-tier LLM routing, 4-tier memory, proposals, dedup, self-improvement | -### Channels +--- -- [Channels](https://docs.openclaw.ai/channels): [WhatsApp](https://docs.openclaw.ai/channels/whatsapp) (Baileys), [Telegram](https://docs.openclaw.ai/channels/telegram) (grammY), [Slack](https://docs.openclaw.ai/channels/slack) (Bolt), [Discord](https://docs.openclaw.ai/channels/discord) (discord.js), [Google Chat](https://docs.openclaw.ai/channels/googlechat) (Chat API), [Signal](https://docs.openclaw.ai/channels/signal) (signal-cli), [BlueBubbles](https://docs.openclaw.ai/channels/bluebubbles) (iMessage, recommended), [iMessage](https://docs.openclaw.ai/channels/imessage) (legacy imsg), [IRC](https://docs.openclaw.ai/channels/irc), [Microsoft Teams](https://docs.openclaw.ai/channels/msteams), [Matrix](https://docs.openclaw.ai/channels/matrix), [Feishu](https://docs.openclaw.ai/channels/feishu), [LINE](https://docs.openclaw.ai/channels/line), [Mattermost](https://docs.openclaw.ai/channels/mattermost), [Nextcloud Talk](https://docs.openclaw.ai/channels/nextcloud-talk), [Nostr](https://docs.openclaw.ai/channels/nostr), [Synology Chat](https://docs.openclaw.ai/channels/synology-chat), [Tlon](https://docs.openclaw.ai/channels/tlon), [Twitch](https://docs.openclaw.ai/channels/twitch), [Zalo](https://docs.openclaw.ai/channels/zalo), [Zalo Personal](https://docs.openclaw.ai/channels/zalouser), [WebChat](https://docs.openclaw.ai/web/webchat). -- [Group routing](https://docs.openclaw.ai/channels/group-messages): mention gating, reply tags, per-channel chunking and routing. Channel rules: [Channels](https://docs.openclaw.ai/channels). +## What's Included (Free) -### Apps + nodes +| Feature | Details | +|---------|---------| +| **1 agent (Atlas)** | General-purpose orchestrator with read-only tools | +| **CLI (40+ commands)** | `klawty run`, `status`, `stop`, `tui`, `logs`, `onboard`, `doctor`, ... | +| **20+ channels** | Discord, Slack, Telegram, WhatsApp, Signal, Matrix, IRC, Teams, ... | +| **52 community skills** | Web research, coding, data analysis, comms, devops, ... | +| **Plugin SDK** | Build custom skills and channel integrations | +| **Security policy** | `klawty-policy.yaml` — deny-by-default (network, filesystem, exec) | +| **Docker exec sandbox** | Shell commands in isolated containers (no network, read-only) | +| **PII detection** | Email, phone, credit card, IBAN auto-detect + local routing | +| **Credential monitor** | API key validation every 6 hours, balance alerts | +| **Runtime integrity** | SHA-256 manifest verified on every boot | +| **TUI dashboard** | Full-screen terminal: agents, tasks, costs, health | +| **Docker deployment** | docker-compose.yml included | +| **File-based memory** | MEMORY.md (50 lines) — persistent across restarts | -- [macOS app](https://docs.openclaw.ai/platforms/macos): menu bar control plane, [Voice Wake](https://docs.openclaw.ai/nodes/voicewake)/PTT, [Talk Mode](https://docs.openclaw.ai/nodes/talk) overlay, [WebChat](https://docs.openclaw.ai/web/webchat), debug tools, [remote gateway](https://docs.openclaw.ai/gateway/remote) control. -- [iOS node](https://docs.openclaw.ai/platforms/ios): [Canvas](https://docs.openclaw.ai/platforms/mac/canvas), [Voice Wake](https://docs.openclaw.ai/nodes/voicewake), [Talk Mode](https://docs.openclaw.ai/nodes/talk), camera, screen recording, Bonjour + device pairing. -- [Android node](https://docs.openclaw.ai/platforms/android): Connect tab (setup code/manual), chat sessions, voice tab, [Canvas](https://docs.openclaw.ai/platforms/mac/canvas), camera/screen recording, and Android device commands (notifications/location/SMS/photos/contacts/calendar/motion/app update). -- [macOS node mode](https://docs.openclaw.ai/nodes): system.run/notify + canvas/camera exposure. +--- -### Tools + automation +## What's Premium -- [Browser control](https://docs.openclaw.ai/tools/browser): dedicated openclaw Chrome/Chromium, snapshots, actions, uploads, profiles. -- [Canvas](https://docs.openclaw.ai/platforms/mac/canvas): [A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui) push/reset, eval, snapshot. -- [Nodes](https://docs.openclaw.ai/nodes): camera snap/clip, screen record, [location.get](https://docs.openclaw.ai/nodes/location-command), notifications. -- [Cron + wakeups](https://docs.openclaw.ai/automation/cron-jobs); [webhooks](https://docs.openclaw.ai/automation/webhook); [Gmail Pub/Sub](https://docs.openclaw.ai/automation/gmail-pubsub). -- [Skills platform](https://docs.openclaw.ai/tools/skills): bundled, managed, and workspace skills with install gating + UI. +Available at [ai-agent-builder.ai](https://ai-agent-builder.ai): -### Runtime + safety +- Up to **8 coordinated agents** with inter-agent messaging +- **5-tier LLM routing** — 10x cost savings via smart model selection +- **4-tier memory** — file + session + JSONL + Qdrant vector search +- **27 domain skills** — SEO, copywriting, sales, finance, client ops, ... +- **Self-improvement** — reflection engine + skill gap detection +- **Proposal lifecycle** — approval + 15-minute rollback +- **4-layer deduplication** — task, channel, proposal, discovery +- **Management dashboard** — web portal with KPIs, kanban, costs +- **6 industry solutions** — restaurants, real estate, construction, resellers, accounting, law firms +- **Managed hosting** — all-inclusive from 79€/month (hosting + AI credits + support) -- [Channel routing](https://docs.openclaw.ai/channels/channel-routing), [retry policy](https://docs.openclaw.ai/concepts/retry), and [streaming/chunking](https://docs.openclaw.ai/concepts/streaming). -- [Presence](https://docs.openclaw.ai/concepts/presence), [typing indicators](https://docs.openclaw.ai/concepts/typing-indicators), and [usage tracking](https://docs.openclaw.ai/concepts/usage-tracking). -- [Models](https://docs.openclaw.ai/concepts/models), [model failover](https://docs.openclaw.ai/concepts/model-failover), and [session pruning](https://docs.openclaw.ai/concepts/session-pruning). -- [Security](https://docs.openclaw.ai/gateway/security) and [troubleshooting](https://docs.openclaw.ai/channels/troubleshooting). +--- -### Ops + packaging +## CLI Reference -- [Control UI](https://docs.openclaw.ai/web) + [WebChat](https://docs.openclaw.ai/web/webchat) served directly from the Gateway. -- [Tailscale Serve/Funnel](https://docs.openclaw.ai/gateway/tailscale) or [SSH tunnels](https://docs.openclaw.ai/gateway/remote) with token/password auth. -- [Nix mode](https://docs.openclaw.ai/install/nix) for declarative config; [Docker](https://docs.openclaw.ai/install/docker)-based installs. -- [Doctor](https://docs.openclaw.ai/gateway/doctor) migrations, [logging](https://docs.openclaw.ai/logging). - -## How it works (short) - -``` -WhatsApp / Telegram / Slack / Discord / Google Chat / Signal / iMessage / BlueBubbles / IRC / Microsoft Teams / Matrix / Feishu / LINE / Mattermost / Nextcloud Talk / Nostr / Synology Chat / Tlon / Twitch / Zalo / Zalo Personal / WebChat - │ - ▼ -┌───────────────────────────────┐ -│ Gateway │ -│ (control plane) │ -│ ws://127.0.0.1:18789 │ -└──────────────┬────────────────┘ - │ - ├─ Pi agent (RPC) - ├─ CLI (openclaw …) - ├─ WebChat UI - ├─ macOS app - └─ iOS / Android nodes +```bash +klawty run # start agents +klawty status # health + tasks at a glance +klawty stop # graceful shutdown +klawty tui # full-screen terminal dashboard +klawty logs [agent] # tail agent logs +klawty onboard # interactive setup wizard +klawty doctor # diagnose issues +klawty agent --message # run one agent turn +klawty channels list # connected channels +klawty memory search # search agent knowledge +klawty security audit # scan for vulnerabilities +klawty backup create # snapshot state +klawty update # check for updates +klawty plugins list # loaded plugins (36+) +klawty skills list # available skills (52+) +klawty models list # configured models +klawty --version # Klawty 1.0.0 ``` -## Key subsystems - -- **[Gateway WebSocket network](https://docs.openclaw.ai/concepts/architecture)** — single WS control plane for clients, tools, and events (plus ops: [Gateway runbook](https://docs.openclaw.ai/gateway)). -- **[Tailscale exposure](https://docs.openclaw.ai/gateway/tailscale)** — Serve/Funnel for the Gateway dashboard + WS (remote access: [Remote](https://docs.openclaw.ai/gateway/remote)). -- **[Browser control](https://docs.openclaw.ai/tools/browser)** — openclaw‑managed Chrome/Chromium with CDP control. -- **[Canvas + A2UI](https://docs.openclaw.ai/platforms/mac/canvas)** — agent‑driven visual workspace (A2UI host: [Canvas/A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui)). -- **[Voice Wake](https://docs.openclaw.ai/nodes/voicewake) + [Talk Mode](https://docs.openclaw.ai/nodes/talk)** — wake words on macOS/iOS plus continuous voice on Android. -- **[Nodes](https://docs.openclaw.ai/nodes)** — Canvas, camera snap/clip, screen record, `location.get`, notifications, plus macOS‑only `system.run`/`system.notify`. - -## Tailscale access (Gateway dashboard) - -OpenClaw can auto-configure Tailscale **Serve** (tailnet-only) or **Funnel** (public) while the Gateway stays bound to loopback. Configure `gateway.tailscale.mode`: - -- `off`: no Tailscale automation (default). -- `serve`: tailnet-only HTTPS via `tailscale serve` (uses Tailscale identity headers by default). -- `funnel`: public HTTPS via `tailscale funnel` (requires shared password auth). - -Notes: - -- `gateway.bind` must stay `loopback` when Serve/Funnel is enabled (OpenClaw enforces this). -- Serve can be forced to require a password by setting `gateway.auth.mode: "password"` or `gateway.auth.allowTailscale: false`. -- Funnel refuses to start unless `gateway.auth.mode: "password"` is set. -- Optional: `gateway.tailscale.resetOnExit` to undo Serve/Funnel on shutdown. +--- -Details: [Tailscale guide](https://docs.openclaw.ai/gateway/tailscale) · [Web surfaces](https://docs.openclaw.ai/web) +## Security -## Remote Gateway (Linux is great) +All security modules live in `src/security/` — real code, not templates. -It’s perfectly fine to run the Gateway on a small Linux instance. Clients (macOS app, CLI, WebChat) can connect over **Tailscale Serve/Funnel** or **SSH tunnels**, and you can still pair device nodes (macOS/iOS/Android) to execute device‑local actions when needed. +| Module | Lines | What it does | +|--------|-------|-------------| +| `policy-enforcer.js` | 493 | Reads `klawty-policy.yaml`, enforces network/filesystem/exec rules | +| `exec-sandbox.js` | 229 | Runs shell commands in Docker containers (no network, read-only root) | +| `privacy-router.js` | 211 | Detects PII (email, phone, IBAN) → local model routing or redaction | +| `credential-monitor.js` | 448 | Validates API keys every 6h, alerts on expiry or low balance | +| `integrity-check.js` | 188 | SHA-256 manifest of all modules, verified on every boot | +| `auto-update.js` | 470 | Version check + download + rollback on failure | +| `tui-dashboard.js` | 624 | Full-screen ANSI dashboard: agents, tasks, costs, health | +| `klawty-boot.js` | 95 | Boot hook — initializes all security modules on gateway start | -- **Gateway host** runs the exec tool and channel connections by default. -- **Device nodes** run device‑local actions (`system.run`, camera, screen recording, notifications) via `node.invoke`. - In short: exec runs where the Gateway lives; device actions run where the device lives. +**Total: 2,758 lines of custom security code.** -Details: [Remote access](https://docs.openclaw.ai/gateway/remote) · [Nodes](https://docs.openclaw.ai/nodes) · [Security](https://docs.openclaw.ai/gateway/security) +--- -## macOS permissions via the Gateway protocol +## Workspace -The macOS app can run in **node mode** and advertises its capabilities + permission map over the Gateway WebSocket (`node.list` / `node.describe`). Clients can then execute local actions via `node.invoke`: - -- `system.run` runs a local command and returns stdout/stderr/exit code; set `needsScreenRecording: true` to require screen-recording permission (otherwise you’ll get `PERMISSION_MISSING`). -- `system.notify` posts a user notification and fails if notifications are denied. -- `canvas.*`, `camera.*`, `screen.record`, and `location.get` are also routed via `node.invoke` and follow TCC permission status. - -Elevated bash (host permissions) is separate from macOS TCC: - -- Use `/elevated on|off` to toggle per‑session elevated access when enabled + allowlisted. -- Gateway persists the per‑session toggle via `sessions.patch` (WS method) alongside `thinkingLevel`, `verboseLevel`, `model`, `sendPolicy`, and `groupActivation`. - -Details: [Nodes](https://docs.openclaw.ai/nodes) · [macOS app](https://docs.openclaw.ai/platforms/macos) · [Gateway protocol](https://docs.openclaw.ai/concepts/architecture) - -## Agent to Agent (sessions\_\* tools) - -- Use these to coordinate work across sessions without jumping between chat surfaces. -- `sessions_list` — discover active sessions (agents) and their metadata. -- `sessions_history` — fetch transcript logs for a session. -- `sessions_send` — message another session; optional reply‑back ping‑pong + announce step (`REPLY_SKIP`, `ANNOUNCE_SKIP`). - -Details: [Session tools](https://docs.openclaw.ai/concepts/session-tool) - -## Skills registry (ClawHub) - -ClawHub is a minimal skill registry. With ClawHub enabled, the agent can search for skills automatically and pull in new ones as needed. - -[ClawHub](https://clawhub.com) - -## Chat commands - -Send these in WhatsApp/Telegram/Slack/Google Chat/Microsoft Teams/WebChat (group commands are owner-only): - -- `/status` — compact session status (model + tokens, cost when available) -- `/new` or `/reset` — reset the session -- `/compact` — compact session context (summary) -- `/think ` — off|minimal|low|medium|high|xhigh (GPT-5.2 + Codex models only) -- `/verbose on|off` -- `/usage off|tokens|full` — per-response usage footer -- `/restart` — restart the gateway (owner-only in groups) -- `/activation mention|always` — group activation toggle (groups only) - -## Apps (optional) - -The Gateway alone delivers a great experience. All apps are optional and add extra features. - -If you plan to build/run companion apps, follow the platform runbooks below. - -### macOS (OpenClaw.app) (optional) - -- Menu bar control for the Gateway and health. -- Voice Wake + push-to-talk overlay. -- WebChat + debug tools. -- Remote gateway control over SSH. - -Note: signed builds required for macOS permissions to stick across rebuilds (see [macOS Permissions](https://docs.openclaw.ai/platforms/mac/permissions)). - -### iOS node (optional) - -- Pairs as a node over the Gateway WebSocket (device pairing). -- Voice trigger forwarding + Canvas surface. -- Controlled via `openclaw nodes …`. - -Runbook: [iOS connect](https://docs.openclaw.ai/platforms/ios). - -### Android node (optional) - -- Pairs as a WS node via device pairing (`openclaw devices ...`). -- Exposes Connect/Chat/Voice tabs plus Canvas, Camera, Screen capture, and Android device command families. -- Runbook: [Android connect](https://docs.openclaw.ai/platforms/android). - -## Agent workspace + skills - -- Workspace root: `~/.openclaw/workspace` (configurable via `agents.defaults.workspace`). -- Injected prompt files: `AGENTS.md`, `SOUL.md`, `TOOLS.md`. -- Skills: `~/.openclaw/workspace/skills//SKILL.md`. - -## Configuration - -Minimal `~/.openclaw/openclaw.json` (model + defaults): - -```json5 -{ - agent: { - model: "anthropic/claude-opus-4-6", - }, -} +``` +workspace/ +├── klawty.json # main config (1 model, basic settings) +├── klawty-policy.yaml # security policy (deny-by-default) +├── SOUL.md # agent personality +├── IDENTITY.md # agent identity (Atlas 🦞) +├── AGENTS.md # roster +├── TOOLS.md # 5 read-only tools +├── MEMORY.md # persistent knowledge +├── HEARTBEAT.md # check schedule +├── USER.md # operator profile +├── agents/main/AGENT.md # Atlas config +├── skills/web-research/ # 1 demo skill +└── .env.example # API key template ``` -[Full configuration reference (all keys + examples).](https://docs.openclaw.ai/gateway/configuration) - -## Security model (important) - -- **Default:** tools run on the host for the **main** session, so the agent has full access when it’s just you. -- **Group/channel safety:** set `agents.defaults.sandbox.mode: "non-main"` to run **non‑main sessions** (groups/channels) inside per‑session Docker sandboxes; bash then runs in Docker for those sessions. -- **Sandbox defaults:** allowlist `bash`, `process`, `read`, `write`, `edit`, `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`; denylist `browser`, `canvas`, `nodes`, `cron`, `discord`, `gateway`. - -Details: [Security guide](https://docs.openclaw.ai/gateway/security) · [Docker + sandboxing](https://docs.openclaw.ai/install/docker) · [Sandbox config](https://docs.openclaw.ai/gateway/configuration) +--- -### [WhatsApp](https://docs.openclaw.ai/channels/whatsapp) +## Channels -- Link the device: `pnpm openclaw channels login` (stores creds in `~/.openclaw/credentials`). -- Allowlist who can talk to the assistant via `channels.whatsapp.allowFrom`. -- If `channels.whatsapp.groups` is set, it becomes a group allowlist; include `"*"` to allow all. +| Stable | Beta | +|--------|------| +| Discord · Slack · Telegram · WhatsApp · Signal · Matrix · MS Teams · IRC · Line · Nostr · Terminal · Web | iMessage (macOS) · Google Chat · Mattermost · Twitch | -### [Telegram](https://docs.openclaw.ai/channels/telegram) +--- -- Set `TELEGRAM_BOT_TOKEN` or `channels.telegram.botToken` (env wins). -- Optional: set `channels.telegram.groups` (with `channels.telegram.groups."*".requireMention`); when set, it is a group allowlist (include `"*"` to allow all). Also `channels.telegram.allowFrom` or `channels.telegram.webhookUrl` + `channels.telegram.webhookSecret` as needed. +## System Requirements -```json5 -{ - channels: { - telegram: { - botToken: "123456:ABCDEF", - }, - }, -} -``` +| Resource | Minimum | Recommended | +|----------|---------|-------------| +| Node.js | 22+ | Latest LTS | +| RAM | 2 GB | 8 GB | +| Docker | Optional | Recommended (for exec sandbox) | +| OS | macOS, Linux, WSL2 | macOS or Ubuntu 22.04+ | -### [Slack](https://docs.openclaw.ai/channels/slack) +--- -- Set `SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` (or `channels.slack.botToken` + `channels.slack.appToken`). +## Contributing -### [Discord](https://docs.openclaw.ai/channels/discord) +- **Bug fixes** — open an issue, then a PR +- **New skills** — add `SKILL.md` to `skills/` +- **Security reports** — email security@klawty.ai -- Set `DISCORD_BOT_TOKEN` or `channels.discord.token`. -- Optional: set `commands.native`, `commands.text`, or `commands.useAccessGroups`, plus `channels.discord.allowFrom`, `channels.discord.guilds`, or `channels.discord.mediaMaxMb` as needed. - -```json5 -{ - channels: { - discord: { - token: "1234abcd", - }, - }, -} +```bash +git clone https://github.com/dcode-tec/Klawty.git +cd Klawty && pnpm install && pnpm build && pnpm test ``` -### [Signal](https://docs.openclaw.ai/channels/signal) +--- -- Requires `signal-cli` and a `channels.signal` config section. +## Built On -### [BlueBubbles (iMessage)](https://docs.openclaw.ai/channels/bluebubbles) +- **[OpenClaw](https://github.com/openclaw/openclaw)** — 302K+ stars, MIT license. The fastest-growing open-source AI agent framework. +- **[Qdrant](https://github.com/qdrant/qdrant)** — Open-source vector database (premium feature). +- **[OpenRouter](https://openrouter.ai)** — Unified API for 200+ LLM models. -- **Recommended** iMessage integration. -- Configure `channels.bluebubbles.serverUrl` + `channels.bluebubbles.password` and a webhook (`channels.bluebubbles.webhookPath`). -- The BlueBubbles server runs on macOS; the Gateway can run on macOS or elsewhere. +--- -### [iMessage (legacy)](https://docs.openclaw.ai/channels/imessage) +
-- Legacy macOS-only integration via `imsg` (Messages must be signed in). -- If `channels.imessage.groups` is set, it becomes a group allowlist; include `"*"` to allow all. +**Built by [dcode technologies](https://d-code.lu) · Luxembourg 🇱🇺** -### [Microsoft Teams](https://docs.openclaw.ai/channels/msteams) +*Security-hardened fork of OpenClaw. MIT license preserved.* -- Configure a Teams app + Bot Framework, then add a `msteams` config section. -- Allowlist who can talk via `msteams.allowFrom`; group access via `msteams.groupAllowFrom` or `msteams.groupPolicy: "open"`. - -### [WebChat](https://docs.openclaw.ai/web/webchat) - -- Uses the Gateway WebSocket; no separate WebChat port/config. - -Browser control (optional): - -```json5 -{ - browser: { - enabled: true, - color: "#FF4500", - }, -} -``` +[klawty.ai](https://klawty.ai) · [ai-agent-builder.ai](https://ai-agent-builder.ai) · [d-code.lu](https://d-code.lu) -## Docs - -Use these when you’re past the onboarding flow and want the deeper reference. - -- [Start with the docs index for navigation and “what’s where.”](https://docs.openclaw.ai) -- [Read the architecture overview for the gateway + protocol model.](https://docs.openclaw.ai/concepts/architecture) -- [Use the full configuration reference when you need every key and example.](https://docs.openclaw.ai/gateway/configuration) -- [Run the Gateway by the book with the operational runbook.](https://docs.openclaw.ai/gateway) -- [Learn how the Control UI/Web surfaces work and how to expose them safely.](https://docs.openclaw.ai/web) -- [Understand remote access over SSH tunnels or tailnets.](https://docs.openclaw.ai/gateway/remote) -- [Follow OpenClaw Onboard for a guided setup.](https://docs.openclaw.ai/start/wizard) -- [Wire external triggers via the webhook surface.](https://docs.openclaw.ai/automation/webhook) -- [Set up Gmail Pub/Sub triggers.](https://docs.openclaw.ai/automation/gmail-pubsub) -- [Learn the macOS menu bar companion details.](https://docs.openclaw.ai/platforms/mac/menu-bar) -- [Platform guides: Windows (WSL2)](https://docs.openclaw.ai/platforms/windows), [Linux](https://docs.openclaw.ai/platforms/linux), [macOS](https://docs.openclaw.ai/platforms/macos), [iOS](https://docs.openclaw.ai/platforms/ios), [Android](https://docs.openclaw.ai/platforms/android) -- [Debug common failures with the troubleshooting guide.](https://docs.openclaw.ai/channels/troubleshooting) -- [Review security guidance before exposing anything.](https://docs.openclaw.ai/gateway/security) - -## Advanced docs (discovery + control) - -- [Discovery + transports](https://docs.openclaw.ai/gateway/discovery) -- [Bonjour/mDNS](https://docs.openclaw.ai/gateway/bonjour) -- [Gateway pairing](https://docs.openclaw.ai/gateway/pairing) -- [Remote gateway README](https://docs.openclaw.ai/gateway/remote-gateway-readme) -- [Control UI](https://docs.openclaw.ai/web/control-ui) -- [Dashboard](https://docs.openclaw.ai/web/dashboard) - -## Operations & troubleshooting - -- [Health checks](https://docs.openclaw.ai/gateway/health) -- [Gateway lock](https://docs.openclaw.ai/gateway/gateway-lock) -- [Background process](https://docs.openclaw.ai/gateway/background-process) -- [Browser troubleshooting (Linux)](https://docs.openclaw.ai/tools/browser-linux-troubleshooting) -- [Logging](https://docs.openclaw.ai/logging) - -## Deep dives - -- [Agent loop](https://docs.openclaw.ai/concepts/agent-loop) -- [Presence](https://docs.openclaw.ai/concepts/presence) -- [TypeBox schemas](https://docs.openclaw.ai/concepts/typebox) -- [RPC adapters](https://docs.openclaw.ai/reference/rpc) -- [Queue](https://docs.openclaw.ai/concepts/queue) - -## Workspace & skills - -- [Skills config](https://docs.openclaw.ai/tools/skills-config) -- [Default AGENTS](https://docs.openclaw.ai/reference/AGENTS.default) -- [Templates: AGENTS](https://docs.openclaw.ai/reference/templates/AGENTS) -- [Templates: BOOTSTRAP](https://docs.openclaw.ai/reference/templates/BOOTSTRAP) -- [Templates: IDENTITY](https://docs.openclaw.ai/reference/templates/IDENTITY) -- [Templates: SOUL](https://docs.openclaw.ai/reference/templates/SOUL) -- [Templates: TOOLS](https://docs.openclaw.ai/reference/templates/TOOLS) -- [Templates: USER](https://docs.openclaw.ai/reference/templates/USER) - -## Platform internals - -- [macOS dev setup](https://docs.openclaw.ai/platforms/mac/dev-setup) -- [macOS menu bar](https://docs.openclaw.ai/platforms/mac/menu-bar) -- [macOS voice wake](https://docs.openclaw.ai/platforms/mac/voicewake) -- [iOS node](https://docs.openclaw.ai/platforms/ios) -- [Android node](https://docs.openclaw.ai/platforms/android) -- [Windows (WSL2)](https://docs.openclaw.ai/platforms/windows) -- [Linux app](https://docs.openclaw.ai/platforms/linux) - -## Email hooks (Gmail) - -- [docs.openclaw.ai/gmail-pubsub](https://docs.openclaw.ai/automation/gmail-pubsub) - -## Molty - -OpenClaw was built for **Molty**, a space lobster AI assistant. 🦞 -by Peter Steinberger and the community. - -- [openclaw.ai](https://openclaw.ai) -- [soul.md](https://soul.md) -- [steipete.me](https://steipete.me) -- [@openclaw](https://x.com/openclaw) - -## Community - -See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines, maintainers, and how to submit PRs. -AI/vibe-coded PRs welcome! 🤖 - -Special thanks to [Mario Zechner](https://mariozechner.at/) for his support and for -[pi-mono](https://github.com/badlogic/pi-mono). -Special thanks to Adam Doppelt for lobster.bot. - -Thanks to all clawtributors: - -

- steipete vincentkoc vignesh07 obviyus Mariano Belinky sebslight gumadeiras Takhoffman thewilloftheshadow cpojer - tyler6204 joshp123 Glucksberg mcaxtr quotentiroler osolmaz Sid-Qin joshavant shakkernerd bmendonca3 - mukhtharcm zerone0x mcinteerj ngutman lailoo arosstale rodrigouroz robbyczgw-cla Elonito Clawborn - yinghaosang BunsDev christianklotz echoVic coygeek roshanasingh4 mneves75 joaohlisboa bohdanpodvirnyi nachx639 - onutc Verite Igiraneza widingmarcus-cyber akramcodez aether-ai-agent bjesuiter MaudeBot YuriNachos chilu18 byungsker - dbhurley JayMishra-source iHildy mudrii dlauer Solvely-Colin czekaj advaitpaliwal lc0rp grp06 - HenryLoenwind azade-c Lukavyi vrknetha brandonwise conroywhitney Tobias Bischoff davidrudduck xinhuagu jaydenfyi - petter-b heyhudson MatthieuBizien huntharo omair445 adam91holt adhitShet smartprogrammer93 radek-paclt frankekn - bradleypriest rahthakor shadril238 VACInc juanpablodlc jonisjongithub magimetal stakeswky abhisekbasu1 MisterGuy420 - hsrvc nabbilkhan aldoeliacim jamesgroat orlyjamie Elarwei001 rubyrunsstuff Phineas1500 meaningfool sfo2001 - Marvae liuy shtse8 thebenignhacker carrotRakko ranausmanai kevinWangSheng gregmousseau rrenamed akoscz - jarvis-medmatic danielz1z pandego xadenryan NicholasSpisak graysurf gupsammy nyanjou sibbl gejifeng - ide-rea leszekszpunar Yida-Dev AI-Reviewer-QS SocialNerd42069 maxsumrall hougangdev Minidoracat AnonO6 sreekaransrinath - YuzuruS riccardogiorato Bridgerz Mrseenz buddyh Eng. Juan Combetto peschee cash-echo-bot jalehman zknicker - Harald Buerbaumer taw0002 scald openperf BUGKillerKing Oceanswave Hiren Patel kiranjd antons dan-dr - jadilson12 sumleo Whoaa512 luijoc niceysam JustYannicc emanuelst TsekaLuk JustasM loiie45e - davidguttman natefikru dougvk koala73 mkbehr zats Simone Macario openclaw-bot ENCHIGO mteam88 - Blakeshannon gabriel-trigo neist pejmanjohn durenzidu Ryan Haines hcl XuHao benithors bitfoundry-ai - HeMuling markmusson ameno- battman21 BinHPdev dguido evalexpr guirguispierre henrino3 joeykrug - loganprit odysseus0 dbachelder Divanoli Mydeen Pitchai liuxiaopai-ai Sam Padilla pvtclawn seheepeak TSavo nachoiacovino - misterdas LeftX badlogic Shuai-DaiDai mousberg Masataka Shinohara BillChirico Lewis solstead julianengel - dantelex sahilsatralkar kkarimi mahmoudashraf93 pkrmf ryan-crabbe miloudbelarebia Mars El-Fitz McRolly NWANGWU - carlulsoe Dithilli emonty fal3 mitschabaude-bot benostein LI SHANXIN magendary mahanandhi CashWilliams - j2h4u bsormagec Jessy LANGE Lalit Singh hyf0-agent andranik-sahakyan unisone jeann2013 jogelin rmorse - scz2011 wes-davis popomore cathrynlavery iamadig Vasanth Rao Naik Sabavat Jay Caldwell Shailesh Kirill Shchetynin ruypang - mitchmcalister Paul van Oorschot Xu Gu Menglin Li artuskg jackheuberger imfing superman32432432 Syhids Marvin - Taylor Asplund dakshaymehta Stefan Galescu lploc94 WalterSumbon krizpoon EnzeD Evizero Grynn hydro13 - jverdi kentaro kunalk16 longmaba mjrussell optimikelabs oswalpalash RamiNoodle733 sauerdaniel SleuthCo - TaKO8Ki travisp rodbland2021 fagemx BigUncle Igor Markelov zhoulc777 connorshea TIHU Tony Dehnke - pablohrcarvalho bonald rhuanssauro Tanwa Arpornthip webvijayi Tom Ron ozbillwang Patrick Barletta Ian Derrington austinm911 - Ayush10 boris721 damoahdominic doodlewind ikari-pl philipp-spiess shayan919293 Harrington-bot nonggia.liang Michael Lee - OscarMinjarez claude Alg0rix Lucky Harry Cui Kepler h0tp-ftw Youyou972 Dominic danielwanwx 0xJonHoldsCrypto - akyourowngames clawdinator[bot] erikpr1994 thesash thesomewhatyou dashed Dale Babiy Diaspar4u brianleach codexGW - dirbalak Iranb Max TideFinder Chase Dorsey Joly0 adityashaw2 tumf slonce70 alexgleason - theonejvo Skyler Miao Jeremiah Lowin peetzweg/ chrisrodz ghsmc ibrahimq21 irtiq7 Jonathan D. Rhyne (DJ-D) kelvinCB - mitsuhiko rybnikov santiagomed suminhthanh svkozak kaizen403 sleontenko Nate CornBrother0x DukeDeSouth - crimeacs Cklee Garnet Liu neverland ryan sircrumpet AdeboyeDN Neo asklee-klawd benediktjohannes - 张哲芳 constansino Yuting Lin OfflynAI Rajat Joshi Daniel Zou Manik Vahsith ProspectOre Lilo 24601 - awkoy dawondyifraw google-labs-jules[bot] hyojin Kansodata natedenh pi0 dddabtc AkashKobal wu-tian807 - Ganghyun Kim Stephen Brian King tosh-hamburg John Rood JINNYEONG KIM Dinakar Sarbada aj47 Protocol Zero Limitless Mykyta Bozhenko - Nicholas Shivam Kumar Raut andreesg Fred White Anandesh-Sharma ysqander ezhikkk andreabadesso BinaryMuse cordx56 - DevSecTim edincampara fcatuhe gildo itsjaydesu ivanrvpereira loeclos MarvinCui p6l-richard thejhinvirtuoso - yudshj Wangnov Jonathan Works Yassine Amjad Django Navarro Frank Harris Kenny Lee Drake Thomsen wangai-studio AytuncYildizli - Charlie Niño Jeremy Mumford Yeom-JinHo Rob Axelsen junwon Pratham Dubey amitbiswal007 Slats Oren Parker Todd Brooks - MattQ Milofax Steve (OpenClaw) Matthew Cassius0924 0xbrak 8BlT Abdul535 abhaymundhara aduk059 - afurm aisling404 akari-musubi albertlieyingadrian Alex-Alaniz ali-aljufairi altaywtf araa47 Asleep123 avacadobanana352 - barronlroth bennewton999 bguidolim bigwest60 caelum0x championswimmer dutifulbob eternauta1337 foeken gittb - HeimdallStrategy junsuwhy knocte MackDing nobrainer-tech Noctivoro Raikan10 Swader Alexis Gallagher alexstyl Ethan Palm - yingchunbai joshrad-dev Dan Ballance Eric Su Kimitaka Watanabe Justin Ling lutr0 Raymond Berger atalovesyou jayhickey - jonasjancarik latitudeki5223 minghinmatthewlam rafaelreis-r ratulsarna timkrase efe-buken manmal easternbloc manuelhettich - sktbrd larlyssa Mind-Dragon pcty-nextgen-service-account tmchow uli-will-code Marc Gratch JackyWay aaronveklabs CJWTRUST - erik-agens odnxe T5-AndyML Josh Phillips mujiannan Marco Di Dionisio Randy Torres afern247 0oAstro alexanderatallah - testingabc321 humanwritten aaronn Alphonse-arianee gtsifrikas hrdwdmrbl hugobarauna jiulingyun kitze loukotal - MSch odrobnik reeltimeapps rhjoh ronak-guliani snopoke -

+
diff --git a/SECURITY.md b/SECURITY.md index bef814525a..c948ecd4d9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,21 +1,21 @@ # Security Policy -If you believe you've found a security issue in OpenClaw, please report it privately. +If you believe you've found a security issue in Klawty, please report it privately. ## Reporting Report vulnerabilities directly to the repository where the issue lives: -- **Core CLI and gateway** — [openclaw/openclaw](https://github.com/openclaw/openclaw) -- **macOS desktop app** — [openclaw/openclaw](https://github.com/openclaw/openclaw) (apps/macos) -- **iOS app** — [openclaw/openclaw](https://github.com/openclaw/openclaw) (apps/ios) -- **Android app** — [openclaw/openclaw](https://github.com/openclaw/openclaw) (apps/android) -- **ClawHub** — [openclaw/clawhub](https://github.com/openclaw/clawhub) -- **Trust and threat model** — [openclaw/trust](https://github.com/openclaw/trust) +- **Core CLI and gateway** — [klawty/klawty](https://github.com/klawty/klawty) +- **macOS desktop app** — [klawty/klawty](https://github.com/klawty/klawty) (apps/macos) +- **iOS app** — [klawty/klawty](https://github.com/klawty/klawty) (apps/ios) +- **Android app** — [klawty/klawty](https://github.com/klawty/klawty) (apps/android) +- **ClawHub** — [klawty/clawhub](https://github.com/klawty/clawhub) +- **Trust and threat model** — [klawty/trust](https://github.com/klawty/trust) -For issues that don't fit a specific repo, or if you're unsure, email **[security@openclaw.ai](mailto:security@openclaw.ai)** and we'll route it. +For issues that don't fit a specific repo, or if you're unsure, email **[security@klawty.ai](mailto:security@klawty.ai)** and we'll route it. -For full reporting instructions see our [Trust page](https://trust.openclaw.ai). +For full reporting instructions see our [Trust page](https://trust.klawty.ai). ### Required in Reports @@ -35,11 +35,11 @@ Reports without reproduction steps, demonstrated impact, and remediation advice For fastest triage, include all of the following: - Exact vulnerable path (`file`, function, and line range) on a current revision. -- Tested version details (OpenClaw version and/or commit SHA). +- Tested version details (Klawty version and/or commit SHA). - Reproducible PoC against latest `main` or latest released version. - If the claim targets a released version, evidence from the shipped tag and published artifact/package for that exact version (not only `main`). -- Demonstrated impact tied to OpenClaw's documented trust boundaries. -- For exposed-secret reports: proof the credential is OpenClaw-owned (or grants access to OpenClaw-operated infrastructure/services). +- Demonstrated impact tied to Klawty's documented trust boundaries. +- For exposed-secret reports: proof the credential is Klawty-owned (or grants access to Klawty-operated infrastructure/services). - Explicit statement that the report does not rely on adversarial operators sharing one gateway host/config. - Scope check explaining why the report is **not** covered by the Out of Scope section below. - For command-risk/parity reports (for example obfuscation detection differences), a concrete boundary-bypass path is required (auth/approval/allowlist/sandbox). Parity-only findings are treated as hardening, not vulnerabilities. @@ -77,11 +77,11 @@ These are frequently reported but are typically closed with no code change: ## Security & Trust -**Jamieson O'Reilly** ([@theonejvo](https://twitter.com/theonejvo)) is Security & Trust at OpenClaw. Jamieson is the founder of [Dvuln](https://dvuln.com) and brings extensive experience in offensive security, penetration testing, and security program development. +**Jamieson O'Reilly** ([@theonejvo](https://twitter.com/theonejvo)) is Security & Trust at Klawty. Jamieson is the founder of [Dvuln](https://dvuln.com) and brings extensive experience in offensive security, penetration testing, and security program development. ## Bug Bounties -OpenClaw is a labor of love. There is no bug bounty program and no budget for paid reports. Please still disclose responsibly so we can fix issues quickly. +Klawty is a labor of love. There is no bug bounty program and no budget for paid reports. Please still disclose responsibly so we can fix issues quickly. The best way to help the project right now is by sending PRs. ## Maintainers: GHSA Updates via CLI @@ -90,24 +90,24 @@ When patching a GHSA via `gh api`, include `X-GitHub-Api-Version: 2022-11-28` (o ## Operator Trust Model (Important) -OpenClaw does **not** model one gateway as a multi-tenant, adversarial user boundary. +Klawty does **not** model one gateway as a multi-tenant, adversarial user boundary. - Authenticated Gateway callers are treated as trusted operators for that gateway instance. - The HTTP compatibility endpoints (`POST /v1/chat/completions`, `POST /v1/responses`) are in that same trusted-operator bucket. Passing Gateway bearer auth there is equivalent to operator access for that gateway; they do not implement a narrower `operator.write` vs `operator.admin` trust split. - Session identifiers (`sessionKey`, session IDs, labels) are routing controls, not per-user authorization boundaries. - If one operator can view data from another operator on the same gateway, that is expected in this trust model. -- OpenClaw can technically run multiple gateway instances on one machine, but recommended operations are clean separation by trust boundary. +- Klawty can technically run multiple gateway instances on one machine, but recommended operations are clean separation by trust boundary. - Recommended mode: one user per machine/host (or VPS), one gateway for that user, and one or more agents inside that gateway. -- If multiple users need OpenClaw, use one VPS (or host/OS user boundary) per user. +- If multiple users need Klawty, use one VPS (or host/OS user boundary) per user. - For advanced setups, multiple gateways on one machine are possible, but only with strict isolation and are not the recommended default. - Exec behavior is host-first by default: `agents.defaults.sandbox.mode` defaults to `off`. - `tools.exec.host` defaults to `sandbox` as a routing preference, but if sandbox runtime is not active for the session, exec runs on the gateway host. - Implicit exec calls (no explicit host in the tool call) follow the same behavior. -- This is expected in OpenClaw's one-user trusted-operator model. If you need isolation, enable sandbox mode (`non-main`/`all`) and keep strict tool policy. +- This is expected in Klawty's one-user trusted-operator model. If you need isolation, enable sandbox mode (`non-main`/`all`) and keep strict tool policy. ## Trusted Plugin Concept (Core) -Plugins/extensions are part of OpenClaw's trusted computing base for a gateway. +Plugins/extensions are part of Klawty's trusted computing base for a gateway. - Installing or enabling a plugin grants it the same trust level as local code running on that gateway host. - Plugin behavior such as reading env/files or running host commands is expected inside this trust boundary. @@ -116,10 +116,10 @@ Plugins/extensions are part of OpenClaw's trusted computing base for a gateway. ## Out of Scope - Public Internet Exposure -- Using OpenClaw in ways that the docs recommend not to +- Using Klawty in ways that the docs recommend not to - Deployments where mutually untrusted/adversarial operators share one gateway host and config (for example, reports expecting per-operator isolation for `sessions.list`, `sessions.preview`, `chat.history`, or similar control-plane reads) - Prompt-injection-only attacks (without a policy/auth/sandbox boundary bypass) -- Reports that require write access to trusted local state (`~/.openclaw`, workspace files like `MEMORY.md` / `memory/*.md`) +- Reports that require write access to trusted local state (`~/.klawty`, workspace files like `MEMORY.md` / `memory/*.md`) - Reports where exploitability depends on attacker-controlled pre-existing symlink/hardlink filesystem state in trusted local paths (for example extraction/install target trees) unless a separate untrusted boundary bypass is shown that creates that state. - Reports whose only claim is sandbox/workspace read expansion through trusted local skill/workspace symlink state (for example `skills/*/SKILL.md` symlink chains) unless a separate untrusted boundary bypass is shown that creates/controls that state. - Reports whose only claim is post-approval executable identity drift on a trusted host via same-path file replacement/rewrite unless a separate untrusted boundary bypass is shown for that host write primitive. @@ -130,23 +130,23 @@ Plugins/extensions are part of OpenClaw's trusted computing base for a gateway. - Reports that depend on trusted operator-supplied configuration values to trigger availability impact (for example custom regex patterns). These may still be fixed as defense-in-depth hardening, but are not security-boundary bypasses. - Reports whose only claim is heuristic/parity drift in command-risk detection (for example obfuscation-pattern checks) across exec surfaces, without a demonstrated trust-boundary bypass. These are hardening-only findings and are not vulnerabilities; triage may close them as `invalid`/`no-action` or track them separately as low/informational hardening. - Reports whose only claim is that exec approvals do not semantically model every interpreter/runtime loader form, subcommand, flag combination, package script, or transitive module/config import. Exec approvals bind exact request context and best-effort direct local file operands; they are not a complete semantic model of everything a runtime may load. -- Exposed secrets that are third-party/user-controlled credentials (not OpenClaw-owned and not granting access to OpenClaw-operated infrastructure/services) without demonstrated OpenClaw impact +- Exposed secrets that are third-party/user-controlled credentials (not Klawty-owned and not granting access to Klawty-operated infrastructure/services) without demonstrated Klawty impact - Reports whose only claim is host-side exec when sandbox runtime is disabled/unavailable (documented default behavior in the trusted-operator model), without a boundary bypass. - Reports whose only claim is that a platform-provided upload destination URL is untrusted (for example Microsoft Teams `fileConsent/invoke` `uploadInfo.uploadUrl`) without proving attacker control in an authenticated production flow. ## Deployment Assumptions -OpenClaw security guidance assumes: +Klawty security guidance assumes: -- The host where OpenClaw runs is within a trusted OS/admin boundary. -- Anyone who can modify `~/.openclaw` state/config (including `openclaw.json`) is effectively a trusted operator. +- The host where Klawty runs is within a trusted OS/admin boundary. +- Anyone who can modify `~/.klawty` state/config (including `klawty.json`) is effectively a trusted operator. - A single Gateway shared by mutually untrusted people is **not a recommended setup**. Use separate gateways (or at minimum separate OS users/hosts) per trust boundary. - Authenticated Gateway callers are treated as trusted operators. Session identifiers (for example `sessionKey`) are routing controls, not per-user authorization boundaries. - Multiple gateway instances can run on one machine, but the recommended model is clean per-user isolation (prefer one host/VPS per user). ## One-User Trust Model (Personal Assistant) -OpenClaw's security model is "personal assistant" (one trusted operator, potentially many agents), not "shared multi-tenant bus." +Klawty's security model is "personal assistant" (one trusted operator, potentially many agents), not "shared multi-tenant bus." - If multiple people can message the same tool-enabled agent (for example a shared Slack workspace), they can all steer that agent within its granted permissions. - Non-owner sender status only affects owner-only tools/commands. If a non-owner can still access a non-owner-only tool on that same agent (for example `canvas`), that is within the granted tool boundary unless the report demonstrates an auth, policy, allowlist, approval, or sandbox bypass. @@ -166,12 +166,12 @@ OpenClaw's security model is "personal assistant" (one trusted operator, potenti ## Gateway and Node trust concept -OpenClaw separates routing from execution, but both remain inside the same operator trust boundary: +Klawty separates routing from execution, but both remain inside the same operator trust boundary: - **Gateway** is the control plane. If a caller passes Gateway auth, they are treated as a trusted operator for that Gateway. - **Node** is an execution extension of the Gateway. Pairing a node grants operator-level remote capability on that node. - **Exec approvals** (allowlist/ask UI) are operator guardrails to reduce accidental command execution, not a multi-tenant authorization boundary. -- Exec approvals bind exact command/cwd/env context and, when OpenClaw can identify one concrete local script/file operand, that file snapshot too. This is best-effort integrity hardening, not a complete semantic model of every interpreter/runtime loader path. +- Exec approvals bind exact command/cwd/env context and, when Klawty can identify one concrete local script/file operand, that file snapshot too. This is best-effort integrity hardening, not a complete semantic model of every interpreter/runtime loader path. - Differences in command-risk warning heuristics between exec surfaces (`gateway`, `node`, `sandbox`) do not, by themselves, constitute a security-boundary bypass. - For untrusted-user isolation, split by trust boundary: separate gateways and separate OS users/hosts per boundary. @@ -188,32 +188,32 @@ OpenClaw separates routing from execution, but both remain inside the same opera Plugins/extensions are loaded **in-process** with the Gateway and are treated as trusted code. -- Plugins can execute with the same OS privileges as the OpenClaw process. +- Plugins can execute with the same OS privileges as the Klawty process. - Runtime helpers (for example `runtime.system.runCommandWithTimeout`) are convenience APIs, not a sandbox boundary. - Only install plugins you trust, and prefer `plugins.allow` to pin explicit trusted plugin ids. ## Temp Folder Boundary (Media/Sandbox) -OpenClaw uses a dedicated temp root for local media handoff and sandbox-adjacent temp artifacts: +Klawty uses a dedicated temp root for local media handoff and sandbox-adjacent temp artifacts: -- Preferred temp root: `/tmp/openclaw` (when available and safe on the host). -- Fallback temp root: `os.tmpdir()/openclaw` (or `openclaw-` on multi-user hosts). +- Preferred temp root: `/tmp/klawty` (when available and safe on the host). +- Fallback temp root: `os.tmpdir()/klawty` (or `klawty-` on multi-user hosts). Security boundary notes: -- Sandbox media validation allows absolute temp paths only under the OpenClaw-managed temp root. +- Sandbox media validation allows absolute temp paths only under the Klawty-managed temp root. - Arbitrary host tmp paths are not treated as trusted media roots. -- Plugin/extension code should use OpenClaw temp helpers (`resolvePreferredOpenClawTmpDir`, `buildRandomTempFilePath`, `withTempDownloadPath`) rather than raw `os.tmpdir()` defaults when handling media files. +- Plugin/extension code should use Klawty temp helpers (`resolvePreferredKlawtyTmpDir`, `buildRandomTempFilePath`, `withTempDownloadPath`) rather than raw `os.tmpdir()` defaults when handling media files. - Enforcement reference points: - - temp root resolver: `src/infra/tmp-openclaw-dir.ts` + - temp root resolver: `src/infra/tmp-klawty-dir.ts` - SDK temp helpers: `src/plugin-sdk/temp-path.ts` - messaging/channel tmp guardrail: `scripts/check-no-random-messaging-tmp.mjs` ## Operational Guidance -For threat model + hardening guidance (including `openclaw security audit --deep` and `--fix`), see: +For threat model + hardening guidance (including `klawty security audit --deep` and `--fix`), see: -- `https://docs.openclaw.ai/gateway/security` +- `https://docs.klawty.ai/gateway/security` ### Tool filesystem hardening @@ -231,28 +231,28 @@ For threat model + hardening guidance (including `openclaw security audit --deep ### Web Interface Safety -OpenClaw's web interface (Gateway Control UI + HTTP endpoints) is intended for **local use only**. +Klawty's web interface (Gateway Control UI + HTTP endpoints) is intended for **local use only**. - Recommended: keep the Gateway **loopback-only** (`127.0.0.1` / `::1`). - Config: `gateway.bind="loopback"` (default). - - CLI: `openclaw gateway run --bind loopback`. + - CLI: `klawty gateway run --bind loopback`. - `gateway.controlUi.dangerouslyDisableDeviceAuth` is intended for localhost-only break-glass use. - - OpenClaw keeps deployment flexibility by design and does not hard-forbid non-local setups. - - Non-local and other risky configurations are surfaced by `openclaw security audit` as dangerous findings. + - Klawty keeps deployment flexibility by design and does not hard-forbid non-local setups. + - Non-local and other risky configurations are surfaced by `klawty security audit` as dangerous findings. - This operator-selected tradeoff is by design and not, by itself, a security vulnerability. - Canvas host note: network-visible canvas is **intentional** for trusted node scenarios (LAN/tailnet). - Expected setup: non-loopback bind + Gateway auth (token/password/trusted-proxy) + firewall/tailnet controls. - - Expected routes: `/__openclaw__/canvas/`, `/__openclaw__/a2ui/`. + - Expected routes: `/__klawty__/canvas/`, `/__klawty__/a2ui/`. - This deployment model alone is not a security vulnerability. - Do **not** expose it to the public internet (no direct bind to `0.0.0.0`, no public reverse proxy). It is not hardened for public exposure. - If you need remote access, prefer an SSH tunnel or Tailscale serve/funnel (so the Gateway still binds to loopback), plus strong Gateway auth. -- The Gateway HTTP surface includes the canvas host (`/__openclaw__/canvas/`, `/__openclaw__/a2ui/`). Treat canvas content as sensitive/untrusted and avoid exposing it beyond loopback unless you understand the risk. +- The Gateway HTTP surface includes the canvas host (`/__klawty__/canvas/`, `/__klawty__/a2ui/`). Treat canvas content as sensitive/untrusted and avoid exposing it beyond loopback unless you understand the risk. ## Runtime Requirements ### Node.js Version -OpenClaw requires **Node.js 22.12.0 or later** (LTS). This version includes important security patches: +Klawty requires **Node.js 22.12.0 or later** (LTS). This version includes important security patches: - CVE-2025-59466: async_hooks DoS vulnerability - CVE-2026-21636: Permission model bypass vulnerability @@ -265,7 +265,7 @@ node --version # Should be v22.12.0 or later ### Docker Security -When running OpenClaw in Docker: +When running Klawty in Docker: 1. The official image runs as a non-root user (`node`) for reduced attack surface 2. Use `--read-only` flag when possible for additional filesystem protection @@ -275,8 +275,8 @@ Example secure Docker run: ```bash docker run --read-only --cap-drop=ALL \ - -v openclaw-data:/app/data \ - openclaw/openclaw:latest + -v klawty-data:/app/data \ + klawty/klawty:latest ``` ## Security Scanning diff --git a/VISION.md b/VISION.md index 4ff70189ab..6cf9390db0 100644 --- a/VISION.md +++ b/VISION.md @@ -1,6 +1,6 @@ -## OpenClaw Vision +## Klawty Vision -OpenClaw is the AI that actually does things. +Klawty is the AI that actually does things. It runs on your devices, in your channels, with your rules. This document explains the current state and direction of the project. @@ -8,9 +8,9 @@ We are still early, so iteration is fast. Project overview and developer docs: [`README.md`](README.md) Contribution guide: [`CONTRIBUTING.md`](CONTRIBUTING.md) -OpenClaw started as a personal playground to learn AI and build something genuinely useful: +Klawty started as a personal playground to learn AI and build something genuinely useful: an assistant that can run real tasks on a real computer. -It evolved through several names and shells: Warelay -> Clawdbot -> Moltbot -> OpenClaw. +It evolved through several names and shells: Warelay -> Clawdbot -> Moltbot -> Klawty. The goal: a personal assistant that is easy to use, supports a wide range of platforms, and respects privacy and security. @@ -40,7 +40,7 @@ Contribution rules: ## Security -Security in OpenClaw is a deliberate tradeoff: strong defaults without killing capability. +Security in Klawty is a deliberate tradeoff: strong defaults without killing capability. The goal is to stay powerful for real work while making risky paths explicit and operator-controlled. Canonical security policy and reporting: @@ -51,14 +51,14 @@ We prioritize secure defaults, but also expose clear knobs for trusted high-powe ## Plugins & Memory -OpenClaw has an extensive plugin API. +Klawty has an extensive plugin API. Core stays lean; optional capability should usually ship as plugins. Preferred plugin path is npm package distribution plus local extension loading for development. If you build a plugin, host and maintain it in your own repository. The bar for adding optional plugins to core is intentionally high. Plugin docs: [`docs/tools/plugin.md`](docs/tools/plugin.md) -Community plugin listing + PR bar: https://docs.openclaw.ai/plugins/community +Community plugin listing + PR bar: https://docs.klawty.ai/plugins/community Memory is a special plugin slot where only one memory plugin can be active at a time. Today we ship multiple memory options; over time we plan to converge on one recommended default path. @@ -71,7 +71,7 @@ Core skill additions should be rare and require a strong product or security rea ### MCP Support -OpenClaw supports MCP through `mcporter`: https://github.com/steipete/mcporter +Klawty supports MCP through `mcporter`: https://github.com/steipete/mcporter This keeps MCP integration flexible and decoupled from core runtime: @@ -84,7 +84,7 @@ If there is an MCP server or feature `mcporter` does not support yet, please ope ### Setup -OpenClaw is currently terminal-first by design. +Klawty is currently terminal-first by design. This keeps setup explicit: users see docs, auth, permissions, and security posture up front. Long term, we want easier onboarding flows as hardening matures. @@ -92,8 +92,8 @@ We do not want convenience wrappers that hide critical security decisions from u ### Why TypeScript? -OpenClaw is primarily an orchestration system: prompts, tools, protocols, and integrations. -TypeScript was chosen to keep OpenClaw hackable by default. +Klawty is primarily an orchestration system: prompts, tools, protocols, and integrations. +TypeScript was chosen to keep Klawty hackable by default. It is widely known, fast to iterate in, and easy to read, modify, and extend. ## What We Will Not Merge (For Now) diff --git a/apps/android/README.md b/apps/android/README.md index 008941ecda..fec611becd 100644 --- a/apps/android/README.md +++ b/apps/android/README.md @@ -1,4 +1,4 @@ -## OpenClaw Android App +## Klawty Android App Status: **extremely alpha**. The app is actively being rebuilt from the ground up. @@ -115,24 +115,24 @@ If `adb devices -l` shows `unauthorized`, re-plug and accept the trust prompt ag ### USB-only gateway testing (no LAN dependency) -Use `adb reverse` so Android `localhost:18789` tunnels to your laptop `localhost:18789`. +Use `adb reverse` so Android `localhost:2508` tunnels to your laptop `localhost:2508`. Terminal A (gateway): ```bash -pnpm openclaw gateway --port 18789 --verbose +pnpm klawty gateway --port 2508 --verbose ``` Terminal B (USB tunnel): ```bash -adb reverse tcp:18789 tcp:18789 +adb reverse tcp:2508 tcp:2508 ``` Then in app **Connect → Manual**: - Host: `127.0.0.1` -- Port: `18789` +- Port: `2508` - TLS: off ## Hot Reload / Fast Iteration @@ -142,14 +142,14 @@ This app is native Kotlin + Jetpack Compose. - For Compose UI edits: use Android Studio **Live Edit** on a debug build (works on physical devices; project `minSdk=31` already meets API requirement). - For many non-structural code/resource changes: use Android Studio **Apply Changes**. - For structural/native/manifest/Gradle changes: do full reinstall (`pnpm android:run`). -- Canvas web content already supports live reload when loaded from Gateway `__openclaw__/canvas/` (see `docs/platforms/android.md`). +- Canvas web content already supports live reload when loaded from Gateway `__klawty__/canvas/` (see `docs/platforms/android.md`). ## Connect / Pair 1) Start the gateway (on your main machine): ```bash -pnpm openclaw gateway --port 18789 --verbose +pnpm klawty gateway --port 2508 --verbose ``` 2) In the Android app: @@ -160,8 +160,8 @@ pnpm openclaw gateway --port 18789 --verbose 3) Approve pairing (on the gateway machine): ```bash -openclaw devices list -openclaw devices approve +klawty devices list +klawty devices approve ``` More details: `docs/platforms/android.md`. @@ -190,7 +190,7 @@ Why these matter: - Review usually involves a `Permissions Declaration Form`, policy justification, and demo video evidence in Play Console. - If we want a Play-safe build, these should be the first permissions removed behind a dedicated product flavor / variant. -Current OpenClaw Android implication: +Current Klawty Android implication: - APK / sideload build can keep SMS and Call Log features. - Google Play build should exclude SMS send/search and Call Log search unless the product is intentionally positioned and approved as a default-handler exception case. @@ -222,18 +222,18 @@ This suite assumes setup is already done manually. It does **not** install/run/p Pre-req checklist: 1) Gateway is running and reachable from the Android app. -2) Android app is connected to that gateway and `openclaw nodes status` shows it as paired + connected. +2) Android app is connected to that gateway and `klawty nodes status` shows it as paired + connected. 3) App stays unlocked and in foreground for the whole run. 4) Open the app **Screen** tab and keep it active during the run (canvas/A2UI commands require the canvas WebView attached there). 5) Grant runtime permissions for capabilities you expect to pass (camera/mic/location/notification listener/location, etc.). 6) No interactive system dialogs should be pending before test start. -7) Canvas host is enabled and reachable from the device (do not run gateway with `OPENCLAW_SKIP_CANVAS_HOST=1`; startup logs should include `canvas host mounted at .../__openclaw__/`). +7) Canvas host is enabled and reachable from the device (do not run gateway with `KLAWTY_SKIP_CANVAS_HOST=1`; startup logs should include `canvas host mounted at .../__klawty__/`). 8) Local operator test client pairing is approved. If first run fails with `pairing required`, approve latest pending device pairing request, then rerun: 9) For A2UI checks, keep the app on **Screen** tab; the node now auto-refreshes canvas capability once on first A2UI reachability failure (TTL-safe retry). ```bash -openclaw devices list -openclaw devices approve --latest +klawty devices list +klawty devices approve --latest ``` Run: @@ -244,10 +244,10 @@ pnpm android:test:integration Optional overrides: -- `OPENCLAW_ANDROID_GATEWAY_URL=ws://...` (default: from your local OpenClaw config) -- `OPENCLAW_ANDROID_GATEWAY_TOKEN=...` -- `OPENCLAW_ANDROID_GATEWAY_PASSWORD=...` -- `OPENCLAW_ANDROID_NODE_ID=...` or `OPENCLAW_ANDROID_NODE_NAME=...` +- `KLAWTY_ANDROID_GATEWAY_URL=ws://...` (default: from your local Klawty config) +- `KLAWTY_ANDROID_GATEWAY_TOKEN=...` +- `KLAWTY_ANDROID_GATEWAY_PASSWORD=...` +- `KLAWTY_ANDROID_NODE_ID=...` or `KLAWTY_ANDROID_NODE_NAME=...` What it does: @@ -259,7 +259,7 @@ What it does: Common failure quick-fixes: - `pairing required` before tests start: - - approve pending device pairing (`openclaw devices approve --latest`) and rerun. + - approve pending device pairing (`klawty devices approve --latest`) and rerun. - `A2UI host not reachable` / `A2UI_HOST_NOT_CONFIGURED`: - ensure gateway canvas host is running and reachable, keep the app on the **Screen** tab. The app will auto-refresh canvas capability once; if it still fails, reconnect app and rerun. - `NODE_BACKGROUND_UNAVAILABLE: canvas unavailable`: diff --git a/apps/android/app/build.gradle.kts b/apps/android/app/build.gradle.kts index 46afccbc3b..ce72ed587a 100644 --- a/apps/android/app/build.gradle.kts +++ b/apps/android/app/build.gradle.kts @@ -2,10 +2,10 @@ import com.android.build.api.variant.impl.VariantOutputImpl val dnsjavaInetAddressResolverService = "META-INF/services/java.net.spi.InetAddressResolverProvider" -val androidStoreFile = providers.gradleProperty("OPENCLAW_ANDROID_STORE_FILE").orNull?.takeIf { it.isNotBlank() } -val androidStorePassword = providers.gradleProperty("OPENCLAW_ANDROID_STORE_PASSWORD").orNull?.takeIf { it.isNotBlank() } -val androidKeyAlias = providers.gradleProperty("OPENCLAW_ANDROID_KEY_ALIAS").orNull?.takeIf { it.isNotBlank() } -val androidKeyPassword = providers.gradleProperty("OPENCLAW_ANDROID_KEY_PASSWORD").orNull?.takeIf { it.isNotBlank() } +val androidStoreFile = providers.gradleProperty("KLAWTY_ANDROID_STORE_FILE").orNull?.takeIf { it.isNotBlank() } +val androidStorePassword = providers.gradleProperty("KLAWTY_ANDROID_STORE_PASSWORD").orNull?.takeIf { it.isNotBlank() } +val androidKeyAlias = providers.gradleProperty("KLAWTY_ANDROID_KEY_ALIAS").orNull?.takeIf { it.isNotBlank() } +val androidKeyPassword = providers.gradleProperty("KLAWTY_ANDROID_KEY_PASSWORD").orNull?.takeIf { it.isNotBlank() } val resolvedAndroidStoreFile = androidStoreFile?.let { storeFilePath -> if (storeFilePath.startsWith("~/")) { @@ -26,9 +26,9 @@ val wantsAndroidReleaseBuild = if (wantsAndroidReleaseBuild && !hasAndroidReleaseSigning) { error( - "Missing Android release signing properties. Set OPENCLAW_ANDROID_STORE_FILE, " + - "OPENCLAW_ANDROID_STORE_PASSWORD, OPENCLAW_ANDROID_KEY_ALIAS, and " + - "OPENCLAW_ANDROID_KEY_PASSWORD in ~/.gradle/gradle.properties.", + "Missing Android release signing properties. Set KLAWTY_ANDROID_STORE_FILE, " + + "KLAWTY_ANDROID_STORE_PASSWORD, KLAWTY_ANDROID_KEY_ALIAS, and " + + "KLAWTY_ANDROID_KEY_PASSWORD in ~/.gradle/gradle.properties.", ) } @@ -40,7 +40,7 @@ plugins { } android { - namespace = "ai.openclaw.app" + namespace = "ai.klawty.app" compileSdk = 36 // Release signing is local-only; keep the keystore path and passwords out of the repo. @@ -57,12 +57,12 @@ android { sourceSets { getByName("main") { - assets.directories.add("../../shared/OpenClawKit/Sources/OpenClawKit/Resources") + assets.directories.add("../../shared/KlawtyKit/Sources/KlawtyKit/Resources") } } defaultConfig { - applicationId = "ai.openclaw.app" + applicationId = "ai.klawty.app" minSdk = 31 targetSdk = 36 versionCode = 2026031400 @@ -141,7 +141,7 @@ androidComponents { val versionName = output.versionName.orNull ?: "0" val buildType = variant.buildType - val outputFileName = "openclaw-$versionName-$buildType.apk" + val outputFileName = "klawty-$versionName-$buildType.apk" output.outputFileName = outputFileName } } diff --git a/apps/android/app/src/main/AndroidManifest.xml b/apps/android/app/src/main/AndroidManifest.xml index 283daae601..e8c861ec44 100644 --- a/apps/android/app/src/main/AndroidManifest.xml +++ b/apps/android/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ android:label="@string/app_name" android:supportsRtl="true" android:networkSecurityConfig="@xml/network_security_config" - android:theme="@style/Theme.OpenClawNode"> + android:theme="@style/Theme.KlawtyNode"> Quint(status, server, connected, micEnabled, micListening) }.collect { (status, server, connected, micEnabled, micListening) -> - val title = if (connected) "OpenClaw Node · Connected" else "OpenClaw Node" + val title = if (connected) "Klawty Node · Connected" else "Klawty Node" val micSuffix = if (micEnabled) { if (micListening) " · Mic: Listening" else " · Mic: Pending" @@ -88,7 +88,7 @@ class NodeForegroundService : Service() { "Connection", NotificationManager.IMPORTANCE_LOW, ).apply { - description = "OpenClaw node connection status" + description = "Klawty node connection status" setShowBadge(false) } mgr.createNotificationChannel(channel) @@ -145,7 +145,7 @@ class NodeForegroundService : Service() { private const val CHANNEL_ID = "connection" private const val NOTIFICATION_ID = 1 - private const val ACTION_STOP = "ai.openclaw.app.action.STOP" + private const val ACTION_STOP = "ai.klawty.app.action.STOP" fun start(context: Context) { val intent = Intent(context, NodeForegroundService::class.java) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt b/apps/android/app/src/main/java/ai/klawty/app/NodeRuntime.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt rename to apps/android/app/src/main/java/ai/klawty/app/NodeRuntime.kt index 6dd1b83d3b..e0da4ec873 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/NodeRuntime.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app +package ai.klawty.app import android.Manifest import android.content.Context @@ -6,22 +6,22 @@ import android.content.pm.PackageManager import android.os.SystemClock import android.util.Log import androidx.core.content.ContextCompat -import ai.openclaw.app.chat.ChatController -import ai.openclaw.app.chat.ChatMessage -import ai.openclaw.app.chat.ChatPendingToolCall -import ai.openclaw.app.chat.ChatSessionEntry -import ai.openclaw.app.chat.OutgoingAttachment -import ai.openclaw.app.gateway.DeviceAuthStore -import ai.openclaw.app.gateway.DeviceIdentityStore -import ai.openclaw.app.gateway.GatewayDiscovery -import ai.openclaw.app.gateway.GatewayEndpoint -import ai.openclaw.app.gateway.GatewaySession -import ai.openclaw.app.gateway.probeGatewayTlsFingerprint -import ai.openclaw.app.node.* -import ai.openclaw.app.protocol.OpenClawCanvasA2UIAction -import ai.openclaw.app.voice.MicCaptureManager -import ai.openclaw.app.voice.TalkModeManager -import ai.openclaw.app.voice.VoiceConversationEntry +import ai.klawty.app.chat.ChatController +import ai.klawty.app.chat.ChatMessage +import ai.klawty.app.chat.ChatPendingToolCall +import ai.klawty.app.chat.ChatSessionEntry +import ai.klawty.app.chat.OutgoingAttachment +import ai.klawty.app.gateway.DeviceAuthStore +import ai.klawty.app.gateway.DeviceIdentityStore +import ai.klawty.app.gateway.GatewayDiscovery +import ai.klawty.app.gateway.GatewayEndpoint +import ai.klawty.app.gateway.GatewaySession +import ai.klawty.app.gateway.probeGatewayTlsFingerprint +import ai.klawty.app.node.* +import ai.klawty.app.protocol.KlawtyCanvasA2UIAction +import ai.klawty.app.voice.MicCaptureManager +import ai.klawty.app.voice.TalkModeManager +import ai.klawty.app.voice.VoiceConversationEntry import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -497,7 +497,7 @@ class NodeRuntime( _canvasRehydratePending.value = false _canvasRehydrateErrorText.value = "Failed to request restore. Tap to retry." } - Log.w("OpenClawCanvas", "canvas rehydrate request failed ($source): transport unavailable") + Log.w("KlawtyCanvas", "canvas rehydrate request failed ($source): transport unavailable") return@launch } scope.launch { @@ -844,7 +844,7 @@ class NodeRuntime( val actionId = (userActionObj["id"] as? JsonPrimitive)?.content?.trim().orEmpty().ifEmpty { java.util.UUID.randomUUID().toString() } - val name = OpenClawCanvasA2UIAction.extractActionName(userActionObj) ?: return@launch + val name = KlawtyCanvasA2UIAction.extractActionName(userActionObj) ?: return@launch val surfaceId = (userActionObj["surfaceId"] as? JsonPrimitive)?.content?.trim().orEmpty().ifEmpty { "main" } @@ -854,7 +854,7 @@ class NodeRuntime( val sessionKey = resolveMainSessionKey() val message = - OpenClawCanvasA2UIAction.formatAgentMessage( + KlawtyCanvasA2UIAction.formatAgentMessage( actionName = name, sessionKey = sessionKey, surfaceId = surfaceId, @@ -888,7 +888,7 @@ class NodeRuntime( try { canvas.eval( - OpenClawCanvasA2UIAction.jsDispatchA2UIActionStatus( + KlawtyCanvasA2UIAction.jsDispatchA2UIActionStatus( actionId = actionId, ok = connected && error == null, error = error, @@ -1032,7 +1032,7 @@ class NodeRuntime( HomeCanvasPayload( gatewayState = "connecting", eyebrow = "Reconnecting", - title = "OpenClaw is syncing back up", + title = "Klawty is syncing back up", subtitle = "The gateway session is coming back online. Agent shortcuts should settle automatically in a moment.", gatewayLabel = gatewayLabel, @@ -1046,7 +1046,7 @@ class NodeRuntime( HomeCanvasGatewayState.Error, HomeCanvasGatewayState.Offline -> HomeCanvasPayload( gatewayState = if (state == HomeCanvasGatewayState.Error) "error" else "offline", - eyebrow = "Welcome to OpenClaw", + eyebrow = "Welcome to Klawty", title = "Your phone stays quiet until it is needed", subtitle = "Pair this device to your gateway to wake it only for real work, keep a live agent overview handy, and avoid battery-draining background loops.", diff --git a/apps/android/app/src/main/java/ai/openclaw/app/PermissionRequester.kt b/apps/android/app/src/main/java/ai/klawty/app/PermissionRequester.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/PermissionRequester.kt rename to apps/android/app/src/main/java/ai/klawty/app/PermissionRequester.kt index 3cc8919c52..7d905ef423 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/PermissionRequester.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/PermissionRequester.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app +package ai.klawty.app import android.content.pm.PackageManager import android.content.Intent @@ -115,7 +115,7 @@ class PermissionRequester(private val activity: ComponentActivity) { private fun buildRationaleMessage(permissions: List): String { val labels = permissions.map { permissionLabel(it) } - return "OpenClaw needs ${labels.joinToString(", ")} permissions to continue." + return "Klawty needs ${labels.joinToString(", ")} permissions to continue." } private fun buildSettingsMessage(permissions: List): String { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/SecurePrefs.kt b/apps/android/app/src/main/java/ai/klawty/app/SecurePrefs.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/SecurePrefs.kt rename to apps/android/app/src/main/java/ai/klawty/app/SecurePrefs.kt index a1aabeb1b3..811122cd18 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/SecurePrefs.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/SecurePrefs.kt @@ -1,6 +1,6 @@ @file:Suppress("DEPRECATION") -package ai.openclaw.app +package ai.klawty.app import android.content.Context import android.content.SharedPreferences @@ -20,12 +20,12 @@ class SecurePrefs( private val securePrefsOverride: SharedPreferences? = null, ) { companion object { - val defaultWakeWords: List = listOf("openclaw", "claude") + val defaultWakeWords: List = listOf("klawty", "claude") private const val displayNameKey = "node.displayName" private const val locationModeKey = "location.enabledMode" private const val voiceWakeModeKey = "voiceWake.mode" - private const val plainPrefsName = "openclaw.node" - private const val securePrefsName = "openclaw.node.secure" + private const val plainPrefsName = "klawty.node" + private const val securePrefsName = "klawty.node.secure" } private val appContext = context.applicationContext diff --git a/apps/android/app/src/main/java/ai/openclaw/app/SessionKey.kt b/apps/android/app/src/main/java/ai/klawty/app/SessionKey.kt similarity index 93% rename from apps/android/app/src/main/java/ai/openclaw/app/SessionKey.kt rename to apps/android/app/src/main/java/ai/klawty/app/SessionKey.kt index 3719ec11bb..62179ab7c8 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/SessionKey.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/SessionKey.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app +package ai.klawty.app internal fun normalizeMainKey(raw: String?): String { val trimmed = raw?.trim() diff --git a/apps/android/app/src/main/java/ai/openclaw/app/VoiceWakeMode.kt b/apps/android/app/src/main/java/ai/klawty/app/VoiceWakeMode.kt similarity index 92% rename from apps/android/app/src/main/java/ai/openclaw/app/VoiceWakeMode.kt rename to apps/android/app/src/main/java/ai/klawty/app/VoiceWakeMode.kt index ea236f3306..cd67e297be 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/VoiceWakeMode.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/VoiceWakeMode.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app +package ai.klawty.app enum class VoiceWakeMode(val rawValue: String) { Off("off"), diff --git a/apps/android/app/src/main/java/ai/openclaw/app/WakeWords.kt b/apps/android/app/src/main/java/ai/klawty/app/WakeWords.kt similarity index 96% rename from apps/android/app/src/main/java/ai/openclaw/app/WakeWords.kt rename to apps/android/app/src/main/java/ai/klawty/app/WakeWords.kt index 7bd3ca13cd..9709d6df0c 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/WakeWords.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/WakeWords.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app +package ai.klawty.app object WakeWords { const val maxWords: Int = 32 diff --git a/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt b/apps/android/app/src/main/java/ai/klawty/app/chat/ChatController.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt rename to apps/android/app/src/main/java/ai/klawty/app/chat/ChatController.kt index 37bb3f472e..bb61133342 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatController.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/chat/ChatController.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.chat +package ai.klawty.app.chat -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import java.util.UUID import java.util.concurrent.ConcurrentHashMap import kotlinx.coroutines.CoroutineScope diff --git a/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatModels.kt b/apps/android/app/src/main/java/ai/klawty/app/chat/ChatModels.kt similarity index 96% rename from apps/android/app/src/main/java/ai/openclaw/app/chat/ChatModels.kt rename to apps/android/app/src/main/java/ai/klawty/app/chat/ChatModels.kt index f6d08c535c..9490c6d33b 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/chat/ChatModels.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/chat/ChatModels.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.chat +package ai.klawty.app.chat data class ChatMessage( val id: String, diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/BonjourEscapes.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/BonjourEscapes.kt similarity index 96% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/BonjourEscapes.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/BonjourEscapes.kt index 2fa0befbb5..65867207c1 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/BonjourEscapes.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/BonjourEscapes.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway object BonjourEscapes { fun decode(input: String): String { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceAuthPayload.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceAuthPayload.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceAuthPayload.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceAuthPayload.kt index f556341e10..e592cbf229 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceAuthPayload.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceAuthPayload.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway internal object DeviceAuthPayload { fun buildV3( diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceAuthStore.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceAuthStore.kt similarity index 93% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceAuthStore.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceAuthStore.kt index 202ea4820e..b70c3a7575 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceAuthStore.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceAuthStore.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway -import ai.openclaw.app.SecurePrefs +import ai.klawty.app.SecurePrefs interface DeviceAuthTokenStore { fun loadToken(deviceId: String, role: String): String? diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceIdentityStore.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceIdentityStore.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceIdentityStore.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceIdentityStore.kt index 1e22638203..f2c62febbd 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/DeviceIdentityStore.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/DeviceIdentityStore.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway import android.content.Context import android.util.Base64 @@ -17,7 +17,7 @@ data class DeviceIdentity( class DeviceIdentityStore(context: Context) { private val json = Json { ignoreUnknownKeys = true } - private val identityFile = File(context.filesDir, "openclaw/identity/device.json") + private val identityFile = File(context.filesDir, "klawty/identity/device.json") @Volatile private var cachedIdentity: DeviceIdentity? = null @Synchronized diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayDiscovery.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayDiscovery.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayDiscovery.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayDiscovery.kt index f83af46cc6..d3f4f575de 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayDiscovery.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayDiscovery.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway import android.content.Context import android.net.ConnectivityManager @@ -51,9 +51,9 @@ class GatewayDiscovery( private val nsd = context.getSystemService(NsdManager::class.java) private val connectivity = context.getSystemService(ConnectivityManager::class.java) private val dns = DnsResolver.getInstance() - private val serviceType = "_openclaw-gw._tcp." - private val wideAreaDomain = System.getenv("OPENCLAW_WIDE_AREA_DOMAIN") - private val logTag = "OpenClaw/GatewayDiscovery" + private val serviceType = "_klawty-gw._tcp." + private val wideAreaDomain = System.getenv("KLAWTY_WIDE_AREA_DOMAIN") + private val logTag = "Klawty/GatewayDiscovery" private val localById = ConcurrentHashMap() private val unicastById = ConcurrentHashMap() diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayEndpoint.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayEndpoint.kt similarity index 95% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayEndpoint.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayEndpoint.kt index 0903ddaa93..62d33366c5 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayEndpoint.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayEndpoint.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway data class GatewayEndpoint( val stableId: String, diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayProtocol.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayProtocol.kt similarity index 55% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayProtocol.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayProtocol.kt index 27b4566ac9..31b1f14a61 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayProtocol.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayProtocol.kt @@ -1,3 +1,3 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway const val GATEWAY_PROTOCOL_VERSION = 3 diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewaySession.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewaySession.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewaySession.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/GatewaySession.kt index 55e371a57c..87fe6e40c9 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewaySession.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewaySession.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway import android.util.Log import java.util.Locale @@ -197,7 +197,7 @@ class GatewaySession( conn.request("node.event", params, timeoutMs = 8_000) return true } catch (err: Throwable) { - Log.w("OpenClawGateway", "node.event failed: ${err.message ?: err::class.java.simpleName}") + Log.w("KlawtyGateway", "node.event failed: ${err.message ?: err::class.java.simpleName}") return false } } @@ -226,13 +226,13 @@ class GatewaySession( timeoutMs = timeoutMs, ) } catch (err: Throwable) { - Log.w("OpenClawGateway", "node.canvas.capability.refresh failed: ${err.message ?: err::class.java.simpleName}") + Log.w("KlawtyGateway", "node.canvas.capability.refresh failed: ${err.message ?: err::class.java.simpleName}") return false } if (!response.ok) { val err = response.error Log.w( - "OpenClawGateway", + "KlawtyGateway", "node.canvas.capability.refresh rejected: ${err?.code ?: "UNAVAILABLE"}: ${err?.message ?: "request failed"}", ) return false @@ -240,17 +240,17 @@ class GatewaySession( val payloadObj = response.payloadJson?.let(::parseJsonOrNull)?.asObjectOrNull() val refreshedCapability = payloadObj?.get("canvasCapability").asStringOrNull()?.trim().orEmpty() if (refreshedCapability.isEmpty()) { - Log.w("OpenClawGateway", "node.canvas.capability.refresh missing canvasCapability") + Log.w("KlawtyGateway", "node.canvas.capability.refresh missing canvasCapability") return false } val scopedCanvasHostUrl = canvasHostUrl?.trim().orEmpty() if (scopedCanvasHostUrl.isEmpty()) { - Log.w("OpenClawGateway", "node.canvas.capability.refresh missing local canvasHostUrl") + Log.w("KlawtyGateway", "node.canvas.capability.refresh missing local canvasHostUrl") return false } val refreshedUrl = replaceCanvasCapabilityInScopedHostUrl(scopedCanvasHostUrl, refreshedCapability) if (refreshedUrl == null) { - Log.w("OpenClawGateway", "node.canvas.capability.refresh unable to rewrite scoped canvas URL") + Log.w("KlawtyGateway", "node.canvas.capability.refresh unable to rewrite scoped canvas URL") return false } canvasHostUrl = refreshedUrl @@ -273,7 +273,7 @@ class GatewaySession( private val connectNonceDeferred = CompletableDeferred() private val client: OkHttpClient = buildClient() private var socket: WebSocket? = null - private val loggerTag = "OpenClawGateway" + private val loggerTag = "KlawtyGateway" val remoteAddress: String = if (endpoint.host.contains(":")) { @@ -947,7 +947,7 @@ internal fun replaceCanvasCapabilityInScopedHostUrl( scopedUrl: String, capability: String, ): String? { - val marker = "/__openclaw__/cap/" + val marker = "/__klawty__/cap/" val markerStart = scopedUrl.indexOf(marker) if (markerStart < 0) return null val capabilityStart = markerStart + marker.length diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayTls.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayTls.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayTls.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayTls.kt index 20e71cc364..10667f55a2 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayTls.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/GatewayTls.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway import android.annotation.SuppressLint import kotlinx.coroutines.Dispatchers diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/InvokeErrorParser.kt b/apps/android/app/src/main/java/ai/klawty/app/gateway/InvokeErrorParser.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/gateway/InvokeErrorParser.kt rename to apps/android/app/src/main/java/ai/klawty/app/gateway/InvokeErrorParser.kt index dae516a901..743ef3efd2 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/InvokeErrorParser.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/gateway/InvokeErrorParser.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.gateway +package ai.klawty.app.gateway data class ParsedInvokeError( val code: String, diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/A2UIHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/A2UIHandler.kt similarity index 90% rename from apps/android/app/src/main/java/ai/openclaw/app/node/A2UIHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/A2UIHandler.kt index 1938cf308d..fa48208219 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/A2UIHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/A2UIHandler.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.node +package ai.klawty.app.node -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import kotlinx.coroutines.delay import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray @@ -19,7 +19,7 @@ class A2UIHandler( val raw = if (nodeRaw.isNotBlank()) nodeRaw else operatorRaw if (raw.isBlank()) return null val base = raw.trimEnd('/') - return "${base}/__openclaw__/a2ui/?platform=android" + return "${base}/__klawty__/a2ui/?platform=android" } suspend fun ensureA2uiReady(a2uiUrl: String): Boolean { @@ -107,7 +107,7 @@ class A2UIHandler( """ (() => { try { - const host = globalThis.openclawA2UI; + const host = globalThis.klawtyA2UI; return !!host && typeof host.applyMessages === 'function'; } catch (_) { return false; @@ -119,8 +119,8 @@ class A2UIHandler( """ (() => { try { - const host = globalThis.openclawA2UI; - if (!host) return { ok: false, error: "missing openclawA2UI" }; + const host = globalThis.klawtyA2UI; + if (!host) return { ok: false, error: "missing klawtyA2UI" }; return host.reset(); } catch (e) { return { ok: false, error: String(e?.message ?? e) }; @@ -132,8 +132,8 @@ class A2UIHandler( return """ (() => { try { - const host = globalThis.openclawA2UI; - if (!host) return { ok: false, error: "missing openclawA2UI" }; + const host = globalThis.klawtyA2UI; + if (!host) return { ok: false, error: "missing klawtyA2UI" }; const messages = $messagesJson; return host.applyMessages(messages); } catch (e) { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/CalendarHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/CalendarHandler.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/CalendarHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/CalendarHandler.kt index 63563919e1..d682d5e2f3 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/CalendarHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/CalendarHandler.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.ContentResolver @@ -7,7 +7,7 @@ import android.content.ContentValues import android.content.Context import android.provider.CalendarContract import androidx.core.content.ContextCompat -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import java.time.Instant import java.time.temporal.ChronoUnit import java.util.TimeZone diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/CallLogHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/CallLogHandler.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/CallLogHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/CallLogHandler.kt index af242dfac6..54aed1c43a 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/CallLogHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/CallLogHandler.kt @@ -1,10 +1,10 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.Context import android.provider.CallLog import androidx.core.content.ContextCompat -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/CameraCaptureManager.kt b/apps/android/app/src/main/java/ai/klawty/app/node/CameraCaptureManager.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/node/CameraCaptureManager.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/CameraCaptureManager.kt index a942c0baa7..12ddcbd3ed 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/CameraCaptureManager.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/CameraCaptureManager.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.annotation.SuppressLint @@ -28,7 +28,7 @@ import androidx.camera.video.VideoRecordEvent import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.checkSelfPermission import androidx.core.graphics.scale -import ai.openclaw.app.PermissionRequester +import ai.klawty.app.PermissionRequester import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeout @@ -208,7 +208,7 @@ class CameraCaptureManager(private val context: Context) { android.util.Log.w("CameraCaptureManager", "clip: warming up camera 1.5s...") kotlinx.coroutines.delay(1_500) - val file = File.createTempFile("openclaw-clip-", ".mp4") + val file = File.createTempFile("klawty-clip-", ".mp4") val outputOptions = FileOutputOptions.Builder(file).build() val finalized = kotlinx.coroutines.CompletableDeferred() @@ -388,7 +388,7 @@ private suspend fun Context.cameraProvider(): ProcessCameraProvider = /** Returns (jpegBytes, exifOrientation) so caller can rotate the decoded bitmap. */ private suspend fun ImageCapture.takeJpegWithExif(executor: Executor): Pair = suspendCancellableCoroutine { cont -> - val file = File.createTempFile("openclaw-snap-", ".jpg") + val file = File.createTempFile("klawty-snap-", ".jpg") val options = ImageCapture.OutputFileOptions.Builder(file).build() takePicture( options, diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/CameraHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/CameraHandler.kt similarity index 96% rename from apps/android/app/src/main/java/ai/openclaw/app/node/CameraHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/CameraHandler.kt index 3e7881f262..2c4ab8b5cc 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/CameraHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/CameraHandler.kt @@ -1,9 +1,9 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.content.Context -import ai.openclaw.app.CameraHudKind -import ai.openclaw.app.BuildConfig -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.CameraHudKind +import ai.klawty.app.BuildConfig +import ai.klawty.app.gateway.GatewaySession import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.withContext @@ -61,7 +61,7 @@ class CameraHandler( if (!BuildConfig.DEBUG) return val ts = java.text.SimpleDateFormat("HH:mm:ss.SSS", java.util.Locale.US).format(java.util.Date()) logFile?.appendText("[$ts] $msg\n") - android.util.Log.w("openclaw", "camera.snap: $msg") + android.util.Log.w("klawty", "camera.snap: $msg") } try { logFile?.writeText("") // clear @@ -99,7 +99,7 @@ class CameraHandler( if (!BuildConfig.DEBUG) return val ts = java.text.SimpleDateFormat("HH:mm:ss.SSS", java.util.Locale.US).format(java.util.Date()) clipLogFile?.appendText("[CLIP $ts] $msg\n") - android.util.Log.w("openclaw", "camera.clip: $msg") + android.util.Log.w("klawty", "camera.clip: $msg") } val includeAudio = parseIncludeAudio(paramsJson) ?: true if (includeAudio) externalAudioCaptureActive.value = true diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/CanvasController.kt b/apps/android/app/src/main/java/ai/klawty/app/node/CanvasController.kt similarity index 96% rename from apps/android/app/src/main/java/ai/openclaw/app/node/CanvasController.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/CanvasController.kt index 0eab9d75a5..a1567f0c7d 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/CanvasController.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/CanvasController.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.graphics.Bitmap import android.graphics.Canvas @@ -20,7 +20,7 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive -import ai.openclaw.app.BuildConfig +import ai.klawty.app.BuildConfig import kotlin.coroutines.resume class CanvasController { @@ -112,12 +112,12 @@ class CanvasController { withWebViewOnMain { wv -> if (currentUrl == null) { if (BuildConfig.DEBUG) { - Log.d("OpenClawCanvas", "load scaffold: $scaffoldAssetUrl") + Log.d("KlawtyCanvas", "load scaffold: $scaffoldAssetUrl") } wv.loadUrl(scaffoldAssetUrl) } else { if (BuildConfig.DEBUG) { - Log.d("OpenClawCanvas", "load url: $currentUrl") + Log.d("KlawtyCanvas", "load url: $currentUrl") } wv.loadUrl(currentUrl) } @@ -134,7 +134,7 @@ class CanvasController { val js = """ (() => { try { - const api = globalThis.__openclaw; + const api = globalThis.__klawty; if (!api) return; if (typeof api.setDebugStatusEnabled === 'function') { api.setDebugStatusEnabled(${if (enabled) "true" else "false"}); @@ -156,7 +156,7 @@ class CanvasController { val js = """ (() => { try { - const api = globalThis.__openclaw; + const api = globalThis.__klawty; if (!api || typeof api.renderHome !== 'function') return; api.renderHome($payload); } catch (_) {} diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/ConnectionManager.kt b/apps/android/app/src/main/java/ai/klawty/app/node/ConnectionManager.kt similarity index 88% rename from apps/android/app/src/main/java/ai/openclaw/app/node/ConnectionManager.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/ConnectionManager.kt index ce9c9d77bf..fde1e98458 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/ConnectionManager.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/ConnectionManager.kt @@ -1,14 +1,14 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.os.Build -import ai.openclaw.app.BuildConfig -import ai.openclaw.app.SecurePrefs -import ai.openclaw.app.gateway.GatewayClientInfo -import ai.openclaw.app.gateway.GatewayConnectOptions -import ai.openclaw.app.gateway.GatewayEndpoint -import ai.openclaw.app.gateway.GatewayTlsParams -import ai.openclaw.app.LocationMode -import ai.openclaw.app.VoiceWakeMode +import ai.klawty.app.BuildConfig +import ai.klawty.app.SecurePrefs +import ai.klawty.app.gateway.GatewayClientInfo +import ai.klawty.app.gateway.GatewayConnectOptions +import ai.klawty.app.gateway.GatewayEndpoint +import ai.klawty.app.gateway.GatewayTlsParams +import ai.klawty.app.LocationMode +import ai.klawty.app.VoiceWakeMode class ConnectionManager( private val prefs: SecurePrefs, @@ -111,7 +111,7 @@ class ConnectionManager( val version = resolvedVersionName() val release = Build.VERSION.RELEASE?.trim().orEmpty() val releaseLabel = if (release.isEmpty()) "unknown" else release - return "OpenClawAndroid/$version (Android $releaseLabel; SDK ${Build.VERSION.SDK_INT})" + return "KlawtyAndroid/$version (Android $releaseLabel; SDK ${Build.VERSION.SDK_INT})" } fun buildClientInfo(clientId: String, clientMode: String): GatewayClientInfo { @@ -134,7 +134,7 @@ class ConnectionManager( caps = buildCapabilities(), commands = buildInvokeCommands(), permissions = emptyMap(), - client = buildClientInfo(clientId = "openclaw-android", clientMode = "node"), + client = buildClientInfo(clientId = "klawty-android", clientMode = "node"), userAgent = buildUserAgent(), ) } @@ -146,7 +146,7 @@ class ConnectionManager( caps = emptyList(), commands = emptyList(), permissions = emptyMap(), - client = buildClientInfo(clientId = "openclaw-android", clientMode = "ui"), + client = buildClientInfo(clientId = "klawty-android", clientMode = "ui"), userAgent = buildUserAgent(), ) } diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/ContactsHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/ContactsHandler.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/ContactsHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/ContactsHandler.kt index f203b044a7..64412c19d3 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/ContactsHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/ContactsHandler.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.ContentProviderOperation @@ -7,7 +7,7 @@ import android.content.ContentValues import android.content.Context import android.provider.ContactsContract import androidx.core.content.ContextCompat -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/DebugHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/DebugHandler.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/node/DebugHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/DebugHandler.kt index 283d898b4f..282773dff1 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/DebugHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/DebugHandler.kt @@ -1,9 +1,9 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.content.Context -import ai.openclaw.app.BuildConfig -import ai.openclaw.app.gateway.DeviceIdentityStore -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.BuildConfig +import ai.klawty.app.gateway.DeviceIdentityStore +import ai.klawty.app.gateway.GatewaySession import kotlinx.serialization.json.JsonPrimitive class DebugHandler( diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/DeviceHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/DeviceHandler.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/DeviceHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/DeviceHandler.kt index b888e3edae..a7ce294890 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/DeviceHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/DeviceHandler.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.app.ActivityManager @@ -15,8 +15,8 @@ import android.os.PowerManager import android.os.StatFs import android.os.SystemClock import androidx.core.content.ContextCompat -import ai.openclaw.app.BuildConfig -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.BuildConfig +import ai.klawty.app.gateway.GatewaySession import java.util.Locale import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.buildJsonArray diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/DeviceNotificationListenerService.kt b/apps/android/app/src/main/java/ai/klawty/app/node/DeviceNotificationListenerService.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/DeviceNotificationListenerService.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/DeviceNotificationListenerService.kt index 1e9dc0408f..2eb52058ab 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/DeviceNotificationListenerService.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/DeviceNotificationListenerService.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.app.Notification import android.app.NotificationManager diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/GatewayEventHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/GatewayEventHandler.kt similarity index 94% rename from apps/android/app/src/main/java/ai/openclaw/app/node/GatewayEventHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/GatewayEventHandler.kt index ebfd01b925..60855602c6 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/GatewayEventHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/GatewayEventHandler.kt @@ -1,7 +1,7 @@ -package ai.openclaw.app.node +package ai.klawty.app.node -import ai.openclaw.app.SecurePrefs -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.SecurePrefs +import ai.klawty.app.gateway.GatewaySession import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/InvokeCommandRegistry.kt b/apps/android/app/src/main/java/ai/klawty/app/node/InvokeCommandRegistry.kt similarity index 63% rename from apps/android/app/src/main/java/ai/openclaw/app/node/InvokeCommandRegistry.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/InvokeCommandRegistry.kt index 3e90309819..735f543b64 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/InvokeCommandRegistry.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/InvokeCommandRegistry.kt @@ -1,19 +1,19 @@ -package ai.openclaw.app.node +package ai.klawty.app.node -import ai.openclaw.app.protocol.OpenClawCalendarCommand -import ai.openclaw.app.protocol.OpenClawCanvasA2UICommand -import ai.openclaw.app.protocol.OpenClawCanvasCommand -import ai.openclaw.app.protocol.OpenClawCameraCommand -import ai.openclaw.app.protocol.OpenClawCapability -import ai.openclaw.app.protocol.OpenClawCallLogCommand -import ai.openclaw.app.protocol.OpenClawContactsCommand -import ai.openclaw.app.protocol.OpenClawDeviceCommand -import ai.openclaw.app.protocol.OpenClawLocationCommand -import ai.openclaw.app.protocol.OpenClawMotionCommand -import ai.openclaw.app.protocol.OpenClawNotificationsCommand -import ai.openclaw.app.protocol.OpenClawPhotosCommand -import ai.openclaw.app.protocol.OpenClawSmsCommand -import ai.openclaw.app.protocol.OpenClawSystemCommand +import ai.klawty.app.protocol.KlawtyCalendarCommand +import ai.klawty.app.protocol.KlawtyCanvasA2UICommand +import ai.klawty.app.protocol.KlawtyCanvasCommand +import ai.klawty.app.protocol.KlawtyCameraCommand +import ai.klawty.app.protocol.KlawtyCapability +import ai.klawty.app.protocol.KlawtyCallLogCommand +import ai.klawty.app.protocol.KlawtyContactsCommand +import ai.klawty.app.protocol.KlawtyDeviceCommand +import ai.klawty.app.protocol.KlawtyLocationCommand +import ai.klawty.app.protocol.KlawtyMotionCommand +import ai.klawty.app.protocol.KlawtyNotificationsCommand +import ai.klawty.app.protocol.KlawtyPhotosCommand +import ai.klawty.app.protocol.KlawtySmsCommand +import ai.klawty.app.protocol.KlawtySystemCommand data class NodeRuntimeFlags( val cameraEnabled: Boolean, @@ -60,143 +60,143 @@ data class InvokeCommandSpec( object InvokeCommandRegistry { val capabilityManifest: List = listOf( - NodeCapabilitySpec(name = OpenClawCapability.Canvas.rawValue), - NodeCapabilitySpec(name = OpenClawCapability.Device.rawValue), - NodeCapabilitySpec(name = OpenClawCapability.Notifications.rawValue), - NodeCapabilitySpec(name = OpenClawCapability.System.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.Canvas.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.Device.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.Notifications.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.System.rawValue), NodeCapabilitySpec( - name = OpenClawCapability.Camera.rawValue, + name = KlawtyCapability.Camera.rawValue, availability = NodeCapabilityAvailability.CameraEnabled, ), NodeCapabilitySpec( - name = OpenClawCapability.Sms.rawValue, + name = KlawtyCapability.Sms.rawValue, availability = NodeCapabilityAvailability.SmsAvailable, ), NodeCapabilitySpec( - name = OpenClawCapability.VoiceWake.rawValue, + name = KlawtyCapability.VoiceWake.rawValue, availability = NodeCapabilityAvailability.VoiceWakeEnabled, ), NodeCapabilitySpec( - name = OpenClawCapability.Location.rawValue, + name = KlawtyCapability.Location.rawValue, availability = NodeCapabilityAvailability.LocationEnabled, ), - NodeCapabilitySpec(name = OpenClawCapability.Photos.rawValue), - NodeCapabilitySpec(name = OpenClawCapability.Contacts.rawValue), - NodeCapabilitySpec(name = OpenClawCapability.Calendar.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.Photos.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.Contacts.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.Calendar.rawValue), NodeCapabilitySpec( - name = OpenClawCapability.Motion.rawValue, + name = KlawtyCapability.Motion.rawValue, availability = NodeCapabilityAvailability.MotionAvailable, ), - NodeCapabilitySpec(name = OpenClawCapability.CallLog.rawValue), + NodeCapabilitySpec(name = KlawtyCapability.CallLog.rawValue), ) val all: List = listOf( InvokeCommandSpec( - name = OpenClawCanvasCommand.Present.rawValue, + name = KlawtyCanvasCommand.Present.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawCanvasCommand.Hide.rawValue, + name = KlawtyCanvasCommand.Hide.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawCanvasCommand.Navigate.rawValue, + name = KlawtyCanvasCommand.Navigate.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawCanvasCommand.Eval.rawValue, + name = KlawtyCanvasCommand.Eval.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawCanvasCommand.Snapshot.rawValue, + name = KlawtyCanvasCommand.Snapshot.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawCanvasA2UICommand.Push.rawValue, + name = KlawtyCanvasA2UICommand.Push.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawCanvasA2UICommand.PushJSONL.rawValue, + name = KlawtyCanvasA2UICommand.PushJSONL.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawCanvasA2UICommand.Reset.rawValue, + name = KlawtyCanvasA2UICommand.Reset.rawValue, requiresForeground = true, ), InvokeCommandSpec( - name = OpenClawSystemCommand.Notify.rawValue, + name = KlawtySystemCommand.Notify.rawValue, ), InvokeCommandSpec( - name = OpenClawCameraCommand.List.rawValue, + name = KlawtyCameraCommand.List.rawValue, requiresForeground = true, availability = InvokeCommandAvailability.CameraEnabled, ), InvokeCommandSpec( - name = OpenClawCameraCommand.Snap.rawValue, + name = KlawtyCameraCommand.Snap.rawValue, requiresForeground = true, availability = InvokeCommandAvailability.CameraEnabled, ), InvokeCommandSpec( - name = OpenClawCameraCommand.Clip.rawValue, + name = KlawtyCameraCommand.Clip.rawValue, requiresForeground = true, availability = InvokeCommandAvailability.CameraEnabled, ), InvokeCommandSpec( - name = OpenClawLocationCommand.Get.rawValue, + name = KlawtyLocationCommand.Get.rawValue, availability = InvokeCommandAvailability.LocationEnabled, ), InvokeCommandSpec( - name = OpenClawDeviceCommand.Status.rawValue, + name = KlawtyDeviceCommand.Status.rawValue, ), InvokeCommandSpec( - name = OpenClawDeviceCommand.Info.rawValue, + name = KlawtyDeviceCommand.Info.rawValue, ), InvokeCommandSpec( - name = OpenClawDeviceCommand.Permissions.rawValue, + name = KlawtyDeviceCommand.Permissions.rawValue, ), InvokeCommandSpec( - name = OpenClawDeviceCommand.Health.rawValue, + name = KlawtyDeviceCommand.Health.rawValue, ), InvokeCommandSpec( - name = OpenClawNotificationsCommand.List.rawValue, + name = KlawtyNotificationsCommand.List.rawValue, ), InvokeCommandSpec( - name = OpenClawNotificationsCommand.Actions.rawValue, + name = KlawtyNotificationsCommand.Actions.rawValue, ), InvokeCommandSpec( - name = OpenClawPhotosCommand.Latest.rawValue, + name = KlawtyPhotosCommand.Latest.rawValue, ), InvokeCommandSpec( - name = OpenClawContactsCommand.Search.rawValue, + name = KlawtyContactsCommand.Search.rawValue, ), InvokeCommandSpec( - name = OpenClawContactsCommand.Add.rawValue, + name = KlawtyContactsCommand.Add.rawValue, ), InvokeCommandSpec( - name = OpenClawCalendarCommand.Events.rawValue, + name = KlawtyCalendarCommand.Events.rawValue, ), InvokeCommandSpec( - name = OpenClawCalendarCommand.Add.rawValue, + name = KlawtyCalendarCommand.Add.rawValue, ), InvokeCommandSpec( - name = OpenClawMotionCommand.Activity.rawValue, + name = KlawtyMotionCommand.Activity.rawValue, availability = InvokeCommandAvailability.MotionActivityAvailable, ), InvokeCommandSpec( - name = OpenClawMotionCommand.Pedometer.rawValue, + name = KlawtyMotionCommand.Pedometer.rawValue, availability = InvokeCommandAvailability.MotionPedometerAvailable, ), InvokeCommandSpec( - name = OpenClawSmsCommand.Send.rawValue, + name = KlawtySmsCommand.Send.rawValue, availability = InvokeCommandAvailability.SendSmsAvailable, ), InvokeCommandSpec( - name = OpenClawSmsCommand.Search.rawValue, + name = KlawtySmsCommand.Search.rawValue, availability = InvokeCommandAvailability.ReadSmsAvailable, ), InvokeCommandSpec( - name = OpenClawCallLogCommand.Search.rawValue, + name = KlawtyCallLogCommand.Search.rawValue, ), InvokeCommandSpec( name = "debug.logs", diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/InvokeDispatcher.kt b/apps/android/app/src/main/java/ai/klawty/app/node/InvokeDispatcher.kt similarity index 72% rename from apps/android/app/src/main/java/ai/openclaw/app/node/InvokeDispatcher.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/InvokeDispatcher.kt index 2ed0773bc4..1d7bf150db 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/InvokeDispatcher.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/InvokeDispatcher.kt @@ -1,18 +1,18 @@ -package ai.openclaw.app.node +package ai.klawty.app.node -import ai.openclaw.app.gateway.GatewaySession -import ai.openclaw.app.protocol.OpenClawCalendarCommand -import ai.openclaw.app.protocol.OpenClawCanvasA2UICommand -import ai.openclaw.app.protocol.OpenClawCanvasCommand -import ai.openclaw.app.protocol.OpenClawCameraCommand -import ai.openclaw.app.protocol.OpenClawCallLogCommand -import ai.openclaw.app.protocol.OpenClawContactsCommand -import ai.openclaw.app.protocol.OpenClawDeviceCommand -import ai.openclaw.app.protocol.OpenClawLocationCommand -import ai.openclaw.app.protocol.OpenClawMotionCommand -import ai.openclaw.app.protocol.OpenClawNotificationsCommand -import ai.openclaw.app.protocol.OpenClawSmsCommand -import ai.openclaw.app.protocol.OpenClawSystemCommand +import ai.klawty.app.gateway.GatewaySession +import ai.klawty.app.protocol.KlawtyCalendarCommand +import ai.klawty.app.protocol.KlawtyCanvasA2UICommand +import ai.klawty.app.protocol.KlawtyCanvasCommand +import ai.klawty.app.protocol.KlawtyCameraCommand +import ai.klawty.app.protocol.KlawtyCallLogCommand +import ai.klawty.app.protocol.KlawtyContactsCommand +import ai.klawty.app.protocol.KlawtyDeviceCommand +import ai.klawty.app.protocol.KlawtyLocationCommand +import ai.klawty.app.protocol.KlawtyMotionCommand +import ai.klawty.app.protocol.KlawtyNotificationsCommand +import ai.klawty.app.protocol.KlawtySmsCommand +import ai.klawty.app.protocol.KlawtySystemCommand class InvokeDispatcher( private val canvas: CanvasController, @@ -58,18 +58,18 @@ class InvokeDispatcher( return when (command) { // Canvas commands - OpenClawCanvasCommand.Present.rawValue -> { + KlawtyCanvasCommand.Present.rawValue -> { val url = CanvasController.parseNavigateUrl(paramsJson) canvas.navigate(url) GatewaySession.InvokeResult.ok(null) } - OpenClawCanvasCommand.Hide.rawValue -> GatewaySession.InvokeResult.ok(null) - OpenClawCanvasCommand.Navigate.rawValue -> { + KlawtyCanvasCommand.Hide.rawValue -> GatewaySession.InvokeResult.ok(null) + KlawtyCanvasCommand.Navigate.rawValue -> { val url = CanvasController.parseNavigateUrl(paramsJson) canvas.navigate(url) GatewaySession.InvokeResult.ok(null) } - OpenClawCanvasCommand.Eval.rawValue -> { + KlawtyCanvasCommand.Eval.rawValue -> { val js = CanvasController.parseEvalJs(paramsJson) ?: return GatewaySession.InvokeResult.error( @@ -81,7 +81,7 @@ class InvokeDispatcher( GatewaySession.InvokeResult.ok("""{"result":${result.toJsonString()}}""") } } - OpenClawCanvasCommand.Snapshot.rawValue -> { + KlawtyCanvasCommand.Snapshot.rawValue -> { val snapshotParams = CanvasController.parseSnapshotParams(paramsJson) withCanvasAvailable { val base64 = @@ -95,7 +95,7 @@ class InvokeDispatcher( } // A2UI commands - OpenClawCanvasA2UICommand.Reset.rawValue -> + KlawtyCanvasA2UICommand.Reset.rawValue -> withReadyA2ui { withCanvasAvailable { val res = canvas.eval(A2UIHandler.a2uiResetJS) @@ -103,7 +103,7 @@ class InvokeDispatcher( GatewaySession.InvokeResult.ok(res) } } - OpenClawCanvasA2UICommand.Push.rawValue, OpenClawCanvasA2UICommand.PushJSONL.rawValue -> { + KlawtyCanvasA2UICommand.Push.rawValue, KlawtyCanvasA2UICommand.PushJSONL.rawValue -> { val messages = try { a2uiHandler.decodeA2uiMessages(command, paramsJson) @@ -124,49 +124,49 @@ class InvokeDispatcher( } // Camera commands - OpenClawCameraCommand.List.rawValue -> cameraHandler.handleList(paramsJson) - OpenClawCameraCommand.Snap.rawValue -> cameraHandler.handleSnap(paramsJson) - OpenClawCameraCommand.Clip.rawValue -> cameraHandler.handleClip(paramsJson) + KlawtyCameraCommand.List.rawValue -> cameraHandler.handleList(paramsJson) + KlawtyCameraCommand.Snap.rawValue -> cameraHandler.handleSnap(paramsJson) + KlawtyCameraCommand.Clip.rawValue -> cameraHandler.handleClip(paramsJson) // Location command - OpenClawLocationCommand.Get.rawValue -> locationHandler.handleLocationGet(paramsJson) + KlawtyLocationCommand.Get.rawValue -> locationHandler.handleLocationGet(paramsJson) // Device commands - OpenClawDeviceCommand.Status.rawValue -> deviceHandler.handleDeviceStatus(paramsJson) - OpenClawDeviceCommand.Info.rawValue -> deviceHandler.handleDeviceInfo(paramsJson) - OpenClawDeviceCommand.Permissions.rawValue -> deviceHandler.handleDevicePermissions(paramsJson) - OpenClawDeviceCommand.Health.rawValue -> deviceHandler.handleDeviceHealth(paramsJson) + KlawtyDeviceCommand.Status.rawValue -> deviceHandler.handleDeviceStatus(paramsJson) + KlawtyDeviceCommand.Info.rawValue -> deviceHandler.handleDeviceInfo(paramsJson) + KlawtyDeviceCommand.Permissions.rawValue -> deviceHandler.handleDevicePermissions(paramsJson) + KlawtyDeviceCommand.Health.rawValue -> deviceHandler.handleDeviceHealth(paramsJson) // Notifications command - OpenClawNotificationsCommand.List.rawValue -> notificationsHandler.handleNotificationsList(paramsJson) - OpenClawNotificationsCommand.Actions.rawValue -> notificationsHandler.handleNotificationsActions(paramsJson) + KlawtyNotificationsCommand.List.rawValue -> notificationsHandler.handleNotificationsList(paramsJson) + KlawtyNotificationsCommand.Actions.rawValue -> notificationsHandler.handleNotificationsActions(paramsJson) // System command - OpenClawSystemCommand.Notify.rawValue -> systemHandler.handleSystemNotify(paramsJson) + KlawtySystemCommand.Notify.rawValue -> systemHandler.handleSystemNotify(paramsJson) // Photos command - ai.openclaw.app.protocol.OpenClawPhotosCommand.Latest.rawValue -> photosHandler.handlePhotosLatest( + ai.klawty.app.protocol.KlawtyPhotosCommand.Latest.rawValue -> photosHandler.handlePhotosLatest( paramsJson, ) // Contacts command - OpenClawContactsCommand.Search.rawValue -> contactsHandler.handleContactsSearch(paramsJson) - OpenClawContactsCommand.Add.rawValue -> contactsHandler.handleContactsAdd(paramsJson) + KlawtyContactsCommand.Search.rawValue -> contactsHandler.handleContactsSearch(paramsJson) + KlawtyContactsCommand.Add.rawValue -> contactsHandler.handleContactsAdd(paramsJson) // Calendar command - OpenClawCalendarCommand.Events.rawValue -> calendarHandler.handleCalendarEvents(paramsJson) - OpenClawCalendarCommand.Add.rawValue -> calendarHandler.handleCalendarAdd(paramsJson) + KlawtyCalendarCommand.Events.rawValue -> calendarHandler.handleCalendarEvents(paramsJson) + KlawtyCalendarCommand.Add.rawValue -> calendarHandler.handleCalendarAdd(paramsJson) // Motion command - OpenClawMotionCommand.Activity.rawValue -> motionHandler.handleMotionActivity(paramsJson) - OpenClawMotionCommand.Pedometer.rawValue -> motionHandler.handleMotionPedometer(paramsJson) + KlawtyMotionCommand.Activity.rawValue -> motionHandler.handleMotionActivity(paramsJson) + KlawtyMotionCommand.Pedometer.rawValue -> motionHandler.handleMotionPedometer(paramsJson) // SMS command - OpenClawSmsCommand.Send.rawValue -> smsHandler.handleSmsSend(paramsJson) - OpenClawSmsCommand.Search.rawValue -> smsHandler.handleSmsSearch(paramsJson) + KlawtySmsCommand.Send.rawValue -> smsHandler.handleSmsSend(paramsJson) + KlawtySmsCommand.Search.rawValue -> smsHandler.handleSmsSearch(paramsJson) // CallLog command - OpenClawCallLogCommand.Search.rawValue -> callLogHandler.handleCallLogSearch(paramsJson) + KlawtyCallLogCommand.Search.rawValue -> callLogHandler.handleCallLogSearch(paramsJson) // Debug commands "debug.ed25519" -> debugHandler.handleEd25519() diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/JpegSizeLimiter.kt b/apps/android/app/src/main/java/ai/klawty/app/node/JpegSizeLimiter.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/node/JpegSizeLimiter.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/JpegSizeLimiter.kt index 143a1292f2..fc30836a90 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/JpegSizeLimiter.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/JpegSizeLimiter.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import kotlin.math.max import kotlin.math.min diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/LocationCaptureManager.kt b/apps/android/app/src/main/java/ai/klawty/app/node/LocationCaptureManager.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/LocationCaptureManager.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/LocationCaptureManager.kt index 86b059c243..c8de1ba237 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/LocationCaptureManager.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/LocationCaptureManager.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.Context diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/LocationHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/LocationHandler.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/node/LocationHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/LocationHandler.kt index 014eead666..d82f293cf2 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/LocationHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/LocationHandler.kt @@ -1,11 +1,11 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.Context import android.content.pm.PackageManager import android.location.LocationManager import androidx.core.content.ContextCompat -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import kotlinx.coroutines.TimeoutCancellationException import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject @@ -36,7 +36,7 @@ class LocationHandler( if (!isForeground()) { return GatewaySession.InvokeResult.error( code = "LOCATION_BACKGROUND_UNAVAILABLE", - message = "LOCATION_BACKGROUND_UNAVAILABLE: location requires OpenClaw to stay open", + message = "LOCATION_BACKGROUND_UNAVAILABLE: location requires Klawty to stay open", ) } if (!hasFineLocationPermission() && !hasCoarseLocationPermission()) { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/MotionHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/MotionHandler.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/MotionHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/MotionHandler.kt index bb11d6409b..622102464a 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/MotionHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/MotionHandler.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.Context @@ -8,7 +8,7 @@ import android.hardware.SensorEventListener import android.hardware.SensorManager import android.os.SystemClock import androidx.core.content.ContextCompat -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import java.time.Instant import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeoutOrNull diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/NodeUtils.kt b/apps/android/app/src/main/java/ai/klawty/app/node/NodeUtils.kt similarity index 96% rename from apps/android/app/src/main/java/ai/openclaw/app/node/NodeUtils.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/NodeUtils.kt index 587133d2a2..311a56a186 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/NodeUtils.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/NodeUtils.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.node +package ai.klawty.app.node -import ai.openclaw.app.gateway.parseInvokeErrorFromThrowable +import ai.klawty.app.gateway.parseInvokeErrorFromThrowable import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonNull diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/NotificationsHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/NotificationsHandler.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/node/NotificationsHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/NotificationsHandler.kt index d6a1f9998c..6e445f417a 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/NotificationsHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/NotificationsHandler.kt @@ -1,7 +1,7 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.content.Context -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/PhotosHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/PhotosHandler.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/PhotosHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/PhotosHandler.kt index ee05bda95a..39b1240db2 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/PhotosHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/PhotosHandler.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.ContentResolver @@ -12,7 +12,7 @@ import android.os.Bundle import android.provider.MediaStore import androidx.core.content.ContextCompat import androidx.core.graphics.scale -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import java.io.ByteArrayOutputStream import java.time.Instant import kotlin.math.max diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/SmsHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/SmsHandler.kt similarity index 92% rename from apps/android/app/src/main/java/ai/openclaw/app/node/SmsHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/SmsHandler.kt index f2885e23d7..bd3eecc0fe 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/SmsHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/SmsHandler.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.node +package ai.klawty.app.node -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession class SmsHandler( private val sms: SmsManager, diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/SmsManager.kt b/apps/android/app/src/main/java/ai/klawty/app/node/SmsManager.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/node/SmsManager.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/SmsManager.kt index 0256125b35..7024b8a1bb 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/SmsManager.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/SmsManager.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.content.Context @@ -17,7 +17,7 @@ import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.jsonObject import kotlinx.serialization.Serializable -import ai.openclaw.app.PermissionRequester +import ai.klawty.app.PermissionRequester /** * Sends SMS messages via the Android SMS API. diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/SystemHandler.kt b/apps/android/app/src/main/java/ai/klawty/app/node/SystemHandler.kt similarity index 95% rename from apps/android/app/src/main/java/ai/openclaw/app/node/SystemHandler.kt rename to apps/android/app/src/main/java/ai/klawty/app/node/SystemHandler.kt index 2ec6ed56ad..fbc5df3518 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/SystemHandler.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/node/SystemHandler.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.node +package ai.klawty.app.node import android.Manifest import android.app.NotificationChannel @@ -9,13 +9,13 @@ import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat -import ai.openclaw.app.gateway.GatewaySession +import ai.klawty.app.gateway.GatewaySession import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.contentOrNull -private const val NOTIFICATION_CHANNEL_BASE_ID = "openclaw.system.notify" +private const val NOTIFICATION_CHANNEL_BASE_ID = "klawty.system.notify" internal data class SystemNotifyRequest( val title: String, @@ -70,9 +70,9 @@ private class AndroidSystemNotificationPoster( val normalizedPriority = priority.orEmpty().trim().lowercase() val (suffix, importance, name) = when (normalizedPriority) { - "passive" -> Triple("passive", NotificationManager.IMPORTANCE_LOW, "OpenClaw Passive") - "timesensitive" -> Triple("timesensitive", NotificationManager.IMPORTANCE_HIGH, "OpenClaw Time Sensitive") - else -> Triple("active", NotificationManager.IMPORTANCE_DEFAULT, "OpenClaw Active") + "passive" -> Triple("passive", NotificationManager.IMPORTANCE_LOW, "Klawty Passive") + "timesensitive" -> Triple("timesensitive", NotificationManager.IMPORTANCE_HIGH, "Klawty Time Sensitive") + else -> Triple("active", NotificationManager.IMPORTANCE_DEFAULT, "Klawty Active") } val channelId = "$NOTIFICATION_CHANNEL_BASE_ID.$suffix" val manager = appContext.getSystemService(NotificationManager::class.java) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/protocol/OpenClawCanvasA2UIAction.kt b/apps/android/app/src/main/java/ai/klawty/app/protocol/KlawtyCanvasA2UIAction.kt similarity index 89% rename from apps/android/app/src/main/java/ai/openclaw/app/protocol/OpenClawCanvasA2UIAction.kt rename to apps/android/app/src/main/java/ai/klawty/app/protocol/KlawtyCanvasA2UIAction.kt index acbb3bf5cb..03fb1ed4eb 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/protocol/OpenClawCanvasA2UIAction.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/protocol/KlawtyCanvasA2UIAction.kt @@ -1,9 +1,9 @@ -package ai.openclaw.app.protocol +package ai.klawty.app.protocol import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive -object OpenClawCanvasA2UIAction { +object KlawtyCanvasA2UIAction { fun extractActionName(userAction: JsonObject): String? { val name = (userAction["name"] as? JsonPrimitive) @@ -61,6 +61,6 @@ object OpenClawCanvasA2UIAction { val err = (error ?: "").replace("\\", "\\\\").replace("\"", "\\\"") val okLiteral = if (ok) "true" else "false" val idEscaped = actionId.replace("\\", "\\\\").replace("\"", "\\\"") - return "window.dispatchEvent(new CustomEvent('openclaw:a2ui-action-status', { detail: { id: \"${idEscaped}\", ok: ${okLiteral}, error: \"${err}\" } }));" + return "window.dispatchEvent(new CustomEvent('klawty:a2ui-action-status', { detail: { id: \"${idEscaped}\", ok: ${okLiteral}, error: \"${err}\" } }));" } } diff --git a/apps/android/app/src/main/java/ai/openclaw/app/protocol/OpenClawProtocolConstants.kt b/apps/android/app/src/main/java/ai/klawty/app/protocol/KlawtyProtocolConstants.kt similarity index 72% rename from apps/android/app/src/main/java/ai/openclaw/app/protocol/OpenClawProtocolConstants.kt rename to apps/android/app/src/main/java/ai/klawty/app/protocol/KlawtyProtocolConstants.kt index ceed86f767..8dc1835550 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/protocol/OpenClawProtocolConstants.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/protocol/KlawtyProtocolConstants.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.protocol +package ai.klawty.app.protocol -enum class OpenClawCapability(val rawValue: String) { +enum class KlawtyCapability(val rawValue: String) { Canvas("canvas"), Camera("camera"), Sms("sms"), @@ -16,7 +16,7 @@ enum class OpenClawCapability(val rawValue: String) { CallLog("callLog"), } -enum class OpenClawCanvasCommand(val rawValue: String) { +enum class KlawtyCanvasCommand(val rawValue: String) { Present("canvas.present"), Hide("canvas.hide"), Navigate("canvas.navigate"), @@ -29,7 +29,7 @@ enum class OpenClawCanvasCommand(val rawValue: String) { } } -enum class OpenClawCanvasA2UICommand(val rawValue: String) { +enum class KlawtyCanvasA2UICommand(val rawValue: String) { Push("canvas.a2ui.push"), PushJSONL("canvas.a2ui.pushJSONL"), Reset("canvas.a2ui.reset"), @@ -40,7 +40,7 @@ enum class OpenClawCanvasA2UICommand(val rawValue: String) { } } -enum class OpenClawCameraCommand(val rawValue: String) { +enum class KlawtyCameraCommand(val rawValue: String) { List("camera.list"), Snap("camera.snap"), Clip("camera.clip"), @@ -51,7 +51,7 @@ enum class OpenClawCameraCommand(val rawValue: String) { } } -enum class OpenClawSmsCommand(val rawValue: String) { +enum class KlawtySmsCommand(val rawValue: String) { Send("sms.send"), Search("sms.search"), ; @@ -61,7 +61,7 @@ enum class OpenClawSmsCommand(val rawValue: String) { } } -enum class OpenClawLocationCommand(val rawValue: String) { +enum class KlawtyLocationCommand(val rawValue: String) { Get("location.get"), ; @@ -70,7 +70,7 @@ enum class OpenClawLocationCommand(val rawValue: String) { } } -enum class OpenClawDeviceCommand(val rawValue: String) { +enum class KlawtyDeviceCommand(val rawValue: String) { Status("device.status"), Info("device.info"), Permissions("device.permissions"), @@ -82,7 +82,7 @@ enum class OpenClawDeviceCommand(val rawValue: String) { } } -enum class OpenClawNotificationsCommand(val rawValue: String) { +enum class KlawtyNotificationsCommand(val rawValue: String) { List("notifications.list"), Actions("notifications.actions"), ; @@ -92,7 +92,7 @@ enum class OpenClawNotificationsCommand(val rawValue: String) { } } -enum class OpenClawSystemCommand(val rawValue: String) { +enum class KlawtySystemCommand(val rawValue: String) { Notify("system.notify"), ; @@ -101,7 +101,7 @@ enum class OpenClawSystemCommand(val rawValue: String) { } } -enum class OpenClawPhotosCommand(val rawValue: String) { +enum class KlawtyPhotosCommand(val rawValue: String) { Latest("photos.latest"), ; @@ -110,7 +110,7 @@ enum class OpenClawPhotosCommand(val rawValue: String) { } } -enum class OpenClawContactsCommand(val rawValue: String) { +enum class KlawtyContactsCommand(val rawValue: String) { Search("contacts.search"), Add("contacts.add"), ; @@ -120,7 +120,7 @@ enum class OpenClawContactsCommand(val rawValue: String) { } } -enum class OpenClawCalendarCommand(val rawValue: String) { +enum class KlawtyCalendarCommand(val rawValue: String) { Events("calendar.events"), Add("calendar.add"), ; @@ -130,7 +130,7 @@ enum class OpenClawCalendarCommand(val rawValue: String) { } } -enum class OpenClawMotionCommand(val rawValue: String) { +enum class KlawtyMotionCommand(val rawValue: String) { Activity("motion.activity"), Pedometer("motion.pedometer"), ; @@ -140,7 +140,7 @@ enum class OpenClawMotionCommand(val rawValue: String) { } } -enum class OpenClawCallLogCommand(val rawValue: String) { +enum class KlawtyCallLogCommand(val rawValue: String) { Search("callLog.search"), ; diff --git a/apps/android/app/src/main/java/ai/openclaw/app/tools/ToolDisplay.kt b/apps/android/app/src/main/java/ai/klawty/app/tools/ToolDisplay.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/tools/ToolDisplay.kt rename to apps/android/app/src/main/java/ai/klawty/app/tools/ToolDisplay.kt index 77844187e8..7dbdb3da62 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/tools/ToolDisplay.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/tools/ToolDisplay.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.tools +package ai.klawty.app.tools import android.content.Context import kotlinx.serialization.Serializable diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/CameraHudOverlay.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/CameraHudOverlay.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/CameraHudOverlay.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/CameraHudOverlay.kt index 658c4d38cc..8a396e4bb5 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/CameraHudOverlay.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/CameraHudOverlay.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/CanvasScreen.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/CanvasScreen.kt similarity index 91% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/CanvasScreen.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/CanvasScreen.kt index 5bf3a60ec0..b68127e786 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/CanvasScreen.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/CanvasScreen.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import android.annotation.SuppressLint import android.util.Log @@ -21,7 +21,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.viewinterop.AndroidView import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature -import ai.openclaw.app.MainViewModel +import ai.klawty.app.MainViewModel @SuppressLint("SetJavaScriptEnabled") @Composable @@ -59,7 +59,7 @@ fun CanvasScreen(viewModel: MainViewModel, modifier: Modifier = Modifier) { disableForceDarkIfSupported(settings) } if (isDebuggable) { - Log.d("OpenClawWebView", "userAgent: ${settings.userAgentString}") + Log.d("KlawtyWebView", "userAgent: ${settings.userAgentString}") } isScrollContainer = true overScrollMode = View.OVER_SCROLL_IF_CONTENT_SCROLLS @@ -73,7 +73,7 @@ fun CanvasScreen(viewModel: MainViewModel, modifier: Modifier = Modifier) { error: WebResourceError, ) { if (!isDebuggable || !request.isForMainFrame) return - Log.e("OpenClawWebView", "onReceivedError: ${error.errorCode} ${error.description} ${request.url}") + Log.e("KlawtyWebView", "onReceivedError: ${error.errorCode} ${error.description} ${request.url}") } override fun onReceivedHttpError( @@ -83,14 +83,14 @@ fun CanvasScreen(viewModel: MainViewModel, modifier: Modifier = Modifier) { ) { if (!isDebuggable || !request.isForMainFrame) return Log.e( - "OpenClawWebView", + "KlawtyWebView", "onReceivedHttpError: ${errorResponse.statusCode} ${errorResponse.reasonPhrase} ${request.url}", ) } override fun onPageFinished(view: WebView, url: String?) { if (isDebuggable) { - Log.d("OpenClawWebView", "onPageFinished: $url") + Log.d("KlawtyWebView", "onPageFinished: $url") } viewModel.canvas.onPageFinished() } @@ -101,7 +101,7 @@ fun CanvasScreen(viewModel: MainViewModel, modifier: Modifier = Modifier) { ): Boolean { if (isDebuggable) { Log.e( - "OpenClawWebView", + "KlawtyWebView", "onRenderProcessGone didCrash=${detail.didCrash()} priorityAtExit=${detail.rendererPriorityAtExit()}", ) } @@ -114,7 +114,7 @@ fun CanvasScreen(viewModel: MainViewModel, modifier: Modifier = Modifier) { if (!isDebuggable) return false val msg = consoleMessage ?: return false Log.d( - "OpenClawWebView", + "KlawtyWebView", "console ${msg.messageLevel()} @ ${msg.sourceId()}:${msg.lineNumber()} ${msg.message()}", ) return false @@ -145,6 +145,6 @@ private class CanvasA2UIActionBridge(private val onMessage: (String) -> Unit) { } companion object { - const val interfaceName: String = "openclawCanvasA2UIAction" + const val interfaceName: String = "klawtyCanvasA2UIAction" } } diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/ChatSheet.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/ChatSheet.kt similarity index 56% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/ChatSheet.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/ChatSheet.kt index 1abc76e785..405f114d46 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/ChatSheet.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/ChatSheet.kt @@ -1,8 +1,8 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.runtime.Composable -import ai.openclaw.app.MainViewModel -import ai.openclaw.app.ui.chat.ChatSheetContent +import ai.klawty.app.MainViewModel +import ai.klawty.app.ui.chat.ChatSheetContent @Composable fun ChatSheet(viewModel: MainViewModel) { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/ConnectTabScreen.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/ConnectTabScreen.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/ConnectTabScreen.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/ConnectTabScreen.kt index 603902b190..50d2c86f71 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/ConnectTabScreen.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/ConnectTabScreen.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.foundation.BorderStroke import androidx.compose.animation.AnimatedVisibility @@ -52,8 +52,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import ai.openclaw.app.MainViewModel -import ai.openclaw.app.ui.mobileCardSurface +import ai.klawty.app.MainViewModel +import ai.klawty.app.ui.mobileCardSurface private enum class ConnectInputMode { SetupCode, @@ -296,7 +296,7 @@ fun ConnectTabScreen(viewModel: MainViewModel) { ) { Text("Last gateway error", style = mobileHeadline, color = mobileWarning) Text(statusLabel, style = mobileBody.copy(fontFamily = FontFamily.Monospace), color = mobileText) - Text("OpenClaw Android ${openClawAndroidVersionLabel()}", style = mobileCaption1, color = mobileTextSecondary) + Text("Klawty Android ${openClawAndroidVersionLabel()}", style = mobileCaption1, color = mobileTextSecondary) Button( onClick = { copyGatewayDiagnosticsReport( @@ -373,8 +373,8 @@ fun ConnectTabScreen(viewModel: MainViewModel) { } Text("Run these on the gateway host:", style = mobileCallout, color = mobileTextSecondary) - CommandBlock("openclaw qr --setup-code-only") - CommandBlock("openclaw qr --json") + CommandBlock("klawty qr --setup-code-only") + CommandBlock("klawty qr --json") if (inputMode == ConnectInputMode.SetupCode) { Text("Setup Code", style = mobileCaption1.copy(fontWeight = FontWeight.SemiBold), color = mobileTextSecondary) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayConfigResolver.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/GatewayConfigResolver.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayConfigResolver.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/GatewayConfigResolver.kt index 3416900ed5..65fd35b615 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayConfigResolver.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/GatewayConfigResolver.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import java.util.Base64 import java.util.Locale diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayDiagnostics.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/GatewayDiagnostics.kt similarity index 85% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayDiagnostics.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/GatewayDiagnostics.kt index 90737e51bc..2bd42c02e6 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/GatewayDiagnostics.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/GatewayDiagnostics.kt @@ -1,11 +1,11 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.os.Build import android.widget.Toast -import ai.openclaw.app.BuildConfig +import ai.klawty.app.BuildConfig internal fun openClawAndroidVersionLabel(): String { val versionName = BuildConfig.VERSION_NAME.trim().ifEmpty { "dev" } @@ -44,14 +44,14 @@ internal fun buildGatewayDiagnosticsReport( val endpoint = gatewayAddress.trim().ifEmpty { "unknown" } val status = gatewayStatusForDisplay(statusText) return """ - Help diagnose this OpenClaw Android gateway connection failure. + Help diagnose this Klawty Android gateway connection failure. Please: - pick one route only: same machine, same LAN, Tailscale, or public URL - classify this as pairing/auth, TLS trust, wrong advertised route, wrong address/port, or gateway down - quote the exact app status/error below - - tell me whether `openclaw devices list` should show a pending pairing request - - if more signal is needed, ask for `openclaw qr --json`, `openclaw devices list`, and `openclaw nodes status` + - tell me whether `klawty devices list` should show a pending pairing request + - if more signal is needed, ask for `klawty qr --json`, `klawty devices list`, and `klawty nodes status` - give the next exact command or tap Debug info: @@ -72,6 +72,6 @@ internal fun copyGatewayDiagnosticsReport( ) { val clipboard = context.getSystemService(ClipboardManager::class.java) ?: return val report = buildGatewayDiagnosticsReport(screen = screen, gatewayAddress = gatewayAddress, statusText = statusText) - clipboard.setPrimaryClip(ClipData.newPlainText("OpenClaw gateway diagnostics", report)) + clipboard.setPrimaryClip(ClipData.newPlainText("Klawty gateway diagnostics", report)) Toast.makeText(context, "Copied gateway diagnostics", Toast.LENGTH_SHORT).show() } diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/OpenClawTheme.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/KlawtyTheme.kt similarity index 94% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/OpenClawTheme.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/KlawtyTheme.kt index cfcceb4f3d..27b1b7b3a4 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/OpenClawTheme.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/KlawtyTheme.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme @@ -10,7 +10,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext @Composable -fun OpenClawTheme(content: @Composable () -> Unit) { +fun KlawtyTheme(content: @Composable () -> Unit) { val context = LocalContext.current val isDark = isSystemInDarkTheme() val colorScheme = if (isDark) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/MobileUiTokens.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/MobileUiTokens.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/MobileUiTokens.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/MobileUiTokens.kt index d8521242ee..0ccd21a9fa 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/MobileUiTokens.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/MobileUiTokens.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.runtime.Composable import androidx.compose.runtime.staticCompositionLocalOf @@ -9,7 +9,7 @@ import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp -import ai.openclaw.app.R +import ai.klawty.app.R // --------------------------------------------------------------------------- // MobileColors – semantic color tokens with light + dark variants diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/OnboardingFlow.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/OnboardingFlow.kt index 1f4774a537..ef3088e8e4 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/OnboardingFlow.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/OnboardingFlow.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import android.Manifest import android.content.Context @@ -93,9 +93,9 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner -import ai.openclaw.app.LocationMode -import ai.openclaw.app.MainViewModel -import ai.openclaw.app.node.DeviceNotificationListenerService +import ai.klawty.app.LocationMode +import ai.klawty.app.MainViewModel +import ai.klawty.app.node.DeviceNotificationListenerService import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.codescanner.GmsBarcodeScannerOptions import com.google.mlkit.vision.codescanner.GmsBarcodeScanning @@ -525,7 +525,7 @@ fun OnboardingFlow(viewModel: MainViewModel, modifier: Modifier = Modifier) { verticalArrangement = Arrangement.spacedBy(4.dp), ) { Text( - "OpenClaw", + "Klawty", style = onboardingDisplayStyle, color = onboardingText, ) @@ -1013,11 +1013,11 @@ private fun GatewayStep( StepShell(title = "Gateway Connection") { Text( - "Run `openclaw qr` on your gateway host, then scan the code with this device.", + "Run `klawty qr` on your gateway host, then scan the code with this device.", style = onboardingCalloutStyle, color = onboardingTextSecondary, ) - CommandBlock("openclaw qr") + CommandBlock("klawty qr") Button( onClick = onScanQrClick, modifier = Modifier.fillMaxWidth().height(48.dp), @@ -1064,7 +1064,7 @@ private fun GatewayStep( OutlinedTextField( value = setupCode, onValueChange = onSetupCodeChange, - placeholder = { Text("Paste code from `openclaw qr --setup-code-only`", color = onboardingTextTertiary, style = onboardingBodyStyle) }, + placeholder = { Text("Paste code from `klawty qr --setup-code-only`", color = onboardingTextTertiary, style = onboardingBodyStyle) }, modifier = Modifier.fillMaxWidth(), minLines = 3, maxLines = 5, @@ -1680,7 +1680,7 @@ private fun FinalStep( ) } Text( - "OpenClaw Android ${openClawAndroidVersionLabel()}", + "Klawty Android ${openClawAndroidVersionLabel()}", style = onboardingCaption1Style, color = onboardingTextSecondary, ) @@ -1704,8 +1704,8 @@ private fun FinalStep( } } if (pairingRequired) { - CommandBlock("openclaw devices list") - CommandBlock("openclaw devices approve ") + CommandBlock("klawty devices list") + CommandBlock("klawty devices approve ") Text("Then tap Connect again.", style = onboardingCalloutStyle, color = onboardingTextSecondary) } } diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/PostOnboardingTabs.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/PostOnboardingTabs.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/PostOnboardingTabs.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/PostOnboardingTabs.kt index 5e04d90540..09aff831a4 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/PostOnboardingTabs.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/PostOnboardingTabs.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.foundation.background import androidx.compose.foundation.BorderStroke @@ -44,7 +44,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import ai.openclaw.app.MainViewModel +import ai.klawty.app.MainViewModel private enum class HomeTab( val label: String, @@ -202,7 +202,7 @@ private fun TopStatusBar( horizontalArrangement = Arrangement.SpaceBetween, ) { Text( - text = "OpenClaw", + text = "Klawty", style = mobileTitle2, color = mobileText, ) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/RootScreen.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/RootScreen.kt similarity index 89% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/RootScreen.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/RootScreen.kt index 03764b11a2..5fafbe7c31 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/RootScreen.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/RootScreen.kt @@ -1,11 +1,11 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import ai.openclaw.app.MainViewModel +import ai.klawty.app.MainViewModel @Composable fun RootScreen(viewModel: MainViewModel) { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/SettingsSheet.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/SettingsSheet.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/SettingsSheet.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/SettingsSheet.kt index f78e4535bc..282604fa83 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/SettingsSheet.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/SettingsSheet.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import android.Manifest import android.content.Context @@ -65,10 +65,10 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner -import ai.openclaw.app.BuildConfig -import ai.openclaw.app.LocationMode -import ai.openclaw.app.MainViewModel -import ai.openclaw.app.node.DeviceNotificationListenerService +import ai.klawty.app.BuildConfig +import ai.klawty.app.LocationMode +import ai.klawty.app.MainViewModel +import ai.klawty.app.node.DeviceNotificationListenerService @Composable fun SettingsSheet(viewModel: MainViewModel) { @@ -707,7 +707,7 @@ fun SettingsSheet(viewModel: MainViewModel) { modifier = Modifier.fillMaxWidth(), colors = listItemColors, headlineContent = { Text("While Using", style = mobileHeadline) }, - supportingContent = { Text("Only while OpenClaw is open.", style = mobileCallout) }, + supportingContent = { Text("Only while Klawty is open.", style = mobileCallout) }, trailingContent = { RadioButton( selected = locationMode == LocationMode.WhileUsing, diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/TalkOrbOverlay.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/TalkOrbOverlay.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/TalkOrbOverlay.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/TalkOrbOverlay.kt index 0aba5e9107..1af785315c 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/TalkOrbOverlay.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/TalkOrbOverlay.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.RepeatMode diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceTabScreen.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/VoiceTabScreen.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceTabScreen.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/VoiceTabScreen.kt index 76fc2c4f0c..b756b41904 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/VoiceTabScreen.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/VoiceTabScreen.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui +package ai.klawty.app.ui import android.Manifest import android.app.Activity @@ -68,9 +68,9 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner -import ai.openclaw.app.MainViewModel -import ai.openclaw.app.voice.VoiceConversationEntry -import ai.openclaw.app.voice.VoiceConversationRole +import ai.klawty.app.MainViewModel +import ai.klawty.app.voice.VoiceConversationEntry +import ai.klawty.app.voice.VoiceConversationRole import kotlin.math.max @Composable @@ -371,7 +371,7 @@ private fun VoiceTurnBubble(entry: VoiceConversationEntry) { verticalArrangement = Arrangement.spacedBy(3.dp), ) { Text( - if (isUser) "You" else "OpenClaw", + if (isUser) "You" else "Klawty", style = mobileCaption2.copy(fontWeight = FontWeight.SemiBold, letterSpacing = 0.6.sp), color = if (isUser) mobileAccent else mobileTextSecondary, ) @@ -400,7 +400,7 @@ private fun VoiceThinkingBubble() { verticalAlignment = Alignment.CenterVertically, ) { ThinkingDots(color = mobileTextSecondary) - Text("OpenClaw is thinking…", style = mobileCallout, color = mobileTextSecondary) + Text("Klawty is thinking…", style = mobileCallout, color = mobileTextSecondary) } } } diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/Base64ImageState.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/Base64ImageState.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/Base64ImageState.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/Base64ImageState.kt index 8180d24bbe..8f3959575a 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/Base64ImageState.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/Base64ImageState.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatComposer.kt similarity index 94% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatComposer.kt index 1adcc34c2d..bfab926e3a 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatComposer.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatComposer.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.horizontalScroll @@ -45,19 +45,19 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import ai.openclaw.app.ui.mobileAccent -import ai.openclaw.app.ui.mobileAccentBorderStrong -import ai.openclaw.app.ui.mobileAccentSoft -import ai.openclaw.app.ui.mobileBorder -import ai.openclaw.app.ui.mobileBorderStrong -import ai.openclaw.app.ui.mobileCallout -import ai.openclaw.app.ui.mobileCaption1 -import ai.openclaw.app.ui.mobileCardSurface -import ai.openclaw.app.ui.mobileHeadline -import ai.openclaw.app.ui.mobileSurface -import ai.openclaw.app.ui.mobileText -import ai.openclaw.app.ui.mobileTextSecondary -import ai.openclaw.app.ui.mobileTextTertiary +import ai.klawty.app.ui.mobileAccent +import ai.klawty.app.ui.mobileAccentBorderStrong +import ai.klawty.app.ui.mobileAccentSoft +import ai.klawty.app.ui.mobileBorder +import ai.klawty.app.ui.mobileBorderStrong +import ai.klawty.app.ui.mobileCallout +import ai.klawty.app.ui.mobileCaption1 +import ai.klawty.app.ui.mobileCardSurface +import ai.klawty.app.ui.mobileHeadline +import ai.klawty.app.ui.mobileSurface +import ai.klawty.app.ui.mobileText +import ai.klawty.app.ui.mobileTextSecondary +import ai.klawty.app.ui.mobileTextTertiary @Composable fun ChatComposer( @@ -99,7 +99,7 @@ fun ChatComposer( Text( text = "Gateway is offline. Connect first in the Connect tab.", style = mobileCallout, - color = ai.openclaw.app.ui.mobileWarning, + color = ai.klawty.app.ui.mobileWarning, ) } @@ -342,7 +342,7 @@ private fun chatTextFieldColors() = @Composable private fun mobileBodyStyle() = MaterialTheme.typography.bodyMedium.copy( - fontFamily = ai.openclaw.app.ui.mobileFontFamily, + fontFamily = ai.klawty.app.ui.mobileFontFamily, fontWeight = FontWeight.Medium, fontSize = 15.sp, lineHeight = 22.sp, diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatImageCodec.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatImageCodec.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatImageCodec.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatImageCodec.kt index 6574fa8678..cd1b8cc8aa 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatImageCodec.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatImageCodec.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat import android.content.ContentResolver import android.graphics.Bitmap @@ -7,7 +7,7 @@ import android.net.Uri import android.util.Base64 import android.util.LruCache import androidx.core.graphics.scale -import ai.openclaw.app.node.JpegSizeLimiter +import ai.klawty.app.node.JpegSizeLimiter import java.io.ByteArrayOutputStream import kotlin.math.max import kotlin.math.roundToInt diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMarkdown.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMarkdown.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMarkdown.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMarkdown.kt index 0d49ec4278..1f7671eae0 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMarkdown.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMarkdown.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -34,12 +34,12 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import ai.openclaw.app.ui.mobileAccent -import ai.openclaw.app.ui.mobileCallout -import ai.openclaw.app.ui.mobileCaption1 -import ai.openclaw.app.ui.mobileCodeBg -import ai.openclaw.app.ui.mobileCodeText -import ai.openclaw.app.ui.mobileTextSecondary +import ai.klawty.app.ui.mobileAccent +import ai.klawty.app.ui.mobileCallout +import ai.klawty.app.ui.mobileCaption1 +import ai.klawty.app.ui.mobileCodeBg +import ai.klawty.app.ui.mobileCodeText +import ai.klawty.app.ui.mobileTextSecondary import org.commonmark.Extension import org.commonmark.ext.autolink.AutolinkExtension import org.commonmark.ext.gfm.strikethrough.Strikethrough diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMessageListCard.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMessageListCard.kt similarity index 90% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMessageListCard.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMessageListCard.kt index 96d5e7cf7f..d6e83a2409 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMessageListCard.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMessageListCard.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -17,14 +17,14 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import ai.openclaw.app.chat.ChatMessage -import ai.openclaw.app.chat.ChatPendingToolCall -import ai.openclaw.app.ui.mobileBorder -import ai.openclaw.app.ui.mobileCallout -import ai.openclaw.app.ui.mobileCardSurface -import ai.openclaw.app.ui.mobileHeadline -import ai.openclaw.app.ui.mobileText -import ai.openclaw.app.ui.mobileTextSecondary +import ai.klawty.app.chat.ChatMessage +import ai.klawty.app.chat.ChatPendingToolCall +import ai.klawty.app.ui.mobileBorder +import ai.klawty.app.ui.mobileCallout +import ai.klawty.app.ui.mobileCardSurface +import ai.klawty.app.ui.mobileHeadline +import ai.klawty.app.ui.mobileText +import ai.klawty.app.ui.mobileTextSecondary @Composable fun ChatMessageListCard( diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMessageViews.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMessageViews.kt similarity index 89% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMessageViews.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMessageViews.kt index 5d09d37a43..7b581f4631 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatMessageViews.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatMessageViews.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image @@ -25,26 +25,26 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import ai.openclaw.app.chat.ChatMessage -import ai.openclaw.app.chat.ChatMessageContent -import ai.openclaw.app.chat.ChatPendingToolCall -import ai.openclaw.app.tools.ToolDisplayRegistry -import ai.openclaw.app.ui.mobileAccent -import ai.openclaw.app.ui.mobileAccentSoft -import ai.openclaw.app.ui.mobileBorder -import ai.openclaw.app.ui.mobileBorderStrong -import ai.openclaw.app.ui.mobileCallout -import ai.openclaw.app.ui.mobileCaption1 -import ai.openclaw.app.ui.mobileCaption2 -import ai.openclaw.app.ui.mobileCardSurface -import ai.openclaw.app.ui.mobileCodeBg -import ai.openclaw.app.ui.mobileCodeBorder -import ai.openclaw.app.ui.mobileCodeText -import ai.openclaw.app.ui.mobileHeadline -import ai.openclaw.app.ui.mobileText -import ai.openclaw.app.ui.mobileTextSecondary -import ai.openclaw.app.ui.mobileWarning -import ai.openclaw.app.ui.mobileWarningSoft +import ai.klawty.app.chat.ChatMessage +import ai.klawty.app.chat.ChatMessageContent +import ai.klawty.app.chat.ChatPendingToolCall +import ai.klawty.app.tools.ToolDisplayRegistry +import ai.klawty.app.ui.mobileAccent +import ai.klawty.app.ui.mobileAccentSoft +import ai.klawty.app.ui.mobileBorder +import ai.klawty.app.ui.mobileBorderStrong +import ai.klawty.app.ui.mobileCallout +import ai.klawty.app.ui.mobileCaption1 +import ai.klawty.app.ui.mobileCaption2 +import ai.klawty.app.ui.mobileCardSurface +import ai.klawty.app.ui.mobileCodeBg +import ai.klawty.app.ui.mobileCodeBorder +import ai.klawty.app.ui.mobileCodeText +import ai.klawty.app.ui.mobileHeadline +import ai.klawty.app.ui.mobileText +import ai.klawty.app.ui.mobileTextSecondary +import ai.klawty.app.ui.mobileWarning +import ai.klawty.app.ui.mobileWarningSoft import java.util.Locale private data class ChatBubbleStyle( @@ -190,7 +190,7 @@ fun ChatPendingToolsBubble(toolCalls: List) { fun ChatStreamingAssistantBubble(text: String) { ChatBubbleContainer( style = bubbleStyle("assistant").copy(borderColor = mobileAccent), - roleLabel = "OpenClaw · Live", + roleLabel = "Klawty · Live", ) { ChatMarkdown(text = text, textColor = mobileText) } @@ -229,7 +229,7 @@ private fun roleLabel(role: String): String { return when (role) { "user" -> "You" "system" -> "System" - else -> "OpenClaw" + else -> "Klawty" } } diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatSheetContent.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatSheetContent.kt similarity index 91% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatSheetContent.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatSheetContent.kt index 2d8fb255ba..4080a3ef28 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/ChatSheetContent.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/ChatSheetContent.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -29,21 +29,21 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import ai.openclaw.app.MainViewModel -import ai.openclaw.app.chat.ChatSessionEntry -import ai.openclaw.app.chat.OutgoingAttachment -import ai.openclaw.app.ui.mobileAccent -import ai.openclaw.app.ui.mobileAccentBorderStrong -import ai.openclaw.app.ui.mobileBorder -import ai.openclaw.app.ui.mobileBorderStrong -import ai.openclaw.app.ui.mobileCallout -import ai.openclaw.app.ui.mobileCardSurface -import ai.openclaw.app.ui.mobileCaption1 -import ai.openclaw.app.ui.mobileCaption2 -import ai.openclaw.app.ui.mobileDanger -import ai.openclaw.app.ui.mobileDangerSoft -import ai.openclaw.app.ui.mobileText -import ai.openclaw.app.ui.mobileTextSecondary +import ai.klawty.app.MainViewModel +import ai.klawty.app.chat.ChatSessionEntry +import ai.klawty.app.chat.OutgoingAttachment +import ai.klawty.app.ui.mobileAccent +import ai.klawty.app.ui.mobileAccentBorderStrong +import ai.klawty.app.ui.mobileBorder +import ai.klawty.app.ui.mobileBorderStrong +import ai.klawty.app.ui.mobileCallout +import ai.klawty.app.ui.mobileCardSurface +import ai.klawty.app.ui.mobileCaption1 +import ai.klawty.app.ui.mobileCaption2 +import ai.klawty.app.ui.mobileDanger +import ai.klawty.app.ui.mobileDangerSoft +import ai.klawty.app.ui.mobileText +import ai.klawty.app.ui.mobileTextSecondary import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/SessionFilters.kt b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/SessionFilters.kt similarity index 96% rename from apps/android/app/src/main/java/ai/openclaw/app/ui/chat/SessionFilters.kt rename to apps/android/app/src/main/java/ai/klawty/app/ui/chat/SessionFilters.kt index 2f496bcb6c..5dc9288597 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/chat/SessionFilters.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/ui/chat/SessionFilters.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.ui.chat +package ai.klawty.app.ui.chat -import ai.openclaw.app.chat.ChatSessionEntry +import ai.klawty.app.chat.ChatSessionEntry private const val RECENT_WINDOW_MS = 24 * 60 * 60 * 1000L diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/ElevenLabsStreamingTts.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/ElevenLabsStreamingTts.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/ElevenLabsStreamingTts.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/ElevenLabsStreamingTts.kt index ff13cf7391..fd613dae6b 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/ElevenLabsStreamingTts.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/ElevenLabsStreamingTts.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice import android.media.AudioAttributes import android.media.AudioFormat diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/MicCaptureManager.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/MicCaptureManager.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/MicCaptureManager.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/MicCaptureManager.kt index 39bacbeca5..abdeb6c18e 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/MicCaptureManager.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/MicCaptureManager.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice import android.Manifest import android.content.Context diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/StreamingMediaDataSource.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/StreamingMediaDataSource.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/StreamingMediaDataSource.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/StreamingMediaDataSource.kt index 90bbd81b8b..2425f333fe 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/StreamingMediaDataSource.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/StreamingMediaDataSource.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice import android.media.MediaDataSource import kotlin.math.min diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkDefaults.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkDefaults.kt similarity index 71% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/TalkDefaults.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/TalkDefaults.kt index 2afe245c8e..f5a550b2e5 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkDefaults.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkDefaults.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice internal object TalkDefaults { const val defaultSilenceTimeoutMs = 700L diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkDirectiveParser.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkDirectiveParser.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/TalkDirectiveParser.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/TalkDirectiveParser.kt index cd3770cf8c..a52b5908ac 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkDirectiveParser.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkDirectiveParser.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonElement diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeGatewayConfig.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeGatewayConfig.kt similarity index 98% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeGatewayConfig.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeGatewayConfig.kt index 58208acc0b..20975d1ecd 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeGatewayConfig.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeGatewayConfig.kt @@ -1,6 +1,6 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice -import ai.openclaw.app.normalizeMainKey +import ai.klawty.app.normalizeMainKey import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeManager.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeManager.kt index 70b6113fc3..051e71e0a2 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeManager.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeManager.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice import android.Manifest import android.content.Context @@ -21,9 +21,9 @@ import android.speech.tts.TextToSpeech import android.speech.tts.UtteranceProgressListener import android.util.Log import androidx.core.content.ContextCompat -import ai.openclaw.app.gateway.GatewaySession -import ai.openclaw.app.isCanonicalMainSessionKey -import ai.openclaw.app.normalizeMainKey +import ai.klawty.app.gateway.GatewaySession +import ai.klawty.app.isCanonicalMainSessionKey +import ai.klawty.app.normalizeMainKey import java.io.File import java.net.HttpURLConnection import java.net.URL diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeVoiceResolver.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeVoiceResolver.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeVoiceResolver.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeVoiceResolver.kt index 7ada19e166..09a4334837 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkModeVoiceResolver.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/TalkModeVoiceResolver.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice import java.net.HttpURLConnection import java.net.URL diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/VoiceWakeCommandExtractor.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/VoiceWakeCommandExtractor.kt similarity index 97% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/VoiceWakeCommandExtractor.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/VoiceWakeCommandExtractor.kt index efa9be0547..df1b758b59 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/VoiceWakeCommandExtractor.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/VoiceWakeCommandExtractor.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice object VoiceWakeCommandExtractor { fun extractCommand(text: String, triggerWords: List): String? { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/VoiceWakeManager.kt b/apps/android/app/src/main/java/ai/klawty/app/voice/VoiceWakeManager.kt similarity index 99% rename from apps/android/app/src/main/java/ai/openclaw/app/voice/VoiceWakeManager.kt rename to apps/android/app/src/main/java/ai/klawty/app/voice/VoiceWakeManager.kt index a6395429a8..3f45cc6196 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/VoiceWakeManager.kt +++ b/apps/android/app/src/main/java/ai/klawty/app/voice/VoiceWakeManager.kt @@ -1,4 +1,4 @@ -package ai.openclaw.app.voice +package ai.klawty.app.voice import android.content.Context import android.content.Intent diff --git a/apps/android/app/src/main/res/values-night/themes.xml b/apps/android/app/src/main/res/values-night/themes.xml index 4f55d0b8cf..af36371f29 100644 --- a/apps/android/app/src/main/res/values-night/themes.xml +++ b/apps/android/app/src/main/res/values-night/themes.xml @@ -1,6 +1,6 @@ -