Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apps/desktop/loopx-control-plane/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,14 @@ secret. Updater signing does not provide Apple notarization. It also does not
change Goal authority, grant capabilities, or stop running agents on behalf of
the user. Services may briefly disconnect during reconciliation.

The optional startup feed check has a three-second deadline so an unavailable
update server cannot hold workspace startup indefinitely. A manual **Check for updates**
allows 45 seconds for the same official feed, including redirects; the panel
keeps showing its checking state while the existing workspace remains readable.
A timeout remains an explicit retryable error, never a claim that the App is
current. The separate 30-second download/signature-verification deadline and

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P3] 将30秒明确为下载请求超时即可。perform 将 Update.timeout 设为30s;锁定的 tauri-plugin-updater2.11.0 Update::download 把它用于 reqwest,读取完整字节流后才同步调用 verify_signature,没有额外30秒验签计时器。建议写成“30-second download-request timeout; signature verification and installation/recovery rules are unchanged”。这是非阻塞的文档精度建议,不影响45/3秒检查预算的批准结论。

installation/recovery boundaries are unchanged.

Published macOS preview artifacts use ad-hoc code signing to verify bundle
integrity without requiring an Apple Developer account. They are not signed
with a Developer ID and are not notarized, so macOS may require the operator
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 9 additions & 4 deletions apps/desktop/loopx-control-plane/src-tauri/src/maintenance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,9 @@ pub async fn desktop_update(
app.restart();
}
state.manual_failure_pending.store(false, Ordering::Release);
let outcome = perform(&app, &action, &channel, url).await;
// A user-requested check may cross a slow release-feed redirect. It is
// asynchronous and should not inherit the optional startup check's budget.
let outcome = perform(&app, &action, &channel, url, Duration::from_secs(45)).await;
if let Err(error) = &outcome {
state.publish_manual_failure(error, &channel);
}
Expand Down Expand Up @@ -462,6 +464,7 @@ async fn perform(
action: &str,
channel: &str,
url: tauri::Url,
check_timeout: Duration,
) -> Result<Value, String> {
let state = app.state::<Maintenance>();
if action == "forget_runtime_selection" {
Expand All @@ -483,7 +486,7 @@ async fn perform(
})
.endpoints(vec![url])
.map_err(|_| "update_unavailable")?
.timeout(Duration::from_secs(3))
.timeout(check_timeout)
.build()
.map_err(|_| "update_unavailable")?
.check()
Expand Down Expand Up @@ -849,11 +852,13 @@ fn automatic_app_update(app: &AppHandle) {
channel,
async {
let url = endpoint(channel)?;
let checked = perform(app, "check", channel, url.clone()).await?;
// Keep the optional feed lookup on the startup path bounded.
let checked =
perform(app, "check", channel, url.clone(), Duration::from_secs(3)).await?;
Ok((checked["phase"] == "available").then_some(url))
},
|url| async move {
perform(app, "apply", channel, url).await?;
perform(app, "apply", channel, url, Duration::from_secs(3)).await?;
Ok(())
},
|| app.restart(),
Expand Down
Loading