From c65a0961d18c862d257c015b471b4dd66fce89f6 Mon Sep 17 00:00:00 2001 From: kaiji95 <762907794@qq.com> Date: Mon, 6 Apr 2026 17:33:47 +0800 Subject: [PATCH 1/2] feat(python-sdk): add shared packaged python runtime for plugins --- Cargo.lock | 4 + Cargo.toml | 2 +- .../peekoo-plugin-host/src/host_functions.rs | 76 +++++++++++++++++-- crates/peekoo-python-sdk/Cargo.toml | 8 ++ .../scripts/build_runtime_package.sh | 56 ++++++++++++++ .../scripts/install_runtime_package.sh | 21 +++++ crates/peekoo-python-sdk/src/lib.rs | 39 ++++++++++ justfile | 30 ++++++++ plugins/mijia-smart-home/Cargo.toml | 1 + plugins/mijia-smart-home/README.md | 43 +++++++++++ .../companions/requirements.txt | 3 + plugins/mijia-smart-home/src/lib.rs | 31 ++++++-- 12 files changed, 303 insertions(+), 11 deletions(-) create mode 100644 crates/peekoo-python-sdk/Cargo.toml create mode 100755 crates/peekoo-python-sdk/scripts/build_runtime_package.sh create mode 100755 crates/peekoo-python-sdk/scripts/install_runtime_package.sh create mode 100644 crates/peekoo-python-sdk/src/lib.rs create mode 100644 plugins/mijia-smart-home/README.md create mode 100644 plugins/mijia-smart-home/companions/requirements.txt diff --git a/Cargo.lock b/Cargo.lock index a56cfba4..cccaffb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4802,6 +4802,10 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "peekoo-python-sdk" +version = "0.1.0" + [[package]] name = "peekoo-scheduler" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index a133f2bf..b6a4e1e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ members = [ "crates/acp-registry-client", "crates/peekoo-mcp-server", "crates/peekoo-analytics", + "crates/peekoo-python-sdk", "apps/desktop-tauri/src-tauri", ] resolver = "2" @@ -42,4 +43,3 @@ strip = true - diff --git a/crates/peekoo-plugin-host/src/host_functions.rs b/crates/peekoo-plugin-host/src/host_functions.rs index 7306fb3d..9ae156f1 100644 --- a/crates/peekoo-plugin-host/src/host_functions.rs +++ b/crates/peekoo-plugin-host/src/host_functions.rs @@ -884,13 +884,32 @@ fn host_process_exec( ) -> Result<(), Error> { let ctx = user_data.get().map_err(|e| Error::msg(format!("{e}")))?; let ctx = ctx.lock().map_err(|e| Error::msg(format!("{e}")))?; - require_declared_capability(&ctx, "process:exec")?; + if let Err(err) = require_declared_capability(&ctx, "process:exec") { + let response = serde_json::json!({ + "ok": false, + "statusCode": -1, + "stdout": "", + "stderr": err.to_string(), + }) + .to_string(); + write_output(plugin, outputs, &response)?; + return Ok(()); + } + let input_str = read_input(plugin, inputs)?; let req: serde_json::Value = serde_json::from_str(&input_str).unwrap_or_default(); let program = req["program"].as_str().unwrap_or_default().trim(); if program.is_empty() { - return Err(Error::msg("process program is required")); + let response = serde_json::json!({ + "ok": false, + "statusCode": -1, + "stdout": "", + "stderr": "process program is required", + }) + .to_string(); + write_output(plugin, outputs, &response)?; + return Ok(()); } let args = req["args"] @@ -903,13 +922,44 @@ fn host_process_exec( .unwrap_or_default(); let cwd = req["cwd"].as_str().unwrap_or("."); - let resolved_cwd = resolve_process_cwd(&ctx, cwd)?; + let resolved_cwd = match resolve_process_cwd(&ctx, cwd) { + Ok(path) => path, + Err(err) => { + let response = serde_json::json!({ + "ok": false, + "statusCode": -1, + "stdout": "", + "stderr": err.to_string(), + }) + .to_string(); + write_output(plugin, outputs, &response)?; + return Ok(()); + } + }; - let output = Command::new(program) + let resolved_program = resolve_process_program(program, &resolved_cwd); + let output = match Command::new(&resolved_program) .args(&args) .current_dir(&resolved_cwd) .output() - .map_err(|e| Error::msg(format!("Process spawn failed: {e}")))?; + { + Ok(output) => output, + Err(e) => { + let response = serde_json::json!({ + "ok": false, + "statusCode": -1, + "stdout": "", + "stderr": format!( + "Process spawn failed: program='{}' cwd='{}' ({e})", + resolved_program.display(), + resolved_cwd.display() + ), + }) + .to_string(); + write_output(plugin, outputs, &response)?; + return Ok(()); + } + }; let stdout = String::from_utf8_lossy(&output.stdout).to_string(); let stderr = String::from_utf8_lossy(&output.stderr).to_string(); @@ -930,6 +980,22 @@ fn host_process_exec( Ok(()) } +fn resolve_process_program(program: &str, cwd: &Path) -> PathBuf { + let expanded = expand_tilde_path(program); + let candidate = PathBuf::from(expanded); + if candidate.is_absolute() { + return candidate; + } + + // Keep PATH lookup behavior for plain command names (e.g. "python3"). + let has_path_separator = program.contains('/') || program.contains('\\'); + if !has_path_separator { + return candidate; + } + + cwd.join(candidate) +} + fn host_set_mood( plugin: &mut CurrentPlugin, inputs: &[Val], diff --git a/crates/peekoo-python-sdk/Cargo.toml b/crates/peekoo-python-sdk/Cargo.toml new file mode 100644 index 00000000..f71fcd99 --- /dev/null +++ b/crates/peekoo-python-sdk/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "peekoo-python-sdk" +version = "0.1.0" +edition = "2024" +license = "MIT" + +[lib] +path = "src/lib.rs" diff --git a/crates/peekoo-python-sdk/scripts/build_runtime_package.sh b/crates/peekoo-python-sdk/scripts/build_runtime_package.sh new file mode 100755 index 00000000..023c191d --- /dev/null +++ b/crates/peekoo-python-sdk/scripts/build_runtime_package.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +set -euo pipefail + +REQ_FILE="${1:-}" +OUT_FILE="${2:-}" + +if [[ -z "$REQ_FILE" || -z "$OUT_FILE" ]]; then + echo "usage: $0 " >&2 + exit 1 +fi + +if [[ ! -f "$REQ_FILE" ]]; then + echo "requirements file not found: $REQ_FILE" >&2 + exit 1 +fi + +platform="$(uname -s | tr '[:upper:]' '[:lower:]')" +arch="$(uname -m)" +case "$platform:$arch" in + darwin:arm64) target_triple="aarch64-apple-darwin" ;; + darwin:x86_64) target_triple="x86_64-apple-darwin" ;; + linux:x86_64) target_triple="x86_64-unknown-linux-gnu" ;; + linux:aarch64) target_triple="aarch64-unknown-linux-gnu" ;; + *) + echo "unsupported platform: $platform/$arch" >&2 + exit 1 + ;; +esac + +release_tag="${PEEKOO_PYTHON_STANDALONE_TAG:-20250317}" +archive_url="${PEEKOO_PYTHON_STANDALONE_URL:-https://github.com/indygreg/python-build-standalone/releases/download/${release_tag}/cpython-3.12.9+${release_tag}-${target_triple}-install_only.tar.gz}" + +workdir="$(mktemp -d)" +trap 'rm -rf "$workdir"' EXIT + +archive_path="$workdir/python-runtime.tar.gz" +curl -fL "$archive_url" -o "$archive_path" +tar -xzf "$archive_path" -C "$workdir" + +if [[ -x "$workdir/python/bin/python3" ]]; then + py_bin="$workdir/python/bin/python3" +elif [[ -x "$workdir/python/bin/python" ]]; then + py_bin="$workdir/python/bin/python" +else + echo "python binary not found in extracted runtime" >&2 + exit 1 +fi + +"$py_bin" -m ensurepip --upgrade || true +"$py_bin" -m pip install --upgrade pip setuptools wheel +"$py_bin" -m pip install --no-cache-dir -r "$REQ_FILE" + +mkdir -p "$(dirname "$OUT_FILE")" +tar -czf "$OUT_FILE" -C "$workdir" python + +echo "Python runtime package created: $OUT_FILE" diff --git a/crates/peekoo-python-sdk/scripts/install_runtime_package.sh b/crates/peekoo-python-sdk/scripts/install_runtime_package.sh new file mode 100755 index 00000000..f864603c --- /dev/null +++ b/crates/peekoo-python-sdk/scripts/install_runtime_package.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -euo pipefail + +PACKAGE_FILE="${1:-}" +TARGET_DIR="${2:-$HOME/.peekoo/python-sdk}" + +if [[ -z "$PACKAGE_FILE" ]]; then + echo "usage: $0 [target-dir]" >&2 + exit 1 +fi + +if [[ ! -f "$PACKAGE_FILE" ]]; then + echo "package file not found: $PACKAGE_FILE" >&2 + exit 1 +fi + +mkdir -p "$TARGET_DIR" +rm -rf "$TARGET_DIR/python" +tar -xzf "$PACKAGE_FILE" -C "$TARGET_DIR" + +echo "Python runtime installed to: $TARGET_DIR/python" diff --git a/crates/peekoo-python-sdk/src/lib.rs b/crates/peekoo-python-sdk/src/lib.rs new file mode 100644 index 00000000..df79f074 --- /dev/null +++ b/crates/peekoo-python-sdk/src/lib.rs @@ -0,0 +1,39 @@ +pub const SHARED_PYTHON_SDK_ROOT: &str = "~/.peekoo/python-sdk"; + +pub fn shared_python_candidates() -> Vec { + vec![ + format!("{SHARED_PYTHON_SDK_ROOT}/python/bin/python3"), + format!("{SHARED_PYTHON_SDK_ROOT}/python/bin/python"), + format!("{SHARED_PYTHON_SDK_ROOT}/python/python.exe"), + format!("{SHARED_PYTHON_SDK_ROOT}/python/bin/python.exe"), + ] +} + +pub fn plugin_local_python_candidates() -> Vec { + vec![ + "runtime/python/bin/python3".to_string(), + "runtime/python/bin/python".to_string(), + "runtime/python/python.exe".to_string(), + "runtime/python/bin/python.exe".to_string(), + ] +} + +pub fn system_python_candidates() -> Vec { + vec![ + "python3".to_string(), + "python".to_string(), + "py".to_string(), + ] +} + +pub fn all_python_candidates() -> Vec { + let mut out = Vec::new(); + out.extend(shared_python_candidates()); + out.extend(plugin_local_python_candidates()); + out.extend(system_python_candidates()); + out +} + +pub fn is_spawn_error_message(message: &str) -> bool { + message.contains("Process spawn failed") +} diff --git a/justfile b/justfile index 6e89f789..53b84418 100644 --- a/justfile +++ b/justfile @@ -82,6 +82,8 @@ plugin-install name: python -c "import pathlib, shutil, tomllib; src = pathlib.Path('plugins/{{name}}'); manifest = tomllib.loads((src / 'peekoo-plugin.toml').read_text()); wasm_rel = pathlib.Path(manifest['plugin']['wasm']); wasm_src = src / wasm_rel; wasm_dst = pathlib.Path.home() / '.peekoo' / 'plugins' / '{{name}}' / wasm_rel; wasm_dst.parent.mkdir(parents=True, exist_ok=True); shutil.copy2(wasm_src, wasm_dst)" if [ -d plugins/{{name}}/ui ]; then cp -r plugins/{{name}}/ui ~/.peekoo/plugins/{{name}}/; fi if [ -d plugins/{{name}}/companions ]; then cp -r plugins/{{name}}/companions ~/.peekoo/plugins/{{name}}/; fi + if [ -d plugins/{{name}}/runtime ]; then cp -r plugins/{{name}}/runtime ~/.peekoo/plugins/{{name}}/; fi + if [ -d plugins/{{name}}/vendor ]; then cp -r plugins/{{name}}/vendor ~/.peekoo/plugins/{{name}}/; fi # Install an AssemblyScript plugin into the local Peekoo plugin dir plugin-install-as name: @@ -92,6 +94,34 @@ plugin-install-as name: # Build and install a Rust plugin plugin name: (plugin-build name) (plugin-install name) +# Build a reusable Python SDK runtime package from requirements +python-sdk-package requirements output: + bash crates/peekoo-python-sdk/scripts/build_runtime_package.sh {{requirements}} {{output}} + +# Install a packaged Python SDK runtime into a target directory +python-sdk-install package target_dir: + bash crates/peekoo-python-sdk/scripts/install_runtime_package.sh {{package}} {{target_dir}} + +# Install a packaged Python SDK runtime into default shared Peekoo directory +python-sdk-install-default package: + bash crates/peekoo-python-sdk/scripts/install_runtime_package.sh {{package}} "$HOME/.peekoo/python-sdk" + +# Build and install shared Python SDK runtime for Mijia plugin +plugin-install-mijia-python-sdk: + #!/usr/bin/env bash + set -euo pipefail + pkg="$(mktemp -t peekoo-mijia-python-sdk.XXXXXX).tar.gz" + bash crates/peekoo-python-sdk/scripts/build_runtime_package.sh \ + plugins/mijia-smart-home/companions/requirements.txt \ + "$pkg" + bash crates/peekoo-python-sdk/scripts/install_runtime_package.sh \ + "$pkg" \ + "$HOME/.peekoo/python-sdk" + rm -f "$pkg" + +# Build runtime, compile WASM, then install Mijia plugin +plugin-mijia-smart-home: plugin-install-mijia-python-sdk (plugin-build "mijia-smart-home") (plugin-install "mijia-smart-home") + # Build all maintained first-party plugins plugin-build-all: just plugin-build health-reminders diff --git a/plugins/mijia-smart-home/Cargo.toml b/plugins/mijia-smart-home/Cargo.toml index c5f003e5..06225bdf 100644 --- a/plugins/mijia-smart-home/Cargo.toml +++ b/plugins/mijia-smart-home/Cargo.toml @@ -10,6 +10,7 @@ crate-type = ["cdylib"] [dependencies] peekoo-plugin-sdk = { path = "../../crates/peekoo-plugin-sdk" } +peekoo-python-sdk = { path = "../../crates/peekoo-python-sdk" } extism-pdk = "1.4" serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/plugins/mijia-smart-home/README.md b/plugins/mijia-smart-home/README.md new file mode 100644 index 00000000..b5ef405c --- /dev/null +++ b/plugins/mijia-smart-home/README.md @@ -0,0 +1,43 @@ +# Mijia Smart Home Plugin + +This plugin runs on the shared Peekoo Python SDK runtime, so end users do not need system Python installed. + +## Build shared Python SDK runtime + +```bash +just plugin-install-mijia-python-sdk +``` + +This script will: +- build a standalone Python runtime package with Mijia dependencies +- install it to `~/.peekoo/python-sdk/python` +- install Python dependencies from `companions/requirements.txt` + +You can override the runtime archive URL: + +```bash +PEEKOO_PYTHON_STANDALONE_URL="" just plugin-install-mijia-python-sdk +``` + +## Build and install plugin + +```bash +just plugin-mijia-smart-home +``` + +This command packages runtime + builds WASM + installs the plugin to `~/.peekoo/plugins/mijia-smart-home`. + +## Runtime lookup order + +At runtime, the plugin tries Python interpreters in this order: +1. `~/.peekoo/python-sdk/python/bin/python3` +2. `~/.peekoo/python-sdk/python/bin/python` +3. `~/.peekoo/python-sdk/python/python.exe` +4. `~/.peekoo/python-sdk/python/bin/python.exe` +5. `runtime/python/bin/python3` (plugin-local fallback) +6. `runtime/python/bin/python` (plugin-local fallback) +7. `runtime/python/python.exe` (plugin-local fallback) +8. `runtime/python/bin/python.exe` (plugin-local fallback) +9. system `python3` +10. system `python` +11. system `py` diff --git a/plugins/mijia-smart-home/companions/requirements.txt b/plugins/mijia-smart-home/companions/requirements.txt new file mode 100644 index 00000000..875d52ad --- /dev/null +++ b/plugins/mijia-smart-home/companions/requirements.txt @@ -0,0 +1,3 @@ +requests>=2.31,<3 +qrcode>=7.4,<9 +mijiaAPI @ git+https://github.com/Do1e/mijia-api.git diff --git a/plugins/mijia-smart-home/src/lib.rs b/plugins/mijia-smart-home/src/lib.rs index 96783a77..6254beac 100644 --- a/plugins/mijia-smart-home/src/lib.rs +++ b/plugins/mijia-smart-home/src/lib.rs @@ -1,6 +1,7 @@ #![no_main] use peekoo_plugin_sdk::prelude::*; +use peekoo_python_sdk::{all_python_candidates, is_spawn_error_message}; use serde_json::{Value, json}; #[plugin_fn] @@ -20,8 +21,8 @@ struct MijiaBridgeInput { payload: Value, } -fn python_candidates() -> Vec<&'static str> { - vec!["python", "python3"] +fn python_candidates() -> Vec { + all_python_candidates() } fn run_bridge_once(program: &str, action: &str, payload_json: &str) -> FnResult { @@ -30,7 +31,16 @@ fn run_bridge_once(program: &str, action: &str, payload_json: &str) -> FnResult< action.to_string(), payload_json.to_string(), ]; - let result = peekoo::process::exec(program, &args, Some("."))?; + let result = match peekoo::process::exec(program, &args, Some(".")) { + Ok(result) => result, + Err(err) => { + return Ok(json!({ + "success": false, + "message": format!("process exec failed: {err}") + }) + .to_string()); + } + }; if result.ok { return Ok(result.stdout.trim().to_string()); } @@ -68,7 +78,7 @@ pub fn tool_mijia_bridge(Json(input): Json) -> FnResult(&out) { let success = parsed .get("success") @@ -77,6 +87,17 @@ pub fn tool_mijia_bridge(Json(input): Json) -> FnResult) -> FnResult Date: Mon, 6 Apr 2026 17:34:55 +0800 Subject: [PATCH 2/2] fix mijia plugin --- .../src-tauri/gen/schemas/macOS-schema.json | 96 ++++++++++++++++++ crates/peekoo-plugin-sdk/src/lib.rs | 2 + .../companions/mijia_bridge.py | 4 +- plugins/mijia-smart-home/peekoo-plugin.toml | 4 +- .../release/mijia_smart_home.wasm | Bin 328217 -> 334575 bytes plugins/mijia-smart-home/ui/panel.html | 40 +++++++- 6 files changed, 137 insertions(+), 9 deletions(-) diff --git a/apps/desktop-tauri/src-tauri/gen/schemas/macOS-schema.json b/apps/desktop-tauri/src-tauri/gen/schemas/macOS-schema.json index e8c95528..8a206235 100644 --- a/apps/desktop-tauri/src-tauri/gen/schemas/macOS-schema.json +++ b/apps/desktop-tauri/src-tauri/gen/schemas/macOS-schema.json @@ -2636,6 +2636,60 @@ "const": "notification:deny-show", "markdownDescription": "Denies the show command without any pre-configured scope." }, + { + "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-capture`\n- `allow-identify`\n- `allow-alias`\n- `allow-reset`\n- `allow-get-distinct-id`\n- `allow-get-config`", + "type": "string", + "const": "posthog:default", + "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-capture`\n- `allow-identify`\n- `allow-alias`\n- `allow-reset`\n- `allow-get-distinct-id`\n- `allow-get-config`" + }, + { + "description": "Allows creating user aliases in PostHog", + "type": "string", + "const": "posthog:allow-alias", + "markdownDescription": "Allows creating user aliases in PostHog" + }, + { + "description": "Allows capturing PostHog events", + "type": "string", + "const": "posthog:allow-capture", + "markdownDescription": "Allows capturing PostHog events" + }, + { + "description": "Allows getting PostHog configuration for frontend initialization", + "type": "string", + "const": "posthog:allow-get-config", + "markdownDescription": "Allows getting PostHog configuration for frontend initialization" + }, + { + "description": "Allows getting the current distinct ID", + "type": "string", + "const": "posthog:allow-get-distinct-id", + "markdownDescription": "Allows getting the current distinct ID" + }, + { + "description": "Allows identifying users in PostHog", + "type": "string", + "const": "posthog:allow-identify", + "markdownDescription": "Allows identifying users in PostHog" + }, + { + "description": "Enables the ping command without any pre-configured scope.", + "type": "string", + "const": "posthog:allow-ping", + "markdownDescription": "Enables the ping command without any pre-configured scope." + }, + { + "description": "Allows resetting user data in PostHog", + "type": "string", + "const": "posthog:allow-reset", + "markdownDescription": "Allows resetting user data in PostHog" + }, + { + "description": "Denies the ping command without any pre-configured scope.", + "type": "string", + "const": "posthog:deny-ping", + "markdownDescription": "Denies the ping command without any pre-configured scope." + }, { "description": "This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n\n#### This default permission set includes:\n\n- `allow-exit`\n- `allow-restart`", "type": "string", @@ -2666,6 +2720,48 @@ "const": "process:deny-restart", "markdownDescription": "Denies the restart command without any pre-configured scope." }, + { + "description": "Allows all required permissions (envelope, breadcrumb)\n#### This default permission set includes:\n\n- `allow-envelope`\n- `allow-breadcrumb`", + "type": "string", + "const": "sentry:default", + "markdownDescription": "Allows all required permissions (envelope, breadcrumb)\n#### This default permission set includes:\n\n- `allow-envelope`\n- `allow-breadcrumb`" + }, + { + "description": "Enables the breadcrumb command.", + "type": "string", + "const": "sentry:allow-breadcrumb", + "markdownDescription": "Enables the breadcrumb command." + }, + { + "description": "Enables the envelope command.", + "type": "string", + "const": "sentry:allow-envelope", + "markdownDescription": "Enables the envelope command." + }, + { + "description": "Enables the event command without any pre-configured scope.", + "type": "string", + "const": "sentry:allow-event", + "markdownDescription": "Enables the event command without any pre-configured scope." + }, + { + "description": "Denies the breadcrumb command.", + "type": "string", + "const": "sentry:deny-breadcrumb", + "markdownDescription": "Denies the breadcrumb command." + }, + { + "description": "Denies the envelope command.", + "type": "string", + "const": "sentry:deny-envelope", + "markdownDescription": "Denies the envelope command." + }, + { + "description": "Denies the event command without any pre-configured scope.", + "type": "string", + "const": "sentry:deny-event", + "markdownDescription": "Denies the event command without any pre-configured scope." + }, { "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "type": "string", diff --git a/crates/peekoo-plugin-sdk/src/lib.rs b/crates/peekoo-plugin-sdk/src/lib.rs index 2b5f1f5b..f893baaf 100644 --- a/crates/peekoo-plugin-sdk/src/lib.rs +++ b/crates/peekoo-plugin-sdk/src/lib.rs @@ -96,6 +96,7 @@ pub mod log; pub mod mood; pub mod notify; pub mod oauth; +pub mod process; pub mod schedule; pub mod secrets; pub mod state; @@ -125,6 +126,7 @@ pub mod peekoo { pub use crate::mood; pub use crate::notify; pub use crate::oauth; + pub use crate::process; pub use crate::schedule; pub use crate::secrets; pub use crate::state; diff --git a/plugins/mijia-smart-home/companions/mijia_bridge.py b/plugins/mijia-smart-home/companions/mijia_bridge.py index 0fba6700..acbd3889 100644 --- a/plugins/mijia-smart-home/companions/mijia_bridge.py +++ b/plugins/mijia-smart-home/companions/mijia_bridge.py @@ -698,7 +698,7 @@ def main(): emit( { "success": False, - "message": "Python package mijiaAPI not found. Install it with: pip install mijiaAPI", + "message": "Python package mijiaAPI not found in runtime. Repackage the plugin runtime or install with: pip install mijiaAPI", "code": "mijia_api_missing", }, 1, @@ -707,7 +707,7 @@ def main(): emit( { "success": False, - "message": "Python package requests not found. Install it with: pip install requests", + "message": "Python package requests not found in runtime. Repackage the plugin runtime or install with: pip install requests", "code": "requests_missing", }, 1, diff --git a/plugins/mijia-smart-home/peekoo-plugin.toml b/plugins/mijia-smart-home/peekoo-plugin.toml index 0703ea45..704c8ffd 100644 --- a/plugins/mijia-smart-home/peekoo-plugin.toml +++ b/plugins/mijia-smart-home/peekoo-plugin.toml @@ -8,8 +8,8 @@ min_peekoo_version = "0.1.0" wasm = "target/wasm32-wasip1/release/mijia_smart_home.wasm" [permissions] -required = [] -optional = ["process:exec"] +required = ["process:exec"] +optional = [] [[tools.definitions]] name = "mijia_bridge" diff --git a/plugins/mijia-smart-home/target/wasm32-wasip1/release/mijia_smart_home.wasm b/plugins/mijia-smart-home/target/wasm32-wasip1/release/mijia_smart_home.wasm index 2acf9e8b492695143a203a0e17328342fed85c3a..cc33d1852ff2f459b9938ba3943935d545ab4844 100755 GIT binary patch delta 66726 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%0Dqo`3|vaKKW)dB7t8 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 diff --git a/plugins/mijia-smart-home/ui/panel.html b/plugins/mijia-smart-home/ui/panel.html index 38f3e046..5bb5521f 100644 --- a/plugins/mijia-smart-home/ui/panel.html +++ b/plugins/mijia-smart-home/ui/panel.html @@ -1277,6 +1277,18 @@

Room Filter

resetDetail(); } + function showQrPlaceholder(message = "") { + const wrap = el("qrWrap"); + const img = el("qrImage"); + if (!wrap || !img) return; + img.removeAttribute("src"); + img.style.display = "none"; + wrap.classList.add("show"); + if (message) { + setStatus(message, "error"); + } + } + function stopLoginPolling() { state.loginPolling = false; if (state.loginPollTimer) { @@ -1292,7 +1304,7 @@

Room Filter

const run = async () => { if (!state.loginPolling || state.authenticated) return; try { - const result = await callBridge("login_finish", { timeout_secs: 20 }); + const result = await callBridge("login_finish", { timeout_secs: 8 }); if (result.authenticated) { state.authenticated = true; stopLoginPolling(); @@ -1309,8 +1321,22 @@

Room Filter

} } catch (err) { const msg = err?.message || String(err); - // Polling timeout is expected before user confirms in app. - if (!msg.toLowerCase().includes("timed out")) { + if (msg.includes("No pending login session found")) { + stopLoginPolling(); + await startLogin(); + return; + } + // Polling timeout is expected before/around user confirmation. + // Keep polling silently to avoid flashing transient timeout errors. + const lower = msg.toLowerCase(); + if ( + lower.includes("timed out") || + lower.includes("timeout") || + lower.includes("time-out") || + msg.includes("超时") + ) { + // no-op + } else { setStatus(msg, "error"); } } @@ -2317,13 +2343,17 @@

Room Filter

} if (data.qr_url) { - el("qrImage").src = data.qr_url; + const img = el("qrImage"); + img.src = data.qr_url; + img.style.display = "block"; el("qrWrap").classList.add("show"); + } else { + showQrPlaceholder("QR code is not ready yet. Tap to regenerate."); } setStatus(""); scheduleLoginPolling(); } catch (err) { - setStatus(err.message || String(err), "error"); + showQrPlaceholder(err.message || String(err)); } finally { setLoading(false); }