From 249aedfc042da294b9e83db68f986737efa3e7e9 Mon Sep 17 00:00:00 2001 From: Steven Enamakel <31011319+senamakel@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:38:48 -0700 Subject: [PATCH] chore: remov unwanted/mobile references and update skills submodule (#45) * refactor: remove mobile platform support and update documentation - Updated CONTRIBUTING.md and SECURITY.md to reflect the removal of Android and iOS support, focusing on desktop platforms only. - Modified AGENTS.md and MEMORY.md to clarify the platform capabilities of OpenHuman as a desktop application. - Adjusted various Rust files to eliminate references to mobile platforms, including socket management and platform detection logic. - Removed mobile-specific code from SkillsGrid and Skills components, ensuring the application is tailored for desktop usage. - Deleted unused iOS and Android assets and configurations from the Tauri project structure. * chore: remove zeroclaw mentions and mobile support paths --- CONTRIBUTING.md | 4 +- SECURITY.md | 2 +- rust-core/ai/AGENTS.md | 7 + rust-core/ai/MEMORY.md | 2 +- .../src/openhuman/integrations/registry.rs | 14 +- rust-core/src/runtime/bridge/tauri_bridge.rs | 5 - rust-core/src/runtime/manifest.rs | 4 +- .../runtime/quickjs_libs/qjs_ops/ops_core.rs | 2 - rust-core/src/runtime/socket_manager.rs | 12 +- skills | 2 +- src-tauri/Cargo.toml | 8 +- src-tauri/gen/apple/.gitignore | 3 - .../AppIcon.appiconset/AppIcon-20x20@1x.png | Bin 612 -> 0 bytes .../AppIcon.appiconset/AppIcon-20x20@2x-1.png | Bin 1383 -> 0 bytes .../AppIcon.appiconset/AppIcon-20x20@2x.png | Bin 1383 -> 0 bytes .../AppIcon.appiconset/AppIcon-20x20@3x.png | Bin 2155 -> 0 bytes .../AppIcon.appiconset/AppIcon-29x29@1x.png | Bin 984 -> 0 bytes .../AppIcon.appiconset/AppIcon-29x29@2x-1.png | Bin 2044 -> 0 bytes .../AppIcon.appiconset/AppIcon-29x29@2x.png | Bin 2044 -> 0 bytes .../AppIcon.appiconset/AppIcon-29x29@3x.png | Bin 3171 -> 0 bytes .../AppIcon.appiconset/AppIcon-40x40@1x.png | Bin 1383 -> 0 bytes .../AppIcon.appiconset/AppIcon-40x40@2x-1.png | Bin 2950 -> 0 bytes .../AppIcon.appiconset/AppIcon-40x40@2x.png | Bin 2950 -> 0 bytes .../AppIcon.appiconset/AppIcon-40x40@3x.png | Bin 4792 -> 0 bytes .../AppIcon.appiconset/AppIcon-512@2x.png | Bin 37390 -> 0 bytes .../AppIcon.appiconset/AppIcon-60x60@2x.png | Bin 4792 -> 0 bytes .../AppIcon.appiconset/AppIcon-60x60@3x.png | Bin 7557 -> 0 bytes .../AppIcon.appiconset/AppIcon-76x76@1x.png | Bin 2748 -> 0 bytes .../AppIcon.appiconset/AppIcon-76x76@2x.png | Bin 6311 -> 0 bytes .../AppIcon-83.5x83.5@2x.png | Bin 6955 -> 0 bytes .../AppIcon.appiconset/Contents.json | 116 ----- .../gen/apple/Assets.xcassets/Contents.json | 6 - src-tauri/gen/apple/ExportOptions.plist | 8 - src-tauri/gen/apple/LaunchScreen.storyboard | 30 -- src-tauri/gen/apple/Podfile | 21 - .../Sources/tauri-app/bindings/bindings.h | 8 - src-tauri/gen/apple/Sources/tauri-app/main.mm | 6 - src-tauri/gen/apple/project.yml | 88 ---- .../apple/tauri-app.xcodeproj/project.pbxproj | 458 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/WorkspaceSettings.xcsettings | 10 - .../xcschemes/tauri-app_iOS.xcscheme | 131 ----- src-tauri/gen/apple/tauri-app_iOS/Info.plist | 44 -- .../tauri-app_iOS/tauri-app_iOS.entitlements | 5 - src-tauri/src/commands/runtime.rs | 72 +-- src-tauri/src/lib.rs | 4 +- src/components/SkillsGrid.tsx | 45 -- src/lib/skills/types.ts | 2 +- src/pages/Skills.tsx | 12 - .../__tests__/agentToolRegistry.test.ts | 4 +- src/services/agentToolRegistry.ts | 12 +- src/store/index.ts | 2 +- src/types/agent.ts | 2 +- 53 files changed, 72 insertions(+), 1086 deletions(-) delete mode 100644 src-tauri/gen/apple/.gitignore delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png delete mode 100644 src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 src-tauri/gen/apple/Assets.xcassets/Contents.json delete mode 100644 src-tauri/gen/apple/ExportOptions.plist delete mode 100644 src-tauri/gen/apple/LaunchScreen.storyboard delete mode 100644 src-tauri/gen/apple/Podfile delete mode 100644 src-tauri/gen/apple/Sources/tauri-app/bindings/bindings.h delete mode 100644 src-tauri/gen/apple/Sources/tauri-app/main.mm delete mode 100644 src-tauri/gen/apple/project.yml delete mode 100644 src-tauri/gen/apple/tauri-app.xcodeproj/project.pbxproj delete mode 100644 src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 src-tauri/gen/apple/tauri-app.xcodeproj/xcshareddata/xcschemes/tauri-app_iOS.xcscheme delete mode 100644 src-tauri/gen/apple/tauri-app_iOS/Info.plist delete mode 100644 src-tauri/gen/apple/tauri-app_iOS/tauri-app_iOS.entitlements diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41ee18db2..754b2f58c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,7 +28,7 @@ This project adheres to the [Contributor Covenant Code of Conduct](CODE_OF_CONDU - [Node.js](https://nodejs.org/) (LTS) and [Yarn](https://yarnpkg.com/) - [Rust](https://rustup.rs/) (for Tauri and the Rust backend) -- Platform-specific tools for the targets you care about (e.g., Xcode for macOS/iOS, Android SDK for Android) +- Platform-specific tools for the desktop targets you care about ### Clone and Install @@ -44,8 +44,6 @@ Use your own fork in place of `YOUR_USERNAME` when cloning. - **Web only**: `yarn dev` (Vite dev server, typically port 1420) - **Desktop (Tauri)**: `yarn tauri dev` or `yarn dev:app` for enhanced debugging -- **Android**: `yarn tauri android dev` -- **iOS**: `yarn tauri ios dev` See the main [README](README.md) and project docs for more commands (e.g., `yarn skills:build`, `yarn skills:watch`). diff --git a/SECURITY.md b/SECURITY.md index 7fd4482a5..b087af4d2 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -36,7 +36,7 @@ We are especially interested in: - Data exfiltration or exposure (credentials, messages, user data) - Remote code execution (frontend, Tauri/Rust backend, or skills runtime) - Issues in dependency chain (npm, Cargo) that affect our build or runtime -- Platform-specific issues (macOS, Windows, Linux, Android, iOS) that compromise user data or device security +- Platform-specific issues (macOS, Windows, Linux) that compromise user data or device security Out-of-scope for this process: general bugs, feature requests, and issues in third-party services we integrate with (e.g., Telegram, Notion) unless they are specific to how OpenHuman uses them. diff --git a/rust-core/ai/AGENTS.md b/rust-core/ai/AGENTS.md index 0d8aa0a88..651e025a2 100644 --- a/rust-core/ai/AGENTS.md +++ b/rust-core/ai/AGENTS.md @@ -79,3 +79,10 @@ Activated for workflow creation, scheduled tasks, and skill management. ## PR Authoring Rule When an agent prepares or suggests pull request content, it must follow `.github/pull_request_template.md` and keep all sections/checklists intact. + +## Engineering Ownership Rules + +- Prefer writing core business logic in `rust-core/`. +- Keep user interaction logic in the UI layer (`src/`), and validate user flows with UI E2E tests. +- Keep functionality validation in Rust tests for `rust-core`. +- Keep `src-tauri/` focused on command registration and bridge code only, so frontend and `rust-core` communicate reliably. diff --git a/rust-core/ai/MEMORY.md b/rust-core/ai/MEMORY.md index ff0e034ff..a3d55b9c4 100644 --- a/rust-core/ai/MEMORY.md +++ b/rust-core/ai/MEMORY.md @@ -2,7 +2,7 @@ ## Platform Capabilities -OpenHuman is a cross-platform crypto community platform built with Tauri (React + Rust). It runs on Windows, macOS, Android, and iOS. +OpenHuman is a desktop crypto community platform built with Tauri (React + Rust). It runs on Windows, macOS, and Linux. **Core features:** diff --git a/rust-core/src/openhuman/integrations/registry.rs b/rust-core/src/openhuman/integrations/registry.rs index e0912ea76..9f0045ac2 100644 --- a/rust-core/src/openhuman/integrations/registry.rs +++ b/rust-core/src/openhuman/integrations/registry.rs @@ -499,7 +499,7 @@ pub fn all_integrations() -> Vec { }, IntegrationEntry { name: "Apple Notes", - description: "Native macOS/iOS notes", + description: "Native macOS notes", category: IntegrationCategory::Productivity, status_fn: |_| IntegrationStatus::ComingSoon, }, @@ -707,18 +707,6 @@ pub fn all_integrations() -> Vec { category: IntegrationCategory::Platform, status_fn: |_| IntegrationStatus::Available, }, - IntegrationEntry { - name: "iOS", - description: "Chat via Telegram/Discord", - category: IntegrationCategory::Platform, - status_fn: |_| IntegrationStatus::Available, - }, - IntegrationEntry { - name: "Android", - description: "Chat via Telegram/Discord", - category: IntegrationCategory::Platform, - status_fn: |_| IntegrationStatus::Available, - }, ] } diff --git a/rust-core/src/runtime/bridge/tauri_bridge.rs b/rust-core/src/runtime/bridge/tauri_bridge.rs index 6e4f5163f..2ecdf9935 100644 --- a/rust-core/src/runtime/bridge/tauri_bridge.rs +++ b/rust-core/src/runtime/bridge/tauri_bridge.rs @@ -8,8 +8,6 @@ pub fn get_platform() -> &'static str { "macos" => "macos", "windows" => "windows", "linux" => "linux", - "android" => "android", - "ios" => "ios", _ => "unknown", } } @@ -20,9 +18,6 @@ pub fn send_notification( title: &str, body: &str, ) -> Result<(), String> { - if matches!(get_platform(), "android" | "ios") { - return Err("Notifications not available on this platform".to_string()); - } log::info!("[runtime] notification requested: {title} - {body}"); Ok(()) } diff --git a/rust-core/src/runtime/manifest.rs b/rust-core/src/runtime/manifest.rs index 01f11e6fa..3ff3c7c7a 100644 --- a/rust-core/src/runtime/manifest.rs +++ b/rust-core/src/runtime/manifest.rs @@ -46,7 +46,7 @@ pub struct SkillManifest { #[serde(default)] pub setup: Option, /// Platform filter. When present, only these platforms will load the skill. - /// Valid values: "windows", "macos", "linux", "android", "ios". + /// Valid values: "windows", "macos", "linux". /// When absent or empty, the skill is available on all platforms. #[serde(default)] pub platforms: Option>, @@ -75,8 +75,6 @@ fn current_platform() -> &'static str { "windows" => "windows", "macos" => "macos", "linux" => "linux", - "android" => "android", - "ios" => "ios", _ => "unknown", } } diff --git a/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_core.rs b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_core.rs index f99e54807..995c86daf 100644 --- a/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_core.rs +++ b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_core.rs @@ -96,8 +96,6 @@ pub fn register<'js>( "windows" => "windows", "macos" => "macos", "linux" => "linux", - "android" => "android", - "ios" => "ios", _ => "unknown", } }), diff --git a/rust-core/src/runtime/socket_manager.rs b/rust-core/src/runtime/socket_manager.rs index d411aee7f..d39863ad5 100644 --- a/rust-core/src/runtime/socket_manager.rs +++ b/rust-core/src/runtime/socket_manager.rs @@ -10,7 +10,7 @@ //! - Connection state emitted to the frontend via Tauri events //! - Automatic reconnection with exponential backoff //! -//! Note: On Android, this is a stub. The frontend handles its own Socket.io connection. +//! Desktop runtime Socket.IO manager. use std::sync::Arc; @@ -20,7 +20,7 @@ use tauri::{AppHandle, Emitter}; use crate::models::socket::{ConnectionStatus, SocketState}; -// WebSocket-based Socket.IO client (desktop + iOS) +// WebSocket-based Socket.IO client (desktop) use { futures_util::{SinkExt, StreamExt}, tokio::sync::{mpsc, watch}, @@ -53,13 +53,13 @@ struct SharedState { } // --------------------------------------------------------------------------- -// WebSocket stream type alias (desktop + iOS) +// WebSocket stream type alias (desktop) // --------------------------------------------------------------------------- type WsStream = tokio_tungstenite::WebSocketStream>; // --------------------------------------------------------------------------- -// Connection outcome (desktop + iOS) +// Connection outcome (desktop) // --------------------------------------------------------------------------- enum ConnectionOutcome { /// Clean shutdown requested. @@ -122,7 +122,7 @@ impl SocketManager { } // ----------------------------------------------------------------------- - // Connection lifecycle (desktop + iOS) + // Connection lifecycle (desktop) // ----------------------------------------------------------------------- pub async fn connect(&self, url: &str, token: &str) -> Result<(), String> { self.disconnect().await?; @@ -220,7 +220,7 @@ impl Default for SocketManager { } // =========================================================================== -// WebSocket Engine.IO/Socket.IO implementation (desktop + iOS) +// WebSocket Engine.IO/Socket.IO implementation (desktop) // =========================================================================== async fn ws_loop( url: String, diff --git a/skills b/skills index e856b8e75..ba952da16 160000 --- a/skills +++ b/skills @@ -1 +1 @@ -Subproject commit e856b8e756ad7ea86f36dbd1697542e76a8d3571 +Subproject commit ba952da1664ab1775025b28cb5a57bf26a296828 diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 679bf48d7..383bff8f5 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -37,14 +37,14 @@ tauri-plugin-os = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" -# HTTP client: rustls for cross-platform TLS (Android), native-tls for desktop skill HTTP +# HTTP client: rustls + native-tls for desktop skill HTTP compatibility # (some APIs/CDNs use TLS configs that rustls can't negotiate — native-tls uses OS TLS stack) reqwest = { version = "0.12", default-features = false, features = ["json", "blocking", "rustls-tls", "native-tls", "stream", "http2", "multipart", "socks"] } # Async runtime tokio = { version = "1", features = ["full", "sync"] } -# keyring moved to desktop-only target section (not supported on Android/iOS) +# Keyring is used for desktop credential storage. # Concurrency utilities once_cell = "1.19" @@ -72,7 +72,7 @@ hex = "0.4" tokio-util = { version = "0.7", features = ["rt"] } landlock = { version = "0.4", optional = true } -# V8 JavaScript runtime moved to desktop-only (not available on Android/iOS) +# V8 JavaScript runtime is desktop-only in this host. tokio-tungstenite = { version = "0.24", features = ["rustls-tls-webpki-roots"] } @@ -91,7 +91,7 @@ cron = "0.12" # Stream/Sink utilities for WebSocket and HTTP streaming futures-util = "0.3" -# Android uses a simpler approach - no persistent Socket.io (use web socket from frontend) +# Socket manager is persistent in the desktop host. # OpenHuman config + observability directories = "6" diff --git a/src-tauri/gen/apple/.gitignore b/src-tauri/gen/apple/.gitignore deleted file mode 100644 index 6726e2f89..000000000 --- a/src-tauri/gen/apple/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -xcuserdata/ -build/ -Externals/ diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png deleted file mode 100644 index 5b72a5c990dc4543f7ef3ea6d073362200f45a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 612 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 h#JJv?bX$8B??0(SEcTJ}Cjx{*l46_Fng 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 diff --git a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json b/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 90eea7ec7..000000000 --- a/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "AppIcon-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "AppIcon-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "AppIcon-29x29@2x-1.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "AppIcon-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "AppIcon-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "AppIcon-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "AppIcon-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "AppIcon-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "AppIcon-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "AppIcon-20x20@2x-1.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "AppIcon-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "AppIcon-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "AppIcon-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "AppIcon-40x40@2x-1.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "AppIcon-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "AppIcon-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "AppIcon-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "AppIcon-512@2x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/src-tauri/gen/apple/Assets.xcassets/Contents.json b/src-tauri/gen/apple/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/src-tauri/gen/apple/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/src-tauri/gen/apple/ExportOptions.plist b/src-tauri/gen/apple/ExportOptions.plist deleted file mode 100644 index 0428a171b..000000000 --- a/src-tauri/gen/apple/ExportOptions.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - method - debugging - - diff --git a/src-tauri/gen/apple/LaunchScreen.storyboard b/src-tauri/gen/apple/LaunchScreen.storyboard deleted file mode 100644 index 81b5f90e2..000000000 --- a/src-tauri/gen/apple/LaunchScreen.storyboard +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src-tauri/gen/apple/Podfile b/src-tauri/gen/apple/Podfile deleted file mode 100644 index 606fa5b31..000000000 --- a/src-tauri/gen/apple/Podfile +++ /dev/null @@ -1,21 +0,0 @@ -# Uncomment the next line to define a global platform for your project - -target 'tauri-app_iOS' do -platform :ios, '14.0' - # Pods for tauri-app_iOS -end - -target 'tauri-app_macOS' do -platform :osx, '11.0' - # Pods for tauri-app_macOS -end - -# Delete the deployment target for iOS and macOS, causing it to be inherited from the Podfile -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' - config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET' - end - end -end diff --git a/src-tauri/gen/apple/Sources/tauri-app/bindings/bindings.h b/src-tauri/gen/apple/Sources/tauri-app/bindings/bindings.h deleted file mode 100644 index 51522007b..000000000 --- a/src-tauri/gen/apple/Sources/tauri-app/bindings/bindings.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -namespace ffi { - extern "C" { - void start_app(); - } -} - diff --git a/src-tauri/gen/apple/Sources/tauri-app/main.mm b/src-tauri/gen/apple/Sources/tauri-app/main.mm deleted file mode 100644 index 7793a9d5c..000000000 --- a/src-tauri/gen/apple/Sources/tauri-app/main.mm +++ /dev/null @@ -1,6 +0,0 @@ -#include "bindings/bindings.h" - -int main(int argc, char * argv[]) { - ffi::start_app(); - return 0; -} diff --git a/src-tauri/gen/apple/project.yml b/src-tauri/gen/apple/project.yml deleted file mode 100644 index aaa846c99..000000000 --- a/src-tauri/gen/apple/project.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: tauri-app -options: - bundleIdPrefix: com.openhuman.app - deploymentTarget: - iOS: 14.0 -fileGroups: [../../src] -configs: - debug: debug - release: release -settingGroups: - app: - base: - PRODUCT_NAME: tauri-app - PRODUCT_BUNDLE_IDENTIFIER: com.openhuman.app -targetTemplates: - app: - type: application - sources: - - path: Sources - scheme: - environmentVariables: - RUST_BACKTRACE: full - RUST_LOG: info - settings: - groups: [app] -targets: - tauri-app_iOS: - type: application - platform: iOS - sources: - - path: Sources - - path: Assets.xcassets - - path: Externals - - path: tauri-app_iOS - - path: assets - buildPhase: resources - type: folder - - path: LaunchScreen.storyboard - info: - path: tauri-app_iOS/Info.plist - properties: - LSRequiresIPhoneOS: true - UILaunchStoryboardName: LaunchScreen - UIRequiredDeviceCapabilities: [arm64, metal] - UISupportedInterfaceOrientations: - - UIInterfaceOrientationPortrait - - UIInterfaceOrientationLandscapeLeft - - UIInterfaceOrientationLandscapeRight - UISupportedInterfaceOrientations~ipad: - - UIInterfaceOrientationPortrait - - UIInterfaceOrientationPortraitUpsideDown - - UIInterfaceOrientationLandscapeLeft - - UIInterfaceOrientationLandscapeRight - CFBundleShortVersionString: 0.1.0 - CFBundleVersion: "0.1.0" - entitlements: - path: tauri-app_iOS/tauri-app_iOS.entitlements - scheme: - environmentVariables: - RUST_BACKTRACE: full - RUST_LOG: info - settings: - base: - ENABLE_BITCODE: false - ARCHS: [arm64] - VALID_ARCHS: arm64 - LIBRARY_SEARCH_PATHS[arch=x86_64]: $(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) - LIBRARY_SEARCH_PATHS[arch=arm64]: $(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: true - EXCLUDED_ARCHS[sdk=iphoneos*]: x86_64 - groups: [app] - dependencies: - - framework: libapp.a - embed: false - - sdk: CoreGraphics.framework - - sdk: Metal.framework - - sdk: MetalKit.framework - - sdk: QuartzCore.framework - - sdk: Security.framework - - sdk: UIKit.framework - - sdk: WebKit.framework - preBuildScripts: - - script: npm run -- tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths "${FRAMEWORK_SEARCH_PATHS:?}" --header-search-paths "${HEADER_SEARCH_PATHS:?}" --gcc-preprocessor-definitions "${GCC_PREPROCESSOR_DEFINITIONS:-}" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?} - name: Build Rust Code - basedOnDependencyAnalysis: false - outputFiles: - - $(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a - - $(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a diff --git a/src-tauri/gen/apple/tauri-app.xcodeproj/project.pbxproj b/src-tauri/gen/apple/tauri-app.xcodeproj/project.pbxproj deleted file mode 100644 index 846171127..000000000 --- a/src-tauri/gen/apple/tauri-app.xcodeproj/project.pbxproj +++ /dev/null @@ -1,458 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 77; - objects = { - -/* Begin PBXBuildFile section */ - 094A1ECD90ECD007825D95B3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84E625C1ABDB2D39CB77BF29 /* Security.framework */; }; - 1524BBF419A24C289873FCE0 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA1A066F7EDD869BC014BB9C /* Metal.framework */; }; - 5DCFDCE0989E0655641185BE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BA38F7BF7C28E04DBA849965 /* LaunchScreen.storyboard */; }; - 5DDC8F8949AE56AB4B683F62 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5384EE0C649F19A31B462538 /* QuartzCore.framework */; }; - 6495EEEF2DFC12CB82351B2B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C42C09CE350D0304EDF85C59 /* UIKit.framework */; }; - 7425A66C523CC66EFF87A16E /* libapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 46600E42EDBD4E2F9CFFB94E /* libapp.a */; }; - 74C25A7912AFE30DBE96B590 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 234C7D371C7B526F7E893B15 /* assets */; }; - 7A50F9841502955D69915755 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8DBF813DB5FCB214283D94D /* MetalKit.framework */; }; - 7E5D9DF6134425B5314935DE /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 75C0A66A4769E0B428DFFE16 /* main.mm */; }; - 824033B5A7F94F13A4C63E6E /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF0F15D9837DA9743995496A /* WebKit.framework */; }; - 8A272DD02B0D36ACBCE73E26 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CFDCAF660F4CA93110C8FB02 /* Assets.xcassets */; }; - CA00951E60FA3594F396EEEC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC56A11F310BBFF30CCFEB63 /* CoreGraphics.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 234C7D371C7B526F7E893B15 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; }; - 415CE9B61EE711FB11882F1B /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = ""; }; - 46600E42EDBD4E2F9CFFB94E /* libapp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libapp.a; sourceTree = ""; }; - 5384EE0C649F19A31B462538 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 6B62CCFCDED0CBE851A51E4F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 75C0A66A4769E0B428DFFE16 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - 7A62F8DA3ACF6DA66CB9785D /* tauri-app_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "tauri-app_iOS.entitlements"; sourceTree = ""; }; - 84E625C1ABDB2D39CB77BF29 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 9B11C2C873FB5A7B97B0605A /* tauri-app_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "tauri-app_iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - AC56A11F310BBFF30CCFEB63 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - B8DBF813DB5FCB214283D94D /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; - BA38F7BF7C28E04DBA849965 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; - C42C09CE350D0304EDF85C59 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - CA1A066F7EDD869BC014BB9C /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - CF0F15D9837DA9743995496A /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - CFDCAF660F4CA93110C8FB02 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - D96C5A0C6EF1CFC067A1C008 /* main.rs */ = {isa = PBXFileReference; path = main.rs; sourceTree = ""; }; - E486419C84C58B66E0FC1383 /* lib.rs */ = {isa = PBXFileReference; path = lib.rs; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 6EEA0490763EB982F7701E3D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7425A66C523CC66EFF87A16E /* libapp.a in Frameworks */, - CA00951E60FA3594F396EEEC /* CoreGraphics.framework in Frameworks */, - 1524BBF419A24C289873FCE0 /* Metal.framework in Frameworks */, - 7A50F9841502955D69915755 /* MetalKit.framework in Frameworks */, - 5DDC8F8949AE56AB4B683F62 /* QuartzCore.framework in Frameworks */, - 094A1ECD90ECD007825D95B3 /* Security.framework in Frameworks */, - 6495EEEF2DFC12CB82351B2B /* UIKit.framework in Frameworks */, - 824033B5A7F94F13A4C63E6E /* WebKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 2ECFA35AFF2D5945783C3B8D /* Externals */ = { - isa = PBXGroup; - children = ( - ); - path = Externals; - sourceTree = ""; - }; - 4261FD71066ABB203F1B3741 /* Products */ = { - isa = PBXGroup; - children = ( - 9B11C2C873FB5A7B97B0605A /* tauri-app_iOS.app */, - ); - name = Products; - sourceTree = ""; - }; - 48DF3F622809E7EBA4ED342A /* src */ = { - isa = PBXGroup; - children = ( - E486419C84C58B66E0FC1383 /* lib.rs */, - D96C5A0C6EF1CFC067A1C008 /* main.rs */, - ); - name = src; - path = ../../src; - sourceTree = ""; - }; - 5FCA5E244F4BE4C93672F978 /* bindings */ = { - isa = PBXGroup; - children = ( - 415CE9B61EE711FB11882F1B /* bindings.h */, - ); - path = bindings; - sourceTree = ""; - }; - 86E4D2974D6FC803E43026BD /* Frameworks */ = { - isa = PBXGroup; - children = ( - AC56A11F310BBFF30CCFEB63 /* CoreGraphics.framework */, - 46600E42EDBD4E2F9CFFB94E /* libapp.a */, - CA1A066F7EDD869BC014BB9C /* Metal.framework */, - B8DBF813DB5FCB214283D94D /* MetalKit.framework */, - 5384EE0C649F19A31B462538 /* QuartzCore.framework */, - 84E625C1ABDB2D39CB77BF29 /* Security.framework */, - C42C09CE350D0304EDF85C59 /* UIKit.framework */, - CF0F15D9837DA9743995496A /* WebKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 90B7B06659AD5A7A7EE39662 /* Sources */ = { - isa = PBXGroup; - children = ( - 9A6A58EE8A3E239B0E7BDD81 /* tauri-app */, - ); - path = Sources; - sourceTree = ""; - }; - 9A6A58EE8A3E239B0E7BDD81 /* tauri-app */ = { - isa = PBXGroup; - children = ( - 75C0A66A4769E0B428DFFE16 /* main.mm */, - 5FCA5E244F4BE4C93672F978 /* bindings */, - ); - path = "tauri-app"; - sourceTree = ""; - }; - A17B869C1C261C5F8DF765C9 /* tauri-app_iOS */ = { - isa = PBXGroup; - children = ( - 6B62CCFCDED0CBE851A51E4F /* Info.plist */, - 7A62F8DA3ACF6DA66CB9785D /* tauri-app_iOS.entitlements */, - ); - path = "tauri-app_iOS"; - sourceTree = ""; - }; - E8C7C60131D2B902F3255A8F = { - isa = PBXGroup; - children = ( - 234C7D371C7B526F7E893B15 /* assets */, - CFDCAF660F4CA93110C8FB02 /* Assets.xcassets */, - BA38F7BF7C28E04DBA849965 /* LaunchScreen.storyboard */, - 2ECFA35AFF2D5945783C3B8D /* Externals */, - 90B7B06659AD5A7A7EE39662 /* Sources */, - 48DF3F622809E7EBA4ED342A /* src */, - A17B869C1C261C5F8DF765C9 /* tauri-app_iOS */, - 86E4D2974D6FC803E43026BD /* Frameworks */, - 4261FD71066ABB203F1B3741 /* Products */, - ); - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 067C19C8047A2326EE93616E /* tauri-app_iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 492FB4942D220065AF299C12 /* Build configuration list for PBXNativeTarget "tauri-app_iOS" */; - buildPhases = ( - 4CFF21EFA1FFE4D2AB9D6998 /* Build Rust Code */, - D8D571D7BDCA1ABF2E0CB9D6 /* Sources */, - A4D85C1726744E26D8F01FD3 /* Resources */, - 6EEA0490763EB982F7701E3D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "tauri-app_iOS"; - packageProductDependencies = ( - ); - productName = "tauri-app_iOS"; - productReference = 9B11C2C873FB5A7B97B0605A /* tauri-app_iOS.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 90D4CFD39CFBBAA5E9883AD5 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1430; - }; - buildConfigurationList = 15AD1887792B155C6905ADD6 /* Build configuration list for PBXProject "tauri-app" */; - compatibilityVersion = "Xcode 14.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - Base, - en, - ); - mainGroup = E8C7C60131D2B902F3255A8F; - minimizedProjectReferenceProxies = 1; - preferredProjectObjectVersion = 77; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 067C19C8047A2326EE93616E /* tauri-app_iOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - A4D85C1726744E26D8F01FD3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8A272DD02B0D36ACBCE73E26 /* Assets.xcassets in Resources */, - 5DCFDCE0989E0655641185BE /* LaunchScreen.storyboard in Resources */, - 74C25A7912AFE30DBE96B590 /* assets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 4CFF21EFA1FFE4D2AB9D6998 /* Build Rust Code */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Build Rust Code"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a", - "$(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "npm run -- tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - D8D571D7BDCA1ABF2E0CB9D6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7E5D9DF6134425B5314935DE /* main.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 421E0640619ED5B0C0B13B4E /* debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ARCHS = ( - arm64, - ); - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = "tauri-app_iOS/tauri-app_iOS.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_BITCODE = NO; - "EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\".\"", - ); - INFOPLIST_FILE = "tauri-app_iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; - "LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; - PRODUCT_BUNDLE_IDENTIFIER = "com.openhuman.app"; - PRODUCT_NAME = "tauri-app"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = arm64; - }; - name = debug; - }; - 62330632B84ED41E941EFCF6 /* release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - }; - name = release; - }; - 62D98D8CE88586901FBBF6C0 /* debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = debug; - }; - D2A4FF1B078298AC78D0EBD3 /* release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ARCHS = ( - arm64, - ); - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = "tauri-app_iOS/tauri-app_iOS.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_BITCODE = NO; - "EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\".\"", - ); - INFOPLIST_FILE = "tauri-app_iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - "LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; - "LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)"; - PRODUCT_BUNDLE_IDENTIFIER = "com.openhuman.app"; - PRODUCT_NAME = "tauri-app"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = arm64; - }; - name = release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 15AD1887792B155C6905ADD6 /* Build configuration list for PBXProject "tauri-app" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 62D98D8CE88586901FBBF6C0 /* debug */, - 62330632B84ED41E941EFCF6 /* release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = debug; - }; - 492FB4942D220065AF299C12 /* Build configuration list for PBXNativeTarget "tauri-app_iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 421E0640619ED5B0C0B13B4E /* debug */, - D2A4FF1B078298AC78D0EBD3 /* release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = 90D4CFD39CFBBAA5E9883AD5 /* Project object */; -} diff --git a/src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index ac90d5ac7..000000000 --- a/src-tauri/gen/apple/tauri-app.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,10 +0,0 @@ - - - - - BuildSystemType - Original - DisableBuildSystemDeprecationDiagnostic - - - diff --git a/src-tauri/gen/apple/tauri-app.xcodeproj/xcshareddata/xcschemes/tauri-app_iOS.xcscheme b/src-tauri/gen/apple/tauri-app.xcodeproj/xcshareddata/xcschemes/tauri-app_iOS.xcscheme deleted file mode 100644 index 17e7a2d9d..000000000 --- a/src-tauri/gen/apple/tauri-app.xcodeproj/xcshareddata/xcschemes/tauri-app_iOS.xcscheme +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src-tauri/gen/apple/tauri-app_iOS/Info.plist b/src-tauri/gen/apple/tauri-app_iOS/Info.plist deleted file mode 100644 index ff3fbd7f2..000000000 --- a/src-tauri/gen/apple/tauri-app_iOS/Info.plist +++ /dev/null @@ -1,44 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 0.1.0 - CFBundleVersion - 0.1.0 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - arm64 - metal - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/src-tauri/gen/apple/tauri-app_iOS/tauri-app_iOS.entitlements b/src-tauri/gen/apple/tauri-app_iOS/tauri-app_iOS.entitlements deleted file mode 100644 index 0c67376eb..000000000 --- a/src-tauri/gen/apple/tauri-app_iOS/tauri-app_iOS.entitlements +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src-tauri/src/commands/runtime.rs b/src-tauri/src/commands/runtime.rs index 0fc3c7b58..58ebe667b 100644 --- a/src-tauri/src/commands/runtime.rs +++ b/src-tauri/src/commands/runtime.rs @@ -17,25 +17,25 @@ use crate::runtime::qjs_engine::RuntimeEngine; use crate::runtime::types::{SkillSnapshot, ToolResult}; // ============================================================================= -// ZeroClaw Format Compatibility Types +// OpenClaw Format Compatibility Types // ============================================================================= #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ZeroClawToolSchema { +pub struct OpenClawToolSchema { #[serde(rename = "type")] pub type_field: String, - pub function: ZeroClawFunction, + pub function: OpenClawFunction, } #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ZeroClawFunction { +pub struct OpenClawFunction { pub name: String, pub description: String, pub parameters: serde_json::Value, } #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ZeroClawToolResult { +pub struct OpenClawToolResult { pub success: bool, pub output: String, pub error: Option, @@ -260,16 +260,16 @@ mod desktop { } // ============================================================================= - // ZeroClaw Format Compatibility Commands + // OpenClaw Format Compatibility Commands // ============================================================================= - /// Generate ZeroClaw-compatible tool schemas from all available QuickJS tools. + /// Generate OpenClaw-compatible tool schemas from all available QuickJS tools. /// This bridges the gap between QuickJS runtime and OpenAI function calling format. #[tauri::command] pub async fn runtime_get_tool_schemas( engine: State<'_, Arc>, - ) -> Result, String> { - log::info!("🔧 [RUNTIME] Generating ZeroClaw-compatible tool schemas"); + ) -> Result, String> { + log::info!("🔧 [RUNTIME] Generating OpenClaw-compatible tool schemas"); let tools = engine.all_tools(); log::info!("🔧 [RUNTIME] Found {} tools from engine", tools.len()); @@ -290,9 +290,9 @@ mod desktop { // Convert input schema to OpenAI-compatible format let openai_parameters = convert_to_openai_schema(tool.input_schema)?; - let schema = ZeroClawToolSchema { + let schema = OpenClawToolSchema { type_field: "function".to_string(), - function: ZeroClawFunction { + function: OpenClawFunction { name: tool_name, description, parameters: openai_parameters, @@ -303,7 +303,7 @@ mod desktop { } log::info!( - "🔧 [RUNTIME] Generated {} ZeroClaw tool schemas", + "🔧 [RUNTIME] Generated {} OpenClaw tool schemas", schemas.len() ); @@ -324,17 +324,17 @@ mod desktop { } /// Execute a specific tool based on agent decision with enhanced validation. - /// This wraps the existing runtime_call_tool with ZeroClaw format compatibility. + /// This wraps the existing runtime_call_tool with OpenClaw format compatibility. #[tauri::command] pub async fn runtime_execute_tool( engine: State<'_, Arc>, tool_id: String, args: serde_json::Value, - ) -> Result { + ) -> Result { let start_time = std::time::Instant::now(); log::info!( - "🔧 [RUNTIME] Executing ZeroClaw tool: {} with args: {}", + "🔧 [RUNTIME] Executing OpenClaw tool: {} with args: {}", tool_id, args ); @@ -352,7 +352,7 @@ mod desktop { Err(e) => { log::error!("🔧 [RUNTIME] Failed to parse tool_id '{}': {}", tool_id, e); let execution_time = start_time.elapsed().as_millis() as u64; - return Ok(ZeroClawToolResult { + return Ok(OpenClawToolResult { success: false, output: String::new(), error: Some(format!("Invalid tool ID format: {}", e)), @@ -421,7 +421,7 @@ mod desktop { error_message ); - Ok(ZeroClawToolResult { + Ok(OpenClawToolResult { success: false, output: String::new(), error: Some(error_message), @@ -441,9 +441,9 @@ mod desktop { .collect::>() .join("\n"); - log::info!("ZeroClaw tool execution completed in {}ms", execution_time); + log::info!("OpenClaw tool execution completed in {}ms", execution_time); - Ok(ZeroClawToolResult { + Ok(OpenClawToolResult { success: true, output, error: None, @@ -455,7 +455,7 @@ mod desktop { let execution_time = start_time.elapsed().as_millis() as u64; log::error!("🔧 [RUNTIME] Engine call_tool failed: {}", e); - Ok(ZeroClawToolResult { + Ok(OpenClawToolResult { success: false, output: String::new(), error: Some(e), @@ -571,9 +571,9 @@ mod tests { // In a real test environment, you would mock the engine or use a test instance // For now, we'll test the struct format and serialization - let schema = ZeroClawToolSchema { + let schema = OpenClawToolSchema { type_field: "function".to_string(), - function: ZeroClawFunction { + function: OpenClawFunction { name: "test_tool".to_string(), description: "A test tool".to_string(), parameters: serde_json::json!({ @@ -596,15 +596,15 @@ mod tests { assert!(json.contains("A test tool")); // Test deserialization - let deserialized: ZeroClawToolSchema = + let deserialized: OpenClawToolSchema = serde_json::from_str(&json).expect("Should deserialize from JSON"); assert_eq!(deserialized.type_field, "function"); assert_eq!(deserialized.function.name, "test_tool"); } #[tokio::test] - async fn test_zeroclaw_tool_result_format() { - let result = ZeroClawToolResult { + async fn test_openclaw_tool_result_format() { + let result = OpenClawToolResult { success: true, output: "Test output".to_string(), error: None, @@ -618,7 +618,7 @@ mod tests { assert!(json.contains("1500")); // Test error case - let error_result = ZeroClawToolResult { + let error_result = OpenClawToolResult { success: false, output: String::new(), error: Some("Tool not found".to_string()), @@ -702,11 +702,11 @@ mod tests { } #[test] - fn test_zeroclaw_format_compliance() { - // Test that our ZeroClaw format matches expected OpenAI structure - let schema = ZeroClawToolSchema { + fn test_openclaw_format_compliance() { + // Test that our OpenClaw format matches expected OpenAI structure + let schema = OpenClawToolSchema { type_field: "function".to_string(), - function: ZeroClawFunction { + function: OpenClawFunction { name: "github_list_issues".to_string(), description: "List GitHub issues for a repository".to_string(), parameters: serde_json::json!({ @@ -740,9 +740,9 @@ mod tests { } #[test] - fn test_zeroclaw_struct_defaults() { - // Test that ZeroClaw structs can be created with serde_json - let tool_schema: ZeroClawToolSchema = serde_json::from_value(serde_json::json!({ + fn test_openclaw_struct_defaults() { + // Test that OpenClaw structs can be created with serde_json + let tool_schema: OpenClawToolSchema = serde_json::from_value(serde_json::json!({ "type": "function", "function": { "name": "test", @@ -756,7 +756,7 @@ mod tests { assert_eq!(tool_schema.function.name, "test"); // Test tool result - let tool_result: ZeroClawToolResult = serde_json::from_value(serde_json::json!({ + let tool_result: OpenClawToolResult = serde_json::from_value(serde_json::json!({ "success": true, "output": "result", "error": null, @@ -772,7 +772,7 @@ mod tests { #[test] fn test_error_handling_structures() { // Test that error scenarios can be properly serialized - let error_result = ZeroClawToolResult { + let error_result = OpenClawToolResult { success: false, output: String::new(), error: Some("Connection timeout".to_string()), @@ -785,7 +785,7 @@ mod tests { assert!(json.contains("30000")); // Test deserialization back - let parsed: ZeroClawToolResult = + let parsed: OpenClawToolResult = serde_json::from_str(&json).expect("Should parse error result"); assert!(!parsed.success); assert_eq!(parsed.error, Some("Connection timeout".to_string())); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a098a70d3..812c2f7e0 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -8,8 +8,8 @@ //! - Secure session storage //! - Native notifications -#[cfg(any(target_os = "android", target_os = "ios"))] -compile_error!("src-tauri host is desktop-only. Android/iOS support has been removed."); +#[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] +compile_error!("src-tauri host is desktop-only. Non-desktop targets are not supported."); mod commands; mod core_process; diff --git a/src/components/SkillsGrid.tsx b/src/components/SkillsGrid.tsx index f14728540..3bc3aadde 100644 --- a/src/components/SkillsGrid.tsx +++ b/src/components/SkillsGrid.tsx @@ -1,5 +1,4 @@ import { invoke } from '@tauri-apps/api/core'; -import { platform } from '@tauri-apps/plugin-os'; import { useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -111,7 +110,6 @@ export default function SkillsGrid() { const navigate = useNavigate(); const [skillsList, setSkillsList] = useState([]); const [loading, setLoading] = useState(true); - const [isMobile, setIsMobile] = useState(false); const [generating, setGenerating] = useState(false); const [selfEvolveOpen, setSelfEvolveOpen] = useState(false); const [setupModalOpen, setSetupModalOpen] = useState(false); @@ -181,17 +179,6 @@ export default function SkillsGrid() { }; useEffect(() => { - // Detect mobile platform - const detectMobile = async () => { - try { - const currentPlatform = await platform(); - setIsMobile(currentPlatform === 'android' || currentPlatform === 'ios'); - } catch { - // If we can't detect platform, assume desktop - setIsMobile(false); - } - }; - detectMobile(); refreshSkills(); }, []); @@ -219,38 +206,6 @@ export default function SkillsGrid() { }) .filter(s => IS_DEV || !s.ignoreInProduction); }, [skillsList, skillsState, skillStates]); - - // Show mobile-only message on mobile platforms - if (!loading && isMobile) { - return ( -
-

- Skills -

-
-
- - - -

Skills are available on desktop only

-

- Use the desktop app to configure and run skills -

-
-
-
- ); - } - // If loading or no skills on desktop, don't render if (loading || skillsList.length === 0) { return null; diff --git a/src/lib/skills/types.ts b/src/lib/skills/types.ts index edc44f915..08a28b8df 100644 --- a/src/lib/skills/types.ts +++ b/src/lib/skills/types.ts @@ -7,7 +7,7 @@ // Skill Manifest (from manifest.json) // --------------------------------------------------------------------------- -export type SkillPlatform = "windows" | "macos" | "linux" | "android" | "ios"; +export type SkillPlatform = "windows" | "macos" | "linux"; /** Unified registry skill type discriminant. */ export type SkillType = 'openhuman' | 'openclaw'; diff --git a/src/pages/Skills.tsx b/src/pages/Skills.tsx index f6f14f9df..25c4c65c2 100644 --- a/src/pages/Skills.tsx +++ b/src/pages/Skills.tsx @@ -1,5 +1,4 @@ import { invoke } from '@tauri-apps/api/core'; -import { platform } from '@tauri-apps/plugin-os'; import { useEffect, useMemo, useState } from 'react'; import { @@ -203,17 +202,6 @@ export default function Skills() { useEffect(() => { const loadSkills = async () => { try { - // Check if mobile - try { - const p = await platform(); - if (p === 'android' || p === 'ios') { - setSkillsLoading(false); - return; - } - } catch { - // not Tauri env - } - const manifests = await invoke>>('runtime_discover_skills'); const ALLOWED_SKILLS = new Set(['gmail', 'notion']); const validManifests = manifests.filter(m => { diff --git a/src/services/__tests__/agentToolRegistry.test.ts b/src/services/__tests__/agentToolRegistry.test.ts index bc9ab1c0f..0a5f2dc00 100644 --- a/src/services/__tests__/agentToolRegistry.test.ts +++ b/src/services/__tests__/agentToolRegistry.test.ts @@ -17,7 +17,7 @@ describe('AgentToolRegistry', () => { }); describe('loadToolSchemas', () => { - test('should load tool schemas from Tauri using ZeroClaw format', async () => { + test('should load tool schemas from Tauri using OpenClaw format', async () => { const mockSchemas = [ { type: 'function', @@ -128,7 +128,7 @@ describe('AgentToolRegistry', () => { }); describe('executeTool', () => { - test('should execute tool using ZeroClaw format with success', async () => { + test('should execute tool using OpenClaw format with success', async () => { const mockResult = { success: true, output: '{"issues": [{"title": "Bug fix", "number": 1}]}', diff --git a/src/services/agentToolRegistry.ts b/src/services/agentToolRegistry.ts index e183fa1e8..4febb2e47 100644 --- a/src/services/agentToolRegistry.ts +++ b/src/services/agentToolRegistry.ts @@ -10,13 +10,13 @@ import { invoke } from '@tauri-apps/api/core'; import type { AgentToolExecution, AgentToolSchema, IAgentToolRegistry } from '../types/agent'; -// ZeroClaw format types from Rust -interface ZeroClawToolSchema { +// OpenClaw format types from Rust +interface OpenClawToolSchema { type: string; function: { name: string; description: string; parameters: Record }; } -interface ZeroClawToolResult { +interface OpenClawToolResult { success: boolean; output: string; error?: string; @@ -58,7 +58,7 @@ export class AgentToolRegistry implements IAgentToolRegistry { // 2. Load other tools from skill system (fallback for non-Telegram) try { console.log('🔧 Loading non-Telegram tools from skill system...'); - const skillTools = await invoke('runtime_get_tool_schemas'); + const skillTools = await invoke('runtime_get_tool_schemas'); // Filter out telegram tools to avoid duplicates const nonTelegramTools = skillTools.filter( @@ -141,7 +141,7 @@ export class AgentToolRegistry implements IAgentToolRegistry { toolName.includes('tg') || this.extractCategoryFromSkillId(skillId).includes('Telegram'); - let result: ZeroClawToolResult; + let result: OpenClawToolResult; if (isTelegramTool) { // Telegram tools no longer available @@ -159,7 +159,7 @@ export class AgentToolRegistry implements IAgentToolRegistry { console.log(` args: ${toolArguments}`); console.log(` args type: ${typeof toolArguments}`); - result = await invoke('runtime_execute_tool', { + result = await invoke('runtime_execute_tool', { toolId, args: toolArguments, }); diff --git a/src/store/index.ts b/src/store/index.ts index e4ac17f75..d4a549476 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -126,7 +126,7 @@ export const store = configureStore({ setStoreForApiClient(() => store.getState().auth.token); export const persistor = persistStore(store, null, () => { - // Dev-only: auto-inject JWT token for testing (e.g. Android without login flow) + // Dev-only: auto-inject JWT token for local testing without login flow. const devToken = import.meta.env.VITE_DEV_JWT_TOKEN; if (devToken && !store.getState().auth.token) { store.dispatch(setToken(devToken)); diff --git a/src/types/agent.ts b/src/types/agent.ts index cef16622a..673500dec 100644 --- a/src/types/agent.ts +++ b/src/types/agent.ts @@ -2,7 +2,7 @@ * Agent Tool Registry Types * * Minimal type definitions for agent tool registry functionality. - * Based on ZeroClaw compatibility requirements. + * Based on OpenClaw compatibility requirements. */ /**