cicy-desktop 2.1.229 → 2.1.231

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -153,25 +153,6 @@ jobs:
153
153
  Write-Host "Skip latest: building $version < published $cur (older build — not clobbering newer latest)"
154
154
  }
155
155
 
156
- # 4) Prune —— releases/ 下带版本号的 exe 只保留最新 2 个,更旧的删掉(省 OSS 空间)。
157
- # 只匹配 cicy-desktop-<semver>.exe;latest / win-latest 指针不含 semver、永远保留。
158
- # 非致命:prune 失败只告警,不影响发版。
159
- try {
160
- $listing = & $oss ls "$base/cicy-desktop-" -s 2>$null
161
- $verExes = @()
162
- foreach ($line in $listing) {
163
- if ($line -match 'cicy-desktop-(\d+\.\d+\.\d+)\.exe$') {
164
- $verExes += [PSCustomObject]@{ Key = $line.Trim(); Ver = [version]$matches[1] }
165
- }
166
- }
167
- $toDelete = @($verExes | Sort-Object Ver -Descending | Select-Object -Skip 2)
168
- foreach ($o in $toDelete) {
169
- Write-Host "Pruning old EXE: $($o.Key)"
170
- & $oss rm "$($o.Key)" -f 2>$null
171
- }
172
- Write-Host "Prune done: kept newest 2 of $($verExes.Count) versioned exe(s), deleted $($toDelete.Count)"
173
- } catch { Write-Host "::warning::OSS prune skipped: $_" }
174
-
175
156
  # 3) 保留策略 — 只留最近 $KEEP 个版本化 exe(~130MB/个),旧的删掉,避免 OSS 无限膨胀。
176
157
  # latest.exe / latest-version.txt 不在此列(名字不匹配 X.Y.Z),永远保留。
177
158
  $KEEP = 2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cicy-desktop",
3
- "version": "2.1.229",
3
+ "version": "2.1.231",
4
4
  "description": "CiCy - AI-powered operating system browser",
5
5
  "main": "src/main.js",
6
6
  "bin": {
@@ -6,7 +6,7 @@
6
6
  // → 下完「ready」→ 用户点安装 → 拉起原生安装器并退出 app。
7
7
  //
8
8
  // 源(分网络 + 分平台):
9
- // 版本清单 CN → OSS releases/latest-version.txt;非 CN → GitHub releases/latest
9
+ // 版本清单 CN → OSS releases/{win,mac}-latest-version.txt(按平台);非 CN → GitHub releases/latest
10
10
  // Windows → OSS cicy-desktop-<ver>.exe (GitHub 不发 win 包)
11
11
  // macOS → GitHub cicy-desktop-<ver>-<arch>.pkg (CN 经 ghproxy 兜底)
12
12
  // Linux → GitHub CiCy-Desktop-<ver>.AppImage (CN 经 ghproxy 兜底)
@@ -88,8 +88,14 @@ function headOk(url, redirects = 0) {
88
88
  // ── 最新版本号 ────────────────────────────────────────────────────────────────
89
89
  async function fetchLatestVersion(network) {
90
90
  if (network === "cn") {
91
- // CN:OSS 版本清单(纯文本 "2.1.200")
92
- return (await getText(`${OSS_RELEASES_BASE}/latest-version.txt`)).trim().replace(/^v/, "");
91
+ // CN:OSS 版本清单(纯文本 "2.1.200")。**按平台读各自的指针** —— win 和 mac 是两条独立
92
+ // CI、分别构建上传、版本可能不同步;都读裸名 latest-version.txt(只由 Windows CI 写)会让
93
+ // mac 客户端拿到 Windows 的版本号 → 去下不存在的 mac 包 → 404。win→win-、mac→mac-,
94
+ // linux 没有独立 OSS 指针、沿用裸名(与 win 同 tag 同步发布,且 linux 实际走 GitHub 下载)。
95
+ const file = process.platform === "win32" ? "win-latest-version.txt"
96
+ : process.platform === "darwin" ? "mac-latest-version.txt"
97
+ : "latest-version.txt";
98
+ return (await getText(`${OSS_RELEASES_BASE}/${file}`)).trim().replace(/^v/, "");
93
99
  }
94
100
  // 非 CN:GitHub releases/latest 的 tag_name。
95
101
  const j = JSON.parse(await getText(`https://api.github.com/repos/${REPO}/releases/latest`));
@@ -28,10 +28,12 @@ let homeTabWc = null; // the homepage's resident-tab webContents (primary path
28
28
  // browser window (homepage = profile 0 的起始页). Clicking a team there
29
29
  // opens the team as another tab in the same window. Falls back to a standalone
30
30
  // window only if the tab engine throws, so the homepage is never unreachable.
31
- async function openHomepage() {
31
+ async function openHomepage(opts = {}) {
32
32
  try {
33
33
  const tabBrowser = require("../tools/tab-browser-tools");
34
- const { win, wc } = tabBrowser.openHomeWindow(0, pickHomepageURL());
34
+ // opts.activate=false(deeplink / second-instance 顺带调用)→ 不抢用户当前 tab,只保证
35
+ // 首页存在 + 窗口在前台;不传(tray「打开首页」/ 启动)→ 默认切到首页 tab。
36
+ const { win, wc } = tabBrowser.openHomeWindow(0, pickHomepageURL(), opts);
35
37
  if (wc) {
36
38
  homeTabWc = wc;
37
39
  try { wc.once("destroyed", () => { if (homeTabWc === wc) homeTabWc = null; }); } catch {}
package/src/main.js CHANGED
@@ -248,7 +248,7 @@ async function handleDeepLink(url) {
248
248
  if (electronApp.isReady()) {
249
249
  try {
250
250
  const { openHomepage } = require("./backends/homepage-window");
251
- openHomepage();
251
+ openHomepage({ activate: false }); // deeplink 顺带唤起,不抢用户当前 tab(团队列表已由 broadcast 刷新)
252
252
  } catch {}
253
253
  }
254
254
  }
@@ -276,7 +276,7 @@ electronApp.on("second-instance", (_e, argv) => {
276
276
 
277
277
  try {
278
278
  const { openHomepage } = require("./backends/homepage-window");
279
- openHomepage();
279
+ openHomepage({ activate: false }); // 再次启动 exe 只把窗口带到前台,不抢走用户正在看的团队 tab
280
280
  } catch {}
281
281
  const { BrowserWindow } = require("electron");
282
282
  for (const w of BrowserWindow.getAllWindows()) {
@@ -389,11 +389,18 @@ async function openTab(accountIdx, url, opts = {}) {
389
389
  // { win, wc } so the homepage module can track the tab's webContents for the
390
390
  // main→renderer pushes (auth:complete, update-state) that used to target the
391
391
  // standalone homepage window.
392
- function openHomeWindow(accountIdx, homeUrl) {
392
+ function openHomeWindow(accountIdx, homeUrl, opts = {}) {
393
393
  const m = ensureManager(accountIdx);
394
394
  let tab = m.tabs.find((t) => t.home);
395
- if (tab) { m.activate(tab.id); }
396
- else { const id = m.addTab(homeUrl, { home: true }); tab = m.tabs.find((t) => t.id === id); }
395
+ if (tab) {
396
+ // 只在明确要求(用户点「打开首页」/ 启动)时才切到首页 tab。deeplink / second-instance
397
+ // **顺带**触发 openHomepage 的路径传 activate:false —— 绝不抢走用户正在看的团队 tab,否则
398
+ // 对话着对话着窗口就莫名切到「我的团队」(用户报的 bug)。当前本来就是首页 tab、或还没有任何
399
+ // active tab 时,activate 无副作用,照常执行。
400
+ if (opts.activate !== false || m.activeId == null || m.activeId === tab.id) m.activate(tab.id);
401
+ } else {
402
+ const id = m.addTab(homeUrl, { home: true }); tab = m.tabs.find((t) => t.id === id);
403
+ }
397
404
  try { m.win.show(); m.win.focus(); } catch (e) {}
398
405
  let wc = null; try { wc = tab ? tab.view.webContents : null; } catch (e) {}
399
406
  return { win: m.win, wc };