@talex-touch/utils 1.0.42 → 1.0.45

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 (234) hide show
  1. package/.eslintcache +1 -0
  2. package/__tests__/cloud-sync-sdk.test.ts +442 -0
  3. package/__tests__/icons/icons.test.ts +84 -0
  4. package/__tests__/plugin-sdk-lifecycle.test.ts +130 -0
  5. package/__tests__/power-sdk.test.ts +143 -0
  6. package/__tests__/preset-export-types.test.ts +108 -0
  7. package/__tests__/search/fuzzy-match.test.ts +137 -0
  8. package/__tests__/transport/port-policy.test.ts +44 -0
  9. package/__tests__/transport-domain-sdks.test.ts +152 -0
  10. package/__tests__/types/update.test.ts +67 -0
  11. package/account/account-sdk.ts +915 -0
  12. package/account/index.ts +2 -0
  13. package/account/types.ts +321 -0
  14. package/analytics/client.ts +136 -0
  15. package/analytics/index.ts +2 -0
  16. package/analytics/types.ts +156 -0
  17. package/animation/auto-resize.ts +322 -0
  18. package/animation/window-node.ts +26 -19
  19. package/auth/clerk-types.ts +12 -30
  20. package/auth/index.ts +0 -2
  21. package/auth/useAuthState.ts +6 -14
  22. package/base/index.ts +2 -0
  23. package/base/log-level.ts +105 -0
  24. package/channel/index.ts +170 -69
  25. package/cloud-sync/cloud-sync-sdk.ts +450 -0
  26. package/cloud-sync/index.ts +1 -0
  27. package/common/file-scan-utils.ts +17 -9
  28. package/common/index.ts +4 -0
  29. package/common/logger/index.ts +46 -0
  30. package/common/logger/logger-manager.ts +303 -0
  31. package/common/logger/module-logger.ts +270 -0
  32. package/common/logger/transport-logger.ts +234 -0
  33. package/common/logger/types.ts +93 -0
  34. package/common/search/gather.ts +48 -6
  35. package/common/search/index.ts +8 -0
  36. package/common/storage/constants.ts +13 -0
  37. package/common/storage/entity/app-settings.ts +245 -0
  38. package/common/storage/entity/index.ts +3 -0
  39. package/common/storage/entity/layout-atom-types.ts +147 -0
  40. package/common/storage/entity/openers.ts +1 -0
  41. package/common/storage/entity/preset-cloud-api.ts +132 -0
  42. package/common/storage/entity/preset-export-types.ts +256 -0
  43. package/common/storage/entity/shortcut-settings.ts +1 -0
  44. package/common/storage/shortcut-storage.ts +11 -0
  45. package/common/utils/clone-diagnostics.ts +105 -0
  46. package/common/utils/file.ts +16 -8
  47. package/common/utils/index.ts +6 -2
  48. package/common/utils/payload-preview.ts +173 -0
  49. package/common/utils/polling.ts +167 -13
  50. package/common/utils/safe-path.ts +103 -0
  51. package/common/utils/safe-shell.ts +115 -0
  52. package/common/utils/task-queue.ts +4 -1
  53. package/core-box/builder/tuff-builder.ts +0 -1
  54. package/core-box/index.ts +1 -1
  55. package/core-box/recommendation.ts +38 -1
  56. package/core-box/tuff/tuff-dsl.ts +32 -0
  57. package/electron/download-manager.ts +10 -7
  58. package/electron/env-tool.ts +42 -40
  59. package/electron/index.ts +0 -1
  60. package/env/index.ts +156 -0
  61. package/eslint.config.js +55 -0
  62. package/i18n/index.ts +62 -0
  63. package/i18n/locales/en.json +226 -0
  64. package/i18n/locales/zh.json +226 -0
  65. package/i18n/message-keys.ts +236 -0
  66. package/i18n/resolver.ts +181 -0
  67. package/icons/index.ts +257 -0
  68. package/icons/svg.ts +69 -0
  69. package/index.ts +9 -1
  70. package/intelligence/client.ts +72 -42
  71. package/market/constants.ts +9 -5
  72. package/market/index.ts +1 -1
  73. package/market/types.ts +19 -4
  74. package/package.json +15 -5
  75. package/permission/index.ts +143 -46
  76. package/permission/legacy.ts +26 -0
  77. package/permission/registry.ts +304 -0
  78. package/permission/types.ts +164 -0
  79. package/plugin/channel.ts +68 -39
  80. package/plugin/index.ts +80 -7
  81. package/plugin/install.ts +3 -0
  82. package/plugin/log/types.ts +22 -5
  83. package/plugin/node/logger-manager.ts +11 -3
  84. package/plugin/node/logger.ts +24 -17
  85. package/plugin/preload.ts +25 -2
  86. package/plugin/providers/index.ts +4 -4
  87. package/plugin/providers/market-client.ts +6 -3
  88. package/plugin/providers/npm-provider.ts +22 -7
  89. package/plugin/providers/tpex-provider.ts +22 -8
  90. package/plugin/sdk/box-items.ts +14 -0
  91. package/plugin/sdk/box-sdk.ts +64 -0
  92. package/plugin/sdk/channel.ts +119 -4
  93. package/plugin/sdk/clipboard.ts +26 -12
  94. package/plugin/sdk/cloud-sync.ts +113 -0
  95. package/plugin/sdk/common.ts +19 -11
  96. package/plugin/sdk/core-box.ts +6 -15
  97. package/plugin/sdk/division-box.ts +160 -65
  98. package/plugin/sdk/examples/storage-onDidChange-example.js +5 -2
  99. package/plugin/sdk/feature-sdk.ts +111 -76
  100. package/plugin/sdk/flow.ts +146 -45
  101. package/plugin/sdk/hooks/bridge.ts +13 -6
  102. package/plugin/sdk/hooks/life-cycle.ts +35 -16
  103. package/plugin/sdk/index.ts +14 -3
  104. package/plugin/sdk/intelligence.ts +87 -0
  105. package/plugin/sdk/meta/README.md +179 -0
  106. package/plugin/sdk/meta-sdk.ts +244 -0
  107. package/plugin/sdk/notification.ts +9 -0
  108. package/plugin/sdk/plugin-info.ts +64 -0
  109. package/plugin/sdk/power.ts +155 -0
  110. package/plugin/sdk/recommend.ts +21 -0
  111. package/plugin/sdk/service/index.ts +12 -8
  112. package/plugin/sdk/sqlite.ts +141 -0
  113. package/plugin/sdk/storage.ts +2 -6
  114. package/plugin/sdk/system.ts +2 -9
  115. package/plugin/sdk/temp-files.ts +41 -0
  116. package/plugin/sdk/touch-sdk.ts +18 -0
  117. package/plugin/sdk/types.ts +44 -4
  118. package/plugin/sdk/window/index.ts +12 -9
  119. package/plugin/sdk-version.ts +231 -0
  120. package/preload/renderer.ts +3 -2
  121. package/renderer/hooks/arg-mapper.ts +16 -2
  122. package/renderer/hooks/index.ts +13 -0
  123. package/renderer/hooks/initialize.ts +2 -1
  124. package/renderer/hooks/use-agent-market-sdk.ts +7 -0
  125. package/renderer/hooks/use-agent-market.ts +106 -0
  126. package/renderer/hooks/use-agents-sdk.ts +7 -0
  127. package/renderer/hooks/use-app-sdk.ts +7 -0
  128. package/renderer/hooks/use-channel.ts +33 -4
  129. package/renderer/hooks/use-download-sdk.ts +21 -0
  130. package/renderer/hooks/use-intelligence-sdk.ts +7 -0
  131. package/renderer/hooks/use-intelligence-stats.ts +290 -0
  132. package/renderer/hooks/use-intelligence.ts +55 -214
  133. package/renderer/hooks/use-market-sdk.ts +16 -0
  134. package/renderer/hooks/use-notification-sdk.ts +7 -0
  135. package/renderer/hooks/use-permission-sdk.ts +7 -0
  136. package/renderer/hooks/use-permission.ts +325 -0
  137. package/renderer/hooks/use-platform-sdk.ts +7 -0
  138. package/renderer/hooks/use-plugin-sdk.ts +16 -0
  139. package/renderer/hooks/use-settings-sdk.ts +7 -0
  140. package/renderer/hooks/use-update-sdk.ts +21 -0
  141. package/renderer/index.ts +1 -0
  142. package/renderer/ref.ts +19 -10
  143. package/renderer/shared/components/SharedPluginDetailContent.vue +84 -0
  144. package/renderer/shared/components/SharedPluginDetailHeader.vue +116 -0
  145. package/renderer/shared/components/SharedPluginDetailMetaList.vue +39 -0
  146. package/renderer/shared/components/SharedPluginDetailReadme.vue +45 -0
  147. package/renderer/shared/components/SharedPluginDetailVersions.vue +98 -0
  148. package/renderer/shared/components/index.ts +5 -0
  149. package/renderer/shared/components/shims-vue.d.ts +5 -0
  150. package/renderer/shared/index.ts +2 -0
  151. package/renderer/shared/plugin-detail.ts +62 -0
  152. package/renderer/storage/app-settings.ts +3 -1
  153. package/renderer/storage/base-storage.ts +508 -82
  154. package/renderer/storage/intelligence-storage.ts +31 -40
  155. package/renderer/storage/openers.ts +3 -1
  156. package/renderer/storage/storage-subscription.ts +126 -42
  157. package/renderer/touch-sdk/env.ts +10 -10
  158. package/renderer/touch-sdk/index.ts +114 -18
  159. package/renderer/touch-sdk/terminal.ts +24 -13
  160. package/search/feature-matcher.ts +279 -0
  161. package/search/fuzzy-match.ts +64 -34
  162. package/search/index.ts +10 -0
  163. package/search/levenshtein-utils.ts +17 -11
  164. package/transport/errors.ts +310 -0
  165. package/transport/event/builder.ts +378 -0
  166. package/transport/event/index.ts +7 -0
  167. package/transport/event/types.ts +292 -0
  168. package/transport/events/index.ts +2690 -0
  169. package/transport/events/meta-overlay.ts +79 -0
  170. package/transport/events/types/agents.ts +177 -0
  171. package/transport/events/types/app-index.ts +20 -0
  172. package/transport/events/types/app.ts +475 -0
  173. package/transport/events/types/box-item.ts +222 -0
  174. package/transport/events/types/clipboard.ts +80 -0
  175. package/transport/events/types/core-box.ts +534 -0
  176. package/transport/events/types/device-idle.ts +7 -0
  177. package/transport/events/types/division-box.ts +99 -0
  178. package/transport/events/types/download.ts +115 -0
  179. package/transport/events/types/file-index.ts +84 -0
  180. package/transport/events/types/flow.ts +149 -0
  181. package/transport/events/types/index.ts +70 -0
  182. package/transport/events/types/market.ts +39 -0
  183. package/transport/events/types/meta-overlay.ts +184 -0
  184. package/transport/events/types/notification.ts +140 -0
  185. package/transport/events/types/permission.ts +90 -0
  186. package/transport/events/types/platform.ts +8 -0
  187. package/transport/events/types/plugin.ts +631 -0
  188. package/transport/events/types/sentry.ts +20 -0
  189. package/transport/events/types/storage.ts +208 -0
  190. package/transport/events/types/transport.ts +60 -0
  191. package/transport/events/types/tray.ts +16 -0
  192. package/transport/events/types/update.ts +78 -0
  193. package/transport/index.ts +141 -0
  194. package/transport/main.ts +2 -0
  195. package/transport/prelude.ts +208 -0
  196. package/transport/sdk/constants.ts +29 -0
  197. package/transport/sdk/domains/agents-market.ts +47 -0
  198. package/transport/sdk/domains/agents.ts +62 -0
  199. package/transport/sdk/domains/app.ts +48 -0
  200. package/transport/sdk/domains/disposable.ts +35 -0
  201. package/transport/sdk/domains/download.ts +139 -0
  202. package/transport/sdk/domains/index.ts +13 -0
  203. package/transport/sdk/domains/intelligence.ts +616 -0
  204. package/transport/sdk/domains/market.ts +35 -0
  205. package/transport/sdk/domains/notification.ts +62 -0
  206. package/transport/sdk/domains/permission.ts +85 -0
  207. package/transport/sdk/domains/platform.ts +19 -0
  208. package/transport/sdk/domains/plugin.ts +144 -0
  209. package/transport/sdk/domains/settings.ts +102 -0
  210. package/transport/sdk/domains/update.ts +64 -0
  211. package/transport/sdk/index.ts +60 -0
  212. package/transport/sdk/main-transport.ts +710 -0
  213. package/transport/sdk/main.ts +9 -0
  214. package/transport/sdk/plugin-transport.ts +654 -0
  215. package/transport/sdk/port-policy.ts +38 -0
  216. package/transport/sdk/renderer-transport.ts +1165 -0
  217. package/transport/types.ts +605 -0
  218. package/types/agent.ts +399 -0
  219. package/types/cloud-sync.ts +157 -0
  220. package/types/division-box.ts +31 -31
  221. package/types/download.ts +1 -0
  222. package/types/flow.ts +63 -12
  223. package/types/icon.ts +2 -1
  224. package/types/index.ts +5 -0
  225. package/types/intelligence.ts +166 -173
  226. package/types/modules/base.ts +2 -0
  227. package/types/path-browserify.d.ts +5 -0
  228. package/types/platform.ts +12 -0
  229. package/types/startup-info.ts +32 -0
  230. package/types/touch-app-core.ts +8 -8
  231. package/types/update.ts +94 -1
  232. package/vitest.config.ts +25 -0
  233. package/auth/useClerkConfig.ts +0 -40
  234. package/auth/useClerkProvider.ts +0 -52
@@ -1,6 +1,8 @@
1
1
  import type { ExecException } from 'node:child_process'
2
- import { exec } from 'node:child_process'
3
2
  import { platform } from 'node:process'
3
+ import { execFileSafe } from '../common/utils/safe-shell'
4
+
5
+ type ExecError = { error?: unknown }
4
6
 
5
7
  export interface IGlobalPkgResult {
6
8
  exist: boolean
@@ -9,53 +11,53 @@ export interface IGlobalPkgResult {
9
11
  version?: string
10
12
  }
11
13
 
12
- export function checkGlobalPackageExist(packageName: string): Promise<IGlobalPkgResult> {
13
- return new Promise((resolve, reject) => {
14
- exec(`npm list -g ${packageName}`, (error, stdout, stderr) => {
15
- if (error) {
16
- reject({
17
- exits: false,
18
- error,
19
- })
20
- return
21
- }
22
- if (stderr) {
23
- reject({
24
- exits: false,
25
- error: stderr,
26
- })
27
- return
28
- }
14
+ export async function checkGlobalPackageExist(packageName: string): Promise<IGlobalPkgResult> {
15
+ const name = packageName.trim()
16
+ if (!name) {
17
+ throw new Error('Package name is required')
18
+ }
29
19
 
30
- const lines = stdout.split('\n')
31
- const lastLine = lines[lines.length - 3]
32
- const match = lastLine.match(/(\S+)@(\S+)/)
33
- if (match) {
34
- resolve({
35
- exist: true,
36
- name: match[1],
37
- version: match[2],
38
- } as IGlobalPkgResult)
39
- return
40
- }
20
+ try {
21
+ const { stdout, stderr } = await execFileSafe('npm', ['list', '-g', name])
22
+ if (stderr) {
23
+ const stderrError = Object.assign(new Error('Failed to check global package'), {
24
+ error: stderr
25
+ })
26
+ throw stderrError
27
+ }
41
28
 
42
- resolve({
43
- exist: false,
44
- } as IGlobalPkgResult)
29
+ const lines = stdout.split('\n')
30
+ const lastLine = lines[lines.length - 3]
31
+ const match = lastLine.match(/([^@\s]+)@(\S+)/)
32
+ if (match) {
33
+ return {
34
+ exist: true,
35
+ name: match[1],
36
+ version: match[2]
37
+ } as IGlobalPkgResult
38
+ }
39
+
40
+ return {
41
+ exist: false
42
+ } as IGlobalPkgResult
43
+ } catch (error) {
44
+ const execError = Object.assign(new Error('Failed to check global package'), {
45
+ error: error as ExecError
45
46
  })
46
- })
47
+ return Promise.reject(execError)
48
+ }
47
49
  }
48
50
 
49
51
  // Check npm version
50
52
  export function getNpmVersion(): Promise<string | null> {
51
- return new Promise((resolve) => {
52
- exec(`npm --version`, (error, stdout, stderr) => {
53
- if (error || stderr)
54
- resolve(null)
55
-
56
- resolve(stdout.trim())
53
+ return execFileSafe('npm', ['--version'])
54
+ .then(({ stdout, stderr }) => {
55
+ if (stderr) {
56
+ return null
57
+ }
58
+ return stdout.trim()
57
59
  })
58
- })
60
+ .catch(() => null)
59
61
  }
60
62
 
61
63
  export interface OSAdapter<R, T> {
package/electron/index.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from './download-manager'
2
2
  export * from './env-tool'
3
-
package/env/index.ts ADDED
@@ -0,0 +1,156 @@
1
+ export const NEXUS_BASE_URL = 'https://tuff.tagzxia.com'
2
+
3
+ export interface EnvLike {
4
+ [key: string]: unknown
5
+ }
6
+
7
+ function getProcess(): any {
8
+ return (globalThis as any)?.process
9
+ }
10
+
11
+ function readGlobalEnv(): Record<string, string | undefined> {
12
+ const g: any = globalThis as any
13
+ const fromGlobal = g.__TUFF_ENV && typeof g.__TUFF_ENV === 'object' ? g.__TUFF_ENV : null
14
+ const record: Record<string, string | undefined> = {}
15
+
16
+ if (fromGlobal) {
17
+ for (const [k, v] of Object.entries(fromGlobal)) {
18
+ if (typeof v === 'string') {
19
+ record[k] = v
20
+ }
21
+ else if (typeof v === 'number' || typeof v === 'boolean') {
22
+ record[k] = String(v)
23
+ }
24
+ }
25
+ }
26
+
27
+ const p: any = getProcess()
28
+ if (p && p.env && typeof p.env === 'object') {
29
+ for (const [k, v] of Object.entries(p.env)) {
30
+ if (typeof v === 'string') {
31
+ record[k] = v
32
+ }
33
+ else if (typeof v === 'number' || typeof v === 'boolean') {
34
+ record[k] = String(v)
35
+ }
36
+ }
37
+ }
38
+
39
+ return record
40
+ }
41
+
42
+ export function setRuntimeEnv(env: Record<string, string | undefined>): void {
43
+ const g: any = globalThis as any
44
+ const normalized: Record<string, string | undefined> = {}
45
+ for (const [k, v] of Object.entries(env ?? {})) {
46
+ if (typeof v === 'string') {
47
+ normalized[k] = v
48
+ }
49
+ else if (typeof v === 'number' || typeof v === 'boolean') {
50
+ normalized[k] = String(v)
51
+ }
52
+ }
53
+ g.__TUFF_ENV = { ...(g.__TUFF_ENV || {}), ...normalized }
54
+ }
55
+
56
+ export function getEnv(key: string): string | undefined {
57
+ return readGlobalEnv()[key]
58
+ }
59
+
60
+ export function getEnvOrDefault(key: string, fallback: string): string {
61
+ return getEnv(key) ?? fallback
62
+ }
63
+
64
+ export function getBooleanEnv(key: string, fallback = false): boolean {
65
+ const raw = getEnv(key)
66
+ if (raw === undefined)
67
+ return fallback
68
+ if (raw === '1' || raw === 'true')
69
+ return true
70
+ if (raw === '0' || raw === 'false')
71
+ return false
72
+ return fallback
73
+ }
74
+
75
+ export function hasWindow(): boolean {
76
+ return typeof window !== 'undefined'
77
+ }
78
+
79
+ export function hasDocument(): boolean {
80
+ return typeof document !== 'undefined'
81
+ }
82
+
83
+ export function hasNavigator(): boolean {
84
+ return typeof navigator !== 'undefined'
85
+ }
86
+
87
+ export function isBrowserRuntime(): boolean {
88
+ return hasWindow() && hasDocument()
89
+ }
90
+
91
+ export function isNodeRuntime(): boolean {
92
+ const proc: any = getProcess()
93
+ return typeof proc !== 'undefined'
94
+ && Boolean(proc?.versions?.node)
95
+ }
96
+
97
+ export function isElectronRuntime(): boolean {
98
+ const proc: any = getProcess()
99
+ return Boolean(proc?.versions?.electron)
100
+ }
101
+
102
+ export function isElectronRenderer(): boolean {
103
+ const proc: any = getProcess()
104
+ return Boolean(proc?.versions?.electron)
105
+ && proc?.type === 'renderer'
106
+ }
107
+
108
+ export function isElectronMain(): boolean {
109
+ const proc: any = getProcess()
110
+ return Boolean(proc?.versions?.electron)
111
+ && (proc?.type === 'browser' || !proc?.type)
112
+ }
113
+
114
+ export function isDevEnv(): boolean {
115
+ const nodeEnv = getEnv('NODE_ENV')
116
+ if (nodeEnv) {
117
+ return nodeEnv === 'development' || nodeEnv === 'test'
118
+ }
119
+ const mode = getEnv('MODE') || getEnv('VITE_MODE')
120
+ if (mode) {
121
+ return mode === 'development'
122
+ }
123
+ return getBooleanEnv('DEV', false)
124
+ }
125
+
126
+ export function isProdEnv(): boolean {
127
+ const nodeEnv = getEnv('NODE_ENV')
128
+ if (nodeEnv) {
129
+ return nodeEnv === 'production'
130
+ }
131
+ const mode = getEnv('MODE') || getEnv('VITE_MODE')
132
+ if (mode) {
133
+ return mode === 'production'
134
+ }
135
+ return getBooleanEnv('PROD', false)
136
+ }
137
+
138
+ export function normalizeBaseUrl(input: string): string {
139
+ return input.replace(/\/$/, '')
140
+ }
141
+
142
+ export function getTuffBaseUrl(): string {
143
+ return normalizeBaseUrl(getEnvOrDefault('VITE_NEXUS_URL', NEXUS_BASE_URL))
144
+ }
145
+
146
+ export function getTelemetryApiBase(): string {
147
+ const url = normalizeBaseUrl(getEnvOrDefault('NEXUS_API_BASE', NEXUS_BASE_URL))
148
+ if (!url) {
149
+ throw new Error('Telemetry API base URL is not configured')
150
+ }
151
+ return url
152
+ }
153
+
154
+ export function getTpexApiBase(): string {
155
+ return normalizeBaseUrl(getEnvOrDefault('TPEX_API_BASE', NEXUS_BASE_URL))
156
+ }
@@ -0,0 +1,55 @@
1
+ const antfu = require('@antfu/eslint-config').default
2
+
3
+ module.exports = antfu(
4
+ {
5
+ type: 'lib',
6
+ typescript: true,
7
+ stylistic: false,
8
+ unicorn: false,
9
+ test: false,
10
+ markdown: false,
11
+ regexp: false,
12
+ ignores: [
13
+ 'plugin/sdk/examples/**',
14
+ ],
15
+ },
16
+ {
17
+ rules: {
18
+ 'antfu/if-newline': 'off',
19
+ 'jsdoc/check-param-names': 'off',
20
+ 'jsdoc/empty-tags': 'off',
21
+ 'import/consistent-type-specifier-style': 'off',
22
+ 'import/first': 'off',
23
+ 'node/prefer-global/buffer': 'off',
24
+ 'node/prefer-global/process': 'off',
25
+ 'no-console': 'off',
26
+ 'no-useless-return': 'off',
27
+ 'perfectionist/sort-exports': 'off',
28
+ 'perfectionist/sort-imports': 'off',
29
+ 'perfectionist/sort-named-exports': 'off',
30
+ 'perfectionist/sort-named-imports': 'off',
31
+ 'prefer-promise-reject-errors': 'off',
32
+ 'test/prefer-lowercase-title': 'off',
33
+ 'ts/consistent-type-definitions': 'off',
34
+ 'ts/ban-ts-comment': 'off',
35
+ 'ts/explicit-function-return-type': 'off',
36
+ 'ts/method-signature-style': 'off',
37
+ 'ts/no-namespace': 'off',
38
+ 'ts/no-empty-object-type': 'off',
39
+ 'ts/no-require-imports': 'off',
40
+ 'ts/no-unsafe-function-type': 'off',
41
+ 'ts/no-use-before-define': 'off',
42
+ 'unicorn/escape-case': 'off',
43
+ 'unicorn/new-for-builtins': 'off',
44
+ 'unicorn/no-instanceof-builtins': 'off',
45
+ 'unicorn/no-new-array': 'off',
46
+ 'vars-on-top': 'off',
47
+ },
48
+ },
49
+ {
50
+ files: ['plugin/channel.ts'],
51
+ rules: {
52
+ 'no-eval': 'off',
53
+ },
54
+ },
55
+ )
package/i18n/index.ts ADDED
@@ -0,0 +1,62 @@
1
+ /**
2
+ * I18n Utilities
3
+ *
4
+ * Shared i18n utilities for backend-frontend communication.
5
+ *
6
+ * ## Backend Usage (Main Process)
7
+ * ```typescript
8
+ * import { i18nMsg, DevServerKeys } from '@talex-touch/utils/i18n'
9
+ *
10
+ * // Send i18n message to frontend
11
+ * win.webContents.send('notification', {
12
+ * message: i18nMsg(DevServerKeys.DISCONNECTED)
13
+ * })
14
+ * ```
15
+ *
16
+ * ## Frontend Usage (Renderer)
17
+ * ```typescript
18
+ * import { resolveI18nMessage, i18nResolver } from '@talex-touch/utils/i18n'
19
+ *
20
+ * // Set locale
21
+ * i18nResolver.setLocale('zh')
22
+ *
23
+ * // Resolve message
24
+ * const text = resolveI18nMessage('$i18n:devServer.disconnected')
25
+ * // => '开发服务器已断开'
26
+ * ```
27
+ */
28
+
29
+ // Locale data
30
+ export { default as enMessages } from './locales/en.json'
31
+
32
+ export { default as zhMessages } from './locales/zh.json'
33
+
34
+ // Message keys and utilities for backend
35
+ export {
36
+ type DevServerKey,
37
+ DevServerKeys,
38
+ type FlowTransferKey,
39
+ FlowTransferKeys,
40
+ I18N_PREFIX,
41
+ i18nMsg,
42
+ i18nMsgWithParams,
43
+ isI18nMessage,
44
+ MessageKeys,
45
+ parseI18nMessage,
46
+ type PluginKey,
47
+ PluginKeys,
48
+ type SystemKey,
49
+ SystemKeys,
50
+ type WidgetKey,
51
+ WidgetKeys,
52
+ } from './message-keys'
53
+ // Resolver for frontend
54
+ export {
55
+ createI18nMessage,
56
+ I18nResolver,
57
+ i18nResolver,
58
+ type MessageLocale,
59
+ type Messages,
60
+ resolveI18nMessage,
61
+ useI18nResolver,
62
+ } from './resolver'
@@ -0,0 +1,226 @@
1
+ {
2
+ "devServer": {
3
+ "disconnected": "Dev Server Disconnected",
4
+ "disconnectedDesc": "Connection to Dev Server lost. Server may have crashed or network interrupted.",
5
+ "reconnected": "Dev Server Reconnected",
6
+ "reconnecting": "Reconnecting to Dev Server...",
7
+ "checkServer": "Check if Dev Server is running correctly, or try manual reconnection.",
8
+ "connectionLost": "Dev Server connection lost",
9
+ "connectionRestored": "Dev Server connection restored"
10
+ },
11
+ "flowTransfer": {
12
+ "shareComplete": "Share Complete",
13
+ "shareFailed": "Share Failed",
14
+ "copiedToClipboard": "Copied to Clipboard",
15
+ "fileRevealed": "File Revealed",
16
+ "airdropReady": "AirDrop Ready",
17
+ "mailReady": "Mail Opened",
18
+ "messagesReady": "Messages Opened"
19
+ },
20
+ "plugin": {
21
+ "loadFailed": "Plugin Load Failed",
22
+ "manifestInvalid": "Invalid Manifest",
23
+ "dependencyMissing": "Missing Dependency",
24
+ "versionMismatch": "Version Mismatch",
25
+ "permissionDenied": "Permission Denied",
26
+ "sdkVersionMissing": "Plugin SDK version not declared",
27
+ "sdkVersionOutdated": "Plugin SDK version outdated",
28
+ "permissionMissing": "Required permission missing"
29
+ },
30
+ "permission": {
31
+ "category": {
32
+ "fs": "Filesystem",
33
+ "clipboard": "Clipboard",
34
+ "network": "Network",
35
+ "system": "System",
36
+ "intelligence": "Intelligence",
37
+ "storage": "Storage",
38
+ "window": "Window"
39
+ },
40
+ "risk": {
41
+ "low": "Low Risk",
42
+ "medium": "Medium Risk",
43
+ "high": "High Risk"
44
+ },
45
+ "fs": {
46
+ "read": { "name": "Read Files", "desc": "Read files from your filesystem" },
47
+ "write": { "name": "Write Files", "desc": "Create, modify, or delete files" },
48
+ "execute": { "name": "Execute Files", "desc": "Run executable files or scripts" }
49
+ },
50
+ "clipboard": {
51
+ "read": { "name": "Read Clipboard", "desc": "Access clipboard contents" },
52
+ "write": { "name": "Write Clipboard", "desc": "Copy content to clipboard" }
53
+ },
54
+ "network": {
55
+ "local": { "name": "Local Network", "desc": "Access local network resources" },
56
+ "internet": { "name": "Internet Access", "desc": "Send and receive internet requests" },
57
+ "download": { "name": "Download Files", "desc": "Download files from the internet" }
58
+ },
59
+ "system": {
60
+ "shell": { "name": "Execute Commands", "desc": "Run system commands or scripts" },
61
+ "notification": { "name": "Notifications", "desc": "Send system notifications" },
62
+ "tray": { "name": "System Tray", "desc": "Access system tray features" }
63
+ },
64
+ "intelligence": {
65
+ "basic": { "name": "Basic Intelligence", "desc": "Use basic Intelligence capabilities" },
66
+ "admin": { "name": "Intelligence Admin", "desc": "Use high-risk Intelligence capabilities" },
67
+ "agents": { "name": "Intelligence Agents", "desc": "Invoke the agents system" }
68
+ },
69
+ "storage": {
70
+ "plugin": { "name": "Plugin Storage", "desc": "Use plugin private storage" },
71
+ "shared": { "name": "Shared Storage", "desc": "Access cross-plugin shared storage" },
72
+ "sqlite": { "name": "Plugin SQLite", "desc": "Read and write plugin local SQLite database" }
73
+ },
74
+ "window": {
75
+ "create": { "name": "Create Windows", "desc": "Create new windows or views" },
76
+ "capture": { "name": "Screen Capture", "desc": "Capture screen content" }
77
+ },
78
+ "grant": "Grant",
79
+ "revoke": "Revoke",
80
+ "granted": "Granted",
81
+ "denied": "Denied",
82
+ "required": "Required",
83
+ "optional": "Optional",
84
+ "allowOnce": "Allow Once",
85
+ "allowAlways": "Always Allow",
86
+ "requestTitle": "Permission Request",
87
+ "requestDesc": "{plugin} requests {permission} permission",
88
+ "enforcementDisabled": "Permission enforcement disabled",
89
+ "legacyPluginWarning": "This plugin uses legacy SDK, permission checks skipped"
90
+ },
91
+ "widget": {
92
+ "compileFailed": "Widget Compile Failed",
93
+ "unsupportedType": "Unsupported Widget Type",
94
+ "invalidDependency": "Invalid Dependency",
95
+ "loadFailed": "Widget Load Failed"
96
+ },
97
+ "system": {
98
+ "networkError": "Network Error",
99
+ "timeout": "Request Timeout",
100
+ "unknownError": "Unknown Error",
101
+ "operationCancelled": "Operation Cancelled"
102
+ },
103
+ "intelligence": {
104
+ "search": {
105
+ "placeholder": "Search providers...",
106
+ "clear": "Clear"
107
+ },
108
+ "config": {
109
+ "api": {
110
+ "apiKeyRequired": "API Key is required",
111
+ "baseUrlInvalid": "Invalid base URL format"
112
+ }
113
+ },
114
+ "usage": {
115
+ "requests": "Requests",
116
+ "tokens": "Tokens",
117
+ "cost": "Cost",
118
+ "successRate": "Success Rate",
119
+ "success": "Success",
120
+ "failure": "Failure",
121
+ "promptTokens": "Prompt Tokens",
122
+ "completionTokens": "Completion Tokens",
123
+ "today": "Today",
124
+ "thisMonth": "This Month"
125
+ },
126
+ "audit": {
127
+ "records": "records",
128
+ "noLogs": "No audit logs"
129
+ },
130
+ "agents": {
131
+ "enabled": "Enabled",
132
+ "disabled": "Disabled",
133
+ "empty": "No agents available",
134
+ "active": "Active",
135
+ "inactive": "Inactive",
136
+ "description": "Description",
137
+ "capabilities": "Capabilities",
138
+ "task_success": "Task completed successfully",
139
+ "task_failed": "Task execution failed"
140
+ },
141
+ "landing": {
142
+ "prompts": {
143
+ "title": "Prompt Management",
144
+ "desc": "Manage AI prompts for various tasks",
145
+ "editTitle": "Edit Prompts",
146
+ "editDesc": "Create and manage custom prompts",
147
+ "editButton": "Open Editor",
148
+ "folderTitle": "Prompts Folder",
149
+ "folderDesc": "Access prompt files directly",
150
+ "folderButton": "Open Folder",
151
+ "statsTitle": "{count} Prompts",
152
+ "statsDesc": "Approximately {words} words",
153
+ "newPromptButton": "New Prompt",
154
+ "folderOpenSuccess": "Prompts folder opened",
155
+ "folderOpenFailed": "Failed to open prompts folder",
156
+ "createPromptHint": "Create new prompt in the editor"
157
+ },
158
+ "capabilities": {
159
+ "title": "Capabilities",
160
+ "desc": "Configure AI capabilities and routing",
161
+ "manageTitle": "Manage Capabilities",
162
+ "manageDesc": "Configure provider bindings and models",
163
+ "manageButton": "Configure",
164
+ "auditTitle": "Audit Logs",
165
+ "auditDesc": "View capability invocation history",
166
+ "auditButton": "View Logs",
167
+ "statsTitle": "{count} Invocations",
168
+ "statsDesc": "{total} capabilities, {bound} bound, avg {freq}/day",
169
+ "statsButton": "View Metrics"
170
+ }
171
+ }
172
+ },
173
+ "settings": {
174
+ "intelligence": {
175
+ "selectProvider": "Select Provider",
176
+ "selectProviderPlaceholder": "Choose a provider",
177
+ "selectProviderHint": "Select a provider to view available models",
178
+ "testCapability": "Test Capability",
179
+ "testing": "Testing...",
180
+ "testSuccess": "Test Successful",
181
+ "testFailed": "Test Failed",
182
+ "selectModel": "Select Model",
183
+ "defaultModel": "Default Model",
184
+ "latency": "Latency",
185
+ "capabilitySearchPlaceholder": "Search capabilities...",
186
+ "capabilityListEmpty": "No capabilities found",
187
+ "capabilitySummary": "{count} capabilities available",
188
+ "providers": "Provider",
189
+ "addChannel": "Add Channel",
190
+ "emptyProviders": "No providers configured. Click 'Add Channel' to get started.",
191
+ "promptFilterAll": "All Prompts",
192
+ "builtin": "Built-in",
193
+ "custom": "Custom",
194
+ "promptMetaDescription": "No description available",
195
+ "promptNewDefaultName": "New Prompt {index}",
196
+ "promptDescriptionPlaceholder": "Enter prompt description...",
197
+ "promptCreateSuccess": "Prompt created successfully",
198
+ "promptDuplicateSuffix": "(Copy)",
199
+ "promptDuplicateSuccess": "Prompt duplicated successfully",
200
+ "promptSaveSuccess": "Prompt saved successfully",
201
+ "promptSaveFailed": "Failed to save prompt",
202
+ "promptDeleteConfirm": "Are you sure you want to delete this prompt?",
203
+ "promptDeleteSuccess": "Prompt deleted successfully",
204
+ "promptDeleteFailed": "Failed to delete prompt",
205
+ "promptCopySuccess": "Prompt copied to clipboard",
206
+ "promptImportSuccess": "{count} prompts imported successfully",
207
+ "promptImportFailed": "Failed to import prompts",
208
+ "promptExportEmpty": "No custom prompts to export",
209
+ "promptExportSuccess": "{count} prompts exported successfully",
210
+ "promptTimestampUnknown": "Unknown",
211
+ "promptSearchPlaceholder": "Search prompts...",
212
+ "promptListEmpty": "No prompts found",
213
+ "promptStatsLabel": "{builtin} built-in, {custom} custom",
214
+ "promptPageTitle": "Prompt Management",
215
+ "promptPageDesc": "Create and manage AI prompts for various tasks",
216
+ "landing": {
217
+ "prompts": {
218
+ "folderOpenSuccess": "Prompts folder opened",
219
+ "folderOpenFailed": "Failed to open prompts folder",
220
+ "statsDesc": "Approximately {words} words",
221
+ "newPromptButton": "New Prompt"
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }