@dsh-workbench/shared 1.1.3 → 1.1.5

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 (68) hide show
  1. package/dist/api/host-write.d.ts +4 -1
  2. package/dist/api/workbench-client.d.ts +2 -0
  3. package/dist/components/ApprovalPlan.css +7 -8
  4. package/dist/config/constants.d.ts +4 -0
  5. package/dist/config/constants.js +4 -0
  6. package/dist/contract/approval.d.ts +4 -0
  7. package/dist/contract/approval.js +4 -0
  8. package/dist/contract/command.d.ts +33 -0
  9. package/dist/contract/command.js +1 -1
  10. package/dist/contract/needs.d.ts +17 -0
  11. package/dist/contract/needs.js +41 -1
  12. package/dist/contract/protocol/bundle-install.d.ts +4 -0
  13. package/dist/contract/protocol/market-index.d.ts +14 -0
  14. package/dist/contract/protocol/market-index.js +1 -0
  15. package/dist/contract/unit.d.ts +10 -0
  16. package/dist/host/adapter-types.d.ts +2 -0
  17. package/dist/host/data-error.d.ts +2 -0
  18. package/dist/host/data-error.js +3 -0
  19. package/dist/host/http.js +1 -0
  20. package/dist/host/install-failure.d.ts +49 -0
  21. package/dist/host/install-failure.js +167 -0
  22. package/dist/host/installed-sources.d.ts +10 -0
  23. package/dist/host/installed-sources.js +64 -0
  24. package/dist/host/lib-install.d.ts +12 -1
  25. package/dist/host/lib-install.js +33 -1
  26. package/dist/host/paths.d.ts +7 -0
  27. package/dist/host/paths.js +17 -0
  28. package/dist/host/runtime-links.d.ts +7 -0
  29. package/dist/host/runtime-links.js +25 -0
  30. package/dist/host/tool-approval.d.ts +4 -2
  31. package/dist/host/tool-approval.js +4 -2
  32. package/dist/host.d.ts +3 -0
  33. package/dist/host.js +3 -0
  34. package/dist/i18n/en.js +46 -1
  35. package/dist/i18n/index.d.ts +47 -2
  36. package/dist/i18n/zh.d.ts +46 -1
  37. package/dist/i18n/zh.js +46 -1
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.js +1 -0
  40. package/package.json +1 -1
  41. package/src/api/host-write.ts +5 -1
  42. package/src/api/workbench-client.ts +2 -0
  43. package/src/components/ApprovalPlan.css +7 -8
  44. package/src/config/constants.ts +6 -0
  45. package/src/contract/__tests__/needs.test.ts +53 -0
  46. package/src/contract/approval.ts +4 -0
  47. package/src/contract/command.ts +22 -0
  48. package/src/contract/needs.ts +56 -1
  49. package/src/contract/protocol/bundle-install.ts +5 -0
  50. package/src/contract/protocol/market-index.ts +17 -0
  51. package/src/contract/unit.ts +11 -0
  52. package/src/host/adapter-types.ts +2 -0
  53. package/src/host/data-error.ts +3 -1
  54. package/src/host/http.ts +1 -0
  55. package/src/host/install-failure.test.ts +121 -0
  56. package/src/host/install-failure.ts +198 -0
  57. package/src/host/installed-sources.test.ts +80 -0
  58. package/src/host/installed-sources.ts +73 -0
  59. package/src/host/lib-install.ts +38 -2
  60. package/src/host/paths.test.ts +26 -0
  61. package/src/host/paths.ts +18 -0
  62. package/src/host/runtime-links.test.ts +31 -0
  63. package/src/host/runtime-links.ts +23 -0
  64. package/src/host/tool-approval.ts +11 -4
  65. package/src/host.ts +3 -0
  66. package/src/i18n/en.ts +47 -1
  67. package/src/i18n/zh.ts +47 -1
  68. package/src/index.ts +1 -0
@@ -0,0 +1,64 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const FILE_NAME = '.dsh-workbench-sources.json';
4
+ const FILE_VERSION = 1;
5
+ function asRecord(value) {
6
+ return typeof value === 'object' && value !== null ? value : undefined;
7
+ }
8
+ function asText(value) {
9
+ return typeof value === 'string' ? value.trim() : '';
10
+ }
11
+ export function installedSourcesFile(profileDir) {
12
+ return path.join(profileDir, FILE_NAME);
13
+ }
14
+ export function readInstalledSources(profileDir) {
15
+ if (profileDir === null)
16
+ return {};
17
+ let parsed;
18
+ try {
19
+ parsed = JSON.parse(fs.readFileSync(installedSourcesFile(profileDir), 'utf8'));
20
+ }
21
+ catch {
22
+ return {};
23
+ }
24
+ const packages = asRecord(asRecord(parsed)?.packages);
25
+ if (packages === undefined)
26
+ return {};
27
+ const found = {};
28
+ for (const [pkg, value] of Object.entries(packages)) {
29
+ const record = asRecord(value);
30
+ if (record === undefined)
31
+ continue;
32
+ const version = asText(record.version);
33
+ const registry = asText(record.registry);
34
+ if (pkg === '' || version === '' || registry === '')
35
+ continue;
36
+ found[pkg] = { version, registry };
37
+ }
38
+ return found;
39
+ }
40
+ export function packageSourceOf(profileDir, pkg) {
41
+ return readInstalledSources(profileDir)[pkg];
42
+ }
43
+ function writeInstalledSources(profileDir, sources) {
44
+ const file = installedSourcesFile(profileDir);
45
+ const temp = `${file}.tmp`;
46
+ const text = `${JSON.stringify({ version: FILE_VERSION, packages: sources }, null, 2)}\n`;
47
+ fs.writeFileSync(temp, text, { mode: 0o600 });
48
+ fs.renameSync(temp, file);
49
+ }
50
+ export function rememberPackageSource(profileDir, pkg, source) {
51
+ const trimmed = pkg.trim();
52
+ if (trimmed === '' || source.version.trim() === '' || source.registry.trim() === '')
53
+ return;
54
+ const all = { ...readInstalledSources(profileDir) };
55
+ all[trimmed] = { version: source.version.trim(), registry: source.registry.trim() };
56
+ writeInstalledSources(profileDir, all);
57
+ }
58
+ export function forgetPackageSource(profileDir, pkg) {
59
+ const all = { ...readInstalledSources(profileDir) };
60
+ if (all[pkg] === undefined)
61
+ return;
62
+ delete all[pkg];
63
+ writeInstalledSources(profileDir, all);
64
+ }
@@ -1,4 +1,5 @@
1
- import type { LibNeed, SupplySource } from '../contract/needs.js';
1
+ import type { BinNeed, LibNeed, SupplySource } from '../contract/needs.js';
2
+ import type { HostOs } from '../contract/protocol/platform.js';
2
3
  export type NpmSource = Extract<SupplySource, {
3
4
  kind: 'npm';
4
5
  }>;
@@ -6,4 +7,14 @@ export declare function libInstallCommand(options: {
6
7
  readonly need: LibNeed;
7
8
  readonly source: NpmSource;
8
9
  readonly version?: string | undefined;
10
+ readonly env?: NodeJS.ProcessEnv | undefined;
9
11
  }): string;
12
+ /**
13
+ * 这个 bin 在这台机器上怎么装:作者写了 `install` 且平台对得上才给出那条命令。
14
+ * `command` 原样照抄;`npm` 装进隔离运行时的共用依赖前缀(那份包里的 bin 会自动上 PATH)。
15
+ * @param need 一条 bin 需要。
16
+ * @param os 宿主平台(由平台适配器给出)。
17
+ * @param env 取 registry 环境变量的地方。
18
+ * @returns 一条能直接粘进终端的命令;没声明或平台不对就是 undefined。
19
+ */
20
+ export declare function binInstallCommand(need: BinNeed, os: HostOs, env?: NodeJS.ProcessEnv): string | undefined;
@@ -3,8 +3,40 @@ import { quoteShellArg } from './shell-text.js';
3
3
  import { libsPrefix, npmCacheDir } from './paths.js';
4
4
  export function libInstallCommand(options) {
5
5
  const { need, source, version } = options;
6
- const registry = npmRegistryOf(source, process.env);
6
+ const registry = npmRegistryOf(source, options.env ?? process.env);
7
7
  const spec = version ?? need.version ?? 'latest';
8
8
  const registryFlag = registry.ok ? ` --registry ${quoteShellArg(registry.value)}` : '';
9
9
  return `npm i --prefix ${quoteShellArg(libsPrefix())} ${quoteShellArg(`${need.name}@${spec}`)}${registryFlag} --cache ${quoteShellArg(npmCacheDir())}`;
10
10
  }
11
+ /**
12
+ * 这个 bin 在这台机器上怎么装:作者写了 `install` 且平台对得上才给出那条命令。
13
+ * `command` 原样照抄;`npm` 装进隔离运行时的共用依赖前缀(那份包里的 bin 会自动上 PATH)。
14
+ * @param need 一条 bin 需要。
15
+ * @param os 宿主平台(由平台适配器给出)。
16
+ * @param env 取 registry 环境变量的地方。
17
+ * @returns 一条能直接粘进终端的命令;没声明或平台不对就是 undefined。
18
+ */
19
+ export function binInstallCommand(need, os, env = process.env) {
20
+ const install = need.install;
21
+ if (install === undefined)
22
+ return undefined;
23
+ if (install.platforms !== undefined && !install.platforms.includes(os))
24
+ return undefined;
25
+ if (install.kind === 'command') {
26
+ const line = install.line.trim();
27
+ return line === '' ? undefined : line;
28
+ }
29
+ const packageName = install.package.trim();
30
+ if (packageName === '')
31
+ return undefined;
32
+ return libInstallCommand({
33
+ need: { kind: 'lib', name: packageName, purpose: need.purpose },
34
+ source: {
35
+ kind: 'npm',
36
+ package: packageName,
37
+ ...(install.registryEnv === undefined ? {} : { registryEnv: install.registryEnv }),
38
+ ...(install.registryDefault === undefined ? {} : { registryDefault: install.registryDefault }),
39
+ },
40
+ env,
41
+ });
42
+ }
@@ -10,3 +10,10 @@ export declare function vendorPeerLink(): {
10
10
  readonly parent: string;
11
11
  };
12
12
  export declare function npmCacheDir(): string;
13
+ export declare function libsBinDir(): string;
14
+ /**
15
+ * 把隔离运行时的共用依赖 bin 目录放到 PATH 最前面(可执行文件都从这儿找)。
16
+ * @param env 改哪份环境(默认当前进程)。
17
+ * @returns 真的插进去了就 `true`;已经在里面就 `false`。
18
+ */
19
+ export declare function ensureLibsBinOnPath(env?: NodeJS.ProcessEnv): boolean;
@@ -1,3 +1,4 @@
1
+ import { delimiter } from 'node:path';
1
2
  import { workbenchRoot } from './data-root.js';
2
3
  export function isolatedRoot() {
3
4
  return `${workbenchRoot()}/opencli`;
@@ -26,3 +27,19 @@ export function vendorPeerLink() {
26
27
  export function npmCacheDir() {
27
28
  return `${isolatedRoot()}/npm-cache`;
28
29
  }
30
+ export function libsBinDir() {
31
+ return `${libsPrefix()}/node_modules/.bin`;
32
+ }
33
+ /**
34
+ * 把隔离运行时的共用依赖 bin 目录放到 PATH 最前面(可执行文件都从这儿找)。
35
+ * @param env 改哪份环境(默认当前进程)。
36
+ * @returns 真的插进去了就 `true`;已经在里面就 `false`。
37
+ */
38
+ export function ensureLibsBinOnPath(env = process.env) {
39
+ const dir = libsBinDir();
40
+ const parts = (env.PATH ?? '').split(delimiter).filter((one) => one !== '');
41
+ if (parts.includes(dir))
42
+ return false;
43
+ env.PATH = [dir, ...parts].join(delimiter);
44
+ return true;
45
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 让共用依赖也能 import opencli:把隔离运行时里那份 opencli 链接到 libs 的 node_modules。
3
+ * 跑在 libs 里的命令(比如 opencli-workflow 带的 gitops)会按包名找 @jackwener/opencli,
4
+ * 找不到就起不来 —— 它不在 libs 的依赖里,是运行时提供的那一份。
5
+ * @returns 这次真的建了链接就 `true`;已经有了、或运行时那份还没装,就是 `false`。
6
+ */
7
+ export declare function ensureLibsOpencliPeer(): boolean;
@@ -0,0 +1,25 @@
1
+ import { existsSync, mkdirSync, symlinkSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { OPENCLI_NPM_PACKAGE, libsPrefix, toolchainOpencliDir } from './paths.js';
4
+ /**
5
+ * 让共用依赖也能 import opencli:把隔离运行时里那份 opencli 链接到 libs 的 node_modules。
6
+ * 跑在 libs 里的命令(比如 opencli-workflow 带的 gitops)会按包名找 @jackwener/opencli,
7
+ * 找不到就起不来 —— 它不在 libs 的依赖里,是运行时提供的那一份。
8
+ * @returns 这次真的建了链接就 `true`;已经有了、或运行时那份还没装,就是 `false`。
9
+ */
10
+ export function ensureLibsOpencliPeer() {
11
+ const link = `${libsPrefix()}/node_modules/${OPENCLI_NPM_PACKAGE}`;
12
+ if (existsSync(link))
13
+ return false;
14
+ const target = toolchainOpencliDir();
15
+ if (!existsSync(target))
16
+ return false;
17
+ try {
18
+ mkdirSync(dirname(link), { recursive: true });
19
+ symlinkSync(target, link);
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
@@ -1,3 +1,4 @@
1
+ export { APPROVAL_NOTE_ARG } from '../contract/approval.js';
1
2
  export type AskDecision = {
2
3
  readonly kind: 'ask';
3
4
  readonly reason: string;
@@ -16,7 +17,6 @@ export interface ApprovalDetail {
16
17
  export type ApprovalFacts = ApprovalDetail | {
17
18
  readonly blocked: string;
18
19
  };
19
- export declare const APPROVAL_NOTE_ARG = "approval_note";
20
20
  export declare const APPROVAL_NOTE_LIMIT = 40;
21
21
  export declare const APPROVAL_DETAIL_LIMIT = 20;
22
22
  export declare const APPROVAL_QUESTION_LIMIT = 40;
@@ -33,7 +33,8 @@ export interface ApprovalCall {
33
33
  }
34
34
  /**
35
35
  * 套件对一次写调用给出的判定:`read` 只是看看、`allow` 会写但本套件不问、`deny` 这一次根本跑不成
36
- * (连问都不该问,`reason` 原样交给 agent)、`ask` 要用户点头(`question` 接在明细后,`fallback` 是没明细时的整句)。
36
+ * (连问都不该问,`reason` 原样交给 agent)、`ask` 要用户点头(`question` 接在明细后,`fallback` 是没明细时的整句;
37
+ * `noteInDetail` 为真表示套件把 agent 的附注画在自己的详情座里,标题只留动作、不再追加)。
37
38
  */
38
39
  export type ApprovalVerdict = {
39
40
  readonly kind: 'read';
@@ -47,6 +48,7 @@ export type ApprovalVerdict = {
47
48
  readonly reason: string;
48
49
  readonly question: ApprovalDetail;
49
50
  readonly fallback: ApprovalDetail;
51
+ readonly noteInDetail?: boolean;
50
52
  };
51
53
  export type ApprovalPolicy = (call: ApprovalCall) => ApprovalVerdict | undefined;
52
54
  /**
@@ -1,4 +1,5 @@
1
- export const APPROVAL_NOTE_ARG = 'approval_note';
1
+ export { APPROVAL_NOTE_ARG } from '../contract/approval.js';
2
+ import { APPROVAL_NOTE_ARG } from '../contract/approval.js';
2
3
  export const APPROVAL_NOTE_LIMIT = 40;
3
4
  export const APPROVAL_DETAIL_LIMIT = 20;
4
5
  export const APPROVAL_QUESTION_LIMIT = 40;
@@ -85,9 +86,10 @@ export async function approvalFor(call, context = {}) {
85
86
  return { kind: 'deny', reason: facts.blocked };
86
87
  if (context.skipAsk === true)
87
88
  return undefined;
89
+ const note = context.declaredNote === true && verdict.noteInDetail !== true ? approvalNoteOf(call) : undefined;
88
90
  return {
89
91
  kind: 'ask',
90
92
  reason: verdict.reason,
91
- displayReason: compose(facts, verdict, context.declaredNote === true ? approvalNoteOf(call) : undefined),
93
+ displayReason: compose(facts, verdict, note),
92
94
  };
93
95
  }
package/dist/host.d.ts CHANGED
@@ -42,6 +42,8 @@ export * from './host/data-root.js';
42
42
  export * from './host/shell-text.js';
43
43
  export * from './host/shell.js';
44
44
  export * from './host/data-error.js';
45
+ export * from './host/install-failure.js';
46
+ export * from './host/runtime-links.js';
45
47
  export * from './host/provision.js';
46
48
  export * from './host/channel-plugin.js';
47
49
  export * from './host/recipe.js';
@@ -75,3 +77,4 @@ export * from './host/version-range.js';
75
77
  export * from './host/market-index.js';
76
78
  export * from './host/market-index-claim.js';
77
79
  export * from './host/changelog.js';
80
+ export * from './host/installed-sources.js';
package/dist/host.js CHANGED
@@ -42,6 +42,8 @@ export * from './host/data-root.js';
42
42
  export * from './host/shell-text.js';
43
43
  export * from './host/shell.js';
44
44
  export * from './host/data-error.js';
45
+ export * from './host/install-failure.js';
46
+ export * from './host/runtime-links.js';
45
47
  export * from './host/provision.js';
46
48
  export * from './host/channel-plugin.js';
47
49
  export * from './host/recipe.js';
@@ -75,3 +77,4 @@ export * from './host/version-range.js';
75
77
  export * from './host/market-index.js';
76
78
  export * from './host/market-index-claim.js';
77
79
  export * from './host/changelog.js';
80
+ export * from './host/installed-sources.js';
package/dist/i18n/en.js CHANGED
@@ -147,7 +147,42 @@ export const en = {
147
147
  'panels.market.confirmUninstallAck': 'I understand: using it again means reinstalling it.',
148
148
  'panels.market.confirmYes': 'Uninstall',
149
149
  'panels.market.confirmNo': 'Cancel',
150
+ 'panels.market.noMarketSource': 'The index has no newer version of this module (refresh the index and retry)',
150
151
  'panels.market.failed': 'Failed: {reason}',
152
+ 'panels.market.askAgent': 'Ask the agent',
153
+ 'panels.market.askAgentCopied': 'Copied',
154
+ 'panels.market.askAgentText': 'This workbench module cannot be used: "{name}" (unit {unit}) — {reason}. Work out what is missing and how to add it, then confirm it works.',
155
+ 'panels.market.failure.permission': "Didn't install: no write access",
156
+ 'panels.market.failure.diskFull': "Didn't install: the disk is full",
157
+ 'panels.market.failure.sandbox': "Didn't install: the system blocked it",
158
+ 'panels.market.failure.unknown': "Didn't install: cause not recognised",
159
+ 'panels.market.failure.factOwner': '{path} belongs to {owner}, and this account ({me}) cannot write to it. Hand it back to yourself (asks for your login password).',
160
+ 'panels.market.failure.factMode': '{path} is mode {mode}, so this account cannot write to it.',
161
+ 'panels.market.failure.factSpace': 'The disk holding {path} is full.',
162
+ 'panels.market.failure.factStuck': 'This command ran in a restricted environment and cannot write to {path}.',
163
+ 'panels.market.failure.nowhere': '(the directory was not identified)',
164
+ 'panels.market.failure.copyFix': 'Copy the fix command',
165
+ 'panels.market.failure.copied': 'Copied',
166
+ 'panels.market.failure.copiedHint': 'Paste it in a terminal, run it, then click Check again.',
167
+ 'panels.market.failure.askAgent': 'Copy for the agent',
168
+ 'panels.market.failure.askAgentText': 'Installing this module could not write: `{command}` exited {code} at {path}. Work out whether the sandbox or file permissions blocked it, then install again somewhere writable.',
169
+ 'panels.market.failure.askAgentHint': 'Paste it into the chat and let the agent carry on.',
170
+ 'panels.market.failure.recheck': 'Check again',
171
+ 'panels.market.failure.showOutput': 'Show install output',
172
+ 'panels.market.failure.hideOutput': 'Hide install output',
173
+ 'panels.market.failure.term.commandLine': 'command on line {line}',
174
+ 'panels.market.failure.term.signal': 'killed by {signal}',
175
+ 'panels.market.failure.term.exitCode': 'exit code {exitCode}',
176
+ 'panels.market.failure.term.noExitCode': 'no exit code',
177
+ 'panels.market.failure.term.running': 'running',
178
+ 'panels.market.failure.term.failed': 'failed',
179
+ 'panels.market.failure.term.done': 'done',
180
+ 'panels.market.failure.term.copy': 'Copy',
181
+ 'panels.market.failure.term.copied': 'Copied',
182
+ 'panels.market.failure.term.noOutput': 'No output',
183
+ 'panels.market.failure.term.collapse': 'Collapse',
184
+ 'panels.market.failure.term.expandAria': 'Show the remaining {hidden} lines',
185
+ 'panels.market.failure.term.expand': 'Show {hidden} lines',
151
186
  'panels.market.needEnv': 'Set {env} in the terminal that started the workbench first',
152
187
  'panels.market.needCommands': 'Missing commands: {commands}',
153
188
  'panels.market.needBinary': 'Install the {command} command first',
@@ -183,9 +218,13 @@ export const en = {
183
218
  'panels.market.pluginBroken': 'This plugin install is broken: it cannot be identified. Uninstall it first, then ask the agent to reinstall it by package name.',
184
219
  'panels.market.restartNeeded': 'The new version is installed — restart once to pick it up.',
185
220
  'panels.market.foot': 'After installing, enable it in the panel page of that project.',
186
- 'panels.market.recheck': 'Check for updates',
187
221
  'panels.market.checkUpdates': 'Check for updates',
222
+ 'panels.market.checkingNow': 'Checking…',
223
+ 'panels.market.checkFailed': 'The last check failed. Check your connection and retry.',
188
224
  'panels.market.checkedAt': 'Last checked: {time}',
225
+ 'panels.market.latestPartial': 'Could not check {n} modules',
226
+ 'panels.market.latestNoRegistry': 'No source configured — the latest version was not checked',
227
+ 'panels.market.latestProbeFailed': 'Could not reach the source — try again later',
189
228
  'panels.market.justNow': 'just now',
190
229
  'panels.market.minutesAgo': '{n} min ago',
191
230
  'panels.market.hoursAgo': '{n} h ago',
@@ -362,6 +401,9 @@ export const en = {
362
401
  'panels.discover.transportTest': 'Test this address',
363
402
  'panels.discover.transportPlaceholder': 'Or paste another address (mirror, alias)',
364
403
  'panels.discover.transportNeedsAuth': 'This repository needs credentials: clone it once in a terminal, or set up an SSH key / credential helper, then install again.',
404
+ 'panels.discover.transportChange': 'Change address',
405
+ 'panels.discover.transportChangeHide': 'Hide',
406
+ 'panels.discover.transportNone': 'No readable address',
365
407
  'panels.discover.expand': 'Show versions',
366
408
  'panels.discover.collapse': 'Hide versions',
367
409
  'panels.discover.versionCount': '{n} versions',
@@ -647,6 +689,9 @@ export const en = {
647
689
  'approval.record.noSwitch': 'it will not switch you back (the leftbar footer shows the state)',
648
690
  'approval.longTask.what': 'Task to stop',
649
691
  'approval.longTask.signal': 'stopping only sends an interrupt signal \u2014 wrapping up the run is up to the module',
692
+ 'approval.plugin.name': 'Plugin',
693
+ 'approval.plugin.command': 'Command',
694
+ 'approval.plugin.note': 'Agent says',
650
695
  'approval.publish.module': 'Module',
651
696
  'approval.publish.target': 'Target',
652
697
  'approval.publish.version': 'Version',
@@ -157,7 +157,42 @@ export declare const dictionaries: {
157
157
  readonly 'panels.market.confirmUninstallAck': "我明白:卸载后想再用,得重新装一遍。";
158
158
  readonly 'panels.market.confirmYes': "卸载";
159
159
  readonly 'panels.market.confirmNo': "取消";
160
+ readonly 'panels.market.noMarketSource': "索引里没有这个模块的新版本(刷新一次索引再试)";
160
161
  readonly 'panels.market.failed': "没成功:{reason}";
162
+ readonly 'panels.market.askAgent': "问 agent";
163
+ readonly 'panels.market.askAgentCopied': "已复制";
164
+ readonly 'panels.market.askAgentText': "工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。";
165
+ readonly 'panels.market.failure.permission': "没装上:没有写入权限";
166
+ readonly 'panels.market.failure.diskFull': "没装上:磁盘满了";
167
+ readonly 'panels.market.failure.sandbox': "没装上:被系统拦住了";
168
+ readonly 'panels.market.failure.unknown': "没装上:原因没认出来";
169
+ readonly 'panels.market.failure.factOwner': "{path} 属于 {owner},当前账号({me})写不进去。把它还给自己就行(会要开机密码)。";
170
+ readonly 'panels.market.failure.factMode': "{path} 的权限是 {mode},当前账号没有写权限。";
171
+ readonly 'panels.market.failure.factSpace': "{path} 所在的磁盘满了。";
172
+ readonly 'panels.market.failure.factStuck': "这条命令跑在受限环境里,写不进 {path}。";
173
+ readonly 'panels.market.failure.nowhere': "(没认出是哪个目录)";
174
+ readonly 'panels.market.failure.copyFix': "复制修复命令";
175
+ readonly 'panels.market.failure.copied': "已复制";
176
+ readonly 'panels.market.failure.copiedHint': "粘到终端跑一次,回来点「再检测」。";
177
+ readonly 'panels.market.failure.askAgent': "复制给 agent";
178
+ readonly 'panels.market.failure.askAgentText': "装这个模块时写不进去:`{command}` 退出码 {code},卡在 {path}。帮我看看是被沙箱拦的还是权限问题,换一条能写进去的路再装。";
179
+ readonly 'panels.market.failure.askAgentHint': "粘到对话里,让 agent 接着弄。";
180
+ readonly 'panels.market.failure.recheck': "再检测";
181
+ readonly 'panels.market.failure.showOutput': "查看安装输出";
182
+ readonly 'panels.market.failure.hideOutput': "收起安装输出";
183
+ readonly 'panels.market.failure.term.commandLine': "第 {line} 行的命令";
184
+ readonly 'panels.market.failure.term.signal': "被 {signal} 终止";
185
+ readonly 'panels.market.failure.term.exitCode': "退出码 {exitCode}";
186
+ readonly 'panels.market.failure.term.noExitCode': "没有退出码";
187
+ readonly 'panels.market.failure.term.running': "在跑";
188
+ readonly 'panels.market.failure.term.failed': "没跑通";
189
+ readonly 'panels.market.failure.term.done': "跑完了";
190
+ readonly 'panels.market.failure.term.copy': "复制";
191
+ readonly 'panels.market.failure.term.copied': "已复制";
192
+ readonly 'panels.market.failure.term.noOutput': "没有输出";
193
+ readonly 'panels.market.failure.term.collapse': "收起";
194
+ readonly 'panels.market.failure.term.expandAria': "展开剩下的 {hidden} 行";
195
+ readonly 'panels.market.failure.term.expand': "展开 {hidden} 行";
161
196
  readonly 'panels.market.needEnv': "先在启动工作台的终端里设 {env}";
162
197
  readonly 'panels.market.needCommands': "缺这几条命令:{commands}";
163
198
  readonly 'panels.market.needBinary': "先装 {command} 命令";
@@ -193,9 +228,13 @@ export declare const dictionaries: {
193
228
  readonly 'panels.market.pluginBroken': "这份插件装坏了:认不出它是什么。可以先卸载,再让 agent 按包名重装一次。";
194
229
  readonly 'panels.market.restartNeeded': "新版装好了,重启一次才生效。";
195
230
  readonly 'panels.market.foot': "装好后到那个项目的面板页勾选它,模块才会出现。";
196
- readonly 'panels.market.recheck': "重新检查更新";
197
231
  readonly 'panels.market.checkUpdates': "检查更新";
232
+ readonly 'panels.market.checkingNow': "正在检查…";
233
+ readonly 'panels.market.checkFailed': "最近一次没查到,检查网络后重试";
198
234
  readonly 'panels.market.checkedAt': "最近检查:{time}";
235
+ readonly 'panels.market.latestPartial': "{n} 个模块没查成";
236
+ readonly 'panels.market.latestNoRegistry': "没配来源,未检查新版";
237
+ readonly 'panels.market.latestProbeFailed': "问不到源,稍后重试";
199
238
  readonly 'panels.market.justNow': "刚刚";
200
239
  readonly 'panels.market.minutesAgo': "{n} 分钟前";
201
240
  readonly 'panels.market.hoursAgo': "{n} 小时前";
@@ -372,6 +411,9 @@ export declare const dictionaries: {
372
411
  readonly 'panels.discover.transportTest': "试这个地址";
373
412
  readonly 'panels.discover.transportPlaceholder': "或贴一个别的地址(公司镜像、别名)";
374
413
  readonly 'panels.discover.transportNeedsAuth': "这个仓库要凭证:先在终端里把它 clone 一次,或配好 SSH key / 凭据助手;配好后再点安装。";
414
+ readonly 'panels.discover.transportChange': "换一个地址";
415
+ readonly 'panels.discover.transportChangeHide': "收起";
416
+ readonly 'panels.discover.transportNone': "没有可读的地址";
375
417
  readonly 'panels.discover.expand': "展开版本";
376
418
  readonly 'panels.discover.collapse': "收起版本";
377
419
  readonly 'panels.discover.versionCount': "{n} 个版本";
@@ -657,6 +699,9 @@ export declare const dictionaries: {
657
699
  readonly 'approval.record.noSwitch': "录完不会替你切回来(左栏底部会亮一条状态)";
658
700
  readonly 'approval.longTask.what': "要停的那次任务";
659
701
  readonly 'approval.longTask.signal': "停了只是让工作台发出中断信号 —— 这次任务怎么收尾由模块自己负责";
702
+ readonly 'approval.plugin.name': "插件";
703
+ readonly 'approval.plugin.command': "命令";
704
+ readonly 'approval.plugin.note': "agent 说";
660
705
  readonly 'approval.publish.module': "模块";
661
706
  readonly 'approval.publish.target': "目标";
662
707
  readonly 'approval.publish.version': "版本";
@@ -752,7 +797,7 @@ export declare const dictionaries: {
752
797
  readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。";
753
798
  readonly 'configSync.failed': "同步没成功,再试一次。";
754
799
  };
755
- en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.unsupported" | "env.unit.unsupportedHint" | "env.unit.degraded" | "env.unit.degradedHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "profileCreate.nav" | "profileCreate.lead" | "profileCreate.name" | "profileCreate.nameHint" | "profileCreate.source" | "profileCreate.current" | "profileCreate.copy" | "profileCreate.settings" | "profileCreate.create" | "profileCreate.creating" | "profileCreate.created" | "profileCreate.command" | "profileCreate.readFailed" | "profileCreate.retry" | "profileCreate.reading" | "profileCreate.noProfiles" | "profileCreate.failed" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedUnverified" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "env.need.bin.missing" | "env.need.bin.hint" | "env.need.extension.missing" | "env.need.extension.outdated" | "env.need.extension.hint" | "env.need.lib.missing" | "env.need.lib.outdated" | "env.need.lib.unsatisfied" | "env.need.lib.hint" | "env.need.env.missing" | "env.need.env.hint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.longTask" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.longTask.one" | "project.attention.longTask.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.unchecked" | "panels.dep.missing" | "panels.dep.outdated" | "panels.dep.degraded" | "panels.dep.unsupported" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.uncheckedHint" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.removeSlow" | "panels.market.updateNoChange" | "panels.market.updateUnknownVersion" | "panels.market.updateGone" | "panels.market.updateRestored" | "panels.market.updateBehind" | "panels.market.selfUpdateFailed" | "panels.market.selfUpdateUnknown" | "panels.market.selfUpdateRolledBack" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.needBinary" | "panels.market.needLib" | "panels.market.localMark" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.updateNeedsWorkbench" | "panels.market.updateIncompatible" | "panels.market.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.pendingFollowUp" | "panels.market.migrationHint" | "panels.market.migrateAction" | "panels.market.migrating" | "panels.market.migrateConfirmTitle" | "panels.market.migrateConfirmDetail" | "panels.market.migrateConfirmAck" | "panels.market.migrateConfirmYes" | "panels.market.migrateDone" | "panels.market.dismissFollowUp" | "panels.market.dismissing" | "panels.market.dismissFollowUpTitle" | "panels.market.dismissFollowUpDetail" | "panels.market.dismissFollowUpAck" | "panels.market.dismissFollowUpYes" | "panels.market.dismissed" | "panels.market.workbenchName" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.failureCredentials" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.tabInstalled" | "panels.market.tabs" | "panels.tab.discover" | "panels.discover.loading" | "panels.discover.slowHint" | "panels.discover.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeTitle" | "panels.discover.removeBody" | "panels.discover.sourceActions" | "panels.discover.sourceStateWritable" | "panels.discover.sourceStateReadOnly" | "panels.discover.sourceEnable" | "panels.discover.sourceDisable" | "panels.discover.sourceWorking" | "panels.discover.sourceEnabled" | "panels.discover.sourceReadOnly" | "panels.discover.refresh" | "panels.discover.search" | "panels.discover.clearSearch" | "panels.discover.all" | "panels.discover.sourceLabel" | "panels.discover.sourceKind" | "panels.discover.sourceKindHttp" | "panels.discover.sourceKindGit" | "panels.discover.sourceUrl" | "panels.discover.sourcePlaceholder" | "panels.discover.sourceRef" | "panels.discover.sourcePath" | "panels.discover.sourceLocal" | "panels.discover.sourceLocalHint" | "panels.discover.save" | "panels.discover.cancel" | "panels.discover.retry" | "panels.discover.noSource" | "panels.discover.noSourceHint" | "panels.discover.sourcesFailed" | "panels.discover.unreadable" | "panels.discover.sourceAuth" | "panels.discover.invalid" | "panels.discover.emptyRepo" | "panels.discover.missingIndex" | "panels.discover.initTitle" | "panels.discover.initCta" | "panels.discover.initWhat" | "panels.discover.initBranch" | "panels.discover.initBranchHint" | "panels.discover.initBranchBad" | "panels.discover.initOk" | "panels.discover.initBusy" | "panels.discover.initDone" | "panels.discover.stale" | "panels.discover.empty" | "panels.discover.noMatch" | "panels.discover.notInstalled" | "panels.discover.installed" | "panels.discover.installedVersion" | "panels.discover.update" | "panels.discover.badShell" | "panels.discover.badShellDetail" | "panels.discover.unverified" | "panels.discover.installing" | "panels.discover.installingNamed" | "panels.discover.cancelInstall" | "panels.discover.cancelling" | "panels.discover.installCancelled" | "panels.discover.installedDone" | "panels.discover.failed" | "panels.discover.transportTitle" | "panels.discover.transportSsh" | "panels.discover.transportHttps" | "panels.discover.transportOk" | "panels.discover.transportAuth" | "panels.discover.transportUnreachable" | "panels.discover.transportUnknown" | "panels.discover.transportChecking" | "panels.discover.transportTest" | "panels.discover.transportPlaceholder" | "panels.discover.transportNeedsAuth" | "panels.discover.expand" | "panels.discover.collapse" | "panels.discover.versionCount" | "panels.discover.sourceNpm" | "panels.discover.sourceNpmDefault" | "panels.discover.sourceGit" | "panels.discover.installVersion" | "panels.discover.confirmTitle" | "panels.discover.confirmDetail" | "panels.discover.confirmAck" | "panels.discover.confirmOk" | "panels.discover.confirmCancel" | "panels.discover.marketMenu" | "panels.discover.manageSources" | "panels.discover.sourcesTitle" | "panels.discover.sourcesIntro" | "panels.discover.sourcesLabel" | "panels.discover.sourceTrust" | "panels.discover.sourceDuplicate" | "panels.discover.sourceBadUrl" | "panels.discover.close" | "panels.discover.labelsMenu" | "panels.discover.labelsCount" | "panels.discover.tagsAll" | "panels.discover.sort" | "panels.discover.sortWith" | "panels.discover.sortRelevance" | "panels.discover.sortDefault" | "panels.discover.sortPublished" | "panels.discover.categoriesLabel" | "panels.discover.showMore" | "panels.discover.entryMeta" | "panels.discover.entryMetaAuthor" | "panels.discover.openEntry" | "panels.discover.cardInstall" | "panels.discover.cardInstalled" | "panels.discover.cardUpdate" | "panels.discover.cardBlocked" | "panels.discover.installTitle" | "panels.discover.installVersionTitle" | "panels.discover.openInstalled" | "panels.discover.noCompatibleVersion" | "panels.discover.detailBack" | "panels.discover.publishedAt" | "panels.discover.detailMarket" | "panels.discover.detailIncompatible" | "panels.discover.detailUnknown" | "panels.discover.detailSource" | "panels.discover.authorUnknown" | "panels.discover.tabOverview" | "panels.discover.tabReadme" | "panels.discover.tabChangelog" | "panels.discover.docReadme" | "panels.discover.docChangelog" | "panels.discover.docLoading" | "panels.discover.docMissing" | "panels.discover.docUnavailable" | "panels.discover.docUnknownReason" | "panels.discover.detailTabs" | "panels.discover.factPackage" | "panels.discover.factRegistry" | "panels.discover.factRepository" | "panels.discover.factCommit" | "panels.discover.factDirectory" | "panels.discover.factPublished" | "panels.discover.factAuthor" | "panels.discover.factHomepage" | "panels.discover.factCategory" | "panels.discover.factLabels" | "panels.discover.factMarket" | "panels.discover.detailVersions" | "panels.discover.versionsLabel" | "panels.discover.tagRecommended" | "panels.discover.tagPrerelease" | "panels.discover.tagInstalled" | "panels.discover.tagIncompatible" | "panels.discover.tagUnknown" | "panels.discover.selected" | "panels.discover.done" | "panels.discover.installTrust" | "panels.discover.progress" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.restartWhy" | "panels.market.add.restartWhy.no-hmr" | "panels.market.add.restartWhy.package-moved" | "panels.market.add.restartWhy.host-module" | "panels.market.add.restartWhy.unmanaged-plugin" | "panels.market.add.restartWhy.module-comparison" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.update" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.toolchain.ok" | "env.toolchain.warn" | "env.opencli.ok" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.hold" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.wake" | "env.wake.opening" | "env.wake.browserOpen" | "env.wake.noBrowser" | "env.wake.failed" | "env.bridge.continue" | "env.diy.ok" | "env.diy.short" | "env.diy.hold" | "env.diy.why" | "env.diy.rows" | "env.diy.noRow" | "env.diy.step" | "env.diy.continue" | "env.copyCommand" | "env.copied" | "env.step.toolchain" | "env.step.opencli" | "env.step.bridge" | "env.step.diy" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "adapterSet.not-configured" | "adapterSet.no-profile" | "adapterSet.malformed" | "adapterSet.not-resolvable" | "adapterSet.import-failed" | "adapterSet.bad-export" | "adapterSet.factory-failed" | "adapterSet.incompatible-version" | "adapterSet.missing-member" | "env.unit.hint" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label" | "adapterSet.title" | "adapterSet.lead" | "adapterSet.active" | "adapterSet.defaults" | "adapterSet.failed" | "adapterSet.healthUnreadable" | "workbenchSettings.nav" | "workbenchSettings.lead" | "sidebarEdition.nav" | "sidebarEdition.lead" | "sidebarEdition.official" | "sidebarEdition.officialHint" | "sidebarEdition.custom" | "sidebarEdition.customHint" | "sidebarEdition.saving" | "sidebarEdition.reloadRequired" | "sidebarEdition.reload" | "sidebarEdition.failed" | "debug.workspace" | "debug.status" | "debug.status.trouble" | "debug.stalled" | "debug.act.pause" | "debug.act.resume" | "debug.act.stop" | "debug.act.stop.ask" | "debug.card.here.title" | "debug.card.here.note" | "debug.card.away.note" | "debug.card.paused.note" | "debug.card.hidden.note" | "record.waiting" | "record.waiting.note" | "record.recording" | "record.recording.note" | "record.recording.shots" | "record.finished" | "record.finished.note" | "record.act.cancel" | "record.act.halt" | "approval.record.site" | "approval.record.what" | "approval.record.lands" | "approval.record.noUrl" | "approval.record.oneAction" | "approval.record.noSwitch" | "approval.longTask.what" | "approval.longTask.signal" | "approval.publish.module" | "approval.publish.target" | "approval.publish.version" | "approval.publish.author" | "approval.publish.authorMissing" | "approval.publish.owner" | "approval.publish.ownerUnowned" | "approval.publish.ownerTaken" | "approval.publish.unit" | "approval.publish.unitTaken" | "approval.publish.path" | "approval.publish.pathTaken" | "approval.publish.registry" | "approval.publish.repo" | "approval.publish.branch" | "approval.publish.defaultBranch" | "approval.publish.artifacts" | "approval.publish.index" | "approval.publish.commits" | "approval.publish.twoCommits" | "approval.publish.reading" | "approval.publish.changelog" | "approval.publish.changelogPending" | "approval.publish.changelogMissing" | "approval.publish.targetAuto" | "approval.publish.targetTeam" | "approval.publish.targetPublic" | "approval.publish.targetTarball" | "approval.publish.targetGit" | "approval.publish.targetMarket" | "approval.publish.targetLocal" | "approval.market.source" | "approval.market.url" | "approval.market.action" | "approval.market.policy" | "approval.market.enable" | "approval.market.disable" | "approval.market.writable" | "approval.market.readOnly" | "approval.market.reading" | "markdown.copy" | "markdown.copied" | "markdown.footnotes", string>;
800
+ en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.unsupported" | "env.unit.unsupportedHint" | "env.unit.degraded" | "env.unit.degradedHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "profileCreate.nav" | "profileCreate.lead" | "profileCreate.name" | "profileCreate.nameHint" | "profileCreate.source" | "profileCreate.current" | "profileCreate.copy" | "profileCreate.settings" | "profileCreate.create" | "profileCreate.creating" | "profileCreate.created" | "profileCreate.command" | "profileCreate.readFailed" | "profileCreate.retry" | "profileCreate.reading" | "profileCreate.noProfiles" | "profileCreate.failed" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedUnverified" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "env.need.bin.missing" | "env.need.bin.hint" | "env.need.extension.missing" | "env.need.extension.outdated" | "env.need.extension.hint" | "env.need.lib.missing" | "env.need.lib.outdated" | "env.need.lib.unsatisfied" | "env.need.lib.hint" | "env.need.env.missing" | "env.need.env.hint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.longTask" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.longTask.one" | "project.attention.longTask.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.unchecked" | "panels.dep.missing" | "panels.dep.outdated" | "panels.dep.degraded" | "panels.dep.unsupported" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.uncheckedHint" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.removeSlow" | "panels.market.updateNoChange" | "panels.market.updateUnknownVersion" | "panels.market.updateGone" | "panels.market.updateRestored" | "panels.market.updateBehind" | "panels.market.selfUpdateFailed" | "panels.market.selfUpdateUnknown" | "panels.market.selfUpdateRolledBack" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.noMarketSource" | "panels.market.failed" | "panels.market.askAgent" | "panels.market.askAgentCopied" | "panels.market.askAgentText" | "panels.market.failure.permission" | "panels.market.failure.diskFull" | "panels.market.failure.sandbox" | "panels.market.failure.unknown" | "panels.market.failure.factOwner" | "panels.market.failure.factMode" | "panels.market.failure.factSpace" | "panels.market.failure.factStuck" | "panels.market.failure.nowhere" | "panels.market.failure.copyFix" | "panels.market.failure.copied" | "panels.market.failure.copiedHint" | "panels.market.failure.askAgent" | "panels.market.failure.askAgentText" | "panels.market.failure.askAgentHint" | "panels.market.failure.recheck" | "panels.market.failure.showOutput" | "panels.market.failure.hideOutput" | "panels.market.failure.term.commandLine" | "panels.market.failure.term.signal" | "panels.market.failure.term.exitCode" | "panels.market.failure.term.noExitCode" | "panels.market.failure.term.running" | "panels.market.failure.term.failed" | "panels.market.failure.term.done" | "panels.market.failure.term.copy" | "panels.market.failure.term.copied" | "panels.market.failure.term.noOutput" | "panels.market.failure.term.collapse" | "panels.market.failure.term.expandAria" | "panels.market.failure.term.expand" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.needBinary" | "panels.market.needLib" | "panels.market.localMark" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.updateNeedsWorkbench" | "panels.market.updateIncompatible" | "panels.market.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.pendingFollowUp" | "panels.market.migrationHint" | "panels.market.migrateAction" | "panels.market.migrating" | "panels.market.migrateConfirmTitle" | "panels.market.migrateConfirmDetail" | "panels.market.migrateConfirmAck" | "panels.market.migrateConfirmYes" | "panels.market.migrateDone" | "panels.market.dismissFollowUp" | "panels.market.dismissing" | "panels.market.dismissFollowUpTitle" | "panels.market.dismissFollowUpDetail" | "panels.market.dismissFollowUpAck" | "panels.market.dismissFollowUpYes" | "panels.market.dismissed" | "panels.market.workbenchName" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.checkUpdates" | "panels.market.checkingNow" | "panels.market.checkFailed" | "panels.market.checkedAt" | "panels.market.latestPartial" | "panels.market.latestNoRegistry" | "panels.market.latestProbeFailed" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.failureCredentials" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.tabInstalled" | "panels.market.tabs" | "panels.tab.discover" | "panels.discover.loading" | "panels.discover.slowHint" | "panels.discover.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeTitle" | "panels.discover.removeBody" | "panels.discover.sourceActions" | "panels.discover.sourceStateWritable" | "panels.discover.sourceStateReadOnly" | "panels.discover.sourceEnable" | "panels.discover.sourceDisable" | "panels.discover.sourceWorking" | "panels.discover.sourceEnabled" | "panels.discover.sourceReadOnly" | "panels.discover.refresh" | "panels.discover.search" | "panels.discover.clearSearch" | "panels.discover.all" | "panels.discover.sourceLabel" | "panels.discover.sourceKind" | "panels.discover.sourceKindHttp" | "panels.discover.sourceKindGit" | "panels.discover.sourceUrl" | "panels.discover.sourcePlaceholder" | "panels.discover.sourceRef" | "panels.discover.sourcePath" | "panels.discover.sourceLocal" | "panels.discover.sourceLocalHint" | "panels.discover.save" | "panels.discover.cancel" | "panels.discover.retry" | "panels.discover.noSource" | "panels.discover.noSourceHint" | "panels.discover.sourcesFailed" | "panels.discover.unreadable" | "panels.discover.sourceAuth" | "panels.discover.invalid" | "panels.discover.emptyRepo" | "panels.discover.missingIndex" | "panels.discover.initTitle" | "panels.discover.initCta" | "panels.discover.initWhat" | "panels.discover.initBranch" | "panels.discover.initBranchHint" | "panels.discover.initBranchBad" | "panels.discover.initOk" | "panels.discover.initBusy" | "panels.discover.initDone" | "panels.discover.stale" | "panels.discover.empty" | "panels.discover.noMatch" | "panels.discover.notInstalled" | "panels.discover.installed" | "panels.discover.installedVersion" | "panels.discover.update" | "panels.discover.badShell" | "panels.discover.badShellDetail" | "panels.discover.unverified" | "panels.discover.installing" | "panels.discover.installingNamed" | "panels.discover.cancelInstall" | "panels.discover.cancelling" | "panels.discover.installCancelled" | "panels.discover.installedDone" | "panels.discover.failed" | "panels.discover.transportTitle" | "panels.discover.transportSsh" | "panels.discover.transportHttps" | "panels.discover.transportOk" | "panels.discover.transportAuth" | "panels.discover.transportUnreachable" | "panels.discover.transportUnknown" | "panels.discover.transportChecking" | "panels.discover.transportTest" | "panels.discover.transportPlaceholder" | "panels.discover.transportNeedsAuth" | "panels.discover.transportChange" | "panels.discover.transportChangeHide" | "panels.discover.transportNone" | "panels.discover.expand" | "panels.discover.collapse" | "panels.discover.versionCount" | "panels.discover.sourceNpm" | "panels.discover.sourceNpmDefault" | "panels.discover.sourceGit" | "panels.discover.installVersion" | "panels.discover.confirmTitle" | "panels.discover.confirmDetail" | "panels.discover.confirmAck" | "panels.discover.confirmOk" | "panels.discover.confirmCancel" | "panels.discover.marketMenu" | "panels.discover.manageSources" | "panels.discover.sourcesTitle" | "panels.discover.sourcesIntro" | "panels.discover.sourcesLabel" | "panels.discover.sourceTrust" | "panels.discover.sourceDuplicate" | "panels.discover.sourceBadUrl" | "panels.discover.close" | "panels.discover.labelsMenu" | "panels.discover.labelsCount" | "panels.discover.tagsAll" | "panels.discover.sort" | "panels.discover.sortWith" | "panels.discover.sortRelevance" | "panels.discover.sortDefault" | "panels.discover.sortPublished" | "panels.discover.categoriesLabel" | "panels.discover.showMore" | "panels.discover.entryMeta" | "panels.discover.entryMetaAuthor" | "panels.discover.openEntry" | "panels.discover.cardInstall" | "panels.discover.cardInstalled" | "panels.discover.cardUpdate" | "panels.discover.cardBlocked" | "panels.discover.installTitle" | "panels.discover.installVersionTitle" | "panels.discover.openInstalled" | "panels.discover.noCompatibleVersion" | "panels.discover.detailBack" | "panels.discover.publishedAt" | "panels.discover.detailMarket" | "panels.discover.detailIncompatible" | "panels.discover.detailUnknown" | "panels.discover.detailSource" | "panels.discover.authorUnknown" | "panels.discover.tabOverview" | "panels.discover.tabReadme" | "panels.discover.tabChangelog" | "panels.discover.docReadme" | "panels.discover.docChangelog" | "panels.discover.docLoading" | "panels.discover.docMissing" | "panels.discover.docUnavailable" | "panels.discover.docUnknownReason" | "panels.discover.detailTabs" | "panels.discover.factPackage" | "panels.discover.factRegistry" | "panels.discover.factRepository" | "panels.discover.factCommit" | "panels.discover.factDirectory" | "panels.discover.factPublished" | "panels.discover.factAuthor" | "panels.discover.factHomepage" | "panels.discover.factCategory" | "panels.discover.factLabels" | "panels.discover.factMarket" | "panels.discover.detailVersions" | "panels.discover.versionsLabel" | "panels.discover.tagRecommended" | "panels.discover.tagPrerelease" | "panels.discover.tagInstalled" | "panels.discover.tagIncompatible" | "panels.discover.tagUnknown" | "panels.discover.selected" | "panels.discover.done" | "panels.discover.installTrust" | "panels.discover.progress" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.restartWhy" | "panels.market.add.restartWhy.no-hmr" | "panels.market.add.restartWhy.package-moved" | "panels.market.add.restartWhy.host-module" | "panels.market.add.restartWhy.unmanaged-plugin" | "panels.market.add.restartWhy.module-comparison" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.update" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.toolchain.ok" | "env.toolchain.warn" | "env.opencli.ok" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.hold" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.wake" | "env.wake.opening" | "env.wake.browserOpen" | "env.wake.noBrowser" | "env.wake.failed" | "env.bridge.continue" | "env.diy.ok" | "env.diy.short" | "env.diy.hold" | "env.diy.why" | "env.diy.rows" | "env.diy.noRow" | "env.diy.step" | "env.diy.continue" | "env.copyCommand" | "env.copied" | "env.step.toolchain" | "env.step.opencli" | "env.step.bridge" | "env.step.diy" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "adapterSet.not-configured" | "adapterSet.no-profile" | "adapterSet.malformed" | "adapterSet.not-resolvable" | "adapterSet.import-failed" | "adapterSet.bad-export" | "adapterSet.factory-failed" | "adapterSet.incompatible-version" | "adapterSet.missing-member" | "env.unit.hint" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label" | "adapterSet.title" | "adapterSet.lead" | "adapterSet.active" | "adapterSet.defaults" | "adapterSet.failed" | "adapterSet.healthUnreadable" | "workbenchSettings.nav" | "workbenchSettings.lead" | "sidebarEdition.nav" | "sidebarEdition.lead" | "sidebarEdition.official" | "sidebarEdition.officialHint" | "sidebarEdition.custom" | "sidebarEdition.customHint" | "sidebarEdition.saving" | "sidebarEdition.reloadRequired" | "sidebarEdition.reload" | "sidebarEdition.failed" | "debug.workspace" | "debug.status" | "debug.status.trouble" | "debug.stalled" | "debug.act.pause" | "debug.act.resume" | "debug.act.stop" | "debug.act.stop.ask" | "debug.card.here.title" | "debug.card.here.note" | "debug.card.away.note" | "debug.card.paused.note" | "debug.card.hidden.note" | "record.waiting" | "record.waiting.note" | "record.recording" | "record.recording.note" | "record.recording.shots" | "record.finished" | "record.finished.note" | "record.act.cancel" | "record.act.halt" | "approval.record.site" | "approval.record.what" | "approval.record.lands" | "approval.record.noUrl" | "approval.record.oneAction" | "approval.record.noSwitch" | "approval.longTask.what" | "approval.longTask.signal" | "approval.plugin.name" | "approval.plugin.command" | "approval.plugin.note" | "approval.publish.module" | "approval.publish.target" | "approval.publish.version" | "approval.publish.author" | "approval.publish.authorMissing" | "approval.publish.owner" | "approval.publish.ownerUnowned" | "approval.publish.ownerTaken" | "approval.publish.unit" | "approval.publish.unitTaken" | "approval.publish.path" | "approval.publish.pathTaken" | "approval.publish.registry" | "approval.publish.repo" | "approval.publish.branch" | "approval.publish.defaultBranch" | "approval.publish.artifacts" | "approval.publish.index" | "approval.publish.commits" | "approval.publish.twoCommits" | "approval.publish.reading" | "approval.publish.changelog" | "approval.publish.changelogPending" | "approval.publish.changelogMissing" | "approval.publish.targetAuto" | "approval.publish.targetTeam" | "approval.publish.targetPublic" | "approval.publish.targetTarball" | "approval.publish.targetGit" | "approval.publish.targetMarket" | "approval.publish.targetLocal" | "approval.market.source" | "approval.market.url" | "approval.market.action" | "approval.market.policy" | "approval.market.enable" | "approval.market.disable" | "approval.market.writable" | "approval.market.readOnly" | "approval.market.reading" | "markdown.copy" | "markdown.copied" | "markdown.footnotes", string>;
756
801
  };
757
802
  /** 中文词表的键类型(从 `zh.ts` 转出):`en` 与模块词表都得覆盖同一批键。 */
758
803
  export type { WorkbenchMessages };