@allbluecn/web-app 0.22.0 → 0.22.3

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.
Files changed (93) hide show
  1. package/package.json +6 -8
  2. package/public/logo/allblue-logo-app-icon.svg +1 -1
  3. package/src/components/changelog/changelog-page.tsx +24 -5
  4. package/src/components/desktop/cloud-login.tsx +91 -0
  5. package/src/components/desktop/conflict-center.tsx +148 -0
  6. package/src/components/desktop/renamed-toast.tsx +23 -0
  7. package/src/components/desktop/shell-widgets.tsx +19 -0
  8. package/src/components/desktop/sync-indicator.tsx +60 -0
  9. package/src/components/desktop/sync-status-card.tsx +60 -0
  10. package/src/components/layout/sidebar-03/app-sidebar.tsx +38 -3
  11. package/src/components/shared-kit/avatars/__tests__/avatar-shape.test.ts +17 -1
  12. package/src/components/shared-kit/avatars/avatar-shape.ts +10 -0
  13. package/src/components/shared-kit/avatars/user-avatar.tsx +2 -2
  14. package/src/lib/auth/auth.config.ts +4 -1
  15. package/src/lib/changelog/sdk-versions.ts +33 -2
  16. package/src/lib/desktop-bridge-types.ts +30 -0
  17. package/src/lib/desktop-detect.ts +2 -0
  18. package/src/lib/vector-store/__tests__/factory.test.ts +0 -7
  19. package/src/lib/vector-store/index.ts +2 -4
  20. package/src/paraglide/messages/_index.d.ts +1 -1
  21. package/src/paraglide/messages/_index.js +32 -16
  22. package/src/paraglide/messages/common_sidebar_usermenu_loginsaas3.d.ts +1 -1
  23. package/src/paraglide/messages/common_sidebar_usermenu_loginsaas3.js +3 -3
  24. package/src/paraglide/messages/en.js +11 -6
  25. package/src/paraglide/messages/{tasks_ai_desktop_notice.d.ts → settings_tabs_sync.d.ts} +5 -5
  26. package/src/paraglide/messages/settings_tabs_sync.js +29 -0
  27. package/src/paraglide/messages/zh.js +11 -6
  28. package/src/providers/index.tsx +6 -0
  29. package/src/routeTree.gen.ts +107 -49
  30. package/src/routes/_nav/route.lazy.tsx +12 -0
  31. package/src/routes/_nav/settings/-settings-tabs.tsx +1 -1
  32. package/src/routes/_nav/settings/sync/route.lazy.tsx +40 -0
  33. package/src/routes/_nav/settings/sync/route.tsx +15 -0
  34. package/src/routes/_nav/tasks/index.lazy.tsx +1 -11
  35. package/src/routes/api/billing-webhook.ts +6 -2
  36. package/src/routes/api/sync/bootstrap.ts +38 -0
  37. package/src/routes/api/sync/pull.ts +96 -0
  38. package/src/routes/api/sync/push.ts +169 -0
  39. package/src/routes/api/sync/snapshot.ts +104 -0
  40. package/src/server/__tests__/fetch-guard.test.ts +2 -2
  41. package/src/server/__tests__/resource-registry.test.ts +4 -2
  42. package/src/server/__tests__/sandbox-entitlement.test.ts +5 -0
  43. package/src/server/__tests__/security-headers.test.ts +25 -0
  44. package/src/server/__tests__/task-assigned-query.test.ts +0 -11
  45. package/src/server/__tests__/task-serverfn-crud.test.ts +1 -22
  46. package/src/server/__tests__/task-serverfn-queries.test.ts +1 -9
  47. package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +0 -11
  48. package/src/server/ai-gateway/__tests__/embedding-request.test.ts +1 -1
  49. package/src/server/ai-gateway/__tests__/provider-adapter.test.ts +2 -2
  50. package/src/server/ai-gateway/__tests__/run-store-durable.test.ts +1 -1
  51. package/src/server/ai-gateway/durability/__tests__/pg-stream.test.ts +1 -1
  52. package/src/server/ai-gateway/durability/__tests__/reaper-real-db.test.ts +1 -1
  53. package/src/server/ai-gateway/memory/index.ts +2 -2
  54. package/src/server/ai-gateway/sandbox/__tests__/instance-store.test.ts +1 -1
  55. package/src/server/ai-task/assigned-query.ts +4 -15
  56. package/src/server/desktop-guest.ts +12 -0
  57. package/src/server/fetch-guard.ts +3 -3
  58. package/src/server/middlewares/desktop-token.ts +23 -0
  59. package/src/server/remote-auth.ts +6 -0
  60. package/src/server/serverFns/__tests__/billing.test.ts +58 -1
  61. package/src/server/serverFns/__tests__/update-seats.test.ts +8 -8
  62. package/src/server/serverFns/agents/agent-crud.ts +3 -1
  63. package/src/server/serverFns/auth/session.ts +9 -0
  64. package/src/server/serverFns/billing.ts +10 -4
  65. package/src/server/serverFns/bug/bug-crud.ts +7 -2
  66. package/src/server/serverFns/story/__tests__/labels.test.ts +37 -15
  67. package/src/server/serverFns/story/story-comments.ts +2 -1
  68. package/src/server/serverFns/story/story-crud/activities.ts +1 -1
  69. package/src/server/serverFns/story/story-crud/user-brief.ts +1 -1
  70. package/src/server/serverFns/story/story-crud.ts +2 -1
  71. package/src/server/serverFns/story/story-transfer.ts +2 -1
  72. package/src/server/serverFns/tasks/task-crud.ts +0 -13
  73. package/src/server/serverFns/tasks/task-queries.ts +1 -12
  74. package/src/server/serverFns/testcase/plans.ts +1 -1
  75. package/src/server/serverFns/testcase/run-cases.ts +1 -1
  76. package/src/server/serverFns/testcase/runs.ts +1 -1
  77. package/src/server/serverFns/testcase/testcase-activities.ts +1 -1
  78. package/src/server/serverFns/testcase/testcase-board.ts +1 -1
  79. package/src/server/serverFns/testcase/testcase-crud.ts +1 -1
  80. package/src/server/serverFns/workspace.ts +1 -1
  81. package/src/server/story/types.ts +7 -22
  82. package/src/server/story/user-brief.ts +48 -0
  83. package/src/server/sync/scopes.ts +29 -0
  84. package/src/start.ts +10 -2
  85. package/src/styles/globals.css +10 -0
  86. package/src/__tests__/desktop-connection-validate.test.ts +0 -66
  87. package/src/lib/vector-store/__tests__/sqlite-vec-store.test.ts +0 -143
  88. package/src/lib/vector-store/sqlite-vec-store.ts +0 -224
  89. package/src/paraglide/messages/tasks_ai_desktop_notice.js +0 -29
  90. package/src/routes/__desktop/onboarding/route.lazy.tsx +0 -175
  91. package/src/routes/__desktop/onboarding/route.tsx +0 -11
  92. package/src/routes/_nav/settings/connection/route.lazy.tsx +0 -64
  93. package/src/routes/_nav/settings/connection/route.tsx +0 -10
@@ -32,3 +32,13 @@ export const AVATAR_SHAPES = [
32
32
  export function toAvatarShape(v: string | null | undefined): ShapeType | null {
33
33
  return AVATAR_SHAPES.find((shape) => shape === v) ?? null
34
34
  }
35
+
36
+ /**
37
+ * DB 列默认值是空对象 `avatarConfig Json? @default("{}")`——`{}` 为 truthy,
38
+ * 直接 if 判断会走 NotionAvatar 渲染出「白底空脸」隐形框(各部件 fetch
39
+ * /avatar/preview/xxx/undefined.svg 404),auth session 的 getRandomConfig
40
+ * 兜底也被短路永不执行。消费端必须经此守卫:非空对象才算「配置过头像」。
41
+ */
42
+ export function hasAvatarConfig(config: unknown): config is Record<string, unknown> {
43
+ return !!config && typeof config === "object" && Object.keys(config).length > 0
44
+ }
@@ -17,7 +17,7 @@
17
17
 
18
18
 
19
19
  import { NotionAvatar } from "./notion-avatar"
20
- import { toAvatarShape } from "./avatar-shape"
20
+ import { hasAvatarConfig, toAvatarShape } from "./avatar-shape"
21
21
  import type { AvatarConfig } from "@allbluecn/kernel"
22
22
 
23
23
  type UserAvatarProps = {
@@ -56,7 +56,7 @@ export function UserAvatar({
56
56
  const shapeClass =
57
57
  shape === "circle" ? "rounded-full" : shape === "square" ? "rounded-none" : "rounded-lg"
58
58
 
59
- if (avatarConfig) {
59
+ if (hasAvatarConfig(avatarConfig)) {
60
60
  return (
61
61
  <NotionAvatar
62
62
  config={avatarConfig}
@@ -24,6 +24,7 @@ import GitHubProvider from '@auth/core/providers/github'
24
24
  import { prisma } from '@allbluecn/database'
25
25
  import bcrypt from 'bcryptjs'
26
26
  import { getRandomConfig, presetBgColors, defaultAvatarConfig } from '@/lib/avatar/avatar-config'
27
+ import { hasAvatarConfig } from '@/components/shared-kit/avatars/avatar-shape'
27
28
  import { resolveIpLocation, getClientIp } from '@allbluecn/kernel'
28
29
  import { getResolvedOAuthProviders } from '@/server/oauth-config'
29
30
  import { isLoginBlocked, recordLoginFailure, clearLoginFailures } from '@/server/middlewares/auth-rate-limit'
@@ -554,7 +555,9 @@ export const authConfig: StartAuthJSConfig = {
554
555
  if (dbUser.tokenVersion != null && (token.tokenVersion ?? 0) !== dbUser.tokenVersion) {
555
556
  return { ...session, user: null } as unknown as typeof session
556
557
  }
557
- if (dbUser.avatarConfig) {
558
+ // 空对象 `{}`(DB 列默认值)不算已配置:否则 getRandomConfig 兜底被
559
+ // 短路,NotionAvatar 拿空配置渲染白框(hasAvatarConfig 守卫)
560
+ if (hasAvatarConfig(dbUser.avatarConfig)) {
558
561
  user.avatarConfig = dbUser.avatarConfig as Record<string, number>
559
562
  user.bgShape = dbUser.bgShape ?? 'square'
560
563
  user.bgColor = dbUser.bgColor ?? '#fff'
@@ -86,6 +86,30 @@ export const SDK_GROUPS: SdkGroup[] = [
86
86
  "lastUpdate": "Oct 25, 2026",
87
87
  "source": "apps/admin/package.json#dependencies",
88
88
  "docsUrl": "https://tanstack.com/virtual/latest"
89
+ },
90
+ {
91
+ "name": "@tanstack/db",
92
+ "displayName": "TanStack DB",
93
+ "version": "v1.0.0-rc.1",
94
+ "lastUpdate": "Oct 30, 2026",
95
+ "source": "apps/web/package.json#dependencies",
96
+ "docsUrl": "https://tanstack.com/db/latest"
97
+ },
98
+ {
99
+ "name": "@tanstack/store",
100
+ "displayName": "TanStack Store",
101
+ "version": "v0.11.2",
102
+ "lastUpdate": "Oct 30, 2026",
103
+ "source": "apps/web/package.json#dependencies",
104
+ "docsUrl": "https://tanstack.com/store/latest"
105
+ },
106
+ {
107
+ "name": "@tanstack/markdown",
108
+ "displayName": "TanStack Markdown",
109
+ "version": "v1.0.0",
110
+ "lastUpdate": "Oct 30, 2026",
111
+ "source": "apps/web/package.json#dependencies",
112
+ "docsUrl": "https://tanstack.com/markdown/latest"
89
113
  }
90
114
  ]
91
115
  },
@@ -96,8 +120,8 @@ export const SDK_GROUPS: SdkGroup[] = [
96
120
  "items": [
97
121
  {
98
122
  "name": "@allbluecn/web-app",
99
- "version": "v0.22.0",
100
- "lastUpdate": "Oct 29, 2026",
123
+ "version": "v0.22.3",
124
+ "lastUpdate": "Oct 31, 2026",
101
125
  "source": "apps/web/package.json",
102
126
  "docsUrl": "https://github.com/allbluecn/allblue"
103
127
  },
@@ -156,6 +180,13 @@ export const SDK_GROUPS: SdkGroup[] = [
156
180
  "lastUpdate": "Sep 21, 2026",
157
181
  "source": "apps/web/package.json#dependencies",
158
182
  "docsUrl": "https://lucide.dev/"
183
+ },
184
+ {
185
+ "name": "LeaferJS",
186
+ "version": "v2.3.0",
187
+ "lastUpdate": "Oct 30, 2026",
188
+ "source": "apps/web/package.json#dependencies",
189
+ "docsUrl": "https://www.leaferjs.com/"
159
190
  }
160
191
  ]
161
192
  }
@@ -0,0 +1,30 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // AllBlue - 理想之海
3
+ // Copyright (C) 2026 AllBlue Contributors
4
+
5
+ // 桌面端类型声明(迁移 P5.3/P6):desktopBridge 桥(Electron preload 暴露)。
6
+ // 仅类型——运行时对象由 Electron preload 注入,浏览器环境无此对象。
7
+ export interface DesktopBridgeApi {
8
+ appInfo: () => Promise<{ version: string; clientId: string; platform: string; backendPort: number | null }>
9
+ cloudLogin: (email: string, password: string) => Promise<{ ok: boolean; userId?: string; error?: string }>
10
+ conflictRpc: (
11
+ method: "list" | "applyLocal" | "keepRemote" | "keepBoth",
12
+ ...args: unknown[]
13
+ ) => Promise<unknown>
14
+ window: (action: "minimize" | "maximize" | "close") => void
15
+ onDeepLink: (cb: (url: string) => void) => () => void
16
+ onOnlineChanged: (cb: (online: boolean) => void) => () => void
17
+ onSyncState: (cb: (state: unknown) => void) => () => void
18
+ onRenamed: (cb: (info: { table: string; from: string; to: string }) => void) => () => void
19
+ }
20
+
21
+ declare global {
22
+ interface Window {
23
+ desktopBridge?: DesktopBridgeApi
24
+ }
25
+ }
26
+
27
+ export function getDesktopBridge(): DesktopBridgeApi | null {
28
+ if (typeof window === "undefined") return null
29
+ return window.desktopBridge ?? null
30
+ }
@@ -1,3 +1,5 @@
1
+ // DESKTOP-LEGACY(迁移 P1 标记,勿删勿改):Tauri 运行时探测,Electron(P2)
2
+ // 下恒 false——桌面判定改走 DEPLOY_TARGET/desktopBridge,替换后整文件移除。
1
3
  /**
2
4
  * Detect if code is running inside Tauri desktop environment.
3
5
  * Uses `window.__TAURI_INTERNALS__` (Tauri 2) with fallback to `window.__TAURI__` (Tauri 1 compat).
@@ -18,7 +18,6 @@
18
18
  import { describe, it, expect, beforeEach, afterEach } from "vitest";
19
19
  import { getVectorStore, _setVectorStoreForTest } from "../index";
20
20
  import { pgVectorStore } from "../pg-vector-store";
21
- import { sqliteVecStore } from "../sqlite-vec-store";
22
21
 
23
22
  describe("getVectorStore 工厂", () => {
24
23
  beforeEach(() => {
@@ -40,12 +39,6 @@ describe("getVectorStore 工厂", () => {
40
39
  expect(await getVectorStore()).toBe(pgVectorStore);
41
40
  });
42
41
 
43
- it("VECTOR_BACKEND=sqlite_vec 动态 import 并返回 sqliteVecStore", async () => {
44
- process.env.VECTOR_BACKEND = "sqlite_vec";
45
- const store = await getVectorStore();
46
- expect(store).toBe(sqliteVecStore);
47
- });
48
-
49
42
  it("缓存实例(第二次返回同一引用)", async () => {
50
43
  const a = await getVectorStore();
51
44
  const b = await getVectorStore();
@@ -27,11 +27,9 @@ export async function getVectorStore(): Promise<VectorStore> {
27
27
  const backend = process.env.VECTOR_BACKEND ?? "pgvector";
28
28
  let store: VectorStore;
29
29
  if (backend === "pgvector") {
30
+ // 桌面端 PGlite 预载 pgvector(迁移 P1),与云端共用此后端;sqlite_vec
31
+ // 后端已随 Tauri 清退移除
30
32
  store = pgVectorStore;
31
- } else if (backend === "sqlite_vec") {
32
- // 动态 import:避免 sqlite-vec 依赖被打进服务器 bundle(桌面端专用)
33
- const mod = await import("./sqlite-vec-store");
34
- store = mod.sqliteVecStore;
35
33
  } else {
36
34
  throw new Error(`未知 VECTOR_BACKEND: ${backend}`);
37
35
  }
@@ -3805,6 +3805,7 @@ export * from "./settings_tabs_notifications.js";
3805
3805
  export * from "./settings_tabs_personalteam1.js";
3806
3806
  export * from "./settings_tabs_plugins.js";
3807
3807
  export * from "./settings_tabs_subscription.js";
3808
+ export * from "./settings_tabs_sync.js";
3808
3809
  export * from "./settings_tabs_teammembers1.js";
3809
3810
  export * from "./settings_team_allroles1.js";
3810
3811
  export * from "./settings_team_allstatuses1.js";
@@ -4896,7 +4897,6 @@ export * from "./summary_months.js";
4896
4897
  export * from "./taginput_add1.js";
4897
4898
  export * from "./taginput_placeholder1.js";
4898
4899
  export * from "./taginput_remove1.js";
4899
- export * from "./tasks_ai_desktop_notice.js";
4900
4900
  export * from "./tasks_ai_exec.js";
4901
4901
  export * from "./tasks_create_description.js";
4902
4902
  export * from "./tasks_create_instruction_label.js";
@@ -1941,6 +1941,7 @@ import { getLocale, experimentalStaticLocale } from "../runtime.js"
1941
1941
  /** @typedef {{}} Composer_Attach_ButtonInputs */
1942
1942
  /** @typedef {{}} Composer_Attach_Imagesonly1Inputs */
1943
1943
  /** @typedef {{}} Composer_Attach_RemoveInputs */
1944
+ /** @typedef {{}} Dashboard_Activityfeed_Ai1Inputs */
1944
1945
  /** @typedef {{}} Dashboard_Activityfeed_Empty1Inputs */
1945
1946
  /** @typedef {{}} Dashboard_Activityfeed_Title1Inputs */
1946
1947
  /** @typedef {{}} Dashboard_Askai_Overview1Inputs */
@@ -3808,6 +3809,7 @@ import { getLocale, experimentalStaticLocale } from "../runtime.js"
3808
3809
  /** @typedef {{}} Settings_Tabs_Personalteam1Inputs */
3809
3810
  /** @typedef {{}} Settings_Tabs_PluginsInputs */
3810
3811
  /** @typedef {{}} Settings_Tabs_SubscriptionInputs */
3812
+ /** @typedef {{}} Settings_Tabs_SyncInputs */
3811
3813
  /** @typedef {{}} Settings_Tabs_Teammembers1Inputs */
3812
3814
  /** @typedef {{}} Settings_Team_Allroles1Inputs */
3813
3815
  /** @typedef {{}} Settings_Team_Allstatuses1Inputs */
@@ -4899,7 +4901,6 @@ import { getLocale, experimentalStaticLocale } from "../runtime.js"
4899
4901
  /** @typedef {{}} Taginput_Add1Inputs */
4900
4902
  /** @typedef {{}} Taginput_Placeholder1Inputs */
4901
4903
  /** @typedef {{}} Taginput_Remove1Inputs */
4902
- /** @typedef {{}} Tasks_Ai_Desktop_NoticeInputs */
4903
4904
  /** @typedef {{}} Tasks_Ai_ExecInputs */
4904
4905
  /** @typedef {{}} Tasks_Create_DescriptionInputs */
4905
4906
  /** @typedef {{}} Tasks_Create_Instruction_LabelInputs */
@@ -33588,7 +33589,7 @@ export { common_sidebar_usermenu_login1 as "common_sidebar_userMenu_login" }
33588
33589
  /**
33589
33590
  * | output |
33590
33591
  * | --- |
33591
- * | "Login to SaaS" |
33592
+ * | "Sign in" |
33592
33593
  *
33593
33594
  * @param {Common_Sidebar_Usermenu_Loginsaas3Inputs} inputs
33594
33595
  * @param {{ locale?: "zh" | "en" }} options
@@ -33962,6 +33963,21 @@ export const composer_attach_remove = /** @type {((inputs?: Composer_Attach_Remo
33962
33963
  /**
33963
33964
  * | output |
33964
33965
  * | --- |
33966
+ * | "AI" |
33967
+ *
33968
+ * @param {Dashboard_Activityfeed_Ai1Inputs} inputs
33969
+ * @param {{ locale?: "zh" | "en" }} options
33970
+ * @returns {LocalizedString}
33971
+ */
33972
+ const dashboard_activityfeed_ai1 = /** @type {((inputs?: Dashboard_Activityfeed_Ai1Inputs, options?: { locale?: "zh" | "en" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Dashboard_Activityfeed_Ai1Inputs, { locale?: "zh" | "en" }, {}>} */ ((inputs = {}, options = {}) => {
33973
+ const locale = experimentalStaticLocale ?? options.locale ?? getLocale()
33974
+ if (locale === "en") return __en.dashboard_activityfeed_ai1(inputs)
33975
+ return __zh.dashboard_activityfeed_ai1(inputs)
33976
+ });
33977
+ export { dashboard_activityfeed_ai1 as "dashboard_activityFeed_ai" }
33978
+ /**
33979
+ * | output |
33980
+ * | --- |
33965
33981
  * | "No activity" |
33966
33982
  *
33967
33983
  * @param {Dashboard_Activityfeed_Empty1Inputs} inputs
@@ -61298,6 +61314,20 @@ export const settings_tabs_subscription = /** @type {((inputs?: Settings_Tabs_Su
61298
61314
  /**
61299
61315
  * | output |
61300
61316
  * | --- |
61317
+ * | "Sync" |
61318
+ *
61319
+ * @param {Settings_Tabs_SyncInputs} inputs
61320
+ * @param {{ locale?: "zh" | "en" }} options
61321
+ * @returns {LocalizedString}
61322
+ */
61323
+ export const settings_tabs_sync = /** @type {((inputs?: Settings_Tabs_SyncInputs, options?: { locale?: "zh" | "en" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Settings_Tabs_SyncInputs, { locale?: "zh" | "en" }, {}>} */ ((inputs = {}, options = {}) => {
61324
+ const locale = experimentalStaticLocale ?? options.locale ?? getLocale()
61325
+ if (locale === "en") return __en.settings_tabs_sync(inputs)
61326
+ return __zh.settings_tabs_sync(inputs)
61327
+ });
61328
+ /**
61329
+ * | output |
61330
+ * | --- |
61301
61331
  * | "Team Management" |
61302
61332
  *
61303
61333
  * @param {Settings_Tabs_Teammembers1Inputs} inputs
@@ -77302,20 +77332,6 @@ export { taginput_remove1 as "tagInput_remove" }
77302
77332
  /**
77303
77333
  * | output |
77304
77334
  * | --- |
77305
- * | "AI tasks are available on the web app" |
77306
- *
77307
- * @param {Tasks_Ai_Desktop_NoticeInputs} inputs
77308
- * @param {{ locale?: "zh" | "en" }} options
77309
- * @returns {LocalizedString}
77310
- */
77311
- export const tasks_ai_desktop_notice = /** @type {((inputs?: Tasks_Ai_Desktop_NoticeInputs, options?: { locale?: "zh" | "en" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Tasks_Ai_Desktop_NoticeInputs, { locale?: "zh" | "en" }, {}>} */ ((inputs = {}, options = {}) => {
77312
- const locale = experimentalStaticLocale ?? options.locale ?? getLocale()
77313
- if (locale === "en") return __en.tasks_ai_desktop_notice(inputs)
77314
- return __zh.tasks_ai_desktop_notice(inputs)
77315
- });
77316
- /**
77317
- * | output |
77318
- * | --- |
77319
77335
  * | "AI Exec" |
77320
77336
  *
77321
77337
  * @param {Tasks_Ai_ExecInputs} inputs
@@ -4,7 +4,7 @@ export type Common_Sidebar_Usermenu_Loginsaas3Inputs = {};
4
4
  /**
5
5
  * | output |
6
6
  * | --- |
7
- * | "Login to SaaS" |
7
+ * | "Sign in" |
8
8
  *
9
9
  * @param {Common_Sidebar_Usermenu_Loginsaas3Inputs} inputs
10
10
  * @param {{ locale?: "zh" | "en" }} options
@@ -6,17 +6,17 @@ import { getLocale, experimentalStaticLocale } from '../runtime.js';
6
6
  /** @typedef {{}} Common_Sidebar_Usermenu_Loginsaas3Inputs */
7
7
 
8
8
  const zh_common_sidebar_usermenu_loginsaas3 = /** @type {(inputs: Common_Sidebar_Usermenu_Loginsaas3Inputs) => LocalizedString} */ () => {
9
- return /** @type {LocalizedString} */ (`登录 SaaS`)
9
+ return /** @type {LocalizedString} */ (`登录`)
10
10
  };
11
11
 
12
12
  const en_common_sidebar_usermenu_loginsaas3 = /** @type {(inputs: Common_Sidebar_Usermenu_Loginsaas3Inputs) => LocalizedString} */ () => {
13
- return /** @type {LocalizedString} */ (`Login to SaaS`)
13
+ return /** @type {LocalizedString} */ (`Sign in`)
14
14
  };
15
15
 
16
16
  /**
17
17
  * | output |
18
18
  * | --- |
19
- * | "Login to SaaS" |
19
+ * | "Sign in" |
20
20
  *
21
21
  * @param {Common_Sidebar_Usermenu_Loginsaas3Inputs} inputs
22
22
  * @param {{ locale?: "zh" | "en" }} options
@@ -1939,6 +1939,7 @@
1939
1939
  /** @typedef {{}} Composer_Attach_ButtonInputs */
1940
1940
  /** @typedef {{}} Composer_Attach_Imagesonly1Inputs */
1941
1941
  /** @typedef {{}} Composer_Attach_RemoveInputs */
1942
+ /** @typedef {{}} Dashboard_Activityfeed_Ai1Inputs */
1942
1943
  /** @typedef {{}} Dashboard_Activityfeed_Empty1Inputs */
1943
1944
  /** @typedef {{}} Dashboard_Activityfeed_Title1Inputs */
1944
1945
  /** @typedef {{}} Dashboard_Askai_Overview1Inputs */
@@ -3806,6 +3807,7 @@
3806
3807
  /** @typedef {{}} Settings_Tabs_Personalteam1Inputs */
3807
3808
  /** @typedef {{}} Settings_Tabs_PluginsInputs */
3808
3809
  /** @typedef {{}} Settings_Tabs_SubscriptionInputs */
3810
+ /** @typedef {{}} Settings_Tabs_SyncInputs */
3809
3811
  /** @typedef {{}} Settings_Tabs_Teammembers1Inputs */
3810
3812
  /** @typedef {{}} Settings_Team_Allroles1Inputs */
3811
3813
  /** @typedef {{}} Settings_Team_Allstatuses1Inputs */
@@ -4897,7 +4899,6 @@
4897
4899
  /** @typedef {{}} Taginput_Add1Inputs */
4898
4900
  /** @typedef {{}} Taginput_Placeholder1Inputs */
4899
4901
  /** @typedef {{}} Taginput_Remove1Inputs */
4900
- /** @typedef {{}} Tasks_Ai_Desktop_NoticeInputs */
4901
4902
  /** @typedef {{}} Tasks_Ai_ExecInputs */
4902
4903
  /** @typedef {{}} Tasks_Create_DescriptionInputs */
4903
4904
  /** @typedef {{}} Tasks_Create_Instruction_LabelInputs */
@@ -13310,7 +13311,7 @@ export const common_sidebar_usermenu_login1 = /** @type {(inputs: Common_Sidebar
13310
13311
  };
13311
13312
 
13312
13313
  export const common_sidebar_usermenu_loginsaas3 = /** @type {(inputs: Common_Sidebar_Usermenu_Loginsaas3Inputs) => LocalizedString} */ () => {
13313
- return /** @type {LocalizedString} */ (`Login to SaaS`)
13314
+ return /** @type {LocalizedString} */ (`Sign in`)
13314
13315
  };
13315
13316
 
13316
13317
  export const common_sidebar_usermenu_logout1 = /** @type {(inputs: Common_Sidebar_Usermenu_Logout1Inputs) => LocalizedString} */ () => {
@@ -13413,6 +13414,10 @@ export const composer_attach_remove = /** @type {(inputs: Composer_Attach_Remove
13413
13414
  return /** @type {LocalizedString} */ (`Remove`)
13414
13415
  };
13415
13416
 
13417
+ export const dashboard_activityfeed_ai1 = /** @type {(inputs: Dashboard_Activityfeed_Ai1Inputs) => LocalizedString} */ () => {
13418
+ return /** @type {LocalizedString} */ (`AI`)
13419
+ };
13420
+
13416
13421
  export const dashboard_activityfeed_empty1 = /** @type {(inputs: Dashboard_Activityfeed_Empty1Inputs) => LocalizedString} */ () => {
13417
13422
  return /** @type {LocalizedString} */ (`No activity`)
13418
13423
  };
@@ -20883,6 +20888,10 @@ export const settings_tabs_subscription = /** @type {(inputs: Settings_Tabs_Subs
20883
20888
  return /** @type {LocalizedString} */ (`Subscription`)
20884
20889
  };
20885
20890
 
20891
+ export const settings_tabs_sync = /** @type {(inputs: Settings_Tabs_SyncInputs) => LocalizedString} */ () => {
20892
+ return /** @type {LocalizedString} */ (`Sync`)
20893
+ };
20894
+
20886
20895
  export const settings_tabs_teammembers1 = /** @type {(inputs: Settings_Tabs_Teammembers1Inputs) => LocalizedString} */ () => {
20887
20896
  return /** @type {LocalizedString} */ (`Team Management`)
20888
20897
  };
@@ -25254,10 +25263,6 @@ export const taginput_remove1 = /** @type {(inputs: Taginput_Remove1Inputs) => L
25254
25263
  return /** @type {LocalizedString} */ (`Remove tag`)
25255
25264
  };
25256
25265
 
25257
- export const tasks_ai_desktop_notice = /** @type {(inputs: Tasks_Ai_Desktop_NoticeInputs) => LocalizedString} */ () => {
25258
- return /** @type {LocalizedString} */ (`AI tasks are available on the web app`)
25259
- };
25260
-
25261
25266
  export const tasks_ai_exec = /** @type {(inputs: Tasks_Ai_ExecInputs) => LocalizedString} */ () => {
25262
25267
  return /** @type {LocalizedString} */ (`AI Exec`)
25263
25268
  };
@@ -1,16 +1,16 @@
1
1
  /**
2
2
  * | output |
3
3
  * | --- |
4
- * | "AI tasks are available on the web app" |
4
+ * | "Sync" |
5
5
  *
6
- * @param {Tasks_Ai_Desktop_NoticeInputs} inputs
6
+ * @param {Settings_Tabs_SyncInputs} inputs
7
7
  * @param {{ locale?: "zh" | "en" }} options
8
8
  * @returns {LocalizedString}
9
9
  */
10
- export const tasks_ai_desktop_notice: ((inputs?: Tasks_Ai_Desktop_NoticeInputs, options?: {
10
+ export const settings_tabs_sync: ((inputs?: Settings_Tabs_SyncInputs, options?: {
11
11
  locale?: "zh" | "en";
12
- }) => LocalizedString) & import("../runtime.js").MessageMetadata<Tasks_Ai_Desktop_NoticeInputs, {
12
+ }) => LocalizedString) & import("../runtime.js").MessageMetadata<Settings_Tabs_SyncInputs, {
13
13
  locale?: "zh" | "en";
14
14
  }, {}>;
15
15
  export type LocalizedString = import("../runtime.js").LocalizedString;
16
- export type Tasks_Ai_Desktop_NoticeInputs = {};
16
+ export type Settings_Tabs_SyncInputs = {};
@@ -0,0 +1,29 @@
1
+ /* eslint-disable */
2
+ import { getLocale, experimentalStaticLocale } from '../runtime.js';
3
+
4
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
5
+
6
+ /** @typedef {{}} Settings_Tabs_SyncInputs */
7
+
8
+ const zh_settings_tabs_sync = /** @type {(inputs: Settings_Tabs_SyncInputs) => LocalizedString} */ () => {
9
+ return /** @type {LocalizedString} */ (`同步`)
10
+ };
11
+
12
+ const en_settings_tabs_sync = /** @type {(inputs: Settings_Tabs_SyncInputs) => LocalizedString} */ () => {
13
+ return /** @type {LocalizedString} */ (`Sync`)
14
+ };
15
+
16
+ /**
17
+ * | output |
18
+ * | --- |
19
+ * | "Sync" |
20
+ *
21
+ * @param {Settings_Tabs_SyncInputs} inputs
22
+ * @param {{ locale?: "zh" | "en" }} options
23
+ * @returns {LocalizedString}
24
+ */
25
+ export const settings_tabs_sync = /** @type {((inputs?: Settings_Tabs_SyncInputs, options?: { locale?: "zh" | "en" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Settings_Tabs_SyncInputs, { locale?: "zh" | "en" }, {}>} */ ((inputs = {}, options = {}) => {
26
+ const locale = experimentalStaticLocale ?? options.locale ?? getLocale()
27
+ if (locale === "en") return en_settings_tabs_sync(inputs)
28
+ return zh_settings_tabs_sync(inputs)
29
+ });
@@ -1939,6 +1939,7 @@
1939
1939
  /** @typedef {{}} Composer_Attach_ButtonInputs */
1940
1940
  /** @typedef {{}} Composer_Attach_Imagesonly1Inputs */
1941
1941
  /** @typedef {{}} Composer_Attach_RemoveInputs */
1942
+ /** @typedef {{}} Dashboard_Activityfeed_Ai1Inputs */
1942
1943
  /** @typedef {{}} Dashboard_Activityfeed_Empty1Inputs */
1943
1944
  /** @typedef {{}} Dashboard_Activityfeed_Title1Inputs */
1944
1945
  /** @typedef {{}} Dashboard_Askai_Overview1Inputs */
@@ -3806,6 +3807,7 @@
3806
3807
  /** @typedef {{}} Settings_Tabs_Personalteam1Inputs */
3807
3808
  /** @typedef {{}} Settings_Tabs_PluginsInputs */
3808
3809
  /** @typedef {{}} Settings_Tabs_SubscriptionInputs */
3810
+ /** @typedef {{}} Settings_Tabs_SyncInputs */
3809
3811
  /** @typedef {{}} Settings_Tabs_Teammembers1Inputs */
3810
3812
  /** @typedef {{}} Settings_Team_Allroles1Inputs */
3811
3813
  /** @typedef {{}} Settings_Team_Allstatuses1Inputs */
@@ -4897,7 +4899,6 @@
4897
4899
  /** @typedef {{}} Taginput_Add1Inputs */
4898
4900
  /** @typedef {{}} Taginput_Placeholder1Inputs */
4899
4901
  /** @typedef {{}} Taginput_Remove1Inputs */
4900
- /** @typedef {{}} Tasks_Ai_Desktop_NoticeInputs */
4901
4902
  /** @typedef {{}} Tasks_Ai_ExecInputs */
4902
4903
  /** @typedef {{}} Tasks_Create_DescriptionInputs */
4903
4904
  /** @typedef {{}} Tasks_Create_Instruction_LabelInputs */
@@ -13310,7 +13311,7 @@ export const common_sidebar_usermenu_login1 = /** @type {(inputs: Common_Sidebar
13310
13311
  };
13311
13312
 
13312
13313
  export const common_sidebar_usermenu_loginsaas3 = /** @type {(inputs: Common_Sidebar_Usermenu_Loginsaas3Inputs) => LocalizedString} */ () => {
13313
- return /** @type {LocalizedString} */ (`登录 SaaS`)
13314
+ return /** @type {LocalizedString} */ (`登录`)
13314
13315
  };
13315
13316
 
13316
13317
  export const common_sidebar_usermenu_logout1 = /** @type {(inputs: Common_Sidebar_Usermenu_Logout1Inputs) => LocalizedString} */ () => {
@@ -13413,6 +13414,10 @@ export const composer_attach_remove = /** @type {(inputs: Composer_Attach_Remove
13413
13414
  return /** @type {LocalizedString} */ (`移除`)
13414
13415
  };
13415
13416
 
13417
+ export const dashboard_activityfeed_ai1 = /** @type {(inputs: Dashboard_Activityfeed_Ai1Inputs) => LocalizedString} */ () => {
13418
+ return /** @type {LocalizedString} */ (`AI`)
13419
+ };
13420
+
13416
13421
  export const dashboard_activityfeed_empty1 = /** @type {(inputs: Dashboard_Activityfeed_Empty1Inputs) => LocalizedString} */ () => {
13417
13422
  return /** @type {LocalizedString} */ (`暂无活动`)
13418
13423
  };
@@ -20883,6 +20888,10 @@ export const settings_tabs_subscription = /** @type {(inputs: Settings_Tabs_Subs
20883
20888
  return /** @type {LocalizedString} */ (`订阅管理`)
20884
20889
  };
20885
20890
 
20891
+ export const settings_tabs_sync = /** @type {(inputs: Settings_Tabs_SyncInputs) => LocalizedString} */ () => {
20892
+ return /** @type {LocalizedString} */ (`同步`)
20893
+ };
20894
+
20886
20895
  export const settings_tabs_teammembers1 = /** @type {(inputs: Settings_Tabs_Teammembers1Inputs) => LocalizedString} */ () => {
20887
20896
  return /** @type {LocalizedString} */ (`团队管理`)
20888
20897
  };
@@ -25252,10 +25261,6 @@ export const taginput_remove1 = /** @type {(inputs: Taginput_Remove1Inputs) => L
25252
25261
  return /** @type {LocalizedString} */ (`移除标签`)
25253
25262
  };
25254
25263
 
25255
- export const tasks_ai_desktop_notice = /** @type {(inputs: Tasks_Ai_Desktop_NoticeInputs) => LocalizedString} */ () => {
25256
- return /** @type {LocalizedString} */ (`AI 任务需在 Web 端使用`)
25257
- };
25258
-
25259
25264
  export const tasks_ai_exec = /** @type {(inputs: Tasks_Ai_ExecInputs) => LocalizedString} */ () => {
25260
25265
  return /** @type {LocalizedString} */ (`AI 执行`)
25261
25266
  };
@@ -21,6 +21,8 @@ import { LazyMotion, domAnimation } from "motion/react";
21
21
  import { TooltipProvider } from "@/components/ui/tooltip";
22
22
  import { TimezoneProvider } from "@/providers/timezone-provider";
23
23
  import { ThemeModeProvider } from "@/providers/theme-mode-provider";
24
+ import { DesktopShellWidgets } from "@/components/desktop/shell-widgets";
25
+ import { DesktopRenamedToast } from "@/components/desktop/renamed-toast";
24
26
  import type { Session } from "@/lib/auth/auth-client";
25
27
  import { exchangeRemoteTokenFn } from "@/server/serverFns/auth/session";
26
28
  import { toast } from "@/components/ui/toast";
@@ -32,6 +34,8 @@ import { errorMessage } from "@/lib/toast-error";
32
34
  // 宿主注入图标选择器实现,供 plugins-core 的 PRD 弹窗等使用(模块级单例)
33
35
  registerIconPicker(LucideIconPicker);
34
36
 
37
+ // DESKTOP-LEGACY(迁移 P1 标记,勿删勿改):Tauri deep-link 登录回调监听桥,
38
+ // Electron 壳(P2)以 desktopBridge 事件流等价重建后整段移除。
35
39
  // Tauri 全局注入标志(window.__TAURI_INTERNALS__ / __TAURI__)——集中声明避免散落 as any
36
40
  interface TauriWindow {
37
41
  __TAURI_INTERNALS__?: unknown
@@ -89,6 +93,8 @@ export function Providers({
89
93
  <TooltipProvider>
90
94
  <TimezoneProvider userTimezone={session?.user?.timezone ?? null}>
91
95
  <DesktopDeepLinkListener />
96
+ <DesktopShellWidgets />
97
+ <DesktopRenamedToast />
92
98
  {children}
93
99
  </TimezoneProvider>
94
100
  </TooltipProvider>