@dsh-workbench/shared 1.1.4 → 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 (65) 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 +2 -0
  13. package/dist/contract/unit.d.ts +10 -0
  14. package/dist/host/adapter-types.d.ts +2 -0
  15. package/dist/host/data-error.d.ts +2 -0
  16. package/dist/host/data-error.js +3 -0
  17. package/dist/host/http.js +1 -0
  18. package/dist/host/install-failure.d.ts +49 -0
  19. package/dist/host/install-failure.js +167 -0
  20. package/dist/host/installed-sources.d.ts +10 -0
  21. package/dist/host/installed-sources.js +64 -0
  22. package/dist/host/lib-install.d.ts +12 -1
  23. package/dist/host/lib-install.js +33 -1
  24. package/dist/host/paths.d.ts +7 -0
  25. package/dist/host/paths.js +17 -0
  26. package/dist/host/runtime-links.d.ts +7 -0
  27. package/dist/host/runtime-links.js +25 -0
  28. package/dist/host/tool-approval.d.ts +4 -2
  29. package/dist/host/tool-approval.js +4 -2
  30. package/dist/host.d.ts +3 -0
  31. package/dist/host.js +3 -0
  32. package/dist/i18n/en.js +40 -0
  33. package/dist/i18n/index.d.ts +41 -1
  34. package/dist/i18n/zh.d.ts +40 -0
  35. package/dist/i18n/zh.js +40 -0
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.js +1 -0
  38. package/package.json +1 -1
  39. package/src/api/host-write.ts +5 -1
  40. package/src/api/workbench-client.ts +2 -0
  41. package/src/components/ApprovalPlan.css +7 -8
  42. package/src/config/constants.ts +6 -0
  43. package/src/contract/__tests__/needs.test.ts +53 -0
  44. package/src/contract/approval.ts +4 -0
  45. package/src/contract/command.ts +22 -0
  46. package/src/contract/needs.ts +56 -1
  47. package/src/contract/protocol/bundle-install.ts +3 -0
  48. package/src/contract/unit.ts +11 -0
  49. package/src/host/adapter-types.ts +2 -0
  50. package/src/host/data-error.ts +3 -1
  51. package/src/host/http.ts +1 -0
  52. package/src/host/install-failure.test.ts +121 -0
  53. package/src/host/install-failure.ts +198 -0
  54. package/src/host/installed-sources.test.ts +80 -0
  55. package/src/host/installed-sources.ts +73 -0
  56. package/src/host/lib-install.ts +38 -2
  57. package/src/host/paths.test.ts +26 -0
  58. package/src/host/paths.ts +18 -0
  59. package/src/host/runtime-links.test.ts +31 -0
  60. package/src/host/runtime-links.ts +23 -0
  61. package/src/host/tool-approval.ts +11 -4
  62. package/src/host.ts +3 -0
  63. package/src/i18n/en.ts +41 -0
  64. package/src/i18n/zh.ts +41 -0
  65. package/src/index.ts +1 -0
@@ -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
@@ -149,6 +149,40 @@ export const en = {
149
149
  'panels.market.confirmNo': 'Cancel',
150
150
  'panels.market.noMarketSource': 'The index has no newer version of this module (refresh the index and retry)',
151
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',
152
186
  'panels.market.needEnv': 'Set {env} in the terminal that started the workbench first',
153
187
  'panels.market.needCommands': 'Missing commands: {commands}',
154
188
  'panels.market.needBinary': 'Install the {command} command first',
@@ -188,6 +222,9 @@ export const en = {
188
222
  'panels.market.checkingNow': 'Checking…',
189
223
  'panels.market.checkFailed': 'The last check failed. Check your connection and retry.',
190
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',
191
228
  'panels.market.justNow': 'just now',
192
229
  'panels.market.minutesAgo': '{n} min ago',
193
230
  'panels.market.hoursAgo': '{n} h ago',
@@ -652,6 +689,9 @@ export const en = {
652
689
  'approval.record.noSwitch': 'it will not switch you back (the leftbar footer shows the state)',
653
690
  'approval.longTask.what': 'Task to stop',
654
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',
655
695
  'approval.publish.module': 'Module',
656
696
  'approval.publish.target': 'Target',
657
697
  'approval.publish.version': 'Version',
@@ -159,6 +159,40 @@ export declare const dictionaries: {
159
159
  readonly 'panels.market.confirmNo': "取消";
160
160
  readonly 'panels.market.noMarketSource': "索引里没有这个模块的新版本(刷新一次索引再试)";
161
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} 行";
162
196
  readonly 'panels.market.needEnv': "先在启动工作台的终端里设 {env}";
163
197
  readonly 'panels.market.needCommands': "缺这几条命令:{commands}";
164
198
  readonly 'panels.market.needBinary': "先装 {command} 命令";
@@ -198,6 +232,9 @@ export declare const dictionaries: {
198
232
  readonly 'panels.market.checkingNow': "正在检查…";
199
233
  readonly 'panels.market.checkFailed': "最近一次没查到,检查网络后重试";
200
234
  readonly 'panels.market.checkedAt': "最近检查:{time}";
235
+ readonly 'panels.market.latestPartial': "{n} 个模块没查成";
236
+ readonly 'panels.market.latestNoRegistry': "没配来源,未检查新版";
237
+ readonly 'panels.market.latestProbeFailed': "问不到源,稍后重试";
201
238
  readonly 'panels.market.justNow': "刚刚";
202
239
  readonly 'panels.market.minutesAgo': "{n} 分钟前";
203
240
  readonly 'panels.market.hoursAgo': "{n} 小时前";
@@ -662,6 +699,9 @@ export declare const dictionaries: {
662
699
  readonly 'approval.record.noSwitch': "录完不会替你切回来(左栏底部会亮一条状态)";
663
700
  readonly 'approval.longTask.what': "要停的那次任务";
664
701
  readonly 'approval.longTask.signal': "停了只是让工作台发出中断信号 —— 这次任务怎么收尾由模块自己负责";
702
+ readonly 'approval.plugin.name': "插件";
703
+ readonly 'approval.plugin.command': "命令";
704
+ readonly 'approval.plugin.note': "agent 说";
665
705
  readonly 'approval.publish.module': "模块";
666
706
  readonly 'approval.publish.target': "目标";
667
707
  readonly 'approval.publish.version': "版本";
@@ -757,7 +797,7 @@ export declare const dictionaries: {
757
797
  readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。";
758
798
  readonly 'configSync.failed': "同步没成功,再试一次。";
759
799
  };
760
- 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.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.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.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>;
761
801
  };
762
802
  /** 中文词表的键类型(从 `zh.ts` 转出):`en` 与模块词表都得覆盖同一批键。 */
763
803
  export type { WorkbenchMessages };
package/dist/i18n/zh.d.ts CHANGED
@@ -157,6 +157,40 @@ export declare const zh: {
157
157
  readonly 'panels.market.confirmNo': "取消";
158
158
  readonly 'panels.market.noMarketSource': "索引里没有这个模块的新版本(刷新一次索引再试)";
159
159
  readonly 'panels.market.failed': "没成功:{reason}";
160
+ readonly 'panels.market.askAgent': "问 agent";
161
+ readonly 'panels.market.askAgentCopied': "已复制";
162
+ readonly 'panels.market.askAgentText': "工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。";
163
+ readonly 'panels.market.failure.permission': "没装上:没有写入权限";
164
+ readonly 'panels.market.failure.diskFull': "没装上:磁盘满了";
165
+ readonly 'panels.market.failure.sandbox': "没装上:被系统拦住了";
166
+ readonly 'panels.market.failure.unknown': "没装上:原因没认出来";
167
+ readonly 'panels.market.failure.factOwner': "{path} 属于 {owner},当前账号({me})写不进去。把它还给自己就行(会要开机密码)。";
168
+ readonly 'panels.market.failure.factMode': "{path} 的权限是 {mode},当前账号没有写权限。";
169
+ readonly 'panels.market.failure.factSpace': "{path} 所在的磁盘满了。";
170
+ readonly 'panels.market.failure.factStuck': "这条命令跑在受限环境里,写不进 {path}。";
171
+ readonly 'panels.market.failure.nowhere': "(没认出是哪个目录)";
172
+ readonly 'panels.market.failure.copyFix': "复制修复命令";
173
+ readonly 'panels.market.failure.copied': "已复制";
174
+ readonly 'panels.market.failure.copiedHint': "粘到终端跑一次,回来点「再检测」。";
175
+ readonly 'panels.market.failure.askAgent': "复制给 agent";
176
+ readonly 'panels.market.failure.askAgentText': "装这个模块时写不进去:`{command}` 退出码 {code},卡在 {path}。帮我看看是被沙箱拦的还是权限问题,换一条能写进去的路再装。";
177
+ readonly 'panels.market.failure.askAgentHint': "粘到对话里,让 agent 接着弄。";
178
+ readonly 'panels.market.failure.recheck': "再检测";
179
+ readonly 'panels.market.failure.showOutput': "查看安装输出";
180
+ readonly 'panels.market.failure.hideOutput': "收起安装输出";
181
+ readonly 'panels.market.failure.term.commandLine': "第 {line} 行的命令";
182
+ readonly 'panels.market.failure.term.signal': "被 {signal} 终止";
183
+ readonly 'panels.market.failure.term.exitCode': "退出码 {exitCode}";
184
+ readonly 'panels.market.failure.term.noExitCode': "没有退出码";
185
+ readonly 'panels.market.failure.term.running': "在跑";
186
+ readonly 'panels.market.failure.term.failed': "没跑通";
187
+ readonly 'panels.market.failure.term.done': "跑完了";
188
+ readonly 'panels.market.failure.term.copy': "复制";
189
+ readonly 'panels.market.failure.term.copied': "已复制";
190
+ readonly 'panels.market.failure.term.noOutput': "没有输出";
191
+ readonly 'panels.market.failure.term.collapse': "收起";
192
+ readonly 'panels.market.failure.term.expandAria': "展开剩下的 {hidden} 行";
193
+ readonly 'panels.market.failure.term.expand': "展开 {hidden} 行";
160
194
  readonly 'panels.market.needEnv': "先在启动工作台的终端里设 {env}";
161
195
  readonly 'panels.market.needCommands': "缺这几条命令:{commands}";
162
196
  readonly 'panels.market.needBinary': "先装 {command} 命令";
@@ -196,6 +230,9 @@ export declare const zh: {
196
230
  readonly 'panels.market.checkingNow': "正在检查…";
197
231
  readonly 'panels.market.checkFailed': "最近一次没查到,检查网络后重试";
198
232
  readonly 'panels.market.checkedAt': "最近检查:{time}";
233
+ readonly 'panels.market.latestPartial': "{n} 个模块没查成";
234
+ readonly 'panels.market.latestNoRegistry': "没配来源,未检查新版";
235
+ readonly 'panels.market.latestProbeFailed': "问不到源,稍后重试";
199
236
  readonly 'panels.market.justNow': "刚刚";
200
237
  readonly 'panels.market.minutesAgo': "{n} 分钟前";
201
238
  readonly 'panels.market.hoursAgo': "{n} 小时前";
@@ -660,6 +697,9 @@ export declare const zh: {
660
697
  readonly 'approval.record.noSwitch': "录完不会替你切回来(左栏底部会亮一条状态)";
661
698
  readonly 'approval.longTask.what': "要停的那次任务";
662
699
  readonly 'approval.longTask.signal': "停了只是让工作台发出中断信号 —— 这次任务怎么收尾由模块自己负责";
700
+ readonly 'approval.plugin.name': "插件";
701
+ readonly 'approval.plugin.command': "命令";
702
+ readonly 'approval.plugin.note': "agent 说";
663
703
  readonly 'approval.publish.module': "模块";
664
704
  readonly 'approval.publish.target': "目标";
665
705
  readonly 'approval.publish.version': "版本";
package/dist/i18n/zh.js CHANGED
@@ -149,6 +149,40 @@ export const zh = {
149
149
  'panels.market.confirmNo': '取消',
150
150
  'panels.market.noMarketSource': '索引里没有这个模块的新版本(刷新一次索引再试)',
151
151
  'panels.market.failed': '没成功:{reason}',
152
+ 'panels.market.askAgent': '问 agent',
153
+ 'panels.market.askAgentCopied': '已复制',
154
+ 'panels.market.askAgentText': '工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。',
155
+ 'panels.market.failure.permission': '没装上:没有写入权限',
156
+ 'panels.market.failure.diskFull': '没装上:磁盘满了',
157
+ 'panels.market.failure.sandbox': '没装上:被系统拦住了',
158
+ 'panels.market.failure.unknown': '没装上:原因没认出来',
159
+ 'panels.market.failure.factOwner': '{path} 属于 {owner},当前账号({me})写不进去。把它还给自己就行(会要开机密码)。',
160
+ 'panels.market.failure.factMode': '{path} 的权限是 {mode},当前账号没有写权限。',
161
+ 'panels.market.failure.factSpace': '{path} 所在的磁盘满了。',
162
+ 'panels.market.failure.factStuck': '这条命令跑在受限环境里,写不进 {path}。',
163
+ 'panels.market.failure.nowhere': '(没认出是哪个目录)',
164
+ 'panels.market.failure.copyFix': '复制修复命令',
165
+ 'panels.market.failure.copied': '已复制',
166
+ 'panels.market.failure.copiedHint': '粘到终端跑一次,回来点「再检测」。',
167
+ 'panels.market.failure.askAgent': '复制给 agent',
168
+ 'panels.market.failure.askAgentText': '装这个模块时写不进去:`{command}` 退出码 {code},卡在 {path}。帮我看看是被沙箱拦的还是权限问题,换一条能写进去的路再装。',
169
+ 'panels.market.failure.askAgentHint': '粘到对话里,让 agent 接着弄。',
170
+ 'panels.market.failure.recheck': '再检测',
171
+ 'panels.market.failure.showOutput': '查看安装输出',
172
+ 'panels.market.failure.hideOutput': '收起安装输出',
173
+ 'panels.market.failure.term.commandLine': '第 {line} 行的命令',
174
+ 'panels.market.failure.term.signal': '被 {signal} 终止',
175
+ 'panels.market.failure.term.exitCode': '退出码 {exitCode}',
176
+ 'panels.market.failure.term.noExitCode': '没有退出码',
177
+ 'panels.market.failure.term.running': '在跑',
178
+ 'panels.market.failure.term.failed': '没跑通',
179
+ 'panels.market.failure.term.done': '跑完了',
180
+ 'panels.market.failure.term.copy': '复制',
181
+ 'panels.market.failure.term.copied': '已复制',
182
+ 'panels.market.failure.term.noOutput': '没有输出',
183
+ 'panels.market.failure.term.collapse': '收起',
184
+ 'panels.market.failure.term.expandAria': '展开剩下的 {hidden} 行',
185
+ 'panels.market.failure.term.expand': '展开 {hidden} 行',
152
186
  'panels.market.needEnv': '先在启动工作台的终端里设 {env}',
153
187
  'panels.market.needCommands': '缺这几条命令:{commands}',
154
188
  'panels.market.needBinary': '先装 {command} 命令',
@@ -188,6 +222,9 @@ export const zh = {
188
222
  'panels.market.checkingNow': '正在检查…',
189
223
  'panels.market.checkFailed': '最近一次没查到,检查网络后重试',
190
224
  'panels.market.checkedAt': '最近检查:{time}',
225
+ 'panels.market.latestPartial': '{n} 个模块没查成',
226
+ 'panels.market.latestNoRegistry': '没配来源,未检查新版',
227
+ 'panels.market.latestProbeFailed': '问不到源,稍后重试',
191
228
  'panels.market.justNow': '刚刚',
192
229
  'panels.market.minutesAgo': '{n} 分钟前',
193
230
  'panels.market.hoursAgo': '{n} 小时前',
@@ -652,6 +689,9 @@ export const zh = {
652
689
  'approval.record.noSwitch': '录完不会替你切回来(左栏底部会亮一条状态)',
653
690
  'approval.longTask.what': '要停的那次任务',
654
691
  'approval.longTask.signal': '停了只是让工作台发出中断信号 —— 这次任务怎么收尾由模块自己负责',
692
+ 'approval.plugin.name': '插件',
693
+ 'approval.plugin.command': '命令',
694
+ 'approval.plugin.note': 'agent 说',
655
695
  'approval.publish.module': '模块',
656
696
  'approval.publish.target': '目标',
657
697
  'approval.publish.version': '版本',
package/dist/index.d.ts CHANGED
@@ -35,6 +35,7 @@ export * from './components/board-module.js';
35
35
  export * from './components/icons.js';
36
36
  export * from './config/constants.js';
37
37
  export * from './config/storage.js';
38
+ export * from './contract/approval.js';
38
39
  export * from './contract/blocker.js';
39
40
  export * from './contract/data.js';
40
41
  export * from './contract/extension.js';
package/dist/index.js CHANGED
@@ -35,6 +35,7 @@ export * from './components/board-module.js';
35
35
  export * from './components/icons.js';
36
36
  export * from './config/constants.js';
37
37
  export * from './config/storage.js';
38
+ export * from './contract/approval.js';
38
39
  export * from './contract/blocker.js';
39
40
  export * from './contract/data.js';
40
41
  export * from './contract/extension.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/shared",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
4
4
  "description": "工作台与模块共享的纯代码与契约类型:类型、纯逻辑、哑组件、平台解析。宿主侧的东西从 /host 进(不影响浏览器产物)。",
5
5
  "license": "MIT",
6
6
  "type": "module",