@allbluecn/shared 0.2.0

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 (95) hide show
  1. package/package.json +117 -0
  2. package/src/constants/perf.ts +21 -0
  3. package/src/i18n/client.ts +32 -0
  4. package/src/i18n/config.ts +104 -0
  5. package/src/i18n/detect.ts +43 -0
  6. package/src/i18n/locales/en/agents.json +134 -0
  7. package/src/i18n/locales/en/apps.json +6 -0
  8. package/src/i18n/locales/en/auth.json +88 -0
  9. package/src/i18n/locales/en/billing.json +78 -0
  10. package/src/i18n/locales/en/chat.json +194 -0
  11. package/src/i18n/locales/en/common.json +203 -0
  12. package/src/i18n/locales/en/dashboard.json +38 -0
  13. package/src/i18n/locales/en/design.json +70 -0
  14. package/src/i18n/locales/en/desktop.json +35 -0
  15. package/src/i18n/locales/en/display.json +37 -0
  16. package/src/i18n/locales/en/editor.json +304 -0
  17. package/src/i18n/locales/en/enterprise.json +1 -0
  18. package/src/i18n/locales/en/invite.json +11 -0
  19. package/src/i18n/locales/en/knowledge.json +451 -0
  20. package/src/i18n/locales/en/mindmap.json +28 -0
  21. package/src/i18n/locales/en/prd.json +43 -0
  22. package/src/i18n/locales/en/projects.json +133 -0
  23. package/src/i18n/locales/en/settings.json +375 -0
  24. package/src/i18n/locales/en/share.json +20 -0
  25. package/src/i18n/locales/en/story.json +785 -0
  26. package/src/i18n/locales/en/tags.json +42 -0
  27. package/src/i18n/locales/en/workspace.json +90 -0
  28. package/src/i18n/locales/zh/agents.json +134 -0
  29. package/src/i18n/locales/zh/apps.json +6 -0
  30. package/src/i18n/locales/zh/auth.json +88 -0
  31. package/src/i18n/locales/zh/billing.json +78 -0
  32. package/src/i18n/locales/zh/chat.json +194 -0
  33. package/src/i18n/locales/zh/common.json +203 -0
  34. package/src/i18n/locales/zh/dashboard.json +38 -0
  35. package/src/i18n/locales/zh/design.json +70 -0
  36. package/src/i18n/locales/zh/desktop.json +35 -0
  37. package/src/i18n/locales/zh/display.json +37 -0
  38. package/src/i18n/locales/zh/editor.json +304 -0
  39. package/src/i18n/locales/zh/enterprise.json +1 -0
  40. package/src/i18n/locales/zh/invite.json +11 -0
  41. package/src/i18n/locales/zh/knowledge.json +451 -0
  42. package/src/i18n/locales/zh/mindmap.json +28 -0
  43. package/src/i18n/locales/zh/prd.json +43 -0
  44. package/src/i18n/locales/zh/projects.json +133 -0
  45. package/src/i18n/locales/zh/settings.json +375 -0
  46. package/src/i18n/locales/zh/share.json +20 -0
  47. package/src/i18n/locales/zh/story.json +785 -0
  48. package/src/i18n/locales/zh/tags.json +42 -0
  49. package/src/i18n/locales/zh/workspace.json +90 -0
  50. package/src/i18n/server.ts +18 -0
  51. package/src/i18n/types.ts +5 -0
  52. package/src/index.ts +90 -0
  53. package/src/infrastructure/ai/adapter.ts +59 -0
  54. package/src/infrastructure/ai/cli-detector.ts +64 -0
  55. package/src/infrastructure/ip-location.ts +76 -0
  56. package/src/infrastructure/references/engine.ts +104 -0
  57. package/src/infrastructure/ua-parser.ts +107 -0
  58. package/src/interfaces/ai.ts +38 -0
  59. package/src/interfaces/avatar.ts +22 -0
  60. package/src/interfaces/module.ts +60 -0
  61. package/src/interfaces/references.ts +44 -0
  62. package/src/interfaces/transport.ts +26 -0
  63. package/src/lib/annotation-template.ts +33 -0
  64. package/src/lib/comment-utils.ts +47 -0
  65. package/src/lib/datetime.ts +115 -0
  66. package/src/lib/desktop-detect.ts +27 -0
  67. package/src/lib/outline-utils.ts +57 -0
  68. package/src/lib/pacer.ts +96 -0
  69. package/src/lib/prd/stack-layout.ts +53 -0
  70. package/src/lib/prd-tree-utils.ts +94 -0
  71. package/src/lib/prototype-registry.ts +24 -0
  72. package/src/lib/query-client-seam.ts +14 -0
  73. package/src/lib/share-events.ts +78 -0
  74. package/src/lib/sidebar-utils.ts +21 -0
  75. package/src/lib/stores/prd-canvas-store.ts +69 -0
  76. package/src/lib/tag-colors.ts +35 -0
  77. package/src/lib/time-format.ts +50 -0
  78. package/src/modules/ai-providers/constants.ts +79 -0
  79. package/src/modules/ai-providers/index.ts +21 -0
  80. package/src/modules/ai-providers/seed-data.ts +222 -0
  81. package/src/modules/ai-providers/types.ts +95 -0
  82. package/src/modules/billing/feature-registry.ts +63 -0
  83. package/src/modules/billing/plan-features-schema.ts +11 -0
  84. package/src/modules/billing/resource-registry.ts +80 -0
  85. package/src/modules/definitions/plugin.module.ts +38 -0
  86. package/src/modules/definitions/prd.module.ts +45 -0
  87. package/src/modules/definitions/prototype.module.ts +38 -0
  88. package/src/modules/dependencies/index.ts +186 -0
  89. package/src/modules/register-defaults.ts +27 -0
  90. package/src/modules/registry.ts +53 -0
  91. package/src/server-seam.ts +51 -0
  92. package/src/types/outline.ts +26 -0
  93. package/src/types/prd.ts +90 -0
  94. package/src/types/prototype.ts +12 -0
  95. package/src/virtual.d.ts +4 -0
package/package.json ADDED
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "@allbluecn/shared",
3
+ "version": "0.2.0",
4
+ "license": "AGPL-3.0-or-later",
5
+ "type": "module",
6
+ "main": "./src/index.ts",
7
+ "types": "./src/index.ts",
8
+ "exports": {
9
+ ".": "./src/index.ts",
10
+ "./infrastructure/ai/cli-detector": "./src/infrastructure/ai/cli-detector.ts",
11
+ "./infrastructure/ai/adapter": "./src/infrastructure/ai/adapter.ts",
12
+ "./interfaces/ai": "./src/interfaces/ai.ts",
13
+ "./interfaces/transport": "./src/interfaces/transport.ts",
14
+ "./modules/registry": "./src/modules/registry.ts",
15
+ "./modules/ai-providers": "./src/modules/ai-providers/index.ts",
16
+ "./types/prototype": "./src/types/prototype.ts",
17
+ "./types/prd": "./src/types/prd.ts",
18
+ "./types/outline": "./src/types/outline.ts",
19
+ "./lib/annotation-template": "./src/lib/annotation-template.ts",
20
+ "./lib/comment-utils": "./src/lib/comment-utils.ts",
21
+ "./lib/datetime": "./src/lib/datetime.ts",
22
+ "./lib/outline-utils": "./src/lib/outline-utils.ts",
23
+ "./lib/prd-tree-utils": "./src/lib/prd-tree-utils.ts",
24
+ "./lib/prototype-registry": "./src/lib/prototype-registry.ts",
25
+ "./lib/share-events": "./src/lib/share-events.ts",
26
+ "./lib/sidebar-utils": "./src/lib/sidebar-utils.ts",
27
+ "./lib/tag-colors": "./src/lib/tag-colors.ts",
28
+ "./lib/time-format": "./src/lib/time-format.ts",
29
+ "./lib/stores/prd-canvas-store": "./src/lib/stores/prd-canvas-store.ts",
30
+ "./lib/prd/stack-layout": "./src/lib/prd/stack-layout.ts",
31
+ "./lib/query-client-seam": "./src/lib/query-client-seam.ts",
32
+ "./i18n/server": "./src/i18n/server.ts",
33
+ "./i18n/client": "./src/i18n/client.ts",
34
+ "./i18n/config": "./src/i18n/config.ts",
35
+ "./i18n/detect": "./src/i18n/detect.ts",
36
+ "./i18n/types": "./src/i18n/types.ts",
37
+ "./lib/desktop-detect": "./src/lib/desktop-detect.ts",
38
+ "./lib/pacer": "./src/lib/pacer.ts",
39
+ "./server-seam": "./src/server-seam.ts"
40
+ },
41
+ "scripts": {
42
+ "test": "vitest",
43
+ "test:run": "vitest run",
44
+ "typecheck": "tsc --noEmit"
45
+ },
46
+ "peerDependencies": {
47
+ "@allblue/prototype": "file:../prototype",
48
+ "@tanstack/react-query": "^5.101.2",
49
+ "@tanstack/store": "^0.11.1",
50
+ "@tanstack/pacer": "^0.21.1",
51
+ "@tanstack/react-pacer": "^0.22.1",
52
+ "@tauri-apps/api": "^2.11.1",
53
+ "@testing-library/react": "^16.3.2",
54
+ "@tiptap/pm": "^3.27.4",
55
+ "@tiptap/react": "^3.27.4",
56
+ "@types/bcryptjs": "^2.4.6",
57
+ "@types/node": "^24.13.3",
58
+ "@types/react": "^19",
59
+ "@vitest/expect": "4.1.5",
60
+ "bcryptjs": "^3.0.3",
61
+ "i18next": "^25.10.10",
62
+ "i18next-browser-languagedetector": "^8.2.1",
63
+ "lucide-react": "^1.24.0",
64
+ "react": "19.2.4",
65
+ "react-i18next": "^15.7.4",
66
+ "jsdom": "^29.1.1",
67
+ "typescript": "^7",
68
+ "vite": "^8.1.5",
69
+ "vitest": "4.1.5"
70
+ },
71
+ "dependencies": {
72
+ "date-fns": "^4.4.0",
73
+ "date-fns-tz": "^3.2.0",
74
+ "i18next": "^25.10.10",
75
+ "i18next-browser-languagedetector": "^8.2.1",
76
+ "react-i18next": "^15.7.4",
77
+ "zod": "^3"
78
+ },
79
+ "devDependencies": {
80
+ "@allblue/prototype": "file:../prototype",
81
+ "@tanstack/react-query": "^5.101.2",
82
+ "@tanstack/store": "^0.11.1",
83
+ "@tanstack/pacer": "^0.21.1",
84
+ "@tanstack/react-pacer": "^0.22.1",
85
+ "@tauri-apps/api": "^2.11.1",
86
+ "@testing-library/react": "^16.3.2",
87
+ "@tiptap/pm": "^3.27.4",
88
+ "@tiptap/react": "^3.27.4",
89
+ "@types/bcryptjs": "^2.4.6",
90
+ "@types/node": "^24.13.3",
91
+ "@types/react": "^19",
92
+ "@vitest/expect": "4.1.5",
93
+ "bcryptjs": "^3.0.3",
94
+ "i18next": "^25.10.10",
95
+ "i18next-browser-languagedetector": "^8.2.1",
96
+ "lucide-react": "^1.24.0",
97
+ "react": "19.2.4",
98
+ "react-i18next": "^15.7.4",
99
+ "jsdom": "^29.1.1",
100
+ "typescript": "^7",
101
+ "vite": "^8.1.5",
102
+ "vitest": "4.1.5"
103
+ },
104
+ "repository": {
105
+ "type": "git",
106
+ "url": "git+https://github.com/urmynami/AllBlue.git"
107
+ },
108
+ "homepage": "https://github.com/urmynami/AllBlue#readme",
109
+ "bugs": {
110
+ "url": "https://github.com/urmynami/AllBlue/issues"
111
+ },
112
+ "files": [
113
+ "src",
114
+ "!src/**/*.test.*",
115
+ "!src/**/__tests__/**"
116
+ ]
117
+ }
@@ -0,0 +1,21 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // AllBlue - 理想之海
3
+ // Copyright (C) 2026 AllBlue Contributors
4
+ //
5
+ // This program is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU Affero General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU Affero General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU Affero General Public License
16
+ // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+
18
+ // 全站虚拟化/分页门槛常量(web / admin / desktop 统一)
19
+ export const VIRTUALIZE_THRESHOLD = 250;
20
+ export const LOAD_MORE_STEP = 200;
21
+ export const DND_STICKY_THRESHOLD = 500;
@@ -0,0 +1,32 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import i18next, { type i18n as I18nInstance } from 'i18next'
3
+ import { initReactI18next } from 'react-i18next'
4
+ import LanguageDetector from 'i18next-browser-languagedetector'
5
+ import { resources, fallbackLng, defaultNs, supportedLngs } from './config'
6
+
7
+ let clientI18n: I18nInstance | null = null
8
+
9
+ export function getClientI18n(): I18nInstance {
10
+ if (!clientI18n) {
11
+ clientI18n = i18next.createInstance()
12
+ clientI18n
13
+ .use(initReactI18next)
14
+ .use(LanguageDetector)
15
+ .init({
16
+ fallbackLng,
17
+ defaultNS: defaultNs,
18
+ supportedLngs: [...supportedLngs],
19
+ resources,
20
+ interpolation: { escapeValue: false },
21
+ react: { useSuspense: false },
22
+ detection: {
23
+ order: ['querystring', 'cookie', 'localStorage', 'navigator'],
24
+ lookupQuerystring: 'lng',
25
+ lookupCookie: 'lng',
26
+ lookupLocalStorage: 'lng',
27
+ caches: ['cookie', 'localStorage'],
28
+ },
29
+ })
30
+ }
31
+ return clientI18n
32
+ }
@@ -0,0 +1,104 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import zhCommon from './locales/zh/common.json'
3
+ import enCommon from './locales/en/common.json'
4
+ import zhAuth from './locales/zh/auth.json'
5
+ import enAuth from './locales/en/auth.json'
6
+ import zhWorkspace from './locales/zh/workspace.json'
7
+ import enWorkspace from './locales/en/workspace.json'
8
+ import zhPrd from './locales/zh/prd.json'
9
+ import enPrd from './locales/en/prd.json'
10
+ import zhProjects from './locales/zh/projects.json'
11
+ import enProjects from './locales/en/projects.json'
12
+ import zhKnowledge from './locales/zh/knowledge.json'
13
+ import enKnowledge from './locales/en/knowledge.json'
14
+ import zhChat from './locales/zh/chat.json'
15
+ import enChat from './locales/en/chat.json'
16
+ import zhSettings from './locales/zh/settings.json'
17
+ import enSettings from './locales/en/settings.json'
18
+ import zhTags from './locales/zh/tags.json'
19
+ import enTags from './locales/en/tags.json'
20
+ import zhDesign from './locales/zh/design.json'
21
+ import enDesign from './locales/en/design.json'
22
+ import zhApps from './locales/zh/apps.json'
23
+ import enApps from './locales/en/apps.json'
24
+ import zhBilling from './locales/zh/billing.json'
25
+ import enBilling from './locales/en/billing.json'
26
+ import zhEnterprise from './locales/zh/enterprise.json'
27
+ import enEnterprise from './locales/en/enterprise.json'
28
+ import zhDesktop from './locales/zh/desktop.json'
29
+ import enDesktop from './locales/en/desktop.json'
30
+ import zhStory from './locales/zh/story.json'
31
+ import enStory from './locales/en/story.json'
32
+ import zhDisplay from './locales/zh/display.json'
33
+ import enDisplay from './locales/en/display.json'
34
+ import zhMindmap from './locales/zh/mindmap.json'
35
+ import enMindmap from './locales/en/mindmap.json'
36
+ import zhDashboard from './locales/zh/dashboard.json'
37
+ import enDashboard from './locales/en/dashboard.json'
38
+ import zhEditor from './locales/zh/editor.json'
39
+ import enEditor from './locales/en/editor.json'
40
+ import zhAgents from './locales/zh/agents.json'
41
+ import enAgents from './locales/en/agents.json'
42
+ import zhInvite from './locales/zh/invite.json'
43
+ import enInvite from './locales/en/invite.json'
44
+
45
+ export const supportedLngs = ['zh', 'en'] as const
46
+ export type AppLocale = (typeof supportedLngs)[number]
47
+ export const fallbackLng: AppLocale = 'zh'
48
+ export const defaultNs = 'common'
49
+
50
+ export const resources = {
51
+ zh: {
52
+ common: zhCommon,
53
+ auth: zhAuth,
54
+ workspace: zhWorkspace,
55
+ prd: zhPrd,
56
+ projects: zhProjects,
57
+ knowledge: zhKnowledge,
58
+ chat: zhChat,
59
+ settings: zhSettings,
60
+ tags: zhTags,
61
+ design: zhDesign,
62
+ apps: zhApps,
63
+ billing: zhBilling,
64
+ enterprise: zhEnterprise,
65
+ desktop: zhDesktop,
66
+ story: zhStory,
67
+ mindmap: zhMindmap,
68
+ display: zhDisplay,
69
+ dashboard: zhDashboard,
70
+ editor: zhEditor,
71
+ agents: zhAgents,
72
+ invite: zhInvite,
73
+ },
74
+ en: {
75
+ common: enCommon,
76
+ auth: enAuth,
77
+ workspace: enWorkspace,
78
+ prd: enPrd,
79
+ projects: enProjects,
80
+ knowledge: enKnowledge,
81
+ chat: enChat,
82
+ settings: enSettings,
83
+ tags: enTags,
84
+ design: enDesign,
85
+ apps: enApps,
86
+ billing: enBilling,
87
+ enterprise: enEnterprise,
88
+ desktop: enDesktop,
89
+ story: enStory,
90
+ mindmap: enMindmap,
91
+ display: enDisplay,
92
+ dashboard: enDashboard,
93
+ editor: enEditor,
94
+ agents: enAgents,
95
+ invite: enInvite,
96
+ },
97
+ } as const
98
+
99
+ export const namespaces = Object.keys(resources.zh) as Array<keyof typeof resources.zh>
100
+ export type NamespaceKey = (typeof namespaces)[number]
101
+
102
+ export function isSupportedLocale(lng: string): lng is AppLocale {
103
+ return (supportedLngs as readonly string[]).includes(lng)
104
+ }
@@ -0,0 +1,43 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ import { supportedLngs, fallbackLng, isSupportedLocale, type AppLocale } from './config'
3
+
4
+ export function detectLocale(request: Request, userLocale: string | null): AppLocale {
5
+ const url = new URL(request.url)
6
+ const queryLng = url.searchParams.get('lng')
7
+ if (queryLng && isSupportedLocale(queryLng)) return queryLng
8
+
9
+ const cookieHeader = request.headers.get('cookie') ?? ''
10
+ const cookieLng = parseCookieValue(cookieHeader, 'lng')
11
+ if (cookieLng && isSupportedLocale(cookieLng)) return cookieLng
12
+
13
+ if (userLocale && isSupportedLocale(userLocale)) return userLocale
14
+
15
+ const acceptLang = request.headers.get('accept-language')
16
+ if (acceptLang) {
17
+ const detected = matchBestLanguage(acceptLang)
18
+ if (detected) return detected
19
+ }
20
+
21
+ return fallbackLng
22
+ }
23
+
24
+ function parseCookieValue(cookieHeader: string, key: string): string | null {
25
+ const match = cookieHeader.match(new RegExp(`(?:^|;\\s*)${key}=([^;]+)`))
26
+ return match ? match[1] : null
27
+ }
28
+
29
+ function matchBestLanguage(acceptLang: string): AppLocale | null {
30
+ const entries = acceptLang
31
+ .split(',')
32
+ .map((part) => {
33
+ const [lang, qPart] = part.trim().split(';q=')
34
+ return { lang: lang.trim(), q: qPart ? parseFloat(qPart) : 1 }
35
+ })
36
+ .sort((a, b) => b.q - a.q)
37
+
38
+ for (const entry of entries) {
39
+ const base = entry.lang.split('-')[0].toLowerCase()
40
+ if (isSupportedLocale(base)) return base as AppLocale
41
+ }
42
+ return null
43
+ }
@@ -0,0 +1,134 @@
1
+ {
2
+ "page": {
3
+ "title": "Agents",
4
+ "description": "Manage your AI agents and skills",
5
+ "tabs": {
6
+ "agents": "Agents",
7
+ "skills": "Skills"
8
+ }
9
+ },
10
+ "agent": {
11
+ "create": "Create Agent",
12
+ "edit": "Edit Agent",
13
+ "delete": "Delete Agent",
14
+ "deleteConfirmTitle": "Delete Agent",
15
+ "deleteConfirmDesc": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.",
16
+ "deleteConfirmText": "Delete",
17
+ "deleteSuccess": "Agent deleted",
18
+ "deleteFailed": "Failed to delete agent",
19
+ "created": "Agent created",
20
+ "updated": "Agent updated",
21
+ "saveFailed": "Failed to save agent",
22
+ "agentQuotaExceeded": "Agent quota exceeded. Please upgrade your plan.",
23
+ "empty": {
24
+ "title": "No agents yet",
25
+ "description": "Create your first AI agent to have a personal assistant",
26
+ "createFirst": "Create first agent"
27
+ }
28
+ },
29
+ "agentForm": {
30
+ "title": {
31
+ "create": "Create Agent",
32
+ "edit": "Edit Agent"
33
+ },
34
+ "description": {
35
+ "create": "Configure the agent name, persona, tools, and model",
36
+ "edit": "Modify the agent configuration"
37
+ },
38
+ "nameLabel": "Name",
39
+ "namePlaceholder": "e.g. PRD Reviewer",
40
+ "nameRequired": "Name is required",
41
+ "descriptionLabel": "Description",
42
+ "descriptionPlaceholder": "Briefly describe what this agent does",
43
+ "systemPromptLabel": "System Prompt",
44
+ "systemPromptPlaceholder": "Describe the agent's role, tone, and behavior",
45
+ "systemPromptRequired": "System prompt is required",
46
+ "greetingLabel": "Greeting",
47
+ "greetingPlaceholder": "The agent's first message",
48
+ "greetingOptional": "Optional, used as the opening greeting",
49
+ "modelLabel": "Model",
50
+ "modelPlaceholder": "Select model",
51
+ "modelOptional": "Leave empty to use the global default model",
52
+ "temperatureLabel": "Temperature",
53
+ "temperatureHint": "Higher is more creative, lower is more stable",
54
+ "suggestedPromptsLabel": "Suggested Prompts",
55
+ "suggestedPromptsHint": "Up to 4 prompts shown when the user starts a conversation",
56
+ "suggestedPromptPlaceholder": "e.g. Review this PRD for me",
57
+ "addSuggestedPrompt": "Add prompt",
58
+ "allowedToolsLabel": "Allowed Tools",
59
+ "allowedToolsHint": "Select tools available to this agent",
60
+ "knowledgeBasesLabel": "Knowledge Bases",
61
+ "knowledgeBasesHint": "Select knowledge bases this agent can search",
62
+ "save": "Save",
63
+ "create": "Create",
64
+ "saving": "Saving...",
65
+ "creating": "Creating...",
66
+ "cancel": "Cancel"
67
+ },
68
+ "card": {
69
+ "edit": "Edit",
70
+ "delete": "Delete",
71
+ "createdAt": "Created {{date}}",
72
+ "updatedAt": "Updated {{date}}",
73
+ "tools": "Tools",
74
+ "knowledgeBases": "Knowledge Bases",
75
+ "model": "Model",
76
+ "temperature": "Temperature",
77
+ "noDescription": "No description",
78
+ "noTools": "No tools configured",
79
+ "noKnowledgeBases": "No knowledge bases linked"
80
+ },
81
+ "skill": {
82
+ "create": "Create Skill",
83
+ "edit": "Edit Skill",
84
+ "delete": "Delete Skill",
85
+ "deleteConfirmTitle": "Delete Skill",
86
+ "deleteConfirmDesc": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.",
87
+ "deleteConfirmText": "Delete",
88
+ "deleteSuccess": "Skill deleted",
89
+ "deleteFailed": "Failed to delete skill",
90
+ "created": "Skill created",
91
+ "updated": "Skill updated",
92
+ "saveFailed": "Failed to save skill",
93
+ "skillQuotaExceeded": "Skill quota exceeded. Please upgrade your plan.",
94
+ "nameConflict": "Skill name already exists",
95
+ "empty": {
96
+ "title": "No skills yet",
97
+ "description": "Create your first AI skill to extend agent capabilities",
98
+ "createFirst": "Create first skill"
99
+ }
100
+ },
101
+ "skillForm": {
102
+ "title": {
103
+ "create": "Create Skill",
104
+ "edit": "Edit Skill"
105
+ },
106
+ "description": {
107
+ "create": "Define the skill name, title, and template",
108
+ "edit": "Modify skill configuration"
109
+ },
110
+ "nameLabel": "Identifier",
111
+ "namePlaceholder": "e.g. code-review",
112
+ "nameRequired": "Identifier is required",
113
+ "nameInvalid": "Only lowercase letters, numbers, and hyphens allowed",
114
+ "titleLabel": "Title",
115
+ "titlePlaceholder": "e.g. Code Review",
116
+ "titleRequired": "Title is required",
117
+ "templateLabel": "Template",
118
+ "templatePlaceholder": "Define the skill's execution steps and instructions...",
119
+ "templateRequired": "Template is required",
120
+ "save": "Save",
121
+ "create": "Create",
122
+ "saving": "Saving...",
123
+ "creating": "Creating...",
124
+ "cancel": "Cancel"
125
+ },
126
+ "tools": {
127
+ "knowledge_search": "Knowledge Search",
128
+ "document_action": "Document Action",
129
+ "user_data_query": "User Data Query",
130
+ "web_search": "Web Search",
131
+ "reindex_knowledge_base": "Reindex Knowledge Base",
132
+ "delete_project": "Delete Project"
133
+ }
134
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "title": "Apps",
3
+ "detail": {
4
+ "title": "AnyHub Detail"
5
+ }
6
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "login": {
3
+ "title": "Welcome Back",
4
+ "subtitle": "Sign in to access your dashboard, settings, and projects.",
5
+ "orWithEmail": "Or sign in with email",
6
+ "emailLabel": "Email",
7
+ "emailPlaceholder": "name@example.com",
8
+ "passwordLabel": "Password",
9
+ "passwordPlaceholder": "Enter your password",
10
+ "remember": "Remember for 30 days",
11
+ "forgotPassword": "Forgot password?",
12
+ "submitting": "Signing in…",
13
+ "submit": "Sign In",
14
+ "noAccount": "Don't have an account?",
15
+ "createAccount": "Create account",
16
+ "invalidCredentials": "Invalid email or password",
17
+ "success": "Login successful",
18
+ "serverError": "Server error",
19
+ "googleNotConfigured": "Google login is not configured. Please contact your administrator to set AUTH_GOOGLE_ID and AUTH_GOOGLE_SECRET.",
20
+ "useProvider": "Sign in with {{name}} {{action}}",
21
+ "defaultAction": "Sign in",
22
+ "ssoDetected": "Detected corporate email. Please sign in with SSO",
23
+ "ssoLoginWith": "Sign in with {{name}} SSO",
24
+ "ssoContinueWithEmail": "Use email instead",
25
+ "ssoFailed": "Single sign-on failed. Please retry or contact your administrator",
26
+ "ssoSubmitting": "Signing in with SSO..."
27
+ },
28
+ "register": {
29
+ "title": "Create Account",
30
+ "subtitle": "Register to start using the product workspace.",
31
+ "orWithEmail": "Or register with email",
32
+ "usernameLabel": "Username",
33
+ "usernamePlaceholder": "Your username",
34
+ "emailLabel": "Email",
35
+ "passwordLabel": "Password",
36
+ "passwordPlaceholder": "Enter password",
37
+ "confirmPasswordLabel": "Confirm password",
38
+ "confirmPasswordPlaceholder": "Re-enter password",
39
+ "invitationCodeLabel": "Invitation code",
40
+ "invitationCodePlaceholder": "Enter invitation code",
41
+ "submitting": "Registering…",
42
+ "submit": "Create account",
43
+ "hasAccount": "Already have an account?",
44
+ "goLogin": "Sign in",
45
+ "success": "Registration successful, please sign in",
46
+ "failed": "Registration failed"
47
+ },
48
+ "resetPassword": {
49
+ "title": "Reset Password",
50
+ "subtitle": "Please enter your new password.",
51
+ "newPasswordLabel": "New password",
52
+ "newPasswordPlaceholder": "At least 8 characters",
53
+ "confirmPasswordLabel": "Confirm password",
54
+ "confirmPasswordPlaceholder": "Re-enter new password",
55
+ "submitting": "Resetting…",
56
+ "submit": "Reset password",
57
+ "goLogin": "Back to login",
58
+ "success": "Password reset successfully",
59
+ "failed": "Reset failed"
60
+ },
61
+ "forgotPassword": {
62
+ "title": "Forgot Password",
63
+ "subtitle": "Enter your registered email, we will send a password reset link.",
64
+ "emailLabel": "Email",
65
+ "submitting": "Sending…",
66
+ "submit": "Send reset link",
67
+ "remembered": "Remembered your password?",
68
+ "goLogin": "Back to login",
69
+ "sent": "Reset link sent to your email",
70
+ "failed": "Send failed",
71
+ "brandSubtitle": "We will send you a reset link after verification."
72
+ },
73
+ "features": {
74
+ "userResearch": "User Research",
75
+ "userResearchDesc": "Structured management",
76
+ "dataAnalysis": "Data Analysis",
77
+ "dataAnalysisDesc": "Visualization",
78
+ "teamCollaboration": "Team Collaboration",
79
+ "teamCollaborationDesc": "Efficient communication",
80
+ "roadmap": "Roadmap",
81
+ "roadmapDesc": "Plan the future"
82
+ },
83
+ "brand": {
84
+ "title": "Welcome Back to AllBlue",
85
+ "subtitle": "A product-centric workspace, built for product managers."
86
+ },
87
+ "demo": "Demo: demo@example.com / password123"
88
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "title": "Billing",
3
+ "comingSoon": "Payment for China region is coming soon",
4
+ "needHigherPlan": "{{label}} requires a higher plan",
5
+ "upgradeToPro": "Upgrade to Pro",
6
+ "freePlan": "Free Plan",
7
+ "freeDescription": "Basic features, 14-day free Pro trial",
8
+ "planName": "{{name}} Plan",
9
+ "statusLabel": "Status: {{status}}",
10
+ "trialUntil": "Trial until {{date}}",
11
+ "expiresAt": "Expires: {{date}}",
12
+ "currencyLabel": "Currency: {{currency}}",
13
+ "manageBilling": "Manage Billing",
14
+ "saasOnly": "Subscription is only available in SaaS mode",
15
+ "choosePlanTitle": "Choose your plan",
16
+ "trialDescription": "14-day free Pro trial, no credit card required",
17
+ "free": "Free",
18
+ "perMonth": "/month",
19
+ "maxSeats": "Up to {{count}} members",
20
+ "aiQuota": "AI quota: {{quota}}/month",
21
+ "currentPlan": "Current Plan",
22
+ "startTrial": "Start Trial",
23
+ "noInvoices": "No invoice records",
24
+ "invoiceHistory": "Invoice History",
25
+ "date": "Date",
26
+ "amount": "Amount",
27
+ "status": "Status",
28
+ "action": "Action",
29
+ "view": "View",
30
+ "paid": "Paid",
31
+ "unpaid": "Unpaid",
32
+ "requiresLogin": "This feature requires an AllBlue account login",
33
+ "loginToUnlock": "Login to unlock{{feature}}",
34
+ "loginToUnlockFeature": "Login to unlock \"{{feature}}\"",
35
+ "moreFeatures": "More Features",
36
+ "loginDescription": "This feature requires an AllBlue account login. After login, data remains local, only unlocking subscription benefits and hosted services.",
37
+ "loginBenefit1": "Access subscription benefits (hosted AI, advanced features) after login",
38
+ "loginBenefit2": "Local data is not lost and remains on your machine",
39
+ "loginBenefit3": "You can log out anytime to return to guest mode",
40
+ "later": "Later",
41
+ "goToLogin": "Go to Login",
42
+ "checkoutCreateFailed": "Failed to create payment session: {{message}}",
43
+ "portalOpenFailed": "Failed to open billing portal: {{message}}",
44
+ "featureMultiProvider": "Multi AI Provider",
45
+ "featureHostedAi": "Hosted AI",
46
+ "featureLargePageSize": "Large Page Size (500/1000 per page)",
47
+ "featureByokAi": "Bring Your Own AI Key",
48
+ "featureAiQuota": "AI Quota",
49
+ "featureSso": "SSO Single Sign-On",
50
+ "featureAuditLog": "Audit Log",
51
+ "openBrowserFailed": "Failed to open browser: {{message}}",
52
+ "unknownError": "Unknown error",
53
+ "pricing": {
54
+ "freeDesc": "Free to use, suitable for individuals and small teams",
55
+ "startFree": "Start Free Now",
56
+ "viewPro": "View Pro Plan Details"
57
+ },
58
+ "seatsUsedLabel": "Seats in use: {{seats}}",
59
+ "seatsManager": {
60
+ "title": "Seats",
61
+ "success": "Seats updated, effective immediately"
62
+ },
63
+ "seatsUsage": "Seats: {{usage}} / {{limit}}",
64
+ "seatsBase": "Base {{base}}",
65
+ "seatsAddonCount": "Add-on {{count}}",
66
+ "seatsRemove": "Remove seat",
67
+ "seatsAdd": "Add seat",
68
+ "seatsUnitPrice": "Billed monthly per seat",
69
+ "seatsFloorHint": "{{usage}} active members, cannot go lower",
70
+ "seatsProrationHint": "Changes are prorated and take effect immediately",
71
+ "seatsConfirm": "Confirm change",
72
+ "seatsUnlimited": "Unlimited seats on this plan",
73
+ "seatsUpgradeCta": "Seat add-ons are a Pro feature. Upgrade to adjust seats freely",
74
+ "seatsGoBilling": "View upgrade options",
75
+ "seatsBuyCta": "Buy more seats",
76
+ "seatsPaymentUnavailable": "Seat management requires online payment, coming soon in your region",
77
+ "seatsCheckoutRedirect": "First-time seat add-on requires payment authorization"
78
+ }