@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.
- package/package.json +6 -8
- package/public/logo/allblue-logo-app-icon.svg +1 -1
- package/src/components/changelog/changelog-page.tsx +24 -5
- package/src/components/desktop/cloud-login.tsx +91 -0
- package/src/components/desktop/conflict-center.tsx +148 -0
- package/src/components/desktop/renamed-toast.tsx +23 -0
- package/src/components/desktop/shell-widgets.tsx +19 -0
- package/src/components/desktop/sync-indicator.tsx +60 -0
- package/src/components/desktop/sync-status-card.tsx +60 -0
- package/src/components/layout/sidebar-03/app-sidebar.tsx +38 -3
- package/src/components/shared-kit/avatars/__tests__/avatar-shape.test.ts +17 -1
- package/src/components/shared-kit/avatars/avatar-shape.ts +10 -0
- package/src/components/shared-kit/avatars/user-avatar.tsx +2 -2
- package/src/lib/auth/auth.config.ts +4 -1
- package/src/lib/changelog/sdk-versions.ts +33 -2
- package/src/lib/desktop-bridge-types.ts +30 -0
- package/src/lib/desktop-detect.ts +2 -0
- package/src/lib/vector-store/__tests__/factory.test.ts +0 -7
- package/src/lib/vector-store/index.ts +2 -4
- package/src/paraglide/messages/_index.d.ts +1 -1
- package/src/paraglide/messages/_index.js +32 -16
- package/src/paraglide/messages/common_sidebar_usermenu_loginsaas3.d.ts +1 -1
- package/src/paraglide/messages/common_sidebar_usermenu_loginsaas3.js +3 -3
- package/src/paraglide/messages/en.js +11 -6
- package/src/paraglide/messages/{tasks_ai_desktop_notice.d.ts → settings_tabs_sync.d.ts} +5 -5
- package/src/paraglide/messages/settings_tabs_sync.js +29 -0
- package/src/paraglide/messages/zh.js +11 -6
- package/src/providers/index.tsx +6 -0
- package/src/routeTree.gen.ts +107 -49
- package/src/routes/_nav/route.lazy.tsx +12 -0
- package/src/routes/_nav/settings/-settings-tabs.tsx +1 -1
- package/src/routes/_nav/settings/sync/route.lazy.tsx +40 -0
- package/src/routes/_nav/settings/sync/route.tsx +15 -0
- package/src/routes/_nav/tasks/index.lazy.tsx +1 -11
- package/src/routes/api/billing-webhook.ts +6 -2
- package/src/routes/api/sync/bootstrap.ts +38 -0
- package/src/routes/api/sync/pull.ts +96 -0
- package/src/routes/api/sync/push.ts +169 -0
- package/src/routes/api/sync/snapshot.ts +104 -0
- package/src/server/__tests__/fetch-guard.test.ts +2 -2
- package/src/server/__tests__/resource-registry.test.ts +4 -2
- package/src/server/__tests__/sandbox-entitlement.test.ts +5 -0
- package/src/server/__tests__/security-headers.test.ts +25 -0
- package/src/server/__tests__/task-assigned-query.test.ts +0 -11
- package/src/server/__tests__/task-serverfn-crud.test.ts +1 -22
- package/src/server/__tests__/task-serverfn-queries.test.ts +1 -9
- package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +0 -11
- package/src/server/ai-gateway/__tests__/embedding-request.test.ts +1 -1
- package/src/server/ai-gateway/__tests__/provider-adapter.test.ts +2 -2
- package/src/server/ai-gateway/__tests__/run-store-durable.test.ts +1 -1
- package/src/server/ai-gateway/durability/__tests__/pg-stream.test.ts +1 -1
- package/src/server/ai-gateway/durability/__tests__/reaper-real-db.test.ts +1 -1
- package/src/server/ai-gateway/memory/index.ts +2 -2
- package/src/server/ai-gateway/sandbox/__tests__/instance-store.test.ts +1 -1
- package/src/server/ai-task/assigned-query.ts +4 -15
- package/src/server/desktop-guest.ts +12 -0
- package/src/server/fetch-guard.ts +3 -3
- package/src/server/middlewares/desktop-token.ts +23 -0
- package/src/server/remote-auth.ts +6 -0
- package/src/server/serverFns/__tests__/billing.test.ts +58 -1
- package/src/server/serverFns/__tests__/update-seats.test.ts +8 -8
- package/src/server/serverFns/agents/agent-crud.ts +3 -1
- package/src/server/serverFns/auth/session.ts +9 -0
- package/src/server/serverFns/billing.ts +10 -4
- package/src/server/serverFns/bug/bug-crud.ts +7 -2
- package/src/server/serverFns/story/__tests__/labels.test.ts +37 -15
- package/src/server/serverFns/story/story-comments.ts +2 -1
- package/src/server/serverFns/story/story-crud/activities.ts +1 -1
- package/src/server/serverFns/story/story-crud/user-brief.ts +1 -1
- package/src/server/serverFns/story/story-crud.ts +2 -1
- package/src/server/serverFns/story/story-transfer.ts +2 -1
- package/src/server/serverFns/tasks/task-crud.ts +0 -13
- package/src/server/serverFns/tasks/task-queries.ts +1 -12
- package/src/server/serverFns/testcase/plans.ts +1 -1
- package/src/server/serverFns/testcase/run-cases.ts +1 -1
- package/src/server/serverFns/testcase/runs.ts +1 -1
- package/src/server/serverFns/testcase/testcase-activities.ts +1 -1
- package/src/server/serverFns/testcase/testcase-board.ts +1 -1
- package/src/server/serverFns/testcase/testcase-crud.ts +1 -1
- package/src/server/serverFns/workspace.ts +1 -1
- package/src/server/story/types.ts +7 -22
- package/src/server/story/user-brief.ts +48 -0
- package/src/server/sync/scopes.ts +29 -0
- package/src/start.ts +10 -2
- package/src/styles/globals.css +10 -0
- package/src/__tests__/desktop-connection-validate.test.ts +0 -66
- package/src/lib/vector-store/__tests__/sqlite-vec-store.test.ts +0 -143
- package/src/lib/vector-store/sqlite-vec-store.ts +0 -224
- package/src/paraglide/messages/tasks_ai_desktop_notice.js +0 -29
- package/src/routes/__desktop/onboarding/route.lazy.tsx +0 -175
- package/src/routes/__desktop/onboarding/route.tsx +0 -11
- package/src/routes/_nav/settings/connection/route.lazy.tsx +0 -64
- 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
|
-
|
|
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.
|
|
100
|
-
"lastUpdate": "Oct
|
|
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
|
-
* | "
|
|
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
|
|
@@ -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} */ (
|
|
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} */ (`
|
|
13
|
+
return /** @type {LocalizedString} */ (`Sign in`)
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* | output |
|
|
18
18
|
* | --- |
|
|
19
|
-
* | "
|
|
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} */ (`
|
|
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
|
-
* | "
|
|
4
|
+
* | "Sync" |
|
|
5
5
|
*
|
|
6
|
-
* @param {
|
|
6
|
+
* @param {Settings_Tabs_SyncInputs} inputs
|
|
7
7
|
* @param {{ locale?: "zh" | "en" }} options
|
|
8
8
|
* @returns {LocalizedString}
|
|
9
9
|
*/
|
|
10
|
-
export const
|
|
10
|
+
export const settings_tabs_sync: ((inputs?: Settings_Tabs_SyncInputs, options?: {
|
|
11
11
|
locale?: "zh" | "en";
|
|
12
|
-
}) => LocalizedString) & import("../runtime.js").MessageMetadata<
|
|
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
|
|
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} */ (
|
|
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
|
};
|
package/src/providers/index.tsx
CHANGED
|
@@ -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>
|